diff --git a/python/pecos/engines/cvm/wasm.py b/python/pecos/engines/cvm/wasm.py index a6417141..83685910 100644 --- a/python/pecos/engines/cvm/wasm.py +++ b/python/pecos/engines/cvm/wasm.py @@ -17,6 +17,7 @@ from pecos.engines.cvm.wasm_vms.pywasm import read_pywasm from pecos.engines.cvm.wasm_vms.pywasm3 import read_pywasm3 from pecos.engines.cvm.wasm_vms.wasmer import read_wasmer +from pecos.engines.cvm.wasm_vms.wasmtime import read_wasmtime from pecos.errors import MissingCCOPError @@ -35,13 +36,16 @@ def get_ccop(circuit): ccop_type = circuit.metadata["ccop_type"] if ccop_type is None: - ccop_type = "wasmer" + ccop_type = "wasmtime" # Set self.ccop # ------------------------------------------------ if ccop_type in {"py", "python"}: ccop = read_pickle(ccop) + elif ccop_type == "wasmtime": + ccop = read_wasmtime(ccop) + elif ccop_type == "pywasm": ccop = read_pywasm(ccop) diff --git a/python/pecos/engines/cvm/wasm_vms/wasmtime.py b/python/pecos/engines/cvm/wasm_vms/wasmtime.py new file mode 100644 index 00000000..99315051 --- /dev/null +++ b/python/pecos/engines/cvm/wasm_vms/wasmtime.py @@ -0,0 +1,44 @@ +# Copyright 2024 The PECOS Developers +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with +# the License.You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. + +from __future__ import annotations + +import contextlib + +from pecos.engines.cvm.sim_func import sim_funcs + +with contextlib.suppress(ImportError): + from pecos.foreign_objects.wasmtime import WasmtimeObj + + +def read_wasmtime(path: str | bytes): + """Helper method to create a wasmtime instance.""" + + class WASM: + """Helper class to provide the same interface as other Wasm objects.""" + + def __init__(self, _path: str | bytes): + self.wasmtime = WasmtimeObj(_path) + self.wasmtime.init() + + def get_funcs(self): + return self.wasmtime.get_funcs() + + def exec(self, func_name, args, debug=False): + if debug and func_name.startswith("sim_"): + method = sim_funcs[func_name] + return method(*args) + + else: + args = [int(b) for _, b in args] + return self.wasmtime.exec(func_name, args) + + return WASM(path)