code wiki / _hdl_build / nx_assemseq_gate.nx
nx_assemseq_gate.nx source
↩ module page · 137 lines · 6003 B
1// nx_assemseq_gate.nx -- benchmark assembly/disassembly sequencing on the REAL as1 STEP tree (cadtwin P4b).
2// Parse as1 -> NAUO edges -> depths -> disassembly order; VERIFY every edge has child removed BEFORE its parent
3// (a part comes out only after its children), the root (as1) is removed LAST, and leaves (fasteners) FIRST.
4// Prints the teardown sequence for eyeball. expect_exit: 0 license_tier: ORIGINAL
5import "nx_assemseq.nx"
6
7func ag_tooth(name: *u8, pass: i64, fails: *i64) -> i64 {
8 sp_puts(" " as *u8); sp_puts(name); sp_puts(" -> " as *u8)
9 if pass == 1 { sp_puts("PASS\n" as *u8); return 0 }
10 sp_puts("FAIL\n" as *u8)
11 fails[0] = fails[0] + 1
12 return 0
13}
14func ag_name(st: *i64, pdid: i64, out2: *i64) -> i64 {
15 let prodi: i64 = sp_pd_product(st, pdid)
16 if prodi < 0 { sp_puts("?" as *u8); return 0 }
17 let buf: *u8 = st[0] as *u8
18 let ok: i64 = sp_arg_span(st, prodi, 0, out2)
19 if ok == 0 { sp_puts("?" as *u8); return 0 }
20 var v: i64 = out2[0]
21 let e: i64 = out2[0] + out2[1]
22 var sk: i64 = 1
23 while sk == 1 { if v < e { let s: i64 = sp_isspace(buf[v] as i64); if s == 1 { v = v + 1 } else { sk = 0 } } else { sk = 0 } }
24 if v >= e { return 0 }
25 if buf[v] != (39 as u8) { return 0 }
26 let s0: i64 = v + 1
27 var w: i64 = s0
28 var go: i64 = 1
29 while go == 1 { if w < e { if buf[w] == (39 as u8) { go = 0 } else { w = w + 1 } } else { go = 0 } }
30 sys_write(1, ((buf as i64) + s0) as *u8, w - s0)
31 return 0
32}
33
34func main() -> i64 {
35 sp_puts("=== nx_assemseq_gate -- disassembly sequencing on the real as1 STEP tree ===\n" as *u8)
36 let fails: *i64 = sys_mmap(8) as *i64
37 fails[0] = 0
38 let buf: *u8 = sys_mmap(4194304)
39 let aid: *i64 = sys_mmap(524288) as *i64
40 let anm: *i64 = sys_mmap(524288) as *i64
41 let anl: *i64 = sys_mmap(524288) as *i64
42 let aao: *i64 = sys_mmap(524288) as *i64
43 let aal: *i64 = sys_mmap(524288) as *i64
44 let st: *i64 = sys_mmap(256) as *i64
45 let n: i64 = sp_read_file("knowledge/fetched/step_as1.stp" as *u8, buf, 4194304)
46 if n <= 0 { sp_puts("MISSING step_as1.stp -- run nx_step_sample_fetch\nRED\n" as *u8); return 1 }
47 sp_init(st, buf, n, aid, anm, anl, aao, aal)
48 let cnt: i64 = sp_scan(st)
49 let pe: *i64 = sys_mmap(2048) as *i64
50 let ce: *i64 = sys_mmap(2048) as *i64
51 let en: i64 = sp_nauo_collect(st, pe, ce, 256)
52 sp_puts("entities=" as *u8); sp_putn(cnt); sp_puts(" NAUO edges=" as *u8); sp_putn(en); sp_puts("\n" as *u8)
53
54 let pd: *i64 = sys_mmap(2048) as *i64
55 let npd: i64 = asq_collect_pds(pe, ce, en, pd)
56 let rootpd: i64 = asq_root(pe, ce, en)
57 let depth: *i64 = sys_mmap(2048) as *i64
58 asq_depths(pd, npd, pe, ce, en, rootpd, depth)
59 let order: *i64 = sys_mmap(2048) as *i64
60 let no: i64 = asq_order(depth, npd, order)
61 sp_puts("distinct product-defs=" as *u8); sp_putn(npd); sp_puts(" ordered=" as *u8); sp_putn(no); sp_puts("\n" as *u8)
62
63 // print the teardown sequence
64 let out2: *i64 = sys_mmap(16) as *i64
65 sp_puts("DISASSEMBLY SEQUENCE (remove first -> last):\n" as *u8)
66 var i: i64 = 0
67 while i < no {
68 let idx: i64 = order[i]
69 sp_puts(" " as *u8); sp_putn(i + 1); sp_puts(". [depth " as *u8); sp_putn(depth[idx]); sp_puts("] " as *u8)
70 ag_name(st, pd[idx], out2)
71 sp_puts("\n" as *u8)
72 i = i + 1
73 }
74
75 // T1 all pds ordered
76 var t1: i64 = 0
77 if no == npd { if npd >= 5 { t1 = 1 } }
78 let ig1: i64 = ag_tooth("T1 all product-defs sequenced" as *u8, t1, fails)
79
80 // T2 every edge: child removed BEFORE parent (child's order-position < parent's)
81 // build order-position per pd index
82 let pos: *i64 = sys_mmap(2048) as *i64
83 i = 0
84 while i < no { pos[order[i]] = i; i = i + 1 }
85 var t2: i64 = 1
86 var e: i64 = 0
87 while e < en {
88 var pi: i64 = 0 - 1
89 var ci: i64 = 0 - 1
90 var k: i64 = 0
91 while k < npd {
92 if pd[k] == pe[e] { pi = k }
93 if pd[k] == ce[e] { ci = k }
94 k = k + 1
95 }
96 if pi >= 0 { if ci >= 0 { if pos[ci] >= pos[pi] { t2 = 0 } } }
97 e = e + 1
98 }
99 let ig2: i64 = ag_tooth("T2 every child removed BEFORE its parent (valid teardown)" as *u8, t2, fails)
100
101 // T3 root (as1) removed LAST
102 var t3: i64 = 0
103 let lastidx: i64 = order[no - 1]
104 if pd[lastidx] == rootpd {
105 let isas1: i64 = sp_prod_name_is(st, sp_pd_product(st, rootpd), "as1" as *u8)
106 if isas1 == 1 { t3 = 1 }
107 }
108 let ig3: i64 = ag_tooth("T3 top assembly (as1) removed LAST" as *u8, t3, fails)
109
110 // T4 first-removed is a leaf (depth == max), and is a fastener-ish leaf (has no children)
111 var t4: i64 = 0
112 let firstidx: i64 = order[0]
113 var haskids: i64 = 0
114 e = 0
115 while e < en { if pe[e] == pd[firstidx] { haskids = 1 } e = e + 1 }
116 if haskids == 0 { if depth[firstidx] >= 2 { t4 = 1 } }
117 let ig4: i64 = ag_tooth("T4 first-removed is a deep leaf part (fastener)" as *u8, t4, fails)
118
119 // T5 determinism
120 let order2: *i64 = sys_mmap(2048) as *i64
121 let depth2: *i64 = sys_mmap(2048) as *i64
122 asq_depths(pd, npd, pe, ce, en, rootpd, depth2)
123 let no2: i64 = asq_order(depth2, npd, order2)
124 var t5: i64 = 1
125 if no2 != no { t5 = 0 }
126 i = 0
127 while i < no { if order2[i] != order[i] { t5 = 0 } i = i + 1 }
128 let ig5: i64 = ag_tooth("T5 deterministic" as *u8, t5, fails)
129
130 sp_puts("\nP4b: the teardown order = fasteners/leaves first, top assembly last -- repair/disassembly instructions\n" as *u8)
131 sp_puts("for a flipped car, and the correct explode order for /explodelab. (kinematic joints + geometric-blocking\n" as *u8)
132 sp_puts("sequencing = the fuller rung; bar = Assemble-Them-All physics disassembly.)\n" as *u8)
133 sp_puts("\nfails=" as *u8); sp_putn(fails[0]); sp_puts("\n" as *u8)
134 if fails[0] == 0 { sp_puts("GREEN -- assembly/disassembly sequencing 5/5 (real as1 tree, verified teardown order)\n" as *u8); return 0 }
135 sp_puts("RED\n" as *u8)
136 return 1
137}