mlonmcu 0.3.0.dev0__3-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 (376) hide show
  1. mlonmcu/__init__.py +26 -0
  2. mlonmcu/artifact.py +172 -0
  3. mlonmcu/cli/__init__.py +19 -0
  4. mlonmcu/cli/build.py +119 -0
  5. mlonmcu/cli/cleanup.py +75 -0
  6. mlonmcu/cli/common.py +227 -0
  7. mlonmcu/cli/compile.py +87 -0
  8. mlonmcu/cli/env.py +68 -0
  9. mlonmcu/cli/export.py +93 -0
  10. mlonmcu/cli/flow.py +67 -0
  11. mlonmcu/cli/helper/__init__.py +18 -0
  12. mlonmcu/cli/helper/filter.py +25 -0
  13. mlonmcu/cli/helper/parse.py +159 -0
  14. mlonmcu/cli/init.py +130 -0
  15. mlonmcu/cli/load.py +87 -0
  16. mlonmcu/cli/main.py +116 -0
  17. mlonmcu/cli/models.py +48 -0
  18. mlonmcu/cli/run.py +56 -0
  19. mlonmcu/cli/setup.py +136 -0
  20. mlonmcu/cli/tune.py +48 -0
  21. mlonmcu/config.py +219 -0
  22. mlonmcu/context/__init__.py +22 -0
  23. mlonmcu/context/context.py +545 -0
  24. mlonmcu/context/read_write_filelock.py +327 -0
  25. mlonmcu/environment/__init__.py +18 -0
  26. mlonmcu/environment/config.py +214 -0
  27. mlonmcu/environment/environment.py +501 -0
  28. mlonmcu/environment/init.py +191 -0
  29. mlonmcu/environment/list.py +81 -0
  30. mlonmcu/environment/loader.py +250 -0
  31. mlonmcu/environment/templates.py +69 -0
  32. mlonmcu/environment/writer.py +117 -0
  33. mlonmcu/feature/__init__.py +18 -0
  34. mlonmcu/feature/feature.py +230 -0
  35. mlonmcu/feature/features.py +1537 -0
  36. mlonmcu/feature/type.py +33 -0
  37. mlonmcu/flow/__init__.py +61 -0
  38. mlonmcu/flow/backend.py +234 -0
  39. mlonmcu/flow/framework.py +69 -0
  40. mlonmcu/flow/tflm/__init__.py +23 -0
  41. mlonmcu/flow/tflm/backend/__init__.py +23 -0
  42. mlonmcu/flow/tflm/backend/backend.py +47 -0
  43. mlonmcu/flow/tflm/backend/tflmc.py +129 -0
  44. mlonmcu/flow/tflm/backend/tflmi.py +385 -0
  45. mlonmcu/flow/tflm/framework.py +81 -0
  46. mlonmcu/flow/tvm/__init__.py +23 -0
  47. mlonmcu/flow/tvm/backend/__init__.py +26 -0
  48. mlonmcu/flow/tvm/backend/backend.py +282 -0
  49. mlonmcu/flow/tvm/backend/model_info.py +307 -0
  50. mlonmcu/flow/tvm/backend/python_utils.py +36 -0
  51. mlonmcu/flow/tvm/backend/tuner.py +41 -0
  52. mlonmcu/flow/tvm/backend/tvmaot.py +162 -0
  53. mlonmcu/flow/tvm/backend/tvmaotplus.py +51 -0
  54. mlonmcu/flow/tvm/backend/tvmc_utils.py +172 -0
  55. mlonmcu/flow/tvm/backend/tvmcg.py +102 -0
  56. mlonmcu/flow/tvm/backend/tvmllvm.py +106 -0
  57. mlonmcu/flow/tvm/backend/tvmrt.py +151 -0
  58. mlonmcu/flow/tvm/backend/wrapper.py +645 -0
  59. mlonmcu/flow/tvm/framework.py +96 -0
  60. mlonmcu/logging.py +79 -0
  61. mlonmcu/mlonmcu.py +19 -0
  62. mlonmcu/models/__init__.py +31 -0
  63. mlonmcu/models/convert_data.py +107 -0
  64. mlonmcu/models/frontend.py +571 -0
  65. mlonmcu/models/group.py +29 -0
  66. mlonmcu/models/lookup.py +345 -0
  67. mlonmcu/models/metadata.py +133 -0
  68. mlonmcu/models/model.py +104 -0
  69. mlonmcu/models/options.py +64 -0
  70. mlonmcu/models/utils.py +136 -0
  71. mlonmcu/platform/__init__.py +27 -0
  72. mlonmcu/platform/_platform.py +46 -0
  73. mlonmcu/platform/espidf/__init__.py +25 -0
  74. mlonmcu/platform/espidf/espidf.py +489 -0
  75. mlonmcu/platform/espidf/espidf_target.py +257 -0
  76. mlonmcu/platform/lookup.py +126 -0
  77. mlonmcu/platform/microtvm/__init__.py +25 -0
  78. mlonmcu/platform/microtvm/microtvm.py +580 -0
  79. mlonmcu/platform/microtvm/microtvm_arduino_target.py +68 -0
  80. mlonmcu/platform/microtvm/microtvm_backend.py +64 -0
  81. mlonmcu/platform/microtvm/microtvm_espidf_target.py +94 -0
  82. mlonmcu/platform/microtvm/microtvm_etissvp_target.py +98 -0
  83. mlonmcu/platform/microtvm/microtvm_host_target.py +46 -0
  84. mlonmcu/platform/microtvm/microtvm_spike_target.py +230 -0
  85. mlonmcu/platform/microtvm/microtvm_target.py +189 -0
  86. mlonmcu/platform/microtvm/microtvm_template_target.py +55 -0
  87. mlonmcu/platform/microtvm/microtvm_zephyr_target.py +91 -0
  88. mlonmcu/platform/mlif/__init__.py +25 -0
  89. mlonmcu/platform/mlif/mlif.py +300 -0
  90. mlonmcu/platform/mlif/mlif_target.py +86 -0
  91. mlonmcu/platform/platform.py +244 -0
  92. mlonmcu/platform/tvm/__init__.py +25 -0
  93. mlonmcu/platform/tvm/tvm.py +429 -0
  94. mlonmcu/platform/tvm/tvm_backend.py +57 -0
  95. mlonmcu/platform/tvm/tvm_target.py +165 -0
  96. mlonmcu/platform/zephyr/__init__.py +25 -0
  97. mlonmcu/platform/zephyr/zephyr.py +450 -0
  98. mlonmcu/platform/zephyr/zephyr_target.py +110 -0
  99. mlonmcu/plugins.py +26 -0
  100. mlonmcu/report.py +99 -0
  101. mlonmcu/session/__init__.py +18 -0
  102. mlonmcu/session/postprocess/__init__.py +43 -0
  103. mlonmcu/session/postprocess/postprocess.py +62 -0
  104. mlonmcu/session/postprocess/postprocesses.py +487 -0
  105. mlonmcu/session/run.py +1008 -0
  106. mlonmcu/session/session.py +373 -0
  107. mlonmcu/setup/__init__.py +18 -0
  108. mlonmcu/setup/cache.py +147 -0
  109. mlonmcu/setup/gen_requirements.py +619 -0
  110. mlonmcu/setup/setup.py +285 -0
  111. mlonmcu/setup/task.py +380 -0
  112. mlonmcu/setup/tasks/__init__.py +40 -0
  113. mlonmcu/setup/tasks/arm_gcc.py +58 -0
  114. mlonmcu/setup/tasks/cmsisnn.py +151 -0
  115. mlonmcu/setup/tasks/common.py +36 -0
  116. mlonmcu/setup/tasks/corstone300.py +64 -0
  117. mlonmcu/setup/tasks/espidf.py +87 -0
  118. mlonmcu/setup/tasks/etiss.py +147 -0
  119. mlonmcu/setup/tasks/llvm.py +67 -0
  120. mlonmcu/setup/tasks/mlif.py +49 -0
  121. mlonmcu/setup/tasks/muriscvnn.py +166 -0
  122. mlonmcu/setup/tasks/pulp.py +192 -0
  123. mlonmcu/setup/tasks/riscv_gcc.py +146 -0
  124. mlonmcu/setup/tasks/spike.py +190 -0
  125. mlonmcu/setup/tasks/tf.py +92 -0
  126. mlonmcu/setup/tasks/tflite.py +59 -0
  127. mlonmcu/setup/tasks/tflmc.py +141 -0
  128. mlonmcu/setup/tasks/tvm.py +172 -0
  129. mlonmcu/setup/tasks/utvmcg.py +96 -0
  130. mlonmcu/setup/tasks/zephyr.py +119 -0
  131. mlonmcu/setup/utils.py +374 -0
  132. mlonmcu/target/__init__.py +37 -0
  133. mlonmcu/target/_target.py +41 -0
  134. mlonmcu/target/arm/__init__.py +3 -0
  135. mlonmcu/target/arm/corstone300.py +235 -0
  136. mlonmcu/target/arm/util.py +109 -0
  137. mlonmcu/target/common.py +194 -0
  138. mlonmcu/target/elf.py +256 -0
  139. mlonmcu/target/host_x86.py +84 -0
  140. mlonmcu/target/metrics.py +75 -0
  141. mlonmcu/target/riscv/__init__.py +7 -0
  142. mlonmcu/target/riscv/etiss_pulpino.py +462 -0
  143. mlonmcu/target/riscv/gvsoc_pulp.py +215 -0
  144. mlonmcu/target/riscv/ovpsim.py +301 -0
  145. mlonmcu/target/riscv/riscv.py +185 -0
  146. mlonmcu/target/riscv/riscv_qemu.py +166 -0
  147. mlonmcu/target/riscv/spike.py +243 -0
  148. mlonmcu/target/riscv/util.py +134 -0
  149. mlonmcu/target/target.py +200 -0
  150. mlonmcu/utils.py +49 -0
  151. mlonmcu/version.py +21 -0
  152. mlonmcu-0.3.0.dev0.dist-info/LICENSE +202 -0
  153. mlonmcu-0.3.0.dev0.dist-info/METADATA +343 -0
  154. mlonmcu-0.3.0.dev0.dist-info/NOTICE +8 -0
  155. mlonmcu-0.3.0.dev0.dist-info/RECORD +376 -0
  156. mlonmcu-0.3.0.dev0.dist-info/WHEEL +5 -0
  157. mlonmcu-0.3.0.dev0.dist-info/entry_points.txt +3 -0
  158. mlonmcu-0.3.0.dev0.dist-info/top_level.txt +1 -0
  159. resources/frameworks/tvm/crt_config/README.md +7 -0
  160. resources/frameworks/tvm/crt_config/crt_config.h +53 -0
  161. resources/frameworks/tvm/tuning_records/riscv_cpu_v0.01.log.best +46 -0
  162. resources/patches/fix_esp32c3_march.patch +20 -0
  163. resources/patches/pulp_freertos_support.patch +55 -0
  164. resources/platforms/espidf/micro_speech_esp32devboard/CMakeLists.txt +29 -0
  165. resources/platforms/espidf/micro_speech_esp32devboard/README.md +70 -0
  166. resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/CMakeLists.txt +78 -0
  167. resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/Kconfig +76 -0
  168. resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/default_data.c +26 -0
  169. resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/default_model_support/process_input.c +35 -0
  170. resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/default_model_support/process_output.c +45 -0
  171. resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/include/exit.h +26 -0
  172. resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/include/ml_interface.h +70 -0
  173. resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/include/printing.h +31 -0
  174. resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/ml_interface.c +74 -0
  175. resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/ml_interface_tflm.cc +64 -0
  176. resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/ml_interface_tvm.c +53 -0
  177. resources/platforms/espidf/micro_speech_esp32devboard/components/tflite-lib/CMakeLists.txt +140 -0
  178. resources/platforms/espidf/micro_speech_esp32devboard/components/tflite-lib/Kconfig +8 -0
  179. resources/platforms/espidf/micro_speech_esp32devboard/components/tvm-lib/CMakeLists.txt +66 -0
  180. resources/platforms/espidf/micro_speech_esp32devboard/components/tvm-lib/Kconfig +7 -0
  181. resources/platforms/espidf/micro_speech_esp32devboard/example_test.py +38 -0
  182. resources/platforms/espidf/micro_speech_esp32devboard/info.txt +9 -0
  183. resources/platforms/espidf/micro_speech_esp32devboard/main/CMakeLists.txt +58 -0
  184. resources/platforms/espidf/micro_speech_esp32devboard/main/audio_provider.cc +193 -0
  185. resources/platforms/espidf/micro_speech_esp32devboard/main/audio_provider.h +49 -0
  186. resources/platforms/espidf/micro_speech_esp32devboard/main/command_responder.cc +53 -0
  187. resources/platforms/espidf/micro_speech_esp32devboard/main/command_responder.h +35 -0
  188. resources/platforms/espidf/micro_speech_esp32devboard/main/feature_provider.cc +132 -0
  189. resources/platforms/espidf/micro_speech_esp32devboard/main/feature_provider.cc.orig +145 -0
  190. resources/platforms/espidf/micro_speech_esp32devboard/main/feature_provider.h +55 -0
  191. resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/COPYING +11 -0
  192. resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/_kiss_fft_guts.h +168 -0
  193. resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/kiss_fft.c +408 -0
  194. resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/kiss_fft.h +124 -0
  195. resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/tools/kiss_fftr.c +159 -0
  196. resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/tools/kiss_fftr.h +46 -0
  197. resources/platforms/espidf/micro_speech_esp32devboard/main/main.cc +63 -0
  198. resources/platforms/espidf/micro_speech_esp32devboard/main/main_functions.cc +204 -0
  199. resources/platforms/espidf/micro_speech_esp32devboard/main/main_functions.h +37 -0
  200. resources/platforms/espidf/micro_speech_esp32devboard/main/micro_features_generator.cc +121 -0
  201. resources/platforms/espidf/micro_speech_esp32devboard/main/micro_features_generator.h +38 -0
  202. resources/platforms/espidf/micro_speech_esp32devboard/main/micro_model_settings.cc +23 -0
  203. resources/platforms/espidf/micro_speech_esp32devboard/main/micro_model_settings.h +43 -0
  204. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/bits.h +102 -0
  205. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft.cc +52 -0
  206. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft.h +50 -0
  207. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft_util.cc +69 -0
  208. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft_util.h +34 -0
  209. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank.c +134 -0
  210. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank.h +63 -0
  211. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank_util.c +220 -0
  212. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank_util.h +50 -0
  213. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend.c +72 -0
  214. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend.h +64 -0
  215. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend_util.c +85 -0
  216. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend_util.h +52 -0
  217. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/kiss_fft_common.h +48 -0
  218. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/kiss_fft_int16.cc +8 -0
  219. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/kiss_fft_int16.h +34 -0
  220. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_lut.c +30 -0
  221. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_lut.h +40 -0
  222. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale.c +83 -0
  223. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale.h +39 -0
  224. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale_util.c +27 -0
  225. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale_util.h +45 -0
  226. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction.c +51 -0
  227. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction.h +46 -0
  228. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction_util.c +45 -0
  229. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction_util.h +50 -0
  230. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control.c +56 -0
  231. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control.h +47 -0
  232. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control_util.c +92 -0
  233. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control_util.h +57 -0
  234. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window.c +70 -0
  235. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window.h +49 -0
  236. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window_util.c +73 -0
  237. resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window_util.h +45 -0
  238. resources/platforms/espidf/micro_speech_esp32devboard/main/pins.c +14 -0
  239. resources/platforms/espidf/micro_speech_esp32devboard/main/pins.h +30 -0
  240. resources/platforms/espidf/micro_speech_esp32devboard/main/recognize_commands.cc +150 -0
  241. resources/platforms/espidf/micro_speech_esp32devboard/main/recognize_commands.h +173 -0
  242. resources/platforms/espidf/micro_speech_esp32devboard/main/ringbuf.c +333 -0
  243. resources/platforms/espidf/micro_speech_esp32devboard/main/ringbuf.h +74 -0
  244. resources/platforms/espidf/micro_speech_esp32devboard/sdkconfig.defaults +36 -0
  245. resources/platforms/espidf/project/CMakeLists.txt +29 -0
  246. resources/platforms/espidf/project/README.md +70 -0
  247. resources/platforms/espidf/project/components/mlif/CMakeLists.txt +77 -0
  248. resources/platforms/espidf/project/components/mlif/Kconfig +76 -0
  249. resources/platforms/espidf/project/components/mlif/default_data.c +26 -0
  250. resources/platforms/espidf/project/components/mlif/default_model_support/process_input.c +35 -0
  251. resources/platforms/espidf/project/components/mlif/default_model_support/process_output.c +45 -0
  252. resources/platforms/espidf/project/components/mlif/include/exit.h +26 -0
  253. resources/platforms/espidf/project/components/mlif/include/ml_interface.h +60 -0
  254. resources/platforms/espidf/project/components/mlif/include/printing.h +31 -0
  255. resources/platforms/espidf/project/components/mlif/ml_interface.c +54 -0
  256. resources/platforms/espidf/project/components/mlif/ml_interface_tflm.cc +40 -0
  257. resources/platforms/espidf/project/components/mlif/ml_interface_tvm.c +40 -0
  258. resources/platforms/espidf/project/components/tflite-lib/CMakeLists.txt +142 -0
  259. resources/platforms/espidf/project/components/tflite-lib/Kconfig +8 -0
  260. resources/platforms/espidf/project/components/tvm-lib/CMakeLists.txt +66 -0
  261. resources/platforms/espidf/project/components/tvm-lib/Kconfig +7 -0
  262. resources/platforms/espidf/project/example_test.py +38 -0
  263. resources/platforms/espidf/project/main/CMakeLists.txt +25 -0
  264. resources/platforms/espidf/project/main/main.c +57 -0
  265. resources/platforms/espidf/project/sdkconfig.defaults +26 -0
  266. resources/platforms/zephyr/project/CMakeLists.txt +22 -0
  267. resources/platforms/zephyr/project/Kconfig +101 -0
  268. resources/platforms/zephyr/project/README.rst +33 -0
  269. resources/platforms/zephyr/project/cmake/AddAllSubdirs.cmake +21 -0
  270. resources/platforms/zephyr/project/cmake/ChooseTarget.cmake +22 -0
  271. resources/platforms/zephyr/project/cmake/LinkTFLite.cmake +223 -0
  272. resources/platforms/zephyr/project/cmake/LinkTVM.cmake +68 -0
  273. resources/platforms/zephyr/project/cmake/LookupClang.cmake +41 -0
  274. resources/platforms/zephyr/project/cmake/backends/tflmc.cmake +5 -0
  275. resources/platforms/zephyr/project/cmake/backends/tflmi.cmake +5 -0
  276. resources/platforms/zephyr/project/cmake/backends/tvmaot.cmake +10 -0
  277. resources/platforms/zephyr/project/cmake/backends/tvmaotplus.cmake +10 -0
  278. resources/platforms/zephyr/project/cmake/backends/tvmcg.cmake +10 -0
  279. resources/platforms/zephyr/project/cmake/backends/tvmllvm.cmake +8 -0
  280. resources/platforms/zephyr/project/cmake/backends/tvmrt.cmake +8 -0
  281. resources/platforms/zephyr/project/cmake/extras.cmake +9 -0
  282. resources/platforms/zephyr/project/cmake/features/auto_vectorize_gcc.cmake +65 -0
  283. resources/platforms/zephyr/project/cmake/features/auto_vectorize_llvm.cmake +20 -0
  284. resources/platforms/zephyr/project/cmake/features/cmsisnn.cmake +86 -0
  285. resources/platforms/zephyr/project/cmake/features/muriscvnn.cmake +87 -0
  286. resources/platforms/zephyr/project/cmake/frameworks/tflm.cmake +1 -0
  287. resources/platforms/zephyr/project/cmake/frameworks/tflm_mlif.cmake +8 -0
  288. resources/platforms/zephyr/project/cmake/frameworks/tvm.cmake +1 -0
  289. resources/platforms/zephyr/project/cmake/frameworks/tvm_mlif.cmake +37 -0
  290. resources/platforms/zephyr/project/lib/CMakeLists.txt +13 -0
  291. resources/platforms/zephyr/project/lib/drivers/fake_input.c +10 -0
  292. resources/platforms/zephyr/project/lib/drivers/fake_input.h +8 -0
  293. resources/platforms/zephyr/project/lib/ml_interface/CMakeLists.txt +31 -0
  294. resources/platforms/zephyr/project/lib/ml_interface/default_data.c +8 -0
  295. resources/platforms/zephyr/project/lib/ml_interface/default_model_support/CMakeLists.txt +2 -0
  296. resources/platforms/zephyr/project/lib/ml_interface/default_model_support/process_input.c +17 -0
  297. resources/platforms/zephyr/project/lib/ml_interface/default_model_support/process_output.c +27 -0
  298. resources/platforms/zephyr/project/lib/ml_interface/ml_interface.c +36 -0
  299. resources/platforms/zephyr/project/lib/ml_interface/ml_interface.h +47 -0
  300. resources/platforms/zephyr/project/lib/ml_interface/ml_interface_tflm.cc +22 -0
  301. resources/platforms/zephyr/project/lib/ml_interface/ml_interface_tvm.c +22 -0
  302. resources/platforms/zephyr/project/lib/support/CMakeLists.txt +2 -0
  303. resources/platforms/zephyr/project/lib/support/dummy.c +0 -0
  304. resources/platforms/zephyr/project/lib/support/exit.h +8 -0
  305. resources/platforms/zephyr/project/lib/support/printing.h +11 -0
  306. resources/platforms/zephyr/project/lib/support/quantize.h +23 -0
  307. resources/platforms/zephyr/project/lib/targets/corstone300.c +62 -0
  308. resources/platforms/zephyr/project/lib/targets/default.c +2 -0
  309. resources/platforms/zephyr/project/lib/targets/etiss_pulpino.c +112 -0
  310. resources/platforms/zephyr/project/lib/targets/generic_riscv.c +112 -0
  311. resources/platforms/zephyr/project/lib/targets/riscv_qemu.c +112 -0
  312. resources/platforms/zephyr/project/lib/targets/target.h +2 -0
  313. resources/platforms/zephyr/project/prj.conf +11 -0
  314. resources/platforms/zephyr/project/sample.yaml +19 -0
  315. resources/platforms/zephyr/project/src/main.c +71 -0
  316. resources/platforms/zephyr/project2/CMakeLists.txt +72 -0
  317. resources/platforms/zephyr/project2/Kconfig +101 -0
  318. resources/platforms/zephyr/project2/README.rst +33 -0
  319. resources/platforms/zephyr/project2/cmake/AddAllSubdirs.cmake +21 -0
  320. resources/platforms/zephyr/project2/cmake/ChooseTarget.cmake +22 -0
  321. resources/platforms/zephyr/project2/cmake/LinkTFLite.cmake +223 -0
  322. resources/platforms/zephyr/project2/cmake/LinkTVM.cmake +68 -0
  323. resources/platforms/zephyr/project2/cmake/LookupClang.cmake +41 -0
  324. resources/platforms/zephyr/project2/cmake/backends/tflmc.cmake +5 -0
  325. resources/platforms/zephyr/project2/cmake/backends/tflmi.cmake +5 -0
  326. resources/platforms/zephyr/project2/cmake/backends/tvmaot.cmake +10 -0
  327. resources/platforms/zephyr/project2/cmake/backends/tvmaotplus.cmake +10 -0
  328. resources/platforms/zephyr/project2/cmake/backends/tvmcg.cmake +10 -0
  329. resources/platforms/zephyr/project2/cmake/backends/tvmllvm.cmake +8 -0
  330. resources/platforms/zephyr/project2/cmake/backends/tvmrt.cmake +8 -0
  331. resources/platforms/zephyr/project2/cmake/extras.cmake +9 -0
  332. resources/platforms/zephyr/project2/cmake/features/auto_vectorize_gcc.cmake +65 -0
  333. resources/platforms/zephyr/project2/cmake/features/auto_vectorize_llvm.cmake +20 -0
  334. resources/platforms/zephyr/project2/cmake/features/cmsisnn.cmake +86 -0
  335. resources/platforms/zephyr/project2/cmake/features/muriscvnn.cmake +87 -0
  336. resources/platforms/zephyr/project2/cmake/frameworks/tflm.cmake +1 -0
  337. resources/platforms/zephyr/project2/cmake/frameworks/tflm_mlif.cmake +8 -0
  338. resources/platforms/zephyr/project2/cmake/frameworks/tvm.cmake +1 -0
  339. resources/platforms/zephyr/project2/cmake/frameworks/tvm_mlif.cmake +37 -0
  340. resources/platforms/zephyr/project2/default_data.c +8 -0
  341. resources/platforms/zephyr/project2/default_model_support/CMakeLists.txt +3 -0
  342. resources/platforms/zephyr/project2/default_model_support/process_input.c +17 -0
  343. resources/platforms/zephyr/project2/default_model_support/process_output.c +27 -0
  344. resources/platforms/zephyr/project2/lib/CMakeLists.txt +13 -0
  345. resources/platforms/zephyr/project2/lib/drivers/fake_input.c +10 -0
  346. resources/platforms/zephyr/project2/lib/drivers/fake_input.h +8 -0
  347. resources/platforms/zephyr/project2/lib/support/CMakeLists.txt +2 -0
  348. resources/platforms/zephyr/project2/lib/support/dummy.c +0 -0
  349. resources/platforms/zephyr/project2/lib/support/exit.h +8 -0
  350. resources/platforms/zephyr/project2/lib/support/printing.h +11 -0
  351. resources/platforms/zephyr/project2/lib/support/quantize.h +23 -0
  352. resources/platforms/zephyr/project2/lib/targets/corstone300.c +62 -0
  353. resources/platforms/zephyr/project2/lib/targets/default.c +2 -0
  354. resources/platforms/zephyr/project2/lib/targets/etiss_pulpino.c +112 -0
  355. resources/platforms/zephyr/project2/lib/targets/generic_riscv.c +112 -0
  356. resources/platforms/zephyr/project2/lib/targets/riscv_qemu.c +112 -0
  357. resources/platforms/zephyr/project2/lib/targets/target.h +2 -0
  358. resources/platforms/zephyr/project2/ml_interface.c +36 -0
  359. resources/platforms/zephyr/project2/ml_interface.h +47 -0
  360. resources/platforms/zephyr/project2/ml_interface_tflm.cc +22 -0
  361. resources/platforms/zephyr/project2/ml_interface_tvm.c +22 -0
  362. resources/platforms/zephyr/project2/prj.conf +13 -0
  363. resources/platforms/zephyr/project2/sample.yaml +19 -0
  364. resources/platforms/zephyr/project2/settings.json +6 -0
  365. resources/platforms/zephyr/project2/src/main.c +35 -0
  366. resources/pycharm/.run/README.md +73 -0
  367. resources/pycharm/.run/step1_ init env.run.xml +24 -0
  368. resources/pycharm/.run/step2_ setup.run.xml +25 -0
  369. resources/pycharm/.run/step3_ run resnet on pulpxpulpissimo.run.xml +25 -0
  370. resources/templates/default.yml.j2 +258 -0
  371. resources/templates/dev.yml.j2 +212 -0
  372. resources/templates/minimal.yml.j2 +234 -0
  373. resources/templates/phi.yml.j2 +282 -0
  374. resources/templates/pulp.yml.j2 +267 -0
  375. resources/templates/research.yml.j2 +237 -0
  376. resources/templates/tumeda.yml.j2 +239 -0
