Closed bug report

Cross-section impedance ignores local reference copper when whole-layer plane classification is null

matt · ·closed by John Lauer

Adom Fields0.10.3; AIFlow0.2.30; KiCad10.0.6; Linux solver reading a Windows-native saved four-layer board. Local installed Fields source xsec.rs, review() selects reference planes from review.checks.stackup.layers[].plane. No installed runtime was changed.

Observed output: B.Cu cross-section rows report117.0ohm for0.2mm traces; a USB pair at0.2654mm width/0.205mm gap reports100.3ohm. The layer classifier names only In1.Cu as a plane; In2.Cu has plane:null and planeCover0.39. The review reports B.Cu planeMm1.14. However a native filled-polygon projection confirms the USB bottom-layer centerlines are covered by local In2 GND, apart from separately excluded connector/via antipads, only0.1835mm away. This is a model-reference mismatch, not proof of the pair's actual impedance or compliance.

Source observation: xs_for chooses the nearest layer for which the whole-layer plane classifier is non-null. It never inspects the local reference under a signal; the pair report omits the selected reference layer/distance. A valid local plane region is therefore silently ignored when its total layer coverage is insufficient. Width/gap recommendations based on that assumed distant plane can drive an unnecessary board edit. Other routes truly lack local GND and remain unresolved; this report is not a global waiver.

Generic reproduction to add: a four-layer board with the same B.Cu pair and a continuous In2 GND strip under the full pair, while varying unrelated In2 copper far away across the classifier threshold. The local cross-section should not jump merely because remote copper changes. Include a genuinely absent/broken-reference case, which must not get a passing ideal-plane result.

Requested change: report reference net/layer/distance and assumptions for each evaluated section, select/check reference locally or return unsupported/incomplete for mixed coverage, and avoid claiming one whole-net impedance from a representative cross-section. Keep native connectivity, return-path, transition and fabrication verification separate. No private CAD or screenshots attached, and no acceptance threshold was changed.

1 Reply

John Lauer ·

Fixed in adom-fields 0.10.4. Thank you for the precise trace through xs_for and for the reproduction plan; I built it as a test.

What changed

  • The reference is found under the trace. On each side it is the nearest layer whose ground or supply copper covers 90 % of the segment (centre and both edges, sampled every 0.25 mm). The whole-layer plane classification is no longer used.
  • Every section names its reference. Each review.impedance row and pair carries status and reference.below/above: layer, net, distanceMm and coverage.
  • Mixed or missing references get no number.
    • A nearer layer covering only part of a section makes it mixed reference (with layersUnder).
    • No ground or supply copper under it makes it no reference.
    • Neither gets an impedance, and a target net or pair with such sections gets its own finding instead of a width recommendation.
  • Transitions are kept separate. Points within 0.3 mm of a via, a through-hole or the trace's own pads are left out, and an all-transition stretch counts in transitionMm.
  • One row per section. Rows are per section (layer, width and reference), so no single whole-net impedance is claimed.

Your reproduction, on a four-layer board with your stackup (B.Cu 0.1835 mm to In2, 1.14 mm to In1) and a USB pair at 0.2654 mm wide with a 0.205 mm gap:

In2 under the pair 0.10.3 0.10.4
continuous GND strip, little other In2 copper (In2 not a "plane") 110.9 Ω (referenced to In1) 86.2 Ω, In2 GND 0.184 mm
same strip, much other In2 copper (In2 a "plane") 86.2 Ω 86.2 Ω, In2 GND 0.184 mm
strip with a 4 mm gap 110.9 Ω mixed reference: In2 covers 86 %, no impedance
no In2 copper 110.9 Ω 110.9 Ω, In1 GND 1.144 mm

On a real four-layer board, 1,483 mm of signal traces resolve with their reference, 199 mm are via or pad transitions, and 1.5 mm is genuinely mixed.

Update with adom-wiki pkg install adom/adom-fields (check adom-fields --version shows 0.10.4). Return-path, transition and fabrication checks stay separate, as you asked.

John Lauer closed this ·

Log in to reply.