code wiki / _hdl_build / nx_bitstream_kat.nx
nx_bitstream_kat.nx source
↩ module page · 56 lines · 3417 B
1// nx_bitstream_kat.nx -- KAT for nx_bitstream (LSB + MSB bit reader over a byte buffer; the DEFLATE spine).
2// HONESTY [W] weak point (reach=123). Known-answer reads vs a hand-computed byte + peek/skip/align/remaining.
3// license_tier: ORIGINAL expect_exit:0
4import "nx_syscalls.nx"
5import "nx_bitstream.nx"
6
7func sw(s: *u8) -> i64 { var n:i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
8func sn(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 data: *u8 = sys_mmap(8)
13 data[0] = 0xB4 as u8 // 0b10110100
14 data[1] = 0x2D as u8 // 0b00101101
15
16 // T1: read_lsb -- 0xB4 low nibble first = 0100 = 4, then high nibble = 1011 = 11
17 let bs1: *NxBitStream = nx_bitstream_alloc(data, 2)
18 let a: i64 = nx_bitstream_read_lsb(bs1, 4)
19 let b: i64 = nx_bitstream_read_lsb(bs1, 4)
20 if a == 4 { if b == 11 { pass = pass + 1; sw("T1 read_lsb 4,11 PASS\n" as *u8) } else { sw("T1 FAIL b=" as *u8); sn(b); sw("\n" as *u8) } } else { sw("T1 FAIL a=" as *u8); sn(a); sw("\n" as *u8) }
21
22 // T2: read_msb -- 0xB4 top nibble first = 1011 = 11, then 0100 = 4
23 let bs2: *NxBitStream = nx_bitstream_alloc(data, 2)
24 let c: i64 = nx_bitstream_read_msb(bs2, 4)
25 let d: i64 = nx_bitstream_read_msb(bs2, 4)
26 if c == 11 { if d == 4 { pass = pass + 1; sw("T2 read_msb 11,4 PASS\n" as *u8) } else { sw("T2 FAIL d=" as *u8); sn(d); sw("\n" as *u8) } } else { sw("T2 FAIL c=" as *u8); sn(c); sw("\n" as *u8) }
27
28 // T3: peek does NOT advance -- peek==read for the same position
29 let bs3: *NxBitStream = nx_bitstream_alloc(data, 2)
30 let pk: i64 = nx_bitstream_peek_lsb(bs3, 4)
31 let rd: i64 = nx_bitstream_read_lsb(bs3, 4)
32 if pk == rd { if pk == 4 { pass = pass + 1; sw("T3 peek==read no-advance PASS\n" as *u8) } else { sw("T3 FAIL val\n" as *u8) } } else { sw("T3 FAIL peek advanced\n" as *u8) }
33
34 // T4: skip_bits advances -- skip 4 then read_lsb(4) == the high nibble (11)
35 let bs4: *NxBitStream = nx_bitstream_alloc(data, 2)
36 nx_bitstream_skip_bits(bs4, 4)
37 if nx_bitstream_read_lsb(bs4, 4) == 11 { pass = pass + 1; sw("T4 skip_bits PASS\n" as *u8) } else { sw("T4 FAIL\n" as *u8) }
38
39 // T5: byte_align -- read 3 bits then align -> next read starts at byte 1 (0x2D low nibble = 1101 = 13)
40 let bs5: *NxBitStream = nx_bitstream_alloc(data, 2)
41 nx_bitstream_read_lsb(bs5, 3)
42 nx_bitstream_byte_align(bs5)
43 if nx_bitstream_read_lsb(bs5, 4) == 13 { pass = pass + 1; sw("T5 byte_align PASS\n" as *u8) } else { sw("T5 FAIL\n" as *u8) }
44
45 // T6: bits_remaining decrements + overflow on over-read
46 let bs6: *NxBitStream = nx_bitstream_alloc(data, 2) // 16 bits
47 let r0: i64 = nx_bitstream_bits_remaining(bs6)
48 nx_bitstream_read_lsb(bs6, 10)
49 let r1: i64 = nx_bitstream_bits_remaining(bs6)
50 if r0 == 16 { if r1 == 6 { pass = pass + 1; sw("T6 bits_remaining 16->6 PASS\n" as *u8) } else { sw("T6 FAIL r1=" as *u8); sn(r1); sw("\n" as *u8) } } else { sw("T6 FAIL r0=" as *u8); sn(r0); sw("\n" as *u8) }
51
52 sw("NX-BITSTREAM-KAT " as *u8); sn(pass); sw("/6" as *u8)
53 if pass == 6 { sw(" GREEN\n" as *u8); return 0 }
54 sw(" RED\n" as *u8)
55 return 1
56}