SKIP TO CONTENT
STRATA
01 · THE MACHINE
STRATA-16 R0 · 3,912 NAND · 312 FF

A defined state,
and a rule for the
next one.

The architectural state of STRATA-16 is 312 bits: sixteen registers, an instruction register, a program counter, a stack pointer and four flags. Everything else the machine touches is store, and the store is not part of the processor.

Every instruction consumes a defined architectural state and produces a deterministic successor. Nothing is inferred between cycles, and no phase reads a value that the previous phase did not write.

WORD16 BIT
REGISTERS16 × 16
PROGRAM COUNTER12 BIT
ROM2048 W
RAM4 KB
STACK64 W
FLAGSZ N C V
CLOCK1 STEP / BLOCK
// LIVE MACHINE
LOCAL STATECYCLE12,482,186
REGISTER FILE · 16 × 16 FLIP-FLOPSA LIT CELL IS A SET BIT
···12···8···4···0
R0
0000
R1
0000
R2
0000
R3
0000
R4
0000
R5
0000
R6
0000
R7
0000
R8
0000
R9
0000
RA
0000
RB
0000
RC
0000
RD
0000
RE
0000
RF
0000
NETLIST ACTIVITY3/15 BLOCKS · 397 CELLS DRIVEN
  • ADDER144
  • LOGIC UNIT160
  • BARREL SHIFTER256
  • RESULT SELECT192
  • FLAG UNIT52
  • READ PORT A960
  • READ PORT B960
  • REGISTER FILE132
  • COUNTER INCREMENT72
  • COUNTER SOURCE96
  • OPCODE DECODER261
  • MEMORY PORT242
  • STACK POINTER80
  • INSTRUCTION REGISTER64
  • CONTROL MATRIX241

3,912 NAND · 312 FF · 177 CONTROL ASSERTIONS ACROSS THE SET

REGISTER READ0000 0000
DECODE 5→32LDI
ALU0000
REGISTER WRITE
MEMORY PORTIDLE
CONTROL MATRIX4/15
FLAGS· · · ·
ZNCV
PC0x000
IR0x00000000
SP0x0080
FLAGSZNCV
REGISTER FILE · HEX
R00000
R10000
R20000
R30000
R40000
R50000
R60000
R70000
R80000
R90000
RA0000
RB0000
RC0000
RD0000
RE0000
RF0000
EXECUTINGLDI R2, #17
ROM ACCUMULATE · 15 W · 0x000
FETCH
DECODE
EXECUTE
WRITEBACK
COMMIT
CLOCK STOPPED · COMMITMENT D8A1F2147D2F
■ / EXECUTION TRACEBLOCK 21,004,310 · NEWEST FIRST
#BLOCKPCOPOPERANDSRESULT
NO TRANSITIONS COMMITTED SINCE RESET
NO TRANSITIONS COMMITTED SINCE RESET
NO TRANSITIONS COMMITTED SINCE RESET
// DATA PATHCELLS ARE STATE
REGISTER READ0000 0000
DECODE 5→32LDI
ALU0000
REGISTER WRITE
PROGRAM COUNTER0x000
MEMORY PORTIDLE
CONTROL MATRIX4/15
FLAGS· · · ·
ZNCV
DIE FLOORPLANFETCH
REGISTER FILE16×16 FFREAD PORTS1,920 NANDABSTACK POINTER8 FF0x80MEMORY PORT242 NANDADRDATINSTRUCTION REG32 FFDECODER 5→32261 NANDARITHMETIC752 NANDADDLOGICSHIFTSELFLAGS4 FFZNCVCONTROL MATRIX241 NANDPROGRAM COUNTER12 FFPHASEONE PASSFETCHDECODEEXECUTESKIPWRITEBACKCOMMITNETLIST3,912 NANDADDERLOGIC UNITBARREL SHIFTERRESULT SELECTFLAG UNITREAD PORT AREAD PORT BREGISTER FILECOUNTER INCREMENTCOUNTER SOURCEOPCODE DECODERMEMORY PORTSTACK POINTERINSTRUCTION REGISTERCONTROL MATRIXONE PRIMITIVE312 FLIP-FLOPS3,912 NAND CELLSONE EDGE PER BLOCKSTRATA-16 R0 · PLAN VIEW · CELLS ARE STATEFETCH
STORESELECT A BYTE
PAGE
0x000 … 0x0FF · DATA
ADDR0001020304050607REGION
000DATA
008
010
018
020
028
030
038
040
048
050
058
060
068
070
078
080
088
090
098
0A0
0A8
0B0
0B8
0C0
0C8
0D0
0D8
0E0
0E8
0F0
0F8
01.4 · THE NETLIST
15 BLOCKS · 3,912 CELLS

