code wiki / _hdl_build / _assign_next_gate_authored.nx

_assign_next_gate_authored.nx source

↩ module page · 99 lines · 3571 B

1// _assign_next_gate_authored.nx -- gate for the dispatch core: a SCRATCH queue 2// with known structure proves pick logic, dep blocking, status transitions, 3// the structural top-blocker view, and the raised-hands count. 4// Scratch graph: A(w9,M,TODO,-) B(w9,S,TODO,A) C(w8,S,TODO,-) D(w9,S,NOVEL,-) 5// E(w5,S,DONE,-) F(w7,S,TODO,A) G(w6,S,TODO,A) 6// pick must be A (w9 runnable; B blocked by A; D is NOVEL not auto-picked) 7// flip A->DONE: pick must be B (w9, dep now done; beats C w8) 8// top blocker must be A (3 dependents: B,F,G) with VIEWPOINT ok (w=9) 9// novel count = 1, first = D 10// Markers: ANG-* / ASSIGN-GATE verdict= 11 12import "nx_syscalls.nx" 13import "nx_assign_core.nx" 14 15func ang_p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 16func ang_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 } 17 18func ang_write_queue(path: *u8, a_done: i64) -> i64 { 19 let fd: i64 = sys_openat_wr(path, 0x1a4) 20 if fd < 0 { return 0 } 21 ang_w(fd, "# scratch queue for the assign gate\n" as *u8) 22 if a_done == 1 { 23 ang_w(fd, "A\tR1\t9\tM\tBuilder\tDONE\t-\tg\tt\n" as *u8) 24 } else { 25 ang_w(fd, "A\tR1\t9\tM\tBuilder\tTODO\t-\tg\tt\n" as *u8) 26 } 27 ang_w(fd, "B\tR1\t9\tS\tBuilder\tTODO\tA\tg\tt\n" as *u8) 28 ang_w(fd, "C\tR2\t8\tS\tBuilder\tTODO\t-\tg\tt\n" as *u8) 29 ang_w(fd, "D\tR3\t9\tS\tBuilder\tNOVEL\t-\tg\tt\n" as *u8) 30 ang_w(fd, "E\tR1\t5\tS\tBuilder\tDONE\t-\tg\tt\n" as *u8) 31 ang_w(fd, "F\tR1\t7\tS\tBuilder\tTODO\tA\tg\tt\n" as *u8) 32 ang_w(fd, "G\tR1\t6\tS\tBuilder\tTODO\tA,E\tg\tt\n" as *u8) 33 sys_close(fd) 34 return 1 35} 36 37func ang_ideq(cx: *i64, r: i64, want: *u8) -> i64 { 38 if r < 0 { return 0 } 39 return an_streq(an_id_at(cx, r), want) 40} 41 42func main() -> i64 { 43 var bad: i64 = 0 44 let qp: *u8 = "/tmp/_ang_scratch_queue.tsv" as *u8 45 46 // phase 1: A runnable 47 if ang_write_queue(qp, 0) != 1 { ang_p("ANG setup FAIL\n" as *u8); sys_exit(99) } 48 let cx: *i64 = an_newcx() 49 let rows: i64 = an_load(qp, cx) 50 if rows != 7 { bad = bad + 1; ang_p("ANG-LOAD BAD rows!=7\n" as *u8) } 51 let p1: i64 = an_pick(cx) 52 if ang_ideq(cx, p1, "A" as *u8) == 1 { 53 ang_p("ANG-PICK1 ok=A\n" as *u8) 54 } else { 55 bad = bad + 1 56 ang_p("ANG-PICK1 BAD\n" as *u8) 57 } 58 let tb: i64 = an_top_blocker(cx) 59 let dc: *i64 = cx[6] as *i64 60 var tbok: i64 = 0 61 if ang_ideq(cx, tb, "A" as *u8) == 1 { if dc[tb] == 3 { tbok = 1 } } 62 if tbok == 1 { 63 ang_p("ANG-STRUCT ok=A dependents=3\n" as *u8) 64 } else { 65 bad = bad + 1 66 ang_p("ANG-STRUCT BAD\n" as *u8) 67 } 68 let no: *i64 = sys_mmap(16) as *i64 69 let nc: i64 = an_novel(cx, no) 70 var nok: i64 = 0 71 if nc == 1 { if ang_ideq(cx, no[0], "D" as *u8) == 1 { nok = 1 } } 72 if nok == 1 { 73 ang_p("ANG-NOVEL ok=1 first=D\n" as *u8) 74 } else { 75 bad = bad + 1 76 ang_p("ANG-NOVEL BAD\n" as *u8) 77 } 78 79 // phase 2: A DONE -> dep unblocks; pick must move to B (w9 beats C's w8) 80 ang_write_queue(qp, 1) 81 let cx2: *i64 = an_newcx() 82 an_load(qp, cx2) 83 let p2: i64 = an_pick(cx2) 84 if ang_ideq(cx2, p2, "B" as *u8) == 1 { 85 ang_p("ANG-PICK2 ok=B (dep unblocked, w9 beats w8)\n" as *u8) 86 } else { 87 bad = bad + 1 88 ang_p("ANG-PICK2 BAD\n" as *u8) 89 } 90 91 if bad == 0 { 92 ang_p("ASSIGN-GATE verdict=GREEN\n" as *u8) 93 sys_exit(0) 94 return 0 95 } 96 ang_p("ASSIGN-GATE verdict=RED\n" as *u8) 97 sys_exit(bad) 98 return bad 99}