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,225 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """SoM/SoC-identity retargeting for `tan.core.scaffold` -- the phrases
3
+ currently live only in README.md / src/main.c, but every `retarget_*`
4
+ function here runs UNCONDITIONALLY over `scaffold._vendored_files`'s
5
+ per-file loop, the same as `retarget_selftest_som_identity`'s own
6
+ no-SKU-list, general-anchored design: they are never gated to those two
7
+ paths in code, only narrowed by which phrases they anchor on
8
+ (`_selftest_som_identity_edits`, `# Example for <SKU>:`, the literal
9
+ `_AEN_TREE_SOC_REF` value) happening to appear nowhere else in the vendored
10
+ trees today. A future vendored file that happens to contain one of those
11
+ same anchor phrases for an unrelated reason would be rewritten too, not
12
+ skipped.
13
+
14
+ Split out of `scaffold.py` itself (tan-cli#932 review round) purely to keep
15
+ that module under its recorded size budget -- every function here is called
16
+ from exactly one place, `scaffold._vendored_files`'s per-file loop, and carry
17
+ no dependency on anything else in this package. Not a new layer of
18
+ abstraction: it is the same `retarget_*` functions that would otherwise
19
+ live beside `retarget_board_yaml_som`/`retarget_board_yaml_cores`, moved
20
+ verbatim because the module they were written next to was already at its
21
+ line cap. `retarget_selftest_soc_identity` (tan-cli#952) is the one function
22
+ added here since the split rather than moved -- the SoC-identity half of
23
+ `retarget_selftest_som_identity`'s own gap, deliberately left for a
24
+ follow-up by tan-cli#946's docstring.
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ #: Anchored substring pairs `(source-text, target-text)` factory, keyed on
30
+ #: `source_sku` -- the three shapes `diagnostics/<family>/README.md` and
31
+ #: `src/main.c` use to name the tree's own SKU in their "what a real board
32
+ #: prints" documentation (tan-cli#932 review round). Anchored to the whole
33
+ #: phrase around the token, not the bare SKU string: a bare
34
+ #: `content.replace(source_sku, sku)` would also rewrite `# Example for
35
+ #: <SKU>:` immediately above a `west build -b alp_e1m_<sku>_...` line that
36
+ #: does NOT get renamed (that Zephyr board target is a real, separately
37
+ #: vendored artefact -- e.g. no `alp_e1m_v2n102_m33_sm` board exists at all --
38
+ #: so relabelling the comment above it while leaving the command itself
39
+ #: pointed at the tree's OWN board would tell a V2N102 customer the
40
+ #: `v2n101` target below is theirs). Anchoring to these three phrases means
41
+ #: only the SoM-identity documentation moves; the build instructions, which
42
+ #: this function never touches, keep naming the tree's real vendored board.
43
+ #: The `# Example for <SKU>:` comment ITSELF is a separate, narrower edit --
44
+ #: see `retarget_example_build_target_comment` below.
45
+ def _selftest_som_identity_edits(source_sku: str, sku: str) -> tuple[tuple[str, str], ...]:
46
+ return (
47
+ (f"SoM identity: {source_sku} rev", f"SoM identity: {sku} rev"),
48
+ (f"Real hardware ({source_sku},", f"Real hardware ({sku},"),
49
+ (f"(real hardware, {source_sku})", f"(real hardware, {sku})"),
50
+ )
51
+
52
+
53
+ def retarget_selftest_som_identity(content: str, sku: str, source_sku: str) -> str:
54
+ """Rewrite `diagnostics`' "what a real board prints" documentation onto
55
+ `sku` -- the SoM-identity half of tan-cli#932 that the issue's own fix
56
+ left uncovered.
57
+
58
+ #932 hand-substituted `diagnostics/E1M-V2N101`'s vendored bytes so the
59
+ tree is correct FOR THAT SKU (its `SoM identity:`/`Real hardware (...)`
60
+ lines name `E1M-V2N101`, its `SoC identity:` lines name
61
+ `renesas:rzv2n:n44`). But E1M-V2N101/E1M-V2N102/E1M-V2M101/E1M-V2M102 are
62
+ "the same PCB, variant-populated" (`scaffold._SOM_FAMILIES`) and all four
63
+ render this ONE tree -- so `--som E1M-V2M101` scaffolded a project whose
64
+ `board.yaml` correctly said `sku: E1M-V2M101` (`retarget_board_yaml_som`)
65
+ but whose README and `src/main.c` still told the customer to expect
66
+ `SoM identity: E1M-V2N101 ...` from their own selftest binary. Measured:
67
+ `tan init --template board-diagnostics --som E1M-V2M101` before this fix.
68
+
69
+ A per-SKU substitution table -- a fifth (sixth, ...) hand-written
70
+ `un_edit_*` entry per new SKU -- is exactly the shape that produced the
71
+ original bug: #932 fixed the SKU line for `E1M-V2N101` alone, because
72
+ nothing generalised the fix to the family. This is the general form
73
+ instead: it fires for ANY `sku != source_sku` sharing a tree (every
74
+ E1M-AEN* SKU sharing `E1M-AEN801`'s tree gets the identical treatment,
75
+ not just the two families named in #932's own issue), reads no SKU list
76
+ of its own, and costs nothing to extend -- a fifth SKU added to
77
+ `scaffold._SOM_FAMILIES` needs no matching edit here.
78
+
79
+ Deliberately narrow in WHAT it rewrites (see `_selftest_som_identity_edits`):
80
+ only the SoM-identity phrase, never the `SoC identity:` line -- that is
81
+ `retarget_selftest_soc_identity`'s job, a SEPARATE function (added
82
+ tan-cli#952) rather than a fourth entry in
83
+ `_selftest_som_identity_edits`, because it NEUTRALIZES rather than
84
+ substitutes (see its own docstring for why) and needs its own anchor
85
+ (`_AEN_TREE_SOC_REF`) and its own no-op shape (V2N/V2M share one SoC, so
86
+ it never fires for that family by construction; AEN's SKUs are
87
+ different Ensemble variants, so it fires for every non-source AEN SKU).
88
+ This function never touches the placeholder serial either
89
+ (`<factory-serial>`/`AEN0000123` name no real SKU, so there is nothing
90
+ to retarget). NO-OP when `sku == source_sku`, matching
91
+ `retarget_board_yaml_cores`'s convention -- byte-exact passthrough for
92
+ the tree's own two representative SKUs, so neither vendored-capture
93
+ fixture nor the byte-parity gate's `DELIBERATE_EDITS` needs to change.
94
+ """
95
+ if sku == source_sku:
96
+ return content
97
+ for old, new in _selftest_som_identity_edits(source_sku, sku):
98
+ content = content.replace(old, new)
99
+ return content
100
+
101
+
102
+ #: What a non-source SKU's `SoC identity:` line reads after neutralizing.
103
+ #: Mirrors `retarget_example_build_target_comment`'s wording on purpose --
104
+ #: same disclosure shape ("this template's own vendored X -- substitute
105
+ #: your SoM's Y"), same reason: this module carries NO per-SKU SoC-ref
106
+ #: table (see `retarget_selftest_soc_identity`'s docstring for why one was
107
+ #: rejected), so it cannot assert a correct replacement value, only flag
108
+ #: the tree's own value as not-yours.
109
+ _SOC_IDENTITY_PLACEHOLDER = (
110
+ "this template's own vendored SoC -- substitute your SoM's Ensemble variant"
111
+ )
112
+
113
+ #: The AEN family's own `SoC identity:` value, literal in the vendored
114
+ #: `E1M-AEN801` tree today. This is the ONE anchor `retarget_selftest_soc_
115
+ #: identity` needs -- not a SKU-keyed fact table, ADR-0017/I-26 territory
116
+ #: `test_no_new_hardware_facts.py` enforces (measured: a `dict[sku, soc_ref]`
117
+ #: version of this fix reds that gate, `tan/core/scaffold_selftest_identity.py
118
+ #: (stripped line N): E1M-AEN301` etc., one finding per SKU literal). Used
119
+ #: purely to DETECT and ERASE the tree's own value for every OTHER SKU, never
120
+ #: to assert what a different SKU's real value is -- the same "anchor a
121
+ #: phrase, don't assert a fact" shape `_selftest_som_identity_edits` and
122
+ #: `retarget_example_build_target_comment` already use. Naturally a no-op
123
+ #: against the V2N/V2M tree, which never contains this literal at all, so no
124
+ #: `source_sku` branch is needed to keep this scoped to the AEN family.
125
+ _AEN_TREE_SOC_REF = "alif:ensemble:e8"
126
+
127
+
128
+ def retarget_selftest_soc_identity(content: str, sku: str, source_sku: str) -> str:
129
+ """Neutralize `diagnostics`' "what a real board prints" `SoC identity:`
130
+ line(s) for every SKU that is NOT the tree's own -- the half of
131
+ tan-cli#932's family widening that tan-cli#946 deliberately left
132
+ uncovered (tracked as tan-cli#952).
133
+
134
+ `retarget_selftest_som_identity` above fixes the `SoM identity:`/`Real
135
+ hardware (...)` lines for every SKU sharing a vendored tree, but never
136
+ touches `SoC identity:` -- correct for the V2N/V2M family (one shared
137
+ SoC) but wrong for AEN: `E1M-AEN301`..`E1M-AEN701` render
138
+ `E1M-AEN801`'s tree and, before this function, kept ITS `SoC identity:
139
+ alif:ensemble:e8` line verbatim even though `E1M-AEN301`'s own silicon is
140
+ a DIFFERENT Ensemble variant. Measured: `tan init --template
141
+ board-diagnostics --som E1M-AEN301` before this fix printed a `SoM
142
+ identity: E1M-AEN301` line (tan-cli#946 already corrected that half)
143
+ directly beside a `SoC identity: alif:ensemble:e8` line -- a
144
+ HALF-corrected identity block, which tan-cli#952 argues reads as MORE
145
+ misleading than the fully uncorrected block on `dev` before #946: a
146
+ reader can no longer tell the SoC line is foreign just by noticing the
147
+ whole block belongs to another SoM.
148
+
149
+ Neutralizes rather than retargets -- tan-cli#952's own issue weighed
150
+ both shapes and flagged this one "probably right". A retarget (assert
151
+ `sku`'s own SoC ref) needs a SKU -> SoC-ref fact table this SDK-free
152
+ package is not allowed to carry: ADR-0017/invariant I-26, enforced by
153
+ `test_no_new_hardware_facts.py`, exists precisely so `tan` never becomes
154
+ a second source of truth for a fact `metadata/e1m_modules/<SKU>.yaml`'s
155
+ `silicon:` key already owns (measured: a `dict[sku, soc_ref]` version of
156
+ this fix reds that gate, one finding per SKU literal). This function
157
+ asserts nothing about what `sku`'s real SoC is -- it only erases the
158
+ OTHER SKU's value, the same disclose-don't-invent choice
159
+ `retarget_example_build_target_comment` already made for the build-target
160
+ comment (and for the identical reason: several sibling SKUs reaching that
161
+ comment have no board of their own at all, so a guessed replacement would
162
+ sometimes be provably wrong, not merely unverified).
163
+
164
+ NO-OP when `sku == source_sku` (byte-exact passthrough for the tree's
165
+ own representative SKU, matching every other `retarget_*` here) and,
166
+ by construction, for the V2N/V2M tree (see `_AEN_TREE_SOC_REF`'s own
167
+ comment -- its `SoC identity:` line is unconditionally correct for
168
+ every SKU that shares that tree, so nothing here should ever touch it).
169
+ """
170
+ if sku == source_sku:
171
+ return content
172
+ return content.replace(
173
+ f"SoC identity: {_AEN_TREE_SOC_REF}",
174
+ f"SoC identity: <{_SOC_IDENTITY_PLACEHOLDER}>",
175
+ )
176
+
177
+
178
+ def retarget_example_build_target_comment(content: str, sku: str, source_sku: str) -> str:
179
+ """Neutralize `# Example for <source_sku>:` -- the comment `minimal`/
180
+ `sensor`/`diagnostics` READMEs put directly above their one real-silicon
181
+ `west build -b alp_e1m_<source_sku>_..._sm/...` line -- for every OTHER
182
+ SKU sharing the tree.
183
+
184
+ Discovered widening `test_template_integrity.py`'s `CASES` to the full
185
+ SKU catalogue (tan-cli#932 review round): with `retarget_selftest_som_
186
+ identity` deliberately leaving this comment alone (see its own docstring
187
+ -- the Zephyr board target below it is a real, separate artefact this
188
+ SDK-free module cannot safely rename; several sibling SKUs, e.g.
189
+ `E1M-V2N102`, have no board of their own at all, and one that DOES --
190
+ `E1M-V2M101` -- is not something this module can discover), the comment
191
+ still read "Example for E1M-V2N101" while scaffolding `E1M-V2M101`. Not
192
+ the SoM-identity gap tan-cli#932 is about (nothing here claims a real
193
+ board printed anything), but the SAME shape of claim: a specific SKU
194
+ named beside a fact that is not that SKU's.
195
+
196
+ Relabelling the comment onto `sku` would be worse, not better: it would
197
+ claim the UNCHANGED command below it (still `source_sku`'s real board)
198
+ is `sku`'s own. So this drops the SKU-specific claim rather than moving
199
+ it -- but going fully generic (bare `# Example:`) would ALSO lose real
200
+ information the customer needs: without any qualifier, a `sku` whose own
201
+ `alp_e1m_<sku>_..._sm` target genuinely exists (e.g. `E1M-V2M101`, unlike
202
+ several other siblings sharing this tree such as `E1M-V2N102`) has no
203
+ way to tell, from the comment alone, that the line below it is a
204
+ DIFFERENT SoM's board target rather than a generic placeholder.
205
+
206
+ "Substitute your SoM's" (tan-cli#946 round-1 review's own suggested
207
+ wording) is wrong for HALF the SKUs that reach this line: measured at
208
+ `zephyr/boards/alp/`, only `e1m_v2n101_m33_sm` and `e1m_v2m101_m33_sm`
209
+ exist -- `E1M-V2N102` and `E1M-V2M102` have no board tree of their own AT
210
+ ALL (the fact this module's own docstring above cites), so telling those
211
+ customers to "substitute your SoM's" points at a target that does not
212
+ exist. Rewritten to qualify that instead: `# Example (this template's
213
+ own vendored board target -- substitute your SoM's, where one exists):`,
214
+ true for every SKU that reaches this line, with the one real vendored
215
+ board target it introduces left exactly as documented. NO-OP when
216
+ `sku == source_sku` (byte-exact passthrough for the tree's own two
217
+ representative SKUs, same convention as every retarget_* above).
218
+ """
219
+ if sku == source_sku:
220
+ return content
221
+ return content.replace(
222
+ f"# Example for {source_sku}:",
223
+ "# Example (this template's own vendored board target -- substitute "
224
+ "your SoM's, where one exists):",
225
+ )