v0.1 · Language and compiler

Hardware, defined in software.

Defining hardware in the age of AI.

Circutri← Personal/07-motor-controller
Variant Bench · Prototype ▾local · synced
07-motor-controller
⌄ boards
MotorControllerBoard.circuit
Netclasses.circuit
⌄ components
CanPhy.circuit
CanPort.circuit
Controller.circuit
DebugHeader.circuit
HBridge.circuit
Logic5V.circuit
MotorPort.circuit
PowerInput.circuit
PowerRegulation.circuit
⌄ modules
MotorController.circuit
⌄ variants
Bench.circuit
Enclosed.circuit
Release.circuit
MotorControllerBoard.circuit×
1import robotics::modules::{MotorController}
2import robotics::netclasses::{HighCurrent, CANDifferential}
3
4/// MotorControllerBoard: one brushed motor on a 24V robot bus, commanded
5/// over CAN.
6board MotorControllerBoard:
7 schematic = MotorController
8
9 requirements {
10 operating_temperature = -20C..70C
11
12 power_in: accepts 20V..28V ← 28V exceeds U3's 26V input
13 power_in: draws {
14 continuous: <= 10A
15 peak: <= 20A
16 }
17 }
18
19 pcb {
20 layers = 4
21 copper = 1oz
22 thickness = 1.6mm
23 }
24
25 netclasses {
26 schematic.motor_power: HighCurrent
27 can_bus: CANDifferential
28 }
Problems 1ChecksOutput
FAIL1 error · 16 checked
partspartexplainagent
› Keep the bus at 28V; make the regulator take it.
circutri check ✗
●U3 tops out at 26V. Swapping it for an LMR36015 (60V).
circutri check ✓
✗ 1 error 16 domains checked · Bench · PrototypeSaved · auto save · circuit

  • Weeks of schematicsEvery wire placed and checked by hand.
  • Datasheets, read by handHundreds of pages, every limit copied out.
  • Ordered. Assembled. Powered on.Then it fails on the bench.
  • One more Missed derating, a wrong footprint, a late night.
AO3400
8.7 Typical Characteristics
Figure 8-1. Efficiency, VOUT = 1.8 V
Figure 8-2. Efficiency, VOUT = 3.3 V
Figure 8-3. Load regulation
Figure 8-4. Line regulation
Figure 8-5. Switching frequency
Figure 8-6. Quiescent current
9
STM32F411
6 Pin Configuration and Functions
NAMENO.I/ODESCRIPTION
PVIN1P
PVIN2I
AVIN3O
EN4P
SS5I
FB6O
AGND7P
PG8I
SW9O
SW10P
PGND11I
VOS12O
3
BME280
BME280Combined humidity and pressure sensor
1 Features
2 Applications
3 Description
PART NUMBERPACKAGEBODY SIZE
Simplified schematic
Efficiency vs output current
1
TPS62133
TPS621333-A step-down converter in 3 × 3 mm QFN package
1 Features
2 Applications
3 Description
PART NUMBERPACKAGEBODY SIZE
Simplified schematic
Efficiency vs output current
1
USBLC6-2
11 Mechanical, Packaging, and Orderable Information
32
AP2112K
8.7 Typical Characteristics
Figure 8-1. Efficiency, VOUT = 1.8 V
Figure 8-2. Efficiency, VOUT = 3.3 V
Figure 8-3. Load regulation
Figure 8-4. Line regulation
Figure 8-5. Switching frequency
Figure 8-6. Quiescent current
9
LIS3DH
6 Pin Configuration and Functions
NAMENO.I/ODESCRIPTION
PVIN1P
PVIN2I
AVIN3O
EN4P
SS5I
FB6O
AGND7P
PG8I
SW9O
SW10P
PGND11I
VOS12O
3
RefValueMakerMPNQty
C14.7µFDiodes56631-7312
C222µHYageo76024-5217
L3LDO 3V3Diodes53388-4378
J410kΩOnsemi14683-3562
D522µHDiodes96991-5911
D6MCUST24130-8626
D722µHDiodes18622-6975
D8USB-CTI80602-6711
D9USB-CDiodes24634-9837
U10LDO 3V3Bourns31611-5137
D11MCUST57687-8955
R12MCUVishay59936-6231
R1310kΩOnsemi39091-8976
C14USB-CWürth52807-9565
D15LDO 3V3ST63444-2941
J16TVSWürth30044-9535
U1722µHSamsung68904-7022
L18MCUYageo69304-8718
J19TVSDiodes85706-1721
J204.7µFST19104-4248
D21100nFST17579-9661
J22LDO 3V3ST78874-7996
D2310kΩYageo96134-1728
U244.7µFOnsemi63304-1322
C25MCUVishay?4
L26TVSYageo33531-7495
U27USB-CWürth35861-3654
J28MCUVishay43693-3251
R29100nFSamsung22886-7328
C30MCUDiodes45912-7228
C31USB-CBourns76965-9518
C32USB-CYageo83151-2862
U33TVSDiodes90415-4906
R344.7µFMurata?7
D35USB-CST61368-7835
C36USB-CMurata56461-3733
C37MCUSamsung78544-2427
L38LDO 3V3Vishay80386-2765
D39100nFVishay73265-6017
J40LDO 3V3Yageo28944-1194
L4122µHOnsemi76701-4362
C42TVSSamsung56827-6476
R4310kΩWürth73663-8853
C44LDO 3V3Murata41625-9313
D45USB-CSamsung77877-9278
D46TVSWürth63267-1463
L47TVSST58148-6813
D48USB-CBourns23407-5484
D4910kΩOnsemi55748-7955
R504.7µFOnsemi73087-6451
C51TVSVishay61442-3596
R5210kΩMurata93207-8548
D5310kΩTI31331-8502
C544.7µFYageo84776-9675
J55LDO 3V3Yageo74872-7017
J56100nFSamsung97538-4355
L5710kΩYageo71533-4348
J584.7µFDiodes74752-9025
J5910kΩYageo55329-8285
R6010kΩSamsung41497-2382
One more .

