code wiki / _hdl_build / nx_sovgit_rtprobe.nx

nx_sovgit_rtprobe.nx source

↩ module page · 68 lines · 2558 B

1// nx_sovgit_rtprobe.nx -- diagnostic: dfe_compress -> nx_zlib_inflate round-trip over generated data. 2// argv[1] = size, argv[2] = mode (0=LCG random, 1=zeros, 2=repeating 64B pattern). 3// Prints zlen/err/out and the FIRST divergence offset (-1 = byte-exact). license_tier: ORIGINAL 4import "nx_sovgit_obj.nx" 5const K_MAGIC_88172645463325252: i64 = 88172645463325252 6const K_MAGIC_4096: i64 = 4096 7const K_MAGIC_65536: i64 = 65536 8 9func rt_w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 10func rt_n(v: i64) -> i64 { 11 let b: *u8 = sys_mmap(32) 12 var x: i64 = v 13 var neg: i64 = 0 14 if x < 0 { neg = 1; x = 0 - x } 15 var i: i64 = 31 16 if x == 0 { b[i] = 48 as u8; i = i - 1 } 17 while x > 0 { b[i] = (48 + x % 10) as u8; x = x / 10; i = i - 1 } 18 if neg == 1 { b[i] = 45 as u8; i = i - 1 } 19 sys_write(1, (b as i64 + i + 1) as *u8, 31 - i) 20 return 0 21} 22func rt_atoi(s: *u8) -> i64 { 23 var v: i64 = 0 24 var i: i64 = 0 25 while s[i] != (0 as u8) { v = v * 10 + ((s[i] as i64) - 48); i = i + 1 } 26 return v 27} 28func main(argc: i64, argv: *i64) -> i64 { 29 if argc < 3 { rt_w("usage: rtprobe <size> <mode>\n" as *u8); return 2 } 30 let n: i64 = rt_atoi(argv[1] as *u8) 31 let mode: i64 = rt_atoi(argv[2] as *u8) 32 let src: *u8 = sys_mmap(n + 64) 33 var i: i64 = 0 34 var seed: i64 = K_MAGIC_88172645463325252 35 while i < n { 36 if mode == 0 { 37 seed = seed ^ (seed << 13) 38 seed = seed ^ (seed >> 7) 39 seed = seed ^ (seed << 17) 40 src[i] = (seed & 255) as u8 41 } else { if mode == 1 { src[i] = 0 as u8 } else { src[i] = ((i * 7 + i / 64) & 255) as u8 } } 42 i = i + 1 43 } 44 let z: *u8 = sys_mmap(n + (n >> 1) + K_MAGIC_4096) 45 let zlen: i64 = sg_zwrap(src, n, z) 46 let r: *NxZlibResult = nx_zlib_inflate(z, zlen, n + K_MAGIC_65536) 47 rt_w("n=" as *u8); rt_n(n) 48 rt_w(" mode=" as *u8); rt_n(mode) 49 rt_w(" zlen=" as *u8); rt_n(zlen) 50 rt_w(" err=" as *u8); rt_n(r.error_code) 51 rt_w(" out=" as *u8); rt_n(r.output_size) 52 var diff: i64 = 0 - 1 53 if r.output_size > 0 { 54 var j: i64 = 0 55 var lim: i64 = r.output_size 56 if n < lim { lim = n } 57 var go: i64 = 1 58 while go == 1 { 59 if j >= lim { go = 0 } else { 60 let a: *u8 = (r.output_data as i64 + j) as *u8 61 if a[0] != src[j] { diff = j; go = 0 } else { j = j + 1 } 62 } 63 } 64 } 65 rt_w(" firstdiff=" as *u8); rt_n(diff) 66 rt_w("\n" as *u8) 67 return 0 68}