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,501 @@
|
|
|
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 logging
|
|
20
|
+
|
|
21
|
+
from .config import (
|
|
22
|
+
DefaultsConfig,
|
|
23
|
+
PathConfig,
|
|
24
|
+
RepoConfig,
|
|
25
|
+
FrameworkConfig,
|
|
26
|
+
FrameworkFeatureConfig,
|
|
27
|
+
BackendConfig,
|
|
28
|
+
BackendFeatureConfig,
|
|
29
|
+
TargetConfig,
|
|
30
|
+
TargetFeatureConfig,
|
|
31
|
+
PlatformConfig,
|
|
32
|
+
PlatformFeatureConfig,
|
|
33
|
+
FrontendConfig,
|
|
34
|
+
FrontendFeatureConfig,
|
|
35
|
+
)
|
|
36
|
+
from .loader import load_environment_from_file
|
|
37
|
+
from .writer import write_environment_to_file
|
|
38
|
+
|
|
39
|
+
from mlonmcu.feature.type import FeatureType
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _feature_helper(obj, name):
|
|
43
|
+
if not obj.enabled:
|
|
44
|
+
return []
|
|
45
|
+
features = obj.features
|
|
46
|
+
if name:
|
|
47
|
+
return [feature for feature in features if feature.name == name]
|
|
48
|
+
else:
|
|
49
|
+
return features
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _extract_names(objs):
|
|
53
|
+
return [obj.name for obj in objs]
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _filter_enabled(objs):
|
|
57
|
+
return [obj for obj in objs if obj.enabled]
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class Environment:
|
|
61
|
+
def __init__(self):
|
|
62
|
+
self._home = None
|
|
63
|
+
self.alias = None
|
|
64
|
+
self.defaults = DefaultsConfig()
|
|
65
|
+
self.paths = {}
|
|
66
|
+
self.repos = {}
|
|
67
|
+
self.frameworks = []
|
|
68
|
+
self.frontends = []
|
|
69
|
+
self.platforms = []
|
|
70
|
+
self.toolchains = []
|
|
71
|
+
self.targets = []
|
|
72
|
+
self.vars = {}
|
|
73
|
+
self.flags = {}
|
|
74
|
+
|
|
75
|
+
def __str__(self):
|
|
76
|
+
return self.__class__.__name__ + "(" + str(vars(self)) + ")"
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def home(self):
|
|
80
|
+
"""Home directory of mlonmcu environment."""
|
|
81
|
+
return self._home
|
|
82
|
+
|
|
83
|
+
@classmethod
|
|
84
|
+
def from_file(cls, filename):
|
|
85
|
+
return load_environment_from_file(filename, base=cls)
|
|
86
|
+
|
|
87
|
+
def to_file(self, filename):
|
|
88
|
+
write_environment_to_file(self, filename)
|
|
89
|
+
|
|
90
|
+
def lookup_path(self, name):
|
|
91
|
+
assert name in self.paths, f"Unable to find '{name}' path in environment config"
|
|
92
|
+
return self.paths[name]
|
|
93
|
+
|
|
94
|
+
def lookup_var(self, name, default=None):
|
|
95
|
+
return self.vars.get(name, default)
|
|
96
|
+
|
|
97
|
+
def lookup_frontend_feature_configs(self, name=None, frontend=None):
|
|
98
|
+
configs = []
|
|
99
|
+
if frontend:
|
|
100
|
+
names = [frontend.name for frontend in self.frontends]
|
|
101
|
+
index = names.index(frontend)
|
|
102
|
+
assert index is not None, f"Frontend {frontend} not found in environment config"
|
|
103
|
+
configs.extend(_feature_helper(self.frontends[index], name))
|
|
104
|
+
else:
|
|
105
|
+
for frontend in self.frontends:
|
|
106
|
+
configs.extend(_feature_helper(frontend, name))
|
|
107
|
+
return configs
|
|
108
|
+
|
|
109
|
+
def lookup_framework_feature_configs(self, name=None, framework=None):
|
|
110
|
+
configs = []
|
|
111
|
+
if framework:
|
|
112
|
+
names = [framework.name for framework in self.frameworks]
|
|
113
|
+
index = names.index(framework)
|
|
114
|
+
assert index is not None, f"Framework {framework} not found in environment config"
|
|
115
|
+
configs.extend(_feature_helper(self.frameworks[index], name))
|
|
116
|
+
else:
|
|
117
|
+
for framework in self.frameworks:
|
|
118
|
+
configs.extend(_feature_helper(framework, name))
|
|
119
|
+
return configs
|
|
120
|
+
|
|
121
|
+
def lookup_backend_feature_configs(self, name=None, framework=None, backend=None):
|
|
122
|
+
def helper(framework, backend, name):
|
|
123
|
+
backend_features = self.framework[framework].backends[backend].features
|
|
124
|
+
if name:
|
|
125
|
+
return [backend_features[name]]
|
|
126
|
+
else:
|
|
127
|
+
return backend_features.values()
|
|
128
|
+
|
|
129
|
+
configs = []
|
|
130
|
+
if framework:
|
|
131
|
+
names = [framework.name for framework in self.frameworks]
|
|
132
|
+
index = names.index(framework)
|
|
133
|
+
assert index is not None, f"Framework {framework} not found in environment config"
|
|
134
|
+
if backend:
|
|
135
|
+
names_ = [backend.name for backend in self.frameworks[index].backends]
|
|
136
|
+
index_ = names_.index(backend)
|
|
137
|
+
assert index_ is not None, f"Backend {backend} not found in environment config"
|
|
138
|
+
configs.extend(_feature_helper(self.frameworks[index].backends[index], name))
|
|
139
|
+
else:
|
|
140
|
+
for backend in self.frameworks[index].backends:
|
|
141
|
+
configs.extend(_feature_helper(backend, name))
|
|
142
|
+
else:
|
|
143
|
+
for framework in self.frameworks:
|
|
144
|
+
if backend:
|
|
145
|
+
names_ = [backend.name for backend in framework.backends]
|
|
146
|
+
index_ = names_.index(backend)
|
|
147
|
+
assert index_ is not None, f"Backend {backend} not found in environment config"
|
|
148
|
+
configs.extend(_feature_helper(self.frameworks[index].backends[index], name))
|
|
149
|
+
else:
|
|
150
|
+
for backend in framework.backends:
|
|
151
|
+
configs.extend(_feature_helper(backend, name))
|
|
152
|
+
backend = None
|
|
153
|
+
return configs
|
|
154
|
+
|
|
155
|
+
def lookup_platform_feature_configs(self, name=None, platform=None):
|
|
156
|
+
configs = []
|
|
157
|
+
if platform:
|
|
158
|
+
names = [platform.name for platform in self.platforms]
|
|
159
|
+
index = names.index(platform)
|
|
160
|
+
assert (
|
|
161
|
+
index is not None
|
|
162
|
+
), f"Platform {platform} not found in environment config" # TODO: do not fail, just return empty list
|
|
163
|
+
configs.extend(_feature_helper(self.platforms[index], name))
|
|
164
|
+
else:
|
|
165
|
+
for platform in self.platforms:
|
|
166
|
+
configs.extend(_feature_helper(platform, name))
|
|
167
|
+
return configs
|
|
168
|
+
|
|
169
|
+
def lookup_target_feature_configs(self, name=None, target=None):
|
|
170
|
+
configs = []
|
|
171
|
+
if target:
|
|
172
|
+
names = [target.name for target in self.targets]
|
|
173
|
+
index = names.index(target)
|
|
174
|
+
assert (
|
|
175
|
+
index is not None
|
|
176
|
+
), f"Target {target} not found in environment config" # TODO: do not fail, just return empty list
|
|
177
|
+
configs.extend(_feature_helper(self.targets[index], name))
|
|
178
|
+
else:
|
|
179
|
+
for target in self.targets:
|
|
180
|
+
configs.extend(_feature_helper(target, name))
|
|
181
|
+
return configs
|
|
182
|
+
|
|
183
|
+
def lookup_feature_configs(
|
|
184
|
+
self,
|
|
185
|
+
name=None,
|
|
186
|
+
kind=None,
|
|
187
|
+
frontend=None,
|
|
188
|
+
framework=None,
|
|
189
|
+
backend=None,
|
|
190
|
+
platform=None,
|
|
191
|
+
target=None,
|
|
192
|
+
):
|
|
193
|
+
configs = []
|
|
194
|
+
if kind == FeatureType.FRONTEND or kind is None:
|
|
195
|
+
configs.extend(self.lookup_frontend_feature_configs(name=name, frontend=frontend))
|
|
196
|
+
if kind == FeatureType.FRAMEWORK or kind is None:
|
|
197
|
+
configs.extend(self.lookup_framework_feature_configs(name=name, framework=framework))
|
|
198
|
+
if kind == FeatureType.BACKEND or kind is None:
|
|
199
|
+
configs.extend(self.lookup_backend_feature_configs(name=name, framework=framework, backend=backend))
|
|
200
|
+
if kind == FeatureType.PLATFORM or kind is None:
|
|
201
|
+
configs.extend(self.lookup_platform_feature_configs(name=name, platform=platform))
|
|
202
|
+
if kind == FeatureType.TARGET or kind is None:
|
|
203
|
+
configs.extend(self.lookup_target_feature_configs(name=name, target=target))
|
|
204
|
+
|
|
205
|
+
return configs
|
|
206
|
+
|
|
207
|
+
def supports_feature(self, name):
|
|
208
|
+
configs = self.lookup_feature_configs(name=name)
|
|
209
|
+
supported = [feature.supported for feature in configs]
|
|
210
|
+
return any(supported)
|
|
211
|
+
|
|
212
|
+
def has_feature(self, name):
|
|
213
|
+
"""An alias for supports_feature."""
|
|
214
|
+
return self.supports_feature(name)
|
|
215
|
+
|
|
216
|
+
def lookup_backend_configs(self, backend=None, framework=None, names_only=False):
|
|
217
|
+
enabled_frameworks = _filter_enabled(self.frameworks)
|
|
218
|
+
|
|
219
|
+
configs = []
|
|
220
|
+
for framework_config in enabled_frameworks:
|
|
221
|
+
if framework is not None and framework_config.name != framework:
|
|
222
|
+
continue
|
|
223
|
+
enabled_backends = _filter_enabled(framework_config.backends)
|
|
224
|
+
if backend is None:
|
|
225
|
+
configs.extend(enabled_backends)
|
|
226
|
+
else:
|
|
227
|
+
for backend_config in enabled_backends:
|
|
228
|
+
if backend_config.name == backend:
|
|
229
|
+
return [backend_config.name if names_only else backend_config]
|
|
230
|
+
return _extract_names(configs) if names_only else configs
|
|
231
|
+
|
|
232
|
+
def lookup_framework_configs(self, framework=None, names_only=False):
|
|
233
|
+
enabled_frameworks = _filter_enabled(self.frameworks)
|
|
234
|
+
|
|
235
|
+
if framework is None:
|
|
236
|
+
return _extract_names(enabled_frameworks) if names_only else enabled_frameworks
|
|
237
|
+
|
|
238
|
+
for framework_config in enabled_frameworks:
|
|
239
|
+
if framework_config.name == framework:
|
|
240
|
+
return [framework_config.name if names_only else framework_config]
|
|
241
|
+
|
|
242
|
+
return []
|
|
243
|
+
|
|
244
|
+
def lookup_frontend_configs(self, frontend=None, names_only=False):
|
|
245
|
+
enabled_frontends = _filter_enabled(self.frontends)
|
|
246
|
+
|
|
247
|
+
if frontend is None:
|
|
248
|
+
return _extract_names(enabled_frontends) if names_only else enabled_frontends
|
|
249
|
+
|
|
250
|
+
for frontend_config in enabled_frontends:
|
|
251
|
+
if frontend_config.name == frontend:
|
|
252
|
+
return [frontend_config.name if names_only else frontend_config]
|
|
253
|
+
return []
|
|
254
|
+
|
|
255
|
+
def lookup_platform_configs(self, platform=None, names_only=False):
|
|
256
|
+
enabled_platforms = _filter_enabled(self.platforms)
|
|
257
|
+
|
|
258
|
+
if platform is None:
|
|
259
|
+
return _extract_names(enabled_platforms) if names_only else enabled_platforms
|
|
260
|
+
for platform_config in enabled_platforms:
|
|
261
|
+
if platform_config.name == platform:
|
|
262
|
+
return [platform_config.name if names_only else platform_config]
|
|
263
|
+
|
|
264
|
+
return []
|
|
265
|
+
|
|
266
|
+
def lookup_target_configs(self, target=None, names_only=False):
|
|
267
|
+
enabled_targets = _filter_enabled(self.targets)
|
|
268
|
+
|
|
269
|
+
if target is None:
|
|
270
|
+
return _extract_names(enabled_targets) if names_only else enabled_targets
|
|
271
|
+
|
|
272
|
+
for target_config in enabled_targets:
|
|
273
|
+
if target_config.name == target:
|
|
274
|
+
return [target_config.name if names_only else target_config]
|
|
275
|
+
return []
|
|
276
|
+
|
|
277
|
+
def has_frontend(self, name):
|
|
278
|
+
configs = self.lookup_frontend_configs(frontend=name)
|
|
279
|
+
return len(configs) > 0
|
|
280
|
+
|
|
281
|
+
def has_backend(self, name):
|
|
282
|
+
configs = self.lookup_backend_configs(backend=name)
|
|
283
|
+
return len(configs) > 0
|
|
284
|
+
|
|
285
|
+
def has_framework(self, name):
|
|
286
|
+
configs = self.lookup_framework_configs(framework=name)
|
|
287
|
+
return len(configs) > 0
|
|
288
|
+
|
|
289
|
+
def has_platform(self, name):
|
|
290
|
+
configs = self.lookup_platform_configs(platform=name)
|
|
291
|
+
return len(configs) > 0
|
|
292
|
+
|
|
293
|
+
def has_toolchain(self, name):
|
|
294
|
+
return self.toolchains.get(name, False)
|
|
295
|
+
|
|
296
|
+
def has_target(self, name):
|
|
297
|
+
configs = self.lookup_target_configs(target=name)
|
|
298
|
+
return len(configs) > 0
|
|
299
|
+
|
|
300
|
+
# TODO: actually we do not need to explicitly enable those? environment.yml list the default enabled ones instead
|
|
301
|
+
# of the supported ones in the environment
|
|
302
|
+
# def has_postprocess(self, name):
|
|
303
|
+
# configs = self.lookup_postprocess_configs(postprocess=name)
|
|
304
|
+
# return len(configs) > 0
|
|
305
|
+
|
|
306
|
+
def get_default_backends(self, framework):
|
|
307
|
+
if framework is None or framework not in self.defaults.default_backends:
|
|
308
|
+
return []
|
|
309
|
+
default = self.defaults.default_backends[framework]
|
|
310
|
+
# framework_names = [framework_config.name for framework_config in self.frameworks]
|
|
311
|
+
# framework_config = self.frameworks[framework_names.index(framework)]
|
|
312
|
+
if default is None:
|
|
313
|
+
return []
|
|
314
|
+
if isinstance(default, str):
|
|
315
|
+
if default == "*": # Wildcard all enabled frameworks
|
|
316
|
+
default = self.get_enabled_backends()
|
|
317
|
+
else:
|
|
318
|
+
default = [default]
|
|
319
|
+
else:
|
|
320
|
+
assert isinstance(default, list), "TODO"
|
|
321
|
+
return default
|
|
322
|
+
|
|
323
|
+
def get_default_frameworks(self):
|
|
324
|
+
default = self.defaults.default_framework
|
|
325
|
+
if default is None:
|
|
326
|
+
return []
|
|
327
|
+
if isinstance(default, str):
|
|
328
|
+
if default == "*": # Wildcard all enabled frameworks
|
|
329
|
+
default = self.get_enabled_frameworks()
|
|
330
|
+
else:
|
|
331
|
+
default = [default]
|
|
332
|
+
else:
|
|
333
|
+
assert isinstance(default, list), "TODO"
|
|
334
|
+
return default
|
|
335
|
+
|
|
336
|
+
def get_default_targets(self):
|
|
337
|
+
default = self.defaults.default_target
|
|
338
|
+
if default is not None:
|
|
339
|
+
if isinstance(default, str):
|
|
340
|
+
if default == "*": # Wildcard all enabled targets
|
|
341
|
+
default = self.get_enabled_targets()
|
|
342
|
+
else:
|
|
343
|
+
default = [default]
|
|
344
|
+
else:
|
|
345
|
+
assert isinstance(default, list)
|
|
346
|
+
return default
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
class DefaultEnvironment(Environment):
|
|
350
|
+
def __init__(self):
|
|
351
|
+
super().__init__()
|
|
352
|
+
self.defaults = DefaultsConfig(
|
|
353
|
+
log_level=logging.DEBUG,
|
|
354
|
+
log_to_file=False,
|
|
355
|
+
default_framework=None,
|
|
356
|
+
default_backends={},
|
|
357
|
+
default_target=None,
|
|
358
|
+
cleanup_auto=False,
|
|
359
|
+
cleanup_keep=100,
|
|
360
|
+
)
|
|
361
|
+
self.paths = {
|
|
362
|
+
"deps": PathConfig("./deps"),
|
|
363
|
+
"logs": PathConfig("./logs"),
|
|
364
|
+
"results": PathConfig("./results"),
|
|
365
|
+
"plugins": PathConfig("./plugins"),
|
|
366
|
+
"temp": PathConfig("out"),
|
|
367
|
+
"models": [
|
|
368
|
+
PathConfig("./models"),
|
|
369
|
+
],
|
|
370
|
+
}
|
|
371
|
+
self.repos = {
|
|
372
|
+
"tensorflow": RepoConfig("https://github.com/tensorflow/tensorflow.git", ref="v2.5.2"),
|
|
373
|
+
"tflite_micro_compiler": RepoConfig(
|
|
374
|
+
"https://github.com/cpetig/tflite_micro_compiler.git", ref="master"
|
|
375
|
+
), # TODO: freeze ref?
|
|
376
|
+
"tvm": RepoConfig(
|
|
377
|
+
"https://github.com/tum-ei-eda/tvm.git", ref="tumeda"
|
|
378
|
+
), # TODO: use upstream repo with suitable commit?
|
|
379
|
+
"utvm_staticrt_codegen": RepoConfig(
|
|
380
|
+
"https://github.com/tum-ei-eda/utvm_staticrt_codegen.git", ref="master"
|
|
381
|
+
), # TODO: freeze ref?
|
|
382
|
+
"etiss": RepoConfig("https://github.com/tum-ei-eda/etiss.git", ref="master"), # TODO: freeze ref?
|
|
383
|
+
}
|
|
384
|
+
self.frameworks = [
|
|
385
|
+
FrameworkConfig(
|
|
386
|
+
"tflm",
|
|
387
|
+
enabled=True,
|
|
388
|
+
backends=[
|
|
389
|
+
BackendConfig("tflmc", enabled=True, features=[]),
|
|
390
|
+
BackendConfig("tflmi", enabled=True, features=[]),
|
|
391
|
+
],
|
|
392
|
+
features=[
|
|
393
|
+
FrameworkFeatureConfig("muriscvnn", framework="tflm", supported=False),
|
|
394
|
+
],
|
|
395
|
+
),
|
|
396
|
+
FrameworkConfig(
|
|
397
|
+
"utvm",
|
|
398
|
+
enabled=True,
|
|
399
|
+
backends=[
|
|
400
|
+
BackendConfig(
|
|
401
|
+
"tvmaot",
|
|
402
|
+
enabled=True,
|
|
403
|
+
features=[
|
|
404
|
+
BackendFeatureConfig("unpacked_api", backend="tvmaot", supported=True),
|
|
405
|
+
],
|
|
406
|
+
),
|
|
407
|
+
BackendConfig("tvmrt", enabled=True, features=[]),
|
|
408
|
+
BackendConfig("tvmcg", enabled=True, features=[]),
|
|
409
|
+
],
|
|
410
|
+
features=[
|
|
411
|
+
FrameworkFeatureConfig("memplan", framework="utvm", supported=False),
|
|
412
|
+
],
|
|
413
|
+
),
|
|
414
|
+
]
|
|
415
|
+
self.frontends = [
|
|
416
|
+
FrontendConfig("saved_model", enabled=False),
|
|
417
|
+
FrontendConfig("ipynb", enabled=False),
|
|
418
|
+
FrontendConfig(
|
|
419
|
+
"tflite",
|
|
420
|
+
enabled=True,
|
|
421
|
+
features=[
|
|
422
|
+
FrontendFeatureConfig("packing", frontend="tflite", supported=False),
|
|
423
|
+
],
|
|
424
|
+
),
|
|
425
|
+
]
|
|
426
|
+
self.vars = {
|
|
427
|
+
"TEST": "abc",
|
|
428
|
+
}
|
|
429
|
+
self.flags = {}
|
|
430
|
+
self.platforms = [
|
|
431
|
+
PlatformConfig(
|
|
432
|
+
"mlif",
|
|
433
|
+
enabled=True,
|
|
434
|
+
features=[PlatformFeatureConfig("debug", platform="mlif", supported=True)],
|
|
435
|
+
)
|
|
436
|
+
]
|
|
437
|
+
self.toolchains = {}
|
|
438
|
+
self.targets = [
|
|
439
|
+
TargetConfig(
|
|
440
|
+
"etiss_pulpino",
|
|
441
|
+
features=[
|
|
442
|
+
TargetFeatureConfig("debug", target="etiss_pulpino", supported=True),
|
|
443
|
+
TargetFeatureConfig("attach", target="etiss_pulpino", supported=True),
|
|
444
|
+
TargetFeatureConfig("trace", target="etiss_pulpino", supported=True),
|
|
445
|
+
],
|
|
446
|
+
),
|
|
447
|
+
TargetConfig(
|
|
448
|
+
"host_x86",
|
|
449
|
+
features=[
|
|
450
|
+
TargetFeatureConfig("debug", target="host_x86", supported=True),
|
|
451
|
+
TargetFeatureConfig("attach", target="host_x86", supported=True),
|
|
452
|
+
],
|
|
453
|
+
),
|
|
454
|
+
]
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
class UserEnvironment(DefaultEnvironment):
|
|
458
|
+
def __init__(
|
|
459
|
+
self,
|
|
460
|
+
home,
|
|
461
|
+
merge=False,
|
|
462
|
+
alias=None,
|
|
463
|
+
defaults=None,
|
|
464
|
+
paths=None,
|
|
465
|
+
repos=None,
|
|
466
|
+
frameworks=None,
|
|
467
|
+
frontends=None,
|
|
468
|
+
platforms=None,
|
|
469
|
+
toolchains=None,
|
|
470
|
+
targets=None,
|
|
471
|
+
variables=None,
|
|
472
|
+
default_flags=None,
|
|
473
|
+
):
|
|
474
|
+
super().__init__()
|
|
475
|
+
self._home = home
|
|
476
|
+
|
|
477
|
+
if merge:
|
|
478
|
+
raise NotImplementedError
|
|
479
|
+
|
|
480
|
+
if alias:
|
|
481
|
+
self.alias = alias
|
|
482
|
+
if defaults:
|
|
483
|
+
self.defaults = defaults
|
|
484
|
+
if paths:
|
|
485
|
+
self.paths = paths
|
|
486
|
+
if repos:
|
|
487
|
+
self.repos = repos
|
|
488
|
+
if frameworks:
|
|
489
|
+
self.frameworks = frameworks
|
|
490
|
+
if frontends:
|
|
491
|
+
self.frontends = frontends
|
|
492
|
+
if platforms:
|
|
493
|
+
self.platforms = platforms
|
|
494
|
+
if toolchains:
|
|
495
|
+
self.toolchains = toolchains
|
|
496
|
+
if targets:
|
|
497
|
+
self.targets = targets
|
|
498
|
+
if variables:
|
|
499
|
+
self.vars = variables
|
|
500
|
+
if default_flags:
|
|
501
|
+
self.flags = default_flags
|
|
@@ -0,0 +1,191 @@
|
|
|
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 sys
|
|
20
|
+
import git
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
import venv
|
|
23
|
+
import os
|
|
24
|
+
from .list import get_environment_names, get_alternative_name, register_environment
|
|
25
|
+
from .config import (
|
|
26
|
+
get_environments_dir,
|
|
27
|
+
env_subdirs,
|
|
28
|
+
get_config_dir,
|
|
29
|
+
get_environments_file,
|
|
30
|
+
DEFAULTS,
|
|
31
|
+
init_config_dir,
|
|
32
|
+
)
|
|
33
|
+
from .templates import write_environment_yaml_from_template
|
|
34
|
+
from mlonmcu.utils import in_virtualenv, ask_user
|
|
35
|
+
from mlonmcu.logging import get_logger
|
|
36
|
+
|
|
37
|
+
logger = get_logger()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def create_environment_directories(path, directories):
|
|
41
|
+
if not isinstance(path, Path):
|
|
42
|
+
path = Path(path)
|
|
43
|
+
if not path.is_dir():
|
|
44
|
+
raise RuntimeError(f"Not a diretory: {path}")
|
|
45
|
+
for directory in directories:
|
|
46
|
+
(path / directory).mkdir(parents=True, exist_ok=True)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def clone_models_repo(
|
|
50
|
+
dest, url="https://github.com/tum-ei-eda/mlonmcu-models.git"
|
|
51
|
+
): # TODO: how to get submodule url/ref
|
|
52
|
+
git.Repo.clone_from(url, dest)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def create_venv_directory(base, hidden=True):
|
|
56
|
+
if not isinstance(base, Path):
|
|
57
|
+
base = Path(base)
|
|
58
|
+
dirname = ".venv" if hidden else "venv"
|
|
59
|
+
venv_dir = base / dirname
|
|
60
|
+
venv.create(venv_dir)
|
|
61
|
+
print(f"Virtual environment was created in {venv_dir}. Make sure to activate it before using mlonmcu.")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def initialize_environment(
|
|
65
|
+
directory,
|
|
66
|
+
name,
|
|
67
|
+
interactive=True,
|
|
68
|
+
create_venv=None,
|
|
69
|
+
clone_models=None,
|
|
70
|
+
allow_exists=None,
|
|
71
|
+
register=None,
|
|
72
|
+
template=None,
|
|
73
|
+
config=None,
|
|
74
|
+
):
|
|
75
|
+
overwrite = False
|
|
76
|
+
assert template is not None
|
|
77
|
+
print("Initializing ML on MCU environment")
|
|
78
|
+
use_default_dir = directory == get_environments_dir()
|
|
79
|
+
has_name = len(name.strip()) > 0
|
|
80
|
+
if has_name:
|
|
81
|
+
final_name = name.strip()
|
|
82
|
+
else:
|
|
83
|
+
if use_default_dir:
|
|
84
|
+
final_name = DEFAULTS["environment"]
|
|
85
|
+
has_name = True
|
|
86
|
+
else:
|
|
87
|
+
final_name = "unnamed"
|
|
88
|
+
if use_default_dir:
|
|
89
|
+
target_dir = os.path.join(directory, final_name)
|
|
90
|
+
else:
|
|
91
|
+
target_dir = directory
|
|
92
|
+
target_dir = os.path.abspath(target_dir)
|
|
93
|
+
config_dir = get_config_dir()
|
|
94
|
+
if use_default_dir or register is not False:
|
|
95
|
+
if not os.path.exists(config_dir):
|
|
96
|
+
print(
|
|
97
|
+
f"The mlonmcu user config directory {config_dir} does not exist!",
|
|
98
|
+
end=" - ",
|
|
99
|
+
)
|
|
100
|
+
if not ask_user("Initialize?", default=True, interactive=interactive):
|
|
101
|
+
print("Aborting...")
|
|
102
|
+
sys.exit(1)
|
|
103
|
+
init_config_dir()
|
|
104
|
+
print("Initialized config directory.")
|
|
105
|
+
|
|
106
|
+
print("Selected target directory:", target_dir)
|
|
107
|
+
if os.path.exists(target_dir):
|
|
108
|
+
print("The directory already exists!")
|
|
109
|
+
if len(os.listdir(target_dir)) > 0:
|
|
110
|
+
print("The directory is not empty!", end=" - ")
|
|
111
|
+
# TODO: check for mlonmcu project files, if yes ask for overwrite instead
|
|
112
|
+
if allow_exists is False or (
|
|
113
|
+
allow_exists is None and not ask_user("Use anyway?", default=False, interactive=interactive)
|
|
114
|
+
):
|
|
115
|
+
print("Aborting...")
|
|
116
|
+
sys.exit(1)
|
|
117
|
+
print("Using existing directory.")
|
|
118
|
+
if has_name: # This is a hack
|
|
119
|
+
overwrite = True
|
|
120
|
+
else:
|
|
121
|
+
print("The directory does not exist!", end=" - ")
|
|
122
|
+
if not ask_user("Create directory?", default=True, interactive=interactive):
|
|
123
|
+
print("Aborting...")
|
|
124
|
+
sys.exit(1)
|
|
125
|
+
Path(target_dir).mkdir()
|
|
126
|
+
print("Created directory.")
|
|
127
|
+
print(f"Creating environment.yml based on template '{template}'.")
|
|
128
|
+
# TODO: create and maintain environments.yml in user directory?
|
|
129
|
+
write_environment_yaml_from_template(os.path.join(target_dir, "environment.yml"), template, home_dir=target_dir, config=config)
|
|
130
|
+
|
|
131
|
+
# FIXME: controversial?
|
|
132
|
+
if create_venv is None:
|
|
133
|
+
if not in_virtualenv():
|
|
134
|
+
print("It is strongly recommended to use mlonmcu inside a virtual Python environment.")
|
|
135
|
+
if ask_user("Create one automatically?", default=False, interactive=interactive):
|
|
136
|
+
# TODO: create venv
|
|
137
|
+
create_venv_directory(target_dir)
|
|
138
|
+
else:
|
|
139
|
+
print("Skipping creation of virtual environment. (already inside one)")
|
|
140
|
+
else:
|
|
141
|
+
if create_venv:
|
|
142
|
+
print("The creation of a virtual environment was requested")
|
|
143
|
+
create_venv_directory(target_dir)
|
|
144
|
+
else:
|
|
145
|
+
print("Skipping creation of virtual environment.")
|
|
146
|
+
|
|
147
|
+
subdirs = env_subdirs
|
|
148
|
+
models_subdir = Path(target_dir) / "models"
|
|
149
|
+
if not models_subdir.is_dir():
|
|
150
|
+
if clone_models or (
|
|
151
|
+
clone_models is None
|
|
152
|
+
and ask_user(
|
|
153
|
+
"Clone mlonmcu-models repository into environment?",
|
|
154
|
+
default=True,
|
|
155
|
+
interactive=interactive,
|
|
156
|
+
)
|
|
157
|
+
):
|
|
158
|
+
clone_models_repo(models_subdir)
|
|
159
|
+
else:
|
|
160
|
+
subdirs.append("models")
|
|
161
|
+
|
|
162
|
+
print("Initializing directories in environment:", " ".join(subdirs))
|
|
163
|
+
create_environment_directories(target_dir, subdirs)
|
|
164
|
+
|
|
165
|
+
if register or (
|
|
166
|
+
register is None
|
|
167
|
+
and ask_user(
|
|
168
|
+
"Should the new environment be added to your list of environments?",
|
|
169
|
+
default=has_name,
|
|
170
|
+
interactive=interactive,
|
|
171
|
+
)
|
|
172
|
+
):
|
|
173
|
+
environments_file = get_environments_file()
|
|
174
|
+
if not os.path.isfile(environments_file):
|
|
175
|
+
print(f"Environments file ({environments_file}) does not exist!", end=" - ")
|
|
176
|
+
if ask_user("Create empty one?", default=True, interactive=interactive):
|
|
177
|
+
open(environments_file, "a").close()
|
|
178
|
+
print("Initialized empty environments file.")
|
|
179
|
+
|
|
180
|
+
env_names = get_environment_names()
|
|
181
|
+
if final_name in env_names and not overwrite:
|
|
182
|
+
alternative_name = get_alternative_name(final_name, env_names)
|
|
183
|
+
print(f"An environment with the name '{final_name}' already exists. Using '{alternative_name}' instead")
|
|
184
|
+
final_name = alternative_name
|
|
185
|
+
# TODO: interactively ask the user
|
|
186
|
+
print("Adding new environment to environments file.")
|
|
187
|
+
register_environment(final_name, target_dir, overwrite=overwrite)
|
|
188
|
+
|
|
189
|
+
print(f"Finished. Please add `export MLONMCU_HOME={target_dir}` to your shell configuration to use it anywhere")
|
|
190
|
+
print("Recommended next step: `mlonmcu setup` inside your virtual environment.")
|
|
191
|
+
print("Optional: `mlonmcu setup -g`")
|