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,301 @@
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 OVPSim 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.config import str2bool
27
+ from mlonmcu.feature.features import SUPPORTED_TVM_BACKENDS
28
+ from mlonmcu.target.common import cli, execute
29
+ from mlonmcu.target.metrics import Metrics
30
+ from .riscv import RISCVTarget, sort_extensions_canonical
31
+ from .util import update_extensions
32
+
33
+ logger = get_logger()
34
+
35
+
36
+ MAX_P_SPEC = 0.96
37
+
38
+
39
+ def replace_unsupported(exts):
40
+ ret = []
41
+ for ext in exts:
42
+ if "ZVE" in ext or "ZVL" in ext:
43
+ ret.append("V")
44
+ if "zpn" in ext.lower() or "zpsfoperand" in ext.lower():
45
+ pass
46
+ elif ext == "P":
47
+ ret.append(ext)
48
+ ret.append("B")
49
+ else:
50
+ ret.append(ext)
51
+ return ret
52
+
53
+
54
+ class OVPSimTarget(RISCVTarget):
55
+ """Target using an ARM FVP (fixed virtual platform) based on a Cortex M55 with EthosU support"""
56
+
57
+ FEATURES = RISCVTarget.FEATURES + ["vext", "pext", "gdbserver", "log_instrs"]
58
+
59
+ DEFAULTS = {
60
+ **RISCVTarget.DEFAULTS,
61
+ "vlen": 0, # vectorization=off
62
+ "elen": 32,
63
+ "enable_vext": False,
64
+ "vext_spec": 1.0,
65
+ "embedded_vext": False,
66
+ "enable_pext": False,
67
+ "pext_spec": 0.96,
68
+ "bitmanip_spec": 0.94,
69
+ "variant": "RVB32I",
70
+ "end_to_end_cycles": True,
71
+ "gdbserver_enable": False,
72
+ "gdbserver_attach": False,
73
+ "gdbserver_port": 2222,
74
+ }
75
+ REQUIRED = RISCVTarget.REQUIRED + ["ovpsim.exe"]
76
+
77
+ def __init__(self, name="ovpsim", features=None, config=None):
78
+ super().__init__(name, features=features, config=config)
79
+
80
+ @property
81
+ def ovpsim_exe(self):
82
+ return Path(self.config["ovpsim.exe"])
83
+
84
+ @property
85
+ def variant(self):
86
+ temp = self.config["variant"]
87
+ if temp:
88
+ return temp
89
+ else:
90
+ return f"RVB{self.xlen}I"
91
+
92
+ @property
93
+ def extensions(self):
94
+ exts = super().extensions
95
+ assert self.pext_spec <= MAX_P_SPEC, f"P-Extension spec {self.pext_spec} not supported by {self.name} target"
96
+ return update_extensions(
97
+ exts,
98
+ pext=self.enable_pext,
99
+ pext_spec=self.pext_spec,
100
+ vext=self.enable_vext,
101
+ elen=self.elen,
102
+ embedded=self.embedded_vext,
103
+ fpu=self.fpu,
104
+ variant=self.gcc_variant,
105
+ )
106
+
107
+ @property
108
+ def attr(self):
109
+ attrs = super().attr.split(",")
110
+ if self.enable_vext and f"+zvl{self.vlen}b" not in attrs:
111
+ attrs.append(f"+zvl{self.vlen}b")
112
+ return ",".join(attrs)
113
+
114
+ @property
115
+ def vlen(self):
116
+ return int(self.config["vlen"])
117
+
118
+ @property
119
+ def elen(self):
120
+ return int(self.config["elen"])
121
+
122
+ @property
123
+ def enable_vext(self):
124
+ value = self.config["enable_vext"]
125
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
126
+
127
+ @property
128
+ def enable_pext(self):
129
+ value = self.config["enable_pext"]
130
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
131
+
132
+ @property
133
+ def end_to_end_cycles(self):
134
+ value = self.config["end_to_end_cycles"]
135
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
136
+
137
+ @property
138
+ def gdbserver_enable(self):
139
+ value = self.config["gdbserver_enable"]
140
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
141
+
142
+ @property
143
+ def gdbserver_attach(self):
144
+ value = self.config["gdbserver_attach"]
145
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
146
+
147
+ @property
148
+ def gdbserver_port(self):
149
+ return int(self.config["gdbserver_port"])
150
+
151
+ @property
152
+ def vext_spec(self):
153
+ return float(self.config["vext_spec"])
154
+
155
+ @property
156
+ def embedded_vext(self):
157
+ value = self.config["embedded_vext"]
158
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
159
+
160
+ @property
161
+ def pext_spec(self):
162
+ return float(self.config["pext_spec"])
163
+
164
+ def get_default_ovpsim_args(self):
165
+ extensions_before = sort_extensions_canonical(self.extensions, lower=False, unpack=True)
166
+ extensions_after = replace_unsupported(extensions_before)
167
+ extensions_str = "".join(sort_extensions_canonical(extensions_after))
168
+ args = [
169
+ "--variant",
170
+ self.variant,
171
+ "--override",
172
+ f"riscvOVPsim/cpu/add_Extensions={extensions_str}",
173
+ "--override",
174
+ "riscvOVPsim/cpu/unaligned=T",
175
+ "--override",
176
+ "riscvOVPsim/cpu/pk/reportExitErrors=T",
177
+ ]
178
+ if self.enable_pext:
179
+ args.extend(
180
+ [
181
+ "--override",
182
+ f"riscvOVPsim/cpu/dsp_version={self.pext_spec}",
183
+ "--override",
184
+ f"riscvOVPsim/cpu/bitmanip_version={self.bitmanip_spec}",
185
+ ]
186
+ )
187
+ if self.enable_vext:
188
+ assert self.has_fpu, "V-Extension requires enabled FPU"
189
+ args.extend(
190
+ [
191
+ "--override",
192
+ "riscvOVPsim/cpu/vector_version=1.0-draft-20210130", # TODO: use vext_spec
193
+ "--override",
194
+ f"riscvOVPsim/cpu/VLEN={self.vlen}",
195
+ "--override",
196
+ f"riscvOVPsim/cpu/ELEN={self.elen}",
197
+ ]
198
+ )
199
+ args.extend(["--override", f"riscvOVPsim/cpu/mstatus_VS={int(self.enable_vext)}"])
200
+ if self.has_fpu:
201
+ assert "f" in self.extensions or "g" in self.extensions
202
+ args.extend(["--override", f"riscvOVPsim/cpu/mstatus_FS={int(self.has_fpu)}"])
203
+ if self.gdbserver_enable:
204
+ # args.append("--trace")
205
+ args.extend(["--port", str(self.gdbserver_port)])
206
+ if self.gdbserver_attach:
207
+ args.append("--gdbconsole")
208
+ return args
209
+
210
+ def exec(self, program, *args, cwd=os.getcwd(), **kwargs):
211
+ """Use target to execute a executable with given arguments"""
212
+ ovpsim_args = []
213
+
214
+ ovpsim_args.extend(["--program", str(program)])
215
+ ovpsim_args.extend(self.get_default_ovpsim_args())
216
+
217
+ if len(self.extra_args) > 0:
218
+ if isinstance(self.extra_args, str):
219
+ extra_args = self.extra_args.split(" ")
220
+ else:
221
+ extra_args = self.extra_args
222
+ ovpsim_args.extend(extra_args) # I rename args to extra_args because otherwise it overwrites *args
223
+
224
+ if self.timeout_sec > 0:
225
+ raise NotImplementedError
226
+
227
+ ret = execute(
228
+ self.ovpsim_exe.resolve(),
229
+ *ovpsim_args,
230
+ *args, # Does this work?
231
+ cwd=cwd,
232
+ **kwargs,
233
+ )
234
+ return ret
235
+
236
+ def parse_stdout(self, out):
237
+ # cpi = 1
238
+ if self.end_to_end_cycles:
239
+ cpu_cycles = re.search(r".* Simulated instructions:(.*)", out)
240
+ else:
241
+ cpu_cycles = re.search(r".* Total Cycles: (.*)", out)
242
+ if not cpu_cycles:
243
+ raise RuntimeError("unexpected script output (cycles)")
244
+ cycles = None
245
+ else:
246
+ cycles = int(cpu_cycles.group(1).replace(",", ""))
247
+ mips = None # TODO: parse mips?
248
+ mips_match = re.search(r".* Simulated MIPS:(.*)", out)
249
+ if mips_match:
250
+ mips_str = float(mips_match.group(1))
251
+ if "run too short for meaningful result" not in mips:
252
+ mips = float(mips_str)
253
+ return cycles, mips
254
+
255
+ def get_metrics(self, elf, directory, *args, handle_exit=None):
256
+ out = ""
257
+ if self.print_outputs:
258
+ out += self.exec(elf, *args, cwd=directory, live=True, handle_exit=handle_exit)
259
+ else:
260
+ out += self.exec(
261
+ elf, *args, cwd=directory, live=False, print_func=lambda *args, **kwargs: None, handle_exit=handle_exit
262
+ )
263
+ cycles, mips = self.parse_stdout(out)
264
+
265
+ metrics = Metrics()
266
+ metrics.add("Cycles", cycles)
267
+ if mips:
268
+ metrics.add("MIPS", mips, optional=True)
269
+
270
+ return metrics, out, []
271
+
272
+ def get_platform_defs(self, platform):
273
+ ret = super().get_platform_defs(platform)
274
+ if self.enable_pext:
275
+ major, minor = str(self.pext_spec).split(".")[:2]
276
+ ret["RISCV_RVP_MAJOR"] = major
277
+ ret["RISCV_RVP_MINOR"] = minor
278
+ if self.enable_vext:
279
+ major, minor = str(self.vext_spec).split(".")[:2]
280
+ ret["RISCV_RVV_MAJOR"] = major
281
+ ret["RISCV_RVV_MINOR"] = minor
282
+ ret["RISCV_RVV_VLEN"] = self.vlen
283
+ return ret
284
+
285
+ def get_backend_config(self, backend):
286
+ ret = super().get_backend_config(backend)
287
+ if backend in SUPPORTED_TVM_BACKENDS:
288
+ ret.update({"target_model": "ovpsim-rv32"})
289
+ if self.enable_pext or self.enable_vext:
290
+ ret.update(
291
+ {
292
+ # Warning: passing kernel layouts does not work with upstream TVM
293
+ # TODO: allow passing map?
294
+ "desired_layout": "NHWC:HWOI",
295
+ }
296
+ )
297
+ return ret
298
+
299
+
300
+ if __name__ == "__main__":
301
+ cli(target=OVPSimTarget)
@@ -0,0 +1,185 @@
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 RISC-V Target definitions"""
20
+
21
+ from pathlib import Path
22
+
23
+ from mlonmcu.logging import get_logger
24
+ from mlonmcu.feature.features import SUPPORTED_TVM_BACKENDS
25
+ from mlonmcu.target import Target
26
+ from .util import sort_extensions_canonical, join_extensions
27
+
28
+ logger = get_logger()
29
+
30
+
31
+ class RISCVTarget(Target):
32
+ """Common base class for RISCV-like targets. Please do not use this as a target itself!"""
33
+
34
+ FEATURES = Target.FEATURES + []
35
+
36
+ DEFAULTS = {
37
+ **Target.DEFAULTS,
38
+ "xlen": 32,
39
+ "extensions": ["g", "c"], # TODO overwrite extensions elegantly
40
+ "timeout_sec": 0, # disabled
41
+ "extra_args": "",
42
+ "fpu": "double", # allowed: none, single, double
43
+ "arch": None,
44
+ "abi": None,
45
+ "attr": "",
46
+ }
47
+ REQUIRED = ["riscv_gcc.install_dir", "riscv_gcc.name", "riscv_gcc.variant"]
48
+ PUPL_GCC_TOOLCHAIN_REQUIRED = ["pulp_gcc.install_dir", "pulp_gcc.name"]
49
+ OPTIONAL = ["llvm.install_dir"]
50
+
51
+ @property
52
+ def riscv_gcc_prefix(self):
53
+ return Path(self.config["riscv_gcc.install_dir"])
54
+
55
+ @property
56
+ def riscv_gcc_basename(self):
57
+ return Path(self.config["riscv_gcc.name"])
58
+
59
+ @property
60
+ def pulp_gcc_prefix(self):
61
+ return Path(self.config["pulp_gcc.install_dir"])
62
+
63
+ @property
64
+ def pulp_gcc_basename(self):
65
+ return Path(self.config["pulp_gcc.name"])
66
+
67
+ @property
68
+ def gcc_variant(self):
69
+ return self.config["riscv_gcc.variant"]
70
+
71
+ @property
72
+ def xlen(self):
73
+ return int(self.config["xlen"])
74
+
75
+ @property
76
+ def extensions(self):
77
+ exts = self.config.get("extensions", []).copy()
78
+ if not isinstance(exts, list):
79
+ exts = exts.split(",")
80
+ if "g" not in exts:
81
+ required = []
82
+ if self.fpu == "double":
83
+ required.append("d")
84
+ required.append("f")
85
+ if self.fpu == "single":
86
+ required.append("f")
87
+ for ext in required:
88
+ if ext not in exts:
89
+ exts.append(ext)
90
+ return exts
91
+
92
+ @property
93
+ def arch(self):
94
+ temp = self.config["arch"] # TODO: allow underscores and versions
95
+ if temp:
96
+ return temp
97
+ else:
98
+ exts_str = join_extensions(sort_extensions_canonical(self.extensions, lower=True))
99
+ return f"rv{self.xlen}{exts_str}"
100
+
101
+ @property
102
+ def abi(self):
103
+ temp = self.config["abi"]
104
+ if temp:
105
+ return temp
106
+ else:
107
+ if self.xlen == 32:
108
+ temp = "ilp32"
109
+ elif self.xlen == 64:
110
+ temp = "lp64"
111
+ else:
112
+ raise RuntimeError(f"Invalid xlen: {self.xlen}")
113
+ if "d" in self.extensions or "g" in self.extensions:
114
+ temp += "d"
115
+ elif "f" in self.extensions:
116
+ temp += "f"
117
+ return temp
118
+
119
+ @property
120
+ def attr(self):
121
+ attrs = str(self.config["attr"]).split(",")
122
+ if len(attrs) == 1 and len(attrs[0]) == 0:
123
+ attrs = []
124
+ for ext in sort_extensions_canonical(self.extensions, lower=True, unpack=True):
125
+ attrs.append(f"+{ext}")
126
+ attrs = list(set(attrs))
127
+ return ",".join(attrs)
128
+
129
+ @property
130
+ def extra_args(self):
131
+ ret = self.config["extra_args"]
132
+ if isinstance(ret, str):
133
+ if len(ret) == 0:
134
+ ret = []
135
+ else:
136
+ ret = [ret] # TODO: properly split quoted args
137
+ return ret
138
+
139
+ @property
140
+ def timeout_sec(self):
141
+ return int(self.config["timeout_sec"])
142
+
143
+ @property
144
+ def fpu(self):
145
+ value = self.config["fpu"]
146
+ if value is None or not value:
147
+ value = "none"
148
+ assert value in ["none", "single", "double"]
149
+ return value
150
+
151
+ @property
152
+ def has_fpu(self):
153
+ return self.fpu != "none"
154
+
155
+ def get_target_system(self):
156
+ return "generic_riscv" # TODO: rename to generic-rv32 for compatibility with LLVM
157
+
158
+ def get_platform_defs(self, platform):
159
+ ret = super().get_platform_defs(platform)
160
+ if "riscv_gcc.install_dir" in self.REQUIRED: # the target chooses to use the riscv_gcc toolchain
161
+ ret["RISCV_ELF_GCC_PREFIX"] = self.riscv_gcc_prefix
162
+ ret["RISCV_ELF_GCC_BASENAME"] = self.riscv_gcc_basename
163
+ elif "pulp_gcc.install_dir" in self.REQUIRED: # the target chooses to use the pulp_gcc toolchain
164
+ ret["RISCV_ELF_GCC_PREFIX"] = self.pulp_gcc_prefix
165
+ ret["RISCV_ELF_GCC_BASENAME"] = self.pulp_gcc_basename
166
+ ret["RISCV_ARCH"] = self.arch
167
+ ret["RISCV_ABI"] = self.abi
168
+ ret["RISCV_ATTR"] = self.attr # TODO: use for clang
169
+ return ret
170
+
171
+ def get_arch(self):
172
+ return "riscv"
173
+
174
+ def get_backend_config(self, backend):
175
+ if backend in SUPPORTED_TVM_BACKENDS:
176
+ return {
177
+ "target_device": "riscv_cpu",
178
+ "target_march": self.arch,
179
+ "target_model": "unknown",
180
+ "target_mtriple": self.riscv_gcc_basename, # TODO: riscv32-esp-elf for esp32c3!
181
+ "target_mabi": self.abi,
182
+ "target_mattr": self.attr,
183
+ "target_mcpu": f"generic-rv{self.xlen}",
184
+ }
185
+ return {}
@@ -0,0 +1,166 @@
1
+ # Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
2
+ #
3
+ # This file is part of MLonMCU.
4
+ # See https://github.com/tum-ei-eda/mlonmcu.git for further info.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ """MLonMCU RISC-V QEMU Target definitions"""
19
+
20
+ import os
21
+
22
+ import re
23
+
24
+ from mlonmcu.logging import get_logger
25
+ from mlonmcu.config import str2bool
26
+ from mlonmcu.target.common import cli, execute
27
+ from mlonmcu.target.metrics import Metrics
28
+ from .riscv import RISCVTarget
29
+ from .util import update_extensions
30
+
31
+ logger = get_logger()
32
+
33
+ # TODO: create (Riscv)QemuTarget with variable machine
34
+
35
+
36
+ class RiscvQemuTarget(RISCVTarget):
37
+ """Target using a spike machine in the QEMU simulator"""
38
+
39
+ FEATURES = RISCVTarget.FEATURES + ["vext"]
40
+
41
+ DEFAULTS = {
42
+ **RISCVTarget.DEFAULTS,
43
+ "vlen": 0, # TODO: check allowed range [128, 1024]
44
+ "elen": 32,
45
+ "enable_vext": False,
46
+ "vext_spec": 1.0,
47
+ "embedded_vext": False,
48
+ }
49
+ REQUIRED = RISCVTarget.REQUIRED + ["riscv32_qemu.exe"] # TODO: 64 bit?
50
+
51
+ def __init__(self, name="riscv_qemu", features=None, config=None):
52
+ super().__init__(name, features=features, config=config)
53
+
54
+ @property
55
+ def riscv32_qemu_exe(self):
56
+ return self.config["riscv32_qemu.exe"]
57
+
58
+ @property
59
+ def extensions(self):
60
+ exts = super().extensions
61
+ return update_extensions(exts, vext=self.enable_vext, elen=self.elen, embedded=self.embedded_vext, fpu=self.fpu)
62
+
63
+ @property
64
+ def attr(self):
65
+ attrs = super().attr.split(",")
66
+ if self.enable_vext and f"+zvl{self.vlen}b" not in attrs:
67
+ attrs.append(f"+zvl{self.vlen}b")
68
+ return ",".join(attrs)
69
+
70
+ @property
71
+ def vlen(self):
72
+ return int(self.config["vlen"])
73
+
74
+ @property
75
+ def elen(self):
76
+ return int(self.config["elen"])
77
+
78
+ @property
79
+ def enable_vext(self):
80
+ value = self.config["enable_vext"]
81
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
82
+
83
+ @property
84
+ def vext_spec(self):
85
+ return float(self.config["vext_spec"])
86
+
87
+ @property
88
+ def embedded_vext(self):
89
+ value = self.config["embedded_vext"]
90
+ return str2bool(value) if not isinstance(value, (bool, int)) else value
91
+
92
+ def get_cpu_str(self):
93
+ cfg = {}
94
+ if self.enable_vext:
95
+ cfg["v"] = "true"
96
+ cfg["vlen"] = str(self.vlen)
97
+ cfg["elen"] = str(self.elen)
98
+ cfg["vext_spec"] = "v1.0"
99
+ return ",".join([f"rv{self.xlen}"] + [f"{key}={value}" for key, value in cfg.items()])
100
+
101
+ def get_qemu_args(self, program):
102
+ args = []
103
+ args.extend(["-machine", "spike"])
104
+ args.extend(["-bios", "none"])
105
+ args.extend(["-icount", "shift=1"])
106
+ args.extend(["-cpu", self.get_cpu_str()])
107
+ args.append("-nographic")
108
+ args.extend(["-kernel", program])
109
+ return args
110
+
111
+ def exec(self, program, *args, cwd=os.getcwd(), **kwargs):
112
+ """Use target to execute a executable with given arguments"""
113
+ assert len(args) == 0, "Qemu does not support passing arguments."
114
+ qemu_args = self.get_qemu_args(program)
115
+
116
+ if self.timeout_sec > 0:
117
+ raise NotImplementedError
118
+ else:
119
+ ret = execute(
120
+ self.riscv32_qemu_exe,
121
+ *qemu_args,
122
+ cwd=cwd,
123
+ **kwargs,
124
+ )
125
+ return ret
126
+
127
+ def parse_stdout(self, out, handle_exit=None):
128
+ cpu_cycles = re.search(r"Total Cycles: (.*)", out)
129
+ if not cpu_cycles:
130
+ logger.warning("unexpected script output (cycles)")
131
+ cycles = None
132
+ else:
133
+ cycles = int(float(cpu_cycles.group(1)))
134
+ return cycles
135
+
136
+ def get_metrics(self, elf, directory, *args, handle_exit=None):
137
+ out = ""
138
+
139
+ if self.print_outputs:
140
+ out += self.exec(elf, *args, cwd=directory, live=True, handle_exit=handle_exit)
141
+ else:
142
+ out += self.exec(
143
+ elf, *args, cwd=directory, live=False, print_func=lambda *args, **kwargs: None, handle_exit=handle_exit
144
+ )
145
+ total_cycles = self.parse_stdout(out, handle_exit=handle_exit)
146
+
147
+ metrics = Metrics()
148
+ metrics.add("Cycles", total_cycles)
149
+
150
+ return metrics, out, []
151
+
152
+ def get_target_system(self):
153
+ return self.name
154
+
155
+ def get_platform_defs(self, platform):
156
+ ret = super().get_platform_defs(platform)
157
+ if self.enable_vext:
158
+ major, minor = str(self.vext_spec).split(".")[:2]
159
+ ret["RISCV_RVV_MAJOR"] = major
160
+ ret["RISCV_RVV_MINOR"] = minor
161
+ ret["RISCV_RVV_VLEN"] = self.vlen
162
+ return ret
163
+
164
+
165
+ if __name__ == "__main__":
166
+ cli(target=RiscvQemuTarget)