code wiki / _hdl_build / nx_viz_pack_gate.nx

nx_viz_pack_gate.nx source

↩ module page · 71 lines · 2692 B

1// nx_viz_pack_gate.nx -- REFEREE for the circle-pack layer (property-based: the pack must be non-overlapping). 2// radii [40,30,25,20,15]: T1 all placed T2 circle0 at centre T3 NO overlaps (all pairs d>=ri+rj) 3// T4 deterministic (same input -> same output) 4// GREEN iff all. Sovereign: nx_viz_pack (-> nx_viz_trig). license_tier: ORIGINAL 5import "nx_viz_pack.nx" 6import "nx_viz_trig.nx" 7import "nx_syscalls.nx" 8import "nx_gate_verdict.nx" 9 10func g_w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 11func g_row(name: *u8, ok: i64) -> i64 { 12 if ok == 1 { g_w(" PASS " as *u8) } 13 if ok != 1 { g_w(" FAIL " as *u8) } 14 g_w(name); g_w("\n" as *u8) 15 return ok 16} 17// returns 1 if NO pair overlaps (d >= ri+rj for all i<j). 18func no_overlap(n: i64, r: *i64, xs: *i64, ys: *i64) -> i64 { 19 var i: i64 = 0 20 while i < n { 21 var j: i64 = i + 1 22 while j < n { 23 let dx: i64 = xs[i] - xs[j] 24 let dy: i64 = ys[i] - ys[j] 25 let d: i64 = vs_isqrt(dx * dx + dy * dy) 26 if d < r[i] + r[j] { return 0 } 27 j = j + 1 28 } 29 i = i + 1 30 } 31 return 1 32} 33 34func main() -> i64 { 35 g_w("viz-pack gate (greedy spiral circle-pack, non-overlapping)\n" as *u8) 36 let r: *i64 = sys_mmap(128) as *i64 37 let xs: *i64 = sys_mmap(128) as *i64 38 let ys: *i64 = sys_mmap(128) as *i64 39 let xs2: *i64 = sys_mmap(128) as *i64 40 let ys2: *i64 = sys_mmap(128) as *i64 41 r[0] = 40; r[1] = 30; r[2] = 25; r[3] = 20; r[4] = 15 42 var pass: i64 = 0 43 44 let got: i64 = vp_pack(5, r, xs, ys) 45 var t1: i64 = 0 46 if got == 5 { t1 = 1 } 47 pass = pass + g_row("T1 all 5 placed\x00" as *u8, t1) 48 49 var t2: i64 = 0 50 if xs[0] == 0 { if ys[0] == 0 { t2 = 1 } } 51 pass = pass + g_row("T2 largest at centre\x00" as *u8, t2) 52 53 var t3: i64 = 0 54 if no_overlap(5, r, xs, ys) == 1 { t3 = 1 } 55 pass = pass + g_row("T3 no overlaps (all pairs d>=ri+rj)\x00" as *u8, t3) 56 57 vp_pack(5, r, xs2, ys2) 58 var t4: i64 = 0 59 if xs[4] == xs2[4] { if ys[4] == ys2[4] { t4 = 1 } } 60 pass = pass + g_row("T4 deterministic\x00" as *u8, t4) 61 62 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 63 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 64 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 65 let ctr__dry: *i64 = gv_ctr() 66 ctr__dry[0] = pass 67 ctr__dry[1] = 4 68 let rc__dry: i64 = gv_verdict("VIZ-PACK-GATE" as *u8, ctr__dry, "4/4 (non-overlapping circle pack, deterministic)" as *u8) 69 sys_exit(rc__dry) 70 return rc__dry 71}