MeetCircutri

Write the board as code. A compiler checks it against real parts.

Command line

Today

One command line.

  • Your board is filesPlain .circuit text, in your own Git.
  • circutri checkReal part data, every rail and pin. Caught before it's ordered.
  • circutri buildCompiled like software, the same bytes every time.
  • circutri exportNextGerbers, versioned with the code.
~/iot-sensor-nodezsh
~/iot-sensor-node $

Your AI

Today

Bring your own AI.

  • Works with Claude Code, Codex, Gemini CLI, or the agent you already use.
  • Through Circutri's MCP serverYour agent drafts with the same commands you use.
  • Light on tokensIt gets what failed and why, nothing else.
  • You stay in chargeEvery change is a diff you approve, then the check passes.
~/iot-sensor-nodezsh
~/iot-sensor-node $ tree -I 'build|registry'
.
├── Circutri.toml
├── Circutri.lock
├── boards
│ └── SensorNode.circuit
├── components
│ ├── BME280.circuit
│ ├── BatteryPack.circuit
│ ├── Charger.circuit
│ ├── DebugHeader.circuit
│ ├── PowerPath.circuit
│ ├── PowerRegulation.circuit
│ ├── STM32F411.circuit
│ ├── StatusIndicator.circuit
│ └── UsbPower.circuit
├── modules
│ └── MainBoard.circuit
└── variants
└── SmartHomeDefault.circuit
4 directories, 14 files
~/iot-sensor-node $ circutri check
circutri loading workspace `02-iot-sensor-node` (edition 1.0, 12 sources)
circutri warning[CIR-SCH-2003]: 57 stresses on 42 elements of `SensorNode/SmartHomeDefault` were not judged
--> boards/SensorNode.circuit:3:17
|
3 | schematic = MainBoard
| ^^^^^^^^^ analysed here
|
= note: each element and what it was not judged for is listed under `gaps:` in the summary
= help: state what its part leaves out, or judge the stress by hand against the datasheet
circutri ✓ check passed: 0 errors, 1 warning in 0.12s
checked: syntax, imports, registry, part library, definitions, buses, linking, zipping, resolution, footprints, symbols, connectivity, power, current, variant, requirements
~/iot-sensor-node $ circutri build
circutri loading workspace `02-iot-sensor-node` (edition 1.0, 12 sources)
circutri warning[CIR-SCH-2003]: 57 stresses on 42 elements of `SensorNode/SmartHomeDefault` were not judged
--> boards/SensorNode.circuit:3:17
|
3 | schematic = MainBoard
| ^^^^^^^^^ analysed here
|
= note: each element and what it was not judged for is listed under `gaps:` in the summary
= help: state what its part leaves out, or judge the stress by hand against the datasheet
circutri wrote build/SensorNode/SmartHomeDefault/SensorNode.design.json
circutri wrote build/SensorNode/SmartHomeDefault/build-manifest.json
circutri ✓ build passed: 0 errors, 1 warning in 0.13s
checked: syntax, imports, registry, part library, definitions, buses, linking, zipping, resolution, footprints, symbols, connectivity, power, current, variant, requirements
~/iot-sensor-node $ circutri export
circutri loading workspace `02-iot-sensor-node` (edition 1.0, 12 sources)
circutri wrote export/SensorNode/SmartHomeDefault/F_Cu.gbr
circutri wrote export/SensorNode/SmartHomeDefault/B_Cu.gbr
circutri wrote export/SensorNode/SmartHomeDefault/F_Mask.gbr
circutri wrote export/SensorNode/SmartHomeDefault/B_Mask.gbr
circutri wrote export/SensorNode/SmartHomeDefault/F_Silkscreen.gbr
circutri wrote export/SensorNode/SmartHomeDefault/Edge_Cuts.gbr
circutri wrote export/SensorNode/SmartHomeDefault/SensorNode.drl
circutri ✓ export passed: 6 layers, 1 drill file in 0.21s
~/iot-sensor-node $

