code wiki / _hdl_build / nx_ecomat_put_gate.nx
nx_ecomat_put_gate.nx source
↩ module page · 72 lines · 4251 B
1// nx_ecomat_put_gate.nx -- gate for acl F771. PROVES the store-native domain add is APPEND (preserves
2// existing domains) on a THROWAWAY store, before nx_ecomat_put ever touches the live maturity store.
3// T1 seed 3 domains -> add a 4th via _offc/nx_ecomat_put.elf -> all 4 present (add-preserves-others)
4// T2 the added id3 carries the right domain string
5// T3 id4 absent (no over-add) -- NEGATIVE CONTROL
6// Unique per-run prefix (epoch) so the append-only /tmp store stays deterministic. license_tier: ORIGINAL
7import "nx_ecomat_lib.nx"
8import "nx_seg_store.nx"
9import "nx_tool_run.nx"
10
11func g_w(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 }
12func g_wn(fd: i64, v: i64) -> i64 { var m: i64 = v; if m < 0 { g_w(fd, "-" as *u8); m = 0 - m } 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 } let o: *u8 = sys_mmap(28); var i: i64 = 0; while i < k { o[i] = t[k-1-i]; i = i + 1 } sys_write(fd, o, k); return 0 }
13func g_catn(buf: *u8, off: i64, v: i64) -> i64 { var m: i64 = v; if m < 0 { m = 0 } 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 o: i64 = off; var i: i64 = 0; while i < k { buf[o] = t[k-1-i]; o = o + 1; i = i + 1 } return o }
14func main() -> i64 {
15 // unique throwaway prefix per run: /tmp/ecp<epoch>-
16 let pfx: *u8 = sys_mmap(64)
17 var o: i64 = 0
18 let base: *u8 = "/tmp/ecp" as *u8
19 var bi: i64 = 0
20 while base[bi] != (0 as u8) { pfx[o] = base[bi]; o = o + 1; bi = bi + 1 }
21 o = g_catn(pfx, o, sys_now_realtime_sec())
22 pfx[o] = 45 as u8; o = o + 1
23 pfx[o] = 0 as u8
24
25 // seed 3 domains (ids 0,1,2)
26 let w: *i64 = ss_begin()
27 ec_seed_one(w, 0, 0, 1, 3, 5, 7, 1, "alpha" as *u8, "b0" as *u8, "n0" as *u8)
28 ec_seed_one(w, 1, 1, 1, 2, 5, 6, 1, "bravo" as *u8, "b1" as *u8, "n1" as *u8)
29 ec_seed_one(w, 2, 2, 1, 2, 5, 6, 1, "charlie" as *u8, "b2" as *u8, "n2" as *u8)
30 ss_commit(pfx, w, sys_now_realtime_sec())
31
32 // add a 4th via the organ: addauto axis=1 layer=1 cur=2 bar=5 weight=7 domain=delta ... prefix=pfx
33 let av: *i64 = sys_mmap(128) as *i64
34 av[0] = "_offc/nx_ecomat_put.elf" as i64
35 av[1] = "addauto" as i64
36 av[2] = "1" as i64; av[3] = "1" as i64; av[4] = "2" as i64; av[5] = "5" as i64; av[6] = "7" as i64
37 av[7] = "delta" as i64; av[8] = "bd" as i64; av[9] = "nd" as i64
38 av[10] = "" as i64; av[11] = "" as i64; av[12] = pfx as i64; av[13] = 0
39 let ocap: i64 = 4096
40 let out: *u8 = sys_mmap(ocap)
41 let ol: *i64 = sys_mmap(16) as *i64
42 tr_run_capture("_offc/nx_ecomat_put.elf" as *u8, av, out, ocap, ol)
43
44 // verify against the throwaway store
45 let h: *i64 = ss_open(pfx)
46 let pq: *i64 = sys_mmap(16) as *i64
47 let lq: *i64 = sys_mmap(16) as *i64
48 var present: i64 = 0
49 var id: i64 = 0
50 while id < 4 {
51 let key: *u8 = sys_mmap(64); ec_key(id, key)
52 if ss_hget(h, key, pq, lq) == 1 { present = present + 1 }
53 id = id + 1
54 }
55 var dom3ok: i64 = 0
56 let k3: *u8 = sys_mmap(64); ec_key(3, k3)
57 if ss_hget(h, k3, pq, lq) == 1 { let dom: *u8 = sys_mmap(ECOMAT_DOM_CAP); ec_str(pq[0] as *u8, 0, dom, ECOMAT_DOM_CAP); if el_streq(dom, "delta" as *u8) == 1 { dom3ok = 1 } }
58 var id4absent: i64 = 1
59 let k4: *u8 = sys_mmap(64); ec_key(4, k4)
60 if ss_hget(h, k4, pq, lq) == 1 { id4absent = 0 }
61
62 var pass: i64 = 0
63 let tot: i64 = 3
64 if present == 4 { pass = pass + 1; g_w(1, "T1 add-preserves-others 4/4 present PASS\n" as *u8) } else { g_w(1, "T1 FAIL present=" as *u8); g_wn(1, present); g_w(1, "\n" as *u8) }
65 if dom3ok == 1 { pass = pass + 1; g_w(1, "T2 added id3 domain=delta PASS\n" as *u8) } else { g_w(1, "T2 FAIL\n" as *u8) }
66 if id4absent == 1 { pass = pass + 1; g_w(1, "T3 id4 absent no-over-add PASS (neg-control)\n" as *u8) } else { g_w(1, "T3 FAIL\n" as *u8) }
67 g_w(1, "ECOMAT-PUT-GATE pass=" as *u8); g_wn(1, pass); g_w(1, "/" as *u8); g_wn(1, tot)
68 if pass == tot { g_w(1, " verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
69 g_w(1, " verdict=RED\n" as *u8)
70 sys_exit(1)
71 return 1
72}