> ## Documentation Index
> Fetch the complete documentation index at: https://docs.koppar.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Benchmarks

> How the Koppar autorouter is measured: KiCad ratsnest and DRC on eight open-hardware boards, against Freerouting, tscircuit, KiCad Routing Tools and TraceMaker, on one machine with one cap.

Board quality is measured, not judged. The router is scored on professionally routed open-hardware boards, by KiCad, with the original human layout as the reference, next to four other autorouters run the same way on the same machine. This page is the method and the numbers.

## The fleet

Eight boards, 2 to 4 layers (two 2-layer, six 4-layer), each with the upstream routed board as ground truth. Each board is used under its upstream licence; the links below go to the original design files.

| Board | Source | Layers | Difficulty |
| - | - | - | - |
| pic-programmer | [KiCad demos](https://gitlab.com/kicad/code/kicad/-/tree/10.0.4/demos/pic_programmer) | 2 | easy, through-hole |
| rp2040-minimal | [Raspberry Pi RP2040 minimal reference, revision 2](https://web.archive.org/web/20240521000034/https://datasheets.raspberrypi.com/rp2040/Minimal-KiCAD.zip) | 2 | medium |
| pico-vga | [Raspberry Pi Pico VGA demo board](https://web.archive.org/web/20211203134822/https://datasheets.raspberrypi.com/rp2040/VGA-KiCAD.zip) | 4 | medium, signals on the outer layers, ground planes inside |
| cm5io | [Raspberry Pi CM5 IO board rev 2](https://pip.raspberrypi.com/categories/1098-design-files) | 4 | hard |
| rk3328-som-evb | [OLIMEX RK3328-SOM-EVB](https://github.com/OLIMEX/RK3328-SOM-EBV) | 4 | medium, 10-mil carrier |
| scalenode-cm4 | [Antmicro scalenode CM4 baseboard](https://github.com/antmicro/scalenode-cm4-baseboard) | 4 | hard, dense CM4 carrier |
| stmp157-som-evb | [OLIMEX STMP157-BASE-SOM-EVB](https://github.com/OLIMEX/STMP157-BASE-SOM-EVB) | 4 | medium to hard carrier |
| imx8mp-som-evb | [OLIMEX iMX8MP-SOM-EVB](https://github.com/OLIMEX/iMX8MP-SOM-EVB) | 4 | medium to hard carrier |

## The method

* **The referee is KiCad.** Connectivity is KiCad's own ratsnest, read with `kicad-cli`. Completion is `100 × (1 − unconnected / ratsnest)`. Design rules are checked by `kicad-cli pcb drc` with the benchmark rules after a zone refill, and the errors reported are the ones a tool added over the human board's own findings (two boards carry an unclosed outline or a courtyard overlap from upstream).
* **An entry never scores itself.** A router's own completion claim is recorded but not used. A router that reports 100% and leaves a stranded pad scores the stranded pad.
* **Same placement, same rules, same cap.** Every router starts from the human placement alone: tracks, vias and copper pours are removed, and every net, ground included, is the router's to connect. Each has 1200 s of wall clock per board on the same workstation (24 cores, one GPU). A tool that returns nothing inside the cap is shown as timed out, not scored as zero.
* **The rules are the benchmark's.** One floor per board (0.1 mm clearance and tracks on the 4-layer carriers), without the impedance classes or cm5io's PoE spacing, published per board and applied to every router and to the DRC referee. The table measures routing under that floor, not each design's own constraints; the 25-board run uses each board's own rules.
* **One configuration.** No per-board flags for any tool. Koppar's time is the whole product path, everything a user's own board goes through.

## Six routers, eight boards

Measured 14 to 16 October 2026 with KiCad 10.0.4 as referee. Each cell is completion by KiCad ratsnest, DRC errors added over the human board, via count and wall-clock seconds.

| Board | Layers | Connections | Koppar | Koppar (filled vias) | Freerouting 2.5.0 | tscircuit 0.0.979 | KiCad Routing Tools 0.1.9 | TraceMaker 0.9.0 | Zap! (hosted) |
| - | - | - | - | - | - | - | - | - | - |
| pic-programmer | 2 | 125 | 100% · 0 DRC · 8 vias · 6 s | 100% · 0 DRC · 6 vias · 6 s · 1 vias in pin pads | 100% · 5 DRC · 0 vias · 5 s | 100% · 115 DRC · 15 vias · 12 s | 100% · 95 DRC · 99 vias · 44 s | 96.8% · 0 DRC · 3 vias · reached at 33 s of 92 s | 100% · 0 DRC · 28 vias · 56 s |
| rp2040-minimal | 2 | 150 | 100% · 0 DRC · 116 vias · 5 s | 100% · 0 DRC · 83 vias · 6 s · 36 vias in pin pads | 86% · 4 DRC · 40 vias · reached at 18 s of 61 s | 100% · 149 DRC · 69 vias · 11 s | 26.67% · 12 DRC · 12 vias · 127 s | 100% · 0 DRC · 53 vias · 20 s · 14 vias in pin pads | 100% · 0 DRC · 52 vias · 22 s |
| pico-vga | 4 | 180 | 100% · 0 DRC · 96 vias · 8 s | 100% · 0 DRC · 92 vias · 6 s · 75 vias in pin pads | 100% · 8 DRC · 48 vias · reached at 5 s of 11 s | 100% · 127 DRC · 69 vias · 12 s | 100% · 222 DRC · 116 vias · 42 s · 25 vias in pin pads | 100% · 0 DRC · 49 vias · reached at 143 s of 161 s · 21 vias in pin pads | 100% · 0 DRC · 83 vias · 17 s |
| cm5io | 4 | 431 | 100% · 0 DRC · 877 vias · reached at 856 s of 887 s | 100% · 0 DRC · 831 vias · reached at 724 s of 752 s · 96 vias in pin pads | timed out (1200.2 s) | no board (664.1 s) | 50.12% · 88 DRC · 84 vias · 1208 s · 22 vias in pin pads | 94.9% · 0 DRC · 412 vias · reached at 1201 s of 1203 s · 34 vias in pin pads | timed out (1209.0 s) |
| rk3328-som-evb | 4 | 462 | 100% · 0 DRC · 359 vias · 46 s | 100% · 0 DRC · 333 vias · 22 s · 151 vias in pin pads | 96.54% · 42 DRC · 245 vias · reached at 195 s of 610 s | 100% · 403 DRC · 391 vias · 163 s | 43.94% · 143 DRC · 104 vias · 971 s · 47 vias in pin pads | 100% · 0 DRC · 272 vias · reached at 1201 s of 1202 s · 88 vias in pin pads | 96.75% · 0 DRC · 333 vias · 374 s |
| scalenode-cm4 | 4 | 446 | 100% · 0 DRC · 428 vias · 79 s | 100% · 0 DRC · 459 vias · reached at 404 s of 429 s · 126 vias in pin pads | timed out (1200.1 s) | 99.1% · 215 DRC · 368 vias · 77 s | 54.93% · 156 DRC · 102 vias · 533 s · 33 vias in pin pads | 100% · 0 DRC · 224 vias · reached at 448 s of 832 s · 41 vias in pin pads | refused (footprints\_outside\_board) |
| stmp157-som-evb | 4 | 905 | 100% · 0 DRC · 1131 vias · reached at 412 s of 484 s | 100% · 0 DRC · 1100 vias · 109 s · 341 vias in pin pads | timed out (1200.1 s) | timed out (1413.5 s) | 21.66% · 246 DRC · 196 vias · 1202 s · 34 vias in pin pads | 100% · 0 DRC · 856 vias · 1203 s · 200 vias in pin pads | 96.24% · 0 DRC · 840 vias · 892 s |
| imx8mp-som-evb | 4 | 997 | 100% · 0 DRC · 1429 vias · reached at 1086 s of 1194 s | 100% · 0 DRC · 1116 vias · reached at 149 s of 222 s · 379 vias in pin pads | timed out (1200.2 s) | 100% · 1052 DRC · 1247 vias · 826 s · 1 vias in pin pads | 30.79% · 469 DRC · 307 vias · 1203 s · 61 vias in pin pads | 99.3% · 0 DRC · 795 vias · 1202 s · 200 vias in pin pads | timed out (1200.5 s) |

Notes on the other tools, so the table is read fairly:

* **Zap!** is a hosted service (zap.mutual.solutions, service build 2026.10.14.60), sent the same board and project with its fab floor set to the board's rules. Its time is the job's run time on the service, not its queue; a job still running at the cap was cancelled. It refused scalenode-cm4 because the human design has a footprint outside the board outline.
* **Freerouting 2.5.0** writes its board only when it finishes, so a run that hits the cap has no board to score. It was run with 8 threads.
* **tscircuit 0.0.979** is the capacity autorouter (`AutoroutingPipelineSolver`) fed the board as Simple Route JSON; its traces are written back into the KiCad board as returned, including widths below the minimum it was given.
* **KiCad Routing Tools 0.1.9** is the WASM build of the Rust grid router, run on a 0.05 mm grid (at the documented 0.1 mm it cannot leave a 0.4 mm-pitch pad at the board clearance). It routes all nets in one call and gives up on the first net it cannot close; when that happens inside the cap, the harness routes net by net with the copper routed so far as obstacles, so the board scores as a partial result.
* **TraceMaker 0.9.0** reads and writes KiCad boards directly and was given the full cap as its time limit.

The boards (fetched from their pinned upstream sources), the benchmark rules, the harness for every tool with its exact version, and the raw results are public in [autorouter-bench](https://github.com/Koppar-AI/autorouter-bench), so anyone can rerun them.

## What we do not claim

* Koppar does not beat human layouts. It routes every board here, but the human layout is still better on vias, track length and plane integrity, and TraceMaker drills fewer vias than Koppar on every 4-layer board. Completion and DRC do not score planes: a 4-layer board routed with no ground plane can reach 100% here.
* Each tool was run as shipped, with its defaults and the board's rules. A tool's author may know settings that do better; the harnesses are public so anyone can show it.
* Completion is not quality. The gap between a routed board and a human board is planning: rails sized for current, decoupling at the pin, unbroken return paths, pairs coupled along their length. Today's public benchmarks do not score that.

## Coming next

Eight boards is a small sample. 25 more public open-hardware boards, 2 to 8 layers, are pinned in [autorouter-bench](https://github.com/Koppar-AI/autorouter-bench) with their sources and checksums. The run on them is coming.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.