@gasm-compiler/core 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +17 -0
- package/README.md +69 -2
- package/dist/browser.d.ts +2 -2
- package/dist/browser.js +7 -7
- package/dist/chunk-NQJKL2KQ.js +9 -0
- package/dist/chunk-R6SXLNEJ.js +5 -0
- package/dist/compiler.js +1 -1
- package/dist/{error_codes-D6RsiZ33.d.ts → error_codes-Cdy_3FNo.d.ts} +27 -13
- package/dist/gasm_core_rs.wasm +0 -0
- package/dist/mod.d.ts +89 -3
- package/dist/mod.js +1 -1
- package/package.json +11 -12
- package/dist/chunk-PS4NV6ZB.js +0 -5
- package/dist/chunk-VSCQDCQR.js +0 -9
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{A as ye,B as be,C as Se,G as H,H as L,I as K,J as X,K as Y,L as Q,M as ee,a as I,c as O,d as B,e as z,f as P,g as q,h as j,j as Z,k as J,n as ue,p as le,q as de,r as fe,s as me,t as pe,y as ge,z as he}from"./chunk-R6SXLNEJ.js";import{a as h}from"./chunk-STDXBN5E.js";import{resolve as Le}from"node:path";import{stat as Ne,readFile as Pt,writeFile as Lt,unlink as Nt,mkdir as Ut}from"node:fs/promises";import{spawn as Ft}from"node:child_process";import{dirname as Tt}from"node:path";function we(e){let t=e.functions.map(n=>!("parallelLoopInfo"in n)||!n.parallelLoopInfo?n:Te(n));return{...e,functions:t}}function Te(e){let t=e.parallelLoopInfo.loopLocalIndex,{writes:n}=qe(e.body,t);if(n>0){let r=A(e.body,t);return{...e,body:r}}return e}function qe(e,t){let n=0,r=0;function o(s){switch(s.kind){case"simple":if(s.instructions)for(let i of s.instructions)i.opcode==="local.get"&&i.immediates?.[0]===t&&n++,(i.opcode==="local.set"||i.opcode==="local.tee")&&i.immediates?.[0]===t&&r++;break;case"block":for(let i of s.children)o(i);break;case"loop":o(s.body);break;case"if":o(s.thenBranch),s.elseBranch&&o(s.elseBranch);break;case"parallel_loop":o(s.body),s.epilogue&&o(s.epilogue);break;case"return":case"break":case"continue":break}}return o(e),{reads:n,writes:r}}function A(e,t){switch(e.kind){case"simple":{if(!e.instructions)return e;let n=e.instructions.filter(r=>!((r.opcode==="local.set"||r.opcode==="local.tee")&&r.immediates?.[0]===t));return n.length===0?{kind:"block",children:[]}:{...e,instructions:n}}case"block":{let n=e.children.map(r=>A(r,t)).filter(r=>!je(r));return{...e,children:n}}case"loop":return{...e,body:A(e.body,t)};case"if":return{...e,thenBranch:A(e.thenBranch,t),elseBranch:e.elseBranch?A(e.elseBranch,t):void 0};case"parallel_loop":return{...e,body:A(e.body,t),epilogue:e.epilogue?A(e.epilogue,t):void 0};case"return":case"break":case"continue":return e}}function je(e){return e.kind==="block"&&e.children.length===0||e.kind==="simple"&&(!e.instructions||e.instructions.length===0)}function Ie(e){let t=e.functions.map(n=>Ze(n));return{...e,functions:t}}function Ze(e){let t=E(e.body,e);return{...e,body:t}}function E(e,t){switch(e.kind){case"loop":{let n=Je(e.body),r=[],o=ve(e.body,n,r,t);return r.length===0?{...e,body:E(e.body,t)}:{kind:"block",children:[{kind:"simple",instructions:r},{...e,body:E(o,t)}],label:void 0}}case"block":return{...e,children:e.children.map(n=>E(n,t))};case"if":return{...e,thenBranch:E(e.thenBranch,t),elseBranch:e.elseBranch?E(e.elseBranch,t):void 0};case"simple":return e;default:return e}}function Je(e){let t=new Set;function n(r){if(r.kind==="simple"&&r.instructions){for(let o of r.instructions)if(o.id!==void 0&&t.add(o.id),(o.opcode==="local.set"||o.opcode==="local.tee")&&o.immediates){let s=o.immediates[0];t.add(-s-1)}}r.kind==="block"&&r.children.forEach(n),r.kind==="loop"&&n(r.body),r.kind==="if"&&(n(r.thenBranch),r.elseBranch&&n(r.elseBranch))}return n(e),t}function ve(e,t,n,r){switch(e.kind){case"simple":{if(!e.instructions||e.instructions.length===0)return e;let o=[],s=new Set;for(let i of e.instructions)He(i,t,s)?(n.push(i),i.id!==void 0&&s.add(i.id)):(o.push(i),i.id!==void 0&&s.add(i.id));return{...e,instructions:o}}case"block":{let o=e.children.map(s=>ve(s,t,n,r));return{...e,children:o}}case"loop":return e;case"if":return e;default:return e}}function He(e,t,n){if(!Ke(e.opcode))return!1;if(e.opcode==="local.get"&&e.immediates){let o=-e.immediates[0]-1;if(t.has(o))return!1}if(e.args){for(let r of e.args)if(t.has(r))return!1}return!0}function Ke(e){return new Set(["i32.const","i64.const","f32.const","f64.const","local.get","i32.add","i32.sub","i32.mul","i32.div_s","i32.div_u","i32.rem_s","i32.rem_u","i64.add","i64.sub","i64.mul","i64.div_s","i64.div_u","i64.rem_s","i64.rem_u","f32.add","f32.sub","f32.mul","f32.div","f64.add","f64.sub","f64.mul","f64.div","i32.and","i32.or","i32.xor","i32.shl","i32.shr_s","i32.shr_u","i32.rotl","i32.rotr","i64.and","i64.or","i64.xor","i64.shl","i64.shr_s","i64.shr_u","i64.rotl","i64.rotr","i32.eqz","i32.eq","i32.ne","i32.lt_s","i32.lt_u","i32.gt_s","i32.gt_u","i32.le_s","i32.le_u","i32.ge_s","i32.ge_u","i64.eqz","i64.eq","i64.ne","i64.lt_s","i64.lt_u","i64.gt_s","i64.gt_u","i64.le_s","i64.le_u","i64.ge_s","i64.ge_u","f32.eq","f32.ne","f32.lt","f32.gt","f32.le","f32.ge","f64.eq","f64.ne","f64.lt","f64.gt","f64.le","f64.ge","i32.wrap_i64","i64.extend_i32_s","i64.extend_i32_u","f32.convert_i32_s","f32.convert_i32_u","f32.convert_i64_s","f32.convert_i64_u","f32.demote_f64","f64.convert_i32_s","f64.convert_i32_u","f64.convert_i64_s","f64.convert_i64_u","f64.promote_f32","i32.reinterpret_f32","i64.reinterpret_f64","f32.reinterpret_i32","f64.reinterpret_i64","i32.clz","i32.ctz","i32.popcnt","i64.clz","i64.ctz","i64.popcnt","f32.abs","f32.neg","f32.ceil","f32.floor","f32.trunc","f32.nearest","f32.sqrt","f64.abs","f64.neg","f64.ceil","f64.floor","f64.trunc","f64.nearest","f64.sqrt","f32.min","f32.max","f32.copysign","f64.min","f64.max","f64.copysign"]).has(e)}function ke(e){for(let t of e.functions)Xe(t);return e}function Xe(e){$(e.body,e)}function $(e,t){switch(e.kind){case"simple":Ye(e,t);break;case"block":for(let n of e.children)$(n,t);break;case"loop":$(e.body,t);break;case"if":$(e.thenBranch,t),e.elseBranch&&$(e.elseBranch,t);break;case"parallel_loop":$(e.body,t),e.epilogue&&$(e.epilogue,t);break}}function Ye(e,t){let n=tt(e.instructions,t);n.length>0&&rt(e,t,n);let r=nt(e.instructions,t);r.length>0&&ot(e,t,r)}function xe(e,t){let n=U(e,t);if(!n)return null;if(n.opcode==="i32.shr_u"&&n.args.length===2){if(N(n.args[1],t)!==2)return null;let o=n.args[0];return Qe(o,t)}return et(e,t)}function Qe(e,t){let n=U(e,t);if(!n)return{baseVar:e,wordOffset:0};if(n.opcode==="i32.add"&&n.args.length===2){let r=N(n.args[1],t);if(r!==null&&r>=0&&r%4===0)return{baseVar:n.args[0],wordOffset:r/4};let o=N(n.args[0],t);return o!==null&&o>=0&&o%4===0?{baseVar:n.args[1],wordOffset:o/4}:null}return{baseVar:e,wordOffset:0}}function et(e,t){let n=U(e,t);if(!n)return{baseVar:e,wordOffset:0};if(n.opcode==="i32.add"&&n.args.length===2){let r=N(n.args[1],t);if(r!==null&&r>=0)return{baseVar:n.args[0],wordOffset:r}}return{baseVar:e,wordOffset:0}}function U(e,t){if(t.inlinedExpressionMap){let n=t.inlinedExpressionMap.get(e);if(n)return n}return C(t.body,e)}function C(e,t){switch(e.kind){case"simple":for(let n of e.instructions)if(n.id===t)return n;return null;case"block":for(let n of e.children){let r=C(n,t);if(r)return r}return null;case"loop":return C(e.body,t);case"if":{let n=C(e.thenBranch,t);return n||(e.elseBranch?C(e.elseBranch,t):null)}case"parallel_loop":{let n=C(e.body,t);return n||(e.epilogue?C(e.epilogue,t):null)}default:return null}}function N(e,t){let n=U(e,t);return n&&n.opcode==="i32.const"&&n.immediates&&n.immediates.length>0?n.immediates[0]:null}function tt(e,t){let n=[],r=[];for(let s=0;s<e.length;s++){let i=e[s];if(i.opcode==="wgsl.store_f32"&&i.args.length===2){let a=xe(i.args[0],t);a&&r.push({index:s,addr:a,valueArg:i.args[1]})}}let o=new Map;for(let s of r){let i=o.get(s.addr.baseVar)||[];i.push(s),o.set(s.addr.baseVar,i)}for(let[s,i]of o){if(i.length<3)continue;i.sort((c,u)=>c.addr.wordOffset-u.addr.wordOffset);let a=0;for(;a<i.length;){let c=a;for(;c+1<i.length&&i[c+1].addr.wordOffset===i[c].addr.wordOffset+1;)c++;let u=c-a+1;if(u>=3){let m=u>=4?4:3,d=i.slice(a,a+m),l=d.map(p=>p.index);Me(l,e)&&n.push({instrIndices:l,baseVar:s,valueArgs:d.map(p=>p.valueArg),components:m})}a=c+1}}return n}function nt(e,t){let n=[],r=[];for(let s=0;s<e.length;s++){let i=e[s];if(i.opcode==="wgsl.load_f32"&&i.args.length===1&&i.id!==void 0){let a=xe(i.args[0],t);a&&r.push({index:s,addr:a,resultVar:i.id})}}let o=new Map;for(let s of r){let i=o.get(s.addr.baseVar)||[];i.push(s),o.set(s.addr.baseVar,i)}for(let[s,i]of o){if(i.length<3)continue;i.sort((c,u)=>c.addr.wordOffset-u.addr.wordOffset);let a=0;for(;a<i.length;){let c=a;for(;c+1<i.length&&i[c+1].addr.wordOffset===i[c].addr.wordOffset+1;)c++;let u=c-a+1;if(u>=3){let m=u>=4?4:3,d=i.slice(a,a+m),l=d.map(p=>p.index);Me(l,e)&&n.push({instrIndices:l,baseVar:s,resultVars:d.map(p=>p.resultVar),components:m})}a=c+1}}return n}function Me(e,t){if(e.length<3)return!1;let n=Math.min(...e),r=Math.max(...e),o=e.length*4;if(r-n>=o)return!1;for(let s=n;s<=r;s++)if(t[s].opcode.startsWith("wgsl.store")&&!e.includes(s))return!1;return!0}function rt(e,t,n){n.sort((r,o)=>o.instrIndices[0]-r.instrIndices[0]);for(let r of n){let o=r.components===4?"wgsl.store_vec4f":"wgsl.store_vec3f",s=e.instructions[r.instrIndices[0]].args[0],i={type:"instr",opcode:o,args:[s,...r.valueArgs],synthetic:!0},a=[...r.instrIndices].sort((c,u)=>c-u);for(let c=a.length-1;c>=0;c--)e.instructions.splice(a[c],1);e.instructions.splice(a[0],0,i)}}function ot(e,t,n){n.sort((r,o)=>o.instrIndices[0]-r.instrIndices[0]);for(let r of n){let o=r.components===4?"wgsl.load_vec4f":"wgsl.load_vec3f",s=0;for(let d of t.vars.keys())d>s&&(s=d);let i=s+1;t.vars.set(i,{id:i,type:"v128"});let a=e.instructions[r.instrIndices[0]].args[0],c={type:"instr",id:i,opcode:o,args:[a],synthetic:!0},u=r.resultVars.map((d,l)=>({type:"instr",id:d,opcode:"wgsl.extract_f32",args:[i],immediates:[l],synthetic:!0})),m=[...r.instrIndices].sort((d,l)=>d-l);for(let d=m.length-1;d>=0;d--)e.instructions.splice(m[d],1);e.instructions.splice(m[0],0,c,...u)}}function te(e,t){let n={valid:!0,mathImports:[],errors:[],requiredLevel:null},r=t===!0||t==="M0"||t==="M1"||t==="M2",o=t===!0?"M2":t==="M0"||t==="M1"||t==="M2"?t:null,s=["M0","M1","M2"],i=0;for(let a of e.imports){if(a.kind!=="func")continue;let c=i++;if(!Z(a.module,a.name))continue;let u=a.typeIndex;if(u===void 0){n.errors.push(I(`Math import ${a.name} has no type index`,{functionName:a.name})),n.valid=!1;continue}let m=e.types[u];if(!m){n.errors.push(I(`Math import ${a.name} references invalid type index ${u}`,{functionName:a.name})),n.valid=!1;continue}let d=J(a.name);if(!d){n.errors.push(I(`Unknown math intrinsic: ${a.name}`,{functionName:a.name})),n.valid=!1;continue}let l={funcIndex:c,module:a.module,name:a.name,level:d.level,params:m.params,results:m.results};if(n.mathImports.push(l),(n.requiredLevel===null||s.indexOf(d.level)>s.indexOf(n.requiredLevel))&&(n.requiredLevel=d.level),!r){n.errors.push(I(`Math intrinsic ${a.name} requires mathExtension option to be enabled`,{functionName:a.name})),n.valid=!1;continue}if(o&&!ue(a.name,o)){n.errors.push(I(`Math intrinsic ${a.name} requires level ${d.level}, but only ${o} is enabled`,{functionName:a.name})),n.valid=!1;continue}let p=le(a.name,m.params,m.results);p&&(n.errors.push(I(p,{functionName:a.name})),n.valid=!1)}return n}import{readFileSync as it}from"node:fs";var _e,Ae;async function st(e=re()){let t=await ct(e),n=await WebAssembly.instantiate(Ce(t),{});return Y(n.instance.exports)}function ne(e=re()){return Ae??=st(e),Ae}function at(e=re()){let t=ut(e),n=new WebAssembly.Module(Ce(t)),r=new WebAssembly.Instance(n,{});return Y(r.exports)}function $e(e,t={}){return _e??=at(),_e.compile(e,t)}function re(){let e=globalThis.Deno,t=new URL("./gasm_core_rs.wasm",import.meta.url);if(e){let n=new URL("../../core-rs/target/wasm32-unknown-unknown/debug/gasm_core_rs.wasm",import.meta.url);try{return e.statSync(n),n}catch{}let r=new URL("../../core-rs/target/wasm32-unknown-unknown/release/gasm_core_rs.wasm",import.meta.url);try{return e.statSync(r),r}catch{}try{return e.statSync(t),t}catch{}}return new URL("../../core-rs/target/wasm32-unknown-unknown/debug/gasm_core_rs.wasm",import.meta.url)}async function ct(e){let t=globalThis.Deno;return t?await t.readFile(e):await(await import("node:fs/promises")).readFile(e)}function ut(e){let t=globalThis.Deno;return t?t.readFileSync(e):it(e)}function Ce(e){return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)}var lt=new Set(["global_invocation_id_x","global_invocation_id_y","global_invocation_id_z","local_invocation_id_x","local_invocation_id_y","local_invocation_id_z","workgroup_id_x","workgroup_id_y","workgroup_id_z","num_workgroups_x","num_workgroups_y","num_workgroups_z"]);function oe(e){let t=[{group:0,binding:0,kind:"storage",rw:"read_write",role:"memory",wgslName:"memory"}],n=1,r=0;for(let i of e.imports){if(i.kind!=="global")continue;let a=r++;i.module==="gasm"&<.has(i.name)||t.push({group:0,binding:n++,kind:"uniform",role:"imported_global",wasmName:`${i.module}.${i.name}`,wgslName:`global_${a}`,type:ft(i.globalType)})}return new Set(e.extensions??[]).has("gasm:mutable-globals:1.0")&&e.globals.some(i=>i.kind==="definition"&&i.mutable)&&t.push({group:0,binding:n++,kind:"storage",rw:"read_write",role:"mutable_globals",wgslName:"mutable_globals"}),e.atomicRegion&&t.push({group:0,binding:n++,kind:"storage",rw:"read_write",role:"atomic_region",wgslName:"atomic_region",atomic:!0}),dt(t),t}function dt(e){let t=new Set;for(let n of e){let r=`${n.group}:${n.binding}`;if(t.has(r))throw new Error(`Duplicate Gasm binding: ${r}`);t.add(r)}}function ft(e){if(e==="i32"||e==="i64"||e==="f32"||e==="f64")return e;if(e==="v128")return"vec4<u32>"}function ie(e,t={}){let n=oe(e),r=n.find(u=>u.role==="atomic_region"),o=vt(e),s={specVersion:"0.2",extensions:[...e.extensions??[]],memory:{sizeBytes:yt(e),atomicRegion:It(e.atomicRegion,r)},entryPoints:Be(e).map(u=>({name:u.name,wgslName:Ee(u.name),workgroupSize:ht(e,u.index,t)})),bindings:n,dataSegments:o.memorySegments},i=bt(e);i!==void 0&&(s.memory.workgroupMemoryBytes=i),o.atomicSegments.length>0&&(s.atomicDataSegments=o.atomicSegments);let a=e.data.map((u,m)=>({segment:u,index:m})).filter(({segment:u})=>u.mode==="passive").map(({segment:u,index:m})=>xt(u,m));a.length>0&&(s.passiveDataSegments=a);let c=St(e);return c.length>0&&(s.mutableGlobals=c),s}function mt(e){let t=[],n=_(e);if(!n)return{valid:!1,errors:["metadata must be an object"]};let r=["specVersion","extensions","memory","entryPoints","bindings","dataSegments"];for(let d of r)d in n||t.push(`missing required property: ${d}`);for(let d of Object.keys(n))[...r,"mutableGlobals","passiveDataSegments","atomicDataSegments","extras"].includes(d)||t.push(`unexpected property: ${d}`);n.specVersion!=="0.2"&&t.push("specVersion must be 0.2"),Array.isArray(n.extensions)||t.push("extensions must be an array"),_(n.memory)||t.push("memory must be an object"),(!Array.isArray(n.entryPoints)||n.entryPoints.length===0)&&t.push("entryPoints must be a non-empty array"),Array.isArray(n.bindings)||t.push("bindings must be an array"),Array.isArray(n.dataSegments)||t.push("dataSegments must be an array");let o=Array.isArray(n.bindings)?n.bindings:[],s=new Set;for(let d of o){let l=_(d);if(!l){t.push("binding must be an object");continue}S(l.group)||t.push("binding.group invalid"),S(l.binding)||t.push("binding.binding invalid"),typeof l.kind!="string"&&t.push("binding.kind invalid"),typeof l.role!="string"&&t.push("binding.role invalid");let p=`${l.group}:${l.binding}`;s.has(p)&&t.push(`duplicate binding: ${p}`),s.add(p)}let i=Array.isArray(n.entryPoints)?n.entryPoints:[];for(let d of i){let l=_(d);if(!l){t.push("entryPoint must be an object");continue}(typeof l.name!="string"||l.name.length===0)&&t.push("entryPoint.name invalid"),(typeof l.wgslName!="string"||l.wgslName.length===0)&&t.push("entryPoint.wgslName invalid"),(!Array.isArray(l.workgroupSize)||l.workgroupSize.length!==3||!l.workgroupSize.every(p=>At(p)))&&t.push("entryPoint.workgroupSize invalid")}let a=_(n.memory);a&&!S(a.sizeBytes)&&t.push("memory.sizeBytes invalid"),a&&"workgroupMemoryBytes"in a&&!S(a.workgroupMemoryBytes)&&t.push("memory.workgroupMemoryBytes invalid");let c=Array.isArray(n.dataSegments)?n.dataSegments:[];for(let d of c){let l=_(d);if(!l){t.push("dataSegment must be an object");continue}S(l.memory)||t.push("dataSegment.memory invalid"),S(l.offset)||t.push("dataSegment.offset invalid"),S(l.byteLength)||t.push("dataSegment.byteLength invalid"),typeof l.dataB64!="string"&&t.push("dataSegment.dataB64 invalid")}let u=Array.isArray(n.passiveDataSegments)?n.passiveDataSegments:[];for(let d of u){let l=_(d);if(!l){t.push("passiveDataSegment must be an object");continue}S(l.index)||t.push("passiveDataSegment.index invalid"),S(l.byteLength)||t.push("passiveDataSegment.byteLength invalid"),typeof l.dataB64!="string"&&t.push("passiveDataSegment.dataB64 invalid"),typeof l.dropped!="boolean"&&t.push("passiveDataSegment.dropped invalid")}let m=Array.isArray(n.atomicDataSegments)?n.atomicDataSegments:[];for(let d of m){let l=_(d);if(!l){t.push("atomicDataSegment must be an object");continue}S(l.memory)||t.push("atomicDataSegment.memory invalid"),S(l.offset)||t.push("atomicDataSegment.offset invalid"),S(l.byteLength)||t.push("atomicDataSegment.byteLength invalid"),typeof l.dataB64!="string"&&t.push("atomicDataSegment.dataB64 invalid")}return t.length===0?{valid:!0}:{valid:!1,errors:t}}function pt(e,t){let n=[...e.extensions??[]].sort(),r=[...t.extensions].sort();De(n,r,"extensions");for(let[o,s]of e.workgroupSizes??new Map){let i=Be(e).find(c=>c.index===o);if(!i)continue;let a=t.entryPoints.find(c=>c.name===i.name);if(!a)throw new Error(`metadata missing entry point ${i.name}`);De(s,a.workgroupSize,"workgroupSize")}if(e.atomicRegion){let o=t.memory.atomicRegion;if(!o)throw new Error("metadata missing atomicRegion");$t(e.atomicRegion,o)}}function Be(e){return e.exports.filter(t=>{if(t.kind!=="func")return!1;let n=gt(e,t.index);return!!n&&n.params.length===0&&n.results.length===0})}function Ee(e){let t=_t(e);return t==="main"?"main":`${t}_entry`}function Re(e,t){return!!t.workgroupSize&&(e.workgroupSizes?.size??0)>0}function gt(e,t){let n=e.imports.filter(o=>o.kind==="func");if(t<n.length){let o=n[t].typeIndex;return o===void 0?void 0:e.types[o]}let r=e.functions.find(o=>o.index===t);if(r)return{params:r.params,results:r.results}}function ht(e,t,n){if(n.options?.workgroupSize)return n.options.workgroupSize;let r=e.workgroupSizes?.get(t);if(r)return r;let o=n.dispatchInfo;return o?.isParallelized?[o.workgroupSizeX,o.workgroupSizeY,o.workgroupSizeZ]:H(n.options)==="0.2"?[64,1,1]:[1,1,1]}function yt(e){let t=e.memories[0];return t?t.min*65536:(e.imports.find(r=>r.kind==="mem"&&!(r.module==="gasm"&&r.name==="workgroup_memory"))?.memoryMin??0)*65536}function bt(e){if(!new Set(e.extensions??[]).has("gasm:workgroup-memory:1.0"))return;let n=e.imports.find(r=>r.kind==="mem"&&r.module==="gasm"&&r.name==="workgroup_memory");if(n)return n.memoryMax??n.memoryMin??0}function St(e){if(!(e.extensions??[]).includes("gasm:mutable-globals:1.0"))return[];let t=[],n=0;for(let r of e.globals){if(r.kind!=="definition"||!r.mutable)continue;let o=wt(r.type);t.push({index:r.index,type:r.type,offset:n,byteLength:o,...r.initValue!==void 0?{initialValue:r.initValue.toString()}:{}}),n+=o}return t}function wt(e){return e==="i64"||e==="f64"?8:4}function It(e,t){return e?{offset:e.offset,length:e.length,binding:{group:t?.group??0,binding:t?.binding??0}}:null}function vt(e){let t=[],n=[];for(let r of e.data)r.mode==="active"&&kt(r,e.atomicRegion).forEach(o=>{o.atomic?n.push(o.metadata):t.push(o.metadata)});return{memorySegments:t,atomicSegments:n}}function kt(e,t){let n=Mt(e.offset);if(!t||e.memoryIndex!==t.memoryIndex)return[V(e,n,e.data,!1)];let r=n+e.data.length,o=t.offset,s=t.offset+t.length,i=[];if(n<Math.min(r,o)){let u=Math.min(r,o);i.push(V(e,n,e.data.subarray(0,u-n),!1))}let a=Math.max(n,o),c=Math.min(r,s);if(a<c&&i.push(V(e,a,e.data.subarray(a-n,c-n),!0)),Math.max(n,s)<r){let u=Math.max(n,s);i.push(V(e,u,e.data.subarray(u-n),!1))}return i.length===0&&i.push(V(e,n,e.data,!1)),i}function V(e,t,n,r){return{atomic:r,metadata:{memory:e.memoryIndex,offset:t,byteLength:n.length,dataB64:We(n)}}}function xt(e,t){return{index:t,byteLength:e.data.length,dataB64:We(e.data),dropped:!1}}function Mt(e){let n=e.find(r=>r.opcode===O.i32_const)?.immediates[0];return typeof n=="number"?n:0}function We(e){let t="";for(let n of e)t+=String.fromCharCode(n);return btoa(t)}function _t(e){let t="";for(let n=0;n<e.length;n++){let r=e[n],o=r==="_"||/[A-Za-z]/.test(r)||n>0&&/[0-9]/.test(r);t+=o?r:"_"}return(t.length===0||/^[0-9]/.test(t))&&(t=`_${t}`),t}function _(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function S(e){return Number.isInteger(e)&&e>=0}function At(e){return Number.isInteger(e)&&e>=1}function De(e,t,n){if(JSON.stringify(e)!==JSON.stringify(t))throw new Error(`${n} mismatch: ${JSON.stringify(e)} != ${JSON.stringify(t)}`)}function $t(e,t){if(e.offset!==t.offset||e.length!==t.length)throw new Error("atomicRegion mismatch")}var Ve={};for(let[e,t]of Object.entries(O))Ve[t]=e.replace(/_/g,".");function Ct(e){let t=[];t.push("(module");for(let r of e.memories)t.push(` (memory ${r.min}${r.max!==void 0?` ${r.max}`:""})`);for(let r of e.imports)if(r.kind==="func"&&r.typeIndex!==void 0){let o=e.types[r.typeIndex];if(o){let s=o.params.map((a,c)=>`(param $${c} ${a})`).join(" "),i=o.results.map(a=>`(result ${a})`).join(" ");t.push(` (import "${r.module}" "${r.name}" (func ${s}${i?" "+i:""}))`)}}let n=new Set;for(let r of e.globals){if(r.kind==="import")continue;let o=r.mutable?"(mut ":"",s=r.mutable?")":"",i="";r.initValue!==void 0&&(r.type==="i32"||r.type==="i64"?i=`${r.type}.const ${r.initValue}`:(r.type==="f32"||r.type==="f64")&&(i=`${r.type}.const ${r.initValue}`)),t.push(` (global $${r.index} ${o}${r.type}${s} ${i?`(${i})`:""})`)}for(let r of e.data){let o=Array.from(r.data.slice(0,Math.min(32,r.data.length))).map(i=>`\\${i.toString(16).padStart(2,"0")}`).join(""),s=r.data.length>32?"...":"";t.push(` (data (i32.const ${r.memoryIndex}) "${o}${s}") ;; ${r.data.length} bytes`)}for(let r of e.functions)t.push(""),t.push(...Dt(r,e));if(e.exports.length>0){t.push("");for(let r of e.exports)r.kind==="func"?t.push(` (export "${r.name}" (func $${r.index}))`):r.kind==="mem"?t.push(` (export "${r.name}" (memory ${r.index}))`):r.kind==="global"&&t.push(` (export "${r.name}" (global ${r.index}))`)}return e.startFunctionIndex!==void 0&&t.push(` (start $${e.startFunctionIndex})`),t.push(")"),t.join(`
|
|
2
|
+
`)}function Dt(e,t){let n=[],r=e.params.map((i,a)=>`(param $${a} ${i})`).join(" "),o=e.results.map(i=>`(result ${i})`).join(" ");if(n.push(` (func $${e.index} ${r}${o?" "+o:""}`),e.locals.length>0){let i=new Map;for(let a of e.locals)i.set(a.type,(i.get(a.type)||0)+1);for(let[a,c]of i)n.push(` (local ${a} (;${c}x;))`)}let s=Bt(e.body,2);return n.push(...s),n.push(" )"),n}function Bt(e,t){let n=[],r=" ".repeat(t);for(let o of e){let s=Et(o,t);n.push(`${r}${s}`)}return n}function Et(e,t){if(!e||typeof e!="object")return";; Error: Invalid instruction";let{opcode:n,immediates:r}=e,o=Ve[n]||`unknown_0x${n.toString(16)}`;if(!r||r.length===0)return o;switch(o){case"local.get":case"local.set":case"local.tee":return`${o} $${r[0]}`;case"global.get":case"global.set":return`${o} $${r[0]}`;case"i32.const":case"i64.const":return`${o} ${r[0]}`;case"f32.const":case"f64.const":return`${o} ${r[0]}`;case"call":return`${o} $${r[0]}`;case"call_indirect":return`${o} (type ${r[0]})`;case"br":case"br_if":return`${o} ${r[0]}`;case"br_table":let s=r[0].join(" "),i=r[1];return`${o} ${s} ${i}`;case"if":case"block":case"loop":let a=r[0];return`${o} ${a!==void 0&&a!=="void"?`(result ${a})`:""}`;case"i32.load":case"i64.load":case"f32.load":case"f64.load":case"i32.load8_s":case"i32.load8_u":case"i32.load16_s":case"i32.load16_u":case"i64.load8_s":case"i64.load8_u":case"i64.load16_s":case"i64.load16_u":case"i64.load32_s":case"i64.load32_u":case"i32.store":case"i64.store":case"f32.store":case"f64.store":case"i32.store8":case"i32.store16":case"i64.store8":case"i64.store16":case"i64.store32":let c=r[0],u=r[1],m=[];return u!==0&&m.push(`offset=${u}`),c!==void 0&&m.push(`align=${1<<c}`),`${o}${m.length>0?" "+m.join(" "):""}`;case"memory.size":case"memory.grow":return o;default:if(o.startsWith("v128.")){if(o.includes("load")||o.includes("store")){let d=r[0],l=r[1],p=[];return l!==0&&p.push(`offset=${l}`),d!==void 0&&p.push(`align=${1<<d}`),`${o}${p.length>0?" "+p.join(" "):""}`}if(o.includes("const")){let d=r.join(" ");return`${o} ${d}`}return o.includes("extract_lane")||o.includes("replace_lane")?`${o} ${r[0]}`:`${o}${r.length>0?" "+r.join(" "):""}`}return`${o}${r.length>0?" "+r.join(" "):""}`}}var hn=globalThis.gpu,Rt=globalThis.navigator?.gpu,se=class{constructor(t={}){this.config=t}device=null;queue=null;initialized=!1;buffers=new Map;async ensureInitialized(){if(!this.initialized)try{let t=await Rt?.requestAdapter?.();if(!t)throw new h("No GPU adapter available","compilation","navigator.gpu.requestAdapter() returned null");if(this.device=await t.requestDevice?.(),!this.device)throw new h("Failed to request GPU device","compilation","adapter.requestDevice() returned null");this.queue=this.device.queue,this.initialized=!0}catch(t){throw t instanceof h?t:new h(`GPU initialization failed: ${t instanceof Error?t.message:String(t)}`,"compilation",String(t))}}createBuffer(t,n,r){if(!this.device)throw new h("Device not initialized","binding","Call ensureInitialized() first");let o=this.device.createBuffer({label:t,size:n.byteLength,usage:r});return this.queue.writeBuffer(o,0,n.buffer,n.byteOffset,n.byteLength),o}async readBuffer(t,n,r){if(!this.device||!this.queue)throw new h("Device not initialized","readback","Call ensureInitialized() first");let o=Math.max(4,Math.ceil(n/4)*4),s=this.device.createBuffer({size:o,usage:9}),i=this.device.createCommandEncoder();i.copyBufferToBuffer(t,0,s,0,Math.min(n,o)),this.queue.submit([i.finish()]);try{await s.mapAsync(1)}catch(u){throw s.destroy(),new h(`Failed to map staging buffer: ${u instanceof Error?u.message:String(u)}`,"readback",String(u))}let a=s.getMappedRange(),c;return r==="f32"?c=new Float32Array(new Uint8Array(a).buffer).slice():r==="i32"?c=new Int32Array(new Uint8Array(a).buffer).slice():c=new Uint32Array(new Uint8Array(a).buffer).slice(),s.unmap(),s.destroy(),{data:c,type:r}}async execute(t,n,r,o={}){let s=o.workgroupSize??[1,1,1],i=o.workgroupCount??[1,1,1],a=o.timeout??5e3;if(await this.ensureInitialized(),!this.device||!this.queue)throw new h("Device initialization failed","compilation");try{let c;try{let f=o.shaderLabel||"Gasm Compiler Compute Shader";c=this.device.createShaderModule({code:t,label:f});let g=await c.getCompilationInfo?.();if(g&&g.messages.length>0){let y=g.messages.filter(w=>w.type==="error");if(y.length>0){let w=y.map(M=>`${M.message} at ${M.lineNum}:${M.linePos}`).join("; ");throw new h(`WGSL compilation failed: ${w}`,"compilation")}}}catch(f){throw f instanceof h?f:new h(`Failed to create shader module: ${f instanceof Error?f.message:String(f)}`,"compilation",String(f))}let u=[],m=0,d=new Map,l=Object.entries(n).sort((f,g)=>f[0]==="memory"?-1:g[0]==="memory"?1:f[0].localeCompare(g[0]));for(let[f,{data:g,type:y}]of l){let w=this.createBuffer(`input_${f}`,g,140);d.set(f,w),u.push({binding:m++,resource:{buffer:w}})}let p=new Map,k=new Map;for(let f of r){if(d.has(f)){let Fe=d.get(f),ce=n[f];p.set(f,Fe),k.set(f,{size:ce.data.byteLength,type:ce.type});continue}let g=o.outputBuffers?.[f]??{type:"f32",size:1},y=g.size??1,w=y*4,M=this.device.createBuffer({label:`output_${f}`,size:w,usage:140}),D;g.type==="f32"?D=new Float32Array(y).fill(0):g.type==="i32"?D=new Int32Array(y).fill(0):D=new Uint32Array(y).fill(0),this.queue.writeBuffer(M,0,D.buffer,D.byteOffset,D.byteLength),p.set(f,M),k.set(f,{size:w,type:g.type}),u.push({binding:m++,resource:{buffer:M}})}let b=Object.keys(n).length,x=this.device.createBindGroupLayout({entries:u.map((f,g)=>{let y=g===0&&n.memory!==void 0,w=g>=b;return{binding:g,visibility:4,buffer:{type:!y&&!w?"read-only-storage":"storage"}}})}),v=this.device.createBindGroup({layout:x,entries:u}),R=this.device.createPipelineLayout({bindGroupLayouts:[x]}),W;try{W=this.device.createComputePipeline({layout:R,compute:{module:c,entryPoint:"main"}})}catch(f){throw new h(`Failed to create compute pipeline: ${f instanceof Error?f.message:String(f)}`,"binding",String(f))}try{let f=this.device.createCommandEncoder(),g=f.beginComputePass();g.setPipeline(W),g.setBindGroup(0,v),g.dispatchWorkgroups(i[0],i[1],i[2]),g.end(),this.queue.submit([f.finish()])}catch(f){throw new h(`Compute shader dispatch failed: ${f instanceof Error?f.message:String(f)}`,"dispatch",String(f))}let G={};try{for(let f of r){let g=p.get(f),y=k.get(f);if(!g||!y)throw new h(`Output buffer "${f}" not found`,"readback");G[f]=await this.readBuffer(g,y.size,y.type)}}catch(f){throw f instanceof h?f:new h(`Failed to read back results: ${f instanceof Error?f.message:String(f)}`,"readback",String(f))}finally{let f=new Set;d.forEach(g=>{g.destroy(),f.add(g)}),p.forEach(g=>{f.has(g)||g.destroy()})}return G}catch(c){throw c instanceof h?c:new h(`Unexpected error during execution: ${c instanceof Error?c.message:String(c)}`,"dispatch",String(c))}}async destroy(){this.buffers.forEach(t=>t.destroy()),this.buffers.clear(),this.device&&typeof this.device.destroy=="function"&&this.device.destroy(),this.device=null,this.queue=null,this.initialized=!1}};function F(e,t={}){return T()?Ge(e,t):ae(e,t)}function Yn(e,t={}){let n,r=s=>{n=s},o=T()?Ge(e,t,r):ae(e,t,r);if(!o.ok)return o;if(!n)throw new Error("Compiler succeeded without a validated Wasm module");return{...o,metadata:ie(n,{options:t,dispatchInfo:o.dispatchInfo})}}async function Qn(){T()&&await ne()}async function Gt(e,t={}){return T()?await Ot(e,t):ae(e,t)}function ae(e,t={},n){let r=K(),o=L(t),s=t.strictConformance||o,i=z(e);if(P(i))return r.errors.push({severity:"error",code:i.code??B.ERR_PARSE,message:i.message,functionName:i.functionName}),{ok:!1,diagnostics:r};let a=i,c=q(a,{strictConformance:s});if(j(c))return r.errors.push({severity:"error",code:c.code??B.ERR_VALIDATION,message:c.message,functionName:c.functionName}),{ok:!1,diagnostics:r};let u=c;if(ze(r,u,t),t.mathExtension){let b=te(a,t.mathExtension);if(!b.valid){for(let x of b.errors)r.errors.push({severity:"error",code:"ERR_MATH_VALIDATION",message:x.message,functionName:x.functionName});return{ok:!1,diagnostics:r}}}let m=X(u,t);if(r.warnings.push(...m.diagnostics.warnings),r.errors.push(...m.diagnostics.errors),r.demotions.push(...m.diagnostics.demotions),r.featuresUsed=m.diagnostics.featuresUsed,r.errors.length>0)return{ok:!1,diagnostics:r};n?.(u);let d=he(u);t.optimize!==!1&&(d=be(d,{verbose:t.verbose??!1}));let l=Se(d);l=de(l),t.optimize!==!1&&(l=fe(l)),t.vectorPromotion&&(l=ke(l));let p=me();if(t.optimize!==!1){let b=pe(l);l=b.module,p=b.dispatchInfo,l=we(l),l=Ie(l)}return{ok:!0,wgsl:ye(l,t,e,p),diagnostics:r,dispatchInfo:p}}function T(){let t=globalThis.Deno?.env?.get("GASM_CORE_BACKEND")?.toLowerCase();return t!=="typescript"&&t!=="ts"}function Ge(e,t,n){let r=Oe(e,t);if(!r.ok)return{ok:!1,diagnostics:r.diagnostics};n?.(r.module);let o=$e(e,t);return o.ok?{ok:!0,wgsl:Pe(o.wgsl,t,e,r.module),diagnostics:r.diagnostics,dispatchInfo:Q(o.dispatchInfo)}:(r.diagnostics.errors.push(...ee(o.diagnostics).errors),{ok:!1,diagnostics:r.diagnostics})}async function Ot(e,t){let n=Oe(e,t);if(!n.ok)return{ok:!1,diagnostics:n.diagnostics};let o=(await ne()).compile(e,t);return o.ok?{ok:!0,wgsl:Pe(o.wgsl,t,e,n.module),diagnostics:n.diagnostics,dispatchInfo:Q(o.dispatchInfo)}:(n.diagnostics.errors.push(...ee(o.diagnostics).errors),{ok:!1,diagnostics:n.diagnostics})}function Oe(e,t){let n=K(),r=z(e);if(P(r))return n.errors.push({severity:"error",code:r.code??B.ERR_PARSE,message:r.message,functionName:r.functionName}),{ok:!1,diagnostics:n};let o=L(t),s=t.strictConformance||o,i=q(r,{strictConformance:s});if(j(i))return n.errors.push({severity:"error",code:i.code??B.ERR_VALIDATION,message:i.message,functionName:i.functionName}),{ok:!1,diagnostics:n};if(ze(n,i,t),t.mathExtension){let c=te(r,t.mathExtension);if(!c.valid){for(let u of c.errors)n.errors.push({severity:"error",code:"ERR_MATH_VALIDATION",message:u.message,functionName:u.functionName});return{ok:!1,diagnostics:n}}}let a=X(i,t);return n.warnings.push(...a.diagnostics.warnings),n.errors.push(...a.diagnostics.errors),n.demotions.push(...a.diagnostics.demotions),n.featuresUsed=a.diagnostics.featuresUsed,n.errors.length>0?{ok:!1,diagnostics:n}:{ok:!0,diagnostics:n,module:i}}function ze(e,t,n){L(n)&&Re(t,n)&&(e.warnings.some(r=>r.code==="WARN_WORKGROUP_SIZE_OVERRIDE")||e.warnings.push({severity:"warning",code:"WARN_WORKGROUP_SIZE_OVERRIDE",message:"CompileOptions.workgroupSize overrides gasm.workgroup_size custom-section declarations"}))}function Pe(e,t,n,r){let o=e;if(o=zt(o,t,n,r),t.compilerMetadata&&(o=o.replace(/(\/\/ Generated: .*\n)/,`$1// Metadata: ${t.compilerMetadata}
|
|
3
|
+
`)),t.workgroupSize){let[s,i,a]=t.workgroupSize;o=o.replace(/@compute @workgroup_size\(\d+, \d+, \d+\)/g,`@compute @workgroup_size(${s}, ${i}, ${a})`)}return o}function zt(e,t,n,r){if(t.stripComments||t.releaseMode)return e;let s=ge(n,t.sourceMapping);if(!s)return e;let i=s.generateHeaderComment(),a=i?e.replace(/(\/\/ Generated: .*\n)/,`$1${i}
|
|
4
|
+
`):e,c=0;return a=a.replace(/^fn ([A-Za-z_][A-Za-z0-9_]*)\(/gm,(u,m)=>{let d=r.functions[c],l=s.commentForFunction(d?.index??c,m);if(c+=1,!l)return u;let p=t.sourceMapping==="minimal"?"":`
|
|
5
|
+
// [WAT] rust backend instruction mapping`;return`${l}${p}
|
|
6
|
+
${u}`}),a}function er(e,t={}){let n=F(e,t);if(!n.ok){let r=n.diagnostics.errors[0];throw I(r?.message??"Compilation failed",{functionName:r?.functionName,instructionName:r?.code,code:r?.code})}return n.wgsl}async function tr(e,t={}){let n=await Gt(e,t);if(!n.ok){let r=n.diagnostics.errors[0];throw I(r?.message??"Compilation failed",{functionName:r?.functionName,instructionName:r?.code,code:r?.code})}return n.wgsl}function Ue(e,t){for(let n of e.warnings){let r=n.functionName?` (${n.functionName})`:"";console.error(`warning${r}: ${n.message}`)}if(t&&e.demotions.length>0){let n=new Map;for(let o of e.demotions)n.set(o.kind,(n.get(o.kind)??0)+1);let r=[...n.entries()].map(([o,s])=>`${o} (${s})`);console.error(`demotions: ${r.join(", ")}`)}}function qt(e,t){return new Promise(n=>{let r=Ft(e,t,{stdio:["ignore","pipe","pipe"]}),o="",s="";r.stdout.on("data",i=>{o+=String(i)}),r.stderr.on("data",i=>{s+=String(i)}),r.on("close",i=>{n({success:i===0,stdout:o,stderr:s})}),r.on("error",i=>{n({success:!1,stdout:o,stderr:`${s}
|
|
7
|
+
${i.message}`})})})}async function Wt(e,t={}){let{output:n,verbose:r=!1,keepWasm:o=!1,optimize:s=!1,denyF64Demotion:i=!1,allowI64Demotion:a=!1,warningsAsErrors:c=!1}=t;try{r&&console.log(`[1/4] Validating input file: ${e}`);let u=Le(e);if(!(await Ne(u)).isFile())throw new Error(`Not a file: ${e}`);let d=u.endsWith(".wasm");!d&&!u.endsWith(".as")&&!u.endsWith(".ts")&&console.warn("Warning: Input file does not have .as, .ts, or .wasm extension");let l=u.replace(/\.(as|ts)$/,".wasm");if(d)r&&console.log("[2/4] Input is WASM, skipping compilation..."),l=u;else{r&&console.log("[2/4] Compiling AssemblyScript to WASM...");let v=await jt(),{success:R,stdout:W,stderr:G}=await qt(v,[u,"-o",l]);if(!R)throw new Error(`AssemblyScript compilation failed:
|
|
8
|
+
${G}`);r&&W&&console.log(W)}r&&console.log("[3/4] Reading WASM binary...");let p=await Pt(l);r&&(console.log(` WASM size: ${p.length} bytes`),console.log("[4/4] Compiling WASM to WGSL using Gasm..."));let k={};i&&(k.f64="deny"),a&&(k.i64="allow-lossy");let b=F(p,{optimize:s,demotionPolicy:k,warningsAsErrors:c});if(Ue(b.diagnostics,r),!b.ok){let v=b.diagnostics.errors[0];throw new Error(v?.message??"Compilation failed")}let x=b.wgsl;if(n){let v=Le(n),R=Tt(v);await Ut(R,{recursive:!0}),await Lt(v,x,"utf-8"),console.log(r?`
|
|
9
|
+
\u2713 Successfully compiled to: ${v}`:`\u2713 Compiled to: ${n}`)}if(!o&&!d)try{await Nt(l),r&&console.log(" Cleaned up intermediate WASM file")}catch{}return x}catch(u){throw u instanceof Error?u:new Error(`Unknown error: ${String(u)}`)}}function Vt(e,t={}){let{verbose:n=!1,optimize:r=!1,denyF64Demotion:o=!1,allowI64Demotion:s=!1,warningsAsErrors:i=!1}=t,a={};o&&(a.f64="deny"),s&&(a.i64="allow-lossy");let c=F(e,{optimize:r,demotionPolicy:a,warningsAsErrors:i});if(Ue(c.diagnostics,n),!c.ok){let u=c.diagnostics.errors[0];throw new Error(u?.message??"Compilation failed")}return c.wgsl}async function jt(){let e=["node_modules/.bin/asc","./examples/node_modules/.bin/asc","../app/node_modules/.bin/asc","./node_modules/assemblyscript/bin/asc.js"];for(let t of e)try{if((await Ne(t)).isFile())return t}catch{}return"asc"}export{oe as a,ie as b,mt as c,pt as d,Ee as e,Ct as f,se as g,Wt as h,Vt as i,F as j,Yn as k,Qn as l,Gt as m,er as n,tr as o};
|