Chiprun
Limits & errors
What a run can do, what it costs against your quota, and what to do when something comes back red.
Limits
| Firmware size | 32 MB per ELF |
| Virtual time per run | Up to 60s, board-dependent |
| Maximum wait | 120s before a run reports back as still queued |
| UART output | 64 KB, truncated beyond that |
| Upload slot lifetime | 10 minutes |
| Firmware retention | 7 days, then deleted |
Daily run quota
None of this applies to a live session: the engine runs in your browser, so there is no queue, no upload, no size cap and no quota. The limits below are for queued runs — the ones an agent makes over MCP, and the ones that produce a shareable permalink.
Simulation runs have their own budget, separate from the product-data API quota. It resets at 00:00 UTC, and chiprun_help reports what you have left.
If the free allowance is not enough — a class, a course project, anything real — ask for a larger one. Teaching and coursework requests are granted, there is no billing step, and it takes one sentence. The number below is a starting point, not a wall.
The budget is measured in simulated seconds — how much time the chip experiences, not how many times you press run. A two-second run costs two seconds. It used to be counted per run, which charged a two-second run the same as a thirty-second one.
A run is billed for what it uses, not what it asks for: the full amount is held while the job is queued, then reconciled when it completes. In practice the two are almost always the same, because firmware loops forever and the run ends when the clock runs out rather than when the program does. It differs only for an image that goes quiescent.
| free | 120 simulated seconds/day |
| paid | unlimited |
What a run covers
- CPU execution of your ELF or Intel HEX image.
- USART capture — this is what comes back as output.
- Peripheral registers and interrupt timing matching the physical chip.
- The circuit past the pin: per-net voltages and per-element currents, because the board is solved rather than assumed.
Print over USART0 — that is the output captured in the run. There is no semihosting on AVR to fall back to. A run also reports what the engine declined to model: the Uno's crystal is fitted but its oscillator is not solved, for instance, because the clock comes from the fuse bytes.
Errors
Unknown board
Call chiprun_list_boards. Board keys are exact strings; the list is authoritative and may be ahead of the docs.
Unknown firmware_id
Create an upload slot first, and make sure the PUT to upload_url actually succeeded before running.
Firmware object is empty or was never uploaded
The slot was issued but no bytes arrived. Re-check the PUT — it needs Content-Type: application/octet-stream and the raw ELF as the body.
Firmware is N bytes, over the limit
Strip debug symbols or build in release mode. The cap is checked before the run, not at upload, because a presigned URL cannot enforce size.
Daily simulation quota exhausted
Resets at 00:00 UTC. chiprun_help shows your remaining count.
Run did not finish in time and is still queued
The queue is backed up rather than your firmware being broken. Retry shortly; the job keeps running and its result is not lost.
status: timeout
Not a failure. Your firmware was still executing when the virtual-time cap was reached — normal for anything with a main loop. The UART captured up to that point is returned.
Still stuck? The per-board notes cover the chip-specific traps that account for most confusing output.