--negotiate: PathFinder rounds on the empty board before routing
Every connection is routed N times on the empty board, where routes may share cells at a price that doubles each round for every other net on a cell, and a cell that stays shared gains history. The real routing then pays that history on free cells, so the first routes stop taking the space later routes (a fine-pitch part's escapes) have no way round. Off by default. The old history term never steered: it only accrued at rip-up fights, after the first routes had claimed the contested space, and routed connections are never revisited in later passes.
This commit is contained in:
+14
-2
@@ -30,8 +30,8 @@ from freeroute.ses import write_ses
|
||||
#: which optional flags each engine actually implements. Anything not listed for
|
||||
#: an engine is rejected by :func:`_validate` rather than quietly ignored.
|
||||
ENGINE_OPTIONS: dict[str, frozenset[str]] = {
|
||||
"grid": frozenset({"rip_up", "max_passes", "seed", "orders", "promote", "access", "rollback"}),
|
||||
"exact": frozenset({"shove", "diagonal", "rip_up", "max_passes", "seed", "orders", "promote", "access", "rollback"}),
|
||||
"grid": frozenset({"rip_up", "max_passes", "seed", "orders", "promote", "access", "negotiate", "rollback"}),
|
||||
"exact": frozenset({"shove", "diagonal", "rip_up", "max_passes", "seed", "orders", "promote", "access", "negotiate", "rollback"}),
|
||||
"room": frozenset({"shove", "pack"}),
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ _FLAG_NAMES = {
|
||||
"orders": "--orders",
|
||||
"promote": "--promote-failures",
|
||||
"access": "--access-cost",
|
||||
"negotiate": "--negotiate",
|
||||
"rollback": "--no-rollback",
|
||||
}
|
||||
|
||||
@@ -167,6 +168,14 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
help="grid and exact engines: extra cost for a route to pass where it would close "
|
||||
"another pin's way out while that pin still has connections to route (default 0: off)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--negotiate",
|
||||
type=int,
|
||||
metavar="N",
|
||||
help="grid and exact engines: before routing, N rounds of negotiation on the empty "
|
||||
"board, where routes may share space at a price that rises where they compete; "
|
||||
"the contested cells then cost extra in the real routing (default 0: off)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--no-rollback",
|
||||
dest="rollback",
|
||||
@@ -212,6 +221,7 @@ def main(argv: list[str] | None = None) -> int:
|
||||
("orders", args.orders is not None),
|
||||
("promote", args.promote_failures is not None),
|
||||
("access", args.access_cost is not None),
|
||||
("negotiate", args.negotiate is not None),
|
||||
("rollback", not args.rollback),
|
||||
)
|
||||
if asked
|
||||
@@ -247,6 +257,7 @@ def main(argv: list[str] | None = None) -> int:
|
||||
"resolution": 2 if args.grid_resolution is None else args.grid_resolution,
|
||||
"heuristic_weight": args.heuristic_weight,
|
||||
"access_cost": args.access_cost or 0.0,
|
||||
"negotiate": args.negotiate or 0,
|
||||
"hole_to_hole_mm": args.hole_to_hole,
|
||||
"rollback": args.rollback,
|
||||
}
|
||||
@@ -258,6 +269,7 @@ def main(argv: list[str] | None = None) -> int:
|
||||
"edge_clearance_mm": args.edge_clearance,
|
||||
"resolution": 1 if args.grid_resolution is None else args.grid_resolution,
|
||||
"access_cost": args.access_cost or 0.0,
|
||||
"negotiate": args.negotiate or 0,
|
||||
"hole_to_hole_mm": args.hole_to_hole,
|
||||
"rollback": args.rollback,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user