Write SES coordinates in resolution units, as FreeRouting does
SES lengths and coordinates were written in the DSN's unit while the session declared (resolution um 10), so readers that follow FreeRouting's SesWriter (KiCad's importer, mckicad's ses_apply) placed every track at a tenth of its size. The JAR, run on the same DSN, writes F1 at 65000 where freeroute wrote 6500. Scale every length by the resolution factor: placements, via padstack shapes, wire widths and points, and vias. Rotations stay as they are. The router tests compared SES output against DSN pad positions and so had the same mistake built in; they now derive the expected values through ses_scale.
This commit is contained in:
@@ -20,6 +20,7 @@ from freeroute.board import build_board
|
||||
from freeroute.dsn import parse_dsn
|
||||
from freeroute.dsn.sexp import parse
|
||||
from freeroute.route import route, route_dsn_board
|
||||
from freeroute.ses.writer import ses_scale
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
||||
|
||||
@@ -89,9 +90,14 @@ def test_pipeline_emits_valid_ses_with_both_nets():
|
||||
|
||||
|
||||
def test_simple_trace_endpoints_sit_on_the_net_pads():
|
||||
# Pad centres in DSN units, scaled to the SES's resolution units.
|
||||
k = ses_scale(parse_dsn(SIMPLE.read_text()))
|
||||
pads = {
|
||||
"NET_A": {(20000.0, -20000.0), (180000.0, -20000.0)},
|
||||
"NET_B": {(20000.0, -60000.0), (180000.0, -60000.0)},
|
||||
net: {(x * k, y * k) for x, y in centres}
|
||||
for net, centres in {
|
||||
"NET_A": {(20000.0, -20000.0), (180000.0, -20000.0)},
|
||||
"NET_B": {(20000.0, -60000.0), (180000.0, -60000.0)},
|
||||
}.items()
|
||||
}
|
||||
for net_name, scope in _net_scopes(route(SIMPLE.read_text())).items():
|
||||
endpoints = set()
|
||||
@@ -231,13 +237,14 @@ def test_no_two_nets_cross_on_the_same_layer():
|
||||
|
||||
def test_traces_stay_within_the_board_outline():
|
||||
for path in (SIMPLE, CROSSING):
|
||||
k = ses_scale(parse_dsn(path.read_text()))
|
||||
ses = route(path.read_text())
|
||||
for scope in _net_scopes(ses).values():
|
||||
for wire in scope["wires"]:
|
||||
_, coords = _wire_layer_and_coords(wire)
|
||||
for x, y in coords:
|
||||
assert 0 <= x <= 200000
|
||||
assert -80000 <= y <= 0
|
||||
assert 0 <= x <= 200000 * k
|
||||
assert -80000 * k <= y <= 0
|
||||
|
||||
|
||||
def test_traces_stay_on_valid_layers():
|
||||
|
||||
Reference in New Issue
Block a user