code wiki / _hdl_build / nx_relchan_gate.nx
nx_relchan_gate.nx source
↩ module page · 93 lines · 4719 B
1// nx_relchan_gate.nx -- proves + MEASURES the sovereign reliable/ordered/exactly-once event channel
2// (nx_relchan) over a LOSSY link (drops both events AND acks). Critical game events survive packet loss
3// without being lost or double-applied -- the correctness the position stream doesn't need but captures do.
4// 1) all N events delivered EXACTLY ONCE, IN ORDER, despite event+ack loss (converges via retransmit)
5// 2) idempotent (neg): replaying an already-delivered event delivers nothing more
6// 3) honest no-fake (neg): under TOTAL loss nothing is delivered (no fabricated delivery)
7// 4) ack advances the window: a cumulative ack stops retransmission of acked events
8// Built nx_cc_sovereign -> nxasm_x86 (no gcc, no .sh). license_tier: ORIGINAL
9import "nx_syscalls.nx"
10import "nx_gate_emit_lib.nx"
11import "nx_relchan.nx"
12
13func main() -> i64 {
14 g_puts("nx_relchan gate (sovereign reliable/ordered/exactly-once events over a lossy link)\n" as *u8)
15 var pass: i64 = 0; var total: i64 = 0
16
17 let N: i64 = 8
18 let CAP: i64 = 8
19 let r: *i64 = sys_mmap((2 + CAP) * 8) as *i64
20 let s: *i64 = sys_mmap(2 * 8) as *i64
21 rc_rinit(r, CAP)
22 rc_sinit(s, N)
23 let dord: *i64 = sys_mmap(N * 8) as *i64
24 var dc: i64 = 0
25 var txs: i64 = 0 // measured wire transmissions (incl. retransmits)
26
27 // 1) lossy convergence: drop events on ((tick*7+seq*3)%5==0); drop acks on (tick%4==0)
28 var tick: i64 = 0
29 var converged: i64 = 0
30 while tick < 80 {
31 if converged == 0 {
32 var seq: i64 = rc_unacked_lo(s) // resend the whole unacked window (go-back-N)
33 while seq < N {
34 txs = txs + 1
35 let drop: i64 = ((tick*7 + seq*3) % 5)
36 if drop != 0 { // survived the lossy link
37 let before: i64 = rc_expected(r)
38 let nd: i64 = rc_recv(r, CAP, seq)
39 var k: i64 = 0
40 while k < nd { dord[dc] = before + k; dc = dc + 1; k = k + 1 }
41 }
42 seq = seq + 1
43 }
44 let ackv: i64 = rc_ack_value(r)
45 if ackv >= 0 { if (tick % 4) != 0 { rc_ack(s, ackv) } } // some acks dropped
46 if rc_delivered(r) == N { converged = 1 }
47 }
48 tick = tick + 1
49 }
50 var r1: i64 = 1
51 if rc_delivered(r) != N { r1 = 0 }
52 if dc != N { r1 = 0 }
53 var i: i64 = 0
54 while i < N { if dord[i] != i { r1 = 0 } i = i + 1 } // strictly in order 0..N-1, each once
55 g_puts(" [measure] delivered " as *u8); g_pn(rc_delivered(r)); g_puts("/" as *u8); g_pn(N)
56 g_puts(" events exactly-once in-order over a lossy link; wire transmissions=" as *u8); g_pn(txs); g_puts("\n" as *u8)
57 pass = pass + g_check("all events delivered exactly-once, in order, despite loss" as *u8, r1); total=total+1
58
59 // 2) idempotent: replay an already-delivered event -> nothing more delivered
60 let dbefore: i64 = rc_delivered(r)
61 let nd_dup: i64 = rc_recv(r, CAP, 3)
62 pass = pass + g_check("idempotent: replay of a delivered event delivers nothing (neg)" as *u8, (nd_dup == 0) & (rc_delivered(r) == dbefore)); total=total+1
63
64 // 3) honest no-fake: total loss -> nothing delivered
65 let r2: *i64 = sys_mmap((2 + CAP) * 8) as *i64
66 let s2: *i64 = sys_mmap(2 * 8) as *i64
67 rc_rinit(r2, CAP); rc_sinit(s2, N)
68 var t2: i64 = 0
69 while t2 < 40 {
70 var seq: i64 = rc_unacked_lo(s2)
71 while seq < N { seq = seq + 1 } // ALL sends dropped (total-loss neg-control)
72 t2 = t2 + 1
73 }
74 pass = pass + g_check("honest: total loss -> 0 delivered (no fabricated delivery, neg)" as *u8, rc_delivered(r2) == 0); total=total+1
75
76 // 4) ack advances the window: after a cumulative ack, the unacked window starts past the acked events
77 let s3: *i64 = sys_mmap(2 * 8) as *i64
78 rc_sinit(s3, N)
79 let lo0: i64 = rc_unacked_lo(s3) // = 0
80 rc_ack(s3, 4) // peer confirms 0..4
81 let lo1: i64 = rc_unacked_lo(s3) // = 5
82 var r4: i64 = 1
83 if lo0 != 0 { r4 = 0 }
84 if lo1 != 5 { r4 = 0 }
85 if rc_all_acked(s3) == 1 { r4 = 0 } // not all yet (5,6,7 remain)
86 rc_ack(s3, 7)
87 if rc_all_acked(s3) != 1 { r4 = 0 } // now all acked
88 pass = pass + g_check("cumulative ack advances window + retires retransmits" as *u8, r4); total=total+1
89
90 g_puts("---- relchan gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8)
91 if pass == total { g_puts("verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
92 g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1
93}