Hole spacing to a fixed via measured from where it is, with its own drill
A fixed via sits anywhere, not on a cell centre, and may have a bigger drill than the router's via; checking hole spacing between cell centres with one drill let the flight controller's routed 0.2 mm via come 0.19 mm from a hand-placed 0.25 mm one. The board now carries each fixed via's drill (from KiCad's padstack name), and cells are checked against fixed vias exactly.
This commit is contained in:
@@ -56,7 +56,7 @@ def test_connections_sharing_a_plane_via_write_it_once():
|
||||
assert len(set(vias)) == len(vias), "a shared via written more than once"
|
||||
|
||||
|
||||
def _router(dsn_text):
|
||||
def _router(dsn_text, via_drill_um=300):
|
||||
from freeroute.board import build_board
|
||||
from freeroute.route.grid_router import GridRouter
|
||||
from freeroute.route.pipeline import _rule_clearance_dsn, _rule_width_dsn
|
||||
@@ -66,7 +66,7 @@ def _router(dsn_text):
|
||||
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,
|
||||
via_drill=via_drill_um * s, hole_to_hole=250 * s,
|
||||
), s
|
||||
|
||||
|
||||
@@ -98,3 +98,29 @@ def test_a_via_in_a_pad_keeps_hole_spacing_from_a_fixed_via():
|
||||
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))
|
||||
|
||||
|
||||
def test_hole_spacing_from_a_fixed_via_is_measured_from_where_it_really_is():
|
||||
# a fixed via off the grid with its own 0.25 mm drill, and the router's
|
||||
# via a smaller 0.2 mm one (the flight controller's case): a new via needs
|
||||
# its centre 0.1 + 0.125 + 0.25 = 0.475 mm away, measured exactly, where
|
||||
# one rule for all vias gave 0.2 + 0.25 = 0.45 from the cell centres
|
||||
text = _THT.replace("(network (net SIG (pins J1-1))))",
|
||||
"(network (net SIG (pins J1-1)) (net GND))\n"
|
||||
" (wiring (via \"Via[0-1]_500:250_um\" 3030 -3030 (net GND) (type route))))")
|
||||
text = text.replace(
|
||||
'(attach off)))\n (network',
|
||||
'(attach off))\n (padstack "Via[0-1]_500:250_um" (shape (circle F.Cu 500)) '
|
||||
'(shape (circle B.Cu 500)) (attach off)))\n (network',
|
||||
)
|
||||
router, s = _router(text, via_drill_um=200)
|
||||
via = next(v for v in router.board.get_items() if getattr(v, "drill", 0))
|
||||
assert via.drill == 250 * s
|
||||
loc = via.location
|
||||
for cell in [(x, y) for x in range(router.cols) for y in range(router.rows)]:
|
||||
c = router._cell_center(cell)
|
||||
d = math.hypot(c.x - loc.x, c.y - loc.y)
|
||||
if router.step * 1.5 < d < 470 * s:
|
||||
assert not router._holes_clear(cell, 1), f"{d / s:.0f} um from the fixed via"
|
||||
elif 560 * s < d < 700 * s and cell not in router._tht_block:
|
||||
assert router._holes_clear(cell, 1)
|
||||
|
||||
Reference in New Issue
Block a user