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,429 @@
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
+ """TVM Platform"""
20
+
21
+ import tempfile
22
+ import concurrent
23
+ from pathlib import Path
24
+
25
+ from mlonmcu.setup import utils
26
+ from mlonmcu.logging import get_logger
27
+ from mlonmcu.artifact import Artifact, ArtifactFormat
28
+ from mlonmcu.target import get_targets
29
+ from mlonmcu.target.target import Target
30
+ from mlonmcu.config import str2bool
31
+ from mlonmcu.flow.tvm.backend.tvmc_utils import (
32
+ get_bench_tvmc_args,
33
+ get_data_tvmc_args,
34
+ get_rpc_tvmc_args,
35
+ get_target_tvmc_args,
36
+ )
37
+ from mlonmcu.flow.tvm.backend.python_utils import prepare_python_environment
38
+ from mlonmcu.flow.tvm.backend.tuner import TVMTuner
39
+
40
+ from ..platform import TargetPlatform, BuildPlatform, TunePlatform
41
+ from .tvm_target import create_tvm_platform_target
42
+ from .tvm_backend import create_tvm_platform_backend, get_tvm_platform_backends
43
+
44
+ logger = get_logger()
45
+
46
+
47
+ class TvmPlatform(BuildPlatform, TargetPlatform, TunePlatform):
48
+ """TVM Platform class."""
49
+
50
+ FEATURES = TargetPlatform.FEATURES + ["benchmark", "tvm_rpc", "autotune", "tvm_profile"] # TODO: validate?
51
+
52
+ DEFAULTS = {
53
+ **TargetPlatform.DEFAULTS,
54
+ "project_template": None,
55
+ "project_dir": None,
56
+ "fill_mode": "random",
57
+ "ins_file": None,
58
+ "outs_file": None,
59
+ "print_top": False,
60
+ "profile": False,
61
+ "repeat": 1,
62
+ "number": 1,
63
+ "aggregate": "none", # Allowed: avg, max, min, none, all
64
+ "total_time": False,
65
+ "use_rpc": False,
66
+ "rpc_key": None,
67
+ "rpc_hostname": None,
68
+ "rpc_port": None,
69
+ "tvmc_extra_args": [],
70
+ "tvmc_custom_script": None,
71
+ "experimental_tvmc_tune_tasks": False,
72
+ "experimental_tvmc_tune_visualize": False,
73
+ **{("autotuning_" + key): value for key, value in TVMTuner.DEFAULTS.items()},
74
+ }
75
+
76
+ REQUIRED = ["tvm.build_dir", "tvm.pythonpath", "tvm.configs_dir"]
77
+
78
+ def __init__(self, features=None, config=None):
79
+ super().__init__(
80
+ "tvm", # Actually: tvmllvm
81
+ features=features,
82
+ config=config,
83
+ )
84
+ self.tempdir = None
85
+ self.project_name = "app"
86
+ self.project_dir = None
87
+
88
+ def create_backend(self, name):
89
+ supported = self.get_supported_backends()
90
+ assert name in supported, f"{name} is not a valid TVM platform backend"
91
+ base = supported[name]
92
+ return create_tvm_platform_backend(name, self, base=base)
93
+
94
+ @property
95
+ def fill_mode(self):
96
+ return self.config["fill_mode"]
97
+
98
+ @property
99
+ def ins_file(self):
100
+ return self.config["ins_file"]
101
+
102
+ @property
103
+ def outs_file(self):
104
+ return self.config["outs_file"]
105
+
106
+ @property
107
+ def print_top(self):
108
+ return self.config["print_top"]
109
+
110
+ @property
111
+ def profile(self):
112
+ value = self.config["profile"]
113
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
114
+
115
+ @property
116
+ def repeat(self):
117
+ return self.config["repeat"]
118
+
119
+ @property
120
+ def number(self):
121
+ return self.config["number"]
122
+
123
+ @property
124
+ def aggregate(self):
125
+ value = self.config["aggregate"]
126
+ assert value in ["avg", "all", "max", "min", "none"]
127
+ return value
128
+
129
+ @property
130
+ def total_time(self):
131
+ value = self.config["total_time"]
132
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
133
+
134
+ @property
135
+ def use_rpc(self):
136
+ value = self.config["use_rpc"]
137
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
138
+
139
+ @property
140
+ def rpc_key(self):
141
+ return self.config["rpc_key"]
142
+
143
+ @property
144
+ def rpc_hostname(self):
145
+ return self.config["rpc_hostname"]
146
+
147
+ @property
148
+ def rpc_port(self):
149
+ return self.config["rpc_port"]
150
+
151
+ @property
152
+ def tvmc_extra_args(self):
153
+ return self.config["tvmc_extra_args"]
154
+
155
+ @property
156
+ def tvmc_custom_script(self):
157
+ return self.config["tvmc_custom_script"]
158
+
159
+ @property
160
+ def tvm_pythonpath(self):
161
+ return self.config["tvm.pythonpath"]
162
+
163
+ @property
164
+ def tvm_build_dir(self):
165
+ return self.config["tvm.build_dir"]
166
+
167
+ @property
168
+ def tvm_configs_dir(self):
169
+ return self.config["tvm.configs_dir"]
170
+
171
+ @property
172
+ def experimental_tvmc_tune_tasks(self):
173
+ value = self.config["experimental_tvmc_tune_tasks"]
174
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
175
+
176
+ @property
177
+ def experimental_tvmc_tune_visualize(self):
178
+ value = self.config["experimental_tvmc_tune_visualize"]
179
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
180
+
181
+ def init_directory(self, path=None, context=None):
182
+ if self.project_dir is not None:
183
+ self.project_dir.mkdir(exist_ok=True)
184
+ logger.debug("Project directory already initialized")
185
+ return
186
+ dir_name = self.name
187
+ if path is not None:
188
+ self.project_dir = Path(path)
189
+ elif self.config["project_dir"] is not None:
190
+ self.project_dir = Path(self.config["project_dir"])
191
+ else:
192
+ if context:
193
+ assert "temp" in context.environment.paths
194
+ self.project_dir = (
195
+ context.environment.paths["temp"].path / dir_name
196
+ ) # TODO: Need to lock this for parallel builds
197
+ else:
198
+ logger.debug(
199
+ "Creating temporary directory because no context was available "
200
+ "and 'espidf.project_dir' was not supplied"
201
+ )
202
+ self.tempdir = tempfile.TemporaryDirectory()
203
+ self.project_dir = Path(self.tempdir.name) / dir_name
204
+ logger.debug("Temporary project directory: %s", self.project_dir)
205
+ self.project_dir.mkdir(exist_ok=True)
206
+
207
+ def get_supported_backends(self):
208
+ backend_names = get_tvm_platform_backends()
209
+ return backend_names
210
+
211
+ def get_supported_targets(self):
212
+ # TODO: get this via tvmc run --help
213
+ target_names = ["cpu", "cuda", "cl", "metal", "vulkan", "rocm", "micro"]
214
+
215
+ skip_names = ["micro"] # Use microtvm platform instead
216
+
217
+ return [f"tvm_{name}" for name in target_names if name not in skip_names]
218
+
219
+ def create_target(self, name):
220
+ assert name in self.get_supported_targets(), f"{name} is not a valid TVM device"
221
+ targets = get_targets()
222
+ if name in targets:
223
+ base = targets[name]
224
+ else:
225
+ base = Target
226
+ return create_tvm_platform_target(name, self, base=base)
227
+
228
+ def close(self):
229
+ if self.tempdir:
230
+ self.tempdir.cleanup()
231
+
232
+ def get_tvmc_run_args(self, path, device):
233
+ return [
234
+ path,
235
+ *["--device", device],
236
+ *get_data_tvmc_args(
237
+ mode=self.fill_mode, ins_file=self.ins_file, outs_file=self.outs_file, print_top=self.print_top
238
+ ),
239
+ *get_bench_tvmc_args(
240
+ print_time=True, profile=self.profile, end_to_end=False, repeat=self.repeat, number=self.number
241
+ ),
242
+ *get_rpc_tvmc_args(self.use_rpc, self.rpc_key, self.rpc_hostname, self.rpc_port),
243
+ ]
244
+
245
+ def invoke_tvmc(self, command, *args):
246
+ env = prepare_python_environment(self.tvm_pythonpath, self.tvm_build_dir, self.tvm_configs_dir)
247
+ if self.tvmc_custom_script is None:
248
+ pre = ["-m", "tvm.driver.tvmc"]
249
+ else:
250
+ pre = [self.tvmc_custom_script]
251
+ return utils.python(*pre, command, *args, live=self.print_outputs, print_output=False, env=env)
252
+
253
+ def invoke_tvmc_run(self, path, device):
254
+ args = self.get_tvmc_run_args(path, device)
255
+ return self.invoke_tvmc("run", *args)
256
+
257
+ def run(self, elf, target, timeout=120):
258
+ # TODO: implement timeout
259
+ # Here, elf is actually a directory
260
+ # TODO: replace workaround with possibility to pass TAR directly
261
+ tar_path = elf
262
+ output = self.invoke_tvmc_run(str(tar_path), target.device)
263
+
264
+ return output
265
+
266
+ def get_tune_args(self, model, backend, out):
267
+ tuner = self.config.get("autotuning_tuner", "ga")
268
+ assert tuner in ["ga", "gridsearch", "random", "xgb", "xgb_knob", "xgb-rank"]
269
+ trials = self.config.get("autotuning_trials", 10)
270
+ mode = self.config.get("autotuning_mode", "autotvm")
271
+ assert mode in ["autotvm", "auto_scheduler"]
272
+ if not isinstance(trials, int):
273
+ trials = int(trials)
274
+ early_stopping = self.config.get("autotuning_early_stopping", None)
275
+ if early_stopping is None:
276
+ early_stopping = max(trials, 10) # Let's see if this default works out...
277
+ early_stopping = int(early_stopping)
278
+ max_parallel = int(self.config.get("autotuning_max_parallel", 1))
279
+ timeout = int(self.config.get("autotuning_timeout", 1000))
280
+ results_file = self.config.get("autotuning_results_file", None)
281
+ desired_layout = backend.config.get("desired_layout", None)
282
+ ret = [
283
+ *get_target_tvmc_args(
284
+ backend.target,
285
+ extra_target=backend.extra_target,
286
+ target_details=backend.get_target_details(),
287
+ ),
288
+ *(["--desired-layout", desired_layout] if desired_layout is not None else []),
289
+ *get_rpc_tvmc_args(self.use_rpc, self.rpc_key, self.rpc_hostname, self.rpc_port),
290
+ # TODO: missing: pass config, disabled_pass, etc.
291
+ *["--tuner", tuner],
292
+ *(["--early-stopping", str(early_stopping)] if early_stopping > 0 else []),
293
+ *["--parallel", str(max_parallel)],
294
+ *["--timeout", str(timeout * max_parallel)],
295
+ *["--trials", str(trials)],
296
+ *["--number", str(self.number)], # TODO: increase while tuning?
297
+ *["--repeat", str(self.repeat)], # TODO: increase while tuning?
298
+ *(["--tuning-records", results_file] if results_file is not None else []),
299
+ *["--output", str(out)],
300
+ ]
301
+ if self.config["autotuning_visualize"]:
302
+ assert (
303
+ self.experimental_tvmc_tune_tasks
304
+ ), f"{self.name}.visualize_tuning requires experimental_autotvm_visualize"
305
+ ret.append("--visualize")
306
+ if self.config["autotuning_tasks"]:
307
+ assert self.experimental_tvmc_tune_tasks, f"{self.name}.tune_tasks requires experimental_tvmc_tune_tasks"
308
+ ret.extend(["--tasks", str(self.config["autotuning_tasks"])])
309
+ if mode == "auto_scheduler":
310
+ ret.append("--enable-autoscheduler")
311
+ ret.append(model)
312
+ return ret
313
+
314
+ def tune_model(self, model_path, backend, target):
315
+ enable = self.config["autotuning_enable"]
316
+ results_file = self.config["autotuning_results_file"]
317
+ append = self.config["autotuning_append"]
318
+ num_workers = int(self.config["autotuning_num_workers"])
319
+ artifacts = []
320
+ verbose = False
321
+ if self.print_outputs:
322
+ verbose = True
323
+
324
+ content = ""
325
+ if enable:
326
+ if append:
327
+ if results_file is not None:
328
+ with open(results_file, "r") as handle:
329
+ content = handle.read()
330
+
331
+ if num_workers > 1:
332
+ assert self.experimental_tvmc_tune_tasks, "num_workers>1 requires experimental_tvmc_tune_tasks=1"
333
+ # TODO: fix
334
+ assert self.config["autotuning_tasks"] is None, "tune_tasks not supported together with num_workers > 1"
335
+
336
+ def get_tune_tasks():
337
+ with tempfile.TemporaryDirectory() as tmp_dir:
338
+ out_file = Path(tmp_dir) / "tuning_results.log.txt"
339
+ tune_args = self.get_tune_args(model_path, backend, out_file)
340
+ out = self.invoke_tvmc("tune", *tune_args, "--task", "list")
341
+ lines = out.split("\n")
342
+ for i, line in enumerate(lines):
343
+ if "Available Tasks for tuning" in line:
344
+ lines = lines[i + 1 :]
345
+ break
346
+ tasks = [line.split(". ", 1)[1] for line in lines if len(line.strip()) > 0]
347
+ return tasks
348
+
349
+ num_tasks = len(get_tune_tasks())
350
+ workers = []
351
+ with concurrent.futures.ThreadPoolExecutor(num_workers) as executor:
352
+ for i in range(num_tasks):
353
+ print(f"Created worker for task {i}")
354
+
355
+ def do_work(idx, prepend):
356
+ with tempfile.TemporaryDirectory() as tmp_dir:
357
+ out_file = Path(tmp_dir) / "tuning_results.log.txt"
358
+ with open(out_file, "w") as handle:
359
+ handle.write(prepend)
360
+ tune_args = self.get_tune_args(model_path, backend, out_file)
361
+ out = self.invoke_tvmc("tune", *tune_args, "--task", str(idx))
362
+ with open(out_file, "r") as handle:
363
+ content = handle.read()
364
+ return (out, content)
365
+
366
+ workers.append(executor.submit(do_work, i, content))
367
+ all_out = ""
368
+ all_content = ""
369
+ for i, w in enumerate(workers):
370
+ print(f"Worker {i}: done")
371
+ ret = w.result()
372
+ out, content = ret
373
+ all_out += out
374
+ all_content += content
375
+ out = all_out
376
+ content = all_content
377
+ else:
378
+ with tempfile.TemporaryDirectory() as tmp_dir:
379
+ out_file = Path(tmp_dir) / "tuning_results.log.txt"
380
+ with open(out_file, "w") as handle:
381
+ handle.write(content)
382
+ tune_args = self.get_tune_args(model_path, backend, out_file)
383
+ out = self.invoke_tvmc("tune", *tune_args)
384
+ with open(out_file, "r") as handle:
385
+ content = handle.read()
386
+ else:
387
+ if results_file is None:
388
+ return []
389
+ assert Path(results_file).is_file()
390
+ with open(results_file, "r") as handle:
391
+ content = handle.read()
392
+
393
+ artifact = Artifact("tuning_results.log.txt", content=content, fmt=ArtifactFormat.TEXT)
394
+ artifacts.append(artifact)
395
+
396
+ # pick best records
397
+ def _pick_best(backend, records, verbose=False):
398
+ content_best = ""
399
+ with tempfile.TemporaryDirectory() as tmp_dir:
400
+ in_file = Path(tmp_dir) / "tuning_results.log.txt"
401
+ with open(in_file, "w") as handle:
402
+ handle.write(records)
403
+ out_file = Path(tmp_dir) / "best_tuning_results.log.txt"
404
+ args = [
405
+ "--mode",
406
+ "pick",
407
+ "--i",
408
+ in_file,
409
+ "--o",
410
+ out_file,
411
+ ]
412
+ env = prepare_python_environment(backend.tvm_pythonpath, backend.tvm_build_dir, backend.tvm_configs_dir)
413
+ utils.python("-m", "tvm.autotvm.record", *args, live=verbose, env=env)
414
+ with open(out_file, "r") as handle:
415
+ content_best = handle.read()
416
+ return content_best
417
+
418
+ content_best = _pick_best(backend, content, verbose=verbose)
419
+ if len(content_best) > 0:
420
+ artifact_ = Artifact("best_tuning_results.log.txt", content=content_best, fmt=ArtifactFormat.TEXT)
421
+ artifacts.append(artifact_)
422
+
423
+ if enable:
424
+ stdout_artifact = Artifact(
425
+ "tvmc_tune_out.log", content=out, fmt=ArtifactFormat.TEXT
426
+ ) # TODO: rename to tvmaot_out.log?
427
+ artifacts.append(stdout_artifact)
428
+
429
+ return artifacts
@@ -0,0 +1,57 @@
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 mlonmcu.logging import get_logger
20
+
21
+ from mlonmcu.flow.tvm.backend.backend import TVMBackend
22
+ from mlonmcu.flow.tvm.backend.tvmllvm import TVMLLVMBackend
23
+
24
+ logger = get_logger()
25
+
26
+ TVM_PLATFORM_BACKEND_REGISTRY = {}
27
+
28
+
29
+ def register_tvm_platform_backend(backend_name, b, override=False):
30
+ global TVM_PLATFORM_BACKEND_REGISTRY
31
+
32
+ if backend_name in TVM_PLATFORM_BACKEND_REGISTRY and not override:
33
+ raise RuntimeError(f"TVM platform backend {backend_name} is already registered")
34
+ TVM_PLATFORM_BACKEND_REGISTRY[backend_name] = b
35
+
36
+
37
+ def get_tvm_platform_backends():
38
+ return TVM_PLATFORM_BACKEND_REGISTRY
39
+
40
+
41
+ register_tvm_platform_backend("tvmllvm", TVMLLVMBackend)
42
+
43
+
44
+ def create_tvm_platform_backend(name, platform, base=TVMBackend):
45
+ class TvmPlatformBackend(base):
46
+ FEATURES = base.FEATURES + []
47
+
48
+ DEFAULTS = {
49
+ **base.DEFAULTS,
50
+ }
51
+ REQUIRED = base.REQUIRED + []
52
+
53
+ def __init__(self, features=None, config=None):
54
+ super().__init__(runtime="cpp", fmt="so", features=features, config=config)
55
+ self.platform = platform
56
+
57
+ return TvmPlatformBackend
@@ -0,0 +1,165 @@
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
+ logger = get_logger()
28
+
29
+
30
+ def name2device(name):
31
+ return name.replace("tvm_", "")
32
+
33
+
34
+ def create_tvm_platform_target(name, platform, base=Target):
35
+ class TvmPlatformTarget(base):
36
+ FEATURES = base.FEATURES + []
37
+
38
+ DEFAULTS = {
39
+ **base.DEFAULTS,
40
+ "timeout_sec": 0, # disabled
41
+ }
42
+ REQUIRED = base.REQUIRED + []
43
+
44
+ def __init__(self, features=None, config=None):
45
+ super().__init__(name=name, features=features, config=config)
46
+ self.platform = platform
47
+ self.device = name2device(name)
48
+
49
+ @property
50
+ def timeout_sec(self):
51
+ return int(self.config["timeout_sec"])
52
+
53
+ @property
54
+ def repeat(self):
55
+ return None # This is handled at the platform level
56
+
57
+ def exec(self, program, *args, cwd=os.getcwd(), **kwargs):
58
+ """Use target to execute a executable with given arguments"""
59
+ if len(args) > 0:
60
+ raise RuntimeError("Program arguments are not supported for real hardware devices")
61
+
62
+ assert self.platform is not None, "TVM targets need a platform to execute programs"
63
+
64
+ if self.timeout_sec > 0:
65
+ raise NotImplementedError
66
+
67
+ ret = self.platform.run(program, self)
68
+ return ret
69
+
70
+ def parse_stdout(self, out):
71
+ mean_ms = None
72
+ median_ms = None
73
+ max_ms = None
74
+ min_ms = None
75
+ std_ms = None
76
+ found = False
77
+ for line in out.split("\n"):
78
+ if found:
79
+ match = re.compile(r"\s+(\d*\.\d+)\s+(\d*\.\d+)\s+(\d*\.\d+)\s+(\d*\.\d+)\s+(\d*\.\d+)").findall(
80
+ line
81
+ )
82
+ assert len(match) == 1
83
+ groups = match[0]
84
+ mean_ms, median_ms, max_ms, min_ms, std_ms = (
85
+ float(groups[0]),
86
+ float(groups[1]),
87
+ float(groups[2]),
88
+ float(groups[3]),
89
+ float(groups[4]),
90
+ )
91
+ break
92
+ if re.compile(r"\s+mean \(ms\)\s+median \(ms\)\s+max \(ms\)\s+min \(ms\)\s+std \(ms\)").match(line):
93
+ found = True
94
+ return mean_ms, median_ms, max_ms, min_ms, std_ms
95
+
96
+ def get_metrics(self, elf, directory, handle_exit=None):
97
+ if self.print_outputs:
98
+ out = self.exec(elf, cwd=directory, live=True, handle_exit=handle_exit)
99
+ else:
100
+ out = self.exec(
101
+ elf,
102
+ cwd=directory,
103
+ live=False,
104
+ print_func=lambda *args, **kwargs: None,
105
+ handle_exit=handle_exit,
106
+ )
107
+ mean_ms, _, max_ms, min_ms, _ = self.parse_stdout(out)
108
+
109
+ metrics = Metrics()
110
+ mean_s = mean_ms / 1e3 if mean_ms is not None else mean_ms
111
+ min_s = min_ms / 1e3 if min_ms is not None else min_ms
112
+ max_s = max_ms / 1e3 if max_ms is not None else max_ms
113
+ if (
114
+ self.platform.number == 1
115
+ and self.platform.repeat == 1
116
+ and (not self.platform.total_time or self.platform.aggregate != "none")
117
+ ):
118
+ metrics.add("Runtime [s]", mean_s)
119
+ else:
120
+ if self.platform.total_time:
121
+ metrics.add("Total Runtime [s]", mean_s * self.platform.number)
122
+ if self.platform.aggregate == "all":
123
+ metrics.add("Average Runtime [s]", mean_s)
124
+ metrics.add("Min Runtime [s]", min_s)
125
+ metrics.add("Max Runtime [s]", max_s)
126
+ elif self.platform.aggregate in ["avg", "mean"]:
127
+ metrics.add("Average Runtime [s]", mean_s)
128
+ elif self.platform.aggregate == "min":
129
+ metrics.add("Min Runtime [s]", min_s)
130
+ elif self.platform.aggregate == "max":
131
+ metrics.add("Max Runtime [s]", max_s)
132
+
133
+ if self.platform.profile:
134
+ print("out", out)
135
+ headers = None
136
+ lines = out.split("\n")
137
+ extracted = []
138
+
139
+ def extract_cols(line):
140
+ x = re.compile(r"(([^\s\[\]]+)(\s\S+)*)(\[.*\])?").findall(line)
141
+ return [y[0] for y in x]
142
+
143
+ for line in lines:
144
+ if "---" in line:
145
+ break
146
+ if headers is None:
147
+ if "Name" in line:
148
+ headers = extract_cols(line)
149
+ else:
150
+ cols = extract_cols(line)
151
+ data = {headers[i]: val for i, val in enumerate(cols)}
152
+ extracted.append(data)
153
+ assert len(extracted) > 0
154
+ metrics = {"default": metrics}
155
+ for item in extracted:
156
+ metrics_ = Metrics()
157
+ metrics_.add("Runtime [s]", float(item["Duration (us)"]) / 1e6)
158
+ metrics[item["Name"]] = metrics_
159
+
160
+ return metrics, out, []
161
+
162
+ def get_arch(self):
163
+ return "unkwown"
164
+
165
+ return TvmPlatformTarget
@@ -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 Zephyr platform"""
20
+
21
+ # pylint: disable=wildcard-import, redefined-builtin
22
+
23
+ from .zephyr import ZephyrPlatform
24
+
25
+ __all__ = ["ZephyrPlatform"]