code wiki / _hdl_build / nx_deflate_fixed.nx
nx_deflate_fixed.nx source
↩ module page · 137 lines · 6674 B
1// nx_deflate_fixed.nx -- SOVEREIGN DEFLATE ENCODER (RFC1951 block type 1, fixed Huffman).
2// rung 1: literals + EOB (bit-packing proven vs our inflate). rung 2 (THIS): LZ77 back-references
3// = actual COMPRESSION. THE codec-exceed unlock (X-CDC-DEFLATE-ENC-001): the team owned inflate
4// (decode) but no compressor; now a sovereign same-corpus PNG/gzip-class baseline is measurable.
5// Self-validating: dfl_decode wraps our _inflate_lib inflate, so (dfl_encode,dfl_decode) is an
6// inverse pair the EARNED pe16 GATE_HARNESS gates (3rd rider) -- no external tool, no fabrication.
7//
8// Bit conventions (match _inflate_lib ibr/ihd EXACTLY): bitstream LSB-first per byte; Huffman codes
9// MSB-first; extra bits LSB-first. Fixed lit/len codes: sym 0-143->8b 0x30+s, 144-255->9b 0x190+,
10// 256-279->7b s-256, 280-287->8b 0xC0+(s-280). Fixed distance: 5-bit code = dist-symbol. Match
11// emission order (per icodes): length-code, length-extra, distance-code, distance-extra.
12// Greedy longest-match over a back-window (brute-force; correctness-first -- hash-chain speed = rung3).
13// LAWS: struct-free, integer-only, flat ifs, no &&/||, <=6 args. license_tier: ORIGINAL
14import "_inflate_lib_authored.nx"
15import "nx_syscalls.nx"
16const K_MAGIC_1025: i64 = 1025
17const K_MAGIC_1537: i64 = 1537
18const K_MAGIC_2049: i64 = 2049
19const K_MAGIC_3073: i64 = 3073
20const K_MAGIC_4097: i64 = 4097
21const K_MAGIC_6145: i64 = 6145
22const K_MAGIC_8193: i64 = 8193
23const K_MAGIC_12289: i64 = 12289
24const K_MAGIC_16385: i64 = 16385
25const K_MAGIC_24577: i64 = 24577
26const K_MAGIC_32768: i64 = 32768
27
28func dfl_putbit(out: *u8, bp: *i64, b: i64) -> i64 {
29 let pos: i64 = bp[0]
30 let byte: i64 = pos >> 3
31 let off: i64 = pos & 7
32 if off == 0 { out[byte] = 0 as u8 }
33 if b != 0 { out[byte] = ((out[byte] as i64) | (1 << off)) as u8 }
34 bp[0] = pos + 1
35 return 0
36}
37// Huffman code: MSB-first (the order ihd reads)
38func dfl_putcode(out: *u8, bp: *i64, code: i64, len: i64) -> i64 {
39 var i: i64 = len - 1
40 while i >= 0 { dfl_putbit(out, bp, (code >> i) & 1); i = i - 1 }
41 return 0
42}
43// extra bits: LSB-first (the order ibr reads)
44func dfl_putbits_lsb(out: *u8, bp: *i64, v: i64, k: i64) -> i64 {
45 var i: i64 = 0
46 while i < k { dfl_putbit(out, bp, (v >> i) & 1); i = i + 1 }
47 return 0
48}
49// length symbol: largest ls in 0..28 with lens[ls] <= L
50func dfl_lensym(L: i64, lens: *i64) -> i64 {
51 var ls: i64 = 28
52 while ls >= 0 { if lens[ls] <= L { return ls } ls = ls - 1 }
53 return 0
54}
55// distance symbol: largest ds in 0..29 with dists[ds] <= D
56func dfl_distsym(D: i64, dists: *i64) -> i64 {
57 var ds: i64 = 29
58 while ds >= 0 { if dists[ds] <= D { return ds } ds = ds - 1 }
59 return 0
60}
61// match length of src[a..] vs src[b..] (a<b=pos), capped at 258, bounded by n
62func dfl_matchlen(src: *u8, n: i64, a: i64, b: i64) -> i64 {
63 var k: i64 = 0
64 while k < 258 {
65 if b + k >= n { return k }
66 if src[a + k] != src[b + k] { return k }
67 k = k + 1
68 }
69 return k
70}
71// greedy longest match at pos within back-window -> res[0]=len res[1]=dist
72func dfl_match(src: *u8, n: i64, pos: i64, window: i64, res: *i64) -> i64 {
73 res[0] = 0
74 res[1] = 0
75 var start: i64 = pos - window
76 if start < 0 { start = 0 }
77 var best: i64 = 0
78 var bdist: i64 = 0
79 var j: i64 = pos - 1
80 while j >= start {
81 let ml: i64 = dfl_matchlen(src, n, j, pos)
82 if ml > best { best = ml; bdist = pos - j }
83 j = j - 1
84 }
85 res[0] = best
86 res[1] = bdist
87 return 0
88}
89
90func dfl_encode(src: *u8, n: i64, out: *u8, outcap: i64) -> i64 {
91 if n < 0 { return 0 - 11 }
92 let maxb: i64 = (3 + 9 * n + 7 + 7) / 8 + 2
93 if maxb > outcap { return 0 - 10 }
94 let lens: *i64 = sys_mmap(8 * 29) as *i64
95 lens[0]=3;lens[1]=4;lens[2]=5;lens[3]=6;lens[4]=7;lens[5]=8;lens[6]=9;lens[7]=10;lens[8]=11;lens[9]=13;lens[10]=15;lens[11]=17;lens[12]=19;lens[13]=23;lens[14]=27;lens[15]=31;lens[16]=35;lens[17]=43;lens[18]=51;lens[19]=59;lens[20]=67;lens[21]=83;lens[22]=99;lens[23]=115;lens[24]=131;lens[25]=163;lens[26]=195;lens[27]=227;lens[28]=258
96 let lext: *i64 = sys_mmap(8 * 29) as *i64
97 lext[0]=0;lext[1]=0;lext[2]=0;lext[3]=0;lext[4]=0;lext[5]=0;lext[6]=0;lext[7]=0;lext[8]=1;lext[9]=1;lext[10]=1;lext[11]=1;lext[12]=2;lext[13]=2;lext[14]=2;lext[15]=2;lext[16]=3;lext[17]=3;lext[18]=3;lext[19]=3;lext[20]=4;lext[21]=4;lext[22]=4;lext[23]=4;lext[24]=5;lext[25]=5;lext[26]=5;lext[27]=5;lext[28]=0
98 let dists: *i64 = sys_mmap(8 * 30) as *i64
99 dists[0]=1;dists[1]=2;dists[2]=3;dists[3]=4;dists[4]=5;dists[5]=7;dists[6]=9;dists[7]=13;dists[8]=17;dists[9]=25;dists[10]=33;dists[11]=49;dists[12]=65;dists[13]=97;dists[14]=129;dists[15]=193;dists[16]=257;dists[17]=385;dists[18]=513;dists[19]=769;dists[20]=K_MAGIC_1025;dists[21]=K_MAGIC_1537;dists[22]=K_MAGIC_2049;dists[23]=K_MAGIC_3073;dists[24]=K_MAGIC_4097;dists[25]=K_MAGIC_6145;dists[26]=K_MAGIC_8193;dists[27]=K_MAGIC_12289;dists[28]=K_MAGIC_16385;dists[29]=K_MAGIC_24577
100 let dext: *i64 = sys_mmap(8 * 30) as *i64
101 dext[0]=0;dext[1]=0;dext[2]=0;dext[3]=0;dext[4]=1;dext[5]=1;dext[6]=2;dext[7]=2;dext[8]=3;dext[9]=3;dext[10]=4;dext[11]=4;dext[12]=5;dext[13]=5;dext[14]=6;dext[15]=6;dext[16]=7;dext[17]=7;dext[18]=8;dext[19]=8;dext[20]=9;dext[21]=9;dext[22]=10;dext[23]=10;dext[24]=11;dext[25]=11;dext[26]=12;dext[27]=12;dext[28]=13;dext[29]=13
102 let bp: *i64 = sys_mmap(16) as *i64
103 bp[0] = 0
104 let res: *i64 = sys_mmap(16) as *i64
105 dfl_putbit(out, bp, 1) // BFINAL
106 dfl_putbit(out, bp, 1) // BTYPE bit0
107 dfl_putbit(out, bp, 0) // BTYPE bit1 -> 01 fixed
108 var i: i64 = 0
109 while i < n {
110 dfl_match(src, n, i, K_MAGIC_32768, res)
111 let mlen: i64 = res[0]
112 let mdist: i64 = res[1]
113 if mlen >= 3 {
114 let ls: i64 = dfl_lensym(mlen, lens)
115 let lsym: i64 = 257 + ls
116 if lsym <= 279 { dfl_putcode(out, bp, lsym - 256, 7) }
117 if lsym > 279 { dfl_putcode(out, bp, 192 + (lsym - 280), 8) }
118 dfl_putbits_lsb(out, bp, mlen - lens[ls], lext[ls])
119 let ds: i64 = dfl_distsym(mdist, dists)
120 dfl_putcode(out, bp, ds, 5)
121 dfl_putbits_lsb(out, bp, mdist - dists[ds], dext[ds])
122 i = i + mlen
123 }
124 if mlen < 3 {
125 let b: i64 = src[i] & 0xff
126 if b <= 143 { dfl_putcode(out, bp, 48 + b, 8) }
127 if b > 143 { dfl_putcode(out, bp, 400 + (b - 144), 9) }
128 i = i + 1
129 }
130 }
131 dfl_putcode(out, bp, 0, 7) // EOB
132 return (bp[0] + 7) >> 3
133}
134
135func dfl_decode(enc: *u8, m: i64, out: *u8, outcap: i64) -> i64 {
136 return inflate(enc, m, out)
137}