A diagonal segment's copper has no axis-aligned exact tile, so segment_box falls back to the bounding box -- a huge conservative cover that makes diagonal traces conflict with everything. segment_octagon builds the tight cover instead: the copper of a 0/45/90/135-degree segment swept by a radius, as a convex integer Simplex bounded by the four axis and four x+y / x-y diagonal half-planes. Diagonal bounds widen by ceil_sqrt2(radius) -- the exact integer ceiling of radius*sqrt(2) via math.isqrt, no float -- rounded outward, so the octagon is a provable superset of segment (+) disk(radius) (verified over 20k sampled copper points). Growing by clearance is just a larger radius, giving both the stored copper tile and the queried clearance region. overlaps_2d tests a real 2-D overlap via exact Simplex intersection, accepting mixed IntBox/Simplex tiles.
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%