Write once, run on any E1M module.
Alp SDK is the unification software layer for Alp Lab edge AI modules
built on the E1M open-standard form factor. It gives you one C/C++ API
β <alp/...> β that works across every E1M-* SoM variant by wrapping each
vendor's SDK on top of ARM CMSIS. Change som.sku: in a project's
board.yaml, rebuild, ship β within a SoM family, no source changes.
Rendered docs: docs.alplab.ai/sdk/introduction Β· issues: github.com/alplabai/alp-sdk/issues
git clone https://github.com/alplabai/alp-sdk
cd alp-sdk
# Install tan, the standalone build CLI (separate repo: alplabai/tan-cli).
# Linux/macOS/WSL2:
curl -fsSL https://raw.githubusercontent.com/alplabai/tan-cli/main/install.sh | sh
# Windows PowerShell: irm https://raw.githubusercontent.com/alplabai/tan-cli/main/install.ps1 | iex
# Open a new terminal if `tan` isn't immediately on PATH.
tan bootstrap --sdk-root "$PWD" # one-time: west + Zephyr workspace + Python deps.
# Works natively on Linux, macOS, and Windows
# (PowerShell) for the Zephyr-on-M path used below;
# only the Yocto/A-class path needs WSL2 -- see
# docs/cross-platform-setup.md.
tan doctor # sanity-check the host before building
# One-time: the arm-zephyr-eabi cross toolchain a real-SoM build needs --
# bootstrap does not install this for you. Run from the workspace tan
# bootstrap just created (one level above this checkout).
( cd .. && west sdk install --gnu-toolchains arm-zephyr-eabi --no-hosttools \
--install-dir "$PWD/zephyr-sdk" )
export ZEPHYR_SDK_INSTALL_DIR="$PWD/../zephyr-sdk"
# Scaffold a sibling project and build it for its default target
# (E1M-AEN801). --sdk-root pins this checkout in my-app/.alp/sdk-path;
# `tan sdk install`/`switch` aren't ported yet, so pin explicitly for now.
tan init --name my-app --destination .. --sdk-root "$PWD"
cd ../my-app
tan buildFull walkthrough (real-hardware flashing, per-SoM options, editing in
VS Code): docs/getting-started.md. tan is
released independently from alplabai/tan-cli;
the full verb reference is docs/cli.md.
What the SDK gives you, from model to silicon. Each layer is a real boundary: you can swap the SoM under it, or the OS slice inside it, without rewriting the layer above.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β E1Mβ’ β Scalable AI Smarter Edge β‘ Alp Lab β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AI Models & β ββΊ β Train (off-device): TensorFlow Β· PyTorch β .tflite / .onnx β
β Pipeline β β β
β β β Compile (host): tan model build β one fat .alpmodel package β
β β β per-backend blobs: Vela (Ethos-U) Β· DRP-AI Β· dxcom Β· CPU/TFLM β
β β β β
β β β Model families: classification Β· detection (YOLO v5/v8) Β· β
β β β segmentation Β· keyword-spotting Β· pose β
β β β β
β β β β the .alpmodel runs at RUNTIME via the SDK's Inference block β β
βββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Dev Tooling β ββΊ β board.yaml β Python tan (in-process planner + executor) β
β β β SDK reference emits: alp_project.py Β· alp_orchestrate β
β β β tan build / flash / image / size / clean β
β β β validate_board_yaml.py Β· program_eeprom.py Β· VS Code extension β
β β β tan model build β .alpmodel (the model-compile front-end) β
βββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Alp SDK β ββΊ β Peripherals Audio Camera β
β <alp/*.h> β β β GPIO / IΒ²C / SPI β PDM in (mics) β OV5640 β
β β β β UART / PWM / ADC β IΒ²S out + amp β CAM_MUX β
β β β β CAN / RTC / WDT / USB β TAS2563 β
β β β β
β β β Inference ββ the .alpmodel runtime (where on-device AI runs) β
β β β β alp_inference_open_alpmodel() loads the fat .alpmodel β
β β β β selects the blob: silicon-ref + SRAM-fit + SoM auto_order β
β β β β dispatches β Ethos-U Β· DRP-AI3 Β· DEEPX DX-M1 Β· CPU / TFLM β
β β β β
β β β IoT / BLE Security Storage β
β β β β Wi-Fi 6 Β· MQTT β MbedTLS PSA Crypto β LittleFS β
β β β β BLE 5.4 β OPTIGA Trust M β <alp/storage.h> β
β β β β
β β β Display / GUI HW Info DSP / Power β
β β β β SSD1306 / 1331 β EEPROM manifest β alp_dsp_* FFT/FAC/IIRβ
β β β β LVGL Β· GPU2D/Dave2D β EEPROM hw_info β <alp/tmu.h> Β· power β
β β β β
β β β Heterogeneous IPC: <alp/rpc.h> Β· <alp/system_ipc.h> Β· <alp/mproc.h> β
β β β framed RPMsg/OpenAMP Β· auto endpoint IDs Β· mailbox/shmem/hwsem β
β β β Vendor escape hatches: <alp/ext/{alif, renesas, deepx}> β
β β β β
β β β ββ 80+ Tier-1 chip drivers + Tier-2 community repo: β
β β β lsm6dso, bmi323, bmp581, icm42670, ina236, tmp112, β
β β β tcal9538, rv3028c7, 24c128, cc3501e, ssd1306, β
β β β ββ User libraries (board.yaml libraries:): β
β β β ETL Β· fmt Β· nlohmann_json Β· doctest Β· LVGL Β· MbedTLS Β· β
β β β CMSIS-DSP Β· LittleFS β
βββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β OS β ββΊ β Zephyr (M-class cores) Β· Yocto (A-class cores) Β· Bare-metal β
β (per-core β β heterogeneous = peers on the same SoM (per-core in cores:) β
β slice) β β β
βββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Vendor SDK β ββΊ β Alif Ensemble (AEN) Β· Renesas RZ/V2N Β· DEEPX DX-M1 β
β β β NPU runtimes dispatched into: Ethos-U/Vela Β· DRP-AI Β· DEEPX dx_rt β
βββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β HW + HAL β ββΊ β E1M (35Γ35 mm) + E1M-X (45Γ65 mm) SoMs Β· NPU silicon β
β β β E1M-EVK / E1M-X-EVK reference boards + vendor HALs β
βββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Both are first-class β pick whichever fits:
- Standalone / hand-written firmware. Write Zephyr, Yocto, or bare-metal
C directly against
<alp/...>headers, using instance IDs from<alp/e1m_pinout.h>(E1M) or<alp/e1m_x_pinout.h>(E1M-X). The standalone path is not a fallback β it's what the studio path also compiles down to. - alp-studio codegen.
alplabai/alp-studio(not a public GitHub repo) reads this repo's per-SoM presets (metadata/e1m_modules/<SKU>.yaml), runs its pin allocator, and emits the same<alp/...>calls you'd write by hand.
Swap-and-run is measured within a SoM family, against the generated
swap-test matrix: the 7 released E1M-AEN SKUs pass all three canonical
examples (all 21 E1M cells), and the 6 E1M-X SKUs pass two of three (12 / 18 cells β adc-voltmeter fails on all
six). Matrix at
docs/portability-matrix.md. Crossing
between E1M and E1M-X is intentionally out of scope: they're separate
product lines with separate pinout namespaces
(ADR 0011). Cookbook + worked
examples: docs/portability.md.
| Family | Form factor | SKUs | Primary silicon | AI throughput | OS targets |
|---|---|---|---|---|---|
| E1M-AEN | E1M (35Γ35 mm) | E1M-AEN301/401/501/601/701/801 + E1M-AEN803 |
Alif Ensemble E3βE8 (Cortex-M55 + optional A32 + Ethos-U55, U85 on E4/E6/E8) | up to ~1024 GOPS | Zephyr Β· bare-metal |
| E1M-X V2N | E1M-X (45Γ65 mm) | E1M-V2N101 |
Renesas RZ/V2N (4Γ A55 + M33 + DRP-AI3) | 4 TOPS | Yocto (A55) Β· Zephyr (M33 system manager) |
| E1M-X V2N | E1M-X (45Γ65 mm) | E1M-V2N102 |
Renesas RZ/V2N (4Γ A55 + M33 + DRP-AI3) | 4 TOPS | Yocto (A55); Zephyr M33 tree not yet built |
| E1M-X V2N | E1M-X (45Γ65 mm) | E1M-V2N103 |
Renesas RZ/V2N (4Γ A55 + M33 + DRP-AI3) | 4 TOPS | Yocto (A55); Zephyr M33 tree not yet built |
| E1M-X V2N-M1 | E1M-X (45Γ65 mm) | E1M-V2M101 |
Renesas RZ/V2N + DEEPX DX-M1 | 4 + 25 TOPS | Yocto (A55) Β· Zephyr (M33 system manager) |
| E1M-X V2N-M1 | E1M-X (45Γ65 mm) | E1M-V2M102 |
Renesas RZ/V2N + DEEPX DX-M1 | 4 + 25 TOPS | Yocto (A55); Zephyr M33 tree not yet built |
| E1M-X V2N-M1 | E1M-X (45Γ65 mm) | E1M-V2M103 |
Renesas RZ/V2N + DEEPX DX-M1 | 4 + 25 TOPS | Yocto (A55); Zephyr M33 tree not yet built |
All modules share the E1M open-standard form factor β pinout + mechanical
spec in alplabai/e1m-spec (pinned
v1.0). Evaluation kits: E1M EVK and E1M-X EVK, per-EVK detail in
docs/boards/.
Pick your SoM's one-pager, bring-up guide, and reference examples in
docs/firmware-quickstart.md. New to the
terms? docs/glossary.md. Stuck on an error?
docs/troubleshooting.md.
This repo's .vscode/ config (extensions, tasks, c_cpp_properties.json) is
pre-wired for Zephyr-module + plain-CMake development β clone, open the
folder, accept the recommended extensions. For schema-aware board.yaml
editing, a GUI configurator, and tan wrappers, install the
alplabai/alp-sdk-vscode
extension (a separate repo).
An Alp Platform release is one version number for a tested stack: the Alp
SDK, tan, the
VS Code extension and the GD32
and CC3501E bridge firmware, built and bench-validated together on real
modules. Each component keeps its own SemVer and gates; the SDK version below
is unchanged by it.
- Version:
YY.M.MICRO[-rcN], for example26.11.0. The month is never zero-padded (27.2, not27.02). The first line is 26.11 (November 2026); a new line ships every one to two months. - Pin a workspace: tan 0.8.0, shipping with the 26.11 line, adds a
platform command that pins a workspace to a line;
tan doctorthen reports any component that differs from the manifest. - Lock file: when a workspace is pinned,
alp.lockrecordsplatform: {version, manifestSha256}andverify_lockreports a changed pin or an SDK version that differs from the pinned one. Without a pin the lock is unchanged. - Support: the latest line gets every fix; the previous line gets security and brick-risk fixes for three months after the next line ships.
Pinning a platform never flashes firmware.
First-class on Linux, macOS, and Windows 11/10 (native
PowerShell or WSL2). Real-silicon Zephyr builds and tan build do not
work on Intel Macs β the pinned Zephyr SDK dropped its macos-x86_64 host
build; native_sim still works there. Yocto builds need Linux or WSL2 by
upstream bitbake constraint. Per-OS quickstart + gotchas:
docs/cross-platform-setup.md
(ADR 0012).
Verification status. Code merged β verified: every claim is tracked in
docs/test-plan.md, and a release doesn't tag until
its gating rows flip to β
. Treat register addresses, timing values, and
per-SoM accelerator wiring as paper-correct only until their test-plan row
flips. Silicon-verified today: the V2N GD32-bridge campaign (since v0.6)
AEN801 (15/17 peripheral apps) + CC3501E (Wi-Fi/BLE, GPIO proxy) since
v0.8, and E1M-V2M103 (DEEPX DX-M1 inference, GD32 bridge, provisioning flow); breadth beyond these families remains pre-HIL. Per-driver status also
lives in metadata/chips/<name>.yaml's verification: block and as
@par Verification status: [UNTESTED] Doxygen tags.
Backlog (cherry-picked as items land, no per-version commitments β full list
in VERSIONS.md): AEN family + V2N101 + V2M101
silicon-verified via self-hosted HiL Β· <alp/mproc.h> shmem/hwsem on
Zephyr Β· <alp/power.h> fleshed out Β· concurrent multi-NPU dispatch on
V2M101 Β· Mender OTA E2E on a V2N101 fleet Β· ABI snapshot frozen for v1.0 Β·
β€30-day customer onboarding dry-run Β· v1.0.0 after first customer pilot.
Deferred indefinitely past v1.0: the Ubuntu backend and
FreeRTOS/ThreadX/NuttX backends.
- Doc navigation hub:
docs/README.md - Per-(library Γ OS Γ SoM) status:
docs/os-support-matrix.md - What changed when:
CHANGELOG.md - Architecture + design:
docs/architecture.md; decision records:docs/adr/ - Full local verification (
bash scripts/test-all.sh) and what a green run proves:docs/testing.md - Contributing:
docs/contribution.md
Apache License 2.0 β see LICENSE.
Copyright 2026 Alp Lab AB.