# embedded-purdue/irltspice architecture

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

- Interactive diagram: https://gitdiagram.com/embedded-purdue/irltspice
- Repository: https://github.com/embedded-purdue/irltspice

## Overview

IRLTSPICE turns a circuit design into a physical analog circuit: the PC-side IRLC software parses and compiles a netlist, checks it against board constraints, routes it across physical components, and can emit programming data for the board. Firmware receives configuration and applies it to the hardware; shared framing and ring-buffer code support motherboard communications. The README documents the product workflow and capabilities, but excerpts do not expose every compiler-stage call or firmware protocol link, so uncertain connections are omitted or marked unverified.

Main entry points: [`software/irlc/include/core/compiler.hpp`](https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/include/core/compiler.hpp) (Compiler Workflow), [`firmware/src/legacy/main.c`](https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/legacy/main.c) (Legacy Config Loop), [`software/irlc/src/core/parse_spice.cpp`](https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/parse_spice.cpp) (SPICE Parser), [`software/irlc/src/core/route.cpp`](https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/route.cpp) (Circuit Routing)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_pc["PC Circuit Compiler"]
  node_cli["IRLC Entry<br/>[main.cpp]"]
  node_compiler["Compiler Workflow<br/>[compiler.hpp]"]
  node_spice["SPICE Parser<br/>[parse_spice.cpp]"]
  node_eeschema["Eeschema Parser<br/>[parse_eechema.cpp]"]
  node_netlist["Circuit Netlist<br/>[netlist.hpp]"]
  node_numbers["Value Handling<br/>[numbers.cpp]"]
  node_verification["Circuit Verification<br/>[verify.cpp]"]
  node_board["Board Model<br/>[board_info.cpp]"]
  node_routing["Circuit Routing<br/>[route.cpp]"]
  node_emitter["Board Programming<br/>[emit.cpp]"]
end

subgraph group_shared["Shared Communications"]
  node_frame["Packet Framing<br/>[framing.c]"]
  node_ring["Ring Buffer<br/>[ring_buffer.c]"]
end

subgraph group_legacy["Legacy Board Firmware"]
  node_legacy["Legacy Config Loop<br/>[main.c]"]
  node_pots["Potentiometer Control<br/>[bruz200.c]"]
  node_singlecell["Single Cell Control<br/>[single_cell.c]"]
end

subgraph group_motherboard["Motherboard Firmware"]
  node_mothermain["Motherboard Entry<br/>[main.c]"]
  node_commands["Command Receiver<br/>[recv_commands.c]"]
end

node_designer(("Circuit Designer"))
node_design["Circuit Design"]
node_boardhw["IRLTSPICE Board"]

node_designer -->|"designs circuit"| node_design
node_design -.->|"supplies input"| node_cli
node_cli -->|"invokes"| node_compiler
node_compiler -.->|"parses SPICE"| node_spice
node_compiler -.->|"parses EDA"| node_eeschema
node_spice -->|"builds netlist"| node_netlist
node_spice -->|"parses values"| node_numbers
node_compiler -.->|"checks circuit"| node_verification
node_compiler -.->|"routes design"| node_routing
node_routing -->|"uses board model"| node_board
node_routing -->|"uses rules"| node_verification
node_compiler -.->|"emits programming"| node_emitter
node_emitter -.->|"programs board"| node_boardhw
node_legacy -->|"configures pots"| node_pots
node_legacy -->|"uses cell control"| node_singlecell
node_mothermain -->|"receives commands"| node_commands
node_commands -->|"parses frames"| node_frame
node_frame -->|"reads buffer"| node_ring
node_legacy -->|"applies configuration"| node_boardhw
node_mothermain -.->|"controls board"| node_boardhw