Everywhere

Next

Runs natively on

  • macOS, Windows, LinuxNative on your desk, with each system's own controls.
  • iPadReview a board wherever you are.
  • The webNothing to install: the same files, the same checks.

Inside the app

Today

Checked against real parts.

  • Every rail checkedFollowed from its source through every load, at its worst case.
  • The schematic, drawn from the codeChange a line and the drawing follows.
  • Parts that carry their datasheet2,000+ and growing, each figure traced to its page.
Raise the load yourself →
Circutri← Personal/07-motor-controller
Variant Bench · Prototype ▾local · synced
07-motor-controller
⌄ boards
MotorControllerBoard.circuit
Netclasses.circuit
⌄ components
CanPhy.circuit
CanPort.circuit
Controller.circuit
DebugHeader.circuit
HBridge.circuit
Logic5V.circuit
MotorPort.circuit
PowerInput.circuit
PowerRegulation.circuit
⌄ modules
MotorController.circuit
⌄ variants
Bench.circuit
Enclosed.circuit
Release.circuit
MotorControllerBoard.circuit×
1import robotics::modules::{MotorController}
2import robotics::netclasses::{HighCurrent, CANDifferential}
3
4/// MotorControllerBoard: one brushed motor on a 24V robot bus, commanded
5/// over CAN.
6board MotorControllerBoard:
7 schematic = MotorController
8
9 requirements {
10 operating_temperature = -20C..70C
11
12 power_in: accepts 20V..28V ← 28V exceeds U3's 26V input
13 power_in: draws {
14 continuous: <= 10A
15 peak: <= 20A
16 }
17 }
18
19 pcb {
20 layers = 4
21 copper = 1oz
22 thickness = 1.6mm
23 }
24
25 netclasses {
26 schematic.motor_power: HighCurrent
27 can_bus: CANDifferential
28 }
Failcircutri checkdebug.vtref: 1mA → 500mA4 errors · 1 warning
CIR-PWR-1010components/BME280.circuit:19rail `climate_sensor.c_vdd.p1` carries ≈590.29mA at its peak, more than the 480mA its source may deliver
CIR-PWR-1010components/UsbPower.circuit:10rail `usb.vbus` carries ≈591.92mA at its peak, more than the 400mA its source may deliver
CIR-PWR-1026components/PowerRegulation.circuit:5`power_tree.ldo` reaches 225C at a 40C ambient, above its 150C junction rating
CIR-PWR-1034components/PowerPath.circuit:7`power_path.mux` output rail has 16µF, below the ≈22.87µF its switchover needs
CIR-SCH-2003boards/SensorNode.circuit:357 stresses on 42 elements of `SensorNode/SmartHomeDefault` were not judged
power_tree.ldo.VOUT · peak load600mA × 0.8 = 480mA allowed
  • debug.conn.VTREF500mA
  • controller.mcu34.5mA
  • led_indicators[0].r_limit19.8mA
  • led_indicators[2].r_limit17.5mA
  • 4 more loads18.5mA
