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}