Before a dropped net is abandoned, the exact router (with shove=True) tries to make room by moving an existing trace aside instead: it forms a straight orthogonal candidate for the dropped net, finds the axis-aligned trace segments that cross it, and shoves each one perpendicular (via shove_segment) far enough to restore clearance. A shove is accepted only if the moved trace still connects its pads, clears every other item exactly against the ShapeSearchTree, and stays inside the board outline, so DRC-cleanliness is preserved by construction. Shoves are bounded (max_shove_depth, per-trace shove_cap) and deterministic. The dropped set now includes nets the grid failed to route, not only exact-clearance rejections, so shove can recover them. The pipeline exposes shove (and rip_up) through route_dsn_board_exact / build_exact_routing_result / route(engine='exact', shove=True); default off, so the grid track and the no-shove exact track are unchanged.
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%