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}