Counted, not
claimed.

The gate budget is a table of structure. Each block states how it decomposes into the primitive, using the cell costs the gate level model actually pays: NOT 1, AND 2, OR 3, XOR 4, MUX2 4, half adder 6, full adder 9.

Two sixteen-to-one read multiplexers dominate the budget at 1,920 cells. That is the price of a two-port register file with no gate but NAND, and it is left visible rather than amortised into a smaller figure.

GATE BUDGETSUM 3,912 NAND
BLOCKLAYERNANDFFBUDGETDERIVATION
ADDERARITHMETIC14416 × full adder (9)
LOGIC UNITARITHMETIC16016 × (AND 2 + OR 3 + XOR 4 + NOT 1)
BARREL SHIFTERARITHMETIC2564 stages × 16 × MUX2 (4)
RESULT SELECTARITHMETIC19216 × 4→1 MUX (3 × MUX2)
FLAG UNITARITHMETIC524Z: 15 × OR (3) + NOT (1) = 46 · N C V: 6 · 4 flip-flops
READ PORT AREGISTERS96016 × 16→1 MUX (15 × MUX2 = 60)
READ PORT BREGISTERS96016 × 16→1 MUX (15 × MUX2 = 60)
REGISTER FILEREGISTERS13225616 × AND4 (6) + 4 × NOT + 16 × AND2 (2) · 16 × 16 flip-flops
COUNTER INCREMENTCONTROL721212 × half adder (6) · 12 flip-flops
COUNTER SOURCECONTROL962 × (12 × MUX2)
OPCODE DECODERCONTROL26132 × AND5 (8) + 5 × NOT
MEMORY PORTMEMORY242address 3→1 MUX 96 · word assembly 64 · port compare 82
STACK POINTERMEMORY8088 × half adder (6) + 8 × MUX2 · 8 flip-flops
INSTRUCTION REGISTERCONTROL643232 × AND2 (2) load enable · 32 flip-flops
CONTROL MATRIXCONTROL24124 control terms × 3 × OR (3) = 216 · 5 phase lines × AND2 = 10 · 15 glue
STATE ELEMENTS312 FLIP-FLOPS
ELEMENTWIDTHFF
REGISTER FILE16 × 16256
INSTRUCTION REGISTER32 bit32
PROGRAM COUNTER12 bit12
STACK POINTER8 bit page offset8
FLAGSZ N C V4
TOTALarchitectural state312
CONTROL POINTS15 LINES · 177 ASSERTIONS
  • IR_LDINSTRUCTION REGISTER LOAD
  • PC_INCPROGRAM COUNTER INCREMENT
  • PC_LOADPROGRAM COUNTER LOAD
  • RAREGISTER READ PORT A
  • RBREGISTER READ PORT B
  • IMM_SELIMMEDIATE SELECT
  • ALU_ENARITHMETIC UNIT ENABLE
  • SH_ENSHIFTER ENABLE
  • FLG_WRFLAG WRITE
  • REG_WRREGISTER WRITE
  • MEM_RDMEMORY READ
  • MEM_WRMEMORY WRITE
  • SP_DECSTACK POINTER DECREMENT
  • SP_INCSTACK POINTER INCREMENT
  • HALT_LHALT LATCH
01.5 · THE STORE
4 KB · BYTE ADDRESSED · 16-BIT ACCESS

An address here
is not anonymous.

The store is byte addressed and accessed sixteen bits at a time, little endian. The top of it is not general: a stack page, a reserved region that reads zero, and two byte-wide ports that are the machine’s entire boundary with anything outside it.

Each port occupies a whole word so that a sixteen-bit access reads or writes a port without masking. The upper byte of a port word reads zero and ignores writes, which is why the reference programs load a port straight into a register.

REGIONFROMTOBYTESNOTE
DATA0x0000xEFF3,840general read/write
STACK0xF000xF7F12864 words, full descending
RESERVED0xF800xFFB124reads 0x00, writes ignored
PORT IN0xFFC0xFFD2host → machine, 1 byte
PORT OUT0xFFE0xFFF2machine → host, 1 byte