Inspiration
Ask a chatbot for a circuit and you get a confident answer. Ask it for a schematic and things fall apart: invented pin names, a 3.3 V sensor wired to 5 V, I²C lines with no pull-up resistors, parts listed but never connected. For hardware, "looks plausible" is not good enough — a wrong wire is a dead board.
We wanted the speed of describing a circuit in plain English and the trust of an engineering tool. The idea behind CircuitProof is simple: let the AI propose, but never let it be the judge. Nemotron drafts the design; deterministic code and KiCad's own electrical rules check (ERC) decide whether it is acceptable.
What it does
You type a request such as:
ESP32-WROOM-32 with an MPU-6050 IMU on I2C, a push button and a status LED, powered from 5 V via an AMS1117-3.3
CircuitProof returns a native KiCad schematic (.kicad_sch) and an audit report. Every part and pin comes from the 21,674 symbols in the installed KiCad libraries, and every design has passed a rule referee and KiCad ERC before it is accepted. A web studio shows each stage live — planning blocks → searching the KiCad library → designing the netlist → checking → writing the schematic.
How we built it
Pipeline
- Find real parts. The request is split into functional blocks and matched against an index of every installed KiCad symbol.
- Draft. NVIDIA Nemotron (
nemotron-3-nano-omni-30b-a3b-reasoning, via the NVIDIA API) writes the components and nets as JSON. - Complete deterministically. About 30 rules fix the model's routine slips: pin names (
SDA→IO21on an ESP32), power and ground wiring, missing pull-ups and decoupling capacitors, regulator inputs, crystals, status LEDs, short circuits. Every fix is logged. - Verify twice. A rule referee checks supply ranges, grounds, decoupling, I²C and SPI; then KiCad's ERC runs on a drawn copy of the schematic.
- Repair loop. Remaining problems go back to Nemotron as exact instructions, for up to 5 rounds within a time budget.
Some of the engineering rules, for example the I²C pull-up must keep a logic low below $V_{OL}$ at the bus's sink current:
$$ R_{\text{pull-up}} \;\ge\; \frac{V_{DD} - V_{OL}}{I_{OL}} \;=\; \frac{3.3\,\text{V} - 0.4\,\text{V}}{3\,\text{mA}} \approx 0.97\,\text{k}\Omega $$
so the referee accepts pull-ups in the $1\text{–}10\,\text{k}\Omega$ range, and the planner adds $4.7\,\text{k}\Omega$ when they are missing. Decoupling is counted per physical supply pin: a rail feeding $n$ supply pins needs $n$ capacitors of $100\,\text{nF}$.
Stack: Python, FastAPI (background jobs with live progress), NVIDIA Nemotron through an OpenAI-compatible client (the same client works with any OpenAI-compatible endpoint), KiCad 9 libraries and kicad-cli, SQLite for part data, and a plain HTML/JS studio.
Challenges we ran into
- Speed. Our first version took 396 s for a simple board, with no feedback while waiting. Measuring every stage showed the model's reasoning mode was the cost. With reasoning off, per-call timeouts, a 180 s budget, compact repair rounds and a background job API, the same board takes 22–44 s: $$\frac{396\ \text{s}}{22\text{–}44\ \text{s}} \approx 9\text{–}18\times \text{ faster}$$
- An unreliable endpoint. Requests to the free API sometimes hung for minutes. Hedged requests (if there is no answer after 35 s, send a duplicate and take whichever answers first) turned unbounded waits into bounded ones.
- The model repeats its mistakes. A smaller model often ignored feedback and made the same error for every repair round. Rather than prompting harder, we moved the recurring fixes into deterministic code.
- "0 ERC errors" can still be wrong. We found designs that passed KiCad ERC with resistors and LEDs connected to nothing (unused pins get no-connect markers), and an OLED whose I²C lines were wired to its charge-pump pins. We added our own dangling-part check and model the common SSD1306 display as the 4-pin module people actually buy.
- Multi-unit symbols. A dual op-amp is drawn as three units in KiCad; we were only placing the first, so its power pins never appeared. Every unit is now placed and wired.
Accomplishments we're proud of
- Accepted designs come out with 0 KiCad ERC errors: microcontroller boards with sensors, displays, flash, CAN, real-time clocks and regulators.
- Every automatic fix and every finding is reported. Missing datasheet data shows as NOT EVALUATED, never as a silent pass.
What we learned
- Verification beats prompting. The biggest quality gains came from checks and deterministic repairs around the model, not from a better prompt.
- Measure before optimising. Timing logs on every stage showed exactly where the minutes went.
- Be honest about what a check proves. Passing the electrical rules is not the same as doing what was asked: in testing, a "microphone preamp" came out as a comparator with 0 errors. We document that limit instead of hiding it.
What's next
- Verified datasheet data for more parts, so voltage checks cover more of each design.
- New rules for crystal load capacitance, reset circuits, MOSFET gate drive and USB.
- Multi-sheet schematics for larger designs.
- A check that a design matches the intent of the request, not only the electrical rules.
Log in or sign up for Devpost to join the conversation.