Closed general

route: trackWidth and scalar wideNets/midNets are silently ignored by the router (0.25 mm default track, fine-pitch QFN unroutable)

John Lauer · 3d ago ·closed by John Lauer

What happened

On a 2-layer board with a 0.4 mm pitch QFN (ATtiny1616, 20 pins), route left 19 connections unrouted, every one at a QFN or LGA pad, with "no path".

The spec said "trackWidth": 0.15 and "wideNets": {"VBAT": 0.5, ...} (scalars). The binary accepted both: the rules card and the spec-budget lock read them. But aiflow_router::Rules::from_spec reads only track and only array-valued wideNets and midNets (b.as_array()?). So the router silently used its defaults:

  • a 0.25 mm track, which cannot leave 0.4 mm pitch pads;
  • no wide nets at all.

After adding "track": 0.15, one pass leaves 3 unrouted instead of 19.

Asks

  1. Make the router read trackWidth as an alias of track, or have start/route refuse a spec that has trackWidth and no track.
  2. Make the router accept scalar widths in wideNets and midNets, as the budget lock does, or refuse them with a hint. Today they are dropped without a word.
  3. Have route print the track, clearance and per-net widths it actually used.

The budget lock also refuses to turn scalars into arrays after placement ("the spec's budgets changed"), so the spec can't be fixed in place either.

Version: adom-aiflow 0.2.56, KiCad lane.

1 Reply

John Lauer · 3d ago

Fixed in adom-aiflow 0.2.57. The diagnosis was right: Rules::from_spec read only track and only array-valued wideNets/midNets, so the router quietly used its 0.25 mm default.

Your three asks:

  1. trackWidth is now read as track. track wins when both are present. I chose the alias over refusing the spec, because AI Flow never refuses.
  2. Scalar widths work. "wideNets": {"VBAT": 0.5} is read as [0.5] in wideNets and midNets. Lists work as before.
  3. route says what it used, for example: route rules used: track 0.15 mm, clearance 0.2 mm, via 0.8 mm; per-net widths: wide GND [0.5], mid none (track from the spec's trackWidth). When the spec names no track at all, the line says the router default is in use, so a key it didn't read shows at once.

The budget lock no longer refuses either. A spec whose budgets changed after placement is used as it is. The change goes on the record as an amendment with no reason yet, so it shows in the run ledger and the finish summary, and a note suggests spec-amend --why to add the reason. Running spec-amend --why "..." afterwards fills that reason in. So you can fix the spec in place now.

I also turned three more refusals into findings: models with unresolved models, proxy models, or orientation warnings.

Verified:

  • unit tests for the alias and scalar widths;
  • an end-to-end route with {"trackWidth": 0.15, "wideNets": {"GND": 0.5}}, which prints the line above;
  • 641 unit tests and all 29 workflow suites pass.

Upgrade: tell your AI "give me the latest adom-aiflow" (or adom-wiki pkg install adom/adom-aiflow); adom-aiflow --version says 0.2.57.

John Lauer closed this · 3d ago

Log in to reply.