code wiki / _hdl_build / rv64im_min_decoder_proof.nx

rv64im_min_decoder_proof.nx source

↩ module page · 75 lines · 2622 B

1// nx_rv64im_decoder_dump.nx -- dump rv64im_min_decoder field outputs 2// for every word in decode_words.bin, so an independent Python RV64 3// decoder can diff them 1:1. Per-word line (all hex16, tab-sep): 4// word opcode funct3 funct7 rd rs1 rs2 imm_i imm_s imm_b imm_u imm_j kind 5// 6// expect_exit: 0 7// license_tier: ORIGINAL 8import "nx_syscalls.nx" 9import "nishi_hdl_primitives.nx" 10import "rv64im_min_decoder.nx" 11 12func _hex16(v: i64, out: *u8, pos: i64) -> i64 { 13 var k: i64 = 15 14 var p: i64 = pos 15 while k >= 0 { 16 let nib: i64 = (v >> (k * 4)) & 15 17 if nib < 10 { out[p] = (0x30 + nib) as u8 } 18 if nib >= 10 { out[p] = (0x61 + nib - 10) as u8 } 19 p = p + 1 20 k = k - 1 21 } 22 return p 23} 24 25func _field(out: *u8, pos: i64, v: i64, sep: i64) -> i64 { 26 var p: i64 = _hex16(v, out, pos) 27 out[p] = sep as u8 28 return p + 1 29} 30 31func main() -> i64 { 32 let path: *u8 = "/mnt/c/Users/elder/nishi-browser-proofs/decode_words.bin\x00" 33 let len_p: *i64 = sys_mmap(8) as *i64 34 let bytes: *u8 = sys_read_file(path, len_p) 35 let blen: i64 = len_p[0] 36 if (bytes as i64) == 0 { return 1 } 37 let nwords: i64 = blen / 4 38 39 let out: *u8 = sys_mmap(16777216) as *u8 // 16 MiB 40 var pos: i64 = 0 41 var i: i64 = 0 42 while i < nwords { 43 let o: i64 = i * 4 44 let b0: i64 = (bytes[o] as i64) & 255 45 let b1: i64 = (bytes[o + 1] as i64) & 255 46 let b2: i64 = (bytes[o + 2] as i64) & 255 47 let b3: i64 = (bytes[o + 3] as i64) & 255 48 let w: i64 = b0 | (b1 << 8) | (b2 << 16) | (b3 << 24) 49 pos = _field(out, pos, w, 9) 50 pos = _field(out, pos, nx_rv64im_opcode(w), 9) 51 pos = _field(out, pos, nx_rv64im_funct3(w), 9) 52 pos = _field(out, pos, nx_rv64im_funct7(w), 9) 53 pos = _field(out, pos, nx_rv64im_rd(w), 9) 54 pos = _field(out, pos, nx_rv64im_rs1(w), 9) 55 pos = _field(out, pos, nx_rv64im_rs2(w), 9) 56 pos = _field(out, pos, nx_rv64im_imm_i(w), 9) 57 pos = _field(out, pos, nx_rv64im_imm_s(w), 9) 58 pos = _field(out, pos, nx_rv64im_imm_b(w), 9) 59 pos = _field(out, pos, nx_rv64im_imm_u(w), 9) 60 pos = _field(out, pos, nx_rv64im_imm_j(w), 9) 61 pos = _field(out, pos, nx_rv64im_decode_kind(w), 10) 62 i = i + 1 63 } 64 65 let outp: *u8 = "/mnt/c/Users/elder/nishi-browser-proofs/decode_dump.tsv\x00" 66 let ofd: i64 = sys_openat_wr(outp, 0x1A4) 67 if ofd <= 0 { return 70 } 68 sys_write(ofd, out, pos) 69 sys_close(ofd) 70 71 let pass: *u8 = sys_mmap(8) 72 pass[0]=0x4F; pass[1]=0x4B; pass[2]=0x0A 73 sys_write(1, pass, 3) 74 return 0 75}