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,462 @@
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 ETISS/Pulpino Target definitions"""
20
+
21
+ import os
22
+ import re
23
+ import csv
24
+ from pathlib import Path
25
+
26
+ from mlonmcu.logging import get_logger
27
+ from mlonmcu.config import str2bool
28
+ from mlonmcu.artifact import Artifact, ArtifactFormat
29
+ from mlonmcu.feature.features import SUPPORTED_TVM_BACKENDS
30
+ from mlonmcu.target.common import cli, execute
31
+ from mlonmcu.target.metrics import Metrics
32
+ from .riscv import RISCVTarget
33
+ from .util import update_extensions
34
+
35
+ logger = get_logger()
36
+
37
+
38
+ class EtissPulpinoTarget(RISCVTarget):
39
+ """Target using a Pulpino-like VP running in the ETISS simulator"""
40
+
41
+ FEATURES = RISCVTarget.FEATURES + ["gdbserver", "etissdbg", "trace", "log_instrs", "pext", "vext"]
42
+
43
+ DEFAULTS = {
44
+ **RISCVTarget.DEFAULTS,
45
+ "gdbserver_enable": False,
46
+ "gdbserver_attach": False,
47
+ "gdbserver_port": 2222,
48
+ "debug_etiss": False,
49
+ "trace_memory": False,
50
+ # "plugins": ["PrintInstruction"],
51
+ "plugins": [],
52
+ "verbose": False,
53
+ "cpu_arch": None,
54
+ "rom_start": 0x0,
55
+ "rom_size": 0x800000, # 8 MB
56
+ "ram_start": 0x800000,
57
+ "ram_size": 0x4000000, # 64 MB
58
+ "cycle_time_ps": 31250, # 32 MHz
59
+ "enable_vext": False,
60
+ "vext_spec": 1.0,
61
+ "embedded_vext": False,
62
+ "enable_pext": False,
63
+ "pext_spec": 0.96,
64
+ "vlen": 0, # vectorization=off
65
+ "elen": 32,
66
+ "jit": None,
67
+ "end_to_end_cycles": False,
68
+ }
69
+ REQUIRED = RISCVTarget.REQUIRED + ["etiss.src_dir", "etiss.install_dir", "etissvp.script"]
70
+
71
+ def __init__(self, name="etiss_pulpino", features=None, config=None):
72
+ super().__init__(name, features=features, config=config)
73
+ self.metrics_script = Path(self.etiss_src_dir) / "src" / "bare_etiss_processor" / "get_metrics.py"
74
+
75
+ @property
76
+ def etiss_src_dir(self):
77
+ return self.config["etiss.src_dir"]
78
+
79
+ @property
80
+ def etiss_dir(self):
81
+ return self.config["etiss.install_dir"]
82
+
83
+ @property
84
+ def etiss_script(self):
85
+ return self.config["etissvp.script"]
86
+
87
+ @property
88
+ def gdbserver_enable(self):
89
+ value = self.config["gdbserver_enable"]
90
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
91
+
92
+ @property
93
+ def gdbserver_attach(self):
94
+ value = self.config["gdbserver_attach"]
95
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
96
+
97
+ @property
98
+ def gdbserver_port(self):
99
+ return int(self.config["gdbserver_port"])
100
+
101
+ @property
102
+ def debug_etiss(self):
103
+ value = self.config["debug_etiss"]
104
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
105
+
106
+ @property
107
+ def trace_memory(self):
108
+ value = self.config["trace_memory"]
109
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
110
+
111
+ @property
112
+ def plugins(self):
113
+ return self.config["plugins"]
114
+
115
+ @property
116
+ def verbose(self):
117
+ value = self.config["verbose"]
118
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
119
+
120
+ @property
121
+ def rom_start(self):
122
+ value = self.config["rom_start"]
123
+ return int(value, 0) if not isinstance(value, int) else value
124
+
125
+ @property
126
+ def rom_size(self):
127
+ value = self.config["rom_size"]
128
+ return int(value, 0) if not isinstance(value, int) else value
129
+
130
+ @property
131
+ def ram_start(self):
132
+ value = self.config["ram_start"]
133
+ return int(value, 0) if not isinstance(value, int) else value
134
+
135
+ @property
136
+ def ram_size(self):
137
+ value = self.config["ram_size"]
138
+ return int(value, 0) if not isinstance(value, int) else value
139
+
140
+ @property
141
+ def cycle_time_ps(self):
142
+ return int(self.config["cycle_time_ps"])
143
+
144
+ @property
145
+ def cpu_arch(self):
146
+ if self.config.get("cpu_arch", None):
147
+ return self.config["cpu_arch"]
148
+ elif self.enable_pext or self.enable_vext:
149
+ return "RV32IMACFDPV"
150
+ else:
151
+ return "RV32IMACFD"
152
+
153
+ @property
154
+ def enable_vext(self):
155
+ value = self.config["enable_vext"]
156
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
157
+
158
+ @property
159
+ def enable_pext(self):
160
+ value = self.config["enable_pext"]
161
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
162
+
163
+ @property
164
+ def vlen(self):
165
+ return int(self.config["vlen"])
166
+
167
+ @property
168
+ def elen(self):
169
+ return int(self.config["elen"])
170
+
171
+ @property
172
+ def jit(self):
173
+ return self.config["jit"]
174
+
175
+ @property
176
+ def extensions(self):
177
+ exts = super().extensions
178
+ return update_extensions(
179
+ exts,
180
+ pext=self.enable_pext,
181
+ pext_spec=self.pext_spec,
182
+ vext=self.enable_vext,
183
+ elen=self.elen,
184
+ embedded=self.embedded_vext,
185
+ fpu=self.fpu,
186
+ variant=self.gcc_variant,
187
+ )
188
+
189
+ @property
190
+ def attr(self):
191
+ attrs = super().attr.split(",")
192
+ if self.enable_vext and f"+zvl{self.vlen}b" not in attrs:
193
+ attrs.append(f"+zvl{self.vlen}b")
194
+ return ",".join(attrs)
195
+
196
+ @property
197
+ def end_to_end_cycles(self):
198
+ value = self.config["end_to_end_cycles"]
199
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
200
+
201
+ @property
202
+ def vext_spec(self):
203
+ return float(self.config["vext_spec"])
204
+
205
+ @property
206
+ def embedded_vext(self):
207
+ value = self.config["embedded_vext"]
208
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
209
+
210
+ @property
211
+ def pext_spec(self):
212
+ return float(self.config["pext_spec"])
213
+
214
+ def write_ini(self, path):
215
+ # TODO: Either create artifact for ini or prefer to use cmdline args.
216
+ with open(path, "w") as f:
217
+ if self.cpu_arch or self.jit:
218
+ f.write("[StringConfigurations]\n")
219
+ if self.cpu_arch:
220
+ f.write(f"arch.cpu={self.cpu_arch}\n")
221
+ if self.jit:
222
+ f.write(f"jit.type={self.jit}JIT\n")
223
+ f.write("[IntConfigurations]\n")
224
+ # f.write("etiss.max_block_size=100\n")
225
+ # f.write("etiss.max_block_size=500\n")
226
+ f.write(f"simple_mem_system.memseg_origin_00={hex(self.rom_start)}\n")
227
+ f.write(f"simple_mem_system.memseg_length_00={hex(self.rom_size)}\n")
228
+ f.write(f"simple_mem_system.memseg_origin_01={hex(self.ram_start)}\n")
229
+ f.write(f"simple_mem_system.memseg_length_01={hex(self.ram_size)}\n")
230
+ f.write("\n")
231
+ f.write(f"arch.cpu_cycle_time_ps={self.cycle_time_ps}\n")
232
+ if self.has_fpu:
233
+ # TODO: do not hardcode cpu_arch
234
+ # TODO: i.e. use cpu_arch_lower
235
+ f.write("arch.rv32imacfdpv.mstatus_fs=1")
236
+ if self.enable_vext:
237
+ f.write("arch.rv32imacfdpv.mstatus_vs=1")
238
+ if self.vlen > 0:
239
+ f.write(f"arch.rv32imacfdpv.vlen={self.vlen}")
240
+ # if self.elen > 0:
241
+ # f.write(f"arch.rv32imacfdpv.elen={self.elen}")
242
+
243
+ if self.gdbserver_enable:
244
+ f.write("\n[Plugin gdbserver]\n")
245
+ # This could also be accomplished using `--plugin.gdbserver.port` on the cmdline
246
+ f.write(f"plugin.gdbserver.port={self.gdbserver_port}")
247
+
248
+ def exec(self, program, *args, cwd=os.getcwd(), **kwargs):
249
+ """Use target to execute a executable with given arguments"""
250
+ etiss_script_args = []
251
+ if len(self.extra_args) > 0:
252
+ etiss_script_args.extend(self.extra_args.split(" "))
253
+
254
+ # TODO: this is outdated
255
+ # TODO: validate features (attach xor noattach!)
256
+ if self.debug_etiss:
257
+ etiss_script_args.append("gdb")
258
+ if self.gdbserver_enable:
259
+ etiss_script_args.append("tgdb")
260
+ if not self.gdbserver_attach:
261
+ etiss_script_args.append("noattach")
262
+ if self.trace_memory:
263
+ etiss_script_args.append("trace")
264
+ etiss_script_args.append("nodmi")
265
+ if self.verbose:
266
+ etiss_script_args.append("v")
267
+ # Alternative to stdout parsing: etiss_script_args.append("--vp.stats_file_path=stats.json")
268
+
269
+ # TODO: working directory?
270
+ etiss_ini = os.path.join(cwd, "custom.ini")
271
+ self.write_ini(etiss_ini)
272
+ etiss_script_args.append("-i" + etiss_ini)
273
+ if len(self.plugins):
274
+ plugins_str = " ".join(self.plugins) # TODO: find out separator
275
+ etiss_script_args.extend(["-p", plugins_str])
276
+
277
+ if self.timeout_sec > 0:
278
+ raise NotImplementedError
279
+ else:
280
+ ret = execute(
281
+ Path(self.etiss_script).resolve(),
282
+ program,
283
+ *etiss_script_args,
284
+ *args,
285
+ cwd=cwd,
286
+ **kwargs,
287
+ )
288
+ return ret
289
+
290
+ def parse_stdout(self, out, handle_exit=None):
291
+ exit_match = re.search(r"exit called with code: (.*)", out)
292
+ if exit_match:
293
+ exit_code = int(exit_match.group(1))
294
+ if handle_exit is not None:
295
+ exit_code = handle_exit(exit_code)
296
+ if exit_code != 0:
297
+ logger.error("Execution failed - " + out)
298
+ raise RuntimeError(f"unexpected exit code: {exit_code}")
299
+ else:
300
+ exit_code = 0
301
+ error_match = re.search(r"ETISS: Error: (.*)", out)
302
+ if error_match:
303
+ error_msg = error_match.group(1)
304
+ raise RuntimeError(f"An ETISS Error occured during simulation: {error_msg}")
305
+
306
+ if self.end_to_end_cycles:
307
+ cpu_cycles = re.search(r"CPU Cycles \(estimated\): (.*)", out)
308
+ else:
309
+ cpu_cycles = re.search(r"Total Cycles: (.*)", out)
310
+ if not cpu_cycles:
311
+ if exit_code == 0:
312
+ logger.warning("unexpected script output (cycles)")
313
+ cycles = None
314
+ else:
315
+ cycles = int(float(cpu_cycles.group(1)))
316
+ mips_match = re.search(r"MIPS \(estimated\): (.*)", out)
317
+ if not mips_match:
318
+ if exit_code == 0:
319
+ raise logger.warning("unexpected script output (mips)")
320
+ mips = None
321
+ else:
322
+ mips = int(float(mips_match.group(1)))
323
+
324
+ return cycles, mips
325
+
326
+ def get_metrics(self, elf, directory, *args, handle_exit=None):
327
+ out = ""
328
+ if self.trace_memory:
329
+ trace_file = os.path.join(directory, "dBusAccess.csv")
330
+ if os.path.exists(trace_file):
331
+ os.remove(trace_file)
332
+ else:
333
+ trace_file = None
334
+
335
+ metrics_file = os.path.join(directory, "metrics.csv")
336
+ if os.path.exists(metrics_file):
337
+ os.remove(metrics_file)
338
+
339
+ if self.print_outputs:
340
+ out += self.exec(elf, *args, cwd=directory, live=True, handle_exit=handle_exit)
341
+ else:
342
+ out += self.exec(
343
+ elf, *args, cwd=directory, live=False, print_func=lambda *args, **kwargs: None, handle_exit=handle_exit
344
+ )
345
+ total_cycles, mips = self.parse_stdout(out, handle_exit=handle_exit)
346
+
347
+ get_metrics_args = [elf]
348
+ etiss_ini = os.path.join(directory, "custom.ini")
349
+ if os.path.exists(etiss_ini):
350
+ get_metrics_args.extend(["--ini", etiss_ini])
351
+ if trace_file:
352
+ get_metrics_args.extend(["--trace", trace_file])
353
+ get_metrics_args.extend(["--out", metrics_file])
354
+ if self.print_outputs:
355
+ out += execute(self.metrics_script.resolve(), *get_metrics_args, live=True)
356
+ else:
357
+ out += execute(
358
+ self.metrics_script.resolve(),
359
+ *get_metrics_args,
360
+ live=False,
361
+ cwd=directory,
362
+ print_func=lambda *args, **kwargs: None,
363
+ )
364
+
365
+ metrics = Metrics()
366
+ metrics.add("Cycles", total_cycles)
367
+ metrics.add("MIPS", mips, optional=True)
368
+
369
+ metrics_file = os.path.join(directory, "metrics.csv")
370
+ with open(metrics_file, "r") as handle:
371
+ metrics_content = handle.read()
372
+ lines = metrics_content.splitlines()
373
+ reader = csv.DictReader(lines)
374
+ data = list(reader)[0]
375
+
376
+ def get_rom_sizes(data):
377
+ assert "rom_rodata" in data
378
+ rom_ro = int(data["rom_rodata"])
379
+ assert "rom_code" in data
380
+ rom_code = int(data["rom_code"])
381
+ assert "rom_misc" in data
382
+ rom_misc = int(data["rom_misc"])
383
+
384
+ rom_total = rom_ro + rom_code + rom_misc
385
+ return rom_total, rom_ro, rom_code, rom_misc
386
+
387
+ def get_ram_sizes(data):
388
+ assert "ram_data" in data
389
+ ram_data = int(data["ram_data"])
390
+ assert "ram_zdata" in data
391
+ ram_zdata = int(data["ram_zdata"])
392
+ ram_total = ram_data + ram_zdata
393
+ if self.trace_memory:
394
+ assert "ram_stack" in data
395
+ ram_stack = int(data["ram_stack"])
396
+ assert "ram_heap" in data
397
+ ram_heap = int(data["ram_heap"])
398
+ ram_total += ram_stack + ram_heap
399
+ else:
400
+ ram_stack = None
401
+ ram_heap = None
402
+ return ram_total, ram_data, ram_zdata, ram_stack, ram_heap
403
+
404
+ rom_total, rom_ro, rom_code, rom_misc = get_rom_sizes(data)
405
+ ram_total, ram_data, ram_zdata, ram_stack, ram_heap = get_ram_sizes(data)
406
+ metrics.add("Total ROM", rom_total)
407
+ metrics.add("Total RAM", ram_total)
408
+ metrics.add("ROM read-only", rom_ro)
409
+ metrics.add("ROM code", rom_code)
410
+ metrics.add("ROM misc", rom_misc)
411
+ metrics.add("RAM data", ram_data)
412
+ metrics.add("RAM zero-init data", ram_zdata)
413
+ if self.trace_memory:
414
+ metrics.add("RAM stack", ram_stack)
415
+ metrics.add("RAM heap", ram_heap)
416
+
417
+ artifacts = []
418
+ ini_content = open(etiss_ini, "r").read()
419
+ ini_artifact = Artifact("custom.ini", content=ini_content, fmt=ArtifactFormat.TEXT)
420
+ artifacts.append(ini_artifact)
421
+
422
+ return metrics, out, artifacts
423
+
424
+ def get_target_system(self):
425
+ return self.name
426
+
427
+ def get_platform_defs(self, platform):
428
+ assert platform == "mlif"
429
+ ret = super().get_platform_defs(platform)
430
+ ret["ETISS_DIR"] = self.etiss_dir
431
+ ret["PULPINO_ROM_START"] = self.rom_start
432
+ ret["PULPINO_ROM_SIZE"] = self.rom_size
433
+ ret["PULPINO_RAM_START"] = self.ram_start
434
+ ret["PULPINO_RAM_SIZE"] = self.ram_size
435
+ if self.enable_pext:
436
+ major, minor = str(self.pext_spec).split(".")[:2]
437
+ ret["RISCV_RVP_MAJOR"] = major
438
+ ret["RISCV_RVP_MINOR"] = minor
439
+ if self.enable_vext:
440
+ major, minor = str(self.vext_spec).split(".")[:2]
441
+ ret["RISCV_RVV_MAJOR"] = major
442
+ ret["RISCV_RVV_MINOR"] = minor
443
+ ret["RISCV_RVV_VLEN"] = self.vlen
444
+ return ret
445
+
446
+ def get_backend_config(self, backend):
447
+ ret = super().get_backend_config(backend)
448
+ if backend in SUPPORTED_TVM_BACKENDS:
449
+ ret.update({"target_model": "etissvp"})
450
+ if self.enable_pext or self.enable_vext:
451
+ ret.update(
452
+ {
453
+ # Warning: passing kernel layouts does not work with upstream TVM
454
+ # TODO: allow passing map?
455
+ "desired_layout": "NHWC:HWOI",
456
+ }
457
+ )
458
+ return ret
459
+
460
+
461
+ if __name__ == "__main__":
462
+ cli(target=EtissPulpinoTarget)
@@ -0,0 +1,215 @@
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 GVSOC/Pulp or Pulpissimo Target definitions"""
20
+
21
+ import os
22
+ import re
23
+ from pathlib import Path
24
+
25
+ from mlonmcu.logging import get_logger
26
+ from mlonmcu.feature.features import SUPPORTED_TVM_BACKENDS
27
+ from mlonmcu.target.common import cli, execute
28
+ from mlonmcu.target.metrics import Metrics
29
+ from .riscv import RISCVTarget
30
+ from .util import update_extensions_pulp
31
+ import shutil
32
+
33
+ logger = get_logger()
34
+
35
+
36
+ class GvsocPulpTarget(RISCVTarget):
37
+ """Target using a Pulpino-like VP running in the GVSOC simulator"""
38
+
39
+ FEATURES = RISCVTarget.FEATURES + ["log_instrs", "xpulp"]
40
+
41
+ DEFAULTS = {
42
+ **RISCVTarget.DEFAULTS,
43
+ "abi": "ilp32",
44
+ "extensions": ["i", "m", "c"], # TODO overwrite extensions elegantly
45
+ "fpu": None,
46
+ "xpulp_version": None, # None means that xpulp extension is not used
47
+ "model": "pulp",
48
+ }
49
+
50
+ REQUIRED = RISCVTarget.PUPL_GCC_TOOLCHAIN_REQUIRED + [
51
+ "gvsoc.exe",
52
+ "pulp_freertos.support_dir",
53
+ "pulp_freertos.config_dir",
54
+ "pulp_freertos.install_dir",
55
+ ]
56
+
57
+ def __init__(self, name="gvsoc_pulp", features=None, config=None):
58
+ super().__init__(name, features=features, config=config)
59
+
60
+ @property
61
+ def gvsoc_script(self):
62
+ return Path(self.config["gvsoc.exe"])
63
+
64
+ @property
65
+ def gvsoc_folder(self):
66
+ return Path(self.config["gvsoc.exe"]).parent / "gvsoc"
67
+
68
+ @property
69
+ def pulp_freertos_support_dir(self):
70
+ return Path(self.config["pulp_freertos.support_dir"])
71
+
72
+ @property
73
+ def pulp_freertos_config_dir(self):
74
+ return Path(self.config["pulp_freertos.config_dir"])
75
+
76
+ @property
77
+ def pulp_freertos_install_dir(self):
78
+ return Path(self.config["pulp_freertos.install_dir"])
79
+
80
+ @property
81
+ def model(self):
82
+ assert self.config["model"] in ["pulp", "pulpissimo"]
83
+ return self.config["model"]
84
+
85
+ @property
86
+ def xpulp_version(self):
87
+ value = self.config["xpulp_version"]
88
+ return value
89
+
90
+ @property
91
+ def abi(self):
92
+ value = self.config["abi"]
93
+ return value
94
+
95
+ @property
96
+ def extensions(self):
97
+ exts = super().extensions
98
+ return update_extensions_pulp(exts, xpulp_version=self.xpulp_version)
99
+
100
+ def gvsoc_preparation_env(self):
101
+ return {
102
+ "PULP_RISCV_GCC_TOOLCHAIN": str(self.pulp_gcc_prefix),
103
+ "PULP_CURRENT_CONFIG": "pulp@config_file=chips/pulp/pulp.json",
104
+ "PULP_CONFIGS_PATH": str(self.pulp_freertos_config_dir),
105
+ "PYTHONPATH": str(self.pulp_freertos_install_dir / "python"),
106
+ "INSTALL_DIR": str(self.pulp_freertos_install_dir),
107
+ "ARCHI_DIR": str(self.pulp_freertos_support_dir / "archi" / "include"),
108
+ "SUPPORT_ROOT": str(self.pulp_freertos_support_dir),
109
+ }
110
+
111
+ def get_basic_gvsoc_simulating_arg(self, program):
112
+ gvsoc_simulating_arg = []
113
+ gvsoc_simulating_arg.append(f"--dir={program.parent / 'gvsim'}")
114
+ gvsoc_simulating_arg.append("--config-file=pulp@config_file=chips/pulp/pulp.json")
115
+ gvsoc_simulating_arg.append("--platform=gvsoc")
116
+ gvsoc_simulating_arg.append(f"--binary={program.stem}")
117
+ gvsoc_simulating_arg.append("prepare")
118
+ gvsoc_simulating_arg.append("run")
119
+ return gvsoc_simulating_arg
120
+
121
+ def exec(self, program, *args, cwd=os.getcwd(), **kwargs):
122
+ """Use target to execute an executable with given arguments"""
123
+ gvsimDir = program.parent / "gvsim"
124
+ if not os.path.exists(gvsimDir):
125
+ os.makedirs(gvsimDir)
126
+ shutil.copyfile(program, gvsimDir / program.stem)
127
+
128
+ # prepare simulation by compile gvsoc according to the chosen chip
129
+ gvsoc_compile_args = []
130
+ gvsoc_compile_args.append("build")
131
+ gvsoc_compile_args.append(f"ARCHI_DIR={self.pulp_freertos_support_dir / 'archi' / 'include'}")
132
+
133
+ env = os.environ.copy()
134
+ env.update(self.gvsoc_preparation_env())
135
+
136
+ gvsoc_compile_retval = execute(
137
+ "make",
138
+ *gvsoc_compile_args,
139
+ env=env,
140
+ cwd=self.gvsoc_folder,
141
+ *args,
142
+ **kwargs,
143
+ )
144
+
145
+ # run simulation
146
+ gvsoc_simulating_arg = self.get_basic_gvsoc_simulating_arg(program)
147
+ if len(self.extra_args) > 0:
148
+ if isinstance(self.extra_args, str):
149
+ extra_args = self.extra_args.split(" ")
150
+ else:
151
+ extra_args = self.extra_args
152
+ gvsoc_simulating_arg.extend(extra_args)
153
+
154
+ env = os.environ.copy()
155
+ env.update({"PULP_RISCV_GCC_TOOLCHAIN": str(self.pulp_gcc_prefix)})
156
+ simulation_retval = execute(
157
+ str(self.gvsoc_script),
158
+ *gvsoc_simulating_arg,
159
+ env=env,
160
+ cwd=cwd,
161
+ *args,
162
+ **kwargs,
163
+ )
164
+ return gvsoc_compile_retval + simulation_retval
165
+
166
+ def parse_stdout(self, out):
167
+ cpu_cycles = re.search(r"Total Cycles: (.*)", out)
168
+ if not cpu_cycles:
169
+ logger.warning("unexpected script output (cycles)")
170
+ cycles = None
171
+ else:
172
+ cycles = int(float(cpu_cycles.group(1)))
173
+
174
+ cpu_instructions = re.search(r"Total Instructions: (.*)", out)
175
+ if not cpu_instructions:
176
+ logger.warning("unexpected script output (instructions)")
177
+ cpu_instructions = None
178
+ else:
179
+ instructions = int(float(cpu_instructions.group(1)))
180
+ return cycles, instructions
181
+
182
+ def get_metrics(self, elf, directory, *args, handle_exit=None):
183
+ out = ""
184
+ if self.print_outputs:
185
+ out += self.exec(elf, *args, cwd=directory, live=True, handle_exit=handle_exit)
186
+ else:
187
+ out += self.exec(
188
+ elf, *args, cwd=directory, live=False, print_func=lambda *args, **kwargs: None, handle_exit=handle_exit
189
+ )
190
+ cycles, instructions = self.parse_stdout(out)
191
+ metrics = Metrics()
192
+ metrics.add("Cycles", cycles)
193
+ metrics.add("Instructions", instructions)
194
+ return metrics, out, []
195
+
196
+ def get_target_system(self):
197
+ return f"gvsoc_{self.model}"
198
+
199
+ def get_platform_defs(self, platform):
200
+ assert platform == "mlif"
201
+ ret = super().get_platform_defs(platform)
202
+ # ret["RISCV_ARCH"] = "rv32imcxpulpv3"
203
+ ret["RISCV_ABI"] = self.abi
204
+ return ret
205
+
206
+ def get_backend_config(self, backend):
207
+ ret = super().get_backend_config(backend)
208
+ if backend in SUPPORTED_TVM_BACKENDS:
209
+ ret.update({"target_model": f"gvsoc_{self.model}"})
210
+ ret.update({"target_mabi": self.abi})
211
+ return ret
212
+
213
+
214
+ if __name__ == "__main__":
215
+ cli(target=GvsocPulpTarget)