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

  1. Find real parts. The request is split into functional blocks and matched against an index of every installed KiCad symbol.
  2. Draft. NVIDIA Nemotron (nemotron-3-nano-omni-30b-a3b-reasoning, via the NVIDIA API) writes the components and nets as JSON.
  3. Complete deterministically. About 30 rules fix the model's routine slips: pin names (SDA → IO21 on an ESP32), power and ground wiring, missing pull-ups and decoupling capacitors, regulator inputs, crystals, status LEDs, short circuits. Every fix is logged.
  4. 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.
  5. 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.

Built With

Share this project:

Updates

Submission history