nx_gguf_meta_test.nx source
↩ module page · 159 lines · 6603 B
1// nx_gguf_meta_test.nx -- smoke for nx_gguf_meta.nx.
2//
3// Builds a synthetic GGUF with 4 metadata entries:
4// "n_layers" U32 -> 32
5// "rope_base" F32 -> 10000.0
6// "arch" STRING -> "llama"
7// "vocab" ARRAY of U32 with 3 elements -> [100, 200, 300]
8//
9// Verifies:
10// - find returns OK with correct value_off + type for each
11// - typed readers produce expected values
12// - missing key returns NOT_FOUND
13// - array helpers expose inner_type + count + first_elt_off
14// - array element walk via array_advance produces correct values
15
16import "nx_syscalls.nx"
17import "nx_tier.nx"
18import "nx_le.nx"
19import "nx_gguf.nx"
20import "nx_gguf_meta.nx"
21
22func _byte_equal(a: *u8, b: *u8, n: nx_int) -> nx_int {
23 var i: nx_int = 0
24 while i < n {
25 if a[i] != b[i] { return 0 }
26 i = i + 1
27 }
28 return 1
29}
30
31func main() -> i64 {
32 // ----- Verdict gate -----
33 var vi: nx_int = 0
34 while vi < NX_GMETA_N_VERDICTS {
35 if nx_gmeta_verdict_is_valid(vi) != 1 { return 5 + vi }
36 vi = vi + 1
37 }
38
39 let buf: *u8 = sys_mmap(1024)
40 buf[0]=0x47; buf[1]=0x47; buf[2]=0x55; buf[3]=0x46
41 buf[4]=3
42 nx_le_write_u64(buf, 8, 0) // 0 tensors (we only test metadata)
43 nx_le_write_u64(buf, 16, 4) // 4 metadata entries
44
45 // ----- Build metadata section starting at byte 24 -----
46 var p: i64 = 24
47
48 // Entry 1: "n_layers" (8 bytes) U32 = 32
49 nx_le_write_u64(buf, p, 8); p = p + 8
50 buf[p+0]=0x6e; buf[p+1]=0x5f; buf[p+2]=0x6c; buf[p+3]=0x61
51 buf[p+4]=0x79; buf[p+5]=0x65; buf[p+6]=0x72; buf[p+7]=0x73
52 p = p + 8
53 nx_le_write_u32(buf, p, NX_GGUF_TYPE_UINT32); p = p + 4
54 nx_le_write_u32(buf, p, 32); p = p + 4
55
56 // Entry 2: "rope_base" (9 bytes) F32 = 10000.0 = 0x461C4000
57 nx_le_write_u64(buf, p, 9); p = p + 8
58 buf[p+0]=0x72; buf[p+1]=0x6f; buf[p+2]=0x70; buf[p+3]=0x65
59 buf[p+4]=0x5f; buf[p+5]=0x62; buf[p+6]=0x61; buf[p+7]=0x73
60 buf[p+8]=0x65
61 p = p + 9
62 nx_le_write_u32(buf, p, NX_GGUF_TYPE_FLOAT32); p = p + 4
63 nx_le_write_u32(buf, p, 0x461C4000); p = p + 4
64
65 // Entry 3: "arch" (4 bytes) STRING = "llama" (5 bytes)
66 nx_le_write_u64(buf, p, 4); p = p + 8
67 buf[p+0]=0x61; buf[p+1]=0x72; buf[p+2]=0x63; buf[p+3]=0x68
68 p = p + 4
69 nx_le_write_u32(buf, p, NX_GGUF_TYPE_STRING); p = p + 4
70 nx_le_write_u64(buf, p, 5); p = p + 8
71 buf[p+0]=0x6c; buf[p+1]=0x6c; buf[p+2]=0x61; buf[p+3]=0x6d
72 buf[p+4]=0x61
73 p = p + 5
74
75 // Entry 4: "vocab" (5 bytes) ARRAY-of-U32 count=3 [100, 200, 300]
76 nx_le_write_u64(buf, p, 5); p = p + 8
77 buf[p+0]=0x76; buf[p+1]=0x6f; buf[p+2]=0x63; buf[p+3]=0x61; buf[p+4]=0x62
78 p = p + 5
79 nx_le_write_u32(buf, p, NX_GGUF_TYPE_ARRAY); p = p + 4
80 nx_le_write_u32(buf, p, NX_GGUF_TYPE_UINT32); p = p + 4 // inner type
81 nx_le_write_u64(buf, p, 3); p = p + 8 // count
82 nx_le_write_u32(buf, p, 100); p = p + 4
83 nx_le_write_u32(buf, p, 200); p = p + 4
84 nx_le_write_u32(buf, p, 300); p = p + 4
85
86 // ----- Parse header (will skip metadata) -----
87 let hdr: *NxGgufHeader = sys_mmap(NX_GGUF_HDR_BYTES) as *NxGgufHeader
88 let v_p: nx_int = nx_gguf_parse(buf, 1024, hdr)
89 if v_p != NX_GGUF_OK { return 20 + v_p }
90 if hdr.metadata_count != 4 { return 30 }
91
92 // ----- Find + read "n_layers" -----
93 let key1: *u8 = sys_mmap(8)
94 key1[0]=0x6e; key1[1]=0x5f; key1[2]=0x6c; key1[3]=0x61
95 key1[4]=0x79; key1[5]=0x65; key1[6]=0x72; key1[7]=0x73
96 let voff: *i64 = sys_mmap(8) as *i64
97 let vty: *i64 = sys_mmap(8) as *i64
98 let v_f1: nx_int = nx_gguf_meta_find(buf, 1024, hdr, key1, 8, voff, vty)
99 if v_f1 != NX_GMETA_OK { return 40 }
100 if vty[0] != NX_GGUF_TYPE_UINT32 { return 41 }
101 if nx_gguf_meta_read_u32(buf, voff[0]) != 32 { return 42 }
102
103 // ----- Find + read "rope_base" -----
104 let key2: *u8 = sys_mmap(9)
105 key2[0]=0x72; key2[1]=0x6f; key2[2]=0x70; key2[3]=0x65
106 key2[4]=0x5f; key2[5]=0x62; key2[6]=0x61; key2[7]=0x73
107 key2[8]=0x65
108 let v_f2: nx_int = nx_gguf_meta_find(buf, 1024, hdr, key2, 9, voff, vty)
109 if v_f2 != NX_GMETA_OK { return 50 }
110 if vty[0] != NX_GGUF_TYPE_FLOAT32 { return 51 }
111 // 10000.0 in Q10: f32 0x461C4000 has sign=0, exp=140-127=13, mantissa<<.
112 // Per our _gguf_f32_to_q10:
113 // m = 0x1C4000; m_q10 = m >> 13 = 0xE2 = 226
114 // base = 1024 + 226 = 1250
115 // result = 1250 << 13 = 10240000
116 if nx_gguf_meta_read_f32_q10(buf, voff[0]) != 10240000 { return 52 }
117
118 // ----- Find + read "arch" string -----
119 let key3: *u8 = sys_mmap(4)
120 key3[0]=0x61; key3[1]=0x72; key3[2]=0x63; key3[3]=0x68
121 let v_f3: nx_int = nx_gguf_meta_find(buf, 1024, hdr, key3, 4, voff, vty)
122 if v_f3 != NX_GMETA_OK { return 60 }
123 if vty[0] != NX_GGUF_TYPE_STRING { return 61 }
124 if nx_gguf_meta_read_string_len(buf, voff[0]) != 5 { return 62 }
125 let s_ptr: *u8 = nx_gguf_meta_read_string_ptr(buf, voff[0])
126 let exp_llama: *u8 = sys_mmap(5)
127 exp_llama[0]=0x6c; exp_llama[1]=0x6c; exp_llama[2]=0x61
128 exp_llama[3]=0x6d; exp_llama[4]=0x61
129 if _byte_equal(s_ptr, exp_llama, 5) != 1 { return 63 }
130
131 // ----- Find + read "vocab" array -----
132 let key4: *u8 = sys_mmap(5)
133 key4[0]=0x76; key4[1]=0x6f; key4[2]=0x63; key4[3]=0x61; key4[4]=0x62
134 let v_f4: nx_int = nx_gguf_meta_find(buf, 1024, hdr, key4, 5, voff, vty)
135 if v_f4 != NX_GMETA_OK { return 70 }
136 if vty[0] != NX_GGUF_TYPE_ARRAY { return 71 }
137 if nx_gguf_meta_array_inner_type(buf, voff[0]) != NX_GGUF_TYPE_UINT32 { return 72 }
138 if nx_gguf_meta_array_count(buf, voff[0]) != 3 { return 73 }
139 let first_off: i64 = nx_gguf_meta_array_first_elt_off(buf, voff[0])
140 if nx_gguf_meta_read_u32(buf, first_off + 0) != 100 { return 74 }
141 if nx_gguf_meta_read_u32(buf, first_off + 4) != 200 { return 75 }
142 if nx_gguf_meta_read_u32(buf, first_off + 8) != 300 { return 76 }
143
144 // Walk via array_advance (should also reach the same offsets).
145 var advanced: i64 = first_off
146 advanced = nx_gguf_meta_array_advance(buf, 1024, advanced, NX_GGUF_TYPE_UINT32)
147 if advanced != first_off + 4 { return 77 }
148 advanced = nx_gguf_meta_array_advance(buf, 1024, advanced, NX_GGUF_TYPE_UINT32)
149 if advanced != first_off + 8 { return 78 }
150
151 // ----- Negative: missing key -----
152 let key_miss: *u8 = sys_mmap(7)
153 key_miss[0]=0x6d; key_miss[1]=0x69; key_miss[2]=0x73; key_miss[3]=0x73
154 key_miss[4]=0x69; key_miss[5]=0x6e; key_miss[6]=0x67
155 let v_fm: nx_int = nx_gguf_meta_find(buf, 1024, hdr, key_miss, 7, voff, vty)
156 if v_fm != NX_GMETA_NOT_FOUND { return 80 }
157
158 return 0
159}