code wiki / _hdl_build / _census_run_gate_authored.nx
_census_run_gate_authored.nx source
↩ module page · 151 lines · 6101 B
1// _census_run_gate_authored.nx -- gate for X-AUT-003 (nx_census_run). Scratch worlds:
2// K1 GAP-NAMED universe item absent from target -> CENSUS-GAP row + verdict=GAPS (exit 0)
3// K2 COVERED all items present -> gaps=0 + verdict=COVERED
4// K3 LIVE real census.conf -> exit 0 + CENSUS-RUN row present
5// Markers: CSG-*; final CSGATE row -> knowledge/status/census_run.log
6// license_tier: ORIGINAL
7import "nx_syscalls.nx"
8func cg_p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
9func cg_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 }
10func cg_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 as u8;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 }
11func cg_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
12func cg_cat(dst: *u8, off: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { dst[off+i] = s[i]; i = i + 1 } return off + i }
13func cg_numcat(dst: *u8, off: i64, v: i64) -> i64 {
14 let t: *u8 = sys_mmap(28)
15 var m: i64 = v
16 var k: i64 = 0
17 if m == 0 { t[0] = 48 as u8; k = 1 }
18 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
19 var i: i64 = 0
20 var o: i64 = off
21 while i < k { dst[o] = t[k-1-i]; o = o + 1; i = i + 1 }
22 return o
23}
24func cg_mkpath(dst: *u8, epoch: i64, suffix: *u8) -> i64 {
25 var o: i64 = cg_cat(dst, 0, "/tmp/csg_" as *u8)
26 o = cg_numcat(dst, o, epoch)
27 o = cg_cat(dst, o, suffix)
28 dst[o] = 0 as u8
29 return o
30}
31func cg_writes(path: *u8, s: *u8) -> i64 {
32 let fd: i64 = sys_openat_wr(path, 0x1a4)
33 if fd < 0 { return 0 }
34 sys_write(fd, s, cg_len(s))
35 sys_close(fd)
36 return 1
37}
38func cg_writeb(path: *u8, buf: *u8, n: i64) -> i64 {
39 let fd: i64 = sys_openat_wr(path, 0x1a4)
40 if fd < 0 { return 0 }
41 sys_write(fd, buf, n)
42 sys_close(fd)
43 return 1
44}
45func cg_run(cp: *u8, lp: *u8, live: i64) -> i64 {
46 let pid: i64 = sys_fork()
47 if pid == 0 {
48 let dn: i64 = sys_openat_wr("/dev/null" as *u8, 0x1a4)
49 if dn >= 0 { sys_dup3(dn, 1, 0); sys_dup3(dn, 2, 0) }
50 let argv: *i64 = sys_mmap(40) as *i64
51 argv[0] = "/tmp/nx_census_run.sov.elf" as *u8 as i64
52 if live == 0 {
53 argv[1] = cp as i64
54 argv[2] = lp as i64
55 argv[3] = 0
56 } else {
57 argv[1] = 0
58 }
59 let envp: *i64 = sys_mmap(16) as *i64
60 envp[0] = 0
61 sys_execve("/tmp/nx_census_run.sov.elf" as *u8, argv, envp)
62 sys_exit(127)
63 }
64 let st: *i64 = sys_mmap(16) as *i64
65 sys_wait4(pid, st, 0)
66 if (st[0] % 128) != 0 { return 0 - 1 }
67 return (st[0] >> 8) & 0xff
68}
69func cg_has(path: *u8, pat: *u8) -> i64 {
70 let buf: *u8 = sys_mmap(262144)
71 let fd: i64 = sys_openat_rd(path)
72 if fd < 0 { return 0 }
73 var n: i64 = 0
74 var go: i64 = 1
75 while go == 1 { let base: i64 = buf as i64; let r: i64 = sys_read(fd, (base + n) as *u8, 262128 - n); if r <= 0 { go = 0 } else { n = n + r } if n >= 262128 { go = 0 } }
76 sys_close(fd)
77 let pl: i64 = cg_len(pat)
78 if pl == 0 { return 0 }
79 var i: i64 = 0
80 while i + pl <= n {
81 var k: i64 = 0
82 var hit: i64 = 1
83 while k < pl { if buf[i+k] != pat[k] { hit = 0; k = pl } else { k = k + 1 } }
84 if hit == 1 { return 1 }
85 i = i + 1
86 }
87 return 0
88}
89func cg_chk(label: *u8, ok: i64, bad: *i64) -> i64 {
90 cg_p("CSG-" as *u8)
91 cg_p(label)
92 if ok == 1 { cg_p(" ok\n" as *u8) } else { cg_p(" BAD\n" as *u8); bad[0] = bad[0] + 1 }
93 return 0
94}
95func main() -> i64 {
96 cg_p("=== CENSUS-RUN GATE: scratch coverage worlds + live ===\n" as *u8)
97 let ep: i64 = sys_now_realtime_sec()
98 let bad: *i64 = sys_mmap(16) as *i64
99 bad[0] = 0
100 let u1: *u8 = sys_mmap(128)
101 let t1: *u8 = sys_mmap(128)
102 let c1: *u8 = sys_mmap(128)
103 let l1: *u8 = sys_mmap(128)
104 let l2: *u8 = sys_mmap(128)
105 cg_mkpath(u1, ep, "_u.txt" as *u8)
106 cg_mkpath(t1, ep, "_t.tsv" as *u8)
107 cg_mkpath(c1, ep, "_c.conf" as *u8)
108 cg_mkpath(l1, ep, "_l1.log" as *u8)
109 cg_mkpath(l2, ep, "_l2.log" as *u8)
110 // universe: two rows ALPHA + BETA; target covers only ALPHA
111 cg_writes(u1, "A ALPHA some/log ANCH green\nA BETA some/log ANCH green\n" as *u8)
112 cg_writes(t1, "ALPHA\tarc\tR\tA\tC\tI\tev\n" as *u8)
113 let cb: *u8 = sys_mmap(512)
114 var o: i64 = cg_cat(cb, 0, "C k1 " as *u8)
115 o = cg_cat(cb, o, u1)
116 o = cg_cat(cb, o, " A_ tok2 " as *u8)
117 o = cg_cat(cb, o, t1)
118 o = cg_cat(cb, o, "\n" as *u8)
119 cg_writeb(c1, cb, o)
120 // K1 GAP-NAMED
121 let r1: i64 = cg_run(c1, l1, 0)
122 var ok1: i64 = 0
123 if r1 == 0 { if cg_has(l1, "CENSUS-GAP census=k1 item=BETA" as *u8) == 1 { if cg_has(l1, "verdict=GAPS" as *u8) == 1 { ok1 = 1 } } }
124 cg_chk("GAP-NAMED" as *u8, ok1, bad)
125 // K2 COVERED: extend target with BETA
126 cg_writes(t1, "ALPHA\tarc\tR\tA\tC\tI\tev\nBETA\tarc\tR\tA\tC\tI\tev\n" as *u8)
127 let r2: i64 = cg_run(c1, l2, 0)
128 var ok2: i64 = 0
129 if r2 == 0 { if cg_has(l2, "gaps_total=0" as *u8) == 1 { if cg_has(l2, "verdict=COVERED" as *u8) == 1 { ok2 = 1 } } }
130 cg_chk("COVERED" as *u8, ok2, bad)
131 // K3 LIVE
132 let r3: i64 = cg_run(c1, l1, 1)
133 var ok3: i64 = 0
134 if r3 == 0 { ok3 = 1 }
135 cg_chk("LIVE" as *u8, ok3, bad)
136 let lg: i64 = sys_openat_append("knowledge/status/census_run.log" as *u8, 0x1a4)
137 if lg >= 0 {
138 cg_f(lg, "CSGATE checks=" as *u8)
139 cg_n(lg, 3 - bad[0])
140 cg_f(lg, "/3 verdict=" as *u8)
141 if bad[0] == 0 { cg_f(lg, "GREEN" as *u8) } else { cg_f(lg, "RED" as *u8) }
142 cg_f(lg, " epoch=" as *u8)
143 cg_n(lg, sys_now_realtime_sec())
144 cg_f(lg, "\n" as *u8)
145 sys_close(lg)
146 }
147 if bad[0] == 0 { cg_p(" CSGATE: GREEN 3/3\n" as *u8); sys_exit(0); return 0 }
148 cg_p(" CSGATE: RED\n" as *u8)
149 sys_exit(1)
150 return 1
151}