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:
@@ -12,7 +12,7 @@ from __future__ import annotations
|
||||
from freeroute.geometry import IntBox
|
||||
|
||||
from .clearance import ClearanceMatrix
|
||||
from .items import Item, ObstacleArea, Pin, Trace, Via
|
||||
from .items import ConductionArea, Item, ObstacleArea, Pin, Trace, Via
|
||||
from .layer import LayerStructure
|
||||
from .net import Nets
|
||||
|
||||
@@ -57,7 +57,15 @@ class BasicBoard:
|
||||
return [it for it in self._items if isinstance(it, Pin)]
|
||||
|
||||
def get_obstacle_areas(self) -> list[ObstacleArea]:
|
||||
return [it for it in self._items if isinstance(it, ObstacleArea)]
|
||||
"""Keepouts. Copper zones are not obstacles; see get_conduction_areas."""
|
||||
return [
|
||||
it
|
||||
for it in self._items
|
||||
if isinstance(it, ObstacleArea) and not isinstance(it, ConductionArea)
|
||||
]
|
||||
|
||||
def get_conduction_areas(self) -> list[ConductionArea]:
|
||||
return [it for it in self._items if isinstance(it, ConductionArea)]
|
||||
|
||||
def get_traces(self) -> list[Trace]:
|
||||
return [it for it in self._items if isinstance(it, Trace)]
|
||||
|
||||
Reference in New Issue
Block a user