code wiki / _hdl_build / nx_vc_fec_gate.nx

nx_vc_fec_gate.nx source

↩ module page · 104 lines · 4740 B

1// nx_vc_fec_gate.nx -- native cross-gate for the RS-FEC engine now IN the video client core 2// (vc_fec_init/encode/decode, k=8 m=2, caller-provided regions -- the FEC-LIVE prerequisite). 3// Mirrors the proven nx_room_fec gate honesty on the CORE's implementation: 4// T1 systematic (first k*S of shards == data) T2 EXHAUSTIVE: every 2-erasure pattern of 5// C(10,2)=45 recovers a JPEG-like frame byte-exact T3 over-bound: 3 erasures MUST fail (-1) 6// T4 tamper: a corrupted generator entry MUST break recovery (matrix is load-bearing) 7// Evidence -> knowledge/status/vc_fec.log. expect_exit: 0 license_tier: ORIGINAL 8import "nx_syscalls.nx" 9import "nx_video_client_wasm.nx" 10 11const VF_LOG: *u8 = "knowledge/status/vc_fec.log" 12 13func gw(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 } 14func gwn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(fd,"-" as *u8,1)} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1} sys_write(fd,bb,k); return 0 } 15 16func main() -> i64 { 17 gw(1, "=== nx_vc_fec_gate: RS-FEC in the CORE (k=8 m=2) -- exhaustive erasure proof ===\n") 18 let k: i64 = 8 19 let m: i64 = 2 20 let n: i64 = k + m 21 let S: i64 = 1500 // MTU-ish shard: a ~12KB JPEG frame -> 8 x 1500 22 let tbl: *i64 = sys_mmap(8 * 900) as *i64 23 let rn: i64 = vc_fec_init(tbl) 24 var ok: i64 = 1 25 if rn != n { ok = 0 } 26 27 // JPEG-like frame: deterministic byte pattern with structure + noise 28 let data: *u8 = sys_mmap(k * S + 64) 29 var i: i64 = 0 30 while i < k * S { data[i] = ((i * 31 + (i / 97) * 7 + 145) & 255) as u8; i = i + 1 } 31 let shards: *u8 = sys_mmap(n * S + 64) 32 vc_fec_encode(tbl, data, shards, S) 33 34 // T1 systematic 35 var t1: i64 = 1 36 i = 0 37 while i < k * S { if shards[i] != data[i] { t1 = 0; i = k * S } else { i = i + 1 } } 38 gw(1, " T1 systematic first-k==data: "); gwn(1, t1); gw(1, "\n") 39 if t1 != 1 { ok = 0 } 40 41 // T2 exhaustive: every 2-erasure pattern recovers byte-exact 42 let erased: *i64 = sys_mmap(8 * n) as *i64 43 let out: *u8 = sys_mmap(k * S + 64) 44 let scrA: *i64 = sys_mmap(8 * k * k) as *i64 45 var recovered: i64 = 0 46 var patterns: i64 = 0 47 var a: i64 = 0 48 while a < n { 49 var b: i64 = a + 1 50 while b < n { 51 patterns = patterns + 1 52 var z: i64 = 0 53 while z < n { erased[z] = 0; z = z + 1 } 54 erased[a] = 1 55 erased[b] = 1 56 let rc: i64 = vc_fec_decode(tbl, shards, erased, out, S, scrA) 57 if rc == 0 { 58 var same: i64 = 1 59 var q: i64 = 0 60 while q < k * S { if out[q] != data[q] { same = 0; q = k * S } else { q = q + 1 } } 61 if same == 1 { recovered = recovered + 1 } 62 } 63 b = b + 1 64 } 65 a = a + 1 66 } 67 gw(1, " T2 exhaustive 2-erasure: recovered="); gwn(1, recovered); gw(1, "/"); gwn(1, patterns); gw(1, " byte-exact\n") 68 if recovered != patterns { ok = 0 } 69 if patterns != 45 { ok = 0 } 70 71 // T3 over-bound: 3 erasures must FAIL honestly 72 var z2: i64 = 0 73 while z2 < n { erased[z2] = 0; z2 = z2 + 1 } 74 erased[0]=1; erased[1]=1; erased[2]=1 75 let rc3: i64 = vc_fec_decode(tbl, shards, erased, out, S, scrA) 76 var t3: i64 = 0 77 if rc3 == (0 - 1) { t3 = 1 } 78 gw(1, " T3 over-bound 3-loss rc="); gwn(1, rc3); gw(1, " (must be -1): "); gwn(1, t3); gw(1, "\n") 79 if t3 != 1 { ok = 0 } 80 81 // T4 tamper: corrupt a Cauchy entry -> a 2-erasure recovery needing parity must break 82 tbl[768 + k*k + 0] = tbl[768 + k*k + 0] ^ 1 83 var z3: i64 = 0 84 while z3 < n { erased[z3] = 0; z3 = z3 + 1 } 85 erased[0]=1; erased[1]=1 // two data shards lost -> parity rows load-bearing 86 vc_fec_decode(tbl, shards, erased, out, S, scrA) 87 var t4: i64 = 0 88 var q2: i64 = 0 89 while q2 < k * S { if out[q2] != data[q2] { t4 = 1; q2 = k * S } else { q2 = q2 + 1 } } 90 gw(1, " T4 tampered-matrix breaks recovery: "); gwn(1, t4); gw(1, "\n") 91 if t4 != 1 { ok = 0 } 92 93 gw(1, "VC-FEC-GATE k=8 m=2 S=1500 patterns=45 recovered="); gwn(1, recovered) 94 if ok==1 { gw(1, " verdict=GREEN\n") } else { gw(1, " verdict=RED\n") } 95 let lf: i64 = sys_openat_append(VF_LOG, 420) 96 if lf >= 0 { 97 gw(lf, "VCFECGATE k=8 m=2 S=1500 patterns=45 recovered="); gwn(lf, recovered) 98 gw(lf, " overbound="); gwn(lf, t3); gw(lf, " tamper="); gwn(lf, t4) 99 if ok==1 { gw(lf, " verdict=GREEN\n") } else { gw(lf, " verdict=RED\n") } 100 sys_close(lf) 101 } 102 if ok==1 { return 0 } 103 return 1 104}