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,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)
|