code wiki / _hdl_build / nx_sharpgrade_gate.nx
nx_sharpgrade_gate.nx source
↩ module page · 119 lines · 6512 B
1// nx_sharpgrade_gate.nx -- GATE for the small-sharp MATH grader (6 teeth incl neg-controls +
2// determinism + a MUTATION proof that linking two families flips SPLIT->SHARP). PREREQ: stage
3// _offc/nx_sharpgrade.elf. Run from nxc2 root. One grader fork per tooth (self-exec chain).
4// T1 SHARP: main->a->b (one component) | T2 SPLIT-2: two disjoint families {aa_*},{bb_*} distinct
5// prefixes | T3 SHARP-LIB: two components but ONE prefix family (sd_*) = cohesive utilities |
6// T4 SPLIT names the component count | T5 determinism (two runs identical) | T6 MUTATION: link the
7// two families (bb_p calls aa_x) -> 1 component -> SHARP (the connectivity math genuinely discriminates).
8// license_tier: ORIGINAL No hw writes (Rule 26).
9import "nx_seat_drive_lib.nx"
10import "nx_seg_store.nx"
11import "nx_deploy_lib.nx"
12import "nx_syscalls.nx"
13
14func rg_atoi(s: *u8) -> i64 { var v: i64 = 0; var i: i64 = 0; while s[i] != (0 as u8) { let c: i64 = s[i] as i64; if c >= 48 { if c <= 57 { v = v * 10 + (c - 48) } } i = i + 1 } return v }
15func rg_itoa(dst: *u8, v: i64) -> i64 { var m: i64 = v; 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 i: i64 = 0; while i < k { dst[i] = t[k - 1 - i]; i = i + 1 } dst[k] = 0 as u8; return k }
16func rg_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
17
18func rg_run(src: *u8, outp: *u8) -> i64 {
19 let av: *i64 = sys_mmap(16) as *i64
20 av[0] = src as i64
21 return dep_run_capture("_offc/nx_sharpgrade.elf" as *u8, av, 1, outp)
22}
23
24func main(argc: i64, argv: *i64) -> i64 {
25 var stage: i64 = 1
26 var pass: i64 = 0
27 if argc >= 2 { let ss1: *u8 = argv[1] as *u8; stage = rg_atoi(ss1) }
28 if argc >= 3 { let ps: *u8 = argv[2] as *u8; pass = rg_atoi(ps) }
29 if stage < 1 { stage = 1 }
30
31 let sharp: *u8 = "func b() -> i64 { return 1 }\nfunc a() -> i64 { return b() }\nfunc main() -> i64 { return a() }\n" as *u8
32 ss_writefile("/tmp/sg_sharp.nx" as *u8, sharp, rg_len(sharp))
33 let split: *u8 = "func aa_x() -> i64 { return 1 }\nfunc aa_y() -> i64 { return aa_x() }\nfunc bb_p() -> i64 { return 2 }\nfunc bb_q() -> i64 { return bb_p() }\n" as *u8
34 ss_writefile("/tmp/sg_split.nx" as *u8, split, rg_len(split))
35 let lib: *u8 = "func sd_a() -> i64 { return 1 }\nfunc sd_b() -> i64 { return 2 }\n" as *u8
36 ss_writefile("/tmp/sg_lib.nx" as *u8, lib, rg_len(lib))
37
38 if stage == 1 {
39 let rc: i64 = rg_run("/tmp/sg_sharp.nx" as *u8, "/tmp/sg_t1.out" as *u8)
40 let out: *u8 = sys_mmap(16384)
41 let n: i64 = dp_read("/tmp/sg_t1.out" as *u8, out, 16384)
42 var ok: i64 = 0
43 if rc == 0 { if sd_count(out, n, "components=1 " as *u8) == 1 { if sd_count(out, n, "verdict=SHARP\n" as *u8) == 1 { ok = 1 } } }
44 if ok == 1 { sd_w("T1 sharp-one-component PASS\n" as *u8); pass = pass + 1 } else { sd_w("T1 sharp-one-component FAIL\n" as *u8) }
45 }
46 if stage == 2 {
47 let rc: i64 = rg_run("/tmp/sg_split.nx" as *u8, "/tmp/sg_t2.out" as *u8)
48 let out: *u8 = sys_mmap(16384)
49 let n: i64 = dp_read("/tmp/sg_t2.out" as *u8, out, 16384)
50 var ok: i64 = 0
51 if rc == 0 { if sd_count(out, n, "verdict=SPLIT-2\n" as *u8) == 1 { ok = 1 } }
52 if ok == 1 { sd_w("T2 split-two-families PASS\n" as *u8); pass = pass + 1 } else { sd_w("T2 split-two-families FAIL\n" as *u8) }
53 }
54 if stage == 3 {
55 let rc: i64 = rg_run("/tmp/sg_lib.nx" as *u8, "/tmp/sg_t3.out" as *u8)
56 let out: *u8 = sys_mmap(16384)
57 let n: i64 = dp_read("/tmp/sg_t3.out" as *u8, out, 16384)
58 var ok: i64 = 0
59 if rc == 0 { if sd_count(out, n, "verdict=SHARP-LIB\n" as *u8) == 1 { ok = 1 } }
60 if ok == 1 { sd_w("T3 sharp-lib-one-prefix PASS\n" as *u8); pass = pass + 1 } else { sd_w("T3 sharp-lib-one-prefix FAIL\n" as *u8) }
61 }
62 if stage == 4 {
63 let out: *u8 = sys_mmap(16384)
64 let n: i64 = dp_read("/tmp/sg_t2.out" as *u8, out, 16384)
65 var ok: i64 = 0
66 if sd_count(out, n, "components=2 prefixes=2" as *u8) == 1 { ok = 1 }
67 if ok == 1 { sd_w("T4 split-count-named PASS\n" as *u8); pass = pass + 1 } else { sd_w("T4 split-count-named FAIL\n" as *u8) }
68 }
69 if stage == 5 {
70 let rc: i64 = rg_run("/tmp/sg_split.nx" as *u8, "/tmp/sg_t5.out" as *u8)
71 let a: *u8 = sys_mmap(16384)
72 let an: i64 = dp_read("/tmp/sg_t2.out" as *u8, a, 16384)
73 let b: *u8 = sys_mmap(16384)
74 let bn: i64 = dp_read("/tmp/sg_t5.out" as *u8, b, 16384)
75 var same: i64 = 0
76 if rc == 0 { if an == bn { if an > 0 { same = 1; var i: i64 = 0; while i < an { if a[i] != b[i] { same = 0; i = an } else { i = i + 1 } } } } }
77 if same == 1 { sd_w("T5 deterministic PASS\n" as *u8); pass = pass + 1 } else { sd_w("T5 deterministic FAIL\n" as *u8) }
78 }
79 if stage == 6 {
80 // MUTATION: link the two families -> one component -> SHARP
81 let linked: *u8 = "func aa_x() -> i64 { return 1 }\nfunc aa_y() -> i64 { return aa_x() }\nfunc bb_p() -> i64 { return aa_x() }\nfunc bb_q() -> i64 { return bb_p() }\n" as *u8
82 ss_writefile("/tmp/sg_linked.nx" as *u8, linked, rg_len(linked))
83 let rc: i64 = rg_run("/tmp/sg_linked.nx" as *u8, "/tmp/sg_t6.out" as *u8)
84 let out: *u8 = sys_mmap(16384)
85 let n: i64 = dp_read("/tmp/sg_t6.out" as *u8, out, 16384)
86 var ok: i64 = 0
87 if rc == 0 { if sd_count(out, n, "components=1 " as *u8) == 1 { if sd_count(out, n, "verdict=SHARP\n" as *u8) == 1 { ok = 1 } } }
88 if ok == 1 { sd_w("T6 mutation-link-flips-to-sharp PASS\n" as *u8); pass = pass + 1 } else { sd_w("T6 mutation-link-flips-to-sharp FAIL\n" as *u8) }
89 }
90
91 if stage >= 6 {
92 sd_w("NX-SHARPGRADE-GATE pass=" as *u8)
93 let pb: *u8 = sys_mmap(8)
94 pb[0] = (48 + pass) as u8
95 pb[1] = 0 as u8
96 sd_w(pb)
97 if pass == 6 { sd_w("/6 verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
98 sd_w("/6 verdict=RED\n" as *u8)
99 sys_exit(1)
100 return 1
101 }
102
103 let self: *u8 = argv[0] as *u8
104 let sb: *u8 = sys_mmap(24)
105 rg_itoa(sb, stage + 1)
106 let pb2: *u8 = sys_mmap(24)
107 rg_itoa(pb2, pass)
108 let nav: *i64 = sys_mmap(40) as *i64
109 nav[0] = self as i64
110 nav[1] = sb as i64
111 nav[2] = pb2 as i64
112 nav[3] = 0
113 let envp: *i64 = sys_mmap(16) as *i64
114 envp[0] = 0
115 sys_execve(self, nav, envp)
116 sd_w("SGG-EXEC-FAIL\n" as *u8)
117 sys_exit(1)
118 return 1
119}