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,501 @@
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
+ import logging
20
+
21
+ from .config import (
22
+ DefaultsConfig,
23
+ PathConfig,
24
+ RepoConfig,
25
+ FrameworkConfig,
26
+ FrameworkFeatureConfig,
27
+ BackendConfig,
28
+ BackendFeatureConfig,
29
+ TargetConfig,
30
+ TargetFeatureConfig,
31
+ PlatformConfig,
32
+ PlatformFeatureConfig,
33
+ FrontendConfig,
34
+ FrontendFeatureConfig,
35
+ )
36
+ from .loader import load_environment_from_file
37
+ from .writer import write_environment_to_file
38
+
39
+ from mlonmcu.feature.type import FeatureType
40
+
41
+
42
+ def _feature_helper(obj, name):
43
+ if not obj.enabled:
44
+ return []
45
+ features = obj.features
46
+ if name:
47
+ return [feature for feature in features if feature.name == name]
48
+ else:
49
+ return features
50
+
51
+
52
+ def _extract_names(objs):
53
+ return [obj.name for obj in objs]
54
+
55
+
56
+ def _filter_enabled(objs):
57
+ return [obj for obj in objs if obj.enabled]
58
+
59
+
60
+ class Environment:
61
+ def __init__(self):
62
+ self._home = None
63
+ self.alias = None
64
+ self.defaults = DefaultsConfig()
65
+ self.paths = {}
66
+ self.repos = {}
67
+ self.frameworks = []
68
+ self.frontends = []
69
+ self.platforms = []
70
+ self.toolchains = []
71
+ self.targets = []
72
+ self.vars = {}
73
+ self.flags = {}
74
+
75
+ def __str__(self):
76
+ return self.__class__.__name__ + "(" + str(vars(self)) + ")"
77
+
78
+ @property
79
+ def home(self):
80
+ """Home directory of mlonmcu environment."""
81
+ return self._home
82
+
83
+ @classmethod
84
+ def from_file(cls, filename):
85
+ return load_environment_from_file(filename, base=cls)
86
+
87
+ def to_file(self, filename):
88
+ write_environment_to_file(self, filename)
89
+
90
+ def lookup_path(self, name):
91
+ assert name in self.paths, f"Unable to find '{name}' path in environment config"
92
+ return self.paths[name]
93
+
94
+ def lookup_var(self, name, default=None):
95
+ return self.vars.get(name, default)
96
+
97
+ def lookup_frontend_feature_configs(self, name=None, frontend=None):
98
+ configs = []
99
+ if frontend:
100
+ names = [frontend.name for frontend in self.frontends]
101
+ index = names.index(frontend)
102
+ assert index is not None, f"Frontend {frontend} not found in environment config"
103
+ configs.extend(_feature_helper(self.frontends[index], name))
104
+ else:
105
+ for frontend in self.frontends:
106
+ configs.extend(_feature_helper(frontend, name))
107
+ return configs
108
+
109
+ def lookup_framework_feature_configs(self, name=None, framework=None):
110
+ configs = []
111
+ if framework:
112
+ names = [framework.name for framework in self.frameworks]
113
+ index = names.index(framework)
114
+ assert index is not None, f"Framework {framework} not found in environment config"
115
+ configs.extend(_feature_helper(self.frameworks[index], name))
116
+ else:
117
+ for framework in self.frameworks:
118
+ configs.extend(_feature_helper(framework, name))
119
+ return configs
120
+
121
+ def lookup_backend_feature_configs(self, name=None, framework=None, backend=None):
122
+ def helper(framework, backend, name):
123
+ backend_features = self.framework[framework].backends[backend].features
124
+ if name:
125
+ return [backend_features[name]]
126
+ else:
127
+ return backend_features.values()
128
+
129
+ configs = []
130
+ if framework:
131
+ names = [framework.name for framework in self.frameworks]
132
+ index = names.index(framework)
133
+ assert index is not None, f"Framework {framework} not found in environment config"
134
+ if backend:
135
+ names_ = [backend.name for backend in self.frameworks[index].backends]
136
+ index_ = names_.index(backend)
137
+ assert index_ is not None, f"Backend {backend} not found in environment config"
138
+ configs.extend(_feature_helper(self.frameworks[index].backends[index], name))
139
+ else:
140
+ for backend in self.frameworks[index].backends:
141
+ configs.extend(_feature_helper(backend, name))
142
+ else:
143
+ for framework in self.frameworks:
144
+ if backend:
145
+ names_ = [backend.name for backend in framework.backends]
146
+ index_ = names_.index(backend)
147
+ assert index_ is not None, f"Backend {backend} not found in environment config"
148
+ configs.extend(_feature_helper(self.frameworks[index].backends[index], name))
149
+ else:
150
+ for backend in framework.backends:
151
+ configs.extend(_feature_helper(backend, name))
152
+ backend = None
153
+ return configs
154
+
155
+ def lookup_platform_feature_configs(self, name=None, platform=None):
156
+ configs = []
157
+ if platform:
158
+ names = [platform.name for platform in self.platforms]
159
+ index = names.index(platform)
160
+ assert (
161
+ index is not None
162
+ ), f"Platform {platform} not found in environment config" # TODO: do not fail, just return empty list
163
+ configs.extend(_feature_helper(self.platforms[index], name))
164
+ else:
165
+ for platform in self.platforms:
166
+ configs.extend(_feature_helper(platform, name))
167
+ return configs
168
+
169
+ def lookup_target_feature_configs(self, name=None, target=None):
170
+ configs = []
171
+ if target:
172
+ names = [target.name for target in self.targets]
173
+ index = names.index(target)
174
+ assert (
175
+ index is not None
176
+ ), f"Target {target} not found in environment config" # TODO: do not fail, just return empty list
177
+ configs.extend(_feature_helper(self.targets[index], name))
178
+ else:
179
+ for target in self.targets:
180
+ configs.extend(_feature_helper(target, name))
181
+ return configs
182
+
183
+ def lookup_feature_configs(
184
+ self,
185
+ name=None,
186
+ kind=None,
187
+ frontend=None,
188
+ framework=None,
189
+ backend=None,
190
+ platform=None,
191
+ target=None,
192
+ ):
193
+ configs = []
194
+ if kind == FeatureType.FRONTEND or kind is None:
195
+ configs.extend(self.lookup_frontend_feature_configs(name=name, frontend=frontend))
196
+ if kind == FeatureType.FRAMEWORK or kind is None:
197
+ configs.extend(self.lookup_framework_feature_configs(name=name, framework=framework))
198
+ if kind == FeatureType.BACKEND or kind is None:
199
+ configs.extend(self.lookup_backend_feature_configs(name=name, framework=framework, backend=backend))
200
+ if kind == FeatureType.PLATFORM or kind is None:
201
+ configs.extend(self.lookup_platform_feature_configs(name=name, platform=platform))
202
+ if kind == FeatureType.TARGET or kind is None:
203
+ configs.extend(self.lookup_target_feature_configs(name=name, target=target))
204
+
205
+ return configs
206
+
207
+ def supports_feature(self, name):
208
+ configs = self.lookup_feature_configs(name=name)
209
+ supported = [feature.supported for feature in configs]
210
+ return any(supported)
211
+
212
+ def has_feature(self, name):
213
+ """An alias for supports_feature."""
214
+ return self.supports_feature(name)
215
+
216
+ def lookup_backend_configs(self, backend=None, framework=None, names_only=False):
217
+ enabled_frameworks = _filter_enabled(self.frameworks)
218
+
219
+ configs = []
220
+ for framework_config in enabled_frameworks:
221
+ if framework is not None and framework_config.name != framework:
222
+ continue
223
+ enabled_backends = _filter_enabled(framework_config.backends)
224
+ if backend is None:
225
+ configs.extend(enabled_backends)
226
+ else:
227
+ for backend_config in enabled_backends:
228
+ if backend_config.name == backend:
229
+ return [backend_config.name if names_only else backend_config]
230
+ return _extract_names(configs) if names_only else configs
231
+
232
+ def lookup_framework_configs(self, framework=None, names_only=False):
233
+ enabled_frameworks = _filter_enabled(self.frameworks)
234
+
235
+ if framework is None:
236
+ return _extract_names(enabled_frameworks) if names_only else enabled_frameworks
237
+
238
+ for framework_config in enabled_frameworks:
239
+ if framework_config.name == framework:
240
+ return [framework_config.name if names_only else framework_config]
241
+
242
+ return []
243
+
244
+ def lookup_frontend_configs(self, frontend=None, names_only=False):
245
+ enabled_frontends = _filter_enabled(self.frontends)
246
+
247
+ if frontend is None:
248
+ return _extract_names(enabled_frontends) if names_only else enabled_frontends
249
+
250
+ for frontend_config in enabled_frontends:
251
+ if frontend_config.name == frontend:
252
+ return [frontend_config.name if names_only else frontend_config]
253
+ return []
254
+
255
+ def lookup_platform_configs(self, platform=None, names_only=False):
256
+ enabled_platforms = _filter_enabled(self.platforms)
257
+
258
+ if platform is None:
259
+ return _extract_names(enabled_platforms) if names_only else enabled_platforms
260
+ for platform_config in enabled_platforms:
261
+ if platform_config.name == platform:
262
+ return [platform_config.name if names_only else platform_config]
263
+
264
+ return []
265
+
266
+ def lookup_target_configs(self, target=None, names_only=False):
267
+ enabled_targets = _filter_enabled(self.targets)
268
+
269
+ if target is None:
270
+ return _extract_names(enabled_targets) if names_only else enabled_targets
271
+
272
+ for target_config in enabled_targets:
273
+ if target_config.name == target:
274
+ return [target_config.name if names_only else target_config]
275
+ return []
276
+
277
+ def has_frontend(self, name):
278
+ configs = self.lookup_frontend_configs(frontend=name)
279
+ return len(configs) > 0
280
+
281
+ def has_backend(self, name):
282
+ configs = self.lookup_backend_configs(backend=name)
283
+ return len(configs) > 0
284
+
285
+ def has_framework(self, name):
286
+ configs = self.lookup_framework_configs(framework=name)
287
+ return len(configs) > 0
288
+
289
+ def has_platform(self, name):
290
+ configs = self.lookup_platform_configs(platform=name)
291
+ return len(configs) > 0
292
+
293
+ def has_toolchain(self, name):
294
+ return self.toolchains.get(name, False)
295
+
296
+ def has_target(self, name):
297
+ configs = self.lookup_target_configs(target=name)
298
+ return len(configs) > 0
299
+
300
+ # TODO: actually we do not need to explicitly enable those? environment.yml list the default enabled ones instead
301
+ # of the supported ones in the environment
302
+ # def has_postprocess(self, name):
303
+ # configs = self.lookup_postprocess_configs(postprocess=name)
304
+ # return len(configs) > 0
305
+
306
+ def get_default_backends(self, framework):
307
+ if framework is None or framework not in self.defaults.default_backends:
308
+ return []
309
+ default = self.defaults.default_backends[framework]
310
+ # framework_names = [framework_config.name for framework_config in self.frameworks]
311
+ # framework_config = self.frameworks[framework_names.index(framework)]
312
+ if default is None:
313
+ return []
314
+ if isinstance(default, str):
315
+ if default == "*": # Wildcard all enabled frameworks
316
+ default = self.get_enabled_backends()
317
+ else:
318
+ default = [default]
319
+ else:
320
+ assert isinstance(default, list), "TODO"
321
+ return default
322
+
323
+ def get_default_frameworks(self):
324
+ default = self.defaults.default_framework
325
+ if default is None:
326
+ return []
327
+ if isinstance(default, str):
328
+ if default == "*": # Wildcard all enabled frameworks
329
+ default = self.get_enabled_frameworks()
330
+ else:
331
+ default = [default]
332
+ else:
333
+ assert isinstance(default, list), "TODO"
334
+ return default
335
+
336
+ def get_default_targets(self):
337
+ default = self.defaults.default_target
338
+ if default is not None:
339
+ if isinstance(default, str):
340
+ if default == "*": # Wildcard all enabled targets
341
+ default = self.get_enabled_targets()
342
+ else:
343
+ default = [default]
344
+ else:
345
+ assert isinstance(default, list)
346
+ return default
347
+
348
+
349
+ class DefaultEnvironment(Environment):
350
+ def __init__(self):
351
+ super().__init__()
352
+ self.defaults = DefaultsConfig(
353
+ log_level=logging.DEBUG,
354
+ log_to_file=False,
355
+ default_framework=None,
356
+ default_backends={},
357
+ default_target=None,
358
+ cleanup_auto=False,
359
+ cleanup_keep=100,
360
+ )
361
+ self.paths = {
362
+ "deps": PathConfig("./deps"),
363
+ "logs": PathConfig("./logs"),
364
+ "results": PathConfig("./results"),
365
+ "plugins": PathConfig("./plugins"),
366
+ "temp": PathConfig("out"),
367
+ "models": [
368
+ PathConfig("./models"),
369
+ ],
370
+ }
371
+ self.repos = {
372
+ "tensorflow": RepoConfig("https://github.com/tensorflow/tensorflow.git", ref="v2.5.2"),
373
+ "tflite_micro_compiler": RepoConfig(
374
+ "https://github.com/cpetig/tflite_micro_compiler.git", ref="master"
375
+ ), # TODO: freeze ref?
376
+ "tvm": RepoConfig(
377
+ "https://github.com/tum-ei-eda/tvm.git", ref="tumeda"
378
+ ), # TODO: use upstream repo with suitable commit?
379
+ "utvm_staticrt_codegen": RepoConfig(
380
+ "https://github.com/tum-ei-eda/utvm_staticrt_codegen.git", ref="master"
381
+ ), # TODO: freeze ref?
382
+ "etiss": RepoConfig("https://github.com/tum-ei-eda/etiss.git", ref="master"), # TODO: freeze ref?
383
+ }
384
+ self.frameworks = [
385
+ FrameworkConfig(
386
+ "tflm",
387
+ enabled=True,
388
+ backends=[
389
+ BackendConfig("tflmc", enabled=True, features=[]),
390
+ BackendConfig("tflmi", enabled=True, features=[]),
391
+ ],
392
+ features=[
393
+ FrameworkFeatureConfig("muriscvnn", framework="tflm", supported=False),
394
+ ],
395
+ ),
396
+ FrameworkConfig(
397
+ "utvm",
398
+ enabled=True,
399
+ backends=[
400
+ BackendConfig(
401
+ "tvmaot",
402
+ enabled=True,
403
+ features=[
404
+ BackendFeatureConfig("unpacked_api", backend="tvmaot", supported=True),
405
+ ],
406
+ ),
407
+ BackendConfig("tvmrt", enabled=True, features=[]),
408
+ BackendConfig("tvmcg", enabled=True, features=[]),
409
+ ],
410
+ features=[
411
+ FrameworkFeatureConfig("memplan", framework="utvm", supported=False),
412
+ ],
413
+ ),
414
+ ]
415
+ self.frontends = [
416
+ FrontendConfig("saved_model", enabled=False),
417
+ FrontendConfig("ipynb", enabled=False),
418
+ FrontendConfig(
419
+ "tflite",
420
+ enabled=True,
421
+ features=[
422
+ FrontendFeatureConfig("packing", frontend="tflite", supported=False),
423
+ ],
424
+ ),
425
+ ]
426
+ self.vars = {
427
+ "TEST": "abc",
428
+ }
429
+ self.flags = {}
430
+ self.platforms = [
431
+ PlatformConfig(
432
+ "mlif",
433
+ enabled=True,
434
+ features=[PlatformFeatureConfig("debug", platform="mlif", supported=True)],
435
+ )
436
+ ]
437
+ self.toolchains = {}
438
+ self.targets = [
439
+ TargetConfig(
440
+ "etiss_pulpino",
441
+ features=[
442
+ TargetFeatureConfig("debug", target="etiss_pulpino", supported=True),
443
+ TargetFeatureConfig("attach", target="etiss_pulpino", supported=True),
444
+ TargetFeatureConfig("trace", target="etiss_pulpino", supported=True),
445
+ ],
446
+ ),
447
+ TargetConfig(
448
+ "host_x86",
449
+ features=[
450
+ TargetFeatureConfig("debug", target="host_x86", supported=True),
451
+ TargetFeatureConfig("attach", target="host_x86", supported=True),
452
+ ],
453
+ ),
454
+ ]
455
+
456
+
457
+ class UserEnvironment(DefaultEnvironment):
458
+ def __init__(
459
+ self,
460
+ home,
461
+ merge=False,
462
+ alias=None,
463
+ defaults=None,
464
+ paths=None,
465
+ repos=None,
466
+ frameworks=None,
467
+ frontends=None,
468
+ platforms=None,
469
+ toolchains=None,
470
+ targets=None,
471
+ variables=None,
472
+ default_flags=None,
473
+ ):
474
+ super().__init__()
475
+ self._home = home
476
+
477
+ if merge:
478
+ raise NotImplementedError
479
+
480
+ if alias:
481
+ self.alias = alias
482
+ if defaults:
483
+ self.defaults = defaults
484
+ if paths:
485
+ self.paths = paths
486
+ if repos:
487
+ self.repos = repos
488
+ if frameworks:
489
+ self.frameworks = frameworks
490
+ if frontends:
491
+ self.frontends = frontends
492
+ if platforms:
493
+ self.platforms = platforms
494
+ if toolchains:
495
+ self.toolchains = toolchains
496
+ if targets:
497
+ self.targets = targets
498
+ if variables:
499
+ self.vars = variables
500
+ if default_flags:
501
+ self.flags = default_flags
@@ -0,0 +1,191 @@
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
+ import sys
20
+ import git
21
+ from pathlib import Path
22
+ import venv
23
+ import os
24
+ from .list import get_environment_names, get_alternative_name, register_environment
25
+ from .config import (
26
+ get_environments_dir,
27
+ env_subdirs,
28
+ get_config_dir,
29
+ get_environments_file,
30
+ DEFAULTS,
31
+ init_config_dir,
32
+ )
33
+ from .templates import write_environment_yaml_from_template
34
+ from mlonmcu.utils import in_virtualenv, ask_user
35
+ from mlonmcu.logging import get_logger
36
+
37
+ logger = get_logger()
38
+
39
+
40
+ def create_environment_directories(path, directories):
41
+ if not isinstance(path, Path):
42
+ path = Path(path)
43
+ if not path.is_dir():
44
+ raise RuntimeError(f"Not a diretory: {path}")
45
+ for directory in directories:
46
+ (path / directory).mkdir(parents=True, exist_ok=True)
47
+
48
+
49
+ def clone_models_repo(
50
+ dest, url="https://github.com/tum-ei-eda/mlonmcu-models.git"
51
+ ): # TODO: how to get submodule url/ref
52
+ git.Repo.clone_from(url, dest)
53
+
54
+
55
+ def create_venv_directory(base, hidden=True):
56
+ if not isinstance(base, Path):
57
+ base = Path(base)
58
+ dirname = ".venv" if hidden else "venv"
59
+ venv_dir = base / dirname
60
+ venv.create(venv_dir)
61
+ print(f"Virtual environment was created in {venv_dir}. Make sure to activate it before using mlonmcu.")
62
+
63
+
64
+ def initialize_environment(
65
+ directory,
66
+ name,
67
+ interactive=True,
68
+ create_venv=None,
69
+ clone_models=None,
70
+ allow_exists=None,
71
+ register=None,
72
+ template=None,
73
+ config=None,
74
+ ):
75
+ overwrite = False
76
+ assert template is not None
77
+ print("Initializing ML on MCU environment")
78
+ use_default_dir = directory == get_environments_dir()
79
+ has_name = len(name.strip()) > 0
80
+ if has_name:
81
+ final_name = name.strip()
82
+ else:
83
+ if use_default_dir:
84
+ final_name = DEFAULTS["environment"]
85
+ has_name = True
86
+ else:
87
+ final_name = "unnamed"
88
+ if use_default_dir:
89
+ target_dir = os.path.join(directory, final_name)
90
+ else:
91
+ target_dir = directory
92
+ target_dir = os.path.abspath(target_dir)
93
+ config_dir = get_config_dir()
94
+ if use_default_dir or register is not False:
95
+ if not os.path.exists(config_dir):
96
+ print(
97
+ f"The mlonmcu user config directory {config_dir} does not exist!",
98
+ end=" - ",
99
+ )
100
+ if not ask_user("Initialize?", default=True, interactive=interactive):
101
+ print("Aborting...")
102
+ sys.exit(1)
103
+ init_config_dir()
104
+ print("Initialized config directory.")
105
+
106
+ print("Selected target directory:", target_dir)
107
+ if os.path.exists(target_dir):
108
+ print("The directory already exists!")
109
+ if len(os.listdir(target_dir)) > 0:
110
+ print("The directory is not empty!", end=" - ")
111
+ # TODO: check for mlonmcu project files, if yes ask for overwrite instead
112
+ if allow_exists is False or (
113
+ allow_exists is None and not ask_user("Use anyway?", default=False, interactive=interactive)
114
+ ):
115
+ print("Aborting...")
116
+ sys.exit(1)
117
+ print("Using existing directory.")
118
+ if has_name: # This is a hack
119
+ overwrite = True
120
+ else:
121
+ print("The directory does not exist!", end=" - ")
122
+ if not ask_user("Create directory?", default=True, interactive=interactive):
123
+ print("Aborting...")
124
+ sys.exit(1)
125
+ Path(target_dir).mkdir()
126
+ print("Created directory.")
127
+ print(f"Creating environment.yml based on template '{template}'.")
128
+ # TODO: create and maintain environments.yml in user directory?
129
+ write_environment_yaml_from_template(os.path.join(target_dir, "environment.yml"), template, home_dir=target_dir, config=config)
130
+
131
+ # FIXME: controversial?
132
+ if create_venv is None:
133
+ if not in_virtualenv():
134
+ print("It is strongly recommended to use mlonmcu inside a virtual Python environment.")
135
+ if ask_user("Create one automatically?", default=False, interactive=interactive):
136
+ # TODO: create venv
137
+ create_venv_directory(target_dir)
138
+ else:
139
+ print("Skipping creation of virtual environment. (already inside one)")
140
+ else:
141
+ if create_venv:
142
+ print("The creation of a virtual environment was requested")
143
+ create_venv_directory(target_dir)
144
+ else:
145
+ print("Skipping creation of virtual environment.")
146
+
147
+ subdirs = env_subdirs
148
+ models_subdir = Path(target_dir) / "models"
149
+ if not models_subdir.is_dir():
150
+ if clone_models or (
151
+ clone_models is None
152
+ and ask_user(
153
+ "Clone mlonmcu-models repository into environment?",
154
+ default=True,
155
+ interactive=interactive,
156
+ )
157
+ ):
158
+ clone_models_repo(models_subdir)
159
+ else:
160
+ subdirs.append("models")
161
+
162
+ print("Initializing directories in environment:", " ".join(subdirs))
163
+ create_environment_directories(target_dir, subdirs)
164
+
165
+ if register or (
166
+ register is None
167
+ and ask_user(
168
+ "Should the new environment be added to your list of environments?",
169
+ default=has_name,
170
+ interactive=interactive,
171
+ )
172
+ ):
173
+ environments_file = get_environments_file()
174
+ if not os.path.isfile(environments_file):
175
+ print(f"Environments file ({environments_file}) does not exist!", end=" - ")
176
+ if ask_user("Create empty one?", default=True, interactive=interactive):
177
+ open(environments_file, "a").close()
178
+ print("Initialized empty environments file.")
179
+
180
+ env_names = get_environment_names()
181
+ if final_name in env_names and not overwrite:
182
+ alternative_name = get_alternative_name(final_name, env_names)
183
+ print(f"An environment with the name '{final_name}' already exists. Using '{alternative_name}' instead")
184
+ final_name = alternative_name
185
+ # TODO: interactively ask the user
186
+ print("Adding new environment to environments file.")
187
+ register_environment(final_name, target_dir, overwrite=overwrite)
188
+
189
+ print(f"Finished. Please add `export MLONMCU_HOME={target_dir}` to your shell configuration to use it anywhere")
190
+ print("Recommended next step: `mlonmcu setup` inside your virtual environment.")
191
+ print("Optional: `mlonmcu setup -g`")