Count copper already on the board as connections already made
Fixed tracks and vias only kept other nets away, so a pin fanned out to its plane was routed to the plane again, beside its own fan-out. Pins, zones and planes that fixed copper of their net touches now form one connected group: a fanned-out supply pin needs nothing more, a fanned-out signal routes from its via, and copper touching no pin or zone adds nothing to route.
This commit is contained in:
@@ -48,3 +48,46 @@ def test_other_nets_route_around_a_fixed_track():
|
||||
continue
|
||||
for p, q in zip(pts, pts[1:], strict=False):
|
||||
assert not (min(p.x, q.x) < wall < max(p.x, q.x)), "crossed the GND track on F.Cu"
|
||||
|
||||
|
||||
# --- fixed wiring as connectivity ------------------------------------------
|
||||
|
||||
_FANOUT = """(pcb fanout (parser) (resolution um 10) (unit um)
|
||||
(structure
|
||||
(layer F.Cu (type signal)) (layer In1.Cu (type power)) (layer In2.Cu (type power))
|
||||
(layer B.Cu (type signal))
|
||||
(boundary (path pcb 0 0 0 30000 0 30000 -20000 0 -20000 0 0))
|
||||
(plane GND (polygon In1.Cu 0 500 -500 29500 -500 29500 -19500 500 -19500 500 -500))
|
||||
(via "Via[0-3]_600:300_um") (rule (width 150) (clearance 150)))
|
||||
(placement (component S (place G1 5000 -10000 front 0) (place A 10000 -10000 front 0)
|
||||
(place B 25000 -11500 back 0)))
|
||||
(library
|
||||
(image S (pin smd 1 0 0))
|
||||
(padstack smd (shape (rect F.Cu -300 -300 300 300)) (attach off))
|
||||
(padstack "Via[0-3]_600:300_um" (shape (circle F.Cu 600)) (shape (circle B.Cu 600)) (attach off)))
|
||||
(network (net GND (pins G1-1)) (net SIG (pins A-1 B-1)))
|
||||
(wiring
|
||||
(wire (path F.Cu 150 5000 -10000 5000 -11500) (net GND) (type route))
|
||||
(via "Via[0-3]_600:300_um" 5000 -11500 (net GND) (type route))
|
||||
(wire (path F.Cu 150 10000 -10000 10000 -11500) (net SIG) (type route))
|
||||
(via "Via[0-3]_600:300_um" 10000 -11500 (net SIG) (type route))
|
||||
(wire (path F.Cu 300 2000 -2000 8000 -2000) (net GND) (type route))))"""
|
||||
|
||||
|
||||
def test_a_pad_fanned_out_to_its_plane_needs_no_route():
|
||||
dsn = parse_dsn(_FANOUT)
|
||||
exact, _scale, _names = route_dsn_board_exact(dsn, resolution=2)
|
||||
gnd = next(i + 1 for i, n in enumerate(dsn.nets) if n.name == "GND")
|
||||
assert exact.result.failed == []
|
||||
assert not exact.result.vias.get(gnd) and not exact.result.wires.get(gnd)
|
||||
|
||||
|
||||
def test_a_fanned_out_signal_is_routed_from_its_via():
|
||||
# B is on the bottom face, level with A's fan-out via: starting from that
|
||||
# via on B.Cu is the cheapest way, and needs no via of its own
|
||||
dsn = parse_dsn(_FANOUT)
|
||||
exact, scale, names = route_dsn_board_exact(dsn, resolution=2)
|
||||
sig = next(i + 1 for i, n in enumerate(dsn.nets) if n.name == "SIG")
|
||||
assert sig in exact.result.routed_net_numbers
|
||||
assert not exact.result.vias.get(sig), "the fan-out via is already there"
|
||||
assert {names[layer] for layer, _ in exact.result.wires[sig]} == {"B.Cu"}
|
||||
|
||||
Reference in New Issue
Block a user