Merge fix/default-exact: exact engine by default, warn on unchecked engines

This commit is contained in:
2026-10-07 18:52:10 -06:00
2 changed files with 33 additions and 9 deletions
+16 -4
View File
@@ -94,11 +94,12 @@ def build_parser() -> argparse.ArgumentParser:
parser.add_argument(
"--engine",
choices=sorted(ENGINE_OPTIONS),
default="grid",
default="exact",
help=(
"routing track: grid (default; multi-layer rip-up maze, highest coverage), "
"exact (orthogonal, exact-geometry DRC-verified output), "
"room (continuous expansion rooms, routes off-grid channels)"
"routing track: exact (default; every route checked against exact pad and "
"copper shapes, DRC-clean output), grid (quick maze on the grid alone: its "
"copper is NOT clearance-checked and can short), room (continuous expansion "
"rooms, routes off-grid channels; not clearance-checked either)"
),
)
parser.add_argument(
@@ -386,6 +387,17 @@ def main(argv: list[str] | None = None) -> int:
for net, a, b, zone in in_zone:
print(f" {net}: {a} to {b} (both in zone {zone})", file=sys.stderr)
if args.engine != "exact":
# These engines route on approximations and do not check the copper
# they write against exact shapes: a board can come out with shorts
# that this report would otherwise never mention.
print(
f"rpmroute: WARNING: the {args.engine} engine does not check its copper for "
"clearance or shorts; run KiCad's DRC on the result, or route with "
"--engine exact (the default)",
file=sys.stderr,
)
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
f.write(ses_text)
+17 -5
View File
@@ -71,13 +71,25 @@ def test_cli_every_engine_routes_a_fixture(engine, tmp_path):
assert "(wire" in text
def test_cli_default_engine_is_grid(tmp_path):
"""The default must stay grid — the drop-in JAR replacement behaviour."""
def test_cli_default_engine_is_exact(tmp_path):
"""The default is the engine that checks its copper: grid output can short
and say nothing (a user routing with no flags shipped 15 crossings)."""
default = tmp_path / "default.ses"
grid = tmp_path / "grid.ses"
exact = tmp_path / "exact.ses"
assert main([str(FIXTURE), "-do", str(default)]) == 0
assert main([str(FIXTURE), "--engine", "grid", "-do", str(grid)]) == 0
assert default.read_text() == grid.read_text()
assert main([str(FIXTURE), "--engine", "exact", "-do", str(exact)]) == 0
assert default.read_text() == exact.read_text()
@pytest.mark.parametrize("engine", ["grid", "room"])
def test_unchecked_engines_say_so(tmp_path, capsys, engine):
assert main([str(FIXTURE), "--engine", engine, "-do", str(tmp_path / "out.ses")]) == 0
assert "does not check its copper" in capsys.readouterr().err
def test_the_exact_engine_does_not_warn(tmp_path, capsys):
assert main([str(FIXTURE), "-do", str(tmp_path / "out.ses")]) == 0
assert "WARNING" not in capsys.readouterr().err
def test_cli_room_pack_routes(tmp_path):