code wiki / _hdl_build / nx_multsynth_test.nx

nx_multsynth_test.nx source

↩ module page · 47 lines · 2247 B

1// nx_multsynth_test.nx -- the team synthesizes a 2x2 MULTIPLIER from gates (Vedic/array 2// multiplier search space) and verifies each output bit EXACTLY over all 16 inputs. 3// Known answer: all 4 output bits synthesized + re-verified -> exit 0. 4 5import "nx_multsynth.nx" 6 7func ms_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 8func ms_num(v: i64) -> i64 { 9 let bb: *u8 = sys_mmap(28); var m: i64 = v; if m < 0 { m = 0 - m } 10 let t: *u8 = sys_mmap(28); var k: i64 = 0 11 if m == 0 { t[0] = 48; k = 1 } 12 while m > 0 { t[k] = 48 + (m % 10); m = m / 10; k = k + 1 } 13 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } 14 sys_write(1, bb, k); return 0 15} 16func tally(r: *i64, n: i64) -> i64 { var ec: i64 = 0; var i: i64 = 0; while i < n { if r[i] != 1 { if ec == 0 { ec = i + 1 } } i = i + 1 } return ec } 17 18func ms_bit(k: i64, r: *i64, total: *i64) -> i64 { 19 let op: *i64 = sys_mmap(8*16) as *i64; let a: *i64 = sys_mmap(8*16) as *i64; let b: *i64 = sys_mmap(8*16) as *i64 20 let tt: i64 = mult_tt(k) 21 let L: i64 = bl4_find(tt, op, a, b, 7) 22 var ok: i64 = 0; if L >= 0 { if bl4_reeval(op, a, b, L) == tt { ok = 1 } } 23 ms_puts(" p" as *u8); ms_num(k); ms_puts(" (out bit " as *u8); ms_num(k); ms_puts("): " as *u8); ms_num(L); ms_puts(" gates, exact-verified " as *u8); if ok == 1 { ms_puts("OK\n" as *u8) } else { ms_puts("FAIL\n" as *u8) } 24 total[0] = total[0] + L 25 r[k] = ok 26 return 0 27} 28 29func ms_main(r: *i64) -> i64 { 30 ms_puts("=== GATE-LEVEL search space: synthesize a 2x2 MULTIPLIER from gates (Vedic/array), exact-verified ===\n" as *u8) 31 let total: *i64 = sys_mmap(8) as *i64; total[0] = 0 32 ms_bit(0, r, total) 33 ms_bit(1, r, total) 34 ms_bit(2, r, total) 35 ms_bit(3, r, total) 36 ms_puts("----------------------------------------------------------------\n" as *u8) 37 ms_puts(" team synthesized a verified 2x2 multiplier in " as *u8); ms_num(total[0]); ms_puts(" total gates -- a new bits-up search space, no human picked the structure.\n" as *u8) 38 return 4 39} 40 41func main() -> i64 { 42 let r: *i64 = sys_mmap(8 * 8) as *i64 43 let n: i64 = ms_main(r) 44 let ec: i64 = tally(r, n) 45 sys_exit(ec) 46 return ec 47}