TachiSnap
TachiSnap — Pixel Snapper for animation pixel artists. Rust + WebAssembly client-side tool for cleaning up AI-generated…
Compile WebAssembly to native MicroPython modules
git clone https://github.com/vshymanskyy/wasm2mpy.gitvshymanskyy/wasm2mpy
wasm2mpywasm2mpy enables developers to write code in statically compiled languages and run it on MicroPython-based embedded systems (such as ESP32, Raspberry Pi Pico, STM32, and nRF52) with near-native performance. Since MicroPython is relatively slow for computationally intensive applications, wasm2mpy provides the tools necessary to run demanding software, such as AI models and signal processing algorithms, more efficiently.
| App \ Target | x86/x64 | armv6m | armv7m/+s/+d | esp82661 | esp32 | rv32imc |
|---|---|---|---|---|---|---|
| 🚀 TypeScript2 | ✅✅ | ✅ | ✅✅✅ | ⚠️3 | ✅ | ✅ |
| 🤩 C++ | ✅✅ | ✅ | ✅✅✅ | 🟡 | ✅ | ✅ |
| 🦀 Rust | ✅✅ | ✅ | 🟡🟡✅ | ⚠️3 | ✅ | ✅ |
| 🤖 TinyGo | ✅✅ | ✅ | 🟡🟡✅ | ⚠️3 | ✅ | ✅ |
| ⚡ Zig | ✅✅ | ✅ | ✅✅✅ | ⚠️3 | ✅ | ✅ |
| ✨ Virgil | ✅✅ | ✅ | ✅✅✅ | 🟡 | ✅ | ✅ |
| ⚙ WAT | ✅✅ | ✅ | ✅✅✅ | 🟡 | ✅ | ✅ |
| 🇨 Coremark | ✅✅ | 🚧 | ✅✅✅ | 🟡 | ✅ | ✅ |
✅ builds and runs OK
🟡 builds OK, doesn't run
🚧 work in progress
179.791233.918228.363271.573344.2931911.43718696.248Follow the build instructions
mpremote cp zig.mpy :lib/ mpremote exec "import zig; zig.setup()" ⚡ Zig is running!
Note
This requires adding some glue code to the runtime.
Glue code can be auto-generated, but for now it's a manual process.
For example, test/simple.wasm just adds 2 numbers:
(module
(func (export "add") (param i32 i32) (result i32)
(i32.add (local.get 0) (local.get 1))
)
)
MicroPython v1.24.0-preview.224.g6c3dc0c0b on 2024-08-22; Raspberry Pi Pico W with RP2040
Type "help()" for more information.
>>> import simple
>>> simple.add(3, 4)
7
>>> simple.add(10, 6)
16
>>> import cpp >>> cpp.setup() 🤩 C++ is running! >>> cpp._memory[4096:4096+32] bytearray(b' Blink\x00\xf0\x9f\xa4\xa9 C++ is running!\x00\n\x00\x00\x00') >>> new_data = b"Hello C++ world" >>> cpp._memory[4096+12:4096+12+len(new_data)] = new_data >>> cpp.setup() 🤩 Hello C++ world
The idea is very similar to embedded-wasm-apps:
.a inputs for mpy_ldu32 instead of u64 for mem addresses.bss section as memory (skip indirection)esp8266 requires the use of esp.set_native_code_location, and setting WASM_PAGE_SIZE to 8192 (or need to wait for WASM Custom Page Sizes) ↩
not enough memory to run, need to wait for WASM Custom Page Sizes ↩ ↩2 ↩3 ↩4
more like this
TachiSnap — Pixel Snapper for animation pixel artists. Rust + WebAssembly client-side tool for cleaning up AI-generated…
.Net 10 (.Net 8+) webassembly starter project using raylib-cs nuget 7.0.2 and raylib 5.5
search projects, people, and tags