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,189 @@
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 re
20
+ import os
21
+
22
+ from mlonmcu.target.target import Target
23
+ from mlonmcu.target.metrics import Metrics
24
+
25
+ from mlonmcu.logging import get_logger
26
+
27
+ from .microtvm_zephyr_target import ZephyrMicroTvmPlatformTarget
28
+ from .microtvm_arduino_target import ArduinoMicroTvmPlatformTarget
29
+ from .microtvm_espidf_target import EspidfMicroTvmPlatformTarget
30
+ from .microtvm_host_target import HostMicroTvmPlatformTarget
31
+ from .microtvm_etissvp_target import EtissvpMicroTvmPlatformTarget
32
+ from .microtvm_spike_target import SpikeMicroTvmPlatformTarget
33
+
34
+ logger = get_logger()
35
+
36
+
37
+ def name2template(name):
38
+ return name.replace("microtvm_", "")
39
+
40
+
41
+ MICROTVM_PLATFORM_TARGET_REGISTRY = {}
42
+
43
+
44
+ def register_microtvm_platform_target(target_name, t, override=False):
45
+ global MICROTVM_PLATFORM_TARGET_REGISTRY
46
+
47
+ if target_name in MICROTVM_PLATFORM_TARGET_REGISTRY and not override:
48
+ raise RuntimeError(f"MicroTVM platform target {target_name} is already registered")
49
+ MICROTVM_PLATFORM_TARGET_REGISTRY[target_name] = t
50
+
51
+
52
+ def get_microtvm_platform_targets():
53
+ return MICROTVM_PLATFORM_TARGET_REGISTRY
54
+
55
+
56
+ register_microtvm_platform_target("microtvm_zephyr", ZephyrMicroTvmPlatformTarget)
57
+ register_microtvm_platform_target("microtvm_arduino", ArduinoMicroTvmPlatformTarget)
58
+ register_microtvm_platform_target("microtvm_host", HostMicroTvmPlatformTarget)
59
+ register_microtvm_platform_target("microtvm_etissvp", EtissvpMicroTvmPlatformTarget)
60
+ register_microtvm_platform_target("microtvm_espidf", EspidfMicroTvmPlatformTarget)
61
+ register_microtvm_platform_target("microtvm_spike", SpikeMicroTvmPlatformTarget)
62
+
63
+
64
+ def create_microtvm_platform_target(name, platform, base=Target):
65
+ class MicroTvmPlatformTarget(base):
66
+ FEATURES = base.FEATURES + []
67
+
68
+ DEFAULTS = {
69
+ **base.DEFAULTS,
70
+ "timeout_sec": 0, # disabled
71
+ }
72
+ REQUIRED = base.REQUIRED + []
73
+
74
+ def __init__(self, features=None, config=None):
75
+ super().__init__(name=name, features=features, config=config)
76
+ self.platform = platform
77
+ self.template = name2template(name)
78
+
79
+ @property
80
+ def timeout_sec(self):
81
+ return int(self.config["timeout_sec"])
82
+
83
+ @property
84
+ def repeat(self):
85
+ return None # This is handled at the platform level
86
+
87
+ def exec(self, program, *args, cwd=os.getcwd(), **kwargs):
88
+ """Use target to execute a executable with given arguments"""
89
+ if len(args) > 0:
90
+ raise RuntimeError("Program arguments are not supported for real hardware devices")
91
+
92
+ assert self.platform is not None, "TVM targets need a platform to execute programs"
93
+
94
+ if self.timeout_sec > 0:
95
+ raise NotImplementedError
96
+
97
+ ret = self.platform.run(program, self)
98
+ return ret
99
+
100
+ def parse_stdout(self, out):
101
+ mean_ms = None
102
+ median_ms = None
103
+ max_ms = None
104
+ min_ms = None
105
+ std_ms = None
106
+ found = False
107
+ for line in out.split("\n"):
108
+ if found:
109
+ match = re.compile(r"\s+(\d*\.\d+)\s+(\d*\.\d+)\s+(\d*\.\d+)\s+(\d*\.\d+)\s+(\d*\.\d+)").findall(
110
+ line
111
+ )
112
+ assert len(match) == 1
113
+ groups = match[0]
114
+ mean_ms, median_ms, max_ms, min_ms, std_ms = (
115
+ float(groups[0]),
116
+ float(groups[1]),
117
+ float(groups[2]),
118
+ float(groups[3]),
119
+ float(groups[4]),
120
+ )
121
+ break
122
+ if re.compile(r"\s+mean \(ms\)\s+median \(ms\)\s+max \(ms\)\s+min \(ms\)\s+std \(ms\)").match(line):
123
+ found = True
124
+ return mean_ms, median_ms, max_ms, min_ms, std_ms
125
+
126
+ def get_metrics(self, elf, directory, handle_exit=None):
127
+ if self.print_outputs:
128
+ out = self.exec(elf, cwd=directory, live=True, handle_exit=handle_exit)
129
+ else:
130
+ out = self.exec(
131
+ elf,
132
+ cwd=directory,
133
+ live=False,
134
+ print_func=lambda *args, **kwargs: None,
135
+ handle_exit=handle_exit,
136
+ )
137
+ mean_ms, _, _, _, _ = self.parse_stdout(out)
138
+
139
+ metrics = Metrics()
140
+ time_s = mean_ms / 1e3 if mean_ms is not None else mean_ms
141
+ if time_s:
142
+ metrics.add("Runtime [s]", time_s)
143
+
144
+ if self.platform.profile:
145
+ print("out", out)
146
+ headers = None
147
+ skip = False
148
+ lines = out.split("\n")
149
+ extracted = []
150
+
151
+ def extract_cols(line):
152
+ x = re.compile(r"(([^\s\[\]]+)(\s\S+)*)(\[.*\])?").findall(line)
153
+ return [y[0] for y in x]
154
+
155
+ for line in lines:
156
+ print("line", line)
157
+ if skip:
158
+ skip = False
159
+ continue
160
+ if headers is None:
161
+ if "Name" in line:
162
+ headers = extract_cols(line)
163
+ print("headers", headers)
164
+ skip = True
165
+ continue
166
+ else:
167
+ if len(line.strip()) == 0:
168
+ break
169
+ cols = extract_cols(line)
170
+ data = {headers[i]: val for i, val in enumerate(cols)}
171
+ extracted.append(data)
172
+ if "Total_time" in line:
173
+ break
174
+ assert len(extracted) > 0
175
+ metrics = {"default": metrics}
176
+ for item in extracted:
177
+ if item["Node Name"] == "Total_time":
178
+ metrics["default"].add("Runtime [s]", float(item["Time(us)"]) / 1e6)
179
+ else:
180
+ metrics_ = Metrics()
181
+ metrics_.add("Runtime [s]", float(item["Time(us)"]) / 1e6)
182
+ metrics[item["Node Name"]] = metrics_
183
+
184
+ return metrics, out, []
185
+
186
+ def get_arch(self):
187
+ return "unkwown"
188
+
189
+ return MicroTvmPlatformTarget
@@ -0,0 +1,55 @@
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
+
20
+ from mlonmcu.target.target import Target
21
+
22
+ from mlonmcu.logging import get_logger
23
+
24
+ logger = get_logger()
25
+
26
+
27
+ class TemplateMicroTvmPlatformTarget(Target):
28
+ FEATURES = Target.FEATURES + []
29
+
30
+ DEFAULTS = {
31
+ **Target.DEFAULTS,
32
+ }
33
+ REQUIRED = Target.REQUIRED + ["tvm.build_dir"]
34
+
35
+ def __init__(self, name=None, features=None, config=None):
36
+ super().__init__(name=name, features=features, config=config)
37
+ self.template_path = None
38
+ self.option_names = []
39
+
40
+ def get_project_options(self):
41
+ def _bool_helper(x):
42
+ return str(x).lower() if isinstance(x, bool) else x
43
+
44
+ def _filter_none(x):
45
+ return {key: value for key, value in x.items() if value is not None}
46
+
47
+ return _filter_none(
48
+ {
49
+ key: _bool_helper(getattr(self, key) if hasattr(self, key) else self.config.get(key, None))
50
+ for key in self.option_names
51
+ }
52
+ )
53
+
54
+ def update_environment(self, env):
55
+ pass
@@ -0,0 +1,91 @@
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
+ from pathlib import Path
20
+
21
+ from mlonmcu.target.target import Target
22
+
23
+ from mlonmcu.logging import get_logger
24
+ from .microtvm_template_target import TemplateMicroTvmPlatformTarget
25
+
26
+ logger = get_logger()
27
+
28
+
29
+ class ZephyrMicroTvmPlatformTarget(TemplateMicroTvmPlatformTarget):
30
+ FEATURES = Target.FEATURES + []
31
+
32
+ DEFAULTS = {
33
+ **Target.DEFAULTS,
34
+ "extra_files_tar": None,
35
+ "project_type": "host_driven",
36
+ "zephyr_board": "",
37
+ # "zephyr_base": "?",
38
+ # "west_cmd": "?",
39
+ "verbose": False,
40
+ "warning_as_error": True,
41
+ "compile_definitions": "",
42
+ # "config_main_stack_size": None,
43
+ "config_main_stack_size": "16384",
44
+ "gdbserver_port": None,
45
+ "nrfjprog_snr": None,
46
+ "openocd_serial": None,
47
+ "port": None, # Workaround to overwrite esptool detection
48
+ }
49
+ REQUIRED = Target.REQUIRED + ["zephyr.install_dir", "zephyr.sdk_dir"]
50
+
51
+ def __init__(self, name=None, features=None, config=None):
52
+ super().__init__(name=name, features=features, config=config)
53
+ self.template_path = None
54
+ self.option_names = [
55
+ "extra_files_tar",
56
+ "project_type",
57
+ "zephyr_board",
58
+ # "verbose",
59
+ "warning_as_error",
60
+ "compile_definitions",
61
+ "config_main_stack_size",
62
+ "gdbserver_port",
63
+ "nrfjprog_snr",
64
+ "openocd_serial",
65
+ ]
66
+ # self.platform = platform
67
+ # self.template = name2template(name)
68
+
69
+ @property
70
+ def zephyr_install_dir(self):
71
+ return Path(self.config["zephyr.install_dir"])
72
+
73
+ @property
74
+ def port(self):
75
+ return self.config["port"]
76
+
77
+ @property
78
+ def zephyr_sdk_dir(self):
79
+ return Path(self.config["zephyr.sdk_dir"])
80
+
81
+ def get_project_options(self):
82
+ ret = super().get_project_options()
83
+ ret.update({"zephyr_base": self.zephyr_install_dir / "zephyr"})
84
+ return ret
85
+
86
+ def update_environment(self, env):
87
+ super().update_environment(env)
88
+ env["ZEPHYR_BASE"] = str(self.zephyr_install_dir / "zephyr")
89
+ env["ZEPHYR_SDK_INSTALL_DIR"] = str(self.zephyr_sdk_dir)
90
+ if self.port:
91
+ env["ESPTOOL_PORT"] = self.port
@@ -0,0 +1,25 @@
1
+ #
2
+ # Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
3
+ #
4
+ # This file is part of MLonMCU.
5
+ # See https://github.com/tum-ei-eda/mlonmcu.git for further info.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ """MLonMCU MLIF platform"""
20
+
21
+ # pylint: disable=wildcard-import, redefined-builtin
22
+
23
+ from .mlif import MlifPlatform
24
+
25
+ __all__ = ["MlifPlatform"]
@@ -0,0 +1,300 @@
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
+ """MLIF Platform"""
20
+ import tempfile
21
+
22
+ from pathlib import Path
23
+
24
+ from mlonmcu.config import str2bool
25
+ from mlonmcu.setup import utils # TODO: Move one level up?
26
+ from mlonmcu.artifact import Artifact, ArtifactFormat
27
+ from mlonmcu.logging import get_logger
28
+ from mlonmcu.target import get_targets
29
+ from mlonmcu.target.target import Target
30
+ from mlonmcu.models.utils import get_data_source
31
+
32
+ from ..platform import CompilePlatform, TargetPlatform
33
+ from .mlif_target import get_mlif_platform_targets, create_mlif_platform_target
34
+
35
+ logger = get_logger()
36
+
37
+
38
+ class MlifPlatform(CompilePlatform, TargetPlatform):
39
+ """Model Library Interface Platform class."""
40
+
41
+ FEATURES = (
42
+ CompilePlatform.FEATURES
43
+ + TargetPlatform.FEATURES
44
+ + [
45
+ "validate",
46
+ "muriscvnn",
47
+ "cmsisnn",
48
+ "muriscvnnbyoc",
49
+ "cmsisnnbyoc",
50
+ "vext",
51
+ "pext",
52
+ "arm_mvei",
53
+ "arm_dsp",
54
+ "auto_vectorize",
55
+ "benchmark",
56
+ "xpulp",
57
+ ] # TODO: allow Feature-Features with automatic resolution of initialization order
58
+ )
59
+
60
+ DEFAULTS = {
61
+ **CompilePlatform.DEFAULTS,
62
+ **TargetPlatform.DEFAULTS,
63
+ "ignore_data": True,
64
+ "fail_on_error": False, # Prefer to add acolum with validation results instead of raising a RuntimeError
65
+ "model_support_dir": None,
66
+ "toolchain": "gcc",
67
+ "prebuild_lib_path": None,
68
+ "optimize": None, # values: 0,1,2,3,s
69
+ "input_data_path": None,
70
+ "output_data_path": None,
71
+ "mem_only": False,
72
+ }
73
+
74
+ REQUIRED = ["mlif.src_dir"]
75
+ OPTIONAL = ["llvm.install_dir"]
76
+
77
+ def __init__(self, features=None, config=None):
78
+ super().__init__(
79
+ "mlif",
80
+ features=features,
81
+ config=config,
82
+ )
83
+ self.tempdir = None
84
+ self.build_dir = None
85
+ self.goal = "generic_mlif"
86
+
87
+ def gen_data_artifact(self):
88
+ in_paths = self.input_data_path
89
+ if not isinstance(in_paths, list):
90
+ in_paths = [in_paths]
91
+ in_paths_new = []
92
+ for in_path in in_paths:
93
+ if in_path.is_file():
94
+ raise NotImplementedError
95
+ elif in_path.is_dir():
96
+ in_paths_new.extend([f for f in Path(in_path).iterdir() if f.is_file()])
97
+ else:
98
+ logger.warning("TODO")
99
+ return None
100
+ in_paths = in_paths_new
101
+ out_paths = self.output_data_path
102
+ if not isinstance(out_paths, list):
103
+ out_paths = [out_paths]
104
+ out_paths_new = []
105
+ for out_path in out_paths:
106
+ if out_path.is_file():
107
+ raise NotImplementedError
108
+ elif out_path.is_dir():
109
+ out_paths_new.extend([f for f in Path(out_path).iterdir() if f.is_file()])
110
+ else:
111
+ logger.warning("TODO")
112
+ return None
113
+ out_paths = out_paths_new
114
+ if len(in_paths) == 0 or len(out_paths) == 0:
115
+ logger.warning("TODO")
116
+ return None
117
+ data_src = get_data_source(in_paths, out_paths)
118
+ return Artifact("data.c", content=data_src, fmt=ArtifactFormat.SOURCE)
119
+
120
+ def init_directory(self, path=None, context=None):
121
+ if self.build_dir is not None:
122
+ self.build_dir.mkdir(exist_ok=True)
123
+ logger.debug("Build directory already initialized")
124
+ return
125
+ dir_name = self.name
126
+ if path is not None:
127
+ self.build_dir = Path(path)
128
+ elif self.config["build_dir"]:
129
+ self.build_dir = Path(self.config["build_dir"])
130
+ else:
131
+ if context:
132
+ assert "temp" in context.environment.paths
133
+ self.build_dir = (
134
+ context.environment.paths["temp"].path / dir_name
135
+ ) # TODO: Need to lock this for parallel builds
136
+ else:
137
+ logger.debug(
138
+ "Creating temporary directory because no context was available "
139
+ "and 'mlif.build_dir' was not supplied"
140
+ )
141
+ self.tempdir = tempfile.TemporaryDirectory()
142
+ self.build_dir = Path(self.tempdir.name) / dir_name
143
+ logger.info("Temporary build directory: %s", self.build_dir)
144
+ self.build_dir.mkdir(exist_ok=True)
145
+
146
+ def create_target(self, name):
147
+ assert name in self.get_supported_targets(), f"{name} is not a valid MLIF target"
148
+ targets = get_targets()
149
+ if name in targets:
150
+ base = targets[name]
151
+ else:
152
+ base = Target
153
+ return create_mlif_platform_target(name, self, base=base)
154
+
155
+ @property
156
+ def mlif_dir(self):
157
+ return Path(self.config["mlif.src_dir"])
158
+
159
+ @property
160
+ def llvm_dir(self):
161
+ return self.config["llvm.install_dir"]
162
+
163
+ @property
164
+ def ignore_data(self):
165
+ value = self.config["ignore_data"]
166
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
167
+
168
+ @property
169
+ def fail_on_error(self):
170
+ value = self.config["fail_on_error"]
171
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
172
+
173
+ @property
174
+ def validate_outputs(self):
175
+ return not self.ignore_data
176
+
177
+ @property
178
+ def toolchain(self):
179
+ return str(self.config["toolchain"])
180
+
181
+ @property
182
+ def model_support_dir(self):
183
+ return self.config["model_support_dir"]
184
+
185
+ @property
186
+ def prebuild_lib_dir(self):
187
+ return self.config["prebuild_lib_dir"]
188
+
189
+ @property
190
+ def optimize(self):
191
+ return self.config["optimize"]
192
+
193
+ @property
194
+ def input_data_path(self):
195
+ return self.config["input_data_path"]
196
+
197
+ @property
198
+ def output_data_path(self):
199
+ return self.config["output_data_path"]
200
+
201
+ @property
202
+ def mem_only(self):
203
+ value = self.config["mem_only"]
204
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
205
+
206
+ def get_supported_targets(self):
207
+ target_names = get_mlif_platform_targets()
208
+ return target_names
209
+
210
+ def close(self):
211
+ if self.tempdir:
212
+ self.tempdir.cleanup()
213
+
214
+ def get_common_cmake_args(self):
215
+ args = []
216
+ args.append(f"-DTOOLCHAIN={self.toolchain}")
217
+ if self.toolchain == "llvm" and self.llvm_dir is None:
218
+ raise RuntimeError("Missing config variable: llvm.install_dir")
219
+ else:
220
+ args.append(f"-DLLVM_DIR={self.llvm_dir}")
221
+ if self.optimize:
222
+ args.append(f"-DOPTIMIZE={self.optimize}")
223
+ return args
224
+
225
+ def prepare(self):
226
+ self.init_directory()
227
+
228
+ def configure(self, target, src, _model):
229
+ del target
230
+ if not isinstance(src, Path):
231
+ src = Path(src)
232
+ cmakeArgs = []
233
+ definitions = self.definitions
234
+ if self.mem_only:
235
+ definitions["QUIET"] = True
236
+ for key, value in definitions.items():
237
+ if isinstance(value, bool):
238
+ value = "ON" if value else "OFF"
239
+ cmakeArgs.append(f"-D{key}={value}")
240
+ cmakeArgs.extend(self.get_common_cmake_args())
241
+ cmakeArgs.append("-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON") # TODO for debug, should be removed
242
+ if self.model_support_dir:
243
+ cmakeArgs.append(f"-DMODEL_SUPPORT_DIR={self.model_support_dir}")
244
+ else:
245
+ pass
246
+ if src.is_file():
247
+ src = src.parent # TODO deal with directories or files?
248
+ if src.is_dir():
249
+ cmakeArgs.append("-DSRC_DIR=" + str(src))
250
+ else:
251
+ raise RuntimeError("Unable to find sources!")
252
+ if self.ignore_data:
253
+ cmakeArgs.append("-DDATA_SRC=")
254
+ artifacts = []
255
+ else:
256
+ data_artifact = self.gen_data_artifact()
257
+ data_file = self.build_dir / data_artifact.name
258
+ data_artifact.export(data_file)
259
+ cmakeArgs.append("-DDATA_SRC=" + str(data_file))
260
+ artifacts = [data_artifact]
261
+ utils.mkdirs(self.build_dir)
262
+ out = utils.cmake(
263
+ self.mlif_dir,
264
+ *cmakeArgs,
265
+ cwd=self.build_dir,
266
+ debug=self.debug,
267
+ live=self.print_outputs,
268
+ )
269
+ return out, artifacts
270
+
271
+ def compile(self, target, src=None, model=None, data_file=None):
272
+ out = ""
273
+ if src:
274
+ configure_out, artifacts = self.configure(target, src, model)
275
+ out += configure_out
276
+ out += utils.make(
277
+ self.goal,
278
+ cwd=self.build_dir,
279
+ threads=self.num_threads,
280
+ live=self.print_outputs,
281
+ )
282
+ return out, artifacts
283
+
284
+ def generate_elf(self, src, target, model=None):
285
+ out, artifacts = self.compile(target, src=src, model=model)
286
+ elf_file = self.build_dir / "bin" / "generic_mlif"
287
+ # TODO: just use path instead of raw data?
288
+ with open(elf_file, "rb") as handle:
289
+ data = handle.read()
290
+ artifact = Artifact("generic_mlif", raw=data, fmt=ArtifactFormat.RAW)
291
+ artifacts.insert(0, artifact) # First artifact should be the ELF
292
+ metrics = self.get_metrics(elf_file)
293
+ content = metrics.to_csv(include_optional=True) # TODO: store df instead?
294
+ metrics_artifact = Artifact("metrics.csv", content=content, fmt=ArtifactFormat.TEXT)
295
+ artifacts.append(metrics_artifact)
296
+ stdout_artifact = Artifact(
297
+ "mlif_out.log", content=out, fmt=ArtifactFormat.TEXT
298
+ ) # TODO: rename to tvmaot_out.log?
299
+ artifacts.append(stdout_artifact)
300
+ self.artifacts = {"default": artifacts}