code wiki / _hdl_build / nx_gassim_pack.nx

nx_gassim_pack.nx source

↩ module page · 83 lines · 4456 B

1import "nx_gate_gn.nx" 2import "nx_gate_base.nx" 3// nx_gassim_pack.nx -- SOVEREIGN build orchestrator for the browser gas sim: nx -> WAT -> WASM -> self-contained 4// HTML, entirely via the Nishi ecosystem (sys_fork/execve/wait4/dup3/openat/read_file). NO shell. Uses the GENERIC 5// nx_sim_page packager (title + description passed as args). CWD must be nxc2. license_tier: ORIGINAL expect_exit: 0 6import "nx_syscalls.nx" 7const K_MAGIC_2000: i64 = 2000 8 9func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw(" 10" as *u8); return ok } 11 12// spawn `path` with up to 4 args; if redir != 0, child stdout -> that file (truncating). returns child exit code. 13func spawn(path: *u8, a0: *u8, a1: *u8, a2: *u8, a3: *u8, redir: *u8) -> i64 { 14 let pid: i64 = sys_fork() 15 if pid == 0 { 16 if (redir as i64) != 0 { 17 let fd: i64 = sys_openat_wr(redir, 420) 18 if fd >= 0 { sys_dup3(fd, 1, 0) } 19 } else { 20 let dn: i64 = sys_openat_wr("/dev/null\x00" as *u8, 420) 21 if dn >= 0 { sys_dup3(dn, 2, 0) } 22 } 23 let argv: *i64 = sys_mmap(64) as *i64 24 var n: i64 = 0 25 argv[0] = path as i64; n = 1 26 if (a0 as i64) != 0 { argv[n] = a0 as i64; n = n + 1 } 27 if (a1 as i64) != 0 { argv[n] = a1 as i64; n = n + 1 } 28 if (a2 as i64) != 0 { argv[n] = a2 as i64; n = n + 1 } 29 if (a3 as i64) != 0 { argv[n] = a3 as i64; n = n + 1 } 30 argv[n] = 0 31 let envp: *i64 = sys_mmap(16) as *i64 32 envp[0] = "PATH=/usr/bin:/bin\x00" as *u8 as i64; envp[1] = 0 33 sys_execve(path, argv, envp) 34 sys_exit(127) 35 } 36 let st: *i64 = sys_mmap(16) as *i64 37 sys_wait4(pid, st, 0) 38 return (st[0] >> 8) & 0xff 39} 40func fsize(path: *u8) -> i64 { 41 let lp: *i64 = sys_mmap(8) as *i64; lp[0] = 0 42 let p: *u8 = sys_read_file(path, lp) 43 if (p as i64) == 0 { return -1 } 44 return lp[0] 45} 46 47func main() -> i64 { 48 gw("=== nx_gassim_pack: SOVEREIGN nx->wat->wasm->html via generic nx_sim_page (NO shell) ===\n") 49 let RUNNER: *u8 = "_offc/nx_sov_build_run.elf\x00" as *u8 50 let WAT_OUT: *u8 = "knowledge/nx_gassim.wat\x00" as *u8 51 let WASM_OUT: *u8 = "web_assets/nx_gassim.wasm\x00" as *u8 52 let HTML_OUT: *u8 = "knowledge/nx_gassim.html\x00" as *u8 53 let TITLE: *u8 = "Nishi Gas Lab -- kinetic-theory hard-disk gas (sovereign WASM, no float)\x00" as *u8 54 let DESC: *u8 = "N=20 equal-mass hard disks: exact elastic walls + pairwise elastic collisions. All start at ONE speed and thermalize, so a Maxwell-Boltzmann velocity distribution EMERGES (particles coloured by speed). Energy-conserving, validated by nx_gassim_gate.\x00" as *u8 55 56 gw(" [1] build sovereign tools via the runner...\n") 57 spawn(RUNNER, "nx_compile_wat\x00" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, "/dev/null\x00" as *u8) 58 spawn(RUNNER, "nx_wat_compiler\x00" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, "/dev/null\x00" as *u8) 59 spawn(RUNNER, "nx_sim_page\x00" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, "/dev/null\x00" as *u8) 60 61 gw(" [2] nx -> wat\n") 62 let c1: i64 = spawn("/tmp/nx_compile_wat.sov.elf\x00" as *u8, "runtime/nx_gassim.nx\x00" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, WAT_OUT) 63 gw(" rc="); gn(c1); gw(" wat_bytes="); gn(fsize(WAT_OUT)); gw("\n") 64 65 gw(" [3] wat -> wasm\n") 66 let c2: i64 = spawn("/tmp/nx_wat_compiler.sov.elf\x00" as *u8, WAT_OUT, WASM_OUT, 0 as *u8, 0 as *u8, 0 as *u8) 67 gw(" rc="); gn(c2); gw(" wasm_bytes="); gn(fsize(WASM_OUT)); gw("\n") 68 69 gw(" [4] wasm -> html (generic packager)\n") 70 let c3: i64 = spawn("/tmp/nx_sim_page.sov.elf\x00" as *u8, WASM_OUT, HTML_OUT, TITLE, DESC, 0 as *u8) 71 gw(" rc="); gn(c3); gw(" html_bytes="); gn(fsize(HTML_OUT)); gw("\n") 72 73 let wsz: i64 = fsize(WASM_OUT); let hsz: i64 = fsize(HTML_OUT) 74 let lp: *i64 = sys_mmap(8) as *i64; let wb: *u8 = sys_read_file(WASM_OUT, lp) 75 var magic_ok: i64 = 0 76 if (wb as i64) != 0 { if lp[0] >= 8 { if wb[0]==(0 as u8) { if wb[1]==(0x61 as u8) { if wb[2]==(0x73 as u8) { if wb[3]==(0x6d as u8) { magic_ok=1 } } } } } } 77 gw(" wasm magic OK="); gn(magic_ok); gw(" wasm="); gn(wsz); gw("B html="); gn(hsz); gw("B\n") 78 79 var ok: i64 = 0 80 if magic_ok==1 { if hsz>K_MAGIC_2000 { ok=1 } } 81 if ok==1 { gw("GASSIM-PACK GREEN: sovereign wasm+html built (Nishi all the way up, no shell)\n"); sys_exit(0); return 0 } 82 gw("GASSIM-PACK RED\n"); sys_exit(1); return 1 83}