Technology

Timing on the module. Everything else in software.

A Rust daemon on Linux, Zephyr firmware on every card, a backplane with a shared clock and hardware triggers, and one spec that drives the daemon, the client and the agent tools.

Architecture

Three tiers. One clock.
Zero host in the timing path.

Tier 1

Client

your laptop · CI runner · agent
Python hil APIpytest pluginhil CLIhil-mcp serverbench page & timelineJUnit / coverage

Tests name DUT signals through a hil.toml wiring map, never slot numbers. The client, MCP tools and page build themselves from the bench's capability list at runtime.

Tier 2

benchd

Rust · Linux main board
capability registrylease & safe statewiring mapplan compilerrun manager · one t0agent grantsaudit logParquet run storeVCD exporttraceability

Compiles a plan into schedules and trigger rules, assigns trigger lines automatically when a condition and its action sit on different modules, loads every module, then starts them together.

Tier 3

Modules

Zephyr + modkit · one MCU per card
GPIO
UART
CAN-FD
PSU
BLE
yours

modkit is a C11 library with no heap: module state machine, timebase, scheduler, trigger rules, event ring, heartbeat and safe state. The same code runs on the MCU and in the virtual bench.

How fast can one module react to another?

Log scale. Shorter is faster.

10 ns100 ns1 µs10 µs100 µs1 ms10 ms
Through the host (Linux + USB)
1–5 ms
Mode 2 · scheduled on module clocks
~1 µs
Mode 3 · trigger rule, interrupt
0.3–0.83 µs
Mode 3 · pure hardware path
50–100 ns

What's new here

Ideas from industrial HIL,
rebuilt for software teams.

The plan is data, not code

A test becomes a plan: schedules and rules, checked before it runs. benchd loads every module completely, with no clock involved, then sends one start(t0). The bench records; the client judges, so old runs can be judged again.

Wired-OR trigger bus

Cross-module reactions in hardware. The compiler picks the line; the host assigns ownership and checks for stuck lines at arm time.

One spec, everything derived

A module class is one YAML file. Commands, client attributes, MCP tools and viewer waveforms all come from it. Guard tests keep the engine free of class names.

Agents get grants, not root

Signals bound at request time, risk classes (observe, stimulate, fault, power), action budgets and expiry, tied to the lease of the person who approved them.

Virtual bench from day one

The real firmware library runs as simulated modules on a shared timebase with a simulated trigger backplane. CI and demos work before the hardware does.

Open module spec

Pinout, protocol, EEPROM format and reference firmware are open. Third-party cards load at runtime from their own spec.

Traceable by default

Every run stores its plan, its events as Parquet and a manifest with a comparable key. Requirements map to tests and runs on the coverage page and in JUnit, and any run exports to VCD for GTKWave or Surfer.

Module lineup

Fixed-function cards.
Each one earns its slot.

The design rule: every module type holds hardware the others lack.

0x01on hardware

GPIO

1.8 / 3.3 / 5 / 12 V, edge timestamps, pulses, PWM, pulls and high-Z.

0x02simulated

UART / RS-485

TTL, RS-232 and RS-485, per-byte timestamps, pattern match, framing and parity faults.

0x03specified

CAN-FD

Switchable termination, filters, and bus faults by corrupting chosen frame IDs.

0x04simulated

Metered PSU

Setpoint, current limit, µA meter and charge. Dropout and sag faults, alert rules.

0x05simulated

BLE peer

Central or peripheral peer for the DUT. Link loss, packet loss, reconnect time.

0x80third-party

Relay card

An example third-party class, loaded at runtime from its own spec file.

v2–v3roadmap

Next on the roadmap

LIN, analog I/O, relay matrix, I²C/SPI target emulation, logic capture on the shared timeline.

Next Use cases→ Where the bench fits, with real test code.

Design partner program

Bring your firmware.
We'll bring the loop.

We're looking for 5–10 firmware teams who ship at least monthly and test on hardware by hand or with a DIY rig today. Paid pilots, early hardware and a direct line to the people building it.

Talk to us →