tan-cli 0.7.0__py3-none-any.whl

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.
Files changed (330) hide show
  1. tan/__init__.py +0 -0
  2. tan/__main__.py +120 -0
  3. tan/cli.py +939 -0
  4. tan/command_table.py +265 -0
  5. tan/commands/__init__.py +8 -0
  6. tan/commands/bootstrap_cmd.py +4856 -0
  7. tan/commands/bootstrap_patches.py +164 -0
  8. tan/commands/bootstrap_toolchain_fetch.py +155 -0
  9. tan/commands/bootstrap_toolchain_pin.py +36 -0
  10. tan/commands/build/__init__.py +1 -0
  11. tan/commands/build/configure_inputs.py +277 -0
  12. tan/commands/build/execute.py +1852 -0
  13. tan/commands/build/host_python.py +59 -0
  14. tan/commands/build/link_stale.py +78 -0
  15. tan/commands/build/manifest.py +428 -0
  16. tan/commands/build/materialise.py +81 -0
  17. tan/commands/build/token_substitution.py +381 -0
  18. tan/commands/build/toolchain.py +482 -0
  19. tan/commands/build/user_defines_wipe.py +115 -0
  20. tan/commands/build/workspace_patches.py +65 -0
  21. tan/commands/build_cmd.py +2236 -0
  22. tan/commands/build_output.py +331 -0
  23. tan/commands/clean_cmd.py +1183 -0
  24. tan/commands/completion_cmd.py +786 -0
  25. tan/commands/debug_config_cmd.py +2425 -0
  26. tan/commands/diff_cmd.py +940 -0
  27. tan/commands/doctor_cmd.py +4767 -0
  28. tan/commands/examples_cmd.py +644 -0
  29. tan/commands/explain_cmd.py +1319 -0
  30. tan/commands/faultdecode_cmd.py +931 -0
  31. tan/commands/flash_atoc_guard.py +240 -0
  32. tan/commands/flash_cmd.py +5731 -0
  33. tan/commands/flash_mram_guard.py +150 -0
  34. tan/commands/flash_ram.py +578 -0
  35. tan/commands/flash_raw.py +583 -0
  36. tan/commands/generate_cmd.py +1456 -0
  37. tan/commands/image_cmd.py +753 -0
  38. tan/commands/init_cmd.py +1740 -0
  39. tan/commands/inspect_cmd.py +377 -0
  40. tan/commands/kconfig_cmd.py +734 -0
  41. tan/commands/model_cmd.py +1514 -0
  42. tan/commands/model_device_cmd.py +351 -0
  43. tan/commands/model_device_live.py +234 -0
  44. tan/commands/model_host_cmd.py +430 -0
  45. tan/commands/model_zoo_cmd.py +363 -0
  46. tan/commands/monitor_actions.py +125 -0
  47. tan/commands/monitor_cmd.py +626 -0
  48. tan/commands/monitor_session.py +505 -0
  49. tan/commands/new_som_cmd.py +1522 -0
  50. tan/commands/pinmux_cmd.py +568 -0
  51. tan/commands/presets_cmd.py +1123 -0
  52. tan/commands/probe_cmd.py +421 -0
  53. tan/commands/reset_cmd.py +354 -0
  54. tan/commands/reset_confirm.py +168 -0
  55. tan/commands/run_cmd.py +637 -0
  56. tan/commands/scaffold_cmd.py +490 -0
  57. tan/commands/sdk_cmd.py +1723 -0
  58. tan/commands/size_cmd.py +1020 -0
  59. tan/commands/support_bundle_cmd.py +1073 -0
  60. tan/commands/trace_cmd.py +341 -0
  61. tan/commands/validate_cmd.py +2009 -0
  62. tan/commands/west_forward_cmd.py +736 -0
  63. tan/commands/workspace_patch_check.py +296 -0
  64. tan/core/__init__.py +1 -0
  65. tan/core/alp_conf_pregen.py +100 -0
  66. tan/core/artifact_provenance.py +240 -0
  67. tan/core/atoc_guard.py +276 -0
  68. tan/core/atoc_guard_messages.py +232 -0
  69. tan/core/atoc_replacement.py +118 -0
  70. tan/core/atomic_write.py +178 -0
  71. tan/core/board_context.py +351 -0
  72. tan/core/board_diagnostic.py +111 -0
  73. tan/core/board_files.py +221 -0
  74. tan/core/board_validator.py +542 -0
  75. tan/core/board_validator_compat.py +196 -0
  76. tan/core/board_validator_run.py +129 -0
  77. tan/core/board_validator_schema.py +186 -0
  78. tan/core/board_validator_skew.py +46 -0
  79. tan/core/board_yaml_edit.py +295 -0
  80. tan/core/board_yaml_pos.py +118 -0
  81. tan/core/bootstrap.py +2572 -0
  82. tan/core/build_plan.py +625 -0
  83. tan/core/consent.py +104 -0
  84. tan/core/console_filter.py +245 -0
  85. tan/core/debug_launch.py +1803 -0
  86. tan/core/devicetree_lint.py +168 -0
  87. tan/core/dir_removal.py +229 -0
  88. tan/core/doctor_git.py +172 -0
  89. tan/core/doctor_libraries.py +253 -0
  90. tan/core/doctor_render.py +185 -0
  91. tan/core/doctor_scope.py +66 -0
  92. tan/core/doctor_setools.py +237 -0
  93. tan/core/doctor_stale.py +180 -0
  94. tan/core/document_guards.py +723 -0
  95. tan/core/dp_id.py +97 -0
  96. tan/core/elf_load.py +63 -0
  97. tan/core/error_catalog.py +171 -0
  98. tan/core/example_catalog.py +499 -0
  99. tan/core/example_facets.py +151 -0
  100. tan/core/faultdecode.py +521 -0
  101. tan/core/flash_plan.py +2501 -0
  102. tan/core/flow_d_report.py +381 -0
  103. tan/core/flow_d_uptime.py +164 -0
  104. tan/core/fs_confine.py +130 -0
  105. tan/core/global_flags.py +230 -0
  106. tan/core/host_python.py +210 -0
  107. tan/core/image_bundle.py +247 -0
  108. tan/core/inert.py +147 -0
  109. tan/core/jlink_binary.py +128 -0
  110. tan/core/jlink_probe.py +481 -0
  111. tan/core/jsonc_splice.py +404 -0
  112. tan/core/launch_provenance.py +257 -0
  113. tan/core/link_refusal.py +76 -0
  114. tan/core/metadata_schema.py +376 -0
  115. tan/core/model_check.py +227 -0
  116. tan/core/model_device.py +449 -0
  117. tan/core/model_doctor.py +198 -0
  118. tan/core/model_host.py +48 -0
  119. tan/core/model_list.py +112 -0
  120. tan/core/model_zoo.py +353 -0
  121. tan/core/module_template.py +340 -0
  122. tan/core/mram_link.py +87 -0
  123. tan/core/new_som_ospi.py +94 -0
  124. tan/core/os_class.py +159 -0
  125. tan/core/patch_paths.py +87 -0
  126. tan/core/pending.py +40 -0
  127. tan/core/plain_zephyr_plan.py +138 -0
  128. tan/core/plan_exec.py +373 -0
  129. tan/core/plan_tokens.py +600 -0
  130. tan/core/probe.py +155 -0
  131. tan/core/probe_plan.py +237 -0
  132. tan/core/proxy.py +168 -0
  133. tan/core/publish.py +31 -0
  134. tan/core/python_floor.py +178 -0
  135. tan/core/ram_run.py +694 -0
  136. tan/core/ram_watch.py +231 -0
  137. tan/core/raw_write.py +160 -0
  138. tan/core/reset_plan.py +56 -0
  139. tan/core/run.py +161 -0
  140. tan/core/scaffold.py +2203 -0
  141. tan/core/scaffold_selftest_identity.py +225 -0
  142. tan/core/sdk_default_registry.py +565 -0
  143. tan/core/sdk_discovery.py +996 -0
  144. tan/core/sdk_removal.py +465 -0
  145. tan/core/serial_actions.py +175 -0
  146. tan/core/serial_capture.py +185 -0
  147. tan/core/serial_url.py +45 -0
  148. tan/core/setools.py +608 -0
  149. tan/core/setools_scratch.py +243 -0
  150. tan/core/shapes.py +194 -0
  151. tan/core/size.py +610 -0
  152. tan/core/som_buildability.py +204 -0
  153. tan/core/som_schema_version.py +62 -0
  154. tan/core/subprocess_env.py +201 -0
  155. tan/core/sysbuild_image.py +94 -0
  156. tan/core/system_manifest.py +827 -0
  157. tan/core/text_layout.py +73 -0
  158. tan/core/timestamp.py +182 -0
  159. tan/core/tool_lookup.py +383 -0
  160. tan/core/toolchain_pin.py +117 -0
  161. tan/core/toolchain_provision.py +1224 -0
  162. tan/core/trusted_path.py +134 -0
  163. tan/core/uboot_breakin.py +154 -0
  164. tan/core/uri_reference.py +415 -0
  165. tan/core/user_defines.py +152 -0
  166. tan/core/venv.py +332 -0
  167. tan/core/west_patches.py +143 -0
  168. tan/core/west_workspace_refusal.py +159 -0
  169. tan/core/zephyr_env.py +124 -0
  170. tan/env.py +185 -0
  171. tan/envelope.py +647 -0
  172. tan/exit_codes.py +12 -0
  173. tan/lazy_typer.py +185 -0
  174. tan/model/__init__.py +2 -0
  175. tan/model/_gen_fixture.py +132 -0
  176. tan/model/adapters/__init__.py +116 -0
  177. tan/model/adapters/cpu.py +26 -0
  178. tan/model/adapters/deepx.py +94 -0
  179. tan/model/adapters/drpai.py +242 -0
  180. tan/model/adapters/ethos_u.py +951 -0
  181. tan/model/adapters/executorch.py +55 -0
  182. tan/model/analyze.py +694 -0
  183. tan/model/build.py +304 -0
  184. tan/model/check.py +682 -0
  185. tan/model/manifest.py +625 -0
  186. tan/model/measure.py +216 -0
  187. tan/model/npu_ops_validate.py +130 -0
  188. tan/model/package.py +125 -0
  189. tan/model/perf.py +635 -0
  190. tan/model/perf_apply.py +721 -0
  191. tan/model/prep.py +193 -0
  192. tan/model/sram_fit.py +502 -0
  193. tan/model/targets.py +374 -0
  194. tan/model/tensorio.py +287 -0
  195. tan/net.py +73 -0
  196. tan/output_format.py +213 -0
  197. tan/planner/__init__.py +219 -0
  198. tan/planner/aperture.py +202 -0
  199. tan/planner/buildplan.py +1092 -0
  200. tan/planner/camera_owner.py +192 -0
  201. tan/planner/cameras.py +132 -0
  202. tan/planner/carveout.py +755 -0
  203. tan/planner/cli.py +274 -0
  204. tan/planner/headers.py +315 -0
  205. tan/planner/kconfig.py +2435 -0
  206. tan/planner/kconfig_symbols.py +473 -0
  207. tan/planner/libraries.py +677 -0
  208. tan/planner/link_target.py +237 -0
  209. tan/planner/linux_ownership.py +216 -0
  210. tan/planner/loader.py +1525 -0
  211. tan/planner/manifest.py +116 -0
  212. tan/planner/memory.py +161 -0
  213. tan/planner/memregion.py +56 -0
  214. tan/planner/models.py +533 -0
  215. tan/planner/orchestrator.py +874 -0
  216. tan/planner/ownership.py +203 -0
  217. tan/planner/partition.py +1160 -0
  218. tan/planner/paths.py +32 -0
  219. tan/planner/plain_slice.py +139 -0
  220. tan/planner/project_emit/__init__.py +60 -0
  221. tan/planner/project_emit/bom_netlist.py +375 -0
  222. tan/planner/project_emit/dts.py +580 -0
  223. tan/planner/project_emit/hw_info.py +221 -0
  224. tan/planner/project_emit/native_sim.py +136 -0
  225. tan/planner/project_emit/west_libs.py +213 -0
  226. tan/planner/project_loader.py +264 -0
  227. tan/planner/sdk_capability.py +203 -0
  228. tan/planner/sdk_compat.py +395 -0
  229. tan/planner/secure.py +350 -0
  230. tan/planner/slugs.py +394 -0
  231. tan/planner/som_metadata.py +325 -0
  232. tan/planner/strict_loaders.py +131 -0
  233. tan/planner/template.py +1037 -0
  234. tan/planner/template_pins.py +535 -0
  235. tan/planner/template_rewrite.py +714 -0
  236. tan/planner/topology.py +208 -0
  237. tan/planner/validate.py +365 -0
  238. tan/planner/whole_device_alias.py +67 -0
  239. tan/planner/zephyr_board.py +3510 -0
  240. tan/planner_cli.py +97 -0
  241. tan/planner_emit.py +617 -0
  242. tan/planner_root.py +119 -0
  243. tan/soc_ref.py +58 -0
  244. tan/templates/__init__.py +34 -0
  245. tan/templates/vendored/MANIFEST.md +1862 -0
  246. tan/templates/vendored/diagnostics/E1M-AEN801/CMakeLists.txt +8 -0
  247. tan/templates/vendored/diagnostics/E1M-AEN801/README.md +112 -0
  248. tan/templates/vendored/diagnostics/E1M-AEN801/board.yaml +38 -0
  249. tan/templates/vendored/diagnostics/E1M-AEN801/boards/native_sim_native_64.conf +11 -0
  250. tan/templates/vendored/diagnostics/E1M-AEN801/boards/native_sim_native_64.overlay +29 -0
  251. tan/templates/vendored/diagnostics/E1M-AEN801/prj.conf +5 -0
  252. tan/templates/vendored/diagnostics/E1M-AEN801/src/main.c +266 -0
  253. tan/templates/vendored/diagnostics/E1M-AEN801/testcase.yaml +53 -0
  254. tan/templates/vendored/diagnostics/E1M-V2N101/CMakeLists.txt +8 -0
  255. tan/templates/vendored/diagnostics/E1M-V2N101/README.md +112 -0
  256. tan/templates/vendored/diagnostics/E1M-V2N101/board.yaml +38 -0
  257. tan/templates/vendored/diagnostics/E1M-V2N101/boards/native_sim_native_64.conf +11 -0
  258. tan/templates/vendored/diagnostics/E1M-V2N101/boards/native_sim_native_64.overlay +29 -0
  259. tan/templates/vendored/diagnostics/E1M-V2N101/prj.conf +5 -0
  260. tan/templates/vendored/diagnostics/E1M-V2N101/src/main.c +266 -0
  261. tan/templates/vendored/diagnostics/E1M-V2N101/testcase.yaml +53 -0
  262. tan/templates/vendored/edge-ai/E1M-AEN801/CMakeLists.txt +10 -0
  263. tan/templates/vendored/edge-ai/E1M-AEN801/README.md +75 -0
  264. tan/templates/vendored/edge-ai/E1M-AEN801/board.yaml +38 -0
  265. tan/templates/vendored/edge-ai/E1M-AEN801/prj.conf +8 -0
  266. tan/templates/vendored/edge-ai/E1M-AEN801/src/cold_chain.c +371 -0
  267. tan/templates/vendored/edge-ai/E1M-AEN801/src/cold_chain.h +178 -0
  268. tan/templates/vendored/edge-ai/E1M-AEN801/src/main.c +373 -0
  269. tan/templates/vendored/edge-ai/E1M-AEN801/testcase.yaml +62 -0
  270. tan/templates/vendored/edge-ai/E1M-V2N101/CMakeLists.txt +10 -0
  271. tan/templates/vendored/edge-ai/E1M-V2N101/README.md +75 -0
  272. tan/templates/vendored/edge-ai/E1M-V2N101/board.yaml +37 -0
  273. tan/templates/vendored/edge-ai/E1M-V2N101/prj.conf +8 -0
  274. tan/templates/vendored/edge-ai/E1M-V2N101/src/cold_chain.c +371 -0
  275. tan/templates/vendored/edge-ai/E1M-V2N101/src/cold_chain.h +178 -0
  276. tan/templates/vendored/edge-ai/E1M-V2N101/src/main.c +373 -0
  277. tan/templates/vendored/edge-ai/E1M-V2N101/testcase.yaml +62 -0
  278. tan/templates/vendored/iot/E1M-AEN801/CMakeLists.txt +14 -0
  279. tan/templates/vendored/iot/E1M-AEN801/README.md +103 -0
  280. tan/templates/vendored/iot/E1M-AEN801/board.yaml +69 -0
  281. tan/templates/vendored/iot/E1M-AEN801/prj.conf +15 -0
  282. tan/templates/vendored/iot/E1M-AEN801/src/cc3501e_bridge.c +196 -0
  283. tan/templates/vendored/iot/E1M-AEN801/src/cc3501e_bridge.h +173 -0
  284. tan/templates/vendored/iot/E1M-AEN801/src/main.c +262 -0
  285. tan/templates/vendored/iot/E1M-AEN801/testcase.yaml +68 -0
  286. tan/templates/vendored/minimal/E1M-AEN801/CMakeLists.txt +8 -0
  287. tan/templates/vendored/minimal/E1M-AEN801/README.md +108 -0
  288. tan/templates/vendored/minimal/E1M-AEN801/board.yaml +32 -0
  289. tan/templates/vendored/minimal/E1M-AEN801/prj.conf +8 -0
  290. tan/templates/vendored/minimal/E1M-AEN801/src/main.c +111 -0
  291. tan/templates/vendored/minimal/E1M-AEN801/testcase.yaml +49 -0
  292. tan/templates/vendored/minimal/E1M-V2N101/CMakeLists.txt +8 -0
  293. tan/templates/vendored/minimal/E1M-V2N101/README.md +108 -0
  294. tan/templates/vendored/minimal/E1M-V2N101/board.yaml +32 -0
  295. tan/templates/vendored/minimal/E1M-V2N101/prj.conf +8 -0
  296. tan/templates/vendored/minimal/E1M-V2N101/src/main.c +111 -0
  297. tan/templates/vendored/minimal/E1M-V2N101/testcase.yaml +49 -0
  298. tan/templates/vendored/multicore-mailbox/E1M-AEN801/CMakeLists.txt +8 -0
  299. tan/templates/vendored/multicore-mailbox/E1M-AEN801/README.md +120 -0
  300. tan/templates/vendored/multicore-mailbox/E1M-AEN801/board.yaml +57 -0
  301. tan/templates/vendored/multicore-mailbox/E1M-AEN801/boards/native_sim_native_64.overlay +40 -0
  302. tan/templates/vendored/multicore-mailbox/E1M-AEN801/peer/CMakeLists.txt +13 -0
  303. tan/templates/vendored/multicore-mailbox/E1M-AEN801/peer/main.c +171 -0
  304. tan/templates/vendored/multicore-mailbox/E1M-AEN801/peer/prj.conf +17 -0
  305. tan/templates/vendored/multicore-mailbox/E1M-AEN801/peer/testcase.yaml +23 -0
  306. tan/templates/vendored/multicore-mailbox/E1M-AEN801/prj.conf +22 -0
  307. tan/templates/vendored/multicore-mailbox/E1M-AEN801/src/main.c +185 -0
  308. tan/templates/vendored/multicore-mailbox/E1M-AEN801/testcase.yaml +26 -0
  309. tan/templates/vendored/sensor/E1M-AEN801/CMakeLists.txt +8 -0
  310. tan/templates/vendored/sensor/E1M-AEN801/README.md +112 -0
  311. tan/templates/vendored/sensor/E1M-AEN801/board.yaml +57 -0
  312. tan/templates/vendored/sensor/E1M-AEN801/boards/native_sim_native_64.conf +10 -0
  313. tan/templates/vendored/sensor/E1M-AEN801/boards/native_sim_native_64.overlay +28 -0
  314. tan/templates/vendored/sensor/E1M-AEN801/prj.conf +5 -0
  315. tan/templates/vendored/sensor/E1M-AEN801/src/main.c +186 -0
  316. tan/templates/vendored/sensor/E1M-AEN801/testcase.yaml +52 -0
  317. tan/templates/vendored/sensor/E1M-V2N101/CMakeLists.txt +8 -0
  318. tan/templates/vendored/sensor/E1M-V2N101/README.md +112 -0
  319. tan/templates/vendored/sensor/E1M-V2N101/board.yaml +57 -0
  320. tan/templates/vendored/sensor/E1M-V2N101/boards/native_sim_native_64.conf +10 -0
  321. tan/templates/vendored/sensor/E1M-V2N101/boards/native_sim_native_64.overlay +28 -0
  322. tan/templates/vendored/sensor/E1M-V2N101/prj.conf +5 -0
  323. tan/templates/vendored/sensor/E1M-V2N101/src/main.c +186 -0
  324. tan/templates/vendored/sensor/E1M-V2N101/testcase.yaml +52 -0
  325. tan/version.py +102 -0
  326. tan_cli-0.7.0.dist-info/METADATA +125 -0
  327. tan_cli-0.7.0.dist-info/RECORD +330 -0
  328. tan_cli-0.7.0.dist-info/WHEEL +5 -0
  329. tan_cli-0.7.0.dist-info/entry_points.txt +2 -0
  330. tan_cli-0.7.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,49 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ sample:
