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
mlonmcu/setup/setup.py ADDED
@@ -0,0 +1,285 @@
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 os
20
+ import shutil
21
+ import multiprocessing
22
+ from tqdm import tqdm
23
+
24
+ from mlonmcu.logging import get_logger
25
+ from mlonmcu.feature.type import FeatureType
26
+ from mlonmcu.feature.features import get_matching_features
27
+ from mlonmcu.config import filter_config, str2bool
28
+ from .tasks import get_task_factory
29
+ from .task import TaskGraph
30
+ from mlonmcu.utils import ask_user
31
+
32
+ logger = get_logger()
33
+
34
+
35
+ class Setup:
36
+ """MLonMCU dependency management interface."""
37
+
38
+ FEATURES = []
39
+
40
+ DEFAULTS = {
41
+ "print_outputs": False,
42
+ "num_threads": None,
43
+ }
44
+
45
+ REQUIRED = []
46
+ OPTIONAL = []
47
+
48
+ def __init__(self, features=None, config=None, context=None, tasks_factory=None):
49
+ if not tasks_factory:
50
+ tasks_factory = get_task_factory()
51
+ self.config = config if config else {}
52
+ self.features = self.process_features(features)
53
+ self.config = filter_config(self.config, "setup", self.DEFAULTS, self.OPTIONAL, self.REQUIRED)
54
+ self.context = context
55
+ self.tasks_factory = tasks_factory
56
+ self.num_threads = int(
57
+ self.config["num_threads"] if self.config["num_threads"] else multiprocessing.cpu_count()
58
+ )
59
+
60
+ @property
61
+ def verbose(self):
62
+ value = self.config["print_outputs"]
63
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
64
+
65
+ def clean_cache(self, interactive=True):
66
+ assert self.context is not None
67
+ deps_dir = self.context.environment.lookup_path("deps").path
68
+ cache_file = deps_dir / "cache.ini"
69
+ if cache_file.is_file():
70
+ print(f"The dependency cache file ({cache_file}) will be removed.")
71
+ if ask_user("Are your sure?", default=not interactive, interactive=interactive):
72
+ print(f"Removing {cache_file} ...")
73
+ os.remove(cache_file)
74
+
75
+ def clean_dependencies(self, interactive=True):
76
+ assert self.context is not None
77
+ self.clean_cache(interactive=interactive)
78
+ deps_dir = self.context.environment.lookup_path("deps").path
79
+ subdirs = ["src", "build", "install"]
80
+ print(f"All dependencies will be removed from {deps_dir}.")
81
+ if ask_user("Are your sure?", default=not interactive, interactive=interactive):
82
+ for subdir in subdirs:
83
+ full_path = deps_dir / subdir
84
+ print(f"Removing contents of {full_path} ...")
85
+ shutil.rmtree(full_path, ignore_errors=True)
86
+ full_path.mkdir(exist_ok=True)
87
+
88
+ def process_features(self, features):
89
+ if features is None:
90
+ return []
91
+ features = get_matching_features(features, FeatureType.SETUP)
92
+ for feature in features:
93
+ # Not need to list features explicitly
94
+ # assert (
95
+ # feature.name in self.FEATURES
96
+ # ), f"Incompatible feature: {feature.name}"
97
+ feature.add_setup_config(self.config)
98
+ return features
99
+
100
+ def _get_task_graph(self):
101
+ self.tasks_factory.reset_changes()
102
+ task_graph = TaskGraph(
103
+ self.tasks_factory.registry.keys(),
104
+ self.tasks_factory.dependencies,
105
+ self.tasks_factory.providers,
106
+ )
107
+ return task_graph
108
+
109
+ def get_dependency_order(self):
110
+ task_graph = self._get_task_graph()
111
+ V, E = task_graph.get_graph()
112
+ order = task_graph.get_order()
113
+ order_str = " -> ".join(order)
114
+ logger.debug("Determined dependency order: %s" % order_str)
115
+ return order
116
+
117
+ def setup_progress_bar(self, enabled):
118
+ if enabled:
119
+ pbar = tqdm(
120
+ total=len(self.tasks_factory.registry),
121
+ desc="Installing dependencies",
122
+ ncols=100,
123
+ bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}s]",
124
+ )
125
+ return pbar
126
+ else:
127
+ logger.info("Installing dependencies...")
128
+ return None
129
+
130
+ def write_cache_file(self):
131
+ logger.debug("Updating dependency cache")
132
+ cache_file = self.context.environment.paths["deps"].path / "cache.ini"
133
+ self.context.cache.write_to_file(cache_file)
134
+
135
+ def visualize(self, path, ordered=False):
136
+ task_graph = self._get_task_graph()
137
+ task_graph.export_dot(path)
138
+ logger.debug("Written task graph to file: %s" % path)
139
+
140
+ def invoke_single_task(self, name, progress=False, write_cache=True, rebuild=False):
141
+ assert name in self.tasks_factory.registry, f"Invalid task name: {name}"
142
+ func = self.tasks_factory.registry[name]
143
+ func(self.context, progress=progress, rebuild=rebuild, verbose=self.verbose, threads=self.num_threads)
144
+ if write_cache:
145
+ self.write_cache_file()
146
+
147
+ def install_dependencies(
148
+ self,
149
+ progress=False,
150
+ write_cache=True,
151
+ rebuild=False,
152
+ ):
153
+ assert self.context is not None
154
+ order = self.get_dependency_order()
155
+ pbar = self.setup_progress_bar(progress)
156
+ for task in order:
157
+ func = self.tasks_factory.registry[task]
158
+ func(self.context, progress=progress, rebuild=rebuild, verbose=self.verbose, threads=self.num_threads)
159
+ if pbar:
160
+ pbar.update(1)
161
+ if pbar:
162
+ pbar.close()
163
+ if write_cache:
164
+ self.write_cache_file()
165
+ logger.info("Finished installing dependencies")
166
+ return True
167
+
168
+ def generate_requirements(
169
+ self,
170
+ ):
171
+ from .gen_requirements import join_requirements
172
+ import os
173
+
174
+ requirements = join_requirements()
175
+ output_dir = os.path.join(self.context.environment.home, "requirements_addition.txt")
176
+
177
+ def feature_enabled_and_supported(obj, feature):
178
+ if getattr(obj, "enabled", True):
179
+ if getattr(obj, "name", None) == feature and getattr(obj, "supported", False):
180
+ return True
181
+ else:
182
+ enable_and_supported = False
183
+ for k, v in obj.__dict__.items():
184
+ if isinstance(v, list):
185
+ for i in v:
186
+ enable_and_supported = enable_and_supported or feature_enabled_and_supported(i, feature)
187
+ return enable_and_supported
188
+ else:
189
+ return False
190
+
191
+ with open(output_dir, "w") as f:
192
+ f.write(f"# AUTOGENERATED by 'mlonmcu setup -g' {os.linesep}")
193
+ config_pools = (
194
+ self.context.environment.frameworks
195
+ + self.context.environment.frontends
196
+ + self.context.environment.platforms
197
+ + self.context.environment.targets
198
+ )
199
+ for config in config_pools:
200
+ if "espidf" in config.name and config.enabled:
201
+ for d in requirements["espidf"][1]:
202
+ f.write(f"{d}{os.linesep}")
203
+ logger.info("add dependencies for espidf")
204
+ break
205
+ for config in config_pools:
206
+ if "zephyr" in config.name and config.enabled:
207
+ for d in requirements["zephyr"][1]:
208
+ f.write(f"{d}{os.linesep}")
209
+ logger.info("add dependencies for zephyr")
210
+ break
211
+ for config in config_pools:
212
+ if "tflm" in config.name and config.enabled:
213
+ for d in requirements["tflm"][1]:
214
+ f.write(f"{d}{os.linesep}")
215
+ logger.info("add dependencies for tflm")
216
+ break
217
+ for config in config_pools:
218
+ if "tflite" in config.name and config.enabled:
219
+ for d in requirements["tflite"][1]:
220
+ f.write(f"{d}{os.linesep}")
221
+ logger.info("add dependencies for tflite")
222
+ break
223
+ for config in config_pools:
224
+ if "onnx" in config.name and config.enabled:
225
+ for d in requirements["onnx"][1]:
226
+ f.write(f"{d}{os.linesep}")
227
+ logger.info("add dependencies for onnx")
228
+ break
229
+ for config in config_pools:
230
+ if "etiss" in config.name and config.enabled:
231
+ for d in requirements["etiss"][1]:
232
+ f.write(f"{d}{os.linesep}")
233
+ logger.info("add dependencies for etiss")
234
+ break
235
+ for config in config_pools:
236
+ if "gvsoc_pulp" in config.name and config.enabled:
237
+ for d in requirements["gvsoc_pulp"][1]:
238
+ f.write(f"{d}{os.linesep}")
239
+ logger.info("add dependencies for gvsoc_pulp")
240
+ break
241
+ for config in config_pools:
242
+ if "visualize" in config.name and config.enabled:
243
+ for d in requirements["visualize"][1]:
244
+ f.write(f"{d}{os.linesep}")
245
+ logger.info("add dependencies for visualize")
246
+ break
247
+ for config in config_pools:
248
+ if "microtvm" in config.name and config.enabled:
249
+ for d in requirements["microtvm"][1]:
250
+ f.write(f"{d}{os.linesep}")
251
+ logger.info("add dependencies for microtvm")
252
+ break
253
+ for config in config_pools:
254
+ if feature_enabled_and_supported(config, "moiopt"):
255
+ for d in requirements["moiopt"][1]:
256
+ f.write(f"{d}{os.linesep}")
257
+ logger.info("add dependencies for moiopt")
258
+ break
259
+ # for config in config_pools:
260
+ # if feature_enabled_and_supported(config, "relayviz"):
261
+ # # equirements for relay visualization
262
+ # for d in requirements['relayviz'][1]:
263
+ # f.write(f"{d}{os.linesep}")
264
+ # break
265
+ for config in config_pools:
266
+ if "tvm" in config.name and config.enabled:
267
+ for d in requirements["tvm"][1]:
268
+ f.write(f"{d}{os.linesep}")
269
+ logger.info("add dependencies for tvm")
270
+ break
271
+ for config in config_pools:
272
+ if "tvm" in config.name and feature_enabled_and_supported(config, "autotuned"):
273
+ for d in requirements["tvm-autotuning"][1]:
274
+ f.write(f"{d}{os.linesep}")
275
+ logger.info("add dependencies for tvm-autotuning")
276
+ break
277
+ for config in config_pools:
278
+ if "tf" in config.name and feature_enabled_and_supported(config, "visualize"):
279
+ # requirements for tvm tflite visualization
280
+ for d in requirements["visualize_tflite"][1]:
281
+ f.write(f"{d}{os.linesep}")
282
+ logger.info("add dependencies for tflite visualization")
283
+ break
284
+ logger.info("Finished generating requirements_addition.txt")
285
+ return True
mlonmcu/setup/task.py ADDED
@@ -0,0 +1,380 @@
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
+ """Definitions of a task registry used to automatically install dependencies."""
20
+
21
+ from functools import wraps
22
+ import itertools
23
+ from enum import Enum
24
+ import time
25
+ from typing import List, Tuple
26
+ import networkx as nx
27
+ from networkx.drawing.nx_agraph import write_dot
28
+ from tqdm import tqdm
29
+
30
+ from mlonmcu.logging import get_logger
31
+
32
+ logger = get_logger()
33
+
34
+
35
+ def get_combs(data) -> List[dict]:
36
+ """Utility which returns combinations of the input data.
37
+
38
+ Parameters
39
+ ----------
40
+ data : dict
41
+ Input dictionary
42
+
43
+ Returns
44
+ -------
45
+ combs : list
46
+ All combinations of the input data.
47
+
48
+ Examples
49
+ --------
50
+ >>> get_combs({"foo": [False, True], "bar": [5, 10]})
51
+ [{"foo": False, "bar": 5}, {"foo": False, "bar": 10}, {"foo": True, "bar": 5}, {"foo": True, "bar": 10}]
52
+ """
53
+ keys = list(data.keys())
54
+ values = list(data.values())
55
+ prod = list(itertools.product(*values))
56
+ if len(prod) == 1:
57
+ if len(prod[0]) == 0:
58
+ prod = []
59
+ combs = [dict(zip(keys, p)) for p in prod]
60
+ return combs
61
+
62
+
63
+ class TaskType(Enum):
64
+ """Enumeration for the task type."""
65
+
66
+ MISC = 0
67
+ FRAMEWORK = 1
68
+ BACKEND = 2
69
+ TOOLCHAIN = 3
70
+ TARGET = 4
71
+ FRONTEND = 5
72
+ OPT = 6
73
+ FEATURE = 7
74
+ PLATFORM = 8
75
+
76
+
77
+ class TaskGraph:
78
+ """Task graph object.
79
+
80
+ Attributes
81
+ ----------
82
+ names : list
83
+ list of task names in the graph
84
+ dependencies : dict
85
+ Dependencies between task artifacts
86
+ providers : dict
87
+ Providers for all the artifacts
88
+
89
+ Examples
90
+ -------
91
+ TODO
92
+ """
93
+
94
+ def __init__(self, names: List[str], dependencies: dict, providers: dict):
95
+ self.names = names
96
+ self.dependencies = dependencies
97
+ self.providers = providers
98
+
99
+ def get_graph(self) -> Tuple[list, list]:
100
+ """Get nodes and edges of the task graph.
101
+
102
+ Returns
103
+ -------
104
+ nodes : list
105
+ List of edges
106
+ edges : list
107
+ List of edge tuples.
108
+ """
109
+ nodes = list(self.names)
110
+ edges = []
111
+ for dest, deps in self.dependencies.items():
112
+ for dep in deps:
113
+ if dep not in self.providers.keys():
114
+ raise RuntimeError(f"Unable to resolve dependency '{dep}'")
115
+ src = self.providers[dep]
116
+ edge = (src, dest)
117
+ edges.append(edge)
118
+ # Remove duplicates
119
+ edges = list(dict.fromkeys(edges))
120
+ return nodes, edges
121
+
122
+ def get_order(self) -> list:
123
+ """Get execution order of tasks via topological sorting."""
124
+ nodes, edges = self.get_graph()
125
+ graph = nx.DiGraph(edges)
126
+ graph.add_nodes_from(nodes)
127
+ order = list(nx.topological_sort(graph))
128
+ return order
129
+
130
+ def export_dot(self, path):
131
+ """Visualize the task dependency graph."""
132
+ nodes, edges = self.get_graph()
133
+ graph = nx.DiGraph(edges)
134
+ graph.add_nodes_from(nodes)
135
+ # order = list(nx.topological_sort(graph))
136
+ # TODO: annotate with order
137
+ # TODO: also export order as extra graph
138
+ write_dot(graph, path)
139
+
140
+
141
+ class TaskFactory:
142
+ """Class which is used to register all available tasks and their annotations.
143
+
144
+ Attributes
145
+ ----------
146
+ registry : dict
147
+ Mapping of task names and their actual function
148
+ dependencies : dict
149
+ Mapping of task dependencies
150
+ providers : dict
151
+ Mapping of which task provides which artifacts
152
+ types : dict
153
+ Mapping of task types
154
+ validates : dict
155
+ Mapping of validation functions for the tasks
156
+ changed : list
157
+ List of tasks?artifacts which have changed recently
158
+ """
159
+
160
+ def __init__(self):
161
+ self.registry = {}
162
+ self.dependencies = {}
163
+ self.providers = {}
164
+ self.types = {}
165
+ self.params = {}
166
+ self.validates = {}
167
+ self.changed = [] # Main problem: per
168
+
169
+ def reset_changes(self):
170
+ """Reset all pending changes."""
171
+ self.changed = []
172
+
173
+ def needs(self, keys, force=True):
174
+ """Decorator which registers the artifacts a task needs to be processed."""
175
+
176
+ def real_decorator(function):
177
+ name = function.__name__
178
+ if name in self.dependencies:
179
+ self.dependencies[name].extend(keys)
180
+ else:
181
+ self.dependencies[name] = keys
182
+
183
+ @wraps(function)
184
+ def wrapper(*args, **kwargs):
185
+ # logger.debug("Checking inputs...")
186
+ if force:
187
+ context = args[0]
188
+ variables = context.cache._vars
189
+ for key in keys:
190
+ if key not in variables.keys() or variables[key] is None:
191
+ raise RuntimeError(f"Task '{name}' needs the value of '{key}' which is not set")
192
+ retval = function(*args, **kwargs)
193
+ return retval
194
+
195
+ return wrapper
196
+
197
+ return real_decorator
198
+
199
+ def optional(self, keys):
200
+ """Decorator for optional task requirements."""
201
+ return self.needs(keys, force=False)
202
+
203
+ # def optional(self, keys):
204
+ # def real_decorator(function):
205
+ # name = function.__name__
206
+ # if name in self.dependencies:
207
+ # self.dependencies[name].extend(keys)
208
+ # else:
209
+ # self.dependencies[name] = keys
210
+ # @wraps(function)
211
+ # def wrapper(*args, **kwargs):
212
+ # retval = function(*args, **kwargs)
213
+ # return retval
214
+ # return wrapper
215
+ # return real_decorator
216
+
217
+ def provides(self, keys):
218
+ """Decorator which registers what a task provides."""
219
+
220
+ def real_decorator(function):
221
+ name = function.__name__
222
+ for key in keys:
223
+ self.providers[key] = name
224
+
225
+ @wraps(function)
226
+ def wrapper(*args, **kwargs):
227
+ context = args[0]
228
+ for key in keys:
229
+ if key in context.cache._vars:
230
+ del context.cache._vars[key] # Unset the value before calling function
231
+ retval = function(*args, **kwargs)
232
+ if retval is not False:
233
+ # logger.debug("Checking outputs...")
234
+ variables = context.cache._vars
235
+ for key in keys:
236
+ if key not in variables.keys() or variables[key] is None:
237
+ raise RuntimeError(f"Task '{name}' did not set the value of '{key}'")
238
+ return retval
239
+
240
+ self.registry[name] = wrapper
241
+ return wrapper
242
+
243
+ return real_decorator
244
+
245
+ def param(self, flag, options):
246
+ """Decorator which registers available task parameters."""
247
+ if not isinstance(options, list):
248
+ options = [options]
249
+
250
+ def real_decorator(function):
251
+ name = function.__name__
252
+ if name in self.params:
253
+ self.params[name][flag] = options
254
+ else:
255
+ self.params[name] = {flag: options}
256
+
257
+ @wraps(function)
258
+ def wrapper(*args, **kwargs):
259
+ retval = function(*args, **kwargs)
260
+ return retval
261
+
262
+ return wrapper
263
+
264
+ return real_decorator
265
+
266
+ def validate(self, func):
267
+ """Decorator which registers validattion functions for a task."""
268
+
269
+ def real_decorator(function):
270
+ name = function.__name__
271
+ self.validates[name] = func
272
+ return function
273
+
274
+ return real_decorator
275
+
276
+ def register(self, category=TaskType.MISC):
277
+ """Decorator which actually registers a task in the registry."""
278
+
279
+ def real_decorator(function):
280
+ name = function.__name__
281
+
282
+ @wraps(function)
283
+ def wrapper(*args, rebuild=False, progress=False, **kwargs):
284
+ combs = get_combs(self.params[name])
285
+
286
+ def get_valid_combs(combs):
287
+ ret = []
288
+ for comb in combs:
289
+ if name in self.validates:
290
+ check = self.validates[name](args[0], params=comb)
291
+ if not check:
292
+ continue
293
+ ret.append(comb)
294
+ return ret
295
+
296
+ combs = get_valid_combs(combs)
297
+
298
+ def process(name_, params=None, rebuild=False):
299
+ if not params:
300
+ params = []
301
+ rebuild = rebuild
302
+ if name in self.dependencies:
303
+ for dep in self.dependencies[name]:
304
+ if dep in self.changed:
305
+ rebuild = True
306
+ break
307
+ retval = function(*args, params=params, rebuild=rebuild, **kwargs)
308
+ if retval:
309
+ keys = [key for key, provider in self.providers.items() if provider == name]
310
+ for key in keys:
311
+ if key not in self.changed:
312
+ self.changed.append(key)
313
+ # logger.debug("Processed task:", function.__name__)
314
+ return retval
315
+
316
+ if progress:
317
+ pbar = tqdm(
318
+ total=max(len(combs), 1),
319
+ desc="Processing",
320
+ ncols=100,
321
+ bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}s]",
322
+ leave=None,
323
+ )
324
+ else:
325
+ pbar = None
326
+ if len(combs) == 0:
327
+ if pbar:
328
+ pbar.set_description(f"Processing: {name}")
329
+ else:
330
+ logger.info("Processing task: %s", name)
331
+ time.sleep(0.1)
332
+ check = True
333
+ if name in self.validates:
334
+ check = self.validates[name](args[0], params={})
335
+ if check:
336
+ start = time.time()
337
+ retval = process(name, rebuild=rebuild)
338
+ end = time.time()
339
+ diff = end - start
340
+ minutes = int(diff // 60)
341
+ seconds = int(diff % 60)
342
+ duration_str = f"{seconds}s" if minutes == 0 else f"{minutes}m{seconds}s"
343
+ if not pbar:
344
+ logger.debug("-> Done (%s)", duration_str)
345
+ # TODO: move this to helper func
346
+ else:
347
+ logger.debug("-> Skipped")
348
+ retval = False
349
+ if pbar:
350
+ pbar.update(1)
351
+ else:
352
+ for comb in combs: # TODO process in parallel?
353
+ extended_name = name + str(comb)
354
+ if pbar:
355
+ pbar.set_description(f"Processing - {extended_name}")
356
+ else:
357
+ logger.info("Processing task: %s", extended_name)
358
+ time.sleep(0.1)
359
+ start = time.time()
360
+ retval = process(extended_name, params=comb, rebuild=rebuild)
361
+ end = time.time()
362
+ diff = end - start
363
+ minutes = int(diff // 60)
364
+ seconds = int(diff % 60)
365
+ duration_str = f"{seconds}s" if minutes == 0 else f"{minutes}m{seconds}s"
366
+ if not pbar:
367
+ logger.debug("-> Done (%s)", duration_str)
368
+ # TODO: move this to helper func
369
+ else:
370
+ pbar.update(1)
371
+ if pbar:
372
+ pbar.close()
373
+ return retval
374
+
375
+ self.registry[name] = wrapper
376
+ self.types[name] = category
377
+ self.params[name] = {}
378
+ return wrapper
379
+
380
+ return real_decorator