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,189 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
|
|
3
|
+
#
|
|
4
|
+
# This file is part of MLonMCU.
|
|
5
|
+
# See https://github.com/tum-ei-eda/mlonmcu.git for further info.
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
import re
|
|
20
|
+
import os
|
|
21
|
+
|
|
22
|
+
from mlonmcu.target.target import Target
|
|
23
|
+
from mlonmcu.target.metrics import Metrics
|
|
24
|
+
|
|
25
|
+
from mlonmcu.logging import get_logger
|
|
26
|
+
|
|
27
|
+
from .microtvm_zephyr_target import ZephyrMicroTvmPlatformTarget
|
|
28
|
+
from .microtvm_arduino_target import ArduinoMicroTvmPlatformTarget
|
|
29
|
+
from .microtvm_espidf_target import EspidfMicroTvmPlatformTarget
|
|
30
|
+
from .microtvm_host_target import HostMicroTvmPlatformTarget
|
|
31
|
+
from .microtvm_etissvp_target import EtissvpMicroTvmPlatformTarget
|
|
32
|
+
from .microtvm_spike_target import SpikeMicroTvmPlatformTarget
|
|
33
|
+
|
|
34
|
+
logger = get_logger()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def name2template(name):
|
|
38
|
+
return name.replace("microtvm_", "")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
MICROTVM_PLATFORM_TARGET_REGISTRY = {}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def register_microtvm_platform_target(target_name, t, override=False):
|
|
45
|
+
global MICROTVM_PLATFORM_TARGET_REGISTRY
|
|
46
|
+
|
|
47
|
+
if target_name in MICROTVM_PLATFORM_TARGET_REGISTRY and not override:
|
|
48
|
+
raise RuntimeError(f"MicroTVM platform target {target_name} is already registered")
|
|
49
|
+
MICROTVM_PLATFORM_TARGET_REGISTRY[target_name] = t
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def get_microtvm_platform_targets():
|
|
53
|
+
return MICROTVM_PLATFORM_TARGET_REGISTRY
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
register_microtvm_platform_target("microtvm_zephyr", ZephyrMicroTvmPlatformTarget)
|
|
57
|
+
register_microtvm_platform_target("microtvm_arduino", ArduinoMicroTvmPlatformTarget)
|
|
58
|
+
register_microtvm_platform_target("microtvm_host", HostMicroTvmPlatformTarget)
|
|
59
|
+
register_microtvm_platform_target("microtvm_etissvp", EtissvpMicroTvmPlatformTarget)
|
|
60
|
+
register_microtvm_platform_target("microtvm_espidf", EspidfMicroTvmPlatformTarget)
|
|
61
|
+
register_microtvm_platform_target("microtvm_spike", SpikeMicroTvmPlatformTarget)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def create_microtvm_platform_target(name, platform, base=Target):
|
|
65
|
+
class MicroTvmPlatformTarget(base):
|
|
66
|
+
FEATURES = base.FEATURES + []
|
|
67
|
+
|
|
68
|
+
DEFAULTS = {
|
|
69
|
+
**base.DEFAULTS,
|
|
70
|
+
"timeout_sec": 0, # disabled
|
|
71
|
+
}
|
|
72
|
+
REQUIRED = base.REQUIRED + []
|
|
73
|
+
|
|
74
|
+
def __init__(self, features=None, config=None):
|
|
75
|
+
super().__init__(name=name, features=features, config=config)
|
|
76
|
+
self.platform = platform
|
|
77
|
+
self.template = name2template(name)
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def timeout_sec(self):
|
|
81
|
+
return int(self.config["timeout_sec"])
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def repeat(self):
|
|
85
|
+
return None # This is handled at the platform level
|
|
86
|
+
|
|
87
|
+
def exec(self, program, *args, cwd=os.getcwd(), **kwargs):
|
|
88
|
+
"""Use target to execute a executable with given arguments"""
|
|
89
|
+
if len(args) > 0:
|
|
90
|
+
raise RuntimeError("Program arguments are not supported for real hardware devices")
|
|
91
|
+
|
|
92
|
+
assert self.platform is not None, "TVM targets need a platform to execute programs"
|
|
93
|
+
|
|
94
|
+
if self.timeout_sec > 0:
|
|
95
|
+
raise NotImplementedError
|
|
96
|
+
|
|
97
|
+
ret = self.platform.run(program, self)
|
|
98
|
+
return ret
|
|
99
|
+
|
|
100
|
+
def parse_stdout(self, out):
|
|
101
|
+
mean_ms = None
|
|
102
|
+
median_ms = None
|
|
103
|
+
max_ms = None
|
|
104
|
+
min_ms = None
|
|
105
|
+
std_ms = None
|
|
106
|
+
found = False
|
|
107
|
+
for line in out.split("\n"):
|
|
108
|
+
if found:
|
|
109
|
+
match = re.compile(r"\s+(\d*\.\d+)\s+(\d*\.\d+)\s+(\d*\.\d+)\s+(\d*\.\d+)\s+(\d*\.\d+)").findall(
|
|
110
|
+
line
|
|
111
|
+
)
|
|
112
|
+
assert len(match) == 1
|
|
113
|
+
groups = match[0]
|
|
114
|
+
mean_ms, median_ms, max_ms, min_ms, std_ms = (
|
|
115
|
+
float(groups[0]),
|
|
116
|
+
float(groups[1]),
|
|
117
|
+
float(groups[2]),
|
|
118
|
+
float(groups[3]),
|
|
119
|
+
float(groups[4]),
|
|
120
|
+
)
|
|
121
|
+
break
|
|
122
|
+
if re.compile(r"\s+mean \(ms\)\s+median \(ms\)\s+max \(ms\)\s+min \(ms\)\s+std \(ms\)").match(line):
|
|
123
|
+
found = True
|
|
124
|
+
return mean_ms, median_ms, max_ms, min_ms, std_ms
|
|
125
|
+
|
|
126
|
+
def get_metrics(self, elf, directory, handle_exit=None):
|
|
127
|
+
if self.print_outputs:
|
|
128
|
+
out = self.exec(elf, cwd=directory, live=True, handle_exit=handle_exit)
|
|
129
|
+
else:
|
|
130
|
+
out = self.exec(
|
|
131
|
+
elf,
|
|
132
|
+
cwd=directory,
|
|
133
|
+
live=False,
|
|
134
|
+
print_func=lambda *args, **kwargs: None,
|
|
135
|
+
handle_exit=handle_exit,
|
|
136
|
+
)
|
|
137
|
+
mean_ms, _, _, _, _ = self.parse_stdout(out)
|
|
138
|
+
|
|
139
|
+
metrics = Metrics()
|
|
140
|
+
time_s = mean_ms / 1e3 if mean_ms is not None else mean_ms
|
|
141
|
+
if time_s:
|
|
142
|
+
metrics.add("Runtime [s]", time_s)
|
|
143
|
+
|
|
144
|
+
if self.platform.profile:
|
|
145
|
+
print("out", out)
|
|
146
|
+
headers = None
|
|
147
|
+
skip = False
|
|
148
|
+
lines = out.split("\n")
|
|
149
|
+
extracted = []
|
|
150
|
+
|
|
151
|
+
def extract_cols(line):
|
|
152
|
+
x = re.compile(r"(([^\s\[\]]+)(\s\S+)*)(\[.*\])?").findall(line)
|
|
153
|
+
return [y[0] for y in x]
|
|
154
|
+
|
|
155
|
+
for line in lines:
|
|
156
|
+
print("line", line)
|
|
157
|
+
if skip:
|
|
158
|
+
skip = False
|
|
159
|
+
continue
|
|
160
|
+
if headers is None:
|
|
161
|
+
if "Name" in line:
|
|
162
|
+
headers = extract_cols(line)
|
|
163
|
+
print("headers", headers)
|
|
164
|
+
skip = True
|
|
165
|
+
continue
|
|
166
|
+
else:
|
|
167
|
+
if len(line.strip()) == 0:
|
|
168
|
+
break
|
|
169
|
+
cols = extract_cols(line)
|
|
170
|
+
data = {headers[i]: val for i, val in enumerate(cols)}
|
|
171
|
+
extracted.append(data)
|
|
172
|
+
if "Total_time" in line:
|
|
173
|
+
break
|
|
174
|
+
assert len(extracted) > 0
|
|
175
|
+
metrics = {"default": metrics}
|
|
176
|
+
for item in extracted:
|
|
177
|
+
if item["Node Name"] == "Total_time":
|
|
178
|
+
metrics["default"].add("Runtime [s]", float(item["Time(us)"]) / 1e6)
|
|
179
|
+
else:
|
|
180
|
+
metrics_ = Metrics()
|
|
181
|
+
metrics_.add("Runtime [s]", float(item["Time(us)"]) / 1e6)
|
|
182
|
+
metrics[item["Node Name"]] = metrics_
|
|
183
|
+
|
|
184
|
+
return metrics, out, []
|
|
185
|
+
|
|
186
|
+
def get_arch(self):
|
|
187
|
+
return "unkwown"
|
|
188
|
+
|
|
189
|
+
return MicroTvmPlatformTarget
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
|
|
20
|
+
from mlonmcu.target.target import Target
|
|
21
|
+
|
|
22
|
+
from mlonmcu.logging import get_logger
|
|
23
|
+
|
|
24
|
+
logger = get_logger()
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TemplateMicroTvmPlatformTarget(Target):
|
|
28
|
+
FEATURES = Target.FEATURES + []
|
|
29
|
+
|
|
30
|
+
DEFAULTS = {
|
|
31
|
+
**Target.DEFAULTS,
|
|
32
|
+
}
|
|
33
|
+
REQUIRED = Target.REQUIRED + ["tvm.build_dir"]
|
|
34
|
+
|
|
35
|
+
def __init__(self, name=None, features=None, config=None):
|
|
36
|
+
super().__init__(name=name, features=features, config=config)
|
|
37
|
+
self.template_path = None
|
|
38
|
+
self.option_names = []
|
|
39
|
+
|
|
40
|
+
def get_project_options(self):
|
|
41
|
+
def _bool_helper(x):
|
|
42
|
+
return str(x).lower() if isinstance(x, bool) else x
|
|
43
|
+
|
|
44
|
+
def _filter_none(x):
|
|
45
|
+
return {key: value for key, value in x.items() if value is not None}
|
|
46
|
+
|
|
47
|
+
return _filter_none(
|
|
48
|
+
{
|
|
49
|
+
key: _bool_helper(getattr(self, key) if hasattr(self, key) else self.config.get(key, None))
|
|
50
|
+
for key in self.option_names
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
def update_environment(self, env):
|
|
55
|
+
pass
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
|
|
3
|
+
#
|
|
4
|
+
# This file is part of MLonMCU.
|
|
5
|
+
# See https://github.com/tum-ei-eda/mlonmcu.git for further info.
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
from mlonmcu.target.target import Target
|
|
22
|
+
|
|
23
|
+
from mlonmcu.logging import get_logger
|
|
24
|
+
from .microtvm_template_target import TemplateMicroTvmPlatformTarget
|
|
25
|
+
|
|
26
|
+
logger = get_logger()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ZephyrMicroTvmPlatformTarget(TemplateMicroTvmPlatformTarget):
|
|
30
|
+
FEATURES = Target.FEATURES + []
|
|
31
|
+
|
|
32
|
+
DEFAULTS = {
|
|
33
|
+
**Target.DEFAULTS,
|
|
34
|
+
"extra_files_tar": None,
|
|
35
|
+
"project_type": "host_driven",
|
|
36
|
+
"zephyr_board": "",
|
|
37
|
+
# "zephyr_base": "?",
|
|
38
|
+
# "west_cmd": "?",
|
|
39
|
+
"verbose": False,
|
|
40
|
+
"warning_as_error": True,
|
|
41
|
+
"compile_definitions": "",
|
|
42
|
+
# "config_main_stack_size": None,
|
|
43
|
+
"config_main_stack_size": "16384",
|
|
44
|
+
"gdbserver_port": None,
|
|
45
|
+
"nrfjprog_snr": None,
|
|
46
|
+
"openocd_serial": None,
|
|
47
|
+
"port": None, # Workaround to overwrite esptool detection
|
|
48
|
+
}
|
|
49
|
+
REQUIRED = Target.REQUIRED + ["zephyr.install_dir", "zephyr.sdk_dir"]
|
|
50
|
+
|
|
51
|
+
def __init__(self, name=None, features=None, config=None):
|
|
52
|
+
super().__init__(name=name, features=features, config=config)
|
|
53
|
+
self.template_path = None
|
|
54
|
+
self.option_names = [
|
|
55
|
+
"extra_files_tar",
|
|
56
|
+
"project_type",
|
|
57
|
+
"zephyr_board",
|
|
58
|
+
# "verbose",
|
|
59
|
+
"warning_as_error",
|
|
60
|
+
"compile_definitions",
|
|
61
|
+
"config_main_stack_size",
|
|
62
|
+
"gdbserver_port",
|
|
63
|
+
"nrfjprog_snr",
|
|
64
|
+
"openocd_serial",
|
|
65
|
+
]
|
|
66
|
+
# self.platform = platform
|
|
67
|
+
# self.template = name2template(name)
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def zephyr_install_dir(self):
|
|
71
|
+
return Path(self.config["zephyr.install_dir"])
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def port(self):
|
|
75
|
+
return self.config["port"]
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def zephyr_sdk_dir(self):
|
|
79
|
+
return Path(self.config["zephyr.sdk_dir"])
|
|
80
|
+
|
|
81
|
+
def get_project_options(self):
|
|
82
|
+
ret = super().get_project_options()
|
|
83
|
+
ret.update({"zephyr_base": self.zephyr_install_dir / "zephyr"})
|
|
84
|
+
return ret
|
|
85
|
+
|
|
86
|
+
def update_environment(self, env):
|
|
87
|
+
super().update_environment(env)
|
|
88
|
+
env["ZEPHYR_BASE"] = str(self.zephyr_install_dir / "zephyr")
|
|
89
|
+
env["ZEPHYR_SDK_INSTALL_DIR"] = str(self.zephyr_sdk_dir)
|
|
90
|
+
if self.port:
|
|
91
|
+
env["ESPTOOL_PORT"] = self.port
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
|
|
3
|
+
#
|
|
4
|
+
# This file is part of MLonMCU.
|
|
5
|
+
# See https://github.com/tum-ei-eda/mlonmcu.git for further info.
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
"""MLonMCU MLIF platform"""
|
|
20
|
+
|
|
21
|
+
# pylint: disable=wildcard-import, redefined-builtin
|
|
22
|
+
|
|
23
|
+
from .mlif import MlifPlatform
|
|
24
|
+
|
|
25
|
+
__all__ = ["MlifPlatform"]
|
|
@@ -0,0 +1,300 @@
|
|
|
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
|
+
"""MLIF Platform"""
|
|
20
|
+
import tempfile
|
|
21
|
+
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
|
|
24
|
+
from mlonmcu.config import str2bool
|
|
25
|
+
from mlonmcu.setup import utils # TODO: Move one level up?
|
|
26
|
+
from mlonmcu.artifact import Artifact, ArtifactFormat
|
|
27
|
+
from mlonmcu.logging import get_logger
|
|
28
|
+
from mlonmcu.target import get_targets
|
|
29
|
+
from mlonmcu.target.target import Target
|
|
30
|
+
from mlonmcu.models.utils import get_data_source
|
|
31
|
+
|
|
32
|
+
from ..platform import CompilePlatform, TargetPlatform
|
|
33
|
+
from .mlif_target import get_mlif_platform_targets, create_mlif_platform_target
|
|
34
|
+
|
|
35
|
+
logger = get_logger()
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class MlifPlatform(CompilePlatform, TargetPlatform):
|
|
39
|
+
"""Model Library Interface Platform class."""
|
|
40
|
+
|
|
41
|
+
FEATURES = (
|
|
42
|
+
CompilePlatform.FEATURES
|
|
43
|
+
+ TargetPlatform.FEATURES
|
|
44
|
+
+ [
|
|
45
|
+
"validate",
|
|
46
|
+
"muriscvnn",
|
|
47
|
+
"cmsisnn",
|
|
48
|
+
"muriscvnnbyoc",
|
|
49
|
+
"cmsisnnbyoc",
|
|
50
|
+
"vext",
|
|
51
|
+
"pext",
|
|
52
|
+
"arm_mvei",
|
|
53
|
+
"arm_dsp",
|
|
54
|
+
"auto_vectorize",
|
|
55
|
+
"benchmark",
|
|
56
|
+
"xpulp",
|
|
57
|
+
] # TODO: allow Feature-Features with automatic resolution of initialization order
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
DEFAULTS = {
|
|
61
|
+
**CompilePlatform.DEFAULTS,
|
|
62
|
+
**TargetPlatform.DEFAULTS,
|
|
63
|
+
"ignore_data": True,
|
|
64
|
+
"fail_on_error": False, # Prefer to add acolum with validation results instead of raising a RuntimeError
|
|
65
|
+
"model_support_dir": None,
|
|
66
|
+
"toolchain": "gcc",
|
|
67
|
+
"prebuild_lib_path": None,
|
|
68
|
+
"optimize": None, # values: 0,1,2,3,s
|
|
69
|
+
"input_data_path": None,
|
|
70
|
+
"output_data_path": None,
|
|
71
|
+
"mem_only": False,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
REQUIRED = ["mlif.src_dir"]
|
|
75
|
+
OPTIONAL = ["llvm.install_dir"]
|
|
76
|
+
|
|
77
|
+
def __init__(self, features=None, config=None):
|
|
78
|
+
super().__init__(
|
|
79
|
+
"mlif",
|
|
80
|
+
features=features,
|
|
81
|
+
config=config,
|
|
82
|
+
)
|
|
83
|
+
self.tempdir = None
|
|
84
|
+
self.build_dir = None
|
|
85
|
+
self.goal = "generic_mlif"
|
|
86
|
+
|
|
87
|
+
def gen_data_artifact(self):
|
|
88
|
+
in_paths = self.input_data_path
|
|
89
|
+
if not isinstance(in_paths, list):
|
|
90
|
+
in_paths = [in_paths]
|
|
91
|
+
in_paths_new = []
|
|
92
|
+
for in_path in in_paths:
|
|
93
|
+
if in_path.is_file():
|
|
94
|
+
raise NotImplementedError
|
|
95
|
+
elif in_path.is_dir():
|
|
96
|
+
in_paths_new.extend([f for f in Path(in_path).iterdir() if f.is_file()])
|
|
97
|
+
else:
|
|
98
|
+
logger.warning("TODO")
|
|
99
|
+
return None
|
|
100
|
+
in_paths = in_paths_new
|
|
101
|
+
out_paths = self.output_data_path
|
|
102
|
+
if not isinstance(out_paths, list):
|
|
103
|
+
out_paths = [out_paths]
|
|
104
|
+
out_paths_new = []
|
|
105
|
+
for out_path in out_paths:
|
|
106
|
+
if out_path.is_file():
|
|
107
|
+
raise NotImplementedError
|
|
108
|
+
elif out_path.is_dir():
|
|
109
|
+
out_paths_new.extend([f for f in Path(out_path).iterdir() if f.is_file()])
|
|
110
|
+
else:
|
|
111
|
+
logger.warning("TODO")
|
|
112
|
+
return None
|
|
113
|
+
out_paths = out_paths_new
|
|
114
|
+
if len(in_paths) == 0 or len(out_paths) == 0:
|
|
115
|
+
logger.warning("TODO")
|
|
116
|
+
return None
|
|
117
|
+
data_src = get_data_source(in_paths, out_paths)
|
|
118
|
+
return Artifact("data.c", content=data_src, fmt=ArtifactFormat.SOURCE)
|
|
119
|
+
|
|
120
|
+
def init_directory(self, path=None, context=None):
|
|
121
|
+
if self.build_dir is not None:
|
|
122
|
+
self.build_dir.mkdir(exist_ok=True)
|
|
123
|
+
logger.debug("Build directory already initialized")
|
|
124
|
+
return
|
|
125
|
+
dir_name = self.name
|
|
126
|
+
if path is not None:
|
|
127
|
+
self.build_dir = Path(path)
|
|
128
|
+
elif self.config["build_dir"]:
|
|
129
|
+
self.build_dir = Path(self.config["build_dir"])
|
|
130
|
+
else:
|
|
131
|
+
if context:
|
|
132
|
+
assert "temp" in context.environment.paths
|
|
133
|
+
self.build_dir = (
|
|
134
|
+
context.environment.paths["temp"].path / dir_name
|
|
135
|
+
) # TODO: Need to lock this for parallel builds
|
|
136
|
+
else:
|
|
137
|
+
logger.debug(
|
|
138
|
+
"Creating temporary directory because no context was available "
|
|
139
|
+
"and 'mlif.build_dir' was not supplied"
|
|
140
|
+
)
|
|
141
|
+
self.tempdir = tempfile.TemporaryDirectory()
|
|
142
|
+
self.build_dir = Path(self.tempdir.name) / dir_name
|
|
143
|
+
logger.info("Temporary build directory: %s", self.build_dir)
|
|
144
|
+
self.build_dir.mkdir(exist_ok=True)
|
|
145
|
+
|
|
146
|
+
def create_target(self, name):
|
|
147
|
+
assert name in self.get_supported_targets(), f"{name} is not a valid MLIF target"
|
|
148
|
+
targets = get_targets()
|
|
149
|
+
if name in targets:
|
|
150
|
+
base = targets[name]
|
|
151
|
+
else:
|
|
152
|
+
base = Target
|
|
153
|
+
return create_mlif_platform_target(name, self, base=base)
|
|
154
|
+
|
|
155
|
+
@property
|
|
156
|
+
def mlif_dir(self):
|
|
157
|
+
return Path(self.config["mlif.src_dir"])
|
|
158
|
+
|
|
159
|
+
@property
|
|
160
|
+
def llvm_dir(self):
|
|
161
|
+
return self.config["llvm.install_dir"]
|
|
162
|
+
|
|
163
|
+
@property
|
|
164
|
+
def ignore_data(self):
|
|
165
|
+
value = self.config["ignore_data"]
|
|
166
|
+
return str2bool(value) if not isinstance(value, (bool, int)) else value
|
|
167
|
+
|
|
168
|
+
@property
|
|
169
|
+
def fail_on_error(self):
|
|
170
|
+
value = self.config["fail_on_error"]
|
|
171
|
+
return str2bool(value) if not isinstance(value, (bool, int)) else value
|
|
172
|
+
|
|
173
|
+
@property
|
|
174
|
+
def validate_outputs(self):
|
|
175
|
+
return not self.ignore_data
|
|
176
|
+
|
|
177
|
+
@property
|
|
178
|
+
def toolchain(self):
|
|
179
|
+
return str(self.config["toolchain"])
|
|
180
|
+
|
|
181
|
+
@property
|
|
182
|
+
def model_support_dir(self):
|
|
183
|
+
return self.config["model_support_dir"]
|
|
184
|
+
|
|
185
|
+
@property
|
|
186
|
+
def prebuild_lib_dir(self):
|
|
187
|
+
return self.config["prebuild_lib_dir"]
|
|
188
|
+
|
|
189
|
+
@property
|
|
190
|
+
def optimize(self):
|
|
191
|
+
return self.config["optimize"]
|
|
192
|
+
|
|
193
|
+
@property
|
|
194
|
+
def input_data_path(self):
|
|
195
|
+
return self.config["input_data_path"]
|
|
196
|
+
|
|
197
|
+
@property
|
|
198
|
+
def output_data_path(self):
|
|
199
|
+
return self.config["output_data_path"]
|
|
200
|
+
|
|
201
|
+
@property
|
|
202
|
+
def mem_only(self):
|
|
203
|
+
value = self.config["mem_only"]
|
|
204
|
+
return str2bool(value) if not isinstance(value, (bool, int)) else value
|
|
205
|
+
|
|
206
|
+
def get_supported_targets(self):
|
|
207
|
+
target_names = get_mlif_platform_targets()
|
|
208
|
+
return target_names
|
|
209
|
+
|
|
210
|
+
def close(self):
|
|
211
|
+
if self.tempdir:
|
|
212
|
+
self.tempdir.cleanup()
|
|
213
|
+
|
|
214
|
+
def get_common_cmake_args(self):
|
|
215
|
+
args = []
|
|
216
|
+
args.append(f"-DTOOLCHAIN={self.toolchain}")
|
|
217
|
+
if self.toolchain == "llvm" and self.llvm_dir is None:
|
|
218
|
+
raise RuntimeError("Missing config variable: llvm.install_dir")
|
|
219
|
+
else:
|
|
220
|
+
args.append(f"-DLLVM_DIR={self.llvm_dir}")
|
|
221
|
+
if self.optimize:
|
|
222
|
+
args.append(f"-DOPTIMIZE={self.optimize}")
|
|
223
|
+
return args
|
|
224
|
+
|
|
225
|
+
def prepare(self):
|
|
226
|
+
self.init_directory()
|
|
227
|
+
|
|
228
|
+
def configure(self, target, src, _model):
|
|
229
|
+
del target
|
|
230
|
+
if not isinstance(src, Path):
|
|
231
|
+
src = Path(src)
|
|
232
|
+
cmakeArgs = []
|
|
233
|
+
definitions = self.definitions
|
|
234
|
+
if self.mem_only:
|
|
235
|
+
definitions["QUIET"] = True
|
|
236
|
+
for key, value in definitions.items():
|
|
237
|
+
if isinstance(value, bool):
|
|
238
|
+
value = "ON" if value else "OFF"
|
|
239
|
+
cmakeArgs.append(f"-D{key}={value}")
|
|
240
|
+
cmakeArgs.extend(self.get_common_cmake_args())
|
|
241
|
+
cmakeArgs.append("-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON") # TODO for debug, should be removed
|
|
242
|
+
if self.model_support_dir:
|
|
243
|
+
cmakeArgs.append(f"-DMODEL_SUPPORT_DIR={self.model_support_dir}")
|
|
244
|
+
else:
|
|
245
|
+
pass
|
|
246
|
+
if src.is_file():
|
|
247
|
+
src = src.parent # TODO deal with directories or files?
|
|
248
|
+
if src.is_dir():
|
|
249
|
+
cmakeArgs.append("-DSRC_DIR=" + str(src))
|
|
250
|
+
else:
|
|
251
|
+
raise RuntimeError("Unable to find sources!")
|
|
252
|
+
if self.ignore_data:
|
|
253
|
+
cmakeArgs.append("-DDATA_SRC=")
|
|
254
|
+
artifacts = []
|
|
255
|
+
else:
|
|
256
|
+
data_artifact = self.gen_data_artifact()
|
|
257
|
+
data_file = self.build_dir / data_artifact.name
|
|
258
|
+
data_artifact.export(data_file)
|
|
259
|
+
cmakeArgs.append("-DDATA_SRC=" + str(data_file))
|
|
260
|
+
artifacts = [data_artifact]
|
|
261
|
+
utils.mkdirs(self.build_dir)
|
|
262
|
+
out = utils.cmake(
|
|
263
|
+
self.mlif_dir,
|
|
264
|
+
*cmakeArgs,
|
|
265
|
+
cwd=self.build_dir,
|
|
266
|
+
debug=self.debug,
|
|
267
|
+
live=self.print_outputs,
|
|
268
|
+
)
|
|
269
|
+
return out, artifacts
|
|
270
|
+
|
|
271
|
+
def compile(self, target, src=None, model=None, data_file=None):
|
|
272
|
+
out = ""
|
|
273
|
+
if src:
|
|
274
|
+
configure_out, artifacts = self.configure(target, src, model)
|
|
275
|
+
out += configure_out
|
|
276
|
+
out += utils.make(
|
|
277
|
+
self.goal,
|
|
278
|
+
cwd=self.build_dir,
|
|
279
|
+
threads=self.num_threads,
|
|
280
|
+
live=self.print_outputs,
|
|
281
|
+
)
|
|
282
|
+
return out, artifacts
|
|
283
|
+
|
|
284
|
+
def generate_elf(self, src, target, model=None):
|
|
285
|
+
out, artifacts = self.compile(target, src=src, model=model)
|
|
286
|
+
elf_file = self.build_dir / "bin" / "generic_mlif"
|
|
287
|
+
# TODO: just use path instead of raw data?
|
|
288
|
+
with open(elf_file, "rb") as handle:
|
|
289
|
+
data = handle.read()
|
|
290
|
+
artifact = Artifact("generic_mlif", raw=data, fmt=ArtifactFormat.RAW)
|
|
291
|
+
artifacts.insert(0, artifact) # First artifact should be the ELF
|
|
292
|
+
metrics = self.get_metrics(elf_file)
|
|
293
|
+
content = metrics.to_csv(include_optional=True) # TODO: store df instead?
|
|
294
|
+
metrics_artifact = Artifact("metrics.csv", content=content, fmt=ArtifactFormat.TEXT)
|
|
295
|
+
artifacts.append(metrics_artifact)
|
|
296
|
+
stdout_artifact = Artifact(
|
|
297
|
+
"mlif_out.log", content=out, fmt=ArtifactFormat.TEXT
|
|
298
|
+
) # TODO: rename to tvmaot_out.log?
|
|
299
|
+
artifacts.append(stdout_artifact)
|
|
300
|
+
self.artifacts = {"default": artifacts}
|