CharlesCNorton commited on
Commit Β·
301ef4f
1
Parent(s): 470898e
sync README with the shipped state: float add/mul/div carry full subnormal support (gradual underflow) and FCVT.W.S honors the rounding-mode field; only the fused multiply-add remains among float items
Browse files
README.md
CHANGED
|
@@ -253,7 +253,7 @@ Interpretation:
|
|
| 253 |
| Error detection | 11 | parity (XOR tree), checksum, CRC, Hamming |
|
| 254 |
| Float (IEEE 754) | half + single | composed ADD, MUL, DIV, EQ/LT/LE/GT/GE pipelines plus unpack/pack/classify/normalize stages |
|
| 255 |
|
| 256 |
-
The float ADD/MUL/DIV/CMP circuits are **self-contained composed pipelines**: their complete internal wiring ships in the files as `.inputs` metadata, their external inputs are the raw operand words (`$a[0]` sign, `$a[1..E]` exponent, then mantissa; MSB-first), and the eval suite reconstructs and executes each netlist end to end from that metadata alone (`NetlistEvaluator`). Comparisons are fully IEEE (NaN unordered, `+0 == -0`, subnormal ordering, mixed signs). The arithmetic is round-to-nearest-even, **bit-exact to IEEE hardware**
|
| 257 |
|
| 258 |
### Tensor naming
|
| 259 |
|
|
@@ -345,7 +345,7 @@ Every weight and bias tensor in the canonical model fits in `int8`. The eval pip
|
|
| 345 |
| Float unpack/pack | exhaustive, functional | every bit gate driven with 0 and 1 (identity) |
|
| 346 |
| Float classify | functional | IEEE 754 categories (zero, subnormal, normal, inf, NaN) at edge encodings, both widths |
|
| 347 |
| Float CMP (composed) | functional, exact IEEE | full netlist rebuilt from the shipped `.inputs` metadata and evaluated end to end; NaN unordered, signed zeros, subnormal ordering, mixed signs β all five predicates, both widths |
|
| 348 |
-
| Float ADD/MUL/DIV (composed) | functional, bit-exact to IEEE hardware | same metadata-driven evaluation: exact specials,
|
| 349 |
| Memory / manifest | structure checks | packed-tensor shapes against the manifest |
|
| 350 |
| CPU integration | program-level | ten assembled programs (Fibonacci, sum, sort, self-modifying JMP, all eight Jcc, CALL stack push, MUL vs repeated ADD, DIV vs repeated SUB, a bitwise AND/OR/XOR/SHL/SHR pipeline, and the flag-policy pin) |
|
| 351 |
|
|
@@ -378,7 +378,7 @@ The most capable member: a RISC-V CPU whose entire datapath is ternary threshold
|
|
| 378 |
|
| 379 |
- **RV32I base**: LUI, AUIPC, JAL, JALR, all six branches, LB/LH/LW/LBU/LHU, SB/SH/SW, and the full OP-IMM/OP groups. 32 Γ 32-bit registers (x0 zero), little-endian memory through the packed threshold circuits. ECALL halts.
|
| 380 |
- **M extension**: MUL, MULH, MULHSU, MULHU (full 64-bit product through a shift-add array with gate-level sign correction), DIV, DIVU, REM, REMU (32 restoring stages, spec-exact divide-by-zero and overflow).
|
| 381 |
-
- **F subset**: FLW, FSW, FMV.W.X, FMV.X.W, FADD.S, FSUB.S, FMUL.S, FDIV.S, FEQ.S, FLT.S, FLE.S, FSGNJ[N/X].S, FCVT.W.S, FCVT.S.W β the arithmetic executed by the composed float32 pipelines (round-to-nearest-even, bit-exact to hardware; specials and
|
| 382 |
- **NEUR (custom-0)**: `neur rd, rs1, rs2` evaluates one threshold neuron β `rd = H(popcount(rs1[7:0] & rs2[7:0]) - popcount(rs1[7:0] & rs2[15:8]) + sext(rs2[20:16]))`. Networks of NEUR instructions are neural networks running as software on the neural network; the test suite computes XOR with a two-layer NEUR net.
|
| 383 |
- **Dual issue**: two adjacent OP/OP-IMM/LUI/AUIPC instructions retire in one cycle when the gate-level hazard comparators (`rv32.hazard.*`) clear RAW and WAW dependences.
|
| 384 |
- **MMIO**: stores to `0xFF00` append a character to the console.
|
|
@@ -392,7 +392,7 @@ python src/machines.py rv32 # eight-program lock
|
|
| 392 |
python src/machines.py rv32-c # stock-compiler C, end to end
|
| 393 |
```
|
| 394 |
|
| 395 |
-
**Running compiled C.** `machines.py rv32-c` compiles a freestanding C program (gcd, Fibonacci, insertion sort; `rv32im`, so real `mul`/`rem`) with an unmodified clang rv32im toolchain, loads the relocatable object with an in-repo loader (no external linker β it resolves the R_RISCV relocations of one translation unit and lays the sections out flat), executes it on the threshold CPU, and checks the return value against the value computed natively. The program retires in ~300 instructions and matches exactly. Stock `rv32im` toolchains (gcc, clang, rustc) emit this ISA.
|
| 396 |
|
| 397 |
The composed circuits evaluate in a leveled mode (`NetlistEvaluator`, one padded tensor op per topological level instead of one Python step per gate), ~18Γ faster on the FPU-scale netlists.
|
| 398 |
|
|
|
|
| 253 |
| Error detection | 11 | parity (XOR tree), checksum, CRC, Hamming |
|
| 254 |
| Float (IEEE 754) | half + single | composed ADD, MUL, DIV, EQ/LT/LE/GT/GE pipelines plus unpack/pack/classify/normalize stages |
|
| 255 |
|
| 256 |
+
The float ADD/MUL/DIV/CMP circuits are **self-contained composed pipelines**: their complete internal wiring ships in the files as `.inputs` metadata, their external inputs are the raw operand words (`$a[0]` sign, `$a[1..E]` exponent, then mantissa; MSB-first), and the eval suite reconstructs and executes each netlist end to end from that metadata alone (`NetlistEvaluator`). Comparisons are fully IEEE (NaN unordered, `+0 == -0`, subnormal ordering, mixed signs). The arithmetic is round-to-nearest-even, **bit-exact to IEEE hardware** including the subnormal range, with exact specials (NaN, infinities including `inf - inf`/`inf * 0`/`0/0`/`inf/inf` β NaN and `x/0` β inf, signed zeros), subnormal operands, and gradual-underflow subnormal results (each oracle validated bit-exact against numpy over every class). Because the tests run from each file's own routing metadata, they prove the artifact is self-contained: `safetensors2verilog`-style extraction of `float16.add` and friends has everything it needs to emit a single composed module.
|
| 257 |
|
| 258 |
### Tensor naming
|
| 259 |
|
|
|
|
| 345 |
| Float unpack/pack | exhaustive, functional | every bit gate driven with 0 and 1 (identity) |
|
| 346 |
| Float classify | functional | IEEE 754 categories (zero, subnormal, normal, inf, NaN) at edge encodings, both widths |
|
| 347 |
| Float CMP (composed) | functional, exact IEEE | full netlist rebuilt from the shipped `.inputs` metadata and evaluated end to end; NaN unordered, signed zeros, subnormal ordering, mixed signs β all five predicates, both widths |
|
| 348 |
+
| Float ADD/MUL/DIV (composed) | functional, bit-exact to IEEE hardware | same metadata-driven evaluation: exact specials, subnormal operands and gradual-underflow results, round-to-nearest-even; cross-checked against native float arithmetic |
|
| 349 |
| Memory / manifest | structure checks | packed-tensor shapes against the manifest |
|
| 350 |
| CPU integration | program-level | ten assembled programs (Fibonacci, sum, sort, self-modifying JMP, all eight Jcc, CALL stack push, MUL vs repeated ADD, DIV vs repeated SUB, a bitwise AND/OR/XOR/SHL/SHR pipeline, and the flag-policy pin) |
|
| 351 |
|
|
|
|
| 378 |
|
| 379 |
- **RV32I base**: LUI, AUIPC, JAL, JALR, all six branches, LB/LH/LW/LBU/LHU, SB/SH/SW, and the full OP-IMM/OP groups. 32 Γ 32-bit registers (x0 zero), little-endian memory through the packed threshold circuits. ECALL halts.
|
| 380 |
- **M extension**: MUL, MULH, MULHSU, MULHU (full 64-bit product through a shift-add array with gate-level sign correction), DIV, DIVU, REM, REMU (32 restoring stages, spec-exact divide-by-zero and overflow).
|
| 381 |
+
- **F subset**: FLW, FSW, FMV.W.X, FMV.X.W, FADD.S, FSUB.S, FMUL.S, FDIV.S, FEQ.S, FLT.S, FLE.S, FSGNJ[N/X].S, FCVT.W.S (honors the instruction's rounding-mode field), FCVT.S.W β the arithmetic executed by the composed float32 pipelines (round-to-nearest-even, bit-exact to hardware; specials and subnormals as above), the int/float conversions gate-routed through the priority encoder and barrel shifter and cross-checked bit-exact against native conversion.
|
| 382 |
- **NEUR (custom-0)**: `neur rd, rs1, rs2` evaluates one threshold neuron β `rd = H(popcount(rs1[7:0] & rs2[7:0]) - popcount(rs1[7:0] & rs2[15:8]) + sext(rs2[20:16]))`. Networks of NEUR instructions are neural networks running as software on the neural network; the test suite computes XOR with a two-layer NEUR net.
|
| 383 |
- **Dual issue**: two adjacent OP/OP-IMM/LUI/AUIPC instructions retire in one cycle when the gate-level hazard comparators (`rv32.hazard.*`) clear RAW and WAW dependences.
|
| 384 |
- **MMIO**: stores to `0xFF00` append a character to the console.
|
|
|
|
| 392 |
python src/machines.py rv32-c # stock-compiler C, end to end
|
| 393 |
```
|
| 394 |
|
| 395 |
+
**Running compiled C.** `machines.py rv32-c` compiles a freestanding C program (gcd, Fibonacci, insertion sort; `rv32im`, so real `mul`/`rem`) with an unmodified clang rv32im toolchain, loads the relocatable object with an in-repo loader (no external linker β it resolves the R_RISCV relocations of one translation unit and lays the sections out flat), executes it on the threshold CPU, and checks the return value against the value computed natively. The program retires in ~300 instructions and matches exactly. Stock `rv32im` toolchains (gcc, clang, rustc) emit this ISA. The remaining float item, the fused multiply-add, is tracked in `todo.md`.
|
| 396 |
|
| 397 |
The composed circuits evaluate in a leveled mode (`NetlistEvaluator`, one padded tensor op per topological level instead of one Python step per gate), ~18Γ faster on the FPU-scale netlists.
|
| 398 |
|