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}