Route multi-pin nets as trees: spanning-tree pairs, T into routed copper

A net's pin groups were joined as a chain in pin order, and each
connection had to end on one chosen pin. Groups are now paired by a
minimum spanning tree (Manhattan distance between their nearest pins), and
a connection may start or end on any copper its net has already routed on
that side (path cells, via cells on every layer; not walled cells, whose
via moves into the pad). Plane nets keep their drops to the plane.

A connection that tees onto another records it as an anchor. Ripping a
connection rips what hangs on it, transitively, inside the same rip-up
transaction, so rollback restores all of them. The exact engine gets the
connections in commit order with their anchors and drops a T whose anchor
it rejects. --no-tree restores the chain.
This commit is contained in:
2026-10-05 12:21:00 -06:00
parent 89d6d8d9dd
commit b91e44e360
6 changed files with 338 additions and 14 deletions
+1
View File
@@ -160,6 +160,7 @@ def test_cli_supported_combinations_are_accepted(tmp_path):
"access": ["--access-cost", "5"],
"negotiate": ["--negotiate", "2"],
"rollback": ["--no-rollback"],
"tree": ["--no-tree"],
}
for engine, options in ENGINE_OPTIONS.items():
for option in options: