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}