Adds ripup_needed.dsn: one signal layer (B.Cu is a power plane, so vias are impossible) with two nets whose greedy order strands NET_B, but where rip-up reroutes NET_A around NET_B to connect both. Tests: greedy (rip_up=False) leaves >= 1 connection unrouted with no vias; rip-up connects all with no vias; the result is deterministic across re-runs; rip-up keeps endpoints on pads and produces no same-layer cross between nets (ripped traces leave no orphaned occupancy). The crossing board's single-layer test now targets the greedy path explicitly, and a regression test asserts the real KiCad board still connects all four of its multi-pin nets. Oracle-gated parity added for the congested board.
freeroute
A native Python PCB autorouter — a Java-free port of the FreeRouting engine.
Why
kicad-mcp currently autoroutes by shelling out to freerouting.jar, which
drags in a JVM dependency. freeroute reimplements the routing engine in
pure Python so the toolchain needs no Java at all.
The contract
The entire integration surface is two Specctra files:
board.dsn ──▶ freeroute ──▶ board.ses
(unrouted) (routed session: traces + vias)
kicad-cli already exports .dsn and imports .ses, so freeroute is a
drop-in replacement for the JAR step — nothing else in the pipeline changes.
Status
Pre-alpha. Under active development. See docs/PORTING_PLAN.md
for the architecture and porting roadmap.
Usage (target)
freeroute board.dsn -o board.ses
Development
uv sync
uv run pytest
uv run ruff check src/ tests/
License
GPL-3.0-or-later, matching the FreeRouting source it is ported from.
Languages
Python
100%