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.
- mlonmcu/__init__.py +26 -0
- mlonmcu/artifact.py +172 -0
- mlonmcu/cli/__init__.py +19 -0
- mlonmcu/cli/build.py +119 -0
- mlonmcu/cli/cleanup.py +75 -0
- mlonmcu/cli/common.py +227 -0
- mlonmcu/cli/compile.py +87 -0
- mlonmcu/cli/env.py +68 -0
- mlonmcu/cli/export.py +93 -0
- mlonmcu/cli/flow.py +67 -0
- mlonmcu/cli/helper/__init__.py +18 -0
- mlonmcu/cli/helper/filter.py +25 -0
- mlonmcu/cli/helper/parse.py +159 -0
- mlonmcu/cli/init.py +130 -0
- mlonmcu/cli/load.py +87 -0
- mlonmcu/cli/main.py +116 -0
- mlonmcu/cli/models.py +48 -0
- mlonmcu/cli/run.py +56 -0
- mlonmcu/cli/setup.py +136 -0
- mlonmcu/cli/tune.py +48 -0
- mlonmcu/config.py +219 -0
- mlonmcu/context/__init__.py +22 -0
- mlonmcu/context/context.py +545 -0
- mlonmcu/context/read_write_filelock.py +327 -0
- mlonmcu/environment/__init__.py +18 -0
- mlonmcu/environment/config.py +214 -0
- mlonmcu/environment/environment.py +501 -0
- mlonmcu/environment/init.py +191 -0
- mlonmcu/environment/list.py +81 -0
- mlonmcu/environment/loader.py +250 -0
- mlonmcu/environment/templates.py +69 -0
- mlonmcu/environment/writer.py +117 -0
- mlonmcu/feature/__init__.py +18 -0
- mlonmcu/feature/feature.py +230 -0
- mlonmcu/feature/features.py +1537 -0
- mlonmcu/feature/type.py +33 -0
- mlonmcu/flow/__init__.py +61 -0
- mlonmcu/flow/backend.py +234 -0
- mlonmcu/flow/framework.py +69 -0
- mlonmcu/flow/tflm/__init__.py +23 -0
- mlonmcu/flow/tflm/backend/__init__.py +23 -0
- mlonmcu/flow/tflm/backend/backend.py +47 -0
- mlonmcu/flow/tflm/backend/tflmc.py +129 -0
- mlonmcu/flow/tflm/backend/tflmi.py +385 -0
- mlonmcu/flow/tflm/framework.py +81 -0
- mlonmcu/flow/tvm/__init__.py +23 -0
- mlonmcu/flow/tvm/backend/__init__.py +26 -0
- mlonmcu/flow/tvm/backend/backend.py +282 -0
- mlonmcu/flow/tvm/backend/model_info.py +307 -0
- mlonmcu/flow/tvm/backend/python_utils.py +36 -0
- mlonmcu/flow/tvm/backend/tuner.py +41 -0
- mlonmcu/flow/tvm/backend/tvmaot.py +162 -0
- mlonmcu/flow/tvm/backend/tvmaotplus.py +51 -0
- mlonmcu/flow/tvm/backend/tvmc_utils.py +172 -0
- mlonmcu/flow/tvm/backend/tvmcg.py +102 -0
- mlonmcu/flow/tvm/backend/tvmllvm.py +106 -0
- mlonmcu/flow/tvm/backend/tvmrt.py +151 -0
- mlonmcu/flow/tvm/backend/wrapper.py +645 -0
- mlonmcu/flow/tvm/framework.py +96 -0
- mlonmcu/logging.py +79 -0
- mlonmcu/mlonmcu.py +19 -0
- mlonmcu/models/__init__.py +31 -0
- mlonmcu/models/convert_data.py +107 -0
- mlonmcu/models/frontend.py +571 -0
- mlonmcu/models/group.py +29 -0
- mlonmcu/models/lookup.py +345 -0
- mlonmcu/models/metadata.py +133 -0
- mlonmcu/models/model.py +104 -0
- mlonmcu/models/options.py +64 -0
- mlonmcu/models/utils.py +136 -0
- mlonmcu/platform/__init__.py +27 -0
- mlonmcu/platform/_platform.py +46 -0
- mlonmcu/platform/espidf/__init__.py +25 -0
- mlonmcu/platform/espidf/espidf.py +489 -0
- mlonmcu/platform/espidf/espidf_target.py +257 -0
- mlonmcu/platform/lookup.py +126 -0
- mlonmcu/platform/microtvm/__init__.py +25 -0
- mlonmcu/platform/microtvm/microtvm.py +580 -0
- mlonmcu/platform/microtvm/microtvm_arduino_target.py +68 -0
- mlonmcu/platform/microtvm/microtvm_backend.py +64 -0
- mlonmcu/platform/microtvm/microtvm_espidf_target.py +94 -0
- mlonmcu/platform/microtvm/microtvm_etissvp_target.py +98 -0
- mlonmcu/platform/microtvm/microtvm_host_target.py +46 -0
- mlonmcu/platform/microtvm/microtvm_spike_target.py +230 -0
- mlonmcu/platform/microtvm/microtvm_target.py +189 -0
- mlonmcu/platform/microtvm/microtvm_template_target.py +55 -0
- mlonmcu/platform/microtvm/microtvm_zephyr_target.py +91 -0
- mlonmcu/platform/mlif/__init__.py +25 -0
- mlonmcu/platform/mlif/mlif.py +300 -0
- mlonmcu/platform/mlif/mlif_target.py +86 -0
- mlonmcu/platform/platform.py +244 -0
- mlonmcu/platform/tvm/__init__.py +25 -0
- mlonmcu/platform/tvm/tvm.py +429 -0
- mlonmcu/platform/tvm/tvm_backend.py +57 -0
- mlonmcu/platform/tvm/tvm_target.py +165 -0
- mlonmcu/platform/zephyr/__init__.py +25 -0
- mlonmcu/platform/zephyr/zephyr.py +450 -0
- mlonmcu/platform/zephyr/zephyr_target.py +110 -0
- mlonmcu/plugins.py +26 -0
- mlonmcu/report.py +99 -0
- mlonmcu/session/__init__.py +18 -0
- mlonmcu/session/postprocess/__init__.py +43 -0
- mlonmcu/session/postprocess/postprocess.py +62 -0
- mlonmcu/session/postprocess/postprocesses.py +487 -0
- mlonmcu/session/run.py +1008 -0
- mlonmcu/session/session.py +373 -0
- mlonmcu/setup/__init__.py +18 -0
- mlonmcu/setup/cache.py +147 -0
- mlonmcu/setup/gen_requirements.py +619 -0
- mlonmcu/setup/setup.py +285 -0
- mlonmcu/setup/task.py +380 -0
- mlonmcu/setup/tasks/__init__.py +40 -0
- mlonmcu/setup/tasks/arm_gcc.py +58 -0
- mlonmcu/setup/tasks/cmsisnn.py +151 -0
- mlonmcu/setup/tasks/common.py +36 -0
- mlonmcu/setup/tasks/corstone300.py +64 -0
- mlonmcu/setup/tasks/espidf.py +87 -0
- mlonmcu/setup/tasks/etiss.py +147 -0
- mlonmcu/setup/tasks/llvm.py +67 -0
- mlonmcu/setup/tasks/mlif.py +49 -0
- mlonmcu/setup/tasks/muriscvnn.py +166 -0
- mlonmcu/setup/tasks/pulp.py +192 -0
- mlonmcu/setup/tasks/riscv_gcc.py +146 -0
- mlonmcu/setup/tasks/spike.py +190 -0
- mlonmcu/setup/tasks/tf.py +92 -0
- mlonmcu/setup/tasks/tflite.py +59 -0
- mlonmcu/setup/tasks/tflmc.py +141 -0
- mlonmcu/setup/tasks/tvm.py +172 -0
- mlonmcu/setup/tasks/utvmcg.py +96 -0
- mlonmcu/setup/tasks/zephyr.py +119 -0
- mlonmcu/setup/utils.py +374 -0
- mlonmcu/target/__init__.py +37 -0
- mlonmcu/target/_target.py +41 -0
- mlonmcu/target/arm/__init__.py +3 -0
- mlonmcu/target/arm/corstone300.py +235 -0
- mlonmcu/target/arm/util.py +109 -0
- mlonmcu/target/common.py +194 -0
- mlonmcu/target/elf.py +256 -0
- mlonmcu/target/host_x86.py +84 -0
- mlonmcu/target/metrics.py +75 -0
- mlonmcu/target/riscv/__init__.py +7 -0
- mlonmcu/target/riscv/etiss_pulpino.py +462 -0
- mlonmcu/target/riscv/gvsoc_pulp.py +215 -0
- mlonmcu/target/riscv/ovpsim.py +301 -0
- mlonmcu/target/riscv/riscv.py +185 -0
- mlonmcu/target/riscv/riscv_qemu.py +166 -0
- mlonmcu/target/riscv/spike.py +243 -0
- mlonmcu/target/riscv/util.py +134 -0
- mlonmcu/target/target.py +200 -0
- mlonmcu/utils.py +49 -0
- mlonmcu/version.py +21 -0
- mlonmcu-0.3.0.dev0.dist-info/LICENSE +202 -0
- mlonmcu-0.3.0.dev0.dist-info/METADATA +343 -0
- mlonmcu-0.3.0.dev0.dist-info/NOTICE +8 -0
- mlonmcu-0.3.0.dev0.dist-info/RECORD +376 -0
- mlonmcu-0.3.0.dev0.dist-info/WHEEL +5 -0
- mlonmcu-0.3.0.dev0.dist-info/entry_points.txt +3 -0
- mlonmcu-0.3.0.dev0.dist-info/top_level.txt +1 -0
- resources/frameworks/tvm/crt_config/README.md +7 -0
- resources/frameworks/tvm/crt_config/crt_config.h +53 -0
- resources/frameworks/tvm/tuning_records/riscv_cpu_v0.01.log.best +46 -0
- resources/patches/fix_esp32c3_march.patch +20 -0
- resources/patches/pulp_freertos_support.patch +55 -0
- resources/platforms/espidf/micro_speech_esp32devboard/CMakeLists.txt +29 -0
- resources/platforms/espidf/micro_speech_esp32devboard/README.md +70 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/CMakeLists.txt +78 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/Kconfig +76 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/default_data.c +26 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/default_model_support/process_input.c +35 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/default_model_support/process_output.c +45 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/include/exit.h +26 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/include/ml_interface.h +70 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/include/printing.h +31 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/ml_interface.c +74 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/ml_interface_tflm.cc +64 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/ml_interface_tvm.c +53 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/tflite-lib/CMakeLists.txt +140 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/tflite-lib/Kconfig +8 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/tvm-lib/CMakeLists.txt +66 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/tvm-lib/Kconfig +7 -0
- resources/platforms/espidf/micro_speech_esp32devboard/example_test.py +38 -0
- resources/platforms/espidf/micro_speech_esp32devboard/info.txt +9 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/CMakeLists.txt +58 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/audio_provider.cc +193 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/audio_provider.h +49 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/command_responder.cc +53 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/command_responder.h +35 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/feature_provider.cc +132 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/feature_provider.cc.orig +145 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/feature_provider.h +55 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/COPYING +11 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/_kiss_fft_guts.h +168 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/kiss_fft.c +408 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/kiss_fft.h +124 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/tools/kiss_fftr.c +159 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/tools/kiss_fftr.h +46 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/main.cc +63 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/main_functions.cc +204 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/main_functions.h +37 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/micro_features_generator.cc +121 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/micro_features_generator.h +38 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/micro_model_settings.cc +23 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/micro_model_settings.h +43 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/bits.h +102 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft.cc +52 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft.h +50 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft_util.cc +69 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft_util.h +34 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank.c +134 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank.h +63 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank_util.c +220 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank_util.h +50 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend.c +72 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend.h +64 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend_util.c +85 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend_util.h +52 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/kiss_fft_common.h +48 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/kiss_fft_int16.cc +8 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/kiss_fft_int16.h +34 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_lut.c +30 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_lut.h +40 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale.c +83 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale.h +39 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale_util.c +27 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale_util.h +45 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction.c +51 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction.h +46 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction_util.c +45 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction_util.h +50 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control.c +56 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control.h +47 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control_util.c +92 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control_util.h +57 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window.c +70 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window.h +49 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window_util.c +73 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window_util.h +45 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/pins.c +14 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/pins.h +30 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/recognize_commands.cc +150 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/recognize_commands.h +173 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/ringbuf.c +333 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/ringbuf.h +74 -0
- resources/platforms/espidf/micro_speech_esp32devboard/sdkconfig.defaults +36 -0
- resources/platforms/espidf/project/CMakeLists.txt +29 -0
- resources/platforms/espidf/project/README.md +70 -0
- resources/platforms/espidf/project/components/mlif/CMakeLists.txt +77 -0
- resources/platforms/espidf/project/components/mlif/Kconfig +76 -0
- resources/platforms/espidf/project/components/mlif/default_data.c +26 -0
- resources/platforms/espidf/project/components/mlif/default_model_support/process_input.c +35 -0
- resources/platforms/espidf/project/components/mlif/default_model_support/process_output.c +45 -0
- resources/platforms/espidf/project/components/mlif/include/exit.h +26 -0
- resources/platforms/espidf/project/components/mlif/include/ml_interface.h +60 -0
- resources/platforms/espidf/project/components/mlif/include/printing.h +31 -0
- resources/platforms/espidf/project/components/mlif/ml_interface.c +54 -0
- resources/platforms/espidf/project/components/mlif/ml_interface_tflm.cc +40 -0
- resources/platforms/espidf/project/components/mlif/ml_interface_tvm.c +40 -0
- resources/platforms/espidf/project/components/tflite-lib/CMakeLists.txt +142 -0
- resources/platforms/espidf/project/components/tflite-lib/Kconfig +8 -0
- resources/platforms/espidf/project/components/tvm-lib/CMakeLists.txt +66 -0
- resources/platforms/espidf/project/components/tvm-lib/Kconfig +7 -0
- resources/platforms/espidf/project/example_test.py +38 -0
- resources/platforms/espidf/project/main/CMakeLists.txt +25 -0
- resources/platforms/espidf/project/main/main.c +57 -0
- resources/platforms/espidf/project/sdkconfig.defaults +26 -0
- resources/platforms/zephyr/project/CMakeLists.txt +22 -0
- resources/platforms/zephyr/project/Kconfig +101 -0
- resources/platforms/zephyr/project/README.rst +33 -0
- resources/platforms/zephyr/project/cmake/AddAllSubdirs.cmake +21 -0
- resources/platforms/zephyr/project/cmake/ChooseTarget.cmake +22 -0
- resources/platforms/zephyr/project/cmake/LinkTFLite.cmake +223 -0
- resources/platforms/zephyr/project/cmake/LinkTVM.cmake +68 -0
- resources/platforms/zephyr/project/cmake/LookupClang.cmake +41 -0
- resources/platforms/zephyr/project/cmake/backends/tflmc.cmake +5 -0
- resources/platforms/zephyr/project/cmake/backends/tflmi.cmake +5 -0
- resources/platforms/zephyr/project/cmake/backends/tvmaot.cmake +10 -0
- resources/platforms/zephyr/project/cmake/backends/tvmaotplus.cmake +10 -0
- resources/platforms/zephyr/project/cmake/backends/tvmcg.cmake +10 -0
- resources/platforms/zephyr/project/cmake/backends/tvmllvm.cmake +8 -0
- resources/platforms/zephyr/project/cmake/backends/tvmrt.cmake +8 -0
- resources/platforms/zephyr/project/cmake/extras.cmake +9 -0
- resources/platforms/zephyr/project/cmake/features/auto_vectorize_gcc.cmake +65 -0
- resources/platforms/zephyr/project/cmake/features/auto_vectorize_llvm.cmake +20 -0
- resources/platforms/zephyr/project/cmake/features/cmsisnn.cmake +86 -0
- resources/platforms/zephyr/project/cmake/features/muriscvnn.cmake +87 -0
- resources/platforms/zephyr/project/cmake/frameworks/tflm.cmake +1 -0
- resources/platforms/zephyr/project/cmake/frameworks/tflm_mlif.cmake +8 -0
- resources/platforms/zephyr/project/cmake/frameworks/tvm.cmake +1 -0
- resources/platforms/zephyr/project/cmake/frameworks/tvm_mlif.cmake +37 -0
- resources/platforms/zephyr/project/lib/CMakeLists.txt +13 -0
- resources/platforms/zephyr/project/lib/drivers/fake_input.c +10 -0
- resources/platforms/zephyr/project/lib/drivers/fake_input.h +8 -0
- resources/platforms/zephyr/project/lib/ml_interface/CMakeLists.txt +31 -0
- resources/platforms/zephyr/project/lib/ml_interface/default_data.c +8 -0
- resources/platforms/zephyr/project/lib/ml_interface/default_model_support/CMakeLists.txt +2 -0
- resources/platforms/zephyr/project/lib/ml_interface/default_model_support/process_input.c +17 -0
- resources/platforms/zephyr/project/lib/ml_interface/default_model_support/process_output.c +27 -0
- resources/platforms/zephyr/project/lib/ml_interface/ml_interface.c +36 -0
- resources/platforms/zephyr/project/lib/ml_interface/ml_interface.h +47 -0
- resources/platforms/zephyr/project/lib/ml_interface/ml_interface_tflm.cc +22 -0
- resources/platforms/zephyr/project/lib/ml_interface/ml_interface_tvm.c +22 -0
- resources/platforms/zephyr/project/lib/support/CMakeLists.txt +2 -0
- resources/platforms/zephyr/project/lib/support/dummy.c +0 -0
- resources/platforms/zephyr/project/lib/support/exit.h +8 -0
- resources/platforms/zephyr/project/lib/support/printing.h +11 -0
- resources/platforms/zephyr/project/lib/support/quantize.h +23 -0
- resources/platforms/zephyr/project/lib/targets/corstone300.c +62 -0
- resources/platforms/zephyr/project/lib/targets/default.c +2 -0
- resources/platforms/zephyr/project/lib/targets/etiss_pulpino.c +112 -0
- resources/platforms/zephyr/project/lib/targets/generic_riscv.c +112 -0
- resources/platforms/zephyr/project/lib/targets/riscv_qemu.c +112 -0
- resources/platforms/zephyr/project/lib/targets/target.h +2 -0
- resources/platforms/zephyr/project/prj.conf +11 -0
- resources/platforms/zephyr/project/sample.yaml +19 -0
- resources/platforms/zephyr/project/src/main.c +71 -0
- resources/platforms/zephyr/project2/CMakeLists.txt +72 -0
- resources/platforms/zephyr/project2/Kconfig +101 -0
- resources/platforms/zephyr/project2/README.rst +33 -0
- resources/platforms/zephyr/project2/cmake/AddAllSubdirs.cmake +21 -0
- resources/platforms/zephyr/project2/cmake/ChooseTarget.cmake +22 -0
- resources/platforms/zephyr/project2/cmake/LinkTFLite.cmake +223 -0
- resources/platforms/zephyr/project2/cmake/LinkTVM.cmake +68 -0
- resources/platforms/zephyr/project2/cmake/LookupClang.cmake +41 -0
- resources/platforms/zephyr/project2/cmake/backends/tflmc.cmake +5 -0
- resources/platforms/zephyr/project2/cmake/backends/tflmi.cmake +5 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmaot.cmake +10 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmaotplus.cmake +10 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmcg.cmake +10 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmllvm.cmake +8 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmrt.cmake +8 -0
- resources/platforms/zephyr/project2/cmake/extras.cmake +9 -0
- resources/platforms/zephyr/project2/cmake/features/auto_vectorize_gcc.cmake +65 -0
- resources/platforms/zephyr/project2/cmake/features/auto_vectorize_llvm.cmake +20 -0
- resources/platforms/zephyr/project2/cmake/features/cmsisnn.cmake +86 -0
- resources/platforms/zephyr/project2/cmake/features/muriscvnn.cmake +87 -0
- resources/platforms/zephyr/project2/cmake/frameworks/tflm.cmake +1 -0
- resources/platforms/zephyr/project2/cmake/frameworks/tflm_mlif.cmake +8 -0
- resources/platforms/zephyr/project2/cmake/frameworks/tvm.cmake +1 -0
- resources/platforms/zephyr/project2/cmake/frameworks/tvm_mlif.cmake +37 -0
- resources/platforms/zephyr/project2/default_data.c +8 -0
- resources/platforms/zephyr/project2/default_model_support/CMakeLists.txt +3 -0
- resources/platforms/zephyr/project2/default_model_support/process_input.c +17 -0
- resources/platforms/zephyr/project2/default_model_support/process_output.c +27 -0
- resources/platforms/zephyr/project2/lib/CMakeLists.txt +13 -0
- resources/platforms/zephyr/project2/lib/drivers/fake_input.c +10 -0
- resources/platforms/zephyr/project2/lib/drivers/fake_input.h +8 -0
- resources/platforms/zephyr/project2/lib/support/CMakeLists.txt +2 -0
- resources/platforms/zephyr/project2/lib/support/dummy.c +0 -0
- resources/platforms/zephyr/project2/lib/support/exit.h +8 -0
- resources/platforms/zephyr/project2/lib/support/printing.h +11 -0
- resources/platforms/zephyr/project2/lib/support/quantize.h +23 -0
- resources/platforms/zephyr/project2/lib/targets/corstone300.c +62 -0
- resources/platforms/zephyr/project2/lib/targets/default.c +2 -0
- resources/platforms/zephyr/project2/lib/targets/etiss_pulpino.c +112 -0
- resources/platforms/zephyr/project2/lib/targets/generic_riscv.c +112 -0
- resources/platforms/zephyr/project2/lib/targets/riscv_qemu.c +112 -0
- resources/platforms/zephyr/project2/lib/targets/target.h +2 -0
- resources/platforms/zephyr/project2/ml_interface.c +36 -0
- resources/platforms/zephyr/project2/ml_interface.h +47 -0
- resources/platforms/zephyr/project2/ml_interface_tflm.cc +22 -0
- resources/platforms/zephyr/project2/ml_interface_tvm.c +22 -0
- resources/platforms/zephyr/project2/prj.conf +13 -0
- resources/platforms/zephyr/project2/sample.yaml +19 -0
- resources/platforms/zephyr/project2/settings.json +6 -0
- resources/platforms/zephyr/project2/src/main.c +35 -0
- resources/pycharm/.run/README.md +73 -0
- resources/pycharm/.run/step1_ init env.run.xml +24 -0
- resources/pycharm/.run/step2_ setup.run.xml +25 -0
- resources/pycharm/.run/step3_ run resnet on pulpxpulpissimo.run.xml +25 -0
- resources/templates/default.yml.j2 +258 -0
- resources/templates/dev.yml.j2 +212 -0
- resources/templates/minimal.yml.j2 +234 -0
- resources/templates/phi.yml.j2 +282 -0
- resources/templates/pulp.yml.j2 +267 -0
- resources/templates/research.yml.j2 +237 -0
- 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)
|