code wiki / _hdl_build / nx_lockstep_gate.nx
nx_lockstep_gate.nx source
↩ module page · 70 lines · 3297 B
1// nx_lockstep_gate.nx -- proves N-R2 deterministic lockstep + desync detection. Two "clients" run the
2// SAME input stream and must stay checksum-identical every tick (lockstep). A fresh re-run must reproduce
3// the exact final checksum (determinism). NEG-CONTROL: perturb ONE client's input at one tick -> the
4// checksums MUST diverge (desync detected) -- if they didn't, the detector would be useless. GREEN only
5// if all hold. license_tier: ORIGINAL expect_exit: 0
6import "nx_syscalls.nx"
7import "nx_lockstep.nx"
8
9func lw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
10func ln(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" 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(1,bb,k); return 0 }
11
12func zero(s: *i64, n: i64) -> i64 { var i: i64=0; while i<n { s[i]=0; i=i+1 } return 0 }
13
14func main() -> i64 {
15 let K: i64 = 4
16 let SN: i64 = 8 // 2*K
17 let NT: i64 = 8
18 let inputs: *i64 = sys_mmap(8 * 8) as *i64
19 inputs[0]=3; inputs[1]=1; inputs[2]=4; inputs[3]=1; inputs[4]=5; inputs[5]=9; inputs[6]=2; inputs[7]=6
20
21 let a: *i64 = sys_mmap(8 * 8) as *i64
22 let b: *i64 = sys_mmap(8 * 8) as *i64
23 zero(a, SN); zero(b, SN)
24
25 var pass: i64 = 0
26 var total: i64 = 0
27
28 // ---- LOCKSTEP: two clients, same inputs, checksum-identical EVERY tick ----
29 var tickmatch: i64 = 1
30 var t: i64 = 0
31 while t < NT {
32 ls_update(a, K, inputs[t])
33 ls_update(b, K, inputs[t])
34 if ls_checksum(a, SN) != ls_checksum(b, SN) { tickmatch = 0 }
35 t = t + 1
36 }
37 total=total+1; if tickmatch==1 { pass=pass+1 } else { lw("L1 FAIL clients diverged under identical inputs\n") }
38
39 // ---- DETERMINISM: a fresh re-run reproduces the exact final checksum ----
40 let c: *i64 = sys_mmap(8 * 8) as *i64
41 zero(c, SN)
42 let csum: i64 = ls_run(c, K, inputs, NT)
43 total=total+1; if csum == ls_checksum(a, SN) { pass=pass+1 } else { lw("L2 FAIL not reproducible\n") }
44
45 // ---- DESYNC NEG-CONTROL: perturb client B's input at tick 3 -> checksums MUST diverge ----
46 let d: *i64 = sys_mmap(8 * 8) as *i64
47 let e: *i64 = sys_mmap(8 * 8) as *i64
48 zero(d, SN); zero(e, SN)
49 var t2: i64 = 0
50 while t2 < NT {
51 ls_update(d, K, inputs[t2])
52 var ein: i64 = inputs[t2]
53 if t2 == 3 { ein = ein + 1 } // ONE different input on client E
54 ls_update(e, K, ein)
55 t2 = t2 + 1
56 }
57 total=total+1; if ls_checksum(d, SN) != ls_checksum(e, SN) { pass=pass+1 } else { lw("L3 FAIL desync NOT detected (detector useless)\n") }
58
59 // ---- and a clean run with the SAME inputs as d must MATCH d (desync only from the perturbation) ----
60 let f: *i64 = sys_mmap(8 * 8) as *i64
61 zero(f, SN)
62 let fcsum: i64 = ls_run(f, K, inputs, NT)
63 total=total+1; if fcsum == ls_checksum(d, SN) { pass=pass+1 } else { lw("L4 FAIL clean run mismatch\n") }
64
65 lw("LOCKSTEP "); ln(pass); lw("/"); ln(total)
66 lw(" final_checksum="); ln(csum); lw("\n")
67 if pass == total { lw("LOCKSTEP ALL-PASS (lockstep determinism + reproducible + desync detected)\n"); sys_exit(0) }
68 sys_exit(1)
69 return 1
70}