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}