Route with copper zones, and let vias into no-tracks areas
freeroute ignored the DSN's planes (KiCad's zones), so it never knew that pads in a pour are joined by it. On the rc4 power stage those pads sit inside "keep router off" areas as well, and every connection to them was dropped without a word. - Read (plane <net> <shape>) and put each zone on the board as a ConductionArea of its net. Zones are not obstacles: KiCad refills them around other nets' copper. - The grid groups each net's pads and zone pieces that copper already joins (a pad in a zone, two zones sharing a pad) and routes only between groups. A connection may end on a zone by a via inside its copper, or by a track where tracks are allowed. - wire_keepout now blocks traces only, as KiCad's "no tracks" rule area does; via_keepout only vias; keepout both, in the grid and in the exact verifier. rc4 power stage, exact engine, resolution 2: 2 unconnected, down from 8 (FreeRouting JAR: 12), no DRC errors.
This commit is contained in:
@@ -47,6 +47,9 @@ class TreeShape:
|
||||
routed: bool = False
|
||||
exact: Simplex | None = None
|
||||
seg: tuple | None = None # (a: IntPoint, b: IntPoint, half_width: int)
|
||||
#: which copper a keepout tile stops: "all", "wires" (a wire_keepout,
|
||||
#: vias allowed) or "vias" (a via_keepout)
|
||||
blocks: str = "all"
|
||||
|
||||
def on_layer(self, layer: int) -> bool:
|
||||
return layer in self.layers
|
||||
@@ -118,7 +121,9 @@ class ShapeSearchTree:
|
||||
result.append(shape)
|
||||
return result
|
||||
|
||||
def clearance_conflict(self, box: IntBox, net_no: int, layer: int, clearance: int) -> bool:
|
||||
def clearance_conflict(
|
||||
self, box: IntBox, net_no: int, layer: int, clearance: int, kind: str = "wire"
|
||||
) -> bool:
|
||||
"""True if placing ``box`` (of ``net_no`` on ``layer``) would come *closer
|
||||
than* ``clearance`` to a different net's tile on that layer (exact).
|
||||
|
||||
@@ -129,6 +134,8 @@ class ShapeSearchTree:
|
||||
for shape in self.overlapping(expanded):
|
||||
if shape.net_no == net_no or not shape.on_layer(layer):
|
||||
continue
|
||||
if shape.blocks != "all" and shape.blocks != kind + "s":
|
||||
continue # a wire-only keepout does not stop a via, and so on
|
||||
if shape.exact is not None:
|
||||
if overlaps_2d(shape.exact, expanded):
|
||||
return True
|
||||
|
||||
Reference in New Issue
Block a user