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}