I. Opcode
Nine bits. 512 rows.
Fifty-one burns. The rest are nops — not growth phantoms. See the ISA sheet.
Inside Architecture · the slice and the word Vol. 32
Architecture
Fetch, IR, ALU, and register operands are 32-bit. Per nibble: two independent 3-input LUTs plus a ripple adder. The opcode ROM names a practical subset. Dark silicon stays in the catalogs.
Tomato started at the transistor — an 8-bit ALU from 3,488 MOSFETs — and kept climbing: gates, slices, boards, a CPU that can speak dozens of foreign ISAs while remaining one physical machine underneath. Most CPUs hide a small ALU behind a conventional encoding. This one flipped it.
The dual-LUT slice is the center. Matching every LUT pair to its own instruction was never the goal. The 512-row ROM burns what programs need today; the rest of the plane waits.
alu_out = adder( f(a, b, c), g(a, b, c), carry_in )
Fig. — The nibbleLUT3 feeds the adder. No mode mux at the end of the slice.
The path · green is done · gold is now
Typical packing for ALU register ops. Low bits are often double-booked as immediate or branch overlay, depending on the mnemonic.
| Field | Bits | Slice | Role |
|---|---|---|---|
| Opcode | 9 | [31:23] | Indexes the 512-row microcode ROM |
| rd | 5 | [22:18] | Destination within the selected bank |
| rA / rB / rC | 5 each | [17:3] | ALU operands; rB also imm-high |
| BANK | 3 | [2:0] | Bank select · COND · jump mode |
Native ALU syntax, conceptual: opcode rd, rA, rB, rC — destination is f + g + cin. Thirty-two GPR times eight banks is 256 addressable registers — enough to wire without widening the datapath.
One central microcode blob is elegant in simulation and miserable on a breadboard. Tomato split decode into small boards with local EEPROMs. They all listen to the same opcode from the IR. Each sits next to the hardware it drives.
Fig. — main.digalu-control, ir-reg, mem-io, mem-bus, pc, shift-mul
Three facts that do not move
I. Opcode
Fifty-one burns. The rest are nops — not growth phantoms. See the ISA sheet.
II. Registers
256 names you can spill to and wire on modular boards. The LUT catalog could name more. We did not.
III. Authority
.dig for logic. KiCad for boards. tomato.v1.csv for the opcode. Exported Verilog is read-only.
Classified · boards 01–08
1 of 8 lots in copper · 1 set aside · 6 still on the screen
Then · lot 01Set aside
01
Historical
The first board: a 270 millimetre transistor-hybrid. Complete on paper. Superceded by the dual-LUT slice — not the copper that went to fab.
Now · lot 07See dispatch
07
Routed · ordered
Dual-LUT 8-bit slice. Two boards on JLCPCB, parts on DigiKey. Zero unrouted nets. This one left the screen.
KiCad 10 · 131 placements · two slices →
The path · green is done · gold is now
Eight lots in order · one has left
Barrel, rotate, the multiply loop. Still a schematic.
03 Memory In designThe bus to the outside. Ribbons not yet cut.
04 Register In designThirty-two names, eight banks. File lives in Digital.
05 PC In designThe counter that walks the ROM. Sequencing, not copper.
06 Bus In designBackplane between slices. Decode stays local.
08 Display In designThe rest of the lamp wall. 07 already carries its own.
ALU sign-off · not the whole CPU
5 / 5
Formal · SymbiYosys
Documented jobs only. Assert and cover live in the verification tree.
476
Directed · golden
Against the unified ALU reference. Not toggle coverage. Not “100% CPU.”
8 MHz
FPGA analysis
Bitstream closed. Board oscillator is 100. The timing we claimed is the timing we closed.