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,190 @@
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
+ """Definition of tasks used to dynamically install MLonMCU dependencies"""
20
+
21
+ import os
22
+ import multiprocessing
23
+ from pathlib import Path
24
+
25
+ from mlonmcu.setup.task import TaskType
26
+ from mlonmcu.context.context import MlonMcuContext
27
+ from mlonmcu.setup import utils
28
+ from mlonmcu.logging import get_logger
29
+
30
+ from .common import get_task_factory
31
+
32
+ logger = get_logger()
33
+
34
+ Tasks = get_task_factory()
35
+
36
+
37
+ def _validate_spike(context: MlonMcuContext, params=None):
38
+ if not context.environment.has_target("spike"):
39
+ return False
40
+ if params.get("vext", False):
41
+ if params.get("pext", False):
42
+ return False # Can not use booth at a time
43
+ if not context.environment.supports_feature("vext"):
44
+ return False
45
+ if params.get("pext", False):
46
+ if params.get("vext", False):
47
+ return False # Can not use booth at a time
48
+ if not context.environment.supports_feature("pext"):
49
+ return False
50
+ user_vars = context.environment.vars
51
+ if "spike.pk" not in user_vars: # TODO: also check command line flags?
52
+ assert "spikepk" in context.environment.repos, "Undefined repository: 'spikepk'"
53
+ if "spike.exe" not in user_vars: # TODO: also check command line flags?
54
+ assert "spike" in context.environment.repos, "Undefined repository: 'spike'"
55
+ return True
56
+
57
+
58
+ @Tasks.provides(["spikepk.src_dir"])
59
+ @Tasks.validate(_validate_spike)
60
+ @Tasks.register(category=TaskType.TARGET)
61
+ def clone_spike_pk(
62
+ context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
63
+ ):
64
+ """Clone the spike proxt kernel."""
65
+ spikepkName = utils.makeDirName("spikepk")
66
+ spikepkSrcDir = context.environment.paths["deps"].path / "src" / spikepkName
67
+ user_vars = context.environment.vars
68
+ if "spike.pk" in user_vars: # TODO: also check command line flags?
69
+ return False
70
+ if rebuild or not utils.is_populated(spikepkSrcDir):
71
+ spikepkRepo = context.environment.repos["spikepk"]
72
+ utils.clone(spikepkRepo.url, spikepkSrcDir, branch=spikepkRepo.ref)
73
+ context.cache["spikepk.src_dir"] = spikepkSrcDir
74
+
75
+
76
+ @Tasks.needs(["spikepk.src_dir", "riscv_gcc.install_dir", "riscv_gcc.name"])
77
+ @Tasks.provides(["spikepk.build_dir", "spike.pk"])
78
+ @Tasks.validate(_validate_spike)
79
+ @Tasks.register(category=TaskType.TARGET)
80
+ def build_spike_pk(
81
+ context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
82
+ ):
83
+ """Build Spike proxy kernel."""
84
+ if not params:
85
+ params = {}
86
+ user_vars = context.environment.vars
87
+ if "spike.pk" in user_vars: # TODO: also check command line flags?
88
+ return False
89
+ spikepkName = utils.makeDirName("spikepk")
90
+ spikepkSrcDir = context.cache["spikepk.src_dir"]
91
+ spikepkBuildDir = context.environment.paths["deps"].path / "build" / spikepkName
92
+ spikepkInstallDir = context.environment.paths["deps"].path / "install" / spikepkName
93
+ spikepkBin = spikepkInstallDir / "pk"
94
+ if rebuild or not (utils.is_populated(spikepkBuildDir) and spikepkBin.is_file()):
95
+ # No need to build a vext and non-vext variant?
96
+ utils.mkdirs(spikepkBuildDir)
97
+ gccName = context.cache["riscv_gcc.name"]
98
+ # assert gccName == "riscv32-unknown-elf", "Spike PK requires a non-multilib toolchain!"
99
+ vext = params.get("vext", False)
100
+ pext = params.get("pext", False)
101
+ assert not (pext and vext), "Currently only p or vector extension can be enabled at a time."
102
+ if vext and "riscv_gcc.install_dir_vext" in user_vars:
103
+ riscv_gcc = user_vars["riscv_gcc.install_dir_vext"]
104
+ elif pext and "riscv_gcc.install_dir_pext" in user_vars:
105
+ riscv_gcc = user_vars["riscv_gcc.install_dir_pext"]
106
+ elif "riscv_gcc.install_dir" in user_vars:
107
+ riscv_gcc = user_vars["riscv_gcc.install_dir"]
108
+ else:
109
+ riscv_gcc = context.cache["riscv_gcc.install_dir"]
110
+ arch = "rv32imafdc"
111
+ spikepkArgs = []
112
+ spikepkArgs.append("--prefix=" + str(riscv_gcc))
113
+ spikepkArgs.append("--host=" + gccName)
114
+ spikepkArgs.append(f"--with-arch={arch}")
115
+ spikepkArgs.append("--with-abi=ilp32d")
116
+ env = os.environ.copy()
117
+ env["PATH"] = str(Path(riscv_gcc) / "bin") + ":" + env["PATH"]
118
+ utils.exec_getout(
119
+ str(spikepkSrcDir / "configure"),
120
+ *spikepkArgs,
121
+ cwd=spikepkBuildDir,
122
+ env=env,
123
+ live=False,
124
+ print_output=False,
125
+ )
126
+ utils.make(cwd=spikepkBuildDir, threads=threads, live=verbose, env=env)
127
+ # utils.make(target="install", cwd=spikepkBuildDir, live=verbose, env=env)
128
+ utils.mkdirs(spikepkInstallDir)
129
+ utils.move(spikepkBuildDir / "pk", spikepkBin)
130
+ context.cache["spikepk.build_dir"] = spikepkBuildDir
131
+ context.cache["spike.pk"] = spikepkBin
132
+
133
+
134
+ @Tasks.provides(["spike.src_dir"])
135
+ @Tasks.validate(_validate_spike)
136
+ @Tasks.register(category=TaskType.TARGET)
137
+ def clone_spike(
138
+ context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
139
+ ):
140
+ """Clone the spike simulator."""
141
+ spikeName = utils.makeDirName("spike")
142
+ spikeSrcDir = context.environment.paths["deps"].path / "src" / spikeName
143
+ user_vars = context.environment.vars
144
+ if "spike.exe" in user_vars: # TODO: also check command line flags?
145
+ return False
146
+ if rebuild or not utils.is_populated(spikeSrcDir):
147
+ spikeRepo = context.environment.repos["spike"]
148
+ utils.clone(spikeRepo.url, spikeSrcDir, branch=spikeRepo.ref)
149
+ context.cache["spike.src_dir"] = spikeSrcDir
150
+
151
+
152
+ @Tasks.needs(["spike.src_dir", "riscv_gcc.install_dir", "riscv_gcc.name"])
153
+ @Tasks.provides(["spike.build_dir", "spike.exe"])
154
+ @Tasks.validate(_validate_spike)
155
+ @Tasks.register(category=TaskType.TARGET)
156
+ def build_spike(
157
+ context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
158
+ ):
159
+ """Build Spike simulator."""
160
+ if not params:
161
+ params = {}
162
+ user_vars = context.environment.vars
163
+ if "spike.exe" in user_vars: # TODO: also check command line flags?
164
+ return False
165
+ spikeName = utils.makeDirName("spike")
166
+ spikeSrcDir = context.cache["spike.src_dir"]
167
+ spikeBuildDir = context.environment.paths["deps"].path / "build" / spikeName
168
+ spikeInstallDir = context.environment.paths["deps"].path / "install" / spikeName
169
+ spikeExe = spikeInstallDir / "spike"
170
+ user_vars = context.environment.vars
171
+ if "spike.exe" in user_vars: # TODO: also check command line flags?
172
+ return False
173
+ if rebuild or not (utils.is_populated(spikeBuildDir) and spikeExe.is_file()):
174
+ # No need to build a vext and non-vext variant?
175
+ utils.mkdirs(spikeBuildDir)
176
+ spikeArgs = []
177
+ spikeArgs.append("--prefix=" + str(context.cache["riscv_gcc.install_dir"]))
178
+ utils.exec_getout(
179
+ str(spikeSrcDir / "configure"),
180
+ *spikeArgs,
181
+ cwd=spikeBuildDir,
182
+ live=False,
183
+ print_output=False,
184
+ )
185
+ utils.make(cwd=spikeBuildDir, threads=threads, live=verbose)
186
+ # utils.make(target="install", cwd=spikeBuildDir, threads=threads, live=verbose)
187
+ utils.mkdirs(spikeInstallDir)
188
+ utils.move(spikeBuildDir / "spike", spikeExe)
189
+ context.cache["spike.build_dir"] = spikeBuildDir
190
+ context.cache["spike.exe"] = spikeExe
@@ -0,0 +1,92 @@
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
+ """Definition of tasks used to dynamically install MLonMCU dependencies"""
20
+
21
+ import multiprocessing
22
+ from pathlib import Path
23
+
24
+ from mlonmcu.setup.task import TaskType
25
+ from mlonmcu.context.context import MlonMcuContext
26
+ from mlonmcu.setup import utils
27
+ from mlonmcu.logging import get_logger
28
+
29
+ from .common import get_task_factory
30
+
31
+ logger = get_logger()
32
+
33
+ Tasks = get_task_factory()
34
+
35
+
36
+ def _validate_tensorflow(context: MlonMcuContext, params=None):
37
+ return context.environment.has_framework("tflm")
38
+
39
+
40
+ @Tasks.provides(["tf.src_dir"])
41
+ @Tasks.validate(_validate_tensorflow)
42
+ @Tasks.register(category=TaskType.FRAMEWORK)
43
+ def clone_tensorflow(
44
+ context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
45
+ ):
46
+ """Clone the TF/TFLM repository."""
47
+ tfName = utils.makeDirName("tf")
48
+ tfSrcDir = context.environment.paths["deps"].path / "src" / tfName
49
+ if rebuild or not utils.is_populated(tfSrcDir):
50
+ tfRepo = context.environment.repos["tensorflow"]
51
+ utils.clone(tfRepo.url, tfSrcDir, branch=tfRepo.ref, refresh=rebuild)
52
+ context.cache["tf.src_dir"] = tfSrcDir
53
+
54
+
55
+ @Tasks.needs(["tf.src_dir"])
56
+ @Tasks.provides(["tf.dl_dir", "tf.lib_path"])
57
+ # @Tasks.param("dbg", False)
58
+ @Tasks.param("dbg", True)
59
+ @Tasks.validate(_validate_tensorflow)
60
+ @Tasks.register(category=TaskType.FRAMEWORK)
61
+ def build_tensorflow(
62
+ context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
63
+ ):
64
+ """Download tensorflow dependencies and build lib."""
65
+ if not params:
66
+ params = {}
67
+ flags = utils.makeFlags((params["dbg"], "dbg"))
68
+ # tfName = utils.makeDirName("tf", flags=flags)
69
+ tfSrcDir = context.cache["tf.src_dir"]
70
+ tflmDir = Path(tfSrcDir) / "tensorflow" / "lite" / "micro"
71
+ tflmBuildDir = tflmDir / "tools" / "make"
72
+ tflmDownloadsDir = tflmBuildDir / "downloads"
73
+ if params["dbg"]:
74
+ tflmLib = (
75
+ tflmBuildDir / "gen" / "linux_x86_64" / "lib" / "libtensorflow-microlite.a"
76
+ ) # FIXME: add _dbg suffix is possible
77
+ else:
78
+ tflmLib = tflmBuildDir / "gen" / "linux_x86_64" / "lib" / "libtensorflow-microlite.a"
79
+ # if rebuild or not tflmLib.is_file() or not utils.is_populated(tflmDownloadsDir):
80
+ if rebuild or not utils.is_populated(tflmDownloadsDir):
81
+ tfDbgArg = ["BUILD_TYPE=debug"] if params["dbg"] else []
82
+ utils.make(
83
+ "-f",
84
+ str(tflmDir / "tools" / "make" / "Makefile"),
85
+ "third_party_downloads",
86
+ threads=threads,
87
+ *tfDbgArg,
88
+ cwd=tfSrcDir,
89
+ live=verbose,
90
+ )
91
+ context.cache["tf.dl_dir"] = tflmDownloadsDir
92
+ context.cache["tf.lib_path", flags] = tflmLib # ignore!
@@ -0,0 +1,59 @@
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
+ """Definition of tasks used to dynamically install MLonMCU dependencies"""
20
+
21
+ import multiprocessing
22
+
23
+ from mlonmcu.setup.task import TaskType
24
+ from mlonmcu.context.context import MlonMcuContext
25
+ from mlonmcu.setup import utils
26
+ from mlonmcu.logging import get_logger
27
+
28
+ from .common import get_task_factory
29
+
30
+ logger = get_logger()
31
+
32
+ Tasks = get_task_factory()
33
+
34
+
35
+ def _validate_tflite_visualize(context: MlonMcuContext, params=None):
36
+ return context.environment.has_frontend("tflite") and context.environment.has_feature("visualize")
37
+
38
+
39
+ @Tasks.provides(["tflite_visualize.exe"])
40
+ @Tasks.validate(_validate_tflite_visualize)
41
+ @Tasks.register(category=TaskType.FEATURE)
42
+ def download_tflite_vizualize(
43
+ context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
44
+ ):
45
+ """Download the visualize.py script for TFLite."""
46
+ # This script is content of the tensorflow repo (not tflite-micro) and unfortunately not bundled
47
+ # into the tensorflow python package. Therefore just download this single file form GitHub
48
+
49
+ tfLiteVizualizeName = utils.makeDirName("tflite_visualize")
50
+ tfLiteVizualizeInstallDir = context.environment.paths["deps"].path / "install" / tfLiteVizualizeName
51
+ tfLiteVizualizeExe = tfLiteVizualizeInstallDir / "visualize.py"
52
+ user_vars = context.environment.vars
53
+ if "tflite_visualize.exe" in user_vars: # TODO: also check command line flags?
54
+ return False
55
+ if rebuild or not utils.is_populated(tfLiteVizualizeInstallDir):
56
+ tfLiteVizualizeInstallDir.mkdir()
57
+ url = "https://raw.githubusercontent.com/tensorflow/tensorflow/master/tensorflow/lite/tools/visualize.py"
58
+ utils.download(url, tfLiteVizualizeExe, progress=verbose)
59
+ context.cache["tflite_visualize.exe"] = tfLiteVizualizeExe
@@ -0,0 +1,141 @@
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
+ """Definition of tasks used to dynamically install MLonMCU dependencies"""
20
+
21
+ import multiprocessing
22
+ from pathlib import Path
23
+
24
+ from mlonmcu.setup.task import TaskType
25
+ from mlonmcu.context.context import MlonMcuContext
26
+ from mlonmcu.setup import utils
27
+ from mlonmcu.logging import get_logger
28
+
29
+ from .tf import _validate_tensorflow
30
+ from .common import get_task_factory
31
+
32
+ logger = get_logger()
33
+
34
+ Tasks = get_task_factory()
35
+
36
+
37
+ def _validate_tflite_micro_compiler(context: MlonMcuContext, params=None):
38
+ if not _validate_tensorflow(context, params=params):
39
+ return False
40
+ if not context.environment.has_backend("tflmc"):
41
+ return False
42
+ return True
43
+
44
+
45
+ @Tasks.provides(["tflmc.src_dir"])
46
+ @Tasks.validate(_validate_tflite_micro_compiler)
47
+ @Tasks.register(category=TaskType.BACKEND)
48
+ def clone_tflite_micro_compiler(
49
+ context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
50
+ ):
51
+ """Clone the preinterpreter repository."""
52
+ tflmcName = utils.makeDirName("tflmc")
53
+ tflmcSrcDir = context.environment.paths["deps"].path / "src" / tflmcName
54
+ if rebuild or not utils.is_populated(tflmcSrcDir):
55
+ tflmcRepo = context.environment.repos["tflite_micro_compiler"]
56
+ utils.clone(tflmcRepo.url, tflmcSrcDir, branch=tflmcRepo.ref)
57
+ context.cache["tflmc.src_dir"] = tflmcSrcDir
58
+
59
+
60
+ def _validate_build_tflite_micro_compiler(context: MlonMcuContext, params=None):
61
+ if params:
62
+ muriscvnn = params.get("muriscvnn", False)
63
+ cmsisnn = params.get("cmsisnn", False)
64
+ if muriscvnn and cmsisnn:
65
+ # Not allowed
66
+ return False
67
+ elif muriscvnn:
68
+ if not context.environment.supports_feature("muriscvnn"):
69
+ return False
70
+ elif cmsisnn:
71
+ if not context.environment.supports_feature("cmsisnn"):
72
+ return False
73
+ return _validate_tflite_micro_compiler(context, params=params)
74
+
75
+
76
+ @Tasks.needs(["tflmc.src_dir", "tf.src_dir"])
77
+ @Tasks.optional(["muriscvnn.lib", "muriscvnn.inc_dir", "cmsisnn.dir"])
78
+ @Tasks.provides(["tflmc.build_dir", "tflmc.exe"])
79
+ @Tasks.param("muriscvnn", [False, True])
80
+ @Tasks.param("cmsisnn", [False, True])
81
+ @Tasks.param("dbg", [False, True])
82
+ @Tasks.param("arch", ["x86"]) # TODO: compile for arm/riscv in the future
83
+ @Tasks.validate(_validate_build_tflite_micro_compiler)
84
+ @Tasks.register(category=TaskType.BACKEND)
85
+ def build_tflite_micro_compiler(
86
+ context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
87
+ ):
88
+ """Build the TFLM preinterpreter."""
89
+ muriscvnn = params.get("muriscvnn", False)
90
+ cmsisnn = params.get("cmsisnn", False)
91
+ dbg = params.get("dbg", False)
92
+ arch = params.get("arch", "x86")
93
+ flags = utils.makeFlags((True, arch), (muriscvnn, "muriscvnn"), (cmsisnn, "cmsisnn"), (dbg, "dbg"))
94
+ # flags_ = utils.makeFlags((dbg, "dbg"))
95
+ tflmcName = utils.makeDirName("tflmc", flags=flags)
96
+ tflmcBuildDir = context.environment.paths["deps"].path / "build" / tflmcName
97
+ tflmcInstallDir = context.environment.paths["deps"].path / "install" / tflmcName
98
+ tflmcExe = tflmcInstallDir / "compiler"
99
+ tfSrcDir = context.cache["tf.src_dir"]
100
+ tflmcSrcDir = context.cache["tflmc.src_dir"]
101
+ if rebuild or not utils.is_populated(tflmcBuildDir) or not tflmcExe.is_file():
102
+ cmakeArgs = [
103
+ "-DTF_SRC=" + str(tfSrcDir),
104
+ "-DGET_TF_SRC=ON",
105
+ ]
106
+ if muriscvnn:
107
+ flags__ = utils.makeFlags((True, arch), (True, "gcc"), (dbg, "dbg"))
108
+ muriscvnnLib = context.cache["muriscvnn.lib", flags__]
109
+ muriscvnnInc = context.cache["muriscvnn.inc_dir"]
110
+ cmakeArgs.append("-DTFLM_OPTIMIZED_KERNEL=cmsis_nn")
111
+ cmakeArgs.append(f"-DTFLM_OPTIMIZED_KERNEL_LIB={muriscvnnLib}")
112
+ cmakeArgs.append(f"-DTFLM_OPTIMIZED_KERNEL_INCLUDE_DIR={muriscvnnInc}")
113
+ elif cmsisnn:
114
+ flags__ = utils.makeFlags((True, arch), (dbg, "dbg"))
115
+ cmsisnnLib = context.cache["cmsisnn.lib", flags__]
116
+ cmsisDir = Path(context.cache["cmsisnn.dir"])
117
+ cmsisIncs = r"\;".join(
118
+ [
119
+ str(cmsisDir),
120
+ str(cmsisDir / "CMSIS" / "Core" / "Include"),
121
+ str(cmsisDir / "CMSIS" / "NN" / "Include"),
122
+ str(cmsisDir / "CMSIS" / "DSP" / "Include"),
123
+ ]
124
+ )
125
+ cmakeArgs.append("-DTFLM_OPTIMIZED_KERNEL=cmsis_nn")
126
+ cmakeArgs.append(f"-DTFLM_OPTIMIZED_KERNEL_LIB={cmsisnnLib}")
127
+ cmakeArgs.append(f"-DTFLM_OPTIMIZED_KERNEL_INCLUDE_DIR={cmsisIncs}")
128
+ utils.mkdirs(tflmcBuildDir)
129
+ # utils.cmake("-DTF_SRC=" + str(tfSrcDir), str(tflmcSrcDir), debug=params["dbg"], cwd=tflmcBuildDir)
130
+ utils.cmake(
131
+ *cmakeArgs,
132
+ str(tflmcSrcDir),
133
+ debug=dbg,
134
+ cwd=tflmcBuildDir,
135
+ live=verbose,
136
+ )
137
+ utils.make(cwd=tflmcBuildDir, threads=threads, live=verbose)
138
+ utils.mkdirs(tflmcInstallDir)
139
+ utils.move(tflmcBuildDir / "compiler", tflmcExe)
140
+ context.cache["tflmc.build_dir", flags] = tflmcBuildDir
141
+ context.cache["tflmc.exe", flags] = tflmcExe
@@ -0,0 +1,172 @@
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
+ """Definition of tasks used to dynamically install MLonMCU dependencies"""
20
+
21
+ import multiprocessing
22
+ from pathlib import Path
23
+
24
+ from mlonmcu.setup.task import TaskType
25
+ from mlonmcu.context.context import MlonMcuContext
26
+ from mlonmcu.setup import utils
27
+ from mlonmcu.logging import get_logger
28
+
29
+ from .common import get_task_factory
30
+
31
+ logger = get_logger()
32
+
33
+ Tasks = get_task_factory()
34
+
35
+
36
+ def _validate_tvm(context: MlonMcuContext, params=None):
37
+ user_vars = context.environment.vars
38
+ patch = bool(params.get("patch", False))
39
+ if patch:
40
+ if not context.environment.has_feature("disable_legalize"):
41
+ return False
42
+ return context.environment.has_framework("tvm")
43
+
44
+
45
+ def _validate_tvm_build(context: MlonMcuContext, params=None):
46
+ user_vars = context.environment.vars
47
+ use_tlcpack = user_vars.get("tvm.use_tlcpack", False)
48
+ patch = bool(params.get("patch", False))
49
+ if patch:
50
+ if not context.environment.has_feature("disable_legalize"):
51
+ return False
52
+ if use_tlcpack:
53
+ assert not context.environment.has_feature("disable_legalize")
54
+ return False
55
+
56
+ return context.environment.has_framework("tvm")
57
+
58
+
59
+ @Tasks.provides(["tvm.src_dir", "tvm.configs_dir"])
60
+ @Tasks.optional(["tvm_extensions.src_dir"])
61
+ @Tasks.validate(_validate_tvm)
62
+ @Tasks.param("patch", [False, True]) # This is just a temporary workaround until the patch is hopefully upstreamed
63
+ @Tasks.validate(_validate_tvm)
64
+ @Tasks.register(category=TaskType.FRAMEWORK)
65
+ def clone_tvm(context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()):
66
+ """Clone the TVM repository."""
67
+ if not params:
68
+ params = {}
69
+ patch = params["patch"]
70
+ flags = utils.makeFlags((patch, "patch"))
71
+ tvmName = utils.makeDirName("tvm", flags=flags)
72
+ tvmSrcDir = context.environment.paths["deps"].path / "src" / tvmName
73
+ tvmPythonPath = tvmSrcDir / "python"
74
+ if rebuild or not utils.is_populated(tvmSrcDir):
75
+ tvmRepo = context.environment.repos["tvm"]
76
+ utils.clone(tvmRepo.url, tvmSrcDir, branch=tvmRepo.ref, recursive=True)
77
+ if patch:
78
+ extSrcDir = context.cache["tvm_extensions.src_dir"]
79
+ patchFile = extSrcDir / "tvmc_diff.patch"
80
+ utils.apply(tvmSrcDir, patchFile)
81
+
82
+ context.cache["tvm.src_dir", flags] = tvmSrcDir
83
+ context.cache["tvm.configs_dir", flags] = tvmSrcDir / "configs"
84
+ context.cache["tvm.pythonpath", flags] = tvmPythonPath
85
+
86
+
87
+ @Tasks.needs(["tvm.src_dir", "llvm.install_dir"])
88
+ @Tasks.provides(["tvm.build_dir", "tvm.lib"])
89
+ @Tasks.param("dbg", False)
90
+ @Tasks.param("cmsisnn", [False, True])
91
+ @Tasks.validate(_validate_tvm_build)
92
+ @Tasks.register(category=TaskType.FRAMEWORK)
93
+ def build_tvm(context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()):
94
+ """Build the TVM framework."""
95
+ if not params:
96
+ params = {}
97
+ flags = utils.makeFlags((params["dbg"], "dbg"), (params["cmsisnn"], "cmsisnn"))
98
+ dbg = bool(params["dbg"])
99
+ cmsisnn = bool(params["cmsisnn"])
100
+ # FIXME: Try to use TVM dir outside of src dir to allow multiple versions/dbg etc!
101
+ # This should help: TVM_LIBRARY_PATH -> tvm.build_dir
102
+ tvmName = utils.makeDirName("tvm", flags=flags)
103
+ tvmSrcDir = context.cache["tvm.src_dir", ()] # params["patch"] does not affect the build
104
+ tvmBuildDir = context.environment.paths["deps"].path / "build" / tvmName
105
+ tvmLib = tvmBuildDir / "libtvm.so"
106
+ user_vars = context.environment.vars
107
+ if rebuild or not utils.is_populated(tvmBuildDir) or not tvmLib.is_file():
108
+ ninja = False
109
+ if "tvm.make_tool" in user_vars:
110
+ if user_vars["tvm.make_tool"] == "ninja":
111
+ ninja = True
112
+ utils.mkdirs(tvmBuildDir)
113
+ cfgFileSrc = Path(tvmSrcDir) / "cmake" / "config.cmake"
114
+ cfgFile = tvmBuildDir / "config.cmake"
115
+ llvmConfig = str(context.cache["llvm.install_dir"] / "bin" / "llvm-config")
116
+ llvmConfigEscaped = str(llvmConfig).replace("/", "\\/")
117
+ utils.copy(cfgFileSrc, cfgFile)
118
+ utils.exec(
119
+ "sed",
120
+ "-i",
121
+ "--",
122
+ r"s/USE_MICRO OFF/USE_MICRO ON/g",
123
+ str(cfgFile),
124
+ )
125
+ utils.exec(
126
+ "sed",
127
+ "-i",
128
+ "--",
129
+ r"s/USE_MICRO_STANDALONE_RUNTIME OFF/USE_MICRO_STANDALONE_RUNTIME ON/g",
130
+ str(cfgFile),
131
+ )
132
+ utils.exec(
133
+ "sed",
134
+ "-i",
135
+ "--",
136
+ r"s/USE_LLVM \(OFF\|ON\)/USE_LLVM " + llvmConfigEscaped + "/g",
137
+ str(cfgFile),
138
+ )
139
+ if cmsisnn:
140
+ utils.exec(
141
+ "sed",
142
+ "-i",
143
+ "--",
144
+ r"s/USE_CMSISNN \(OFF\|ON\)/USE_CMSISNN ON/g",
145
+ str(cfgFile),
146
+ )
147
+
148
+ utils.cmake(tvmSrcDir, cwd=tvmBuildDir, debug=dbg, use_ninja=ninja, live=verbose)
149
+ utils.make(cwd=tvmBuildDir, threads=threads, use_ninja=ninja, live=verbose)
150
+ context.cache["tvm.build_dir", flags] = tvmBuildDir
151
+ context.cache["tvm.lib", flags] = tvmLib
152
+
153
+
154
+ def _validate_tvm_extensions(context: MlonMcuContext, params=None):
155
+ return _validate_tvm_build(context, params=params) and context.environment.has_feature("disable_legalize")
156
+
157
+
158
+ @Tasks.provides(["tvm_extensions.src_dir", "tvm_extensions.wrapper"])
159
+ @Tasks.validate(_validate_tvm_extensions)
160
+ @Tasks.register(category=TaskType.FEATURE)
161
+ def clone_tvm_extensions(
162
+ context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
163
+ ):
164
+ """Clone the TVM extensions repository."""
165
+ extName = utils.makeDirName("tvm_extensions")
166
+ extSrcDir = context.environment.paths["deps"].path / "src" / extName
167
+ extWrapper = extSrcDir / "tvmc_wrapper.py"
168
+ if rebuild or not utils.is_populated(extSrcDir):
169
+ extRepo = context.environment.repos["tvm_extensions"]
170
+ utils.clone(extRepo.url, extSrcDir, branch=extRepo.ref, refresh=rebuild)
171
+ context.cache["tvm_extensions.src_dir"] = extSrcDir
172
+ context.cache["tvm_extensions.wrapper"] = extWrapper