click node_cli "https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/main.cpp"
click node_compiler "https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/include/core/compiler.hpp"
click node_spice "https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/parse_spice.cpp"
click node_eeschema "https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/parse_eechema.cpp"
click node_netlist "https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/include/core/netlist.hpp"
click node_numbers "https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/numbers.cpp"
click node_verification "https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/verify.cpp"
click node_board "https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/board_info.cpp"
click node_routing "https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/route.cpp"
click node_emitter "https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/emit.cpp"
click node_frame "https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/common/framing.c"
click node_ring "https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/common/ring_buffer.c"
click node_legacy "https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/legacy/main.c"
click node_pots "https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/legacy/bruz200.c"
click node_singlecell "https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/legacy/single_cell.c"
click node_mothermain "https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/motherboard/main.c"
click node_commands "https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/motherboard/recv_commands.c"

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_cli,node_compiler,node_spice,node_eeschema,node_netlist,node_numbers,node_verification,node_board,node_routing,node_emitter toneBlue
class node_frame,node_ring toneAmber
class node_legacy,node_pots,node_singlecell toneMint
class node_mothermain,node_commands toneRose
class node_designer,node_design,node_boardhw toneIndigo
```

## Components

### PC Circuit Compiler

- [IRLC Entry](https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/main.cpp): `software/irlc/src/main.cpp`
- [Compiler Workflow](https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/include/core/compiler.hpp): `software/irlc/include/core/compiler.hpp`
- [SPICE Parser](https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/parse_spice.cpp): `software/irlc/src/core/parse_spice.cpp`
- [Eeschema Parser](https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/parse_eechema.cpp): `software/irlc/src/core/parse_eechema.cpp`
- [Circuit Netlist](https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/include/core/netlist.hpp): `software/irlc/include/core/netlist.hpp`
- [Value Handling](https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/numbers.cpp): `software/irlc/src/core/numbers.cpp`
- [Circuit Verification](https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/verify.cpp): `software/irlc/src/core/verify.cpp`
- [Board Model](https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/board_info.cpp): `software/irlc/src/core/board_info.cpp`
- [Circuit Routing](https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/route.cpp): `software/irlc/src/core/route.cpp`
- [Board Programming](https://github.com/embedded-purdue/irltspice/blob/main/software/irlc/src/core/emit.cpp): `software/irlc/src/core/emit.cpp`

### Shared Communications

- [Packet Framing](https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/common/framing.c): `firmware/src/common/framing.c`
- [Ring Buffer](https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/common/ring_buffer.c): `firmware/src/common/ring_buffer.c`

### Legacy Board Firmware

- [Legacy Config Loop](https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/legacy/main.c): `firmware/src/legacy/main.c`
- [Potentiometer Control](https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/legacy/bruz200.c): `firmware/src/legacy/bruz200.c`
- [Single Cell Control](https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/legacy/single_cell.c): `firmware/src/legacy/single_cell.c`

### Motherboard Firmware

- [Motherboard Entry](https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/motherboard/main.c): `firmware/src/motherboard/main.c`
- [Command Receiver](https://github.com/embedded-purdue/irltspice/blob/main/firmware/src/motherboard/recv_commands.c): `firmware/src/motherboard/recv_commands.c`

### Other components

- **Circuit Designer**
- **Circuit Design**
- **IRLTSPICE Board**

## Connections

- Circuit Designer → Circuit Design: designs circuit (evidence: `README.md`)
- Circuit Design → IRLC Entry: supplies input
- IRLC Entry → Compiler Workflow: invokes (evidence: `software/irlc/src/main.cpp`)
- Compiler Workflow → SPICE Parser: parses SPICE
- Compiler Workflow → Eeschema Parser: parses EDA
- SPICE Parser → Circuit Netlist: builds netlist (evidence: `software/irlc/src/core/parse_spice.cpp`)
- SPICE Parser → Value Handling: parses values (evidence: `software/irlc/src/core/parse_spice.cpp`)
- Compiler Workflow → Circuit Verification: checks circuit
- Compiler Workflow → Circuit Routing: routes design (evidence: `software/irlc/src/core/route.cpp`)
- Circuit Routing → Board Model: uses board model (evidence: `software/irlc/src/core/route.cpp`)
- Circuit Routing → Circuit Verification: uses rules (evidence: `software/irlc/src/core/route.cpp`)
- Compiler Workflow → Board Programming: emits programming
- Board Programming → IRLTSPICE Board: programs board
- Legacy Config Loop → Potentiometer Control: configures pots (evidence: `firmware/src/legacy/main.c`)
- Legacy Config Loop → Single Cell Control: uses cell control (evidence: `firmware/src/legacy/main.c`)
- Motherboard Entry → Command Receiver: receives commands (evidence: `firmware/src/motherboard/main.c`)
- Command Receiver → Packet Framing: parses frames (evidence: `firmware/src/motherboard/recv_commands.c`)
- Packet Framing → Ring Buffer: reads buffer (evidence: `firmware/src/common/framing.c`)
- Legacy Config Loop → IRLTSPICE Board: applies configuration (evidence: `firmware/src/legacy/main.c`)
- Motherboard Entry → IRLTSPICE Board: controls board
