code wiki / _hdl_build / nx_wflow_loop_gate.nx

nx_wflow_loop_gate.nx source

↩ module page · 114 lines · 5080 B

1// nx_wflow_loop_gate.nx -- R11 LOOPS gate: for-each = apply-to-each over the connector plane. Step arg 2// `<listexpr>~<template>`: the list substitutes ONCE (comma-split, 32-cap loud), then per item the engine 3// binds {item} as a run variable, emits WFITER, substitutes the template, forks the connector. Any failed 4// item fails the STEP (retry/on-fail machinery applies). Empty list = zero iterations, step OK. Proves the 5// per-item argv actually varies (argecho), the last item persists as {item} for later steps, empty-list 6// no-op, item failure fail-stops, load refusals. THREE forks. license_tier: ORIGINAL expect_exit: 0 7import "nx_wflow_engine.nx" 8 9func lg_n(led: *u8, ridtok: *u8, st: *u8) -> i64 { 10 let szp: *i64 = sys_mmap(8) as *i64 11 let b: *u8 = wf_readall(led, szp) 12 if (b as i64) == 0 { return 0 - 1 } 13 return wf_lines_with2(b, szp[0], ridtok, st) 14} 15func lg_row(conf: *u8, name: *u8, elf: *u8, flag: *u8) -> i64 { 16 let ln: *u8 = sys_mmap(600) 17 var o: i64 = 0 18 o = wf_cat(ln, o, name) 19 ln[o] = 9 as u8 20 o = o + 1 21 o = wf_cat(ln, o, elf) 22 ln[o] = 9 as u8 23 o = o + 1 24 o = wf_cat(ln, o, flag) 25 ln[o] = 10 as u8 26 ln[o+1] = 0 as u8 27 return wf_append(conf, ln) 28} 29 30func main() -> i64 { 31 p("=== NX-WFLOW-LOOP GATE (R11: for-each over the connector plane; WFITER records; item var) ===\n" as *u8) 32 var ok: i64 = 1 33 let now: i64 = wf_now() 34 let led: *u8 = sys_mmap(128) 35 var lo: i64 = 0 36 lo = wf_cat(led, lo, "/tmp/wflp_" as *u8) 37 lo = wf_catn(led, lo, now) 38 lo = wf_cat(led, lo, ".log" as *u8) 39 led[lo] = 0 as u8 40 let conf: *u8 = sys_mmap(128) 41 var co: i64 = 0 42 co = wf_cat(conf, co, "/tmp/wflp_" as *u8) 43 co = wf_catn(conf, co, now) 44 co = wf_cat(conf, co, ".conf" as *u8) 45 conf[co] = 0 as u8 46 lg_row(conf, "argecho" as *u8, "./_offc/nx_tool_argecho.elf" as *u8, "GREEN" as *u8) 47 lg_row(conf, "ghost" as *u8, "/tmp/wflow_no_such_elf_ever" as *u8, "GREEN" as *u8) 48 49 let flows: *i64 = sys_mmap(8 * 4) as *i64 50 flows[0] = "fm1|invite|-" as *u8 as i64 51 flows[1] = "fm2|empty|-" as *u8 as i64 52 flows[2] = "fm3|boom|-" as *u8 as i64 53 let steps: *i64 = sys_mmap(8 * 8) as *i64 54 steps[0] = "fm1|1|for-each|argecho|{guests}~greet~{item}|1" as *u8 as i64 55 steps[1] = "fm1|2|notify|-|Last invited was {item}|1" as *u8 as i64 56 steps[2] = "fm2|1|for-each|argecho|{none}~x|1" as *u8 as i64 57 steps[3] = "fm3|1|for-each|ghost|{guests}~x|1" as *u8 as i64 58 let cx: *i64 = sys_mmap(32) as *i64 59 cx[0] = steps as i64 60 cx[1] = 4 61 cx[2] = led as i64 62 cx[3] = conf as i64 63 64 // T0 load: rows valid; missing connector or empty arg refused 65 let l0: i64 = wf_load(steps, 4) 66 let bad1: *i64 = sys_mmap(16) as *i64 67 bad1[0] = "f9|1|for-each|-|x|1" as *u8 as i64 68 let lb1: i64 = wf_load(bad1, 1) 69 let bad2: *i64 = sys_mmap(16) as *i64 70 bad2[0] = "f9|1|for-each|argecho||1" as *u8 as i64 71 let lb2: i64 = wf_load(bad2, 1) 72 p(" T0 load=" as *u8); pn(l0); p(" noConn=" as *u8); pn(lb1); p(" noArg=" as *u8); pn(lb2); p("\n" as *u8) 73 if l0 != 4 { ok = 0 } 74 if lb1 != (0 - 1) { ok = 0 } 75 if lb2 != (0 - 1) { ok = 0 } 76 77 // T1 two-item loop: WFITER x2, per-item argv varied, {item} persists into the NEXT step (last item) 78 wf_fire(cx, flows, 3, "invite~guests=Rose,Ann~id=L1" as *u8) 79 let d1: i64 = lg_n(led, " rid=L1.fm1 " as *u8, "status=DONE" as *u8) 80 let it: i64 = lg_n(led, " rid=L1.fm1 " as *u8, "WFITER" as *u8) 81 let lastv: i64 = lg_n(led, " rid=L1.fm1 " as *u8, "k=item v=Ann" as *u8) 82 let s2: i64 = lg_n(led, " rid=L1.fm1 " as *u8, " step=2 status=OK" as *u8) 83 p(" T1 loop done=" as *u8); pn(d1); p(" iters=" as *u8); pn(it); p(" lastItemAnn=" as *u8); pn(lastv); p(" nextStep=" as *u8); pn(s2); p("\n" as *u8) 84 if d1 != 1 { ok = 0 } 85 if it != 2 { ok = 0 } 86 if lastv != 1 { ok = 0 } 87 if s2 != 1 { ok = 0 } 88 89 // T2 empty list (var exists, empty value) = zero iterations, step OK, run DONE 90 wf_fire(cx, flows, 3, "empty~none=~id=L2" as *u8) 91 let d2: i64 = lg_n(led, " rid=L2.fm2 " as *u8, "status=DONE" as *u8) 92 let it2: i64 = lg_n(led, " rid=L2.fm2 " as *u8, "WFITER" as *u8) 93 p(" T2 empty done=" as *u8); pn(d2); p(" iters=" as *u8); pn(it2); p("\n" as *u8) 94 if d2 != 1 { ok = 0 } 95 if it2 != 0 { ok = 0 } 96 97 // T3 item failure (dead elf) -> step FAILED, run FAILED 98 wf_fire(cx, flows, 3, "boom~guests=Solo~id=L3" as *u8) 99 let f3: i64 = lg_n(led, " rid=L3.fm3 " as *u8, "status=FAILED" as *u8) 100 let d3: i64 = lg_n(led, " rid=L3.fm3 " as *u8, "status=DONE" as *u8) 101 p(" T3 boom failed=" as *u8); pn(f3); p(" done=" as *u8); pn(d3); p("\n" as *u8) 102 if f3 != 1 { ok = 0 } 103 if d3 != 0 { ok = 0 } 104 105 // T4 negctl 106 let ban: i64 = lg_n(led, "WFITER" as *u8, "item=BANANA" as *u8) 107 p(" T4 negctl nonsense=" as *u8); pn(ban); p("\n" as *u8) 108 if ban != 0 { ok = 0 } 109 110 p("NX-WFLOW-LOOP-GATE ledger=" as *u8); p(led); p(" forks=3 " as *u8) 111 if ok == 1 { p("verdict=GREEN\n" as *u8); return 0 } 112 p("verdict=RED\n" as *u8) 113 return 1 114}