Open source · GPL-3.0 · Rust

The fast PCB autorouter
for KiCad.

fastroute routes your board from a Specctra DSN file, like Freerouting — several times faster, without Java, and with the bugs fixed. It adds what real boards need: length matching, controlled impedance and differential pairs, with your KiCad design rules carried over.

Version 0.1.4 · Windows · macOS (Apple Silicon and Intel) · Linux (x64 and ARM64) · KiCad 7 or newer

STM32H7 control board routed by fastroute: top layer tracks in orange, bottom layer in blue
STM32H7 control board — 4 layers, 158 nets, SDRAM, Ethernet, USB. Routed by fastroute in about three minutes, 0 unrouted, 0 KiCad DRC errors.
4–5×faster than Freerouting on its 20 benchmark boards (2102 s → 420 s)
20–300 MBmemory instead of 1–2 GB — no JVM
100 %identical results to Freerouting on its benchmarks in --parity mode
0unrouted connections left on the KiCad demo boards we route

Freerouting, rebuilt and fixed

fastroute started as a line-by-line port of Freerouting to Rust. With the Java router side by side, long-standing bugs became visible — and fixable.

Bugs fixed

  • The optimizer never ran after the autorouter stopped itself.
  • Boards scoring below zero could never be improved.
  • Connections into a plane layer through a via were rejected.
  • Nets marked "do not route" still got fanout stubs.
  • Unroutable pins made big nets like GND oscillate.
  • Unused fanout vias and stubs were left on the board.

A better router

  • Parallel autorouting passes and a parallel optimizer.
  • Multi-start: unrouted connections trigger reruns in parallel.
  • Bad passes are undone; stagnation stops save hours.
  • The optimizer also works on partly routed boards.
  • Checkpoints: the output always holds the best board so far.
  • Minimum track width is respected when necking down.

Built for KiCad

  • Design rules from .kicad_dru reach the router.
  • Zones, rule areas and copper texts exported correctly.
  • Zones refilled after routing; results checked with KiCad DRC.
  • Runs headless for scripts and CI, too.

New

Length matching

Group the nets of a memory bus or a clock tree and fastroute adds serpentines after routing until they match. Every meander is checked for clearance before it is kept, so your board stays DRC-clean. Vias count with their stackup height, exactly as KiCad measures them.

From KiCad: a skew or length rule in your board's custom rules is all it takes.

Serpentine meanders on SDRAM data lines
SDRAM data lines matched on the STM32H7 board.

New

Differential pairs

USB, Ethernet and other pairs are routed first, with the second net following the first at the pair gap. They are held in place while the rest of the board is routed, and released only where the board cannot be completed otherwise. Intra-pair skew is matched afterwards.

From KiCad: a diff_pair_gap rule on your pairs.

Two Ethernet differential pairs routed side by side
Ethernet TX and RX pairs from the PHY to the RJ45 jack.

New

Controlled impedance

Tell the impedance tool what you need — RF=50, USB=90d — and it computes the trace width for every layer from your board's stackup (microstrip, stripline, differential), writes the DRC rules, and fastroute routes those nets at full width, without necking down at the pins.

python3 impedance_cli.py board.kicad_pcb --class RF=50 --class USB=90d --write
LayerType50 Ω90 Ω diff
F.Cumicrostrip0.3870.405 / 0.405
In1.Custripline0.2970.227 / 0.227
In2.Custripline0.2970.227 / 0.227
B.Cumicrostrip0.3870.405 / 0.405

Width (and pair gap) in mm for a common 1.6 mm 4-layer stackup (7628 prepreg), without solder mask.

Performance

Full pipeline (autorouter and optimizer) in exact mode, where fastroute produces the same result as Freerouting — so the times compare like for like.

Freerouting (Java)fastroutefastroute + PGO
Sum of 20 benchmark boards2102 s510 s420 s
DAC2020_bm01960 s380 s310 s
CM5_MINIMA_3410 s23 s20 s
Peak memory (typical)1–2 GB20–300 MB

The default parallel mode is another 1.5–3× faster on most boards, with results that no longer have to match Freerouting's.

Checked with KiCad's own DRC

KiCad demo boards, all tracks removed and routed again from scratch, then checked with KiCad 10's design rule checker. Numbers are unconnected items / routing violations.

BoardOriginal designPlain Freerouting flowfastroute plugin
multichannel_mixer0 / 0160 unrouted0 / 0 · 3.3 s
complex_hierarchy0 / 183 / 30 / 0 · 0.7 s
interf_u0 / 38 / 3460 / 2 · 5.6 s
pic_programmer0 / 80 / 1180 / 0 · 0.7 s
ecc83-pp0 / 00 / 60 / 0 · 0.3 s

Boards routed by fastroute

Install the KiCad plugin

fastroute is distributed on GitHub. One package for every platform: the plugin picks the right fastroute binary itself — no Java, no Python packages, nothing else to install.

  1. Get the package from GitHub

    On the GitHub releases page, save fastroute-kicad-<version>.zip (Windows, macOS and Linux in one file). Do not unzip it — KiCad installs the zip file as it is.

  2. Open the Plugin and Content Manager

    In KiCad's main window (the project manager), click Plugin and Content Manager, or choose Tools → Plugin and Content Manager.

  3. Install from file

    Click Install from File… at the bottom left, select the zip and confirm. fastroute now appears on the Installed tab.

  4. Open your board

    Open the board in the PCB Editor. If it was already open, restart it or use Tools → External Plugins → Refresh Plugins. A fastroute button appears in the top toolbar.

  5. Route

    Click the fastroute button, or Tools → External Plugins → fastroute autorouter. Choose a mode — Fast (default, parallel optimizer), Exact (Freerouting's result bit for bit) or Quick (router only) — and click Route. The window shows the progress; Stop keeps the best result so far. Tracks are imported and zones refilled when it finishes.

  6. Check

    Run KiCad's DRC (Inspect → Design Rules Checker). Save your board before routing if you want to go back.

Your design rules come along

Net class widths and clearances, the minimum track width and the copper-to-edge clearance are used automatically. Rules in Board Setup → Custom Rules add more:

# match an SDRAM bus to 0.5 mm
(rule "SDRAM data"
  (condition "A.NetName == '/SD_D*'")
  (constraint skew (max 0.5mm)))

# route USB as a differential pair
(rule "USB"
  (condition "A.inDiffPair('/USB_D')")
  (constraint diff_pair_gap (opt 0.2mm)))

Command line

The fastroute binary also runs on its own, on any Specctra DSN file:

# route, write the result to board.ses
fastroute -de board.dsn -do board.ses

# stop after 10 minutes, keep the best result
fastroute -de board.dsn -do board.ses --max-time=600

# Windows
fastroute.exe -de board.dsn -do board.ses

# all options
fastroute --help

Standalone binaries for every platform are on the releases page. Freerouting's options work as before (-mp, --router.*).

The binaries are not code-signed yet. On macOS and Linux the plugin sets them up by itself (executable bit, quarantine flag); nothing to do for you. Signing is one of the goals of the sponsorship.

Free software, supported by its users

fastroute is GPL-3.0, like Freerouting it is built on — all credit for the original routing algorithms goes to the Freerouting authors. Sponsorship pays for the time to test on more real boards, answer bug reports quickly, and sign the binaries for macOS and Windows.

A bug report with a board that shows the problem helps just as much.