Hole spacing also from through-hole pads and fixed vias
A route could drop a via next to (or onto) a through-hole pad of its own net, where it changes layer for free, and a via reusing a fixed via's cell came out a little off the fixed via's centre, beside it. No via now goes within hole spacing of a through-hole pad of any net; a via in a pad is checked exactly against every via and hole; and a routed via on a fixed via of its net is not written. charge-sense: 4 hole_to_hole to 0; flight controller: 2 to 0, unconnected unchanged.
This commit is contained in:
@@ -54,3 +54,47 @@ def test_connections_sharing_a_plane_via_write_it_once():
|
||||
vias = exact.result.vias[1]
|
||||
assert len(vias) < 8, "no via is shared, so this board no longer tests sharing"
|
||||
assert len(set(vias)) == len(vias), "a shared via written more than once"
|
||||
|
||||
|
||||
def _router(dsn_text):
|
||||
from freeroute.board import build_board
|
||||
from freeroute.route.grid_router import GridRouter
|
||||
from freeroute.route.pipeline import _rule_clearance_dsn, _rule_width_dsn
|
||||
|
||||
dsn = parse_dsn(dsn_text)
|
||||
s = dsn.resolution.value
|
||||
return GridRouter(
|
||||
build_board(dsn), trace_width=round(_rule_width_dsn(dsn) * s),
|
||||
clearance=round(_rule_clearance_dsn(dsn) * s), resolution=2, orthogonal=True,
|
||||
via_drill=300 * s, hole_to_hole=250 * s,
|
||||
), s
|
||||
|
||||
|
||||
_THT = """(pcb tht (parser) (resolution um 10) (unit um)
|
||||
(structure (layer F.Cu (type signal)) (layer B.Cu (type signal))
|
||||
(boundary (path pcb 0 0 0 20000 0 20000 -20000 0 -20000 0 0))
|
||||
(via "Via[0-1]_500:300_um") (rule (width 150) (clearance 150)))
|
||||
(placement (component T (place J1 10000 -10000 front 0)))
|
||||
(library (image T (pin tht 1 0 0))
|
||||
(padstack tht (shape (circle F.Cu 1700)) (shape (circle B.Cu 1700)) (attach off))
|
||||
(padstack "Via[0-1]_500:300_um" (shape (circle F.Cu 500)) (shape (circle B.Cu 500)) (attach off)))
|
||||
(network (net SIG (pins J1-1))))"""
|
||||
|
||||
|
||||
def test_no_via_goes_near_a_through_hole_pads_hole_even_of_its_own_net():
|
||||
router, s = _router(_THT)
|
||||
pin = router._cell_of(router.board.get_pins()[0].location)
|
||||
assert not router._holes_clear(pin, 1) # own net, right on the pad
|
||||
far = (pin[0] + 40, pin[1])
|
||||
assert router._holes_clear(far, 1)
|
||||
|
||||
|
||||
def test_a_via_in_a_pad_keeps_hole_spacing_from_a_fixed_via():
|
||||
from freeroute.geometry import IntPoint
|
||||
|
||||
text = _THT.replace("(network (net SIG (pins J1-1))))",
|
||||
"(network (net SIG (pins J1-1)))\n"
|
||||
" (wiring (via \"Via[0-1]_500:300_um\" 3000 -3000 (net SIG) (type route))))")
|
||||
router, s = _router(text)
|
||||
assert not router._hole_clear_at(IntPoint(3400 * s, -3000 * s)) # 0.4 mm < 0.55 mm
|
||||
assert router._hole_clear_at(IntPoint(3600 * s, -3000 * s))
|
||||
|
||||
Reference in New Issue
Block a user