diff --git a/.gitignore b/.gitignore index 0a0cfc37..b978bff9 100644 --- a/.gitignore +++ b/.gitignore @@ -74,12 +74,13 @@ tmp/ fvp_stdout.log # Editor config. The CMSIS Solution extension regenerates tasks.json, -# settings.json and cmsis.json; only the FVP run/debug wiring is kept: the -# model shim + its Dockerfile, and launch.json, whose Arm-FVP launch config is -# "manual" (see the comment in it). The leading negation overrides a global -# excludes file that ignores every .vscode directory. +# settings.json, cmsis.json and launch.json; only the macOS FVP wiring is kept: +# the model shim + its Dockerfile, and launch.json.mac, an Arm-FVP launch +# config that waits for the model in Docker (see the comment in it). The +# leading negation overrides a global excludes file that ignores every .vscode +# directory. !.vscode/ .vscode/* !.vscode/fvp.sh !.vscode/fvp.Dockerfile -!.vscode/launch.json +!.vscode/launch.json.mac diff --git a/.vscode.d/tasks.json b/.vscode.d/tasks.json index 2db55b93..d54dd232 100644 --- a/.vscode.d/tasks.json +++ b/.vscode.d/tasks.json @@ -31,10 +31,10 @@ "label": "Create AI layer", "detail": "Export model/model.py for the NPU in cmsis-executorch.cbuild-mlops.yml and write ai_layer/ (run a CMSIS build or 'cbuild setup' first)", "type": "shell", - "command": "python3", + "command": "${workspaceFolder}/.venv/bin/python", "args": ["create_ai_layer.py", "cmsis-executorch.cbuild-mlops.yml"], "windows": { - "command": "python" + "command": "${workspaceFolder}\\.venv\\Scripts\\python.exe" }, "options": { "cwd": "${workspaceFolder}" @@ -112,7 +112,7 @@ { "id": "setupPythonVersion", "type": "promptString", - "description": "Python version for uv (>=3.10,<3.15), e.g. 3.12 or 3.12.10", + "description": "Python version for uv (>=3.10,<3.14), e.g. 3.12 or 3.12.10", "default": "3.12" } ] diff --git a/.vscode/fvp.sh b/.vscode/fvp.sh index a10d35f8..918d6608 100755 --- a/.vscode/fvp.sh +++ b/.vscode/fvp.sh @@ -1,8 +1,9 @@ #!/usr/bin/env bash -# Stand-in for the FVP_Corstone_SSE-320 executable, referenced from the -# `debugger: model:` node of the SSE-320-U85 target-set. The CMSIS Solution -# extension runs it both as the "CMSIS Run" task and as the gdbtarget debug -# server, in the latter case with +# Stand-in for the FVP_Corstone_SSE-320 executable on macOS, where the +# `debugger: model:` node of the SSE-320-U85 target-set points at it (see the +# README). The CMSIS Solution extension runs it both as the "CMSIS Run" task +# and as the gdbtarget debug server (.vscode/launch.json.mac), in the latter +# case with # # -D --plugin $AVH_FVP_PLUGINS/GDBServer.so -C GDBServer.port=3333 \ # -f board/Corstone-320/fvp_config.txt --simlimit 60 -a .hex @@ -15,8 +16,8 @@ # * runs the model in Docker on macOS, where Arm publishes no FVP build, with # the GDB port forwarded to the host so arm-none-eabi-gdb can reach it. # -# On Linux it just execs the real model. On Windows, where the extension cannot -# run a bash script, point the csolution's `model:` at FVP_Corstone_SSE-320.exe. +# On Linux it just execs the real model. Windows and Linux need no shim: the +# csolution's `model:` names FVP_Corstone_SSE-320 directly. set -euo pipefail MODEL="${FVP_MODEL:-FVP_Corstone_SSE-320}" diff --git a/.vscode/launch.json b/.vscode/launch.json.mac similarity index 92% rename from .vscode/launch.json rename to .vscode/launch.json.mac index 5aa8d67f..03b36379 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json.mac @@ -2,6 +2,10 @@ "version": "0.2.0", "configurations": [ { + // macOS only: copy this file to .vscode/launch.json after pointing + // the csolution's `debugger: model:` at .vscode/fvp.sh. On Windows + // and Linux the extension generates a working launch.json itself. + // // Generated by the CMSIS Solution extension from its Arm-FVP adapter // template, then switched to "manual" because two "target" fields // differ from the generated ones and would be lost on regeneration: diff --git a/README.md b/README.md index c421783c..b6c0c587 100644 --- a/README.md +++ b/README.md @@ -13,14 +13,14 @@ itself is in [documentation/example.md](documentation/example.md). 1. Install [VS Code](https://code.visualstudio.com/). 2. Install the extensions **Keil Studio Pack** (`Arm.keil-studio-pack`, which - brings the CMSIS Solution extension 1.70.0 or newer that the project's - task drop-ins need) and **Python** (`ms-python.python`). Sign in with an + brings the CMSIS Solution extension 1.72.0 or newer with CMSIS-Toolbox + 2.15) and **Python** (`ms-python.python`). Sign in with an Arm account when Keil Studio asks; the free Keil MDK Community license is enough. 3. Nothing else by hand: when you open the project, the Arm Tools Environment Manager offers to install the tools pinned in `vcpkg-configuration.json` (CMSIS-Toolbox, Arm Compiler 6, GCC, CMake, Ninja, and on Linux and - Windows the Corstone-320 FVP; macOS runs it in Docker, see step 8). Accept. + Windows the Corstone-320 FVP; macOS runs it in Docker, see step 6). Accept. 4. Optional: the **CMSIS Developer Assistant** extension lets an AI agent (Claude Code or GitHub Copilot Chat) build, flash and debug the board through an MCP server. Install it, install one of the agents, run @@ -111,8 +111,8 @@ Repeat this after another project has reprogrammed the table. Arch: v2.0.0 MACs/cc: 256 Cmd stream: v1 - ExecuTorch Ethos-U85 example: 8896 byte model - Output: 10 element(s): 0.0079 0.0459 0.0475 -0.0475 0.0791 0.0411 -0.0285 -0.0744 -0.2246 -0.0016 + ExecuTorch Ethos-U85 example: 8736 byte model + Output: 10 element(s): -0.0142 0.0206 0.0601 -0.0886 0.0791 0.0522 -0.0301 -0.0775 -0.2800 -0.0095 Test_result: PASS ``` @@ -122,10 +122,11 @@ Repeat this after another project has reprogrammed the table. the output logits." **FVP instead of the board:** choose the **SSE-320-U85** target-type and click -**Run** or **Debug**; the same output appears in the terminal. On macOS the -FVP runs in Docker (Docker Desktop must be running; the first run builds the -image, about 100 MB). On Windows set `model:` in the csolution's SSE-320-U85 -target-set to `FVP_Corstone_SSE-320`. +**Run** or **Debug**; the same output appears in the terminal. On macOS, +where Arm ships no FVP build, the FVP runs in Docker: set `model:` in the +csolution's SSE-320-U85 target-set to `${workspaceFolder}/.vscode/fvp.sh`, +copy `.vscode/launch.json.mac` to `.vscode/launch.json`, and keep Docker +Desktop running (the first run builds the image, about 100 MB). ## 7. If something does not work @@ -143,10 +144,11 @@ target-set to `FVP_Corstone_SSE-320`. before the switch was moved. Set `UART4` and reopen the port. - **`app-write-mram` gets no answer:** press reset while it waits, check SW4 is on `SEUART`, close any terminal holding the port. -- **"torch is not installed":** run the task **Setup Python virtual +- **"`.venv` does not exist":** run the task **Setup Python virtual environment** first; it is only needed to regenerate the AI layer. -- After **Apply**, the extension adds a J-Link entry to `.vscode/launch.json` - next to the committed FVP entry. That is expected. +- `.vscode/launch.json` is generated by the extension for the target-types + and is not committed; after **Apply** it has a J-Link entry for the + DevKit-E8. That is expected. ## Read on diff --git a/RTE/_Debug_DevKit-E8/Pre_Include_Global.h b/RTE/_Debug_DevKit-E8/Pre_Include_Global.h index 78cdd4d3..1079a0a3 100644 --- a/RTE/_Debug_DevKit-E8/Pre_Include_Global.h +++ b/RTE/_Debug_DevKit-E8/Pre_Include_Global.h @@ -1,6 +1,6 @@ /* * CSOLUTION generated file: DO NOT EDIT! - * Generated by: csolution version 2.14.1+p38-gf512b381 + * Generated by: csolution version 2.15.1+p3-gf46d68bf * * Project: 'cmsis-executorch.Debug+DevKit-E8' * Target: 'Debug+DevKit-E8' @@ -12,10 +12,10 @@ /* ARM::Machine Learning:NPU Support:Ethos-U Driver&Generic U85@1.26.2 */ // enabling global pre includes #define ETHOSU_ARCH u85 -/* PyTorch::Machine Learning:ExecuTorch:Backend EthosU@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Backend EthosU@1.5.1 */ #define EXECUTORCH_BUILD_ARM_BAREMETAL 1 #define ET_USE_ETHOS_U_BACKEND 1 -/* PyTorch::Machine Learning:ExecuTorch:Runtime@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Runtime@1.5.1 */ /* ExecuTorch global configuration */ #define C10_USING_CUSTOM_GENERATED_MACROS #define FLATBUFFERS_MAX_ALIGNMENT 1024 diff --git a/RTE/_Debug_DevKit-E8/RTE_Components.h b/RTE/_Debug_DevKit-E8/RTE_Components.h index 161f6fa7..c9c805b5 100644 --- a/RTE/_Debug_DevKit-E8/RTE_Components.h +++ b/RTE/_Debug_DevKit-E8/RTE_Components.h @@ -1,6 +1,6 @@ /* * CSOLUTION generated file: DO NOT EDIT! - * Generated by: csolution version 2.14.1+p38-gf512b381 + * Generated by: csolution version 2.15.1+p3-gf46d68bf * * Project: 'cmsis-executorch.Debug+DevKit-E8' * Target: 'Debug+DevKit-E8' @@ -30,17 +30,17 @@ #define RTE_Drivers_USART /* Driver UART */ /* AlifSemiconductor::Device:SOC Peripherals:PINCONF@2.2.0 */ #define RTE_Drivers_LL_PINCONF /* Driver PinPAD and PinMux */ -/* PyTorch::Machine Learning:ExecuTorch Operators:Quantized dequantize@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch Operators:Quantized dequantize@1.5.1 */ #define RTE_ML_EXECUTORCH_OP_QUANTIZED_DEQUANTIZE /* ExecuTorch op_dequantize */ -/* PyTorch::Machine Learning:ExecuTorch Operators:Quantized quantize@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch Operators:Quantized quantize@1.5.1 */ #define RTE_ML_EXECUTORCH_OP_QUANTIZED_QUANTIZE /* ExecuTorch op_quantize */ -/* PyTorch::Machine Learning:ExecuTorch:Backend EthosU@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Backend EthosU@1.5.1 */ #define RTE_ML_EXECUTORCH_BACKEND_ETHOS_U /* ExecuTorch Ethos-U Backend (Cortex-M host) */ -/* PyTorch::Machine Learning:ExecuTorch:Kernel Registration@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Kernel Registration@1.5.1 */ #define RTE_ML_EXECUTORCH_KERNEL_REGISTRATION /* ExecuTorch Kernel Registration */ -/* PyTorch::Machine Learning:ExecuTorch:Kernel Utils@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Kernel Utils@1.5.1 */ #define RTE_ML_EXECUTORCH_KERNEL_UTILS /* ExecuTorch Kernel Utils */ -/* PyTorch::Machine Learning:ExecuTorch:Runtime@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Runtime@1.5.1 */ #define RTE_ML_EXECUTORCH_RUNTIME /* ExecuTorch Runtime */ diff --git a/RTE/_Debug_SSE-320-U85/Pre_Include_Global.h b/RTE/_Debug_SSE-320-U85/Pre_Include_Global.h index 37e190f9..83d53110 100644 --- a/RTE/_Debug_SSE-320-U85/Pre_Include_Global.h +++ b/RTE/_Debug_SSE-320-U85/Pre_Include_Global.h @@ -12,10 +12,10 @@ /* ARM::Machine Learning:NPU Support:Ethos-U Driver&Generic U85@1.26.2 */ // enabling global pre includes #define ETHOSU_ARCH u85 -/* PyTorch::Machine Learning:ExecuTorch:Backend EthosU@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Backend EthosU@1.5.1 */ #define EXECUTORCH_BUILD_ARM_BAREMETAL 1 #define ET_USE_ETHOS_U_BACKEND 1 -/* PyTorch::Machine Learning:ExecuTorch:Runtime@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Runtime@1.5.1 */ /* ExecuTorch global configuration */ #define C10_USING_CUSTOM_GENERATED_MACROS #define FLATBUFFERS_MAX_ALIGNMENT 1024 diff --git a/RTE/_Debug_SSE-320-U85/RTE_Components.h b/RTE/_Debug_SSE-320-U85/RTE_Components.h index 571f80b4..a80a87c2 100644 --- a/RTE/_Debug_SSE-320-U85/RTE_Components.h +++ b/RTE/_Debug_SSE-320-U85/RTE_Components.h @@ -30,17 +30,17 @@ #define RTE_TIMEOUT 1 /* ARM::Machine Learning:NPU Support:Ethos-U Driver&Generic U85@1.26.2 */ #define RTE_ETHOS_U_CORE_DRIVER -/* PyTorch::Machine Learning:ExecuTorch Operators:Quantized dequantize@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch Operators:Quantized dequantize@1.5.1 */ #define RTE_ML_EXECUTORCH_OP_QUANTIZED_DEQUANTIZE /* ExecuTorch op_dequantize */ -/* PyTorch::Machine Learning:ExecuTorch Operators:Quantized quantize@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch Operators:Quantized quantize@1.5.1 */ #define RTE_ML_EXECUTORCH_OP_QUANTIZED_QUANTIZE /* ExecuTorch op_quantize */ -/* PyTorch::Machine Learning:ExecuTorch:Backend EthosU@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Backend EthosU@1.5.1 */ #define RTE_ML_EXECUTORCH_BACKEND_ETHOS_U /* ExecuTorch Ethos-U Backend (Cortex-M host) */ -/* PyTorch::Machine Learning:ExecuTorch:Kernel Registration@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Kernel Registration@1.5.1 */ #define RTE_ML_EXECUTORCH_KERNEL_REGISTRATION /* ExecuTorch Kernel Registration */ -/* PyTorch::Machine Learning:ExecuTorch:Kernel Utils@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Kernel Utils@1.5.1 */ #define RTE_ML_EXECUTORCH_KERNEL_UTILS /* ExecuTorch Kernel Utils */ -/* PyTorch::Machine Learning:ExecuTorch:Runtime@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Runtime@1.5.1 */ #define RTE_ML_EXECUTORCH_RUNTIME /* ExecuTorch Runtime */ diff --git a/ai_layer/ai_layer.clayer.yml b/ai_layer/ai_layer.clayer.yml index 1322ac2c..87928945 100644 --- a/ai_layer/ai_layer.clayer.yml +++ b/ai_layer/ai_layer.clayer.yml @@ -6,7 +6,7 @@ layer: description: TinyCNN int8 image classifier for Ethos-U85 packs: - - pack: PyTorch::ExecuTorch@1.4.1 + - pack: PyTorch::ExecuTorch@1.5.1 define: - ET_LOG_ENABLED: 0 diff --git a/ai_layer/model_pte.c b/ai_layer/model_pte.c index 5d95da2f..cc6879ca 100644 --- a/ai_layer/model_pte.c +++ b/ai_layer/model_pte.c @@ -3,78 +3,74 @@ __attribute__((aligned(16))) const unsigned char model_pte[] = { 0x24, 0x00, 0x00, 0x00, 0x45, 0x54, 0x31, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x8c, 0x1a, 0x00, 0x00, 0x8c, 0x1a, 0x00, 0x00, 0xb0, 0xe1, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0x00, 0x54, 0x1a, 0x00, 0x00, 0x54, 0x1a, 0x00, 0x00, 0x50, 0xe2, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xe0, 0xdf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x32, 0xdf, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x50, 0x1a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xd2, 0xdf, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x10, 0x1a, 0x00, 0x00, 0x76, 0x65, 0x6c, 0x61, 0x5f, 0x62, 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6d, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb4, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4f, 0x50, 0x31, 0x01, 0x00, 0x10, 0x00, 0x18, 0x01, 0x00, 0x20, 0x00, 0x70, 0x00, 0x20, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf8, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0xe5, 0x00, + 0x30, 0x01, 0x00, 0x00, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x01, 0x01, 0x00, + 0x31, 0x40, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x32, 0x01, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x24, 0x40, 0x22, 0x20, 0x23, 0x72, 0xc9, 0x02, 0x05, 0x01, 0x01, 0x00, 0x0f, 0x01, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x01, 0x02, 0x00, 0x0c, 0x01, 0x02, 0x00, - 0x0a, 0x01, 0x0f, 0x00, 0x04, 0x01, 0x0f, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x04, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x09, 0x01, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, - 0x03, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x14, 0x01, 0x41, 0x19, 0x1f, 0x01, 0x01, 0x00, + 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x01, 0x0f, 0x00, 0x0c, 0x01, 0x0f, 0x00, + 0x0a, 0x01, 0x0f, 0x00, 0x04, 0x01, 0x02, 0x00, 0x05, 0x40, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x04, 0x40, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x09, 0x01, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, + 0x03, 0x01, 0x01, 0x00, 0x02, 0x01, 0x01, 0x00, 0x14, 0x01, 0x41, 0x00, 0x1f, 0x01, 0x01, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x12, 0x01, 0x02, 0x00, 0x11, 0x01, 0x0f, 0x00, 0x13, 0x01, 0x0f, 0x00, 0x1b, 0x01, 0x0f, 0x00, + 0x12, 0x01, 0x0f, 0x00, 0x11, 0x01, 0x0f, 0x00, 0x13, 0x01, 0x07, 0x00, 0x1b, 0x01, 0x0f, 0x00, 0x1c, 0x01, 0x0f, 0x00, 0x1a, 0x01, 0x0f, 0x00, 0x15, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x14, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x18, 0x01, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, - 0x25, 0x01, 0x00, 0x00, 0x26, 0x01, 0x80, 0xff, 0x27, 0x01, 0x7f, 0x00, 0x24, 0x40, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x16, 0x01, 0x0f, 0x00, 0x15, 0x01, 0x0f, 0x00, 0x17, 0x01, 0x0f, 0x00, - 0x24, 0x01, 0x00, 0x01, 0x2f, 0x01, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x30, 0x01, 0x00, 0x00, - 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x01, 0x01, 0x00, 0x31, 0x40, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x32, 0x01, 0x01, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x24, 0x40, 0x22, 0x20, 0x23, 0x72, 0xc9, 0x02, 0x05, 0x01, 0x41, 0x00, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x01, 0x0f, 0x00, 0x0c, 0x01, 0x0f, 0x00, - 0x04, 0x01, 0x02, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x01, 0x00, 0x03, 0x01, 0x01, 0x00, 0x02, 0x01, 0x01, 0x00, 0x14, 0x01, 0x41, 0x00, - 0x10, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x01, 0x0f, 0x00, 0x13, 0x01, 0x07, 0x00, 0x18, 0x01, 0x80, 0xff, 0x21, 0x01, 0x02, 0x00, 0x20, 0x01, 0x02, 0x00, 0x22, 0x01, 0x04, 0x00, - 0x2e, 0x01, 0x00, 0x00, 0x28, 0x01, 0x01, 0x00, 0x20, 0x40, 0x00, 0x00, 0xa0, 0x20, 0x00, 0x00, + 0x2e, 0x01, 0x00, 0x00, 0x28, 0x01, 0x01, 0x00, 0x20, 0x40, 0x00, 0x00, 0xa0, 0x13, 0x00, 0x00, 0x21, 0x40, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x29, 0x01, 0x01, 0x00, 0x22, 0x40, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x23, 0x40, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x16, 0x01, 0x07, 0x00, - 0x24, 0x01, 0x00, 0x02, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x04, 0x01, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, - 0x03, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x14, 0x01, 0x41, 0x01, 0x10, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x12, 0x01, 0x07, 0x00, 0x11, 0x01, 0x07, 0x00, 0x1b, 0x01, 0x07, 0x00, - 0x1c, 0x01, 0x07, 0x00, 0x1a, 0x01, 0x07, 0x00, 0x15, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x16, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x21, 0x01, 0x01, 0x00, - 0x20, 0x01, 0x01, 0x00, 0x22, 0x01, 0x03, 0x00, 0x24, 0x40, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, - 0x15, 0x01, 0x07, 0x00, 0x24, 0x01, 0x00, 0x01, 0x05, 0x00, 0x00, 0x00, 0x24, 0x40, 0x26, 0x20, - 0x9f, 0x71, 0x5e, 0x18, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x01, 0x07, 0x00, - 0x0c, 0x01, 0x07, 0x00, 0x0a, 0x01, 0x07, 0x00, 0x05, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x06, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x09, 0x01, 0x80, 0xff, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x01, 0x00, 0x03, 0x01, 0x01, 0x00, 0x02, 0x01, 0x01, 0x00, 0x14, 0x01, 0x41, 0x00, - 0x10, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x13, 0x01, 0x0f, 0x00, 0x18, 0x01, 0x80, 0xff, - 0x21, 0x01, 0x02, 0x00, 0x20, 0x01, 0x02, 0x00, 0x22, 0x01, 0x04, 0x00, 0x28, 0x01, 0x00, 0x00, - 0x20, 0x40, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x21, 0x40, 0x00, 0x00, 0xc0, 0x05, 0x00, 0x00, - 0x29, 0x01, 0x00, 0x00, 0x22, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x24, 0x01, 0x00, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x01, 0x0f, 0x00, - 0x09, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, - 0x02, 0x01, 0x00, 0x00, 0x14, 0x01, 0x01, 0x31, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x12, 0x01, 0x03, 0x00, 0x11, 0x01, 0x03, 0x00, 0x1b, 0x01, 0x0f, 0x00, 0x1c, 0x01, 0x0f, 0x00, - 0x1a, 0x01, 0x03, 0x00, 0x15, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x40, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x16, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, + 0x00, 0x13, 0x00, 0x00, 0x23, 0x40, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x25, 0x01, 0x00, 0x00, + 0x26, 0x01, 0x80, 0xff, 0x27, 0x01, 0x7f, 0x00, 0x16, 0x01, 0x07, 0x00, 0x15, 0x01, 0x0f, 0x00, + 0x17, 0x01, 0x0f, 0x00, 0x24, 0x01, 0x00, 0x02, 0x2f, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x05, 0x01, 0x41, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0x07, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x14, 0x01, 0x41, 0x01, + 0x10, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x01, 0x07, 0x00, 0x11, 0x01, 0x07, 0x00, + 0x1b, 0x01, 0x07, 0x00, 0x1c, 0x01, 0x07, 0x00, 0x1a, 0x01, 0x07, 0x00, 0x15, 0x40, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x16, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x21, 0x01, 0x01, 0x00, 0x20, 0x01, 0x01, 0x00, 0x22, 0x01, 0x03, 0x00, 0x24, 0x40, 0x00, 0x20, - 0x01, 0x00, 0x00, 0x00, 0x16, 0x01, 0x03, 0x00, 0x15, 0x01, 0x03, 0x00, 0x24, 0x01, 0x00, 0x01, - 0x05, 0x00, 0x00, 0x00, 0x24, 0x40, 0x29, 0x20, 0x8d, 0xa0, 0x86, 0x34, 0x05, 0x01, 0x01, 0x00, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, - 0x0a, 0x01, 0x00, 0x00, 0x04, 0x01, 0xff, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x04, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x09, 0x01, 0x80, 0xff, 0x14, 0x01, 0x01, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x12, 0x01, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x13, 0x01, 0x09, 0x00, 0x1b, 0x01, 0x00, 0x00, - 0x1c, 0x01, 0x00, 0x00, 0x1a, 0x01, 0x00, 0x00, 0x15, 0x40, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x14, 0x40, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x18, 0x01, 0x4d, 0x00, 0x21, 0x01, 0x00, 0x00, - 0x20, 0x01, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, - 0x21, 0x40, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x22, 0x40, 0x00, 0x00, 0x60, 0x08, 0x00, 0x00, - 0x16, 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x15, 0x01, 0x07, 0x00, 0x24, 0x01, 0x00, 0x01, 0x05, 0x00, 0x00, 0x00, + 0x24, 0x40, 0x28, 0x20, 0xc1, 0xc4, 0x79, 0x61, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x0b, 0x01, 0x07, 0x00, 0x0c, 0x01, 0x07, 0x00, 0x0a, 0x01, 0x07, 0x00, 0x05, 0x40, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x09, 0x01, 0x80, 0xff, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x03, 0x01, 0x01, 0x00, 0x02, 0x01, 0x01, 0x00, + 0x14, 0x01, 0x41, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x01, 0x0f, 0x00, + 0x18, 0x01, 0x80, 0xff, 0x21, 0x01, 0x02, 0x00, 0x20, 0x01, 0x02, 0x00, 0x22, 0x01, 0x04, 0x00, + 0x28, 0x01, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x21, 0x40, 0x00, 0x00, + 0xc0, 0x05, 0x00, 0x00, 0x29, 0x01, 0x00, 0x00, 0x22, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x24, 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0x0f, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x03, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x14, 0x01, 0x01, 0x31, 0x10, 0x40, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x12, 0x01, 0x03, 0x00, 0x11, 0x01, 0x03, 0x00, 0x1b, 0x01, 0x0f, 0x00, + 0x1c, 0x01, 0x0f, 0x00, 0x1a, 0x01, 0x03, 0x00, 0x15, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x14, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x16, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x18, 0x01, 0x00, 0x00, 0x21, 0x01, 0x01, 0x00, 0x20, 0x01, 0x01, 0x00, 0x22, 0x01, 0x03, 0x00, + 0x24, 0x40, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x16, 0x01, 0x03, 0x00, 0x15, 0x01, 0x03, 0x00, + 0x24, 0x01, 0x00, 0x01, 0x05, 0x00, 0x00, 0x00, 0x24, 0x40, 0x29, 0x20, 0x3b, 0xa1, 0x86, 0x34, + 0x05, 0x01, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, + 0x0c, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x04, 0x01, 0xff, 0x00, 0x05, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x80, 0xff, 0x14, 0x01, 0x01, 0x00, 0x10, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x13, 0x01, 0x09, 0x00, + 0x1b, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x1a, 0x01, 0x00, 0x00, 0x15, 0x40, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x14, 0x40, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x18, 0x01, 0x4d, 0x00, + 0x21, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x40, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x22, 0x40, 0x00, 0x00, + 0x60, 0x08, 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x98, 0xff, 0xff, 0x23, 0x72, 0xc9, 0x02, 0x22, 0x00, 0x45, 0xbd, 0xff, 0xff, 0xb9, 0x1d, @@ -109,16 +105,16 @@ __attribute__((aligned(16))) const unsigned char model_pte[] = { 0x14, 0x63, 0xf4, 0x94, 0xc4, 0xc2, 0x40, 0x9a, 0xbb, 0x12, 0x12, 0xfe, 0xa7, 0x91, 0xa9, 0x17, 0x37, 0x1f, 0x53, 0x1b, 0x49, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x68, 0x13, 0x00, 0x00, 0x9f, 0x71, 0x5e, 0x18, 0x26, 0x00, 0x01, 0x4b, 0x00, 0x00, 0xd1, 0xbb, - 0x93, 0x18, 0x26, 0x00, 0x80, 0xe5, 0xff, 0xff, 0xef, 0x3d, 0x28, 0x31, 0x27, 0x00, 0xa0, 0x3a, - 0x00, 0x00, 0x19, 0xbb, 0xe0, 0x30, 0x27, 0x00, 0xdd, 0xeb, 0x00, 0x00, 0xc3, 0x94, 0x2d, 0x62, - 0x28, 0x00, 0x35, 0x62, 0xff, 0xff, 0x0b, 0x5b, 0xf4, 0x5f, 0x28, 0x00, 0xb3, 0xf2, 0xff, 0xff, - 0x15, 0xe2, 0x05, 0x30, 0x27, 0x00, 0x06, 0xa5, 0xff, 0xff, 0x2d, 0xdb, 0x45, 0x0c, 0x25, 0x00, - 0xf4, 0xd1, 0x00, 0x00, 0x67, 0xa2, 0xe5, 0x30, 0x27, 0x00, 0xb7, 0xcb, 0x00, 0x00, 0x49, 0x9e, - 0x54, 0x62, 0x28, 0x00, 0x7f, 0xf9, 0xff, 0xff, 0x07, 0x61, 0x1f, 0x62, 0x28, 0x00, 0x0e, 0xad, - 0xff, 0xff, 0x31, 0x8e, 0x72, 0x18, 0x26, 0x00, 0x69, 0x6c, 0xff, 0xff, 0xf9, 0xbd, 0x3e, 0x0c, - 0x25, 0x00, 0xb6, 0xac, 0x00, 0x00, 0xdd, 0x24, 0xf2, 0x60, 0x28, 0x00, 0x85, 0xef, 0xff, 0xff, - 0xbb, 0x83, 0xc8, 0x61, 0x28, 0x00, 0x4b, 0xe3, 0x00, 0x00, 0xa9, 0x82, 0x3d, 0x18, 0x26, 0x00, + 0x68, 0x13, 0x00, 0x00, 0xc1, 0xc4, 0x79, 0x61, 0x28, 0x00, 0x01, 0x4b, 0x00, 0x00, 0x85, 0xed, + 0x4e, 0x62, 0x28, 0x00, 0x80, 0xe5, 0xff, 0xff, 0x1f, 0x7a, 0x50, 0x62, 0x28, 0x00, 0xa0, 0x3a, + 0x00, 0x00, 0x3b, 0xba, 0xe0, 0x30, 0x27, 0x00, 0xdd, 0xeb, 0x00, 0x00, 0x05, 0x93, 0x2d, 0x62, + 0x28, 0x00, 0x35, 0x62, 0xff, 0xff, 0x57, 0x59, 0xf4, 0x5f, 0x28, 0x00, 0xb3, 0xf2, 0xff, 0xff, + 0x3b, 0xe1, 0x05, 0x30, 0x27, 0x00, 0x06, 0xa5, 0xff, 0xff, 0xa9, 0xd7, 0x2e, 0x62, 0x28, 0x00, + 0xf4, 0xd1, 0x00, 0x00, 0x89, 0xa1, 0xe5, 0x30, 0x27, 0x00, 0xb7, 0xcb, 0x00, 0x00, 0x45, 0x4e, + 0x2a, 0x31, 0x27, 0x00, 0x7f, 0xf9, 0xff, 0xff, 0x49, 0x5f, 0x1f, 0x62, 0x28, 0x00, 0x0e, 0xad, + 0xff, 0xff, 0x07, 0x37, 0xca, 0x61, 0x28, 0x00, 0x69, 0x6c, 0xff, 0xff, 0x05, 0xf7, 0xfa, 0x30, + 0x27, 0x00, 0xb6, 0xac, 0x00, 0x00, 0x25, 0x23, 0xf2, 0x60, 0x28, 0x00, 0x85, 0xef, 0xff, 0xff, + 0xff, 0x81, 0xc8, 0x61, 0x28, 0x00, 0x4b, 0xe3, 0x00, 0x00, 0xeb, 0x08, 0xf6, 0x60, 0x28, 0x00, 0xc8, 0x23, 0x5c, 0x01, 0x0c, 0x00, 0xdd, 0xe4, 0x51, 0x20, 0x93, 0x44, 0x1d, 0x4a, 0x00, 0xe0, 0xba, 0xeb, 0x25, 0xc1, 0x9f, 0x95, 0x85, 0x03, 0x00, 0xad, 0xce, 0x82, 0xa8, 0x66, 0x08, 0x0c, 0x5c, 0xf5, 0xe5, 0xcb, 0xa9, 0xd9, 0xc2, 0xd4, 0x96, 0x00, 0x50, 0xd4, 0xc3, 0xef, 0xd2, 0x75, @@ -211,13 +207,13 @@ __attribute__((aligned(16))) const unsigned char model_pte[] = { 0x9a, 0xfa, 0x0d, 0x00, 0x35, 0xfc, 0xd3, 0x31, 0x9c, 0xfc, 0xea, 0x65, 0xf0, 0xbf, 0xcb, 0x9c, 0xc0, 0xb2, 0x44, 0x04, 0x71, 0xf5, 0xff, 0x78, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, - 0xbb, 0xf7, 0xfe, 0xff, 0x8d, 0xa0, 0x86, 0x34, 0x29, 0x00, 0xd8, 0x70, 0x01, 0x00, 0xa7, 0x3f, - 0x36, 0x34, 0x29, 0x00, 0x56, 0x05, 0x01, 0x00, 0x81, 0x58, 0xbc, 0x68, 0x2a, 0x00, 0x31, 0xf9, - 0xfe, 0xff, 0xcf, 0xea, 0xef, 0x68, 0x2a, 0x00, 0xcb, 0xa8, 0x00, 0x00, 0x49, 0x3e, 0x33, 0x34, - 0x29, 0x00, 0x2c, 0x9e, 0x00, 0x00, 0xcd, 0x98, 0x1a, 0x69, 0x2a, 0x00, 0x94, 0xeb, 0xfe, 0xff, - 0x1d, 0x76, 0x82, 0x34, 0x29, 0x00, 0x8d, 0xf0, 0xfe, 0xff, 0x4b, 0x61, 0xbe, 0x68, 0x2a, 0x00, - 0x4c, 0xc0, 0xfe, 0xff, 0x5b, 0xfb, 0xc7, 0x68, 0x2a, 0x00, 0x15, 0xac, 0x00, 0x00, 0xeb, 0x67, - 0x2e, 0x1a, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xbb, 0xf7, 0xfe, 0xff, 0x3b, 0xa1, 0x86, 0x34, 0x29, 0x00, 0xd8, 0x70, 0x01, 0x00, 0x15, 0x90, + 0x0d, 0x0d, 0x27, 0x00, 0x56, 0x05, 0x01, 0x00, 0x77, 0x16, 0x2f, 0x1a, 0x28, 0x00, 0x31, 0xf9, + 0xfe, 0xff, 0x2b, 0xec, 0xef, 0x68, 0x2a, 0x00, 0xcb, 0xa8, 0x00, 0x00, 0x7b, 0x9f, 0x19, 0x1a, + 0x28, 0x00, 0x2c, 0x9e, 0x00, 0x00, 0x45, 0x53, 0x23, 0x0d, 0x27, 0x00, 0x94, 0xeb, 0xfe, 0xff, + 0xcb, 0x76, 0x82, 0x34, 0x29, 0x00, 0x8d, 0xf0, 0xfe, 0xff, 0x53, 0x31, 0x5f, 0x34, 0x29, 0x00, + 0x4c, 0xc0, 0xfe, 0xff, 0x5b, 0xfe, 0x63, 0x34, 0x29, 0x00, 0x15, 0xac, 0x00, 0x00, 0x07, 0xa1, + 0xb9, 0x68, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -415,48 +411,42 @@ __attribute__((aligned(16))) const unsigned char model_pte[] = { 0xff, 0x84, 0x38, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x73, 0x63, 0x72, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x65, 0x6c, 0x61, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, - 0x28, 0x00, 0x24, 0x00, 0x20, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, - 0x08, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, - 0x68, 0x02, 0x00, 0x00, 0xf8, 0x02, 0x00, 0x00, 0xd0, 0x03, 0x00, 0x00, 0xd4, 0x03, 0x00, 0x00, - 0xd8, 0x03, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0xac, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x32, 0xfd, 0xff, 0xff, 0x0c, 0x00, 0x00, 0x00, - 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, - 0xd0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0xf8, 0xf9, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x65, 0x74, 0x68, 0x6f, 0x73, 0x2d, 0x75, 0x38, 0x35, 0x2d, 0x32, 0x35, - 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0x00, - 0x24, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x46, 0x61, 0x6c, 0x73, 0x65, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x70, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x5f, 0x69, 0x6f, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x5c, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x6f, 0x75, 0x70, 0x75, - 0x74, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, - 0x6f, 0x75, 0x6e, 0x64, 0x00, 0x00, 0x00, 0x00, 0x8c, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x76, 0x65, 0x6c, 0x61, 0x0d, 0x00, 0x00, 0x00, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x00, 0x00, 0x00, - 0xb4, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, - 0x2d, 0x2d, 0x61, 0x63, 0x63, 0x65, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2d, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x3d, 0x65, 0x74, 0x68, 0x6f, 0x73, 0x2d, 0x75, 0x38, 0x35, 0x2d, 0x32, - 0x35, 0x36, 0x20, 0x2d, 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3d, 0x2f, 0x55, 0x73, 0x65, - 0x72, 0x73, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x65, 0x72, 0x30, 0x31, 0x2f, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x2f, 0x43, 0x4d, 0x53, - 0x49, 0x53, 0x2d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x63, 0x68, 0x2d, 0x6d, 0x6c, - 0x6f, 0x70, 0x73, 0x2f, 0x2e, 0x63, 0x6d, 0x73, 0x69, 0x73, 0x2f, 0x65, 0x6e, 0x73, 0x65, 0x6d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x28, 0x00, 0x24, 0x00, 0x20, 0x00, 0x1c, 0x00, + 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, + 0x68, 0x03, 0x00, 0x00, 0x6c, 0x03, 0x00, 0x00, 0x70, 0x03, 0x00, 0x00, 0xf8, 0x05, 0x00, 0x00, + 0x44, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x9e, 0xfd, 0xff, 0xff, 0x0c, 0x00, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, + 0xa4, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0xfa, 0xff, 0xff, + 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x65, 0x74, 0x68, 0x6f, + 0x73, 0x2d, 0x75, 0x38, 0x35, 0x2d, 0x32, 0x35, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0x00, 0x8c, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x5f, 0x69, 0x6f, 0x5f, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, + 0xc4, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x76, 0x65, 0x6c, 0x61, 0x0d, 0x00, 0x00, 0x00, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x00, 0x00, 0x00, 0xec, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, + 0xa0, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x2d, 0x2d, 0x61, 0x63, 0x63, 0x65, 0x6c, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3d, 0x65, 0x74, 0x68, + 0x6f, 0x73, 0x2d, 0x75, 0x38, 0x35, 0x2d, 0x32, 0x35, 0x36, 0x20, 0x2d, 0x2d, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x3d, 0x2e, 0x63, 0x6d, 0x73, 0x69, 0x73, 0x2f, 0x65, 0x6e, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x65, 0x6c, 0x61, 0x2e, 0x69, 0x6e, 0x69, 0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3d, 0x72, 0x61, 0x77, 0x20, 0x2d, 0x2d, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, @@ -505,7 +495,7 @@ __attribute__((aligned(16))) const unsigned char model_pte[] = { 0x00, 0x00, 0x00, 0x02, 0x32, 0xfe, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xfe, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x4a, 0xfe, 0xff, 0xff, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x62, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x20, 0x31, 0xeb, 0x59, 0x3f, + 0x00, 0x00, 0x00, 0x04, 0x62, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x40, 0x31, 0xeb, 0x59, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x92, 0xfe, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, @@ -527,13 +517,13 @@ __attribute__((aligned(16))) const unsigned char model_pte[] = { 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x78, 0xff, 0xff, 0xff, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x05, 0x12, 0x00, 0x12, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x5b, 0x31, 0x2c, 0x20, 0x7b, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, diff --git a/cmsis-executorch.cproject.yml b/cmsis-executorch.cproject.yml index 5128d15f..62ac0773 100644 --- a/cmsis-executorch.cproject.yml +++ b/cmsis-executorch.cproject.yml @@ -7,7 +7,7 @@ # the Board layer brings the board bring-up. project: packs: - - pack: PyTorch::ExecuTorch@1.4.1 + - pack: PyTorch::ExecuTorch@1.5.1 - pack: ARM::CMSIS misc: diff --git a/cmsis-executorch.csolution.yml b/cmsis-executorch.csolution.yml index 01d5558d..a6fe2bf5 100644 --- a/cmsis-executorch.csolution.yml +++ b/cmsis-executorch.csolution.yml @@ -12,7 +12,7 @@ # create_ai_layer.py reads the NPU and Vela settings from it, exports the model # from PyTorch in the project's venv and writes the AI layer. solution: - created-for: CMSIS-Toolbox@2.14.1 + created-for: CMSIS-Toolbox@2.15.0 cdefault: compiler: AC6 @@ -20,7 +20,7 @@ solution: # Pinned exactly: the pack's C++ runtime and the Python exporter pinned in # requirements.txt must be the same ExecuTorch version, or the .pte fails # to load. `cbuild setup --packs` fetches it from the public index. - - pack: PyTorch::ExecuTorch@1.4.1 + - pack: PyTorch::ExecuTorch@1.5.1 - pack: ARM::CMSIS - pack: ARM::CMSIS-NN - pack: ARM::CMSIS-Compiler @@ -47,12 +47,11 @@ solution: debugger: name: Arm-FVP # The model is its own GDB server (plugins/GDBServer.so, MDK FVP - # models 11.32.23+). fvp.sh resolves that plugin when VS Code was - # not started from a `vcpkg activate` shell, line-buffers the - # model's stdout so the debug adapter sees the "Listening" banner, - # and on macOS runs the model in Docker (Arm ships no macOS build). - # On Windows point this straight at FVP_Corstone_SSE-320.exe. - model: ${workspaceFolder}/.vscode/fvp.sh + # models 11.32.23+). On Windows and Linux the FVP from vcpkg runs + # as it is. On macOS, where Arm ships no FVP build, set this to + # ${workspaceFolder}/.vscode/fvp.sh, which runs the model in + # Docker, and copy .vscode/launch.json.mac to .vscode/launch.json. + model: FVP_Corstone_SSE-320 config-file: board/Corstone-320/fvp_config.txt args: "--simlimit 60" @@ -81,17 +80,6 @@ solution: clock: 4000000 start-pname: M55_HP - misc: - # CMSIS-Toolbox 2.14.1 passes -mfpu=fpv5-sp-d16 to Clang for the Cortex-M85 - # and M55, a single-precision FPU on cores with a double-precision one and MVE; - # LLVM crashes on some kernels with that combination. The later option - # wins, so name the M85's FPU explicitly (newer toolboxes leave it to -mcpu). - - for-compiler: CLANG - C-CPP: - - -mfpu=fp-armv8-fullfp16-d16 - ASM: - - -mfpu=fp-armv8-fullfp16-d16 - build-types: - type: Debug debug: on @@ -102,7 +90,9 @@ solution: # MLOps information: exported to cmsis-executorch.cbuild-mlops.yml by # `cbuild setup ... --active SSE-320-U85`. Retarget the NPU here and - # create_ai_layer.py picks it up on its next run. + # create_ai_layer.py picks it up on its next run. The simulator and hardware + # targets come from the target-sets (Arm-FVP and J-Link Server), and the extra + # keys under model: are passed through to create_ai_layer.py. # https://open-cmsis-pack.github.io/cmsis-toolbox/build-overview/#mlops-information mlops: description: TinyCNN int8 image classifier for Ethos-U85 @@ -118,7 +108,7 @@ solution: model: clayer: $AI-Layer$ name: TinyCNN - hardware: - target: DevKit-E8 # named explicitly: the released 2.14.1 detects no hardware target - simulator: - target: SSE-320-U85 + # Model parameters for create_ai_layer.py: the NHWC input shape and the + # number of samples the quantizer is calibrated with. + input-shape: 1x16x16x3 + calibration-samples: 2 diff --git a/create_ai_layer.py b/create_ai_layer.py index d231470c..e55cce24 100644 --- a/create_ai_layer.py +++ b/create_ai_layer.py @@ -15,7 +15,9 @@ of the csolution. This script reads the NPU and Vela settings from it, exports the PyTorch model in model/model.py for that NPU (quantize, delegate to Ethos-U, compile with Vela) and writes the complete AI layer into the -directory of the clayer named under `model.clayer`: +directory of the clayer named under `model.clayer`. The extra keys of the +`model:` node (input-shape, calibration-samples) are model parameters that +CMSIS-Toolbox passes through to this script: ai_layer.clayer.yml runtime, kernel utilities and registration, Ethos-U backend and the operator components the exported @@ -31,6 +33,7 @@ import os import re +import shlex import subprocess import sys from pathlib import Path @@ -101,6 +104,42 @@ def executorch_pack(version: str) -> Path: return pack_root() / vendor / pack / version +# Vela options that are arguments of EthosUCompileSpec, and the ones the export +# sets itself: the configuration file comes from vela.ini of the cbuild-mlops.yml. +SPEC_OPTIONS = ("accelerator-config", "system-config", "memory-mode") +EXPORT_OPTIONS = ("config", "output-format", "output-dir") + + +def vela_options(options: str) -> tuple[dict[str, str], list[str]]: + """Split vela.options of the cbuild-mlops.yml: the EthosUCompileSpec arguments, and every other option. + + The other options are the `misc:` of the csolution's mlops: node (for + example `--optimise Size`); they reach Vela as extra flags, written as + `--name=value`. + """ + tokens = shlex.split(options) + spec, extra = {}, [] + while tokens: + token = tokens.pop(0) + if not token.startswith("--"): + sys.exit(f"vela options: unexpected '{token}' in '{options}'") + name, has_value, value = token[2:].partition("=") + if not has_value and tokens and not tokens[0].startswith("-"): + value = tokens.pop(0) + if name in EXPORT_OPTIONS: + sys.exit( + f"vela options: --{name} is set by the export; " + "the configuration file is vela: ini: of the mlops: node" + ) + if name in SPEC_OPTIONS: + if name in spec: + sys.exit(f"vela options: --{name} is given twice in '{options}'") + spec[name] = value + else: + extra.append(f"--{name}={value}" if value else f"--{name}") + return spec, extra + + def compile_spec(mlops: dict, mlops_dir: Path): """EthosUCompileSpec from the npu: and vela: nodes of the cbuild-mlops.yml.""" from executorch.backends.arm.ethosu import EthosUCompileSpec @@ -109,17 +148,14 @@ def compile_spec(mlops: dict, mlops_dir: Path): if not npu: sys.exit("the solution's mlops: node names no NPU; this example needs an Ethos-U") vela = mlops.get("vela", {}) - options = vela.get("options", "") - - def option(name: str) -> str | None: - found = re.search(rf"--{name}[= ](\S+)", options) - return found.group(1) if found else None + spec, extra = vela_options(vela.get("options", "")) - target = option("accelerator-config") or f"{npu['type'].lower()}-{npu.get('macs', 256)}" + target = spec.get("accelerator-config") or f"{npu['type'].lower()}-{npu.get('macs', 256)}" kwargs = { "target": target, - "system_config": option("system-config"), - "memory_mode": option("memory-mode"), + "system_config": spec.get("system-config"), + "memory_mode": spec.get("memory-mode"), + "extra_flags": extra, } if vela.get("ini"): # ExecuTorch stores the path in the compile spec, and the spec ends up @@ -130,7 +166,22 @@ def option(name: str) -> str | None: return EthosUCompileSpec(**kwargs) -def export_model(spec) -> bytes: +def model_params(mlops: dict) -> dict: + """The extra keys of the model: node, as keyword arguments for model/model.py.""" + params = {} + for key, value in mlops["model"].items(): + if key == "input-shape": + params["input_shape"] = tuple(int(d) for d in re.split(r"[x,]", str(value))) + elif key == "calibration-samples": + params["calibration_samples"] = int(value) + elif key not in ("clayer", "name"): + print(f"[ai_layer] warning: ignoring unknown model key {key!r}", file=sys.stderr) + if params: + print(f"[ai_layer] model parameters: {params}") + return params + + +def export_model(spec, params: dict) -> bytes: """Quantize model/model.py, delegate it to the Ethos-U and return the .pte.""" import torch from executorch.backends.arm.ethosu import EthosUPartitioner @@ -141,7 +192,8 @@ def export_model(spec) -> bytes: sys.path.insert(0, str(HERE / "model")) from model import get_calibration_inputs, get_model - model, samples = get_model(), get_calibration_inputs() + model = get_model(**{k: v for k, v in params.items() if k == "input_shape"}) + samples = get_calibration_inputs(**params) example = (samples[0],) graph = torch.export.export(model, example).module() @@ -259,7 +311,7 @@ def main() -> None: layer_file = mlops_file.parent / mlops["model"]["clayer"] layer_dir = layer_file.parent - pte = export_model(compile_spec(mlops, mlops_file.parent)) + pte = export_model(compile_spec(mlops, mlops_file.parent), model_params(mlops)) version = executorch_version(mlops_file) runtime, operators = components(pte, executorch_pack(version)) diff --git a/documentation/example.md b/documentation/example.md index 085a6ef0..55175959 100644 --- a/documentation/example.md +++ b/documentation/example.md @@ -4,7 +4,7 @@ This example shows how to deploy and run an [ExecuTorch](https://github.com/pytorch/executorch) model on an Arm Ethos-U NPU. The pack [`PyTorch::ExecuTorch`](https://www.keil.arm.com/packs/executorch-pytorch/) provides the source code components to build the ExecuTorch runtime, required operators, and Ethos-U backend. -The build process uses the [CMSIS-Toolbox 2.14.1](https://open-cmsis-pack.github.io/cmsis-toolbox/) or higher. +The build process uses the [CMSIS-Toolbox 2.15.0](https://open-cmsis-pack.github.io/cmsis-toolbox/) or higher. This example application targets the Arm Corstone-320 reference platform with an Ethos-U85 NPU, simulated on the Arm FVP, and the @@ -42,13 +42,13 @@ the first debug session, is the [getting-started README](../README.md). The pack [`PyTorch::ExecuTorch`](https://www.keil.arm.com/packs/executorch-pytorch/) can be optionally installed manually with: ```bash -cpackget add PyTorch::ExecuTorch@1.4.1 +cpackget add PyTorch::ExecuTorch@1.5.1 ``` > [!Note] > The pack and Python exporter versions must match, as the generated `.pte` -> format is consumed by the runtime supplied in `PyTorch::ExecuTorch@1.4.1`. -> The matching wheel is `executorch==1.4.1` from PyPI, pinned in +> format is consumed by the runtime supplied in `PyTorch::ExecuTorch@1.5.1`. +> The matching wheel is `executorch==1.5.1` from PyPI, pinned in > `requirements.txt`. ## Quick start @@ -70,11 +70,12 @@ The example can be built and run entirely in Keil Studio for VS Code. changing the model or the target. 5. Use the CMSIS action buttons to build the application, then select **Run** or **Debug**. Keil Studio starts the Corstone-320 FVP automatically. On macOS, - where Arm ships no FVP build, `.vscode/fvp.sh` runs the model in Docker: - Docker Desktop must be running, and the first Run or Debug builds the - container image (about 100 MB download). On Windows, set `model:` in the - csolution's target-set back to `FVP_Corstone_SSE-320` (the shim is a bash - script). + where Arm ships no FVP build, run the model in Docker instead: set `model:` + in the csolution's SSE-320-U85 target-set to + `${workspaceFolder}/.vscode/fvp.sh` and copy `.vscode/launch.json.mac` to + `.vscode/launch.json` (its debug configuration waits for the model to come + up in the container). Docker Desktop must be running, and the first Run or + Debug builds the container image (about 100 MB download). For the Alif Ensemble E8 DevKit, choose the `DevKit-E8` target-type in **Manage Solution** and follow the [getting-started README](../README.md) for the @@ -88,8 +89,8 @@ Ethos-U version info: Arch: v2.0.0 MACs/cc: 256 Cmd stream: v1 -ExecuTorch Ethos-U85 example: 8896 byte model -Output: 10 element(s): 0.0079 0.0459 0.0475 -0.0475 0.0791 0.0411 -0.0285 -0.0744 -0.2246 -0.0016 +ExecuTorch Ethos-U85 example: 8736 byte model +Output: 10 element(s): -0.0142 0.0206 0.0601 -0.0886 0.0791 0.0522 -0.0301 -0.0775 -0.2800 -0.0095 Test_result: PASS ``` @@ -169,14 +170,13 @@ out/cmsis-executorch/SSE-320-U85/Debug/cmsis-executorch.axf #### 4. Run on the FVP ```bash -.vscode/fvp.sh \ +FVP_Corstone_SSE-320 \ -f board/Corstone-320/fvp_config.txt --simlimit 60 \ -a out/cmsis-executorch/SSE-320-U85/Debug/cmsis-executorch.axf ``` -`.vscode/fvp.sh` is the model command the Run and Debug buttons use too; on -Linux and Windows `FVP_Corstone_SSE-320` can be called directly with the same -arguments. +This is the model command the Run and Debug buttons use too. On macOS, call +`.vscode/fvp.sh` with the same arguments; it runs the model in Docker. ## How model generation works @@ -193,16 +193,21 @@ mlops: model: clayer: $AI-Layer$ name: TinyCNN + input-shape: 1x16x16x3 + calibration-samples: 2 ``` `cbuild setup --active DevKit-E8` resolves it into `cmsis-executorch.cbuild-mlops.yml`, which contains the processor, NPU -and Vela options. With the Ensemble pack in the solution, the toolbox also +and Vela options, and the two target-sets as the `hardware:` and +`simulator:` to test on. With the Ensemble pack in the solution, the toolbox also copies the pack's Vela configuration to `.cmsis/ensemble_vela.ini` and adds `--accelerator-config ethos-u85-256`, for both targets; the system configuration named above comes from that file. `create_ai_layer.py` reads -those options and passes them to ExecuTorch's `EthosUCompileSpec`, so the -target configuration is never duplicated in Python. The script then writes: +those options and passes all of them to ExecuTorch's `EthosUCompileSpec`, so +the target configuration is never duplicated in Python. The two extra keys +under `model:` are parameters of the model itself; the toolbox passes them +through and the script hands them to `model/model.py`. The script then writes: - `ai_layer/ai_layer.clayer.yml`: the CMSIS components required by the model. - `ai_layer/model_pte.c` and `model_pte.h`: the ExecuTorch program embedded as a C array. @@ -222,8 +227,8 @@ changes the operator set needs nothing more than re-running steps 2 and 3. ## Adapting the example To use a different model, replace or modify `model/model.py` and update the -model name or input handling as required: `INPUT_SHAPE` and -`get_model(input_shape)` define the input, and +model name or input handling as required: `get_model(input_shape)` builds the +model for the `input-shape` of the `mlops:` node, and `get_calibration_inputs(input_shape, calibration_samples)` returns the samples the quantizer is calibrated with; give it representative data for a trained model. The runner in `src/app_main.cpp` builds its input tensor with the same @@ -231,9 +236,15 @@ fixed shape and prints the output as ten floats, so a model with another input shape or output needs matching changes there. Then re-run `create_ai_layer.py` and build. +Give an image model its input as NHWC, the layout of a camera frame, as +`model/model.py` does: the model permutes it to the NCHW its convolutions take, +and Vela folds that into the first convolution. With an NCHW input the NPU +first reorders the image in an operation of its own. + To target another Ethos-U configuration, update the target and `mlops:` settings in the CMSIS solution and re-run all three steps. The generated Vela -options then follow that configuration automatically. Moving to a different +options then follow that configuration automatically; `vela: misc:` takes any +further Vela option, for example `--optimise Size`. Moving to a different board or reference platform also requires the corresponding device pack, board support, memory layout, and FVP configuration. @@ -244,7 +255,7 @@ together. More information is available in ## Project layout | Path | Purpose | -|------|---------| +| ------ | --------- | | `cmsis-executorch.csolution.yml` | Solution, target, and MLOps configuration | | `cmsis-executorch.cproject.yml` | Application project: sources plus the Board and AI layers | | `model/model.py` | Example TinyCNN model | @@ -252,7 +263,7 @@ together. More information is available in | `ai_layer/` | Generated: component selection and the embedded model data | | `setup_venv.py` (`.sh` / `.bat`) | Creates the Python environment for the export | | `.vscode.d/tasks.json` | The VS Code tasks (venv setup, Create AI layer, Alif debug stubs) merged by the CMSIS Solution extension | -| `.vscode/fvp.sh`, `.vscode/fvp.Dockerfile` | The FVP model command used by Run and Debug; runs the model in Docker on macOS | +| `.vscode/fvp.sh`, `.vscode/fvp.Dockerfile`, `.vscode/launch.json.mac` | macOS only: runs the FVP in Docker, and the debug configuration that waits for it | | `board/Corstone-320/` | Corstone-320 platform support and FVP configuration | | `board/DevKit-E8/` | Alif Ensemble E8 DevKit board layer (M55_HP core, Ethos-U85, UART console) | | `.alif/` | SETOOLS configuration and debug stubs for the DevKit-E8 (from the Ensemble pack) | diff --git a/documentation/mlops-flow.md b/documentation/mlops-flow.md index c131db4c..1e0ad06b 100644 --- a/documentation/mlops-flow.md +++ b/documentation/mlops-flow.md @@ -34,19 +34,20 @@ solution: model: clayer: $AI-Layer$ name: TinyCNN - hardware: - target: DevKit-E8 # [@] of the board; - # named explicitly, 2.14.1 detects none - simulator: - target: SSE-320-U85 # [@] of the FVP + input-shape: 1x16x16x3 # passed through to create_ai_layer.py + calibration-samples: 2 ``` +CMSIS-Toolbox detects the `hardware:` target (DevKit-E8, J-Link Server) and +the `simulator:` target (SSE-320-U85, Arm-FVP) from the target-sets, and +passes the extra keys under `model:` through unchanged. + `cbuild setup cmsis-executorch.csolution.yml --active DevKit-E8` resolves it and writes `cmsis-executorch.cbuild-mlops.yml`: ```yaml cbuild-mlops: - generated-by: csolution version 2.14.1+p38-gf512b381 + generated-by: csolution version 2.15.1+p3-gf46d68bf description: TinyCNN int8 image classifier for Ethos-U85 processor: type: Cortex-M55 @@ -59,6 +60,8 @@ cbuild-mlops: model: clayer: ai_layer/ai_layer.clayer.yml name: TinyCNN + input-shape: 1x16x16x3 + calibration-samples: 2 hardware: active: DevKit-E8 cbuild-run: out/cmsis-executorch+DevKit-E8.cbuild-run.yml @@ -71,7 +74,7 @@ cbuild-mlops: output: - file: out/cmsis-executorch/SSE-320-U85/Debug/cmsis-executorch.axf type: elf - model: ${workspaceFolder}/.vscode/fvp.sh + model: FVP_Corstone_SSE-320 config-file: board/Corstone-320/fvp_config.txt ``` @@ -95,7 +98,9 @@ for an MLOps system. It reads the file and: 1. builds ExecuTorch's `EthosUCompileSpec` from `npu:` and `vela:` -- the accelerator (`ethos-u85-256`), system config and memory mode come from - there, so the Python code contains no NPU configuration; + there, and every other option in `vela.options` (the `misc:` of the + csolution's `vela:` node) reaches Vela as an extra flag, so the Python code + contains no NPU configuration; 2. exports `model/model.py`: quantizes it, delegates the whole graph to the Ethos-U and compiles it with Vela; 3. reads the operators the resulting program still calls on the CPU and looks diff --git a/documentation/pack-provenance.md b/documentation/pack-provenance.md index 6fb19ab9..5cf2144a 100644 --- a/documentation/pack-provenance.md +++ b/documentation/pack-provenance.md @@ -11,14 +11,14 @@ The pack is published as an asset of the matching ExecuTorch GitHub release, which is also what its `.pdsc` declares as its download location: ```xml -https://github.com/pytorch/executorch/releases/download/v1.4.1/ +https://github.com/pytorch/executorch/releases/download/v1.5.1/ ``` So the normal acquisition routes work, and `cbuild setup ... --packs` takes care of it on a fresh clone. To install it by hand: ```bash -cpackget add PyTorch::ExecuTorch@1.4.1 +cpackget add PyTorch::ExecuTorch@1.5.1 ``` The version is pinned exactly, in `cmsis-executorch.csolution.yml` and @@ -26,10 +26,10 @@ The version is pinned exactly, in `cmsis-executorch.csolution.yml` and ```yaml packs: - - pack: PyTorch::ExecuTorch@1.4.1 + - pack: PyTorch::ExecuTorch@1.5.1 ``` -Both must agree. The pin is exact rather than a `@^1.4.1` range because the +Both must agree. The pin is exact rather than a `@^1.5.1` range because the pack's C++ runtime and the Python exporter have to be the *same* ExecuTorch version — see [Moving to a new ExecuTorch version](#moving-to-a-new-executorch-version). @@ -63,7 +63,7 @@ ExecuTorch tree at `backends/arm/cmsis_pack/scripts/build_pack.sh`. ```bash git clone https://github.com/pytorch/executorch.git cd executorch -git checkout release/1.4 # or the tag matching your target version +git checkout release/1.5 # or the tag matching your target version git submodule update --init --recursive ``` @@ -111,7 +111,7 @@ them); the pack lands in the output directory: backends/arm/cmsis_pack/scripts/build_pack.sh \ --executorch-root "$PWD" \ --build-dir cmake-out-arm \ - --version 1.4.1-local \ + --version 1.5.1-local \ --output-dir pack-output ``` @@ -120,7 +120,7 @@ backends/arm/cmsis_pack/scripts/build_pack.sh \ Before trusting a freshly built pack, check the parts that go missing quietly: ```bash -VERSION=1.4.1-local +VERSION=1.5.1-local PACK=pack-output/PyTorch.ExecuTorch.$VERSION set -e @@ -158,7 +158,8 @@ in order: 2. **Update both pins** — `PyTorch::ExecuTorch@` in the csolution and in the cproject. 3. **Update the Python pins**: `executorch`, `torch` and `torchao` in - `requirements.txt`, following the new release's `install_requirements.py`; + `requirements.txt`, following the new release's `torch_pin.py` and + `install_requirements.py`; `requirements-arm-tosa.txt` (the TOSA serializer and its flatbuffers pin) only changes when the Arm backend's `requirements-arm-tosa.txt` does. 4. **Rebuild the venv, the AI layer and the project:** diff --git a/model/model.py b/model/model.py index d9d54a64..8af0e024 100644 --- a/model/model.py +++ b/model/model.py @@ -4,19 +4,22 @@ Small enough to export in seconds and fully partition onto the NPU, but real enough to exercise conv / relu / pool / linear through Vela. Input is a single -16x16 RGB image (NCHW); output is a 10-class logit vector. +16x16 RGB image (NHWC); output is a 10-class logit vector. """ import torch from torch import nn -INPUT_SHAPE = (1, 3, 16, 16) +# NHWC, the layout of a camera frame, which the Ethos-U reads as it is. An NCHW +# input costs one more NPU operation that reorders it before the first +# convolution. +INPUT_SHAPE = (1, 16, 16, 3) class TinyCNN(nn.Module): def __init__(self, input_shape: tuple[int, ...] = INPUT_SHAPE, num_classes: int = 10) -> None: super().__init__() - _, channels, height, width = input_shape + _, height, width, channels = input_shape self.features = nn.Sequential( nn.Conv2d(channels, 8, kernel_size=3, padding=1), nn.ReLU(), @@ -28,7 +31,8 @@ def __init__(self, input_shape: tuple[int, ...] = INPUT_SHAPE, num_classes: int self.classifier = nn.Linear(16 * (height // 4) * (width // 4), num_classes) def forward(self, x: torch.Tensor) -> torch.Tensor: - x = self.features(x) + # The convolutions take NCHW. Vela folds the permutation into the first one. + x = self.features(x.permute(0, 3, 1, 2)) x = torch.flatten(x, 1) return self.classifier(x) diff --git a/requirements.txt b/requirements.txt index 1fd6d11f..75f8ff19 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,12 +3,13 @@ # # executorch, torch and torchao must match: a .pte exported by one ExecuTorch # version only loads in the runtime of the same version, and that runtime is -# the PyTorch::ExecuTorch@1.4.1 pack pinned in the csolution. ExecuTorch 1.4.1 -# targets torch 2.13.0 and torchao 0.18.0 (install_requirements.py on the -# release/1.4 branch); prebuilt wheels exist for Linux, macOS and Windows, -# Python 3.10 to 3.14 (the export venv stays below 3.14: see requirements-arm-tosa.txt). -executorch==1.4.1 -torch==2.13.0 +# the PyTorch::ExecuTorch@1.5.1 pack pinned in the csolution. ExecuTorch 1.5.1 +# targets torch 2.14.0 (torch_pin.py at the v1.5.1 tag) and torchao 0.18 +# (the wheel requires torchao>=0.18.0,<0.19); prebuilt wheels exist for Linux, +# macOS and Windows, Python 3.10 to 3.14 (the export venv stays below 3.14: +# see requirements-arm-tosa.txt). +executorch==1.5.1 +torch==2.14.0 torchao==0.18.0 # Vela, the Ethos-U compiler. Same pin as executorch's `ethos_u` extra. diff --git a/setup_venv.bat b/setup_venv.bat index 73225e0c..c89e3180 100644 --- a/setup_venv.bat +++ b/setup_venv.bat @@ -9,7 +9,7 @@ REM and setup_venv.sh differ. With --uv, uv supplies the interpreter, e.g. REM setup_venv.bat --uv --python 3.12 setlocal set "SETUP_USE_UV=" -set "SETUP_UV_PYTHON=>=3.10,<3.15" +set "SETUP_UV_PYTHON=>=3.10,<3.14" REM SHIFT only changes numbered arguments; %* still forwards the original list. :scan_args if "%~1"=="" goto launch diff --git a/setup_venv.py b/setup_venv.py index 4e987584..0d79bc06 100755 --- a/setup_venv.py +++ b/setup_venv.py @@ -22,7 +22,7 @@ HERE = Path(__file__).resolve().parent VENV_DIR = HERE / ".venv" -# ExecuTorch 1.4 declares requires-python = ">=3.10,<3.15" in its pyproject.toml, +# ExecuTorch 1.5 declares requires-python = ">=3.10,<3.15" in its pyproject.toml, # but the tosa-tools 2026.5.0 it pins for the Arm backend (see # requirements-arm-tosa.txt) only ships wheels up to CPython 3.13, so on 3.14 # pip reports "No matching distribution found for tosa-tools==2026.5.0". diff --git a/src/app_main.cpp b/src/app_main.cpp index 54d1e758..b7fc869f 100644 --- a/src/app_main.cpp +++ b/src/app_main.cpp @@ -71,14 +71,14 @@ extern "C" int app_main(void) { std::make_unique(kMethodPoolSize, g_method_pool), std::make_unique(kTempPoolSize, g_temp_pool)); - // TinyCNN takes one 16x16 RGB image in NCHW order (see model/model.py), + // TinyCNN takes one 16x16 RGB image in NHWC order (see model/model.py), // filled here with a deterministic ramp. The tensor only wraps the buffer; // no tensor extension (and its std::random_device) is needed for that. - alignas(16) static float input_data[3 * 16 * 16]; + alignas(16) static float input_data[16 * 16 * 3]; for (size_t i = 0; i < sizeof(input_data) / sizeof(input_data[0]); ++i) { input_data[i] = static_cast(i % 32) / 32.0f - 0.5f; } - std::array sizes{1, 3, 16, 16}; + std::array sizes{1, 16, 16, 3}; std::array dim_order{0, 1, 2, 3}; TensorImpl input_impl(ScalarType::Float, sizes.size(), sizes.data(), input_data, dim_order.data()); Tensor input(&input_impl); diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json index 68cb2129..e9340040 100644 --- a/vcpkg-configuration.json +++ b/vcpkg-configuration.json @@ -7,7 +7,7 @@ } ], "requires": { - "arm:tools/open-cmsis-pack/cmsis-toolbox": "2.14.1", + "arm:tools/open-cmsis-pack/cmsis-toolbox": "2.15.0", "arm:compilers/arm/arm-none-eabi-gcc": "14.3.1", "arm:compilers/arm/llvm-embedded": "22.1.0", "arm:tools/kitware/cmake": "4.2.1",