# drandyhaas/kicadroutingtools architecture

> Architecture diagram of the GitHub repository drandyhaas/kicadroutingtools, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/drandyhaas/kicadroutingtools
- Repository: https://github.com/drandyhaas/kicadroutingtools

## Overview

KiCad Routing Tools is a KiCad PCB autorouter and board-workflow toolkit, exposed through a plugin GUI and command-line tools. Its main workflow takes a board through routing and board modification, then checks connectivity and design-rule outcomes. The documented product also includes differential-pair and plane routing, fanout, placement optimization, AI-assisted plans, and rendering. The tree and README establish these capabilities, but several entry-point and cross-subsystem call paths were not sampled; those relationships are omitted rather than inferred.

Main entry points: [`py_router/single_ended_routing.py`](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/single_ended_routing.py) (Single-ended routing), [`kicad_routing_plugin/swig_gui.py`](https://github.com/drandyhaas/kicadroutingtools/blob/main/kicad_routing_plugin/swig_gui.py) (KiCad plugin), [`py_placer/placement/simple.py`](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_placer/placement/simple.py) (Placement engine), [`py_router/routing_context.py`](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/routing_context.py) (Routing context)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interfaces["User interfaces"]
  node_plugin["KiCad plugin<br/>[swig_gui.py]"]
  node_cli["CLI tools<br/>[route.py]"]
  node_ai["AI assistance<br/>[ai_backend.py]"]
  node_plans["Routing plans<br/>[run_plan.py]"]
end

subgraph group_routing["Routing engine"]
  node_route["Single-ended routing"]
  node_router["Rust A* core<br/>[router.rs]"]
  node_context["Routing context<br/>[routing_context.py]"]
  node_config["Routing configuration<br/>[routing_config.py]"]
  node_obstacles["Obstacle map<br/>[obstacle_map.py]"]
end

subgraph group_specialized["Specialized routing"]
  node_pairs["Differential pairs"]
  node_planes["Plane routing<br/>[route_planes.py]"]
  node_fanout["BGA fanout<br/>[__init__.py]"]
  node_qfn["QFN fanout<br/>[__init__.py]"]
  node_bus["Bus routing<br/>[bus_corridor.py]"]
end

subgraph group_placement["Placement optimization"]
  node_placement["Placement engine<br/>[simple.py]"]
  node_floorplan["Floorplan intent<br/>[floorplan.py]"]
end

subgraph group_validation["Verification and output"]
  node_modify["Board modification"]
  node_connectivity["Connectivity checks<br/>[check_connected.py]"]
  node_drc["DRC checks<br/>[check_drc.py]"]
  node_cleanup["Copper cleanup"]
  node_render["Board rendering<br/>[route_render.py]"]
end

node_designer(("Board designer"))
node_board["KiCad board"]

node_designer -->|"uses"| node_plugin
node_designer -->|"uses"| node_cli
node_plugin -->|"offers"| node_ai
node_plugin -->|"loads"| node_plans
node_board -->|"routes"| node_route
node_cli -->|"runs"| node_route
node_route -->|"uses"| node_router
node_route -.->|"writes"| node_modify
node_route -->|"supports"| node_pairs
node_route -->|"supports"| node_planes
node_route -->|"supports"| node_fanout
node_route -->|"supports"| node_qfn
node_route -->|"supports"| node_bus
node_route -->|"verifies"| node_connectivity
node_route -->|"checks"| node_drc
node_route -->|"cleans"| node_cleanup
node_designer -->|"optimizes"| node_placement
node_placement -->|"uses intent"| node_floorplan
node_placement -->|"fast route"| node_route
node_designer -->|"views board"| node_render
node_context -->|"uses"| node_obstacles
node_context -->|"uses"| node_config
node_router -->|"reads"| node_obstacles
node_plans -->|"runs headless"| node_plugin

click node_plugin "https://github.com/drandyhaas/kicadroutingtools/blob/main/kicad_routing_plugin/swig_gui.py"
click node_cli "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/route.py"
click node_ai "https://github.com/drandyhaas/kicadroutingtools/blob/main/kicad_routing_plugin/ai_backend.py"
click node_plans "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/run_plan.py"
click node_route "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/single_ended_routing.py"
click node_router "https://github.com/drandyhaas/kicadroutingtools/blob/main/rust_router/src/router.rs"
click node_context "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/routing_context.py"
click node_config "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/routing_config.py"
click node_obstacles "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/obstacle_map.py"
click node_pairs "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/diff_pair_routing.py"
click node_planes "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/route_planes.py"
click node_fanout "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/bga_fanout/__init__.py"
click node_qfn "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/qfn_fanout/__init__.py"
click node_bus "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/bus_corridor.py"
click node_placement "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_placer/placement/simple.py"
click node_floorplan "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_placer/placement/floorplan.py"
click node_modify "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/pcb_modification.py"
click node_connectivity "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/check_connected.py"
click node_drc "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/check_drc.py"
click node_cleanup "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/cleanup_pipeline.py"
click node_render "https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/route_render.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_plugin,node_cli,node_ai,node_plans toneBlue
class node_route,node_router,node_context,node_config,node_obstacles toneAmber
class node_pairs,node_planes,node_fanout,node_qfn,node_bus toneMint
class node_placement,node_floorplan toneRose
class node_modify,node_connectivity,node_drc,node_cleanup,node_render,node_designer,node_board toneIndigo
```

## Components

### User interfaces

- [KiCad plugin](https://github.com/drandyhaas/kicadroutingtools/blob/main/kicad_routing_plugin/swig_gui.py): `kicad_routing_plugin/swig_gui.py`
- [CLI tools](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/route.py): `py_router/route.py`
- [AI assistance](https://github.com/drandyhaas/kicadroutingtools/blob/main/kicad_routing_plugin/ai_backend.py): `kicad_routing_plugin/ai_backend.py`
- [Routing plans](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/run_plan.py): `py_router/run_plan.py`

### Routing engine

- [Single-ended routing](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/single_ended_routing.py): `py_router/single_ended_routing.py`
- [Rust A* core](https://github.com/drandyhaas/kicadroutingtools/blob/main/rust_router/src/router.rs): `rust_router/src/router.rs`
- [Routing context](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/routing_context.py): `py_router/routing_context.py`
- [Routing configuration](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/routing_config.py): `py_router/routing_config.py`
- [Obstacle map](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/obstacle_map.py): `py_router/obstacle_map.py`

### Specialized routing

- [Differential pairs](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/diff_pair_routing.py): `py_router/diff_pair_routing.py`
- [Plane routing](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/route_planes.py): `py_router/route_planes.py`
- [BGA fanout](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/bga_fanout/__init__.py): `py_router/bga_fanout/__init__.py`
- [QFN fanout](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/qfn_fanout/__init__.py): `py_router/qfn_fanout/__init__.py`
- [Bus routing](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/bus_corridor.py): `py_router/bus_corridor.py`

### Placement optimization

- [Placement engine](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_placer/placement/simple.py): `py_placer/placement/simple.py`
- [Floorplan intent](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_placer/placement/floorplan.py): `py_placer/placement/floorplan.py`

### Verification and output

- [Board modification](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/pcb_modification.py): `py_router/pcb_modification.py`
- [Connectivity checks](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/check_connected.py): `py_router/check_connected.py`
- [DRC checks](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/check_drc.py): `py_router/check_drc.py`
- [Copper cleanup](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/cleanup_pipeline.py): `py_router/cleanup_pipeline.py`
- [Board rendering](https://github.com/drandyhaas/kicadroutingtools/blob/main/py_router/route_render.py): `py_router/route_render.py`

### Other components

- **Board designer**
- **KiCad board**

## Connections

- Board designer → KiCad plugin: uses (evidence: `README.md`)
- Board designer → CLI tools: uses (evidence: `README.md`)
- KiCad plugin → AI assistance: offers (evidence: `README.md`)
- KiCad plugin → Routing plans: loads (evidence: `README.md`)
- KiCad board → Single-ended routing: routes (evidence: `README.md`)
- CLI tools → Single-ended routing: runs (evidence: `README.md`)
- Single-ended routing → Rust A* core: uses (evidence: `README.md`)
- Single-ended routing → Board modification: writes
- Single-ended routing → Differential pairs: supports (evidence: `README.md`)
- Single-ended routing → Plane routing: supports (evidence: `README.md`)
- Single-ended routing → BGA fanout: supports (evidence: `README.md`)
- Single-ended routing → QFN fanout: supports (evidence: `README.md`)
- Single-ended routing → Bus routing: supports (evidence: `README.md`)
- Single-ended routing → Connectivity checks: verifies (evidence: `README.md`)
- Single-ended routing → DRC checks: checks (evidence: `README.md`)
- Single-ended routing → Copper cleanup: cleans (evidence: `README.md`)
- Board designer → Placement engine: optimizes (evidence: `README.md`)
- Placement engine → Floorplan intent: uses intent (evidence: `README.md`)
- Placement engine → Single-ended routing: fast route (evidence: `README.md`)
- Board designer → Board rendering: views board (evidence: `README.md`)
- Routing context → Obstacle map: uses (evidence: `py_router/routing_context.py`)
- Routing context → Routing configuration: uses (evidence: `py_router/routing_context.py`)
- Rust A* core → Obstacle map: reads (evidence: `rust_router/src/router.rs`)
- Routing plans → KiCad plugin: runs headless (evidence: `README.md`)
