code wiki / _hdl_build / _diff_cmp_gate_authored.nx

_diff_cmp_gate_authored.nx source

↩ module page · 217 lines · 8083 B

1// _diff_cmp_gate_authored.nx -- gate for R1-T1-002 (dual-lane compare). 2// No mocks: the REAL organ elf over the REAL corpus through BOTH real 3// toolchains, twice. Checks: 4// ROWS-8 batch=8 produces exactly 8 DIFFCMP rows (run 1) 5// SUM-GREEN summary row present, instrument verdict GREEN 6// PARTITION agree+disagree == 8 (extracted from the summary) 7// REPRO-TEETH disagree>0 -> DIFFBUG row present AND the _dgbug repro file 8// exists (live divergence already known: _dgp0); disagree==0 9// -> trivially pass with a printed note (honest conditional) 10// DET run 2 agree count == run 1 agree count (determinism) 11// Markers: DCG-*; final DCGATE row -> knowledge/status/diff_cmp.log 12// license_tier: ORIGINAL 13 14import "nx_syscalls.nx" 15 16func dcg_p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 17func dcg_f(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 } 18func dcg_n(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m; sys_write(fd,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 } 19 20func dcg_chk(label: *u8, ok: i64, bad: *i64) -> i64 { 21 dcg_p("DCG-" as *u8) 22 dcg_p(label) 23 if ok == 1 { dcg_p(" ok\n" as *u8) } else { dcg_p(" BAD\n" as *u8); bad[0] = bad[0] + 1 } 24 return 0 25} 26 27func dcg_spawn(elf: *u8, a1: *u8, outpath: *u8) -> i64 { 28 let pid: i64 = sys_fork() 29 if pid == 0 { 30 let ofd: i64 = sys_openat_append(outpath, 0x1a4) 31 if ofd >= 0 { sys_dup3(ofd, 1, 0); sys_dup3(ofd, 2, 0) } 32 let argv: *i64 = sys_mmap(32) as *i64 33 argv[0] = elf as i64 34 argv[1] = a1 as i64 35 argv[2] = 0 36 let envp: *i64 = sys_mmap(16) as *i64 37 envp[0] = 0 38 sys_execve(elf, argv, envp) 39 sys_exit(127) 40 } 41 let st: *i64 = sys_mmap(16) as *i64 42 sys_wait4(pid, st, 0) 43 return (st[0] >> 8) & 0xff 44} 45 46func dcg_read(path: *u8, buf: *u8, cap: i64) -> i64 { 47 let fd: i64 = sys_openat_rd(path) 48 if fd < 0 { return 0 } 49 var n: i64 = 0 50 var r: i64 = sys_read(fd, buf, cap - 1) 51 while r > 0 { n = n + r; r = sys_read(fd, buf + n, cap - 1 - n) } 52 sys_close(fd) 53 return n 54} 55 56func dcg_count(buf: *u8, n: i64, pat: *u8) -> i64 { 57 var pl: i64 = 0 58 while pat[pl] != (0 as u8) { pl = pl + 1 } 59 var c: i64 = 0 60 var i: i64 = 0 61 while i + pl <= n { 62 var k: i64 = 0 63 var hit: i64 = 1 64 while k < pl { 65 if buf[i + k] != pat[k] { hit = 0; k = pl } else { k = k + 1 } 66 } 67 if hit == 1 { c = c + 1 } 68 i = i + 1 69 } 70 return c 71} 72 73// integer right after the <occ>-th occurrence of pat (1-based); -1 absent 74func dcg_extract(buf: *u8, n: i64, pat: *u8, occ: i64) -> i64 { 75 var pl: i64 = 0 76 while pat[pl] != (0 as u8) { pl = pl + 1 } 77 var seen: i64 = 0 78 var i: i64 = 0 79 while i + pl <= n { 80 var k: i64 = 0 81 var hit: i64 = 1 82 while k < pl { 83 if buf[i + k] != pat[k] { hit = 0; k = pl } else { k = k + 1 } 84 } 85 if hit == 1 { 86 seen = seen + 1 87 if seen == occ { 88 var at: i64 = i + pl 89 var v: i64 = 0 90 var any: i64 = 0 91 var go: i64 = 1 92 while go == 1 { 93 if at >= n { go = 0 } else { 94 let ch: i64 = buf[at] as i64 95 if ch >= 48 { 96 if ch <= 57 { v = v * 10 + (ch - 48); any = 1; at = at + 1 } else { go = 0 } 97 } else { go = 0 } 98 } 99 } 100 if any == 1 { return v } 101 return 0 - 1 102 } 103 } 104 i = i + 1 105 } 106 return 0 - 1 107} 108 109func main() -> i64 { 110 let badv: *i64 = sys_mmap(16) as *i64 111 badv[0] = 0 112 dcg_p("=== diff-cmp gate (R1-T1-002) ===\n" as *u8) 113 let organ: *u8 = "/tmp/nx_diff_cmp.sov.elf" as *u8 114 let probe: i64 = sys_openat_rd(organ) 115 if probe < 0 { 116 dcg_p("DCGATE verdict=RED reason=organ-elf-absent\n" as *u8) 117 sys_exit(9) 118 } 119 sys_close(probe) 120 121 // scratch conf batch=8; capture file fresh-ish via append separator 122 let cf: i64 = sys_openat_wr("/tmp/_dcm_conf.conf" as *u8, 0x1a4) 123 if cf >= 0 { dcg_f(cf, "batch=8\n" as *u8); sys_close(cf) } 124 let out: *u8 = "/tmp/_dcg_out.txt" as *u8 125 let sep: i64 = sys_openat_append(out, 0x1a4) 126 if sep >= 0 { dcg_f(sep, "DCG-RUN-SEPARATOR\n" as *u8); sys_close(sep) } 127 128 let buf: *u8 = sys_mmap(262144) 129 var n: i64 = dcg_read(out, buf, 262144) 130 let base_rows: i64 = dcg_count(buf, n, "DIFFCMP idx=" as *u8) 131 let base_sums: i64 = dcg_count(buf, n, "DIFFCMP-SUM batch=8" as *u8) 132 133 let rc1: i64 = dcg_spawn(organ, "/tmp/_dcm_conf.conf" as *u8, out) 134 n = dcg_read(out, buf, 262144) 135 var c: i64 = 0 136 if rc1 == 0 { if dcg_count(buf, n, "DIFFCMP idx=" as *u8) - base_rows == 8 { c = 1 } } 137 dcg_chk("ROWS-8" as *u8, c, badv) 138 c = 0 139 if dcg_count(buf, n, "DIFFCMP-SUM batch=8" as *u8) - base_sums == 1 { 140 if dcg_count(buf, n, "verdict=GREEN" as *u8) >= 1 { c = 1 } 141 } 142 dcg_chk("SUM-GREEN" as *u8, c, badv) 143 144 let occ1: i64 = base_sums + 1 145 let ag1: i64 = dcg_extract(buf, n, " agree=" as *u8, occ1) 146 let di1: i64 = dcg_extract(buf, n, " disagree=" as *u8, occ1) 147 c = 0 148 if ag1 >= 0 { if di1 >= 0 { if ag1 + di1 == 8 { c = 1 } } } 149 dcg_chk("PARTITION" as *u8, c, badv) 150 151 c = 0 152 if di1 > 0 { 153 if dcg_count(buf, n, "DIFFBUG idx=" as *u8) >= 1 { 154 let bidx: i64 = dcg_extract(buf, n, "DIFFBUG idx=" as *u8, 1) 155 if bidx >= 0 { 156 let bp: *u8 = sys_mmap(256) 157 var bo: i64 = 0 158 var sfx: i64 = 0 159 let stem: *u8 = "runtime/_hdl_build/_dgbug" as *u8 160 while stem[sfx] != (0 as u8) { bp[bo] = stem[sfx]; bo = bo + 1; sfx = sfx + 1 } 161 var m: i64 = bidx 162 let t: *u8 = sys_mmap(28) 163 var k: i64 = 0 164 if m == 0 { t[0] = 48 as u8; k = 1 } 165 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 166 var q: i64 = 0 167 while q < k { bp[bo] = t[k - 1 - q]; bo = bo + 1; q = q + 1 } 168 bp[bo] = 46 as u8 169 bp[bo + 1] = 110 as u8 170 bp[bo + 2] = 120 as u8 171 bp[bo + 3] = 0 as u8 172 let rf: i64 = sys_openat_rd(bp) 173 if rf >= 0 { sys_close(rf); c = 1 } 174 } 175 } 176 } else { 177 dcg_p("DCG-NOTE no live divergence this batch (conditional teeth pass)\n" as *u8) 178 c = 1 179 } 180 dcg_chk("REPRO-TEETH" as *u8, c, badv) 181 182 // determinism: run 2 -> same agree count 183 let rc2: i64 = dcg_spawn(organ, "/tmp/_dcm_conf.conf" as *u8, out) 184 n = dcg_read(out, buf, 262144) 185 let ag2: i64 = dcg_extract(buf, n, " agree=" as *u8, occ1 + 1) 186 c = 0 187 if rc2 == 0 { if ag2 == ag1 { c = 1 } } 188 dcg_chk("DET" as *u8, c, badv) 189 190 let lg: i64 = sys_openat_append("knowledge/status/diff_cmp.log" as *u8, 0x1a4) 191 var rcg: i64 = 0 192 if badv[0] == 0 { 193 dcg_p("DCGATE checks=5/5 agree=" as *u8) 194 dcg_n(1, ag1) 195 dcg_p(" disagree=" as *u8) 196 dcg_n(1, di1) 197 dcg_p(" verdict=GREEN\n" as *u8) 198 if lg >= 0 { 199 dcg_f(lg, "DCGATE checks=5/5 agree=" as *u8) 200 dcg_n(lg, ag1) 201 dcg_f(lg, " disagree=" as *u8) 202 dcg_n(lg, di1) 203 dcg_f(lg, " verdict=GREEN epoch=" as *u8) 204 dcg_n(lg, sys_now_realtime_sec()) 205 dcg_f(lg, "\n" as *u8) 206 } 207 } else { 208 dcg_p("DCGATE verdict=RED bad=" as *u8) 209 dcg_n(1, badv[0]) 210 dcg_p("\n" as *u8) 211 if lg >= 0 { dcg_f(lg, "DCGATE verdict=RED\n" as *u8) } 212 rcg = badv[0] 213 } 214 if lg >= 0 { sys_close(lg) } 215 sys_exit(rcg) 216 return rcg 217}