@@ -0,0 +1,235 @@
1
+ #
2
+ # Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
3
+ #
4
+ # This file is part of MLonMCU.
5
+ # See https://github.com/tum-ei-eda/mlonmcu.git for further info.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ """MLonMCU Corstone300 Target definitions"""
20
+
21
+ import os
22
+ import re
23
+ from pathlib import Path
24
+
25
+ from mlonmcu.logging import get_logger
26
+ from mlonmcu.feature.features import SUPPORTED_TVM_BACKENDS
27
+ from mlonmcu.config import str2bool
28
+ from mlonmcu.target import Target
29
+ from mlonmcu.target.common import cli, execute
30
+ from mlonmcu.target.metrics import Metrics
31
+ from .util import resolve_cpu_features
32
+
33
+ logger = get_logger()
34
+
35
+
36
+ class Corstone300Target(Target):
37
+ """Target using an ARM FVP (fixed virtual platform) based on a Cortex M55 with EthosU support"""
38
+
39
+ FEATURES = ["ethosu", "arm_mvei", "arm_dsp"]
40
+
41
+ DEFAULTS = {
42
+ **Target.DEFAULTS,
43
+ "model": "cortex-m55", # Options: cortex-m{0,0plus,1,3,4,7,23,33,35p,55} (Frequency is fixed at 25MHz)
44
+ # Warning: FVP is still M55 based!
45
+ "timeout_sec": 0, # disabled
46
+ "enable_ethosu": False,
47
+ "enable_fpu": True,
48
+ "enable_mvei": False, # unused
49
+ "enable_dsp": False, # unused
50
+ "ethosu_num_macs": 256,
51
+ "extra_args": "",
52
+ }
53
+ REQUIRED = [
54
+ "corstone300.exe",
55
+ "cmsisnn.dir",
56
+ "arm_gcc.install_dir",
57
+ ] # Actually cmsisnn.dir points to the root CMSIS_5 directory
58
+
59
+ def __init__(self, name="corstone300", features=None, config=None):
60
+ super().__init__(name, features=features, config=config)
61
+
62
+ @property
63
+ def model(self):
64
+ return self.config["model"]
65
+
66
+ @property
67
+ def enable_ethosu(self):
68
+ value = self.config["enable_ethosu"]
69
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
70
+
71
+ @property
72
+ def enable_fpu(self):
73
+ value = self.config["enable_fpu"]
74
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
75
+
76
+ @property
77
+ def enable_mvei(self):
78
+ value = self.config["enable_mvei"]
79
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
80
+
81
+ @property
82
+ def enable_dsp(self):
83
+ value = self.config["enable_dsp"]
84
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
85
+
86
+ @property
87
+ def ethosu_num_macs(self):
88
+ return int(self.config["ethosu_num_macs"])
89
+
90
+ @property
91
+ def fvp_exe(self):
92
+ return Path(self.config["corstone300.exe"])
93
+
94
+ @property
95
+ def gcc_prefix(self):
96
+ return str(self.config["arm_gcc.install_dir"])
97
+
98
+ @property
99
+ def cmsisnn_dir(self):
100
+ return Path(self.config["cmsisnn.dir"])
101
+
102
+ @property
103
+ def extra_args(self):
104
+ return str(self.config["extra_args"])
105
+
106
+ @property
107
+ def timeout_sec(self):
108
+ # 0 = off
109
+ return int(self.config["timeout_sec"])
110
+
111
+ def get_default_fvp_args(self):
112
+ return [
113
+ "-C",
114
+ "mps3_board.visualisation.disable-visualisation=1",
115
+ "-C",
116
+ "mps3_board.telnetterminal0.start_telnet=0",
117
+ "-C",
118
+ 'mps3_board.uart0.out_file="-"',
119
+ "-C",
120
+ "mps3_board.uart0.unbuffered_output=1",
121
+ "-C",
122
+ 'mps3_board.uart0.shutdown_tag="EXITTHESIM"',
123
+ "-C",
124
+ "cpu0.CFGDTCMSZ=15", # ?
125
+ "-C",
126
+ "cpu0.CFGITCMSZ=15", # ?
127
+ "-C",
128
+ f"cpu0.FPU={int(self.enable_fpu)}",
129
+ "-C",
130
+ "cpu0.MVE={}".format(
131
+ 2 if self.enable_mvei and self.enable_fpu else (1 if self.enable_mvei and not self.enable_fpu else 0)
132
+ ),
133
+ ]
134
+
135
+ def get_ethosu_fvp_args(self):
136
+ return [
137
+ "-C",
138
+ f"ethosu.num_macs={self.ethosu_num_macs}",
139
+ "-C",
140
+ 'ethosu.extra_args="--fast"',
141
+ ]
142
+
143
+ def exec(self, program, *args, cwd=os.getcwd(), **kwargs):
144
+ """Use target to execute a executable with given arguments"""
145
+ fvp_args = []
146
+ fvp_args.extend(self.get_default_fvp_args())
147
+ if self.enable_ethosu:
148
+ fvp_args.extend(self.get_ethosu_fvp_args())
149
+ if self.timeout_sec > 0:
150
+ fvp_args.extend(["--timelimit", str(self.timeout_sec)])
151
+ if len(self.extra_args) > 0:
152
+ fvp_args.extend(self.extra_args.split(" "))
153
+
154
+ if "ethosu" in [feature.name for feature in self.features]: # TODO: remove this
155
+ raise NotImplementedError
156
+
157
+ ret = execute(
158
+ self.fvp_exe.resolve(),
159
+ *fvp_args,
160
+ program,
161
+ *args,
162
+ cwd=cwd,
163
+ **kwargs,
164
+ )
165
+ return ret
166
+
167
+ def parse_stdout(self, out, handle_exit=None):
168
+ exit_match = re.search(r"Application exit code: (.*)\.", out)
169
+ if exit_match:
170
+ exit_code = int(exit_match.group(1))
171
+ if handle_exit is not None:
172
+ exit_code = handle_exit(exit_code)
173
+ if exit_code != 0:
174
+ logger.error("Execution failed - " + out)
175
+ raise RuntimeError(f"unexpected exit code: {exit_code}")
176
+ cpu_cycles = re.search(r"Total Cycles: (.*)", out)
177
+
178
+ if not cpu_cycles:
179
+ if exit == 0:
180
+ logger.warning("unexpected script output (cycles)")
181
+ cycles = None
182
+ else:
183
+ cycles = int(float(cpu_cycles.group(1)))
184
+ # mips = None # TODO: parse mips?
185
+ return cycles
186
+
187
+ def get_metrics(self, elf, directory, *args, handle_exit=None):
188
+ out = ""
189
+ if self.print_outputs:
190
+ out += self.exec(elf, *args, cwd=directory, live=True, handle_exit=handle_exit)
191
+ else:
192
+ out += self.exec(
193
+ elf, *args, cwd=directory, live=False, print_func=lambda *args, **kwargs: None, handle_exit=handle_exit
194
+ )
195
+ cycles = self.parse_stdout(out, handle_exit=handle_exit)
196
+
197
+ metrics = Metrics()
198
+ metrics.add("Cycles", cycles)
199
+
200
+ return metrics, out, []
201
+
202
+ def get_platform_defs(self, platform):
203
+ ret = super().get_platform_defs(platform)
204
+ ret["CMSIS_PATH"] = self.cmsisnn_dir
205
+ ret["ARM_COMPILER_PREFIX"] = self.gcc_prefix
206
+ cpu, float_abi, fpu = resolve_cpu_features(
207
+ self.model, enable_fp=self.enable_fpu, enable_dsp=self.enable_dsp, enable_mve=self.enable_mvei
208
+ )
209
+ ret["ARM_CPU"] = cpu
210
+ ret["ARM_FLOAT_ABI"] = float_abi
211
+ ret["ARM_FPU"] = fpu
212
+ return ret
213
+
214
+ def get_arch(self):
215
+ return "arm" # TODO: use proper mapping (v6, v7, v8, v8.1...)
216
+
217
+ def get_backend_config(self, backend):
218
+ if backend in SUPPORTED_TVM_BACKENDS:
219
+ ret = {
220
+ "target_device": "arm_cpu",
221
+ # "target_march": self.get_arch(),
222
+ "target_model": "unknown",
223
+ "target_mtriple": "arm-none-eabi",
224
+ "target_mcpu": self.model,
225
+ # "target_mattr": "?",
226
+ # "target_mabi": self.abi,
227
+ }
228
+ if self.enable_dsp:
229
+ ret.update({"desired_layout": "NHWC:HWOI"}) # Not yet supported by upstream TVMC
230
+ return ret
231
+ return {}
232
+
233
+
234
+ if __name__ == "__main__":
235
+ cli(target=Corstone300Target)
@@ -0,0 +1,109 @@
1
+ #
2
+ # Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
3
+ #
4
+ # This file is part of MLonMCU.
5
+ # See https://github.com/tum-ei-eda/mlonmcu.git for further info.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ """MLonMCU ARM Cortex-M utilities"""
20
+
21
+ DSP_TARGETS = ["cortex-m4", "cortex-m7", "cortex-m33", "cortex-m35p", "cortex-m55"]
22
+
23
+ MVE_TARGETS = ["cortex-m55"]
24
+
25
+ FP_TARGETS = ["cortex-m4", "cortex-m7", "cortex-m33", "cortex-m35p", "cortex-m55"]
26
+ FP_DP_TARGETS = ["cortex-m7", "cortex-m55"]
27
+
28
+ ALLOWED_ATTRS = {
29
+ "cortex-m0": [],
30
+ "cortex-m0plus": [],
31
+ "cortex-m1": [],
32
+ "cortex-m3": [],
33
+ "cortex-m4": ["+nofp"],
34
+ "cortex-m7": ["+nofp", "+nofp.dp"],
35
+ "cortex-m23": [],
36
+ "cortex-m33": ["+nodsp", "+nofp"],
37
+ "cortex-m35p": ["+nodsp", "+nofp"],
38
+ "cortex-m55": ["+nomve", "+nomve.fp", "+nodsp", "+nofp"],
39
+ }
40
+
41
+
42
+ def resolve_cpu_features(model, enable_fp=None, enable_fp_dp=None, enable_dsp=None, enable_mve=None):
43
+ cpu = model
44
+ fpu = "auto"
45
+
46
+ splitted = cpu.split("+")
47
+ base = splitted[0]
48
+ attrs = [f"+{attr}" for attr in splitted[1:]]
49
+
50
+ if enable_fp is None:
51
+ enable_fp = base in FP_TARGETS and ("+nofp" not in ALLOWED_ATTRS[base] or "+nofp" not in attrs)
52
+ if enable_fp_dp is None:
53
+ if enable_fp:
54
+ enable_fp_dp = base in FP_DP_TARGETS and ("+nofp.dp" not in ALLOWED_ATTRS[base] or "+nofp.dp" not in attrs)
55
+ else:
56
+ enable_fp_dp = False
57
+ if enable_dsp is None:
58
+ enable_dsp = base in DSP_TARGETS and ("+nodsp" not in ALLOWED_ATTRS[base] or "+nodsp" not in attrs)
59
+ if enable_mve is None:
60
+ enable_mve = base in MVE_TARGETS and ("+nomve" not in ALLOWED_ATTRS[base] or "+nomve" not in attrs)
61
+
62
+ float_abi = "hard" if enable_fp else "soft"
63
+
64
+ if enable_fp_dp:
65
+ assert enable_fp, "ARM double precision floating point supports requires fp extension"
66
+ if enable_mve:
67
+ assert enable_dsp, "ARM MVEI extension implies DSP extension"
68
+
69
+ if len(attrs) > 0:
70
+ # User defined features explicitly, check for validity
71
+ if enable_fp and ("+nofp" not in ALLOWED_ATTRS[base] or "+nofp" not in attrs):
72
+ assert base in FP_TARGETS, f"Chosen cpu '{cpu}' does not support floating point"
73
+ if enable_fp_dp and ("+nofp.dp" not in ALLOWED_ATTRS[base] or "+nofp.dp" not in attrs):
74
+ assert base in FP_DP_TARGETS, f"Chosen cpu '{cpu}' does not support double precison floating point"
75
+ if enable_dsp and ("+nodsp" not in ALLOWED_ATTRS[base] or "+nodsp" not in attrs):
76
+ assert base in DSP_TARGETS, f"Chosen cpu '{cpu}' does not support dsp instructions"
77
+ if enable_mve and ("+nomve" not in ALLOWED_ATTRS[base] or "+nomve" not in attrs):
78
+ assert base in MVE_TARGETS, f"Chosen cpu '{cpu}' does not support mve (helium) instructions"
79
+ else:
80
+ # Define features automatically
81
+ if enable_fp:
82
+ assert base in FP_TARGETS, f"Chosen cpu '{cpu}' does not support floating point"
83
+ else:
84
+ if base in FP_TARGETS:
85
+ assert "+nofp" in ALLOWED_ATTRS[base], f"Floating point support can not be turned off for cpu '{cpu}'"
86
+ attrs.append("+nofp")
87
+ if enable_fp_dp:
88
+ assert base in FP_DP_TARGETS, f"Chosen cpu '{cpu}' does not support double precision floating point"
89
+ else:
90
+ if base in FP_DP_TARGETS and enable_fp:
91
+ assert (
92
+ "+nofp.dp" in ALLOWED_ATTRS[base]
93
+ ), f"Double precision floating point support can not be turned off for cpu '{cpu}'"
94
+ attrs.append("+nofp.dp")
95
+ if enable_dsp:
96
+ assert base in DSP_TARGETS, f"Chosen cpu '{cpu}' does not support dsp instructions"
97
+ else:
98
+ if base in DSP_TARGETS:
99
+ assert "+nodsp" in ALLOWED_ATTRS[base], f"DSP extension can not be turned off for cpu '{cpu}'"
100
+ attrs.append("+nodsp")
101
+ if enable_mve:
102
+ assert base in MVE_TARGETS, f"Chosen cpu '{cpu}' does not support mve (helium) instructions"
103
+ else:
104
+ if base in MVE_TARGETS:
105
+ assert "+nomve" in ALLOWED_ATTRS[base], f"MVE (helium) extension can not be turned of for cpu '{cpu}'"
106
+ attrs.append("+nomve")
107
+
108
+ cpu = "".join([base] + attrs)
109
+ return cpu, float_abi, fpu
@@ -0,0 +1,194 @@
1
+ #
2
+ # Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
3
+ #
4
+ # This file is part of MLonMCU.
5
+ # See https://github.com/tum-ei-eda/mlonmcu.git for further info.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ """Helper functions used by MLonMCU targets"""
20
+
21
+ import subprocess
22
+ import argparse
23
+ from typing import List, Callable
24
+
25
+ from mlonmcu.cli.helper.parse import extract_feature_names, extract_config
26
+ from mlonmcu.feature.type import FeatureType
27
+ from mlonmcu.feature.features import get_available_features
28
+ from mlonmcu.logging import get_logger
29
+
30
+ logger = get_logger()
31
+
32
+
33
+ # TODO: merge together with mlonmcu.setup.utils.exec_getout
34
+ def execute(
35
+ *args: List[str],
36
+ ignore_output: bool = False,
37
+ live: bool = False,
38
+ print_func: Callable = print,
39
+ handle_exit=None,
40
+ err_func: Callable = logger.error,
41
+ **kwargs,
42
+ ) -> str:
43
+ """Wrapper for running a program in a subprocess.
44
+
45
+ Parameters
46
+ ----------
47
+ args : list
48
+ The actual command.
49
+ ignore_output : bool
50
+ Do not get the stdout and stderr or the subprocess.
51
+ live : bool
52
+ Print the output line by line instead of only at the end.
53
+ print_func : Callable
54
+ Function which should be used to print sysout messages.
55
+ err_func : Callable
56
+ Function which should be used to print errors.
57
+ kwargs: dict
58
+ Arbitrary keyword arguments passed through to the subprocess.
59
+
60
+ Returns
61
+ -------
62
+ out : str
63
+ The command line output of the command
64
+ """
65
+ logger.debug("- Executing: %s", str(args))
66
+ if ignore_output:
67
+ assert not live
68
+ subprocess.run(args, **kwargs, check=True)
69
+ return None
70
+
71
+ out_str = ""
72
+ if live:
73
+ with subprocess.Popen(
74
+ args,
75
+ **kwargs,
76
+ stdout=subprocess.PIPE,
77
+ stderr=subprocess.STDOUT,
78
+ ) as process:
79
+ for line in process.stdout:
80
+ new_line = line.decode(errors="replace")
81
+ out_str = out_str + new_line
82
+ print_func(new_line.replace("\n", ""))
83
+ exit_code = None
84
+ while exit_code is None:
85
+ exit_code = process.poll()
86
+ if handle_exit is not None:
87
+ exit_code = handle_exit(exit_code)
88
+ assert exit_code == 0, "The process returned an non-zero exit code {}! (CMD: `{}`)".format(
89
+ exit_code, " ".join(list(map(str, args)))
90
+ )
91
+ else:
92
+ p = subprocess.Popen([i for i in args], **kwargs, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
93
+ out_str = p.communicate()[0].decode(errors="replace")
94
+ exit_code = p.poll()
95
+ print_func(out_str)
96
+ if handle_exit is not None:
97
+ exit_code = handle_exit(exit_code)
98
+ if exit_code != 0:
99
+ err_func(out_str)
100
+ assert exit_code == 0, "The process returned an non-zero exit code {}! (CMD: `{}`)".format(
101
+ exit_code, " ".join(list(map(str, args)))
102
+ )
103
+
104
+ return out_str
105
+
106
+
107
+ def add_common_options(parser: argparse.ArgumentParser, target):
108
+ """Add a set of common options to a command line parser.
109
+
110
+ Parameters
111
+ ----------
112
+ parser : argparse.ArgumentParser
113
+ The command line parser
114
+ """
115
+ target_group = parser.add_argument_group("target options")
116
+ target_group.add_argument(
117
+ "-f",
118
+ "--feature",
119
+ type=str,
120
+ metavar="FEATURE",
121
+ action="append",
122
+ choices=target.FEATURES, # TODO: get from selected target?
123
+ help="Enabled features for target (Choices: %(choices)s)",
124
+ )
125
+ target_group.add_argument(
126
+ "-c",
127
+ "--config",
128
+ metavar="KEY=VALUE",
129
+ nargs="+",
130
+ action="append",
131
+ help="Custom target config as key-value pairs",
132
+ )
133
+
134
+
135
+ def init_target_features(names, config):
136
+ features = []
137
+ for name in names:
138
+ feature_classes = get_available_features(feature_type=FeatureType.TARGET, feature_name=name)
139
+ for feature_class in feature_classes:
140
+ features.append(feature_class(config=config))
141
+ return features
142
+
143
+
144
+ def cli(target, args: List[str] = None):
145
+ """Utility to handle the command line api for targets.
146
+
147
+ Parameters
148
+ ----------
149
+ target : Target
150
+ The target to be used.
151
+ args : list
152
+ Interface to pass arguments to the command line parser from test functions.
153
+ """
154
+ parser = argparse.ArgumentParser(description="ML on MCU Target")
155
+ subparsers = parser.add_subparsers(dest="subcommand")
156
+ exec_parser = subparsers.add_parser("exec", description="Run program with target")
157
+
158
+ def _handle_execute(args):
159
+ config, _ = extract_config(args)
160
+ feature_names, _ = extract_feature_names(args)
161
+ features = init_target_features(feature_names, config)
162
+ target_inst = target(features=features, config=config)
163
+ target_inst.exec(args.program, *args.extra_args, live=True)
164
+
165
+ exec_parser.set_defaults(func=_handle_execute)
166
+ add_common_options(exec_parser, target)
167
+ exec_group = exec_parser.add_argument_group("Exec options")
168
+ exec_group.add_argument("program", metavar="EXE", type=str, help="The program which should be executed")
169
+ exec_group.add_argument("extra_args", metavar="ARG", nargs="*", help="Additional arguments")
170
+ inspect_parser = subparsers.add_parser("inspect", description="Inspect program with target")
171
+
172
+ def _handle_inspect(args):
173
+ config, _ = extract_config(args)
174
+ feature_names, _ = extract_feature_names(args)
175
+ features = init_target_features(feature_names, config)
176
+ target_inst = target(features=features, config=config)
177
+ target_inst.inspect(args.program)
178
+
179
+ inspect_parser.set_defaults(func=_handle_inspect)
180
+ add_common_options(inspect_parser, target)
181
+ inspect_group = inspect_parser.add_argument_group("Inspect options")
182
+ inspect_group.add_argument("program", metavar="EXE", type=str, help="The program which should be inspected")
183
+ if args:
184
+ args = parser.parse_args(args)
185
+ else:
186
+ args = parser.parse_args()
187
+ if hasattr(args, "func"):
188
+ args.func(args)
189
+ else:
190
+ raise RuntimeError("Invalid command. For usage details use '--help'!")
191
+
192
+ # Argparge
193
+ # Env Vars
194
+ # MLONMCU Context (can be disabled via --plain)