code wiki / _hdl_build / nx_pattern_emit16.nx
nx_pattern_emit16.nx source
↩ module page · 183 lines · 11268 B
1// nx_pattern_emit16.nx -- PATTERN EMITTER: GATE_HARNESS (round-trip / inverse-pair gate).
2// =====================================================================================
3// DECLARED-SCAFFOLD (operator-authorized 2026-06-13 via AskUserQuestion "do the scaffold (pe16)";
4// pe15 precedent; X-AUT-GATE-001). HAND-WRITTEN generic gate-compose primitive. DEBITED vs autonomy:
5// register row author=tutor, counted in A2 auth_all but NEVER auth_emit. BOOTSTRAP-PROVISIONAL until
6// >=2 downstream gates ride it hands-off FROM A DATA SPEC (X-AUT-NCF-BOOT).
7//
8// WHY A NEW SHAPE: existing emitters author ONE leaf parser/FSM over ONE buffer (no cross-organ
9// calls). A GATE must CALL TWO organs (encode + decode) + assert a ROUND-TRIP + a TAMPER arm = the
10// new compose control flow the transducer cannot synthesize.
11//
12// HONEST SCOPE (the oracle problem): a generic gate needs an ORACLE for "expected" -- that is WHY
13// gates are the frontier. Only SELF-VALIDATING inverse-pair (round-trip) gates need none
14// (decode(encode(x))==x; X-AUT-006f). pe16 authors ONLY those (codecs/serializers), NOT arbitrary
15// integration/benchmark gates (those still need per-gate oracles).
16//
17// ABI MODES (match the real Nishi codec ABI, verified vs nv1_lpc / frame_codec). The IMPORT module
18// and the FUNCTION PREFIX differ (nx_nv1_lpc exports nv1l_*; nx_frame_codec exports fc_*), so the
19// spec carries both:
20// mode 1 (1D, audio): <pfx>_encode(src, NSAMPLES, out, cap) ; <pfx>_decode(enc, m, out, cap) -> NSAMPLES
21// buffer bytes = NSAMPLES * bytes_per_sample. (nv1l: 16-bit -> bps=2)
22// mode 2 (2D, frame): <pfx>_encode(src, W, H, out, cap) ; <pfx>_decode(enc, m, out, cap) -> W*H
23// buffer bytes = W*H. (frame_codec: 8-bit pixels)
24// Authors <name>.nx :: <name>_check() -> i64 (1 iff round-trip bit-exact AND tamper-detected).
25// <name>_test.nx asserts <name>_check()==1. Test buffer = deterministic pattern (i*7+3)&255 (lossless
26// codecs round-trip ANY bytes). Tamper flips a payload byte (m/2, 255-x, no XOR) -> decode MUST differ
27// or change length, else RED.
28// Usage (scratch argv): nx_pattern_emit16 <name> <impmod> <fnpfx> <mode> <p1> <p2>
29// mode1: p1=nsamples p2=bytes_per_sample | mode2: p1=w p2=h
30// LAWS: struct-free, integer-only, flat ifs, no &&/||, <=6 args. license_tier: ORIGINAL (scaffold)
31import "nx_syscalls.nx"
32const K_MAGIC_65536: i64 = 65536
33const K_MAGIC_4096: i64 = 4096
34const K_MAGIC_8192: i64 = 8192
35const K_MAGIC_8191: i64 = 8191
36
37func q_atoi(s: *u8) -> i64 { var n: i64 = 0; var i: i64 = 0; while s[i] != (0 as u8) { if s[i] >= (48 as u8) { if s[i] <= (57 as u8) { n = n * 10 + ((s[i] as i64) - 48) } } i = i + 1 } return n }
38func q_cat(d: *u8, o: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { d[o + i] = s[i]; i = i + 1 } return o + i }
39func q_catn(d: *u8, o: i64, v: i64) -> i64 {
40 var oo: i64 = o
41 if v == 0 { d[oo] = 48 as u8; return oo + 1 }
42 var m: i64 = v
43 if m < 0 { d[oo] = 45 as u8; oo = oo + 1; m = 0 - m }
44 let t: *u8 = sys_mmap(28)
45 var k: i64 = 0
46 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
47 var i: i64 = 0
48 while i < k { d[oo + i] = t[k - 1 - i]; i = i + 1 }
49 return oo + k
50}
51func q_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
52func q_strcpy(d: *u8, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { d[i] = s[i]; i = i + 1 } d[i] = 0 as u8; return 0 }
53// SPEC MODE (X-AUT-GATE-001): a gate-spec is key/value lines; find "<key> <value>" -> copy value. 1 iff found.
54func pe16_spec_val(buf: *u8, n: i64, key: *u8, out: *u8, outcap: i64) -> i64 {
55 let kl: i64 = q_len(key)
56 var i: i64 = 0
57 while i < n {
58 var le: i64 = i
59 var s: i64 = 1
60 while s == 1 { if le >= n { s = 0 } else { if buf[le] == (10 as u8) { s = 0 } else { le = le + 1 } } }
61 if i + kl < le {
62 var mt: i64 = 1
63 var k: i64 = 0
64 while k < kl { if buf[i + k] != key[k] { mt = 0; k = kl } else { k = k + 1 } }
65 if mt == 1 { if buf[i + kl] == (32 as u8) {
66 var vs: i64 = i + kl + 1
67 var w: i64 = 0
68 while vs < le { if w < outcap - 1 { out[w] = buf[vs]; w = w + 1 } vs = vs + 1 }
69 out[w] = 0 as u8
70 return 1
71 } }
72 }
73 i = le + 1
74 }
75 return 0
76}
77func pe16_spec_int(buf: *u8, n: i64, key: *u8) -> i64 {
78 let tmp: *u8 = sys_mmap(32)
79 if pe16_spec_val(buf, n, key, tmp, 32) == 0 { return 0 }
80 return q_atoi(tmp)
81}
82
83// emit <name>.nx: <name>_check() composing <pfx>_encode/_decode (imported from impmod), round-trip
84// + tamper, ABI by mode. dims[0]=p1 dims[1]=p2 (packed to honor <=6-arg law).
85func pe16_emit_gate(fd: i64, name: *u8, impmod: *u8, pfx: *u8, mode: i64, dims: *i64) -> i64 {
86 let p1: i64 = dims[0]
87 let p2: i64 = dims[1]
88 let nb: i64 = p1 * p2
89 var decexp: i64 = nb
90 if mode == 1 { decexp = p1 }
91 let cap: i64 = nb * 4 + 64
92 let buf: *u8 = sys_mmap(K_MAGIC_65536)
93 var o: i64 = 0
94 o = q_cat(buf, o, "// AUTHORED BY THE NISHI BUILDER (pattern: GATE_HARNESS round-trip; declared-scaffold author=tutor) -- composes encode/decode, no Claude logic\n" as *u8)
95 o = q_cat(buf, o, "import \"" as *u8); o = q_cat(buf, o, impmod); o = q_cat(buf, o, ".nx\"\n" as *u8)
96 o = q_cat(buf, o, "import \"nx_syscalls.nx\"\n" as *u8)
97 o = q_cat(buf, o, "func " as *u8); o = q_cat(buf, o, name); o = q_cat(buf, o, "_check() -> i64 {\n" as *u8)
98 o = q_cat(buf, o, " let NB: i64 = " as *u8); o = q_catn(buf, o, nb); o = q_cat(buf, o, "\n" as *u8)
99 o = q_cat(buf, o, " let src: *u8 = sys_mmap(" as *u8); o = q_catn(buf, o, nb + 64); o = q_cat(buf, o, ")\n" as *u8)
100 o = q_cat(buf, o, " var i: i64 = 0\n while i < NB { src[i] = ((i * 7 + 3) & 255) as u8; i = i + 1 }\n" as *u8)
101 o = q_cat(buf, o, " let cap: i64 = " as *u8); o = q_catn(buf, o, cap); o = q_cat(buf, o, "\n" as *u8)
102 o = q_cat(buf, o, " let enc: *u8 = sys_mmap(" as *u8); o = q_catn(buf, o, cap + 64); o = q_cat(buf, o, ")\n" as *u8)
103 o = q_cat(buf, o, " let dec: *u8 = sys_mmap(" as *u8); o = q_catn(buf, o, nb + 64); o = q_cat(buf, o, ")\n" as *u8)
104 o = q_cat(buf, o, " let m: i64 = " as *u8); o = q_cat(buf, o, pfx); o = q_cat(buf, o, "_encode(src, " as *u8)
105 if mode == 1 { o = q_catn(buf, o, p1) }
106 if mode == 2 { o = q_catn(buf, o, p1); o = q_cat(buf, o, ", " as *u8); o = q_catn(buf, o, p2) }
107 o = q_cat(buf, o, ", enc, cap)\n" as *u8)
108 o = q_cat(buf, o, " var ok: i64 = 1\n" as *u8)
109 o = q_cat(buf, o, " if m <= 0 { ok = 0 }\n" as *u8)
110 o = q_cat(buf, o, " if m > 0 {\n" as *u8)
111 o = q_cat(buf, o, " let k: i64 = " as *u8); o = q_cat(buf, o, pfx); o = q_cat(buf, o, "_decode(enc, m, dec, " as *u8); o = q_catn(buf, o, nb + 64); o = q_cat(buf, o, ")\n" as *u8)
112 o = q_cat(buf, o, " if k != " as *u8); o = q_catn(buf, o, decexp); o = q_cat(buf, o, " { ok = 0 }\n" as *u8)
113 o = q_cat(buf, o, " var j: i64 = 0\n while j < NB { if dec[j] != src[j] { ok = 0 } j = j + 1 }\n" as *u8)
114 o = q_cat(buf, o, " if m >= 4 {\n" as *u8)
115 o = q_cat(buf, o, " let ti: i64 = m / 2\n" as *u8)
116 o = q_cat(buf, o, " enc[ti] = (255 - (enc[ti] & 255)) as u8\n" as *u8)
117 o = q_cat(buf, o, " let k2: i64 = " as *u8); o = q_cat(buf, o, pfx); o = q_cat(buf, o, "_decode(enc, m, dec, " as *u8); o = q_catn(buf, o, nb + 64); o = q_cat(buf, o, ")\n" as *u8)
118 o = q_cat(buf, o, " var same: i64 = 1\n" as *u8)
119 o = q_cat(buf, o, " if k2 != " as *u8); o = q_catn(buf, o, decexp); o = q_cat(buf, o, " { same = 0 }\n" as *u8)
120 o = q_cat(buf, o, " var t: i64 = 0\n while t < NB { if dec[t] != src[t] { same = 0 } t = t + 1 }\n" as *u8)
121 o = q_cat(buf, o, " if same == 1 { ok = 0 }\n" as *u8)
122 o = q_cat(buf, o, " }\n" as *u8)
123 o = q_cat(buf, o, " }\n" as *u8)
124 o = q_cat(buf, o, " return ok\n}\n" as *u8)
125 sys_write(fd, buf, o)
126 return 0
127}
128
129func pe16_emit_test(fd: i64, name: *u8) -> i64 {
130 let buf: *u8 = sys_mmap(K_MAGIC_4096)
131 var o: i64 = 0
132 o = q_cat(buf, o, "// AUTHORED BY THE NISHI BUILDER (GATE_HARNESS test) -- asserts the round-trip+tamper gate is GREEN\n" as *u8)
133 o = q_cat(buf, o, "import \"" as *u8); o = q_cat(buf, o, name); o = q_cat(buf, o, ".nx\"\nimport \"nx_syscalls.nx\"\n" as *u8)
134 o = q_cat(buf, o, "func main() -> i64 {\n" as *u8)
135 o = q_cat(buf, o, " if " as *u8); o = q_cat(buf, o, name); o = q_cat(buf, o, "_check() == 1 { sys_exit(0) }\n" as *u8)
136 o = q_cat(buf, o, " sys_exit(1)\n return 1\n}\n" as *u8)
137 sys_write(fd, buf, o)
138 return 0
139}
140
141func main(argc: i64, argv: *i64) -> i64 {
142 let name: *u8 = sys_mmap(128)
143 let impmod: *u8 = sys_mmap(128)
144 let pfx: *u8 = sys_mmap(64)
145 var mode: i64 = 0
146 let dims: *i64 = sys_mmap(32) as *i64
147 if argc == 2 {
148 // SPEC MODE (X-AUT-GATE-001): the team authors a gate from a DATA spec, hands-off.
149 let buf: *u8 = sys_mmap(K_MAGIC_8192)
150 let fd: i64 = sys_openat_rd(argv[1] as *u8)
151 if fd < 0 { let m0: *u8 = "pe16: spec not found\n" as *u8; sys_write(2, m0, q_len(m0)); return 2 }
152 var nn: i64 = 0
153 var r: i64 = sys_read(fd, buf, K_MAGIC_8191)
154 while r > 0 { nn = nn + r; r = sys_read(fd, buf + nn, K_MAGIC_8191 - nn) }
155 sys_close(fd)
156 if pe16_spec_val(buf, nn, "name" as *u8, name, 128) == 0 { let m1: *u8 = "pe16: spec missing name\n" as *u8; sys_write(2, m1, q_len(m1)); return 2 }
157 if pe16_spec_val(buf, nn, "impmod" as *u8, impmod, 128) == 0 { let m2: *u8 = "pe16: spec missing impmod\n" as *u8; sys_write(2, m2, q_len(m2)); return 2 }
158 if pe16_spec_val(buf, nn, "pfx" as *u8, pfx, 64) == 0 { let m3: *u8 = "pe16: spec missing pfx\n" as *u8; sys_write(2, m3, q_len(m3)); return 2 }
159 mode = pe16_spec_int(buf, nn, "mode" as *u8)
160 dims[0] = pe16_spec_int(buf, nn, "p1" as *u8)
161 dims[1] = pe16_spec_int(buf, nn, "p2" as *u8)
162 } else {
163 if argc < 7 { let mu: *u8 = "usage: pe16 <name> <impmod> <fnpfx> <mode> <p1> <p2> OR pe16 <gate.spec>\n" as *u8; sys_write(2, mu, q_len(mu)); return 2 }
164 q_strcpy(name, argv[1] as *u8)
165 q_strcpy(impmod, argv[2] as *u8)
166 q_strcpy(pfx, argv[3] as *u8)
167 mode = q_atoi(argv[4] as *u8)
168 dims[0] = q_atoi(argv[5] as *u8)
169 dims[1] = q_atoi(argv[6] as *u8)
170 }
171 if mode < 1 { return 2 }
172 if mode > 2 { return 2 }
173 let mp: *u8 = sys_mmap(512); var o: i64 = 0
174 o = q_cat(mp, 0, "runtime/_hdl_build/" as *u8); o = q_cat(mp, o, name); o = q_cat(mp, o, ".nx" as *u8); mp[o] = 0 as u8
175 let tp: *u8 = sys_mmap(512); o = 0
176 o = q_cat(tp, 0, "runtime/_hdl_build/" as *u8); o = q_cat(tp, o, name); o = q_cat(tp, o, "_test.nx" as *u8); tp[o] = 0 as u8
177 let mf: i64 = sys_openat_wr(mp, 420); if mf < 0 { return 1 }
178 pe16_emit_gate(mf, name, impmod, pfx, mode, dims); sys_close(mf)
179 let tf: i64 = sys_openat_wr(tp, 420); if tf < 0 { return 1 }
180 pe16_emit_test(tf, name); sys_close(tf)
181 sys_write(1, "PE16 emitted gate+test\n" as *u8, 23)
182 return 0
183}