code wiki / _hdl_build / nx_funcmine_gate.nx

nx_funcmine_gate.nx source

↩ module page · 116 lines · 5725 B

1// nx_funcmine_gate.nx -- GATE for the function-body dedup miner (5 teeth incl neg-control + 2// determinism + MUTATION). PREREQ: stage _offc/nx_funcmine.elf. Run from nxc2 root. One miner 3// fork per tooth (self-exec chain). Fixture dir /tmp/fmdir with 3 files: 4// fa.nx: func shared_helper (BODY B) + func only_a 5// fb.nx: func shared_helper (BODY B, byte-identical) + func only_b 6// fc.nx: func only_c 7// T1 the identical shared_helper across fa+fb reported DUPFUNC copies=2 | T2 NEG the unique funcs 8// (only_a/b/c) NOT in any dup group | T3 summary dupgroups=1 | T4 determinism | T5 MUTATION: change 9// one byte of fb's shared_helper body -> no longer a dup -> dupgroups=0. 10// license_tier: ORIGINAL No hw writes (Rule 26). 11import "nx_seat_drive_lib.nx" 12import "nx_seg_store.nx" 13import "nx_deploy_lib.nx" 14import "nx_syscalls.nx" 15 16func fg_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 } 17func fg_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 } 18func fg_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 19 20func fg_run(dir: *u8, outp: *u8) -> i64 { 21 let av: *i64 = sys_mmap(16) as *i64 22 av[0] = dir as i64 23 return dep_run_capture("_offc/nx_funcmine.elf" as *u8, av, 1, outp) 24} 25 26func fg_seed(mutate: i64) -> i64 { 27 sys_mkdir("/tmp/fmdir" as *u8, 0x1ed) 28 let fa: *u8 = "func shared_helper(x: i64) -> i64 { return x + 1 }\nfunc only_a() -> i64 { return 7 }\n" as *u8 29 ss_writefile("/tmp/fmdir/fa.nx" as *u8, fa, fg_len(fa)) 30 var fb: *u8 = "func shared_helper(x: i64) -> i64 { return x + 1 }\nfunc only_b() -> i64 { return 8 }\n" as *u8 31 if mutate == 1 { fb = "func shared_helper(x: i64) -> i64 { return x + 2 }\nfunc only_b() -> i64 { return 8 }\n" as *u8 } 32 ss_writefile("/tmp/fmdir/fb.nx" as *u8, fb, fg_len(fb)) 33 let fc: *u8 = "func only_c() -> i64 { return 9 }\n" as *u8 34 ss_writefile("/tmp/fmdir/fc.nx" as *u8, fc, fg_len(fc)) 35 return 0 36} 37 38func main(argc: i64, argv: *i64) -> i64 { 39 var stage: i64 = 1 40 var pass: i64 = 0 41 if argc >= 2 { let ss1: *u8 = argv[1] as *u8; stage = fg_atoi(ss1) } 42 if argc >= 3 { let ps: *u8 = argv[2] as *u8; pass = fg_atoi(ps) } 43 if stage < 1 { stage = 1 } 44 45 if stage == 1 { 46 fg_seed(0) 47 let rc: i64 = fg_run("/tmp/fmdir" as *u8, "/tmp/fm_t1.out" as *u8) 48 let out: *u8 = sys_mmap(65536) 49 let n: i64 = dp_read("/tmp/fm_t1.out" as *u8, out, 65536) 50 var ok: i64 = 0 51 if rc == 0 { if sd_count(out, n, "DUPFUNC copies=2 " as *u8) == 1 { if sd_count(out, n, "shared_helper" as *u8) >= 1 { ok = 1 } } } 52 if ok == 1 { sd_w("T1 identical-body-across-files PASS\n" as *u8); pass = pass + 1 } else { sd_w("T1 identical-body-across-files FAIL\n" as *u8) } 53 } 54 if stage == 2 { 55 let out: *u8 = sys_mmap(65536) 56 let n: i64 = dp_read("/tmp/fm_t1.out" as *u8, out, 65536) 57 var ok: i64 = 0 58 if sd_count(out, n, "only_a" as *u8) == 0 { if sd_count(out, n, "only_c" as *u8) == 0 { ok = 1 } } 59 if ok == 1 { sd_w("T2 neg-unique-not-reported PASS\n" as *u8); pass = pass + 1 } else { sd_w("T2 neg-unique-not-reported FAIL\n" as *u8) } 60 } 61 if stage == 3 { 62 let out: *u8 = sys_mmap(65536) 63 let n: i64 = dp_read("/tmp/fm_t1.out" as *u8, out, 65536) 64 var ok: i64 = 0 65 if sd_count(out, n, "dupgroups=1 dupfuncs=2" as *u8) == 1 { ok = 1 } 66 if ok == 1 { sd_w("T3 summary-exact PASS\n" as *u8); pass = pass + 1 } else { sd_w("T3 summary-exact FAIL\n" as *u8) } 67 } 68 if stage == 4 { 69 let rc: i64 = fg_run("/tmp/fmdir" as *u8, "/tmp/fm_t4.out" as *u8) 70 let a: *u8 = sys_mmap(65536) 71 let an: i64 = dp_read("/tmp/fm_t1.out" as *u8, a, 65536) 72 let b: *u8 = sys_mmap(65536) 73 let bn: i64 = dp_read("/tmp/fm_t4.out" as *u8, b, 65536) 74 var same: i64 = 0 75 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 } } } } } 76 if same == 1 { sd_w("T4 deterministic PASS\n" as *u8); pass = pass + 1 } else { sd_w("T4 deterministic FAIL\n" as *u8) } 77 } 78 if stage == 5 { 79 fg_seed(1) 80 let rc: i64 = fg_run("/tmp/fmdir" as *u8, "/tmp/fm_t5.out" as *u8) 81 let out: *u8 = sys_mmap(65536) 82 let n: i64 = dp_read("/tmp/fm_t5.out" as *u8, out, 65536) 83 var ok: i64 = 0 84 if rc == 0 { if sd_count(out, n, "dupgroups=0 " as *u8) == 1 { ok = 1 } } 85 if ok == 1 { sd_w("T5 mutation-breaks-dup PASS\n" as *u8); pass = pass + 1 } else { sd_w("T5 mutation-breaks-dup FAIL\n" as *u8) } 86 } 87 88 if stage >= 5 { 89 sd_w("NX-FUNCMINE-GATE pass=" as *u8) 90 let pb: *u8 = sys_mmap(8) 91 pb[0] = (48 + pass) as u8 92 pb[1] = 0 as u8 93 sd_w(pb) 94 if pass == 5 { sd_w("/5 verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 95 sd_w("/5 verdict=RED\n" as *u8) 96 sys_exit(1) 97 return 1 98 } 99 100 let self: *u8 = argv[0] as *u8 101 let sb: *u8 = sys_mmap(24) 102 fg_itoa(sb, stage + 1) 103 let pb2: *u8 = sys_mmap(24) 104 fg_itoa(pb2, pass) 105 let nav: *i64 = sys_mmap(40) as *i64 106 nav[0] = self as i64 107 nav[1] = sb as i64 108 nav[2] = pb2 as i64 109 nav[3] = 0 110 let envp: *i64 = sys_mmap(16) as *i64 111 envp[0] = 0 112 sys_execve(self, nav, envp) 113 sd_w("FMG-EXEC-FAIL\n" as *u8) 114 sys_exit(1) 115 return 1 116}