4
+ name: hello-world
5
+ description: |
6
+ Minimal "first program" example. Prints a periodic heartbeat
7
+ so customers can verify their toolchain + flash flow + log
8
+ console before tackling peripheral wiring. Builds on both
9
+ EVKs: no board-specific macros required.
10
+
11
+ tests:
12
+ alp_sdk.example.hello_world.e1m_x_evk:
13
+ extra_args: EXTRA_CONF_FILE=generated/alp.conf
14
+ platform_allow:
15
+ - native_sim
16
+ - native_sim/native/64
17
+ integration_platforms:
18
+ - native_sim/native/64
19
+ extra_configs:
20
+ - 'CONFIG_COMPILER_OPT="-DALP_BOARD_E1M_X_EVK"'
21
+ tags:
22
+ - alp-sdk
23
+ - example
24
+ - hello-world
25
+ - v2n
26
+ harness: console
27
+ harness_config:
28
+ type: one_line
29
+ regex:
30
+ - "\\[hello\\] done"
31
+ alp_sdk.example.hello_world.e1m_evk:
32
+ extra_args: EXTRA_CONF_FILE=generated/alp.conf
33
+ platform_allow:
34
+ - native_sim
35
+ - native_sim/native/64
36
+ integration_platforms:
37
+ - native_sim/native/64
38
+ extra_configs:
39
+ - 'CONFIG_COMPILER_OPT="-DALP_BOARD_E1M_EVK"'
40
+ tags:
41
+ - alp-sdk
42
+ - example
43
+ - hello-world
44
+ - aen
45
+ harness: console
46
+ harness_config:
47
+ type: one_line
48
+ regex:
49
+ - "\\[hello\\] done"
@@ -0,0 +1,8 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ cmake_minimum_required(VERSION 3.20)
4
+
5
+ find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
6
+ project(mproc_mailbox LANGUAGES C)
7
+
8
+ target_sources(app PRIVATE src/main.c)
@@ -0,0 +1,120 @@
1
+ # mproc-mailbox
2
+
3
+ Per-peripheral example for `<alp/mproc.h>`. Demonstrates the
4
+ M55-HP side of a Cortex-M55-HP ↔ Cortex-M55-HE mailbox roundtrip
5
+ on AEN: stage a payload in shared SRAM, signal the peer via the
6
+ hardware mailbox, wait for a reply, read the result back.
7
+
8
+ ## What this shows
9
+
10
+ - Opening a shared-memory region (`alp_shmem_open`) and a
11
+ hardware mailbox (`alp_mbox_open`) by portable instance IDs.
12
+ - Resolving a raw pointer view of the shared region with
13
+ `alp_shmem_view()`, then staging payload bytes by `memcpy`
14
+ through that pointer (the surface hands back a base pointer +
15
+ size and trusts the caller to write through it; the region is
16
+ non-cacheable, so no cache maintenance is needed).
17
+ - Signalling the peer with `alp_mbox_send` carrying a small
18
+ tuple (offset + length) that points at the staged bytes.
19
+ - Receiving the reply through an inbound callback registered with
20
+ `alp_mbox_set_callback()` -- it fires on the SDK's mbox thread
21
+ with the peer's (offset, length) tuple, which `main()` then
22
+ drains.
23
+ - Reading the peer's echo response back from shared SRAM via the
24
+ same pointer view.
25
+
26
+ ## Build
27
+
28
+ ### native_sim (no peer core; HP-side init only)
29
+
30
+ ```bash
31
+ # writes ./generated/alp.conf, which west reads below (#866)
32
+ tan generate --target zephyr-conf --core m55_hp --sdk-root "$ALP_SDK_ROOT" --output generated/alp.conf
33
+ west build -b native_sim/native/64 . -- -DEXTRA_CONF_FILE=generated/alp.conf
34
+ west build -t run
35
+ ```
36
+
37
+ Expected output:
38
+
39
+ ```
40
+ [mproc] init mbox + shmem
41
+ [mproc] sending payload "hello-from-HP" (13 bytes)
42
+ [mproc] native_sim: no peer core; skipping reply
43
+ [mproc] done
44
+ ```
45
+
46
+ ### Real silicon (AEN dual-core, both images built from this project)
47
+
48
+ The peer-side firmware lives at
49
+ [`./peer/main.c`](peer/main.c) -- HE-side
50
+ image that waits on the same mbox, reads the staged shmem
51
+ payload, and writes back an echo via reverse send. (alp-sdk's own
52
+ upstream copy of this example lives at
53
+ `examples/multicore/mproc-mailbox/peer/main.c`, not part of this
54
+ scaffolded project.)
55
+
56
+ `board.yaml` declares both `m55_hp` (`app: ./src`) and `m55_he`
57
+ (`app: ./peer`) as real project cores, so one `tan build` now
58
+ produces both images -- no more topology-default `alp-stock-shim`
59
+ placeholder on the HE side:
60
+
61
+ ```bash
62
+ tan build --project .
63
+ ```
64
+
65
+ Each core can also be built standalone with `west build` directly
66
+ (e.g. while iterating on one side):
67
+
68
+ ```bash
69
+ # HP side.
70
+ # writes ./generated/alp.conf, which west reads below (#866)
71
+ tan generate --target zephyr-conf --core m55_hp --sdk-root "$ALP_SDK_ROOT" --output generated/alp.conf
72
+ west build -b ensemble_e8_dk/ae822fa0e5597ls0/rtss_hp . -- -DEXTRA_CONF_FILE=generated/alp.conf
73
+ west flash
74
+
75
+ # HE side.
76
+ # writes ./peer/generated/alp.conf, which west reads below (#866)
77
+ tan generate --target zephyr-conf --core m55_he --sdk-root "$ALP_SDK_ROOT" --output peer/generated/alp.conf
78
+ west build -b ensemble_e8_dk/ae822fa0e5597ls0/rtss_he ./peer -- -DEXTRA_CONF_FILE=generated/alp.conf
79
+ west flash
80
+ ```
81
+
82
+ Flash both into the matching SoC partitions (HP -> RTSS-HP slot,
83
+ HE -> RTSS-HE slot) and the roundtrip completes:
84
+
85
+ ```
86
+ [mproc] init mbox + shmem
87
+ [mproc] sending payload "hello-from-HP" (13 bytes)
88
+ [mproc-peer] request offset=0 len=13
89
+ [mproc-peer] payload "hello-from-HP"
90
+ [mproc-peer] replied "echo: hello-from-HP" (19 bytes)
91
+ [mproc] HE replied via mbox callback
92
+ [mproc] HE replied "echo: hello-from-HP" (19 bytes)
93
+ [mproc] done
94
+ ```
95
+
96
+ ## Reference
97
+
98
+ - [`<alp/mproc.h>`](https://github.com/alplabai/alp-sdk/blob/v0.17.0/include/alp/mproc.h) -- mailbox + shmem
99
+ + hwsem API.
100
+ - [`docs/v1.0-readiness.md`](https://github.com/alplabai/alp-sdk/blob/v0.17.0/docs/v1.0-readiness.md) §4 --
101
+ this example is one of the v1.0 reference-app flagships; both the
102
+ HP host and the HE peer now build from this one project, with
103
+ HiL verification of the round-trip still ahead.
104
+
105
+ ## Before you run this: the channel is not allocated yet
106
+
107
+ `E1M-AEN801` carries no `memory_map:` in its SoM metadata, so this project's
108
+ shared-memory carve-out cannot be placed and resolves `blocked`:
109
+
110
+ ```
111
+ name: alp_shmem0 kind: raw_shmem status: blocked
112
+ reason: memory_map.base is TBD for region 'mram_main' in SoM E1M-AEN801; this
113
+ SoM hasn't been HW-mapped yet so IPC carve-outs cannot be allocated.
114
+ ```
115
+
116
+ The project still configures and builds, and `--emit ipc-contract-h` still
117
+ exits 0 -- it emits `ALP_IPC_*_ADDR 0x0u /* stub: blocked */`. So the mailbox
118
+ roundtrip this example teaches compiles and does nothing until that metadata
119
+ lands. This is
120
+ mapping work not yet done upstream, not a limit of the design.
@@ -0,0 +1,57 @@
1
+ # board.yaml -- per-app project configuration for the
2
+ # mproc-mailbox example (M55-HP + M55-HE, both real project cores).
3
+ #
4
+ # Targets AEN-Zephyr on both Cortex-M55 cores: `m55_hp` runs the
5
+ # host side (`./src`), `m55_he` runs the peer (`./peer`) that echoes
6
+ # the mailbox payload back. The SoM's second core no longer ships
7
+ # the topology-default `alp-stock-shim` here -- `tan build` builds
8
+ # both slices from this one project, matching the `ipc:` block's
9
+ # `endpoints: [m55_hp, m55_he]` below.
10
+ som:
11
+ sku: E1M-AEN801
12
+
13
+ preset: e1m-evk
14
+ cores:
15
+ m55_hp:
16
+ app: ./src
17
+ m55_he:
18
+ app: ./peer
19
+
20
+ # Cross-core shared SRAM + hardware mailbox used to signal the peer.
21
+ # `raw_shmem`, not `rpmsg`: this is the low-level <alp/mproc.h>
22
+ # shmem+mailbox primitive, so the carve-out stays at its non-cacheable
23
+ # default (kconfig.py's `_emit_cross_core_shmem_cache` reads this
24
+ # block and emits CONFIG_DCACHE=n for both m55_hp and m55_he
25
+ # accordingly -- see the comment in prj.conf / peer/prj.conf for the
26
+ # hardware reasoning). `name: alp_shmem0` matches the DT-alias name
27
+ # alp-sdk's `src/backends/mproc/zephyr_drv.c` (a different `src/`
28
+ # than this project's own -- not part of this scaffolded project)
29
+ # and both main.c's hardcode -- it is NOT a free-form label like an
30
+ # rpmsg channel name.
31
+ #
32
+ # #1069 gave E1M-AEN801 a real `memory_map:` (alp-sdk's
33
+ # metadata/e1m_modules/E1M-AEN801.yaml, not part of this scaffolded
34
+ # project), but this carve-out still resolves `status: blocked`
35
+ # (`--emit system-manifest`): the five fine-grained regions
36
+ # (mcuboot/he_slot0/hp_slot0/reserved/storage) are MRAM, not RAM, and are
37
+ # marked `carveout: false` so the allocator can't silently place this
38
+ # raw_shmem ring inside flash-class memory; `mram_main` (the only other
39
+ # region accessible from both m55_hp and m55_he) is ALSO flash-class --
40
+ # its extent equals the SoC's declared App MRAM aperture exactly (the
41
+ # whole-device alias; `base` resolved to 0x80000000 in #2053), not safe
42
+ # as an IPC carve-out target either. The carve-out being blocked does
43
+ # not affect this example:
44
+ # the generated `<alp/system_ipc.h>` / DTS reservation it would drive
45
+ # aren't consumed here (main.c / peer/main.c open "alp_shmem0" by its DT
46
+ # alias, wired by the board overlay directly, not by the orchestrator's
47
+ # resolved address) -- only the `_emit_cross_core_shmem_cache` Kconfig path
48
+ # this PR adds reads this block, and that path doesn't need resolution to
49
+ # fire.
50
+ ipc:
51
+ - kind: raw_shmem
52
+ endpoints: [m55_hp, m55_he]
53
+ carve_out_kb: 4
54
+ name: alp_shmem0
55
+
56
+ diagnostics:
57
+ log_level: info
@@ -0,0 +1,40 @@
1
+ /*
2
+ * Copyright 2026 Alp Lab AB
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ *
5
+ * Overlay declaring alp-shmem0 for the mproc-mailbox example so the
6
+ * HP-side native_sim build resolves "alp_shmem0" through the new
7
+ * DT-anchored lookup path (commit 2e9deec, v0.7). native_sim never
8
+ * dereferences the address; alp_shmem_view just reports the
9
+ * DT-anchored base + size verbatim and the example's memcpy is
10
+ * skipped on the !CONFIG_BOARD_NATIVE_SIM branch.
11
+ *
12
+ * On real AEN silicon the alp-shmem0 alias must point at a
13
+ * reserved-memory carve-out shared between the M55-HP and M55-HE
14
+ * images. The orchestrator (alp-sdk's scripts/alp_orchestrate.py,
15
+ * not part of this scaffolded project) emits the
16
+ * per-core overlay with the matching alias when the board.yaml v2
17
+ * declares an ipc[] block; until that ships customers can declare
18
+ * the alias by hand in a board overlay following this same shape:
19
+ *
20
+ * / {
21
+ * alp_shmem0_node: shmem@<carve_out_addr> {
22
+ * compatible = "mmio-sram";
23
+ * reg = <0x<addr> 0x<size>>;
24
+ * status = "okay";
25
+ * };
26
+ * aliases { alp-shmem0 = &alp_shmem0_node; };
27
+ * };
28
+ */
29
+
30
+ / {
31
+ alp_shmem0_node: shmem@70000000 {
32
+ compatible = "mmio-sram";
33
+ reg = <0x70000000 0x1000>;
34
+ status = "okay";
35
+ };
36
+
37
+ aliases {
38
+ alp-shmem0 = &alp_shmem0_node;
39
+ };
40
+ };
@@ -0,0 +1,13 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ #
3
+ # HE-side peer image for the mproc-mailbox flagship. `board.yaml`
4
+ # declares this as the `m55_he` slice's `app:`, so `tan build`
5
+ # builds it alongside `../src` (m55_hp) as a real project core, not
6
+ # the topology-default `alp-stock-shim`.
7
+
8
+ cmake_minimum_required(VERSION 3.20)
9
+
10
+ find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
11
+ project(mproc_mailbox_peer LANGUAGES C)
12
+
13
+ target_sources(app PRIVATE main.c)
@@ -0,0 +1,171 @@
1
+ /*
2
+ * Copyright 2026 Alp Lab AB
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ *
5
+ * mproc-mailbox -- M55-HE side of the dual-core mailbox roundtrip.
6
+ * Sister to ../src/main.c (the HP-side).
7
+ *
8
+ * The pattern this peer shows
9
+ * ===========================
10
+ *
11
+ * The HP-side application code stages a payload in shared memory
12
+ * and signals this peer through a hardware mailbox. This peer:
13
+ *
14
+ * 1. Opens the same mbox + shmem region.
15
+ * 2. Registers an mbox callback that fires on each HP send.
16
+ * 3. In the callback: reads the (offset, length) tuple, pulls
17
+ * the payload out of shared memory, builds an echo
18
+ * response, writes it back at a different shmem offset,
19
+ * and signals the HP via mbox.
20
+ *
21
+ * The peer runs forever in a low-power idle loop -- the mbox
22
+ * callback fires from the SDK's mailbox thread.
23
+ *
24
+ * Build status (v1.0 prep)
25
+ * ========================
26
+ *
27
+ * Compiles standalone today, and `board.yaml` declaring both
28
+ * `m55_hp` (`app: ./src`) and `m55_he` (`app: ./peer`) as real
29
+ * project cores means one `tan build` already produces both images
30
+ * through the orchestrator's existing multi-slice path -- no
31
+ * sysbuild involved. Each core can also be built standalone with
32
+ * `west build` and flashed to its own partition.
33
+ */
34
+
35
+ #include <stdio.h>
36
+ #include <string.h>
37
+
38
+ #include <zephyr/kernel.h>
39
+
40
+ #include "alp/mproc.h"
41
+ #include "alp/peripheral.h"
42
+
43
+ /* Region name resolved against the alp-shmemN DT aliases. Must
44
+ * match the HP side; both peers see the same physical bytes via
45
+ * the alp-shmem0 alias. */
46
+ #define SHMEM_REGION_NAME "alp_shmem0"
47
+ #define SHMEM_REGION_SIZE 512u
48
+ #define MBOX_CHANNEL 0u
49
+ #define RESPONSE_OFFSET 256u /* must match HP's expectation */
50
+ #define ECHO_PREFIX "echo: "
51
+ #define MAX_PAYLOAD 128u
52
+
53
+ static struct {
54
+ alp_shmem_t *shmem;
55
+ alp_mbox_t *mbox;
56
+ void *shmem_base;
57
+ size_t shmem_size;
58
+ } g_peer;
59
+
60
+ /* Mailbox inbound-message callback. Fires when the HP signals
61
+ * via the shared mbox channel. Pulls the request out of
62
+ * shared memory, builds the echo response, stages it back,
63
+ * signals via mbox. Runs on the SDK's mailbox thread. */
64
+ static void mbox_inbound(uint32_t channel, const void *data, size_t len, void *user)
65
+ {
66
+ (void)channel;
67
+ (void)user;
68
+ if (len < 8u || g_peer.shmem_base == NULL) {
69
+ printf("[mproc-peer] undersized tuple (%zu bytes) -- dropping\n", len);
70
+ return;
71
+ }
72
+
73
+ const uint8_t *b = data;
74
+ const size_t offset =
75
+ (size_t)b[0] | ((size_t)b[1] << 8) | ((size_t)b[2] << 16) | ((size_t)b[3] << 24);
76
+ size_t req_len =
77
+ (size_t)b[4] | ((size_t)b[5] << 8) | ((size_t)b[6] << 16) | ((size_t)b[7] << 24);
78
+ if (req_len > MAX_PAYLOAD) req_len = MAX_PAYLOAD;
79
+ if (offset + req_len > g_peer.shmem_size) return;
80
+
81
+ printf("[mproc-peer] request offset=%u len=%u\n", (unsigned)offset, (unsigned)req_len);
82
+
83
+ /* Pull the request bytes out of shared memory. The region
84
+ * is non-cacheable, so no cache invalidate is needed before
85
+ * the read. */
86
+ char request_buf[MAX_PAYLOAD + 1] = { 0 };
87
+ memcpy(request_buf, (const uint8_t *)g_peer.shmem_base + offset, req_len);
88
+ request_buf[req_len] = '\0';
89
+ printf("[mproc-peer] payload \"%s\"\n", request_buf);
90
+
91
+ /* Build the echo response. Truncate if prefix + payload
92
+ * would exceed MAX_PAYLOAD; the protocol is a demo so
93
+ * silent-truncate is acceptable. */
94
+ char response_buf[MAX_PAYLOAD + sizeof(ECHO_PREFIX)] = { 0 };
95
+ const size_t prefix_len = sizeof(ECHO_PREFIX) - 1u;
96
+ memcpy(response_buf, ECHO_PREFIX, prefix_len);
97
+ size_t response_len = prefix_len + req_len;
98
+ if (response_len > MAX_PAYLOAD) response_len = MAX_PAYLOAD;
99
+ memcpy(response_buf + prefix_len, request_buf, response_len - prefix_len);
100
+
101
+ /* Stage the response at RESPONSE_OFFSET. HP's mbox callback
102
+ * reads back via this offset. */
103
+ memcpy((uint8_t *)g_peer.shmem_base + RESPONSE_OFFSET, response_buf, response_len);
104
+
105
+ /* Signal the HP -- (offset, length) tuple pointing at the
106
+ * staged response. */
107
+ const uint8_t reply_tuple[8] = {
108
+ (uint8_t)(RESPONSE_OFFSET & 0xFFu),
109
+ (uint8_t)((RESPONSE_OFFSET >> 8) & 0xFFu),
110
+ (uint8_t)((RESPONSE_OFFSET >> 16) & 0xFFu),
111
+ (uint8_t)((RESPONSE_OFFSET >> 24) & 0xFFu),
112
+ (uint8_t)(response_len & 0xFFu),
113
+ (uint8_t)((response_len >> 8) & 0xFFu),
114
+ (uint8_t)((response_len >> 16) & 0xFFu),
115
+ (uint8_t)((response_len >> 24) & 0xFFu),
116
+ };
117
+ if (alp_mbox_send(g_peer.mbox, reply_tuple, sizeof(reply_tuple), 100u) != ALP_OK) {
118
+ printf("[mproc-peer] mbox send failed\n");
119
+ return;
120
+ }
121
+ printf("[mproc-peer] replied \"%s\" (%u bytes)\n", response_buf, (unsigned)response_len);
122
+ }
123
+
124
+ int main(void)
125
+ {
126
+ printf("[mproc-peer] HE side coming up\n");
127
+
128
+ const alp_shmem_config_t shmem_cfg = {
129
+ .name = SHMEM_REGION_NAME,
130
+ .size = SHMEM_REGION_SIZE,
131
+ };
132
+ g_peer.shmem = alp_shmem_open(&shmem_cfg);
133
+
134
+ const alp_mbox_config_t mbox_cfg = {
135
+ .channel = MBOX_CHANNEL,
136
+ .peer = ALP_CORE_M55_HP,
137
+ };
138
+ g_peer.mbox = alp_mbox_open(&mbox_cfg);
139
+
140
+ if (g_peer.shmem == NULL || g_peer.mbox == NULL) {
141
+ printf("[mproc-peer] open failed: last_err=%d\n", (int)alp_last_error());
142
+ return 1;
143
+ }
144
+
145
+ if (alp_shmem_view(g_peer.shmem, &g_peer.shmem_base, &g_peer.shmem_size) != ALP_OK) {
146
+ printf("[mproc-peer] shmem view failed\n");
147
+ return 1;
148
+ }
149
+
150
+ if (alp_mbox_set_callback(g_peer.mbox, mbox_inbound, NULL) != ALP_OK) {
151
+ printf("[mproc-peer] set_callback failed\n");
152
+ return 1;
153
+ }
154
+
155
+ printf("[mproc-peer] waiting on mbox channel=%u shmem=%zu bytes\n",
156
+ (unsigned)MBOX_CHANNEL,
157
+ g_peer.shmem_size);
158
+
159
+ /* Steady-state idle. The mbox callback fires from the SDK
160
+ * thread on every HP send; main just keeps the system
161
+ * alive. k_sleep instead of busy-wait so the core can
162
+ * enter WFI between events. */
163
+ for (;;) {
164
+ k_sleep(K_FOREVER);
165
+ }
166
+
167
+ /* Unreachable but kept for documentation. */
168
+ alp_mbox_close(g_peer.mbox);
169
+ alp_shmem_close(g_peer.shmem);
170
+ return 0;
171
+ }
@@ -0,0 +1,17 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ #
3
+ # Peer image stays small -- no IoT stack, no inference runtime,
4
+ # just the mproc framing + a printk console. Sysbuild will layer
5
+ # its own overlay once the v0.4 dual-image flow lands.
6
+
7
+ CONFIG_PRINTK=y
8
+ CONFIG_ALP_SDK=y
9
+
10
+ # Shared global-SRAM0 mailbox+shmem region is read/written by BOTH M55 cores
11
+ # (this peer and ../src, its HP-side sibling), each with its own D-cache ->
12
+ # the region must be coherent. Disable the D-cache (the AEN SRAM-coherency
13
+ # precedent: the NPU apps do the same) so cross-core reads see the other
14
+ # core's writes without explicit clean/invalidate. (A cache-on variant would
15
+ # sys_cache_data_flush_range on the writer + invd_range on the reader, on
16
+ # silicon where the D-cache can be enabled at all.)
17
+ CONFIG_DCACHE=n
@@ -0,0 +1,23 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ #
3
+ # HE-side peer slice of mproc-mailbox. `board.yaml` (one level up)
4
+ # wires this directory as the `m55_he` core's `app:`, so Twister
5
+ # discovers this as its own app root, separate from the HP-side
6
+ # `../testcase.yaml` (rooted at the example's `./src`). No
7
+ # native_sim overlay exists under this directory -- the `alp_shmem0`
8
+ # DT alias is provided only by `../boards/native_sim_native_64.overlay`,
9
+ # which applies to the HP-side (`../src`) build, not this one -- so
10
+ # this testcase carries AEN-board coverage only.
11
+
12
+ sample:
13
+ name: mproc-mailbox-peer
14
+ description: |
15
+ M55-HE side of the mproc-mailbox roundtrip: waits on the same
16
+ mbox + shmem region as ../src (m55_hp), echoes the payload back.
17
+
18
+ tests:
19
+ alp_sdk.examples.mproc_mailbox.peer.aen:
20
+ platform_allow:
21
+ - alp_e1m_aen801_m55_he/ae822fa0e5597ls0/rtss_he
22
+ extra_args: EXTRA_CONF_FILE=generated/alp.conf CONFIG_ALP_SDK_MPROC=y
23
+ build_only: true # roundtrip verification is HiL (dual-ATOC bench flash), not a CI run.
@@ -0,0 +1,22 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ #
3
+ # Otherwise empty by design. The build's effective Kconfig is
4
+ # build/generated/alp.conf -- emitted from this app's board.yaml
5
+ # by `tan build` and layered over this file via
6
+ # EXTRA_CONF_FILE (see README.md: `tan generate --target zephyr-conf`). board.yaml's `ipc:` block (kind:
7
+ # raw_shmem, endpoints: [m55_hp, m55_he]) now makes kconfig.py's
8
+ # `_emit_cross_core_shmem_cache` emit CONFIG_DCACHE=n into the generated
9
+ # conf too (PR #1080 follow-up -- this used to be the Ethos-U inference
10
+ # branch's job alone). The line below is kept anyway: it predates the
11
+ # generator support, is bench-proven, and removing a hand-written line in
12
+ # the same change that adds the generator path would make it impossible
13
+ # to tell which one was doing the work if something regressed. Dropping
14
+ # it is a clean follow-up once the generator path is trusted.
15
+
16
+ # Shared global-SRAM0 mailbox is read/written by BOTH M55 cores, each with its
17
+ # own D-cache -> the region must be coherent. Disable the D-cache (the AEN
18
+ # SRAM-coherency precedent: the NPU apps do the same) so cross-core reads see
19
+ # the other core's writes without explicit clean/invalidate. (A cache-on variant
20
+ # would sys_cache_data_flush_range on the writer + invd_range on the reader, on
21
+ # silicon where the D-cache can be enabled at all.)
22
+ CONFIG_DCACHE=n