code wiki / _hdl_build / _f64_gate_authored.nx
_f64_gate_authored.nx source
↩ module page · 104 lines · 3531 B
1// _f64_gate_authored.nx -- ME0 gate: nx_f64 family vs hardware-IEEE oracle.
2//
3// Re-runnable evidence gate (evidence-driven-live-grading law):
4// 1217 KAT vectors generated by _f64_oracle_gen.py from THIS machine's
5// IEEE 754 hardware doubles -> _f64_kat_vectors.nx. Every nx_f64 op must
6// reproduce the oracle bit pattern EXACTLY (no ULP tolerance: binary64
7// add/sub/mul/div/sqrt/cvt are correctly-rounded operations, so the only
8// passing grade is bit-identical).
9//
10// Verdict markers (judge output, never $?):
11// F64-BAD i=<n> op=<k> a=<hex> b=<hex> exp=<hex> got=<hex> per miss
12// F64-KAT total=<n> ok=<n> bad=<n>
13// F64-GATE verdict=GREEN|RED
14// Exit code = capped bad count (visible in nx_sov_build_run's run-exit).
15
16import "nx_syscalls.nx"
17import "nx_f64.nx"
18import "nx_f64_div.nx"
19import "nx_f64_sqrt.nx"
20import "nx_f64_cvt.nx"
21import "_f64_kat_vectors.nx"
22
23func f6g_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
24
25func f6g_putn(v: i64) -> i64 {
26 let bb: *u8 = sys_mmap(28)
27 var m: i64 = v
28 if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) }
29 let t: *u8 = sys_mmap(28)
30 var k: i64 = 0
31 if m == 0 { t[0] = 48; k = 1 }
32 while m > 0 { t[k] = 48 + (m % 10); m = m / 10; k = k + 1 }
33 var i: i64 = 0
34 while i < k { bb[i] = t[k-1-i]; i = i + 1 }
35 sys_write(1, bb, k)
36 return 0
37}
38
39// 16-nibble hex print, sign-bit safe (no negation; mask nibbles directly).
40func f6g_puthex(v: i64) -> i64 {
41 let bb: *u8 = sys_mmap(20)
42 var i: i64 = 0
43 while i < 16 {
44 let nib: i64 = (v >> ((15 - i) * 4)) & 15
45 if nib < 10 { bb[i] = 48 + nib } else { bb[i] = 55 + nib } // 0-9, A-F
46 i = i + 1
47 }
48 sys_write(1, bb, 16)
49 return 0
50}
51
52func main() -> i64 {
53 let ops: *i64 = sys_mmap(8 * 1400) as *i64
54 let av: *i64 = sys_mmap(8 * 1400) as *i64
55 let bv: *i64 = sys_mmap(8 * 1400) as *i64
56 let ev: *i64 = sys_mmap(8 * 1400) as *i64
57 let n: i64 = f64_kat_fill_all(ops, av, bv, ev)
58
59 var ok: i64 = 0
60 var bad: i64 = 0
61 var i: i64 = 0
62 while i < n {
63 let op: i64 = ops[i]
64 let a: i64 = av[i]
65 let b: i64 = bv[i]
66 var got: i64 = -1
67 if op == 1 { got = nx_f64_add(a, b) }
68 if op == 2 { got = nx_f64_sub(a, b) }
69 if op == 3 { got = nx_f64_mul(a, b) }
70 if op == 4 { got = nx_f64_div(a, b) }
71 if op == 5 { got = nx_f64_sqrt(a) }
72 if op == 6 { got = nx_f64_eq(a, b) }
73 if op == 7 { got = nx_f64_lt(a, b) }
74 if op == 8 { got = nx_i64_to_f64(a) }
75 if op == 9 { got = nx_f64_to_f32(a) }
76 if got == ev[i] {
77 ok = ok + 1
78 } else {
79 bad = bad + 1
80 if bad <= 40 {
81 f6g_puts("F64-BAD i=" as *u8); f6g_putn(i)
82 f6g_puts(" op=" as *u8); f6g_putn(op)
83 f6g_puts(" a=" as *u8); f6g_puthex(a)
84 f6g_puts(" b=" as *u8); f6g_puthex(b)
85 f6g_puts(" exp=" as *u8); f6g_puthex(ev[i])
86 f6g_puts(" got=" as *u8); f6g_puthex(got)
87 f6g_puts("\n" as *u8)
88 }
89 }
90 i = i + 1
91 }
92
93 f6g_puts("F64-KAT total=" as *u8); f6g_putn(n)
94 f6g_puts(" ok=" as *u8); f6g_putn(ok)
95 f6g_puts(" bad=" as *u8); f6g_putn(bad)
96 f6g_puts("\n" as *u8)
97 if bad == 0 {
98 f6g_puts("F64-GATE verdict=GREEN\n" as *u8)
99 return 0
100 }
101 f6g_puts("F64-GATE verdict=RED\n" as *u8)
102 if bad > 100 { return 100 }
103 return bad
104}