Let pins on turned fine-pitch pads leave along the pad's axis

A QFN placed at 45 degrees had no exit on the grid: every horizontal or
vertical step from a pin passes its neighbours inside clearance. A pin whose
pad is turned more than ten degrees off the grid axes now leaves along the
pad's own axis, away from the part, until an L from there to a grid cell
clears every other net's pad, then searches as usual. The slanted leg is
checked and stored as an exact slab (segment_slab), not its bounding box,
in the grid stub checks and in the exact engine.

Where pins leave side by side, a cell names only its first owner, so stubs
are also indexed per cell for every connection near them; the exact
stub-vs-stub check, trace entry and rip-up all consult that index. A pin
with an axis exit and no clear cell reports no way out instead of falling
back to a cell on another net's route. diagnose.py replays with the exits.
This commit is contained in:
2026-10-03 18:49:36 -06:00
parent 4933b6f992
commit c6297656a6
7 changed files with 442 additions and 58 deletions
+2
View File
@@ -215,6 +215,8 @@ def diagnose(
# the board as the best pass left it
state = _fresh(seen)
# pins on turned pads leave along their pad's axis: replay with the same exits
state._axis_exits = dict(routed._axis_exits)
conns = state._conns
for idx, (path, a_end, b_end) in best.items():
conns[idx].a_end, conns[idx].b_end = a_end, b_end