Simten
Works with Claude + MCP

Describe hardware. Claude builds it. Test it like software.

A TypeScript HDL where the whole npm ecosystem is your testbench — drive a circuit with real packets, real firmware, any library you can npm install, and watch it run cycle-by-cycle. Synthesizable to Verilog.

$ claude mcp add simten npx @simten/mcp
Synthesizable Verilog·Runs on ULX3S·Cycle-accurate·Yosys + nextpnr

Scale to real-world complexity

The framework already runs heavy systems in the browser — for example, a 5-stage pipelined RISC-V CPU executing GCC-compiled C, C++, and Rust, or an IEEE 802.3 Ethernet parser turning wire bytes into protocol fields.

Pipeline
FetchIF
0x00000010Load immediate: set a0 = 55
DecodeID
0x0000000cJump: unconditionally jump to 0xc
ComputeEX
0x00000000Add upper immediate to PC: sp = PC + (0x20 << 12)
MemoryMEM
0x00000010Load immediate: set a0 = 55
SaveWB
0x0000000cJump: unconditionally jump to 0xc

Add upper immediate to PC: sp = PC + (0x20 << 12). Used to compute addresses relative to the current instruction.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Bare-metal Rust — no OS, no stdlib.
// This runs directly on the CPU hardware.
// When done, register a0 = 55 (0x00000037).
#![no_std]
#![no_main]

use core::panic::PanicInfo;

#[panic_handler]
fn panic(_: &PanicInfo) -> ! { loop {} }

#[no_mangle]
pub extern "C" fn main() -> i32 {
    let mut a: i32 = 0;
    let mut b: i32 = 1;
    for _ in 0..10 {
Disassembly
<_start>:
00000000auipc sp,0x20EX
00000004mv sp,sp
00000008jal 10 <main>
0000000cj c <_start+0xc>IDWB
<main>:
00000010li a0,55IFMEM
00000014ret
RV32I CPU debuggerOpen →
incoming frameIPV4 UNICAST
dst mac00 1a 2b 3c 4d 5e
src macde ad be ef ca fe
etype08 00
payload42 42 42 42 …
fcs3d 29 e8 30
0 / 64 bytes0 cycles
dst_mac??:??:??:??:??:??
src_mac??:??:??:??:??:??
ethertype0x????
crc32...
Ethernet ParserMAC RX pipeline · Layer 2 · IEEE 802.3
Ethernet parser

Same engine, just more fun.

Toggle inputs and play. Same simulator, same Verilog export — Snake also runs on a real ULX3S board.

Compiling…
Pong
~80 nodes · zero software
Read post →
Compiling…
Snake
~100 nodes · zero software
Read post →

Export to Verilog

Synthesizable primitives export to structural Verilog. The RV32I CPU and Snake both flash to a ULX3S; the CPU is cross-validated against iverilog cycle-by-cycle. Running it from a clone needs the synth / verify / compile services started locally (Docker; pnpm dev:synth, dev:verifier, dev:compiler). Setup & how it works →

circuit.ts
const HalfAdder = circuit('HalfAdder', {
  inputs: { a: bit, b: bit },
  outputs: { sum: bit, carry: bit },
  nodes: { xor1: Xor, and1: And },
  connect: ({ inputs, outputs, nodes: { xor1, and1 } }) => [
    inputs.a.to(xor1.a, and1.a),
    inputs.b.to(xor1.b, and1.b),
    xor1.out.to(outputs.sum),
    and1.out.to(outputs.carry),
  ],
});
HalfAdder.v✓ verified against Icarus Verilog
`timescale 1ns / 1ps

module HalfAdder (
  input a,
  input b,
  output sum,
  output carry
);

  wire w_xor1_out;
  wire w_and1_out;

  assign w_xor1_out = a ^ b;
  assign w_and1_out = a & b;

  assign sum = w_xor1_out;
  assign carry = w_and1_out;

endmodule

Long-form deep dives

Not diagrams. Live circuits verified against real specifications.

Or open the editor and start from scratch.