code wiki / _hdl_build / _enc_r_replace_gate.nx
_enc_r_replace_gate.nx source
↩ module page · 68 lines · 3127 B
1// _enc_r_replace_gate.nx -- DIFFERENTIAL-REPLACEMENT of the RV64 R-type encoder (eve
2// "inside", full encoder family). Is the SEARCH-derived evo_enc_r (_evo_enc_r_champ.nx)
3// behaviorally IDENTICAL to the Claude asm_enc.enc_r across the field space? enc_r_ref is
4// the REAL encoder inlined VERBATIM from nxasm/asm_enc.nx:18-22. GREEN over 12800 field
5// combinations = the team derived a verified drop-in for a second toolchain-internal
6// encoder (the workhorse R-type). license_tier: ORIGINAL
7import "nx_syscalls.nx"
8import "_evo_enc_r_champ.nx"
9
10func enc_r_ref(opcode: i64, funct3: i64, funct7: i64, rd: i64, rs1: i64, rs2: i64) -> i64 {
11 return (funct7 << 25) | (rs2 << 20) | (rs1 << 15) | (funct3 << 12) | (rd << 7) | opcode
12}
13
14func err_w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
15func err_n(v: i64) -> i64 {
16 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 }
17 var m: i64 = v; let t: *u8 = sys_mmap(28); var k: i64 = 0
18 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
19 while k > 0 { k = k - 1; sys_write(1, (((t as i64)+k) as *u8), 1) }
20 return 0
21}
22func v_op(i: i64) -> i64 { if i == 0 { return 0x33 } if i == 1 { return 0x3B } if i == 2 { return 0x13 } return 0x7F }
23func v_f7(i: i64) -> i64 { if i == 0 { return 0x00 } if i == 1 { return 0x20 } if i == 2 { return 0x01 } if i == 3 { return 0x40 } return 0x7F }
24func v_rd(i: i64) -> i64 { if i == 0 { return 0 } if i == 1 { return 1 } if i == 2 { return 15 } if i == 3 { return 16 } return 31 }
25func v_r(i: i64) -> i64 { if i == 0 { return 0 } if i == 1 { return 1 } if i == 2 { return 15 } return 31 }
26
27func main() -> i64 {
28 var bad: i64 = 0
29 var total: i64 = 0
30 var oi: i64 = 0
31 while oi < 4 {
32 let opcode: i64 = v_op(oi)
33 var f3: i64 = 0
34 while f3 < 8 {
35 var f7i: i64 = 0
36 while f7i < 5 {
37 let funct7: i64 = v_f7(f7i)
38 var di: i64 = 0
39 while di < 5 {
40 let rd: i64 = v_rd(di)
41 var s1i: i64 = 0
42 while s1i < 4 {
43 let rs1: i64 = v_r(s1i)
44 var s2i: i64 = 0
45 while s2i < 4 {
46 let rs2: i64 = v_r(s2i)
47 total = total + 1
48 if evo_enc_r(opcode, f3, funct7, rd, rs1, rs2) != enc_r_ref(opcode, f3, funct7, rd, rs1, rs2) { bad = bad + 1 }
49 s2i = s2i + 1
50 }
51 s1i = s1i + 1
52 }
53 di = di + 1
54 }
55 f7i = f7i + 1
56 }
57 f3 = f3 + 1
58 }
59 oi = oi + 1
60 }
61 if bad == 0 {
62 err_w("ENCR-REPLACE GREEN: search-derived evo_enc_r == Claude enc_r (asm_enc.nx:18) on " as *u8); err_n(total); err_w(" field combinations\n" as *u8)
63 } else {
64 err_w("ENCR-REPLACE RED mismatches=" as *u8); err_n(bad); err_w("/" as *u8); err_n(total); err_w("\n" as *u8)
65 }
66 sys_exit(bad)
67 return bad
68}