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:
@@ -183,6 +183,11 @@ def _read_structure(node: SExp, board: DsnBoard) -> None:
|
||||
area = read_area(it)
|
||||
if area is not None:
|
||||
board.keepouts.append(Keepout(area=area, kind="wire_keepout"))
|
||||
elif head == "plane":
|
||||
# (plane <net> <shape>): KiCad exports each zone this way
|
||||
plane = _read_plane(it)
|
||||
if plane is not None:
|
||||
board.planes.append(plane)
|
||||
elif head == "place_keepout":
|
||||
area = read_area(it)
|
||||
if area is not None:
|
||||
@@ -513,3 +518,19 @@ def parse_dsn(text: str) -> DsnBoard:
|
||||
# `wiring` and unknown scopes are intentionally ignored for now.
|
||||
|
||||
return board
|
||||
|
||||
|
||||
def _read_plane(node: SExp):
|
||||
"""``(plane <net> (polygon <layer> <width> x y ...))`` -> :class:`Plane`."""
|
||||
from .model import Plane
|
||||
|
||||
items = node.items
|
||||
if not items or not isinstance(items[0], Token):
|
||||
return None
|
||||
net = items[0].text
|
||||
for sub in items[1:]:
|
||||
if isinstance(sub, SExp):
|
||||
shape = read_shape(sub)
|
||||
if shape is not None:
|
||||
return Plane(net=net, shape=shape)
|
||||
return None
|
||||
|
||||
Reference in New Issue
Block a user