code wiki / _hdl_build / nx_rv64im_decoder_dump.nx

nx_rv64im_decoder_dump.nx source

↩ module page · 76 lines · 2669 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" 11const K_MAGIC_16777216: i64 = 16777216 12 13func _hex16(v: i64, out: *u8, pos: i64) -> i64 { 14 var k: i64 = 15 15 var p: i64 = pos 16 while k >= 0 { 17 let nib: i64 = (v >> (k * 4)) & 15 18 if nib < 10 { out[p] = (0x30 + nib) as u8 } 19 if nib >= 10 { out[p] = (0x61 + nib - 10) as u8 } 20 p = p + 1 21 k = k - 1 22 } 23 return p 24} 25 26func _field(out: *u8, pos: i64, v: i64, sep: i64) -> i64 { 27 var p: i64 = _hex16(v, out, pos) 28 out[p] = sep as u8 29 return p + 1 30} 31 32func main() -> i64 { 33 let path: *u8 = "/mnt/c/Users/elder/nishi-browser-proofs/decode_words.bin\x00" 34 let len_p: *i64 = sys_mmap(8) as *i64 35 let bytes: *u8 = sys_read_file(path, len_p) 36 let blen: i64 = len_p[0] 37 if (bytes as i64) == 0 { return 1 } 38 let nwords: i64 = blen / 4 39 40 let out: *u8 = sys_mmap(K_MAGIC_16777216) as *u8 // 16 MiB 41 var pos: i64 = 0 42 var i: i64 = 0 43 while i < nwords { 44 let o: i64 = i * 4 45 let b0: i64 = (bytes[o] as i64) & 255 46 let b1: i64 = (bytes[o + 1] as i64) & 255 47 let b2: i64 = (bytes[o + 2] as i64) & 255 48 let b3: i64 = (bytes[o + 3] as i64) & 255 49 let w: i64 = b0 | (b1 << 8) | (b2 << 16) | (b3 << 24) 50 pos = _field(out, pos, w, 9) 51 pos = _field(out, pos, nx_rv64im_opcode(w), 9) 52 pos = _field(out, pos, nx_rv64im_funct3(w), 9) 53 pos = _field(out, pos, nx_rv64im_funct7(w), 9) 54 pos = _field(out, pos, nx_rv64im_rd(w), 9) 55 pos = _field(out, pos, nx_rv64im_rs1(w), 9) 56 pos = _field(out, pos, nx_rv64im_rs2(w), 9) 57 pos = _field(out, pos, nx_rv64im_imm_i(w), 9) 58 pos = _field(out, pos, nx_rv64im_imm_s(w), 9) 59 pos = _field(out, pos, nx_rv64im_imm_b(w), 9) 60 pos = _field(out, pos, nx_rv64im_imm_u(w), 9) 61 pos = _field(out, pos, nx_rv64im_imm_j(w), 9) 62 pos = _field(out, pos, nx_rv64im_decode_kind(w), 10) 63 i = i + 1 64 } 65 66 let outp: *u8 = "/mnt/c/Users/elder/nishi-browser-proofs/decode_dump.tsv\x00" 67 let ofd: i64 = sys_openat_wr(outp, 0x1A4) 68 if ofd <= 0 { return 70 } 69 sys_write(ofd, out, pos) 70 sys_close(ofd) 71 72 let pass: *u8 = sys_mmap(8) 73 pass[0]=0x4F; pass[1]=0x4B; pass[2]=0x0A 74 sys_write(1, pass, 3) 75 return 0 76}