16 domains checked · unchecked: formatting
Problems 1ChecksOutput
FAIL1 error · 16 checked
partspartexplainagent
Search parts, makers, packages
LMR36015SwitchingRegulator
DRV8701MotorDriver
CSD18540Q5BNMosfet
TCAN1042CanTransceiver
STM32G431Microcontroller
WSL2512ShuntResistor
EEU-FR1H221Capacitor
CL31B106KBHNNNECapacitor
SRP7028A 4R7MInductor
✗ 1 error 16 domains checked · Bench · PrototypeSaved · auto save · circuit

Standards

Next

Meet your standards.

  • Switch the variantBench, enclosed, release: one click.
  • Re-judged at onceEvery standard checked against the new variant.
  • Caught. Fixed. Passed.RoHS failed; the agent fixed it.
  • One design, every variantFor robots, sensors, devices, whatever you build.
Circutri — 07-motor-controller
app.circutri.com/p/07-motor-controller
Circutri← Personal/07-motor-controller
Variant Bench · Prototype ▾local · synced
07-motor-controller
⌄ boards
MotorControllerBoard.circuit
Netclasses.circuit
⌄ components
CanPhy.circuit
CanPort.circuit
Controller.circuit
DebugHeader.circuit
HBridge.circuit
Logic5V.circuit
MotorPort.circuit
PowerInput.circuit
PowerRegulation.circuit
⌄ modules
MotorController.circuit
⌄ variants
Bench.circuit
Enclosed.circuit
Release.circuit
Board · MotorControllerBoard×
[ IPC-2152 · track width ]PASS
[ Derating · 80% ]PASS
[ IPC-2221 · creepage ]PASS
Problems 0ChecksOutput
PASS0 errors · 16 checked
partspartexplainagent
Search parts, makers, packages
LMR36015SwitchingRegulator
DRV8701MotorDriver
CSD18540Q5BNMosfet
TCAN1042CanTransceiver
STM32G431Microcontroller
WSL2512ShuntResistor
EEU-FR1H221Capacitor
CL31B106KBHNNNECapacitor
SRP7028A 4R7MInductor
✓ 0 errors 16 domains checked · Bench · PrototypeSaved · auto save · circuit
Meet your standards.

Workflows

The whole loop runs from one command line.

The same commands serve you, your agent and your CI. Checking and building never touch the network.

Start a project

Start from a workspace, not a blank canvas

One command lays out the manifest, the board and the module folders. Your agent drafts the first module in .circuit; you read it, change it and keep it in Git like any other source.

$circutri new iot-sensor-node

No silent success

Any error exits non-zero and writes no artifact. An unknown field is an error, never ignored.

Stable error codes

Every finding has a CIR code. A released code never changes meaning and is never reused.

Byte-identical output

Same sources, same registry, same toolchain: the same bytes on every platform.

Locked and offline

A locked workspace never resolves differently and compiles with no network at all.

Verified part data

A part is usable only after its pins, classes and limits pass verification.

Honest results

PASS, FAIL or DEFERRED, and every run lists the domains it did not check.

Circutri

Built for the age of AI.

Blog

Why PCB design needs a new language

I tried schematic tools and code-first tools. Both kept losing the thing I cared about most, and that is why Circutri is a language of its own.