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}