code wiki / _hdl_build / nx_bitio_kat.nx
nx_bitio_kat.nx source
↩ module page · 55 lines · 3175 B
1// nx_bitio_kat.nx -- KAT for nx_bitio (MSB-first bit writer/reader). HONESTY [W] weak point (reach=115).
2// Known-answer bit patterns + put/get roundtrip incl cross-byte + nx_bits_bytes rounding.
3// license_tier: ORIGINAL expect_exit:0
4import "nx_syscalls.nx"
5import "nx_bitio.nx"
6
7func bw(s: *u8) -> i64 { var n:i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
8func bn(v: i64) -> i64 { let b:*u8=sys_mmap(24); var m:i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m} let t:*u8=sys_mmap(24); var k:i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var j:i64=0; while j<k{b[j]=t[k-1-j];j=j+1} sys_write(1,b,k); return 0 }
9
10func main() -> i64 {
11 var pass: i64 = 0
12 let buf: *u8 = sys_mmap(64)
13
14 // T1: MSB-first KAT -- put 5 (0b101) in 3 bits at pos 0 -> buf[0] top 3 bits = 101 = 0xA0
15 var i: i64 = 0; while i < 8 { buf[i] = 0 as u8; i = i + 1 }
16 nx_bw_put(buf, 0, 5, 3)
17 if (buf[0] as i64) == 0xA0 { pass = pass + 1; bw("T1 msb-pack 0xA0 PASS\n" as *u8) } else { bw("T1 FAIL buf0=" as *u8); bn(buf[0] as i64); bw("\n" as *u8) }
18
19 // T2: single top bit -- put 1 in 1 bit -> 0x80
20 i = 0; while i < 8 { buf[i] = 0 as u8; i = i + 1 }
21 nx_bw_put(buf, 0, 1, 1)
22 if (buf[0] as i64) == 0x80 { pass = pass + 1; bw("T2 top-bit 0x80 PASS\n" as *u8) } else { bw("T2 FAIL\n" as *u8) }
23
24 // T3: roundtrip -- put/get many (value, nbits) at pos 0
25 var ok3: i64 = 1
26 var nb: i64 = 1
27 while nb <= 16 {
28 let v: i64 = (12345 & ((1 << nb) - 1))
29 i = 0; while i < 8 { buf[i] = 0 as u8; i = i + 1 }
30 nx_bw_put(buf, 0, v, nb)
31 if nx_br_get(buf, 0, nb) != v { ok3 = 0 }
32 nb = nb + 1
33 }
34 if ok3 == 1 { pass = pass + 1; bw("T3 roundtrip 1..16 bits PASS\n" as *u8) } else { bw("T3 FAIL\n" as *u8) }
35
36 // T4: multi-field packing -- three fields, read each back
37 i = 0; while i < 8 { buf[i] = 0 as u8; i = i + 1 }
38 nx_bw_put(buf, 0, 5, 3) // pos 0..2
39 nx_bw_put(buf, 3, 10, 4) // pos 3..6
40 nx_bw_put(buf, 7, 200, 8) // pos 7..14 (cross-byte)
41 if nx_br_get(buf, 0, 3) == 5 { if nx_br_get(buf, 3, 4) == 10 { if nx_br_get(buf, 7, 8) == 200 { pass = pass + 1; bw("T4 multi-field PASS\n" as *u8) } else { bw("T4 FAIL f3\n" as *u8) } } else { bw("T4 FAIL f2\n" as *u8) } } else { bw("T4 FAIL f1\n" as *u8) }
42
43 // T5: cross-byte roundtrip -- put 12 bits at bitpos 6 (spans 3 bytes)
44 i = 0; while i < 8 { buf[i] = 0 as u8; i = i + 1 }
45 nx_bw_put(buf, 6, 2739, 12)
46 if nx_br_get(buf, 6, 12) == 2739 { pass = pass + 1; bw("T5 cross-byte PASS\n" as *u8) } else { bw("T5 FAIL\n" as *u8) }
47
48 // T6: nx_bits_bytes rounding
49 if nx_bits_bytes(0) == 0 { if nx_bits_bytes(1) == 1 { if nx_bits_bytes(8) == 1 { if nx_bits_bytes(9) == 2 { if nx_bits_bytes(16) == 2 { pass = pass + 1; bw("T6 bits_bytes PASS\n" as *u8) } else { bw("T6 FAIL 16\n" as *u8) } } else { bw("T6 FAIL 9\n" as *u8) } } else { bw("T6 FAIL 8\n" as *u8) } } else { bw("T6 FAIL 1\n" as *u8) } } else { bw("T6 FAIL 0\n" as *u8) }
50
51 bw("NX-BITIO-KAT " as *u8); bn(pass); bw("/6" as *u8)
52 if pass == 6 { bw(" GREEN\n" as *u8); return 0 }
53 bw(" RED\n" as *u8)
54 return 1
55}