Finer routing grid: --grid-resolution K with trace halos
A cell was exactly one trace plus its clearance, so a trace owning its cell was the whole clearance model, and the 0.4 mm grid could not reach most pins of a 0.5 mm pitch package: between two 0.3 mm pads a trace's centre has a legal band only 0.15 mm wide. Resolution K makes cells K times finer and has every trace claim a halo, the cells whose centre is nearer than trace + clearance to one of its own, released again on rip-up. K = 1 has an empty halo and is the old grid exactly (tested). On a 0.5 mm row, K = 4 gets every pin out where K = 1 gets two. On the rc4 boards, K = 2 cuts the sense board's opens from 66 to 41 (JAR: 32) and the power board's to 7 (JAR: 12), still with no DRC errors from freeroute's own copper.
This commit is contained in:
@@ -75,6 +75,7 @@ def _via_half_board(dsn: DsnBoard, scale: int) -> int | None:
|
||||
def route_dsn_board(
|
||||
dsn: DsnBoard,
|
||||
*,
|
||||
resolution: int = 1,
|
||||
edge_clearance_mm: float | None = None,
|
||||
layers: list[int] | None = None,
|
||||
rip_up: bool = True,
|
||||
@@ -91,6 +92,7 @@ def route_dsn_board(
|
||||
clearance_board = round(_rule_clearance_dsn(dsn) * scale)
|
||||
result = route_board(
|
||||
board,
|
||||
resolution=resolution,
|
||||
via_half=_via_half_board(dsn, scale),
|
||||
edge_clearance=edge_clearance_board,
|
||||
trace_width=width_board,
|
||||
@@ -130,6 +132,7 @@ def _to_routing_result(route, dsn: DsnBoard, scale: int, layer_names: list[str])
|
||||
def build_routing_result(
|
||||
dsn: DsnBoard,
|
||||
*,
|
||||
resolution: int = 1,
|
||||
layers: list[int] | None = None,
|
||||
rip_up: bool = True,
|
||||
max_passes: int = 10,
|
||||
@@ -138,7 +141,7 @@ def build_routing_result(
|
||||
"""Route ``dsn`` (grid track) and convert to a DSN-unit RoutingResult."""
|
||||
route, scale, layer_names = route_dsn_board(
|
||||
dsn, layers=layers, rip_up=rip_up, max_passes=max_passes,
|
||||
edge_clearance_mm=edge_clearance_mm,
|
||||
edge_clearance_mm=edge_clearance_mm, resolution=resolution,
|
||||
)
|
||||
return _to_routing_result(route, dsn, scale, layer_names)
|
||||
|
||||
@@ -146,6 +149,7 @@ def build_routing_result(
|
||||
def route_dsn_board_exact(
|
||||
dsn: DsnBoard,
|
||||
*,
|
||||
resolution: int = 1,
|
||||
edge_clearance_mm: float | None = None,
|
||||
layers: list[int] | None = None,
|
||||
max_passes: int = 10,
|
||||
@@ -165,6 +169,7 @@ def route_dsn_board_exact(
|
||||
clearance_board = round(_rule_clearance_dsn(dsn) * scale)
|
||||
exact = route_board_exact(
|
||||
board,
|
||||
resolution=resolution,
|
||||
via_half=_via_half_board(dsn, scale),
|
||||
edge_clearance=edge_clearance_board,
|
||||
trace_width=width_board,
|
||||
@@ -181,6 +186,7 @@ def route_dsn_board_exact(
|
||||
def build_exact_routing_result(
|
||||
dsn: DsnBoard,
|
||||
*,
|
||||
resolution: int = 1,
|
||||
layers: list[int] | None = None,
|
||||
shove: bool = False,
|
||||
diagonal: bool = False,
|
||||
@@ -197,6 +203,7 @@ def build_exact_routing_result(
|
||||
rip_up=rip_up,
|
||||
max_passes=max_passes,
|
||||
edge_clearance_mm=edge_clearance_mm,
|
||||
resolution=resolution,
|
||||
)
|
||||
return _to_routing_result(exact.result, dsn, scale, layer_names)
|
||||
|
||||
@@ -255,6 +262,7 @@ def route(
|
||||
pack: bool = False,
|
||||
diagonal: bool = False,
|
||||
edge_clearance_mm: float | None = None,
|
||||
resolution: int = 1,
|
||||
) -> str:
|
||||
"""Route a Specctra DSN string and return the routed SES string.
|
||||
|
||||
@@ -269,12 +277,15 @@ def route(
|
||||
dsn = parse_dsn(dsn_text)
|
||||
if engine == "exact":
|
||||
result = build_exact_routing_result(
|
||||
dsn, layers=layers, shove=shove, diagonal=diagonal, edge_clearance_mm=edge_clearance_mm
|
||||
dsn, layers=layers, shove=shove, diagonal=diagonal,
|
||||
edge_clearance_mm=edge_clearance_mm, resolution=resolution,
|
||||
)
|
||||
elif engine == "room":
|
||||
result = build_rooms_routing_result(
|
||||
dsn, layers=layers, shove=shove, pack=pack, edge_clearance_mm=edge_clearance_mm
|
||||
)
|
||||
else:
|
||||
result = build_routing_result(dsn, layers=layers, edge_clearance_mm=edge_clearance_mm)
|
||||
result = build_routing_result(
|
||||
dsn, layers=layers, edge_clearance_mm=edge_clearance_mm, resolution=resolution
|
||||
)
|
||||
return write_ses(dsn, result)
|
||||
|
||||
Reference in New Issue
Block a user