# eason070211/pcb_router architecture

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

- Interactive diagram: https://gitdiagram.com/eason070211/pcb_router
- Repository: https://github.com/eason070211/pcb_router
- Video tour (about a minute): https://gitdiagram.com/eason070211/pcb_router/video

## Overview

PCB Router is a Python research and teaching framework for automatic PCB routing. Users can generate demo boards, choose a registered routing algorithm through the CLI or Tkinter GUI, and inspect routing results and quality metrics. Its high-speed workflow adds layer assignment to reduce vias and serpentine length matching for differential pairs and buses. The graph includes the documented Lee, A*, PathFinder, and rip-up/reroute algorithms, plus shared board, cost, and multi-pin routing layers. Some links follow README descriptions or SOURCE INDEX references; unsampled implementation details are not assumed.

Main entry points: [`pcbrouter/board.py`](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/board.py) (Layered board grid), [`pcbrouter/router_base.py`](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/router_base.py) (Router interface), [`run_highspeed_demo.py`](https://github.com/eason070211/pcb_router/blob/main/run_highspeed_demo.py) (High-speed demo), [`pcbrouter/algorithms/pathfinder.py`](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/pathfinder.py) (PathFinder router)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interfaces["User interfaces"]
  node_gui["Tkinter GUI<br/>[gui.py]"]
  node_cli["Demo CLI<br/>[run_demo.py]"]
  node_highspeed["High-speed demo"]
end

subgraph group_routing["Routing algorithms"]
  node_lee["Lee router<br/>[lee.py]"]
  node_astar["A* router<br/>[astar.py]"]
  node_pathfinder["PathFinder router<br/>[pathfinder.py]"]
  node_ripup["Rip-up reroute<br/>[ripup_reroute.py]"]
end

subgraph group_core["Routing core"]
  node_examples["Board examples<br/>[examples.py]"]
  node_routerbase["Router interface<br/>[router_base.py]"]
  node_registry["Algorithm registry<br/>[router_base.py]"]
  node_model["Routing data model<br/>[model.py]"]
  node_board["Layered board grid<br/>[board.py]"]
  node_cost["Edge costs<br/>[cost.py]"]
  node_common["Multi-pin helpers<br/>[common.py]"]
end

subgraph group_refinement["Refinement and evaluation"]
  node_layerassign["Layer assignment"]
  node_matching["Serpentine tuner<br/>[length_matching.py]"]
  node_metrics["Quality metrics<br/>[metrics.py]"]
end

node_user(("User"))

node_user -->|"opens"| node_gui
node_user -->|"runs"| node_cli
node_user -->|"runs"| node_highspeed
node_gui -->|"loads examples"| node_examples
node_cli -->|"loads examples"| node_examples
node_highspeed -->|"loads board"| node_examples
node_gui -->|"selects router"| node_registry
node_cli -->|"selects router"| node_registry
node_highspeed -->|"selects router"| node_registry
node_registry -->|"instantiates"| node_routerbase
node_lee -->|"implements"| node_routerbase
node_astar -->|"implements"| node_routerbase
node_pathfinder -->|"implements"| node_routerbase
node_ripup -->|"implements"| node_routerbase
node_examples -->|"creates"| node_board
node_examples -->|"creates nets"| node_model
node_routerbase -->|"routes on"| node_board
node_routerbase -->|"returns results"| node_model
node_lee -->|"searches"| node_board
node_astar -->|"searches"| node_board
node_astar -->|"scores edges"| node_cost
node_pathfinder -->|"searches"| node_board
node_pathfinder -->|"scores edges"| node_cost
node_ripup -->|"reserves paths"| node_board
node_ripup -->|"scores edges"| node_cost
node_astar -->|"decomposes pins"| node_common
node_lee -->|"decomposes pins"| node_common
node_pathfinder -->|"decomposes pins"| node_common
node_ripup -->|"decomposes pins"| node_common
node_pathfinder -->|"computes metrics"| node_metrics
node_ripup -->|"computes metrics"| node_metrics
node_gui -->|"displays metrics"| node_metrics
node_cli -->|"reports metrics"| node_metrics
node_highspeed -->|"runs refinement"| node_layerassign
node_highspeed -->|"runs refinement"| node_matching
node_layerassign -->|"uses grid"| node_board
node_matching -->|"checks space"| node_board
node_matching -->|"updates paths"| node_model
node_highspeed -->|"compares results"| node_metrics

click node_gui "https://github.com/eason070211/pcb_router/blob/main/gui.py"
click node_cli "https://github.com/eason070211/pcb_router/blob/main/run_demo.py"
click node_highspeed "https://github.com/eason070211/pcb_router/blob/main/run_highspeed_demo.py"
click node_examples "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/examples.py"
click node_routerbase "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/router_base.py"
click node_registry "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/router_base.py"
click node_model "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/model.py"
click node_board "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/board.py"
click node_cost "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/cost.py"
click node_common "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/common.py"
click node_lee "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/lee.py"
click node_astar "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/astar.py"
click node_pathfinder "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/pathfinder.py"
click node_ripup "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/ripup_reroute.py"
click node_layerassign "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/layer_assignment.py"
click node_matching "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/length_matching.py"
click node_metrics "https://github.com/eason070211/pcb_router/blob/main/pcbrouter/metrics.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_gui,node_cli,node_highspeed,node_user toneBlue
class node_lee,node_astar,node_pathfinder,node_ripup toneAmber
class node_examples,node_routerbase,node_registry,node_model,node_board,node_cost,node_common toneMint
class node_layerassign,node_matching,node_metrics toneRose
```

## Components

### User interfaces

- [Tkinter GUI](https://github.com/eason070211/pcb_router/blob/main/gui.py): `gui.py`
- [Demo CLI](https://github.com/eason070211/pcb_router/blob/main/run_demo.py): `run_demo.py`
- [High-speed demo](https://github.com/eason070211/pcb_router/blob/main/run_highspeed_demo.py): `run_highspeed_demo.py`

### Routing algorithms

- [Lee router](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/lee.py): `pcbrouter/algorithms/lee.py`
- [A* router](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/astar.py): `pcbrouter/algorithms/astar.py`
- [PathFinder router](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/pathfinder.py): `pcbrouter/algorithms/pathfinder.py`
- [Rip-up reroute](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/ripup_reroute.py): `pcbrouter/algorithms/ripup_reroute.py`

### Routing core

- [Board examples](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/examples.py): `pcbrouter/examples.py`
- [Router interface](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/router_base.py): `pcbrouter/router_base.py`
- [Algorithm registry](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/router_base.py): `pcbrouter/router_base.py`
- [Routing data model](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/model.py): `pcbrouter/model.py`
- [Layered board grid](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/board.py): `pcbrouter/board.py`
- [Edge costs](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/cost.py): `pcbrouter/cost.py`
- [Multi-pin helpers](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/common.py): `pcbrouter/algorithms/common.py`

### Refinement and evaluation

- [Layer assignment](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/layer_assignment.py): `pcbrouter/algorithms/layer_assignment.py`
- [Serpentine tuner](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/algorithms/length_matching.py): `pcbrouter/algorithms/length_matching.py`
- [Quality metrics](https://github.com/eason070211/pcb_router/blob/main/pcbrouter/metrics.py): `pcbrouter/metrics.py`

### Other components

- **User**

## Connections

- User → Tkinter GUI: opens (evidence: `README.md`)
- User → Demo CLI: runs (evidence: `README.md`)
- User → High-speed demo: runs (evidence: `README.md`)
- Tkinter GUI → Board examples: loads examples (evidence: `gui.py`)
- Demo CLI → Board examples: loads examples (evidence: `run_demo.py`)
- High-speed demo → Board examples: loads board (evidence: `run_highspeed_demo.py`)
- Tkinter GUI → Algorithm registry: selects router (evidence: `gui.py`)
- Demo CLI → Algorithm registry: selects router (evidence: `run_demo.py`)
- High-speed demo → Algorithm registry: selects router (evidence: `run_highspeed_demo.py`)
- Algorithm registry → Router interface: instantiates (evidence: `pcbrouter/router_base.py`)
- Lee router → Router interface: implements (evidence: `pcbrouter/algorithms/lee.py`)
- A* router → Router interface: implements (evidence: `pcbrouter/algorithms/astar.py`)
- PathFinder router → Router interface: implements (evidence: `pcbrouter/algorithms/pathfinder.py`)
- Rip-up reroute → Router interface: implements (evidence: `pcbrouter/algorithms/ripup_reroute.py`)
- Board examples → Layered board grid: creates (evidence: `pcbrouter/examples.py`)
- Board examples → Routing data model: creates nets (evidence: `pcbrouter/examples.py`)
- Router interface → Layered board grid: routes on (evidence: `pcbrouter/router_base.py`)
- Router interface → Routing data model: returns results (evidence: `pcbrouter/router_base.py`)
- Lee router → Layered board grid: searches (evidence: `pcbrouter/algorithms/lee.py`)
- A* router → Layered board grid: searches (evidence: `pcbrouter/algorithms/astar.py`)
- A* router → Edge costs: scores edges (evidence: `pcbrouter/algorithms/astar.py`)
- PathFinder router → Layered board grid: searches (evidence: `pcbrouter/algorithms/pathfinder.py`)
- PathFinder router → Edge costs: scores edges (evidence: `pcbrouter/algorithms/pathfinder.py`)
- Rip-up reroute → Layered board grid: reserves paths (evidence: `pcbrouter/algorithms/ripup_reroute.py`)
- Rip-up reroute → Edge costs: scores edges (evidence: `pcbrouter/algorithms/ripup_reroute.py`)
- A* router → Multi-pin helpers: decomposes pins (evidence: `pcbrouter/algorithms/astar.py`)
- Lee router → Multi-pin helpers: decomposes pins (evidence: `pcbrouter/algorithms/lee.py`)
- PathFinder router → Multi-pin helpers: decomposes pins (evidence: `pcbrouter/algorithms/pathfinder.py`)
- Rip-up reroute → Multi-pin helpers: decomposes pins (evidence: `pcbrouter/algorithms/ripup_reroute.py`)
- PathFinder router → Quality metrics: computes metrics (evidence: `pcbrouter/algorithms/pathfinder.py`)
- Rip-up reroute → Quality metrics: computes metrics (evidence: `pcbrouter/algorithms/ripup_reroute.py`)
- Tkinter GUI → Quality metrics: displays metrics (evidence: `gui.py`)
- Demo CLI → Quality metrics: reports metrics (evidence: `run_demo.py`)
- High-speed demo → Layer assignment: runs refinement (evidence: `run_highspeed_demo.py`)
- High-speed demo → Serpentine tuner: runs refinement (evidence: `run_highspeed_demo.py`)
- Layer assignment → Layered board grid: uses grid (evidence: `pcbrouter/algorithms/layer_assignment.py`)
- Serpentine tuner → Layered board grid: checks space (evidence: `pcbrouter/algorithms/length_matching.py`)
- Serpentine tuner → Routing data model: updates paths (evidence: `pcbrouter/algorithms/length_matching.py`)
- High-speed demo → Quality metrics: compares results (evidence: `run_highspeed_demo.py`)
