Skip to content

D143 — Open connections by cause; half the portfolio searches from the crowded end

Context

M20's C5 item (doc 18 §4): "classify the dense-package failures of tiers B–D by cause (pin boxed in, via sites, layer count) and fix the largest class"; its gate is "a table of failures by cause; the fix is chosen from it". The boards are the 33 tier B-D boards the default leaves open (bench/sets/pcbench-bd-fail.txt). The records are in bench/records/m20-c5/, and the design is in doc 05 §55.

Decision

  • tracemaker causes BOARD [--json FILE] (src/app/causes.{hpp,cpp}) and bench/failure_causes.py. Each open connection of a routed board is routed again alone (2 M work) on copies of the board whose routed copper is locked. Each copy has other nets' copper removed in one region: within 2 mm of an end for nets with no pad on that end's part, then all copper within 2 mm, then all copper farther away, then everything. The cause is the first copy on which the connection routes. Pins that the escape analysis says cannot leave their package, and connections that route on none of the copies, are classes of their own. On the 33 boards, the largest class is copper near the pins: 779 of 1,320 open connections.
  • RouterOptions::crowded_source: a strict search starts from the more crowded end of its connection. Crowding is the copper of other nets routed in this run, plus the pads of other nets of the end's own part, within 1 mm of the pad's box. A boxed-in pin is then proved by the enclosure test at once, instead of after a flood from the open end. route --crowded-source turns it on in every variant.
  • By default it is on in four of the portfolio's eight designed variants: 1, 5, 6 and 7 ("fast bends, shortest first", "cheap vias", "cheap crossings, escape plan", "dear vias"; their names say "crowded source"). The breakout portfolio and the seeded variants beyond eight are unchanged. The hidden --no-crowded-portfolio restores the old portfolio.

Alternatives

  • In all eight variants. On the 33 failing boards it was 1,204 open against 1,220, but it lost two of the 59 boards that had been clean (AmpOne and bumps, one connection each). Rule 9 does not allow that.
  • An option only, off. The gain is the largest of any change measured on these boards since M17: 1,383 → 1,220 open, against --txn's +118 connections at 100 M work in M17.
  • Spend the budget differently, by capping strict searches at 100,000 expansions, by stopping the strict pass at 70 % of the budget, or by charging tracks near other parts' pads (a halo). Each was worse on the 33 boards (1,422, 1,536 and 1,394 open); they move work around without proving a boxed-in end sooner.
  • Counting the input board's copper too. The routed-item index holds only this run's copper, and the failing boards start unrouted; a second index was not worth it for boards that are already routed.

Consequences

  • Real binary, default portfolio, KiCad judging (doc 05 §55): open connections on the 33 failing boards fell from 1,383 to 1,220, with 18 boards better, 6 worse, and 0 → 1 clean. On the 59 previously clean boards, 69 → 46 with clean 44 → 46. On the mid tier, 1,306 → 1,093 with 7 boards better and 2 worse by one connection each. On the quick tier, 32 → 24 with clean 25 → 26 and no board worse. No board gained an error.
  • The four variants were chosen by scoring every subset from per-variant results of 71 boards (portfolio_subsets.py). The mid tier, the quick tier and 21 of the clean boards were not used, and agree; it is not a precise optimum (on the mid tier alone another subset scores a little better).
  • Found afterwards (2026-10-28), outside the measured sets:
  • On the plane tier with --soft-zones (3 M work, seed 1), multichannel_mixer gains one KiCad starved_thermal, which the route reports (refill.starved_thermals) and its thermal repair (D137) does not fix. Without the crowded variants (--no-crowded-portfolio) it has none. On the same run RoyalBlue routes 125 against 103 connections, and StickHub 127 against 126. The starved_thermal errors on interf_u and the solder_mask_bridge errors on StickHub are there either way.
  • The plane_smd integration test used two variants. Variant 1 alone now leaves one connection open there, so the test uses four variants (assumption A84). The default eight route the board either way.
  • The classification is an upper bound on what each region costs: one connection alone on a locked board is easier than all of them together. Two more inner layers close 124 of the 1,320.
  • Docs: 05 §55, 18 §13, 11 (M20 row).