PYTHON SYSTEM SIMULATION FOR EARLY HARDWARE TEAMS

SIMULATE YOUR HARDWARE BEFORE THE NEXT RESPIN

Python system simulation for founders and founding engineers building custom electromechanical products. Don't throw away what the bench teaches you. Model your system, then fold real bench data back in so it gets sharper every build.

pip install hardwave

THE WHY

STOP FINDING OUT THE HARD WAY

In hardware, you usually don't know something's wrong until you've already built it: ordered the parts, soldered the board, powered it on, and watched a motor draw twice the current it should. Hardwave moves that moment of truth earlier. You describe your circuit, motor, or control system as code, and Hardwave tells you how it will actually behave before it costs you a shipment or a week.

01

MODEL IT

Describe a resistor, motor, or microcontroller as a typed Python component. No CAD file, no breadboard, no waiting on a supplier.

02

RUN IT

Wire components into a graph and simulate the whole system at once, capturing the voltages, torques, and temperatures it would produce if it already existed.

03

TRUST IT

Once the real hardware exists, feed its telemetry back in. The model earns your trust a little more with every bring-up, not just the first one.

CAPABILITIES

ONE GRAPH FOR YOUR WHOLE PRODUCT

One Python graph models your whole system, and its fidelity grows as bench data arrives, no restructuring, just a solver swap.

TYPED COMPONENTS & PORTS

Define components with typed input/output ports, parameters, and solvers. Wire them into a graph and run steady-state or transient simulation.

1from hardwave.components import Component, ComponentMeta
2from hardwave.ports import input_port, output_port
3
4class Thermostat(Component):
5    meta = ComponentMeta(
6        name="Thermostat", display_name="Thermostat",
7        version="1.0.0", description="Temp → openness",
8        docs="", category="Control",
9    )
10    ports = [
11        input_port("temperature", "Temperature"),
12        output_port("vent_state", "ControlSignal"),
13    ]
14
15    def solve(self, inputs: dict) -> dict:
16        T = inputs["temperature"]
17        return {"vent_state": max(0.0, min(1.0, (T - 20) / 15))}

30+ STDLIB COMPONENTS

Ready-to-use blocks for passive, active, motors, sensors, power, and MCU circuits. Install, wire, and simulate in minutes.

import hardwave.stdlib
from hardwave.stdlib.components.passive import (
    VoltageSource, Resistor,
)
from hardwave.simulation import (
    SimulationGraph, SimulationEngine,
)

g = SimulationGraph()
g.add_component(VoltageSource(
    "vs", param_values={"voltage": 9.0}))
g.add_component(Resistor(
    "r1", param_values={"resistance": 1e3}))
g.connect("vs", "voltage_out", "r1", "voltage")
out = SimulationEngine(g).run(inputs={})
print(out.get_output("r1", "current"))

SIMULATION ENGINE

Run steady-state parameter sweeps or transient time-domain simulation. Serialise graphs to JSON, reload them, and track telemetry across runs.

from hardwave.simulation import (
    SimulationEngine, SimulationConfig,
)
from hardwave.solvers import SimulationDomain

result = SimulationEngine(graph).run(
    inputs={"motor": {
        "voltage": 12.0, "load_torque": 0.2}},
    config=SimulationConfig(
        domain=SimulationDomain.TRANSIENT,
        t_end=1.0, dt=1e-4,
    ),
)
t, omega = result.get_time_series(
    "motor", "angular_velocity")

CALIBRATE FROM BENCH DATA

Swap formula solvers for ones trained on your own telemetry as it arrives, no rewiring the graph. Fidelity compounds with every bring-up instead of resetting each spin.

1import hardwave.premium
2
3hardwave.premium.append_records(model_id, [{
4    "inputs": {"voltage": 12.0, "load_torque": 0.2},
5    "outputs": {"angular_velocity": 180.0},
6}])
7hardwave.premium.train_model(model_id)
8hardwave.premium.attach_model(motor, model_id)

PREMIUM CLOUD COMPONENTS

High-fidelity models served server-side with RSA-signed requests. Your private key never leaves your machine.

1import hardwave.premium
2
3hardwave.premium.configure(
4    organization_id="<your-org-uuid>",
5    secret_key=open("hardwave_private.pem").read(),
6)
7hardwave.premium.sync()

OPEN SOURCE & EXTENSIBLE

MIT-licensed core library with complete control over your simulation stack. Build custom components, composite assemblies, and simulation graphs.

from hardwave.components import (
    CompositeComponent, BuildContext,
    ComponentMeta,
)
from hardwave.ports import input_port, output_port
from hardwave.stdlib.components.passive import Resistor

class VoltageDivider(CompositeComponent):
    meta = ComponentMeta(
        name="VoltageDivider",
        display_name="Divider", version="1.0.0",
        description="R divider", docs="",
        category="Passive",
    )
    ports = [
        input_port("v_in", "DCVoltage"),
        output_port("i_r1", "Current"),
    ]

    def build(self, ctx: BuildContext) -> None:
        ctx.add(Resistor(
            "r1", param_values={"resistance": 1e3}))
        ctx.map_input("v_in", "r1", "voltage")
        ctx.map_output("i_r1", "r1", "current")
GETTING STARTED

UP AND RUNNING IN MINUTES

A code-first simulation framework. Define components in Python, wire them into a graph, and run with no config files or proprietary GUIs.

INSTALL

pip install hardwave

DEFINE

Create components with ports, parameters, and solvers

SIMULATE

Run steady-state sweeps or transient time-domain runs

SCALE

Train solvers on bench telemetry, then share the graph on your org's cloud
USE CASES

BUILT FOR PRE-SEED & SEED HARDWARE TEAMS

You're building the whole electromechanical product yourself, not picking parts from a catalog. Hardwave gives you a way to know it works before you order the next board.

ROBOTICS & ACTUATION

Size a motor and tune a control loop without burning out the real thing to find its limits.

MULTI-DOMAIN SYSTEMS

Combine electrical, mechanical, and thermal components in one graph and catch the interactions that only show up once everything's connected.

EMBEDDED PERIPHERALS

Validate sensor and peripheral behaviour at the signal level before you flash a board, not full firmware execution, but enough to catch bad assumptions early.

Also handles power electronics work. We're building deeper fidelity there as our component library grows.

IS THIS FOR YOU

WHO HARDWAVE IS BUILT FOR

We'd rather tell you now than waste your time later.

GOOD FIT

  • +Technical founder or founding engineer at a pre-seed or seed hardware or robotics company
  • +Building a custom electromechanical product, not just picking parts from a catalog
  • +Comfortable writing Python, or has someone on the team who will
  • +First hardware is on the bench, or parts are on order
  • +Willing to author or own a model of your own system

NOT A FIT YET

  • You want a complete manufacturer / DigiKey parts catalog before trying anything
  • You need cycle-accurate firmware execution or a full HIL replacement today
  • No one on the team will write or maintain any custom components
  • No path yet to a shared product model or a paid plan, the free tier is a fine place to explore
  • You're an enterprise digital-twin program running a long procurement cycle

FREQUENTLY ASKED QUESTIONS

START BEFORE YOUR NEXT RESPIN

Open source and free to start exploring your system in Python. Upgrade to Builder when bench data starts arriving and you want it folded into sharper, cloud-saved models.