code wiki / _hdl_build / nx_flip_worklist.nx
nx_flip_worklist.nx source
↩ module page · 111 lines · 4665 B
1// nx_flip_worklist.nx -- the INTAKE half of "go part by part on an entire car".
2// The coverage gate in nx_flip_score tells you what was missed AFTER you score. This tells you what to
3// LOOK AT BEFORE you start, and -- given a deal -- exactly which mandatory systems still have no finding.
4// nx_flip_worklist <class> [deal] [plane-prefix-root]
5//
6// FIRST MEMBER OF THE FAMILY CONVERTED ONTO THE SHARED BASE `nx_flip_lib.nx` (fx_*). It previously
7// carried its own private copy of ~17 primitives (fw_puts/fw_col/fw_slice_eqs/...); those are GONE.
8// Behaviour is byte-identical BY CONSTRUCTION and PROVEN by nx_flip_gate staying 16/16 across the swap
9// -- that is exactly what the gate was built for: it makes a refactor of working code safe.
10// license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0
11import "nx_flip_lib.nx"
12import "nx_syscalls.nx"
13
14const FW_ARGC_MIN: i64 = 2
15const FW_ARG_DEAL: i64 = 2
16const FW_ARG_PFX: i64 = 3
17const FW_CK_CLASS: i64 = 1
18const FW_CK_NAME: i64 = 2
19const FW_CK_MAND: i64 = 3
20const FW_CF_DEAL: i64 = 1
21const FW_CF_COMP: i64 = 2
22
23func main(argc: i64, argv: *i64) -> i64 {
24 if argc < FW_ARGC_MIN {
25 fx_puts("usage: nx_flip_worklist <class> [deal] [plane-prefix-root]\n" as *u8)
26 sys_exit(FX_EXIT_USAGE)
27 return FX_EXIT_USAGE
28 }
29 let cls: *u8 = argv[1] as *u8
30 var deal: *u8 = "@" as *u8
31 var have_deal: i64 = 0
32 if argc > FW_ARG_DEAL { deal = argv[FW_ARG_DEAL] as *u8; have_deal = 1 }
33 var root: *u8 = "flip-" as *u8
34 if argc > FW_ARG_PFX { root = argv[FW_ARG_PFX] as *u8 }
35
36 let nkp: *i64 = sts_mm(FX_SCRATCH) as *i64
37 let nfp: *i64 = sts_mm(FX_SCRATCH) as *i64
38 let bk: *u8 = fx_plane(root, "comp-" as *u8, nkp)
39 let bf: *u8 = fx_plane(root, "find-" as *u8, nfp)
40 let nk: i64 = nkp[0]
41 let nf: i64 = nfp[0]
42 let sp: *i64 = sts_mm(FX_SCRATCH) as *i64
43 let cs: *i64 = sts_mm(FX_SCRATCH) as *i64
44 let pb: *u8 = sts_mm(FX_BUF)
45 var po: i64 = 0
46
47 if nk == 0 {
48 fx_puts("FLIP-RED reason=component-plane-empty\n" as *u8)
49 sys_exit(FX_EXIT_REFUSED)
50 return FX_EXIT_REFUSED
51 }
52
53 var total: i64 = 0
54 var n_mand: i64 = 0
55 var mand_cov: i64 = 0
56 var elec_cov: i64 = 0
57 var i: i64 = 0
58 while i < nk {
59 let le: i64 = fx_line_end(bk, nk, i)
60 if le > i {
61 if fx_col(bk, i, le, FW_CK_CLASS, sp) == 1 {
62 if fx_slice_eqs(bk, sp[0], sp[1], cls) == 1 {
63 total = total + 1
64 let m: i64 = fx_col_atoi(bk, i, le, FW_CK_MAND, sp)
65 if m == 1 { n_mand = n_mand + 1 }
66 fx_col(bk, i, le, 0, cs)
67 var cov: i64 = 0
68 if have_deal == 1 { cov = fx_has_finding(bf, nf, deal, FW_CF_DEAL, FW_CF_COMP, bk, cs[0], cs[1], sp) }
69 if cov == 1 {
70 if m == 1 { mand_cov = mand_cov + 1 } else { elec_cov = elec_cov + 1 }
71 }
72 po = fx_bcat(pb, po, "ITEM " as *u8)
73 po = fx_bcatsl(pb, po, bk, cs[0], cs[1])
74 po = fx_bcat(pb, po, " " as *u8)
75 if fx_col(bk, i, le, FW_CK_NAME, sp) == 1 { po = fx_bcatsl(pb, po, bk, sp[0], sp[1]) }
76 if m == 1 { po = fx_bcat(pb, po, " MANDATORY" as *u8) } else { po = fx_bcat(pb, po, " elective" as *u8) }
77 if have_deal == 1 {
78 if cov == 1 { po = fx_bcat(pb, po, " COVERED" as *u8) } else {
79 if m == 1 { po = fx_bcat(pb, po, " **MISSING-MANDATORY**" as *u8) } else { po = fx_bcat(pb, po, " missing" as *u8) }
80 }
81 }
82 po = fx_bcat(pb, po, "\n" as *u8)
83 }
84 }
85 }
86 i = le + 1
87 }
88
89 if total == 0 {
90 fx_puts("FLIP-RED reason=unknown-asset-class class=" as *u8); fx_puts(cls); fx_puts("\n" as *u8)
91 sys_exit(FX_EXIT_REFUSED)
92 return FX_EXIT_REFUSED
93 }
94
95 fx_puts("FLIP-WORKLIST\n" as *u8)
96 fx_puts("class=" as *u8); fx_puts(cls)
97 if have_deal == 1 { fx_puts(" deal=" as *u8); fx_puts(deal) }
98 fx_puts("\n" as *u8)
99 fx_puts("components=" as *u8); fx_putn(total)
100 fx_puts(" mandatory=" as *u8); fx_putn(n_mand)
101 fx_puts(" mandatory_covered=" as *u8); fx_putn(mand_cov)
102 fx_puts(" missing_mandatory=" as *u8); fx_putn(n_mand - mand_cov)
103 fx_puts(" elective_covered=" as *u8); fx_putn(elec_cov)
104 fx_puts("\n" as *u8)
105 var ready: i64 = 0
106 if n_mand - mand_cov == 0 { ready = 1 }
107 fx_kv("ready_to_score" as *u8, ready)
108 sys_write(FX_OUT, pb, po)
109 sys_exit(0)
110 return 0
111}