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}