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,190 @@
|
|
|
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
|
+
"""Definition of tasks used to dynamically install MLonMCU dependencies"""
|
|
20
|
+
|
|
21
|
+
import os
|
|
22
|
+
import multiprocessing
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
from mlonmcu.setup.task import TaskType
|
|
26
|
+
from mlonmcu.context.context import MlonMcuContext
|
|
27
|
+
from mlonmcu.setup import utils
|
|
28
|
+
from mlonmcu.logging import get_logger
|
|
29
|
+
|
|
30
|
+
from .common import get_task_factory
|
|
31
|
+
|
|
32
|
+
logger = get_logger()
|
|
33
|
+
|
|
34
|
+
Tasks = get_task_factory()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _validate_spike(context: MlonMcuContext, params=None):
|
|
38
|
+
if not context.environment.has_target("spike"):
|
|
39
|
+
return False
|
|
40
|
+
if params.get("vext", False):
|
|
41
|
+
if params.get("pext", False):
|
|
42
|
+
return False # Can not use booth at a time
|
|
43
|
+
if not context.environment.supports_feature("vext"):
|
|
44
|
+
return False
|
|
45
|
+
if params.get("pext", False):
|
|
46
|
+
if params.get("vext", False):
|
|
47
|
+
return False # Can not use booth at a time
|
|
48
|
+
if not context.environment.supports_feature("pext"):
|
|
49
|
+
return False
|
|
50
|
+
user_vars = context.environment.vars
|
|
51
|
+
if "spike.pk" not in user_vars: # TODO: also check command line flags?
|
|
52
|
+
assert "spikepk" in context.environment.repos, "Undefined repository: 'spikepk'"
|
|
53
|
+
if "spike.exe" not in user_vars: # TODO: also check command line flags?
|
|
54
|
+
assert "spike" in context.environment.repos, "Undefined repository: 'spike'"
|
|
55
|
+
return True
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@Tasks.provides(["spikepk.src_dir"])
|
|
59
|
+
@Tasks.validate(_validate_spike)
|
|
60
|
+
@Tasks.register(category=TaskType.TARGET)
|
|
61
|
+
def clone_spike_pk(
|
|
62
|
+
context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
|
|
63
|
+
):
|
|
64
|
+
"""Clone the spike proxt kernel."""
|
|
65
|
+
spikepkName = utils.makeDirName("spikepk")
|
|
66
|
+
spikepkSrcDir = context.environment.paths["deps"].path / "src" / spikepkName
|
|
67
|
+
user_vars = context.environment.vars
|
|
68
|
+
if "spike.pk" in user_vars: # TODO: also check command line flags?
|
|
69
|
+
return False
|
|
70
|
+
if rebuild or not utils.is_populated(spikepkSrcDir):
|
|
71
|
+
spikepkRepo = context.environment.repos["spikepk"]
|
|
72
|
+
utils.clone(spikepkRepo.url, spikepkSrcDir, branch=spikepkRepo.ref)
|
|
73
|
+
context.cache["spikepk.src_dir"] = spikepkSrcDir
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@Tasks.needs(["spikepk.src_dir", "riscv_gcc.install_dir", "riscv_gcc.name"])
|
|
77
|
+
@Tasks.provides(["spikepk.build_dir", "spike.pk"])
|
|
78
|
+
@Tasks.validate(_validate_spike)
|
|
79
|
+
@Tasks.register(category=TaskType.TARGET)
|
|
80
|
+
def build_spike_pk(
|
|
81
|
+
context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
|
|
82
|
+
):
|
|
83
|
+
"""Build Spike proxy kernel."""
|
|
84
|
+
if not params:
|
|
85
|
+
params = {}
|
|
86
|
+
user_vars = context.environment.vars
|
|
87
|
+
if "spike.pk" in user_vars: # TODO: also check command line flags?
|
|
88
|
+
return False
|
|
89
|
+
spikepkName = utils.makeDirName("spikepk")
|
|
90
|
+
spikepkSrcDir = context.cache["spikepk.src_dir"]
|
|
91
|
+
spikepkBuildDir = context.environment.paths["deps"].path / "build" / spikepkName
|
|
92
|
+
spikepkInstallDir = context.environment.paths["deps"].path / "install" / spikepkName
|
|
93
|
+
spikepkBin = spikepkInstallDir / "pk"
|
|
94
|
+
if rebuild or not (utils.is_populated(spikepkBuildDir) and spikepkBin.is_file()):
|
|
95
|
+
# No need to build a vext and non-vext variant?
|
|
96
|
+
utils.mkdirs(spikepkBuildDir)
|
|
97
|
+
gccName = context.cache["riscv_gcc.name"]
|
|
98
|
+
# assert gccName == "riscv32-unknown-elf", "Spike PK requires a non-multilib toolchain!"
|
|
99
|
+
vext = params.get("vext", False)
|
|
100
|
+
pext = params.get("pext", False)
|
|
101
|
+
assert not (pext and vext), "Currently only p or vector extension can be enabled at a time."
|
|
102
|
+
if vext and "riscv_gcc.install_dir_vext" in user_vars:
|
|
103
|
+
riscv_gcc = user_vars["riscv_gcc.install_dir_vext"]
|
|
104
|
+
elif pext and "riscv_gcc.install_dir_pext" in user_vars:
|
|
105
|
+
riscv_gcc = user_vars["riscv_gcc.install_dir_pext"]
|
|
106
|
+
elif "riscv_gcc.install_dir" in user_vars:
|
|
107
|
+
riscv_gcc = user_vars["riscv_gcc.install_dir"]
|
|
108
|
+
else:
|
|
109
|
+
riscv_gcc = context.cache["riscv_gcc.install_dir"]
|
|
110
|
+
arch = "rv32imafdc"
|
|
111
|
+
spikepkArgs = []
|
|
112
|
+
spikepkArgs.append("--prefix=" + str(riscv_gcc))
|
|
113
|
+
spikepkArgs.append("--host=" + gccName)
|
|
114
|
+
spikepkArgs.append(f"--with-arch={arch}")
|
|
115
|
+
spikepkArgs.append("--with-abi=ilp32d")
|
|
116
|
+
env = os.environ.copy()
|
|
117
|
+
env["PATH"] = str(Path(riscv_gcc) / "bin") + ":" + env["PATH"]
|
|
118
|
+
utils.exec_getout(
|
|
119
|
+
str(spikepkSrcDir / "configure"),
|
|
120
|
+
*spikepkArgs,
|
|
121
|
+
cwd=spikepkBuildDir,
|
|
122
|
+
env=env,
|
|
123
|
+
live=False,
|
|
124
|
+
print_output=False,
|
|
125
|
+
)
|
|
126
|
+
utils.make(cwd=spikepkBuildDir, threads=threads, live=verbose, env=env)
|
|
127
|
+
# utils.make(target="install", cwd=spikepkBuildDir, live=verbose, env=env)
|
|
128
|
+
utils.mkdirs(spikepkInstallDir)
|
|
129
|
+
utils.move(spikepkBuildDir / "pk", spikepkBin)
|
|
130
|
+
context.cache["spikepk.build_dir"] = spikepkBuildDir
|
|
131
|
+
context.cache["spike.pk"] = spikepkBin
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
@Tasks.provides(["spike.src_dir"])
|
|
135
|
+
@Tasks.validate(_validate_spike)
|
|
136
|
+
@Tasks.register(category=TaskType.TARGET)
|
|
137
|
+
def clone_spike(
|
|
138
|
+
context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
|
|
139
|
+
):
|
|
140
|
+
"""Clone the spike simulator."""
|
|
141
|
+
spikeName = utils.makeDirName("spike")
|
|
142
|
+
spikeSrcDir = context.environment.paths["deps"].path / "src" / spikeName
|
|
143
|
+
user_vars = context.environment.vars
|
|
144
|
+
if "spike.exe" in user_vars: # TODO: also check command line flags?
|
|
145
|
+
return False
|
|
146
|
+
if rebuild or not utils.is_populated(spikeSrcDir):
|
|
147
|
+
spikeRepo = context.environment.repos["spike"]
|
|
148
|
+
utils.clone(spikeRepo.url, spikeSrcDir, branch=spikeRepo.ref)
|
|
149
|
+
context.cache["spike.src_dir"] = spikeSrcDir
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
@Tasks.needs(["spike.src_dir", "riscv_gcc.install_dir", "riscv_gcc.name"])
|
|
153
|
+
@Tasks.provides(["spike.build_dir", "spike.exe"])
|
|
154
|
+
@Tasks.validate(_validate_spike)
|
|
155
|
+
@Tasks.register(category=TaskType.TARGET)
|
|
156
|
+
def build_spike(
|
|
157
|
+
context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
|
|
158
|
+
):
|
|
159
|
+
"""Build Spike simulator."""
|
|
160
|
+
if not params:
|
|
161
|
+
params = {}
|
|
162
|
+
user_vars = context.environment.vars
|
|
163
|
+
if "spike.exe" in user_vars: # TODO: also check command line flags?
|
|
164
|
+
return False
|
|
165
|
+
spikeName = utils.makeDirName("spike")
|
|
166
|
+
spikeSrcDir = context.cache["spike.src_dir"]
|
|
167
|
+
spikeBuildDir = context.environment.paths["deps"].path / "build" / spikeName
|
|
168
|
+
spikeInstallDir = context.environment.paths["deps"].path / "install" / spikeName
|
|
169
|
+
spikeExe = spikeInstallDir / "spike"
|
|
170
|
+
user_vars = context.environment.vars
|
|
171
|
+
if "spike.exe" in user_vars: # TODO: also check command line flags?
|
|
172
|
+
return False
|
|
173
|
+
if rebuild or not (utils.is_populated(spikeBuildDir) and spikeExe.is_file()):
|
|
174
|
+
# No need to build a vext and non-vext variant?
|
|
175
|
+
utils.mkdirs(spikeBuildDir)
|
|
176
|
+
spikeArgs = []
|
|
177
|
+
spikeArgs.append("--prefix=" + str(context.cache["riscv_gcc.install_dir"]))
|
|
178
|
+
utils.exec_getout(
|
|
179
|
+
str(spikeSrcDir / "configure"),
|
|
180
|
+
*spikeArgs,
|
|
181
|
+
cwd=spikeBuildDir,
|
|
182
|
+
live=False,
|
|
183
|
+
print_output=False,
|
|
184
|
+
)
|
|
185
|
+
utils.make(cwd=spikeBuildDir, threads=threads, live=verbose)
|
|
186
|
+
# utils.make(target="install", cwd=spikeBuildDir, threads=threads, live=verbose)
|
|
187
|
+
utils.mkdirs(spikeInstallDir)
|
|
188
|
+
utils.move(spikeBuildDir / "spike", spikeExe)
|
|
189
|
+
context.cache["spike.build_dir"] = spikeBuildDir
|
|
190
|
+
context.cache["spike.exe"] = spikeExe
|
|
@@ -0,0 +1,92 @@
|
|
|
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
|
+
"""Definition of tasks used to dynamically install MLonMCU dependencies"""
|
|
20
|
+
|
|
21
|
+
import multiprocessing
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
|
|
24
|
+
from mlonmcu.setup.task import TaskType
|
|
25
|
+
from mlonmcu.context.context import MlonMcuContext
|
|
26
|
+
from mlonmcu.setup import utils
|
|
27
|
+
from mlonmcu.logging import get_logger
|
|
28
|
+
|
|
29
|
+
from .common import get_task_factory
|
|
30
|
+
|
|
31
|
+
logger = get_logger()
|
|
32
|
+
|
|
33
|
+
Tasks = get_task_factory()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _validate_tensorflow(context: MlonMcuContext, params=None):
|
|
37
|
+
return context.environment.has_framework("tflm")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@Tasks.provides(["tf.src_dir"])
|
|
41
|
+
@Tasks.validate(_validate_tensorflow)
|
|
42
|
+
@Tasks.register(category=TaskType.FRAMEWORK)
|
|
43
|
+
def clone_tensorflow(
|
|
44
|
+
context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
|
|
45
|
+
):
|
|
46
|
+
"""Clone the TF/TFLM repository."""
|
|
47
|
+
tfName = utils.makeDirName("tf")
|
|
48
|
+
tfSrcDir = context.environment.paths["deps"].path / "src" / tfName
|
|
49
|
+
if rebuild or not utils.is_populated(tfSrcDir):
|
|
50
|
+
tfRepo = context.environment.repos["tensorflow"]
|
|
51
|
+
utils.clone(tfRepo.url, tfSrcDir, branch=tfRepo.ref, refresh=rebuild)
|
|
52
|
+
context.cache["tf.src_dir"] = tfSrcDir
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@Tasks.needs(["tf.src_dir"])
|
|
56
|
+
@Tasks.provides(["tf.dl_dir", "tf.lib_path"])
|
|
57
|
+
# @Tasks.param("dbg", False)
|
|
58
|
+
@Tasks.param("dbg", True)
|
|
59
|
+
@Tasks.validate(_validate_tensorflow)
|
|
60
|
+
@Tasks.register(category=TaskType.FRAMEWORK)
|
|
61
|
+
def build_tensorflow(
|
|
62
|
+
context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
|
|
63
|
+
):
|
|
64
|
+
"""Download tensorflow dependencies and build lib."""
|
|
65
|
+
if not params:
|
|
66
|
+
params = {}
|
|
67
|
+
flags = utils.makeFlags((params["dbg"], "dbg"))
|
|
68
|
+
# tfName = utils.makeDirName("tf", flags=flags)
|
|
69
|
+
tfSrcDir = context.cache["tf.src_dir"]
|
|
70
|
+
tflmDir = Path(tfSrcDir) / "tensorflow" / "lite" / "micro"
|
|
71
|
+
tflmBuildDir = tflmDir / "tools" / "make"
|
|
72
|
+
tflmDownloadsDir = tflmBuildDir / "downloads"
|
|
73
|
+
if params["dbg"]:
|
|
74
|
+
tflmLib = (
|
|
75
|
+
tflmBuildDir / "gen" / "linux_x86_64" / "lib" / "libtensorflow-microlite.a"
|
|
76
|
+
) # FIXME: add _dbg suffix is possible
|
|
77
|
+
else:
|
|
78
|
+
tflmLib = tflmBuildDir / "gen" / "linux_x86_64" / "lib" / "libtensorflow-microlite.a"
|
|
79
|
+
# if rebuild or not tflmLib.is_file() or not utils.is_populated(tflmDownloadsDir):
|
|
80
|
+
if rebuild or not utils.is_populated(tflmDownloadsDir):
|
|
81
|
+
tfDbgArg = ["BUILD_TYPE=debug"] if params["dbg"] else []
|
|
82
|
+
utils.make(
|
|
83
|
+
"-f",
|
|
84
|
+
str(tflmDir / "tools" / "make" / "Makefile"),
|
|
85
|
+
"third_party_downloads",
|
|
86
|
+
threads=threads,
|
|
87
|
+
*tfDbgArg,
|
|
88
|
+
cwd=tfSrcDir,
|
|
89
|
+
live=verbose,
|
|
90
|
+
)
|
|
91
|
+
context.cache["tf.dl_dir"] = tflmDownloadsDir
|
|
92
|
+
context.cache["tf.lib_path", flags] = tflmLib # ignore!
|
|
@@ -0,0 +1,59 @@
|
|
|
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
|
+
"""Definition of tasks used to dynamically install MLonMCU dependencies"""
|
|
20
|
+
|
|
21
|
+
import multiprocessing
|
|
22
|
+
|
|
23
|
+
from mlonmcu.setup.task import TaskType
|
|
24
|
+
from mlonmcu.context.context import MlonMcuContext
|
|
25
|
+
from mlonmcu.setup import utils
|
|
26
|
+
from mlonmcu.logging import get_logger
|
|
27
|
+
|
|
28
|
+
from .common import get_task_factory
|
|
29
|
+
|
|
30
|
+
logger = get_logger()
|
|
31
|
+
|
|
32
|
+
Tasks = get_task_factory()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _validate_tflite_visualize(context: MlonMcuContext, params=None):
|
|
36
|
+
return context.environment.has_frontend("tflite") and context.environment.has_feature("visualize")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@Tasks.provides(["tflite_visualize.exe"])
|
|
40
|
+
@Tasks.validate(_validate_tflite_visualize)
|
|
41
|
+
@Tasks.register(category=TaskType.FEATURE)
|
|
42
|
+
def download_tflite_vizualize(
|
|
43
|
+
context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
|
|
44
|
+
):
|
|
45
|
+
"""Download the visualize.py script for TFLite."""
|
|
46
|
+
# This script is content of the tensorflow repo (not tflite-micro) and unfortunately not bundled
|
|
47
|
+
# into the tensorflow python package. Therefore just download this single file form GitHub
|
|
48
|
+
|
|
49
|
+
tfLiteVizualizeName = utils.makeDirName("tflite_visualize")
|
|
50
|
+
tfLiteVizualizeInstallDir = context.environment.paths["deps"].path / "install" / tfLiteVizualizeName
|
|
51
|
+
tfLiteVizualizeExe = tfLiteVizualizeInstallDir / "visualize.py"
|
|
52
|
+
user_vars = context.environment.vars
|
|
53
|
+
if "tflite_visualize.exe" in user_vars: # TODO: also check command line flags?
|
|
54
|
+
return False
|
|
55
|
+
if rebuild or not utils.is_populated(tfLiteVizualizeInstallDir):
|
|
56
|
+
tfLiteVizualizeInstallDir.mkdir()
|
|
57
|
+
url = "https://raw.githubusercontent.com/tensorflow/tensorflow/master/tensorflow/lite/tools/visualize.py"
|
|
58
|
+
utils.download(url, tfLiteVizualizeExe, progress=verbose)
|
|
59
|
+
context.cache["tflite_visualize.exe"] = tfLiteVizualizeExe
|
|
@@ -0,0 +1,141 @@
|
|
|
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
|
+
"""Definition of tasks used to dynamically install MLonMCU dependencies"""
|
|
20
|
+
|
|
21
|
+
import multiprocessing
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
|
|
24
|
+
from mlonmcu.setup.task import TaskType
|
|
25
|
+
from mlonmcu.context.context import MlonMcuContext
|
|
26
|
+
from mlonmcu.setup import utils
|
|
27
|
+
from mlonmcu.logging import get_logger
|
|
28
|
+
|
|
29
|
+
from .tf import _validate_tensorflow
|
|
30
|
+
from .common import get_task_factory
|
|
31
|
+
|
|
32
|
+
logger = get_logger()
|
|
33
|
+
|
|
34
|
+
Tasks = get_task_factory()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _validate_tflite_micro_compiler(context: MlonMcuContext, params=None):
|
|
38
|
+
if not _validate_tensorflow(context, params=params):
|
|
39
|
+
return False
|
|
40
|
+
if not context.environment.has_backend("tflmc"):
|
|
41
|
+
return False
|
|
42
|
+
return True
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@Tasks.provides(["tflmc.src_dir"])
|
|
46
|
+
@Tasks.validate(_validate_tflite_micro_compiler)
|
|
47
|
+
@Tasks.register(category=TaskType.BACKEND)
|
|
48
|
+
def clone_tflite_micro_compiler(
|
|
49
|
+
context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
|
|
50
|
+
):
|
|
51
|
+
"""Clone the preinterpreter repository."""
|
|
52
|
+
tflmcName = utils.makeDirName("tflmc")
|
|
53
|
+
tflmcSrcDir = context.environment.paths["deps"].path / "src" / tflmcName
|
|
54
|
+
if rebuild or not utils.is_populated(tflmcSrcDir):
|
|
55
|
+
tflmcRepo = context.environment.repos["tflite_micro_compiler"]
|
|
56
|
+
utils.clone(tflmcRepo.url, tflmcSrcDir, branch=tflmcRepo.ref)
|
|
57
|
+
context.cache["tflmc.src_dir"] = tflmcSrcDir
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _validate_build_tflite_micro_compiler(context: MlonMcuContext, params=None):
|
|
61
|
+
if params:
|
|
62
|
+
muriscvnn = params.get("muriscvnn", False)
|
|
63
|
+
cmsisnn = params.get("cmsisnn", False)
|
|
64
|
+
if muriscvnn and cmsisnn:
|
|
65
|
+
# Not allowed
|
|
66
|
+
return False
|
|
67
|
+
elif muriscvnn:
|
|
68
|
+
if not context.environment.supports_feature("muriscvnn"):
|
|
69
|
+
return False
|
|
70
|
+
elif cmsisnn:
|
|
71
|
+
if not context.environment.supports_feature("cmsisnn"):
|
|
72
|
+
return False
|
|
73
|
+
return _validate_tflite_micro_compiler(context, params=params)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@Tasks.needs(["tflmc.src_dir", "tf.src_dir"])
|
|
77
|
+
@Tasks.optional(["muriscvnn.lib", "muriscvnn.inc_dir", "cmsisnn.dir"])
|
|
78
|
+
@Tasks.provides(["tflmc.build_dir", "tflmc.exe"])
|
|
79
|
+
@Tasks.param("muriscvnn", [False, True])
|
|
80
|
+
@Tasks.param("cmsisnn", [False, True])
|
|
81
|
+
@Tasks.param("dbg", [False, True])
|
|
82
|
+
@Tasks.param("arch", ["x86"]) # TODO: compile for arm/riscv in the future
|
|
83
|
+
@Tasks.validate(_validate_build_tflite_micro_compiler)
|
|
84
|
+
@Tasks.register(category=TaskType.BACKEND)
|
|
85
|
+
def build_tflite_micro_compiler(
|
|
86
|
+
context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
|
|
87
|
+
):
|
|
88
|
+
"""Build the TFLM preinterpreter."""
|
|
89
|
+
muriscvnn = params.get("muriscvnn", False)
|
|
90
|
+
cmsisnn = params.get("cmsisnn", False)
|
|
91
|
+
dbg = params.get("dbg", False)
|
|
92
|
+
arch = params.get("arch", "x86")
|
|
93
|
+
flags = utils.makeFlags((True, arch), (muriscvnn, "muriscvnn"), (cmsisnn, "cmsisnn"), (dbg, "dbg"))
|
|
94
|
+
# flags_ = utils.makeFlags((dbg, "dbg"))
|
|
95
|
+
tflmcName = utils.makeDirName("tflmc", flags=flags)
|
|
96
|
+
tflmcBuildDir = context.environment.paths["deps"].path / "build" / tflmcName
|
|
97
|
+
tflmcInstallDir = context.environment.paths["deps"].path / "install" / tflmcName
|
|
98
|
+
tflmcExe = tflmcInstallDir / "compiler"
|
|
99
|
+
tfSrcDir = context.cache["tf.src_dir"]
|
|
100
|
+
tflmcSrcDir = context.cache["tflmc.src_dir"]
|
|
101
|
+
if rebuild or not utils.is_populated(tflmcBuildDir) or not tflmcExe.is_file():
|
|
102
|
+
cmakeArgs = [
|
|
103
|
+
"-DTF_SRC=" + str(tfSrcDir),
|
|
104
|
+
"-DGET_TF_SRC=ON",
|
|
105
|
+
]
|
|
106
|
+
if muriscvnn:
|
|
107
|
+
flags__ = utils.makeFlags((True, arch), (True, "gcc"), (dbg, "dbg"))
|
|
108
|
+
muriscvnnLib = context.cache["muriscvnn.lib", flags__]
|
|
109
|
+
muriscvnnInc = context.cache["muriscvnn.inc_dir"]
|
|
110
|
+
cmakeArgs.append("-DTFLM_OPTIMIZED_KERNEL=cmsis_nn")
|
|
111
|
+
cmakeArgs.append(f"-DTFLM_OPTIMIZED_KERNEL_LIB={muriscvnnLib}")
|
|
112
|
+
cmakeArgs.append(f"-DTFLM_OPTIMIZED_KERNEL_INCLUDE_DIR={muriscvnnInc}")
|
|
113
|
+
elif cmsisnn:
|
|
114
|
+
flags__ = utils.makeFlags((True, arch), (dbg, "dbg"))
|
|
115
|
+
cmsisnnLib = context.cache["cmsisnn.lib", flags__]
|
|
116
|
+
cmsisDir = Path(context.cache["cmsisnn.dir"])
|
|
117
|
+
cmsisIncs = r"\;".join(
|
|
118
|
+
[
|
|
119
|
+
str(cmsisDir),
|
|
120
|
+
str(cmsisDir / "CMSIS" / "Core" / "Include"),
|
|
121
|
+
str(cmsisDir / "CMSIS" / "NN" / "Include"),
|
|
122
|
+
str(cmsisDir / "CMSIS" / "DSP" / "Include"),
|
|
123
|
+
]
|
|
124
|
+
)
|
|
125
|
+
cmakeArgs.append("-DTFLM_OPTIMIZED_KERNEL=cmsis_nn")
|
|
126
|
+
cmakeArgs.append(f"-DTFLM_OPTIMIZED_KERNEL_LIB={cmsisnnLib}")
|
|
127
|
+
cmakeArgs.append(f"-DTFLM_OPTIMIZED_KERNEL_INCLUDE_DIR={cmsisIncs}")
|
|
128
|
+
utils.mkdirs(tflmcBuildDir)
|
|
129
|
+
# utils.cmake("-DTF_SRC=" + str(tfSrcDir), str(tflmcSrcDir), debug=params["dbg"], cwd=tflmcBuildDir)
|
|
130
|
+
utils.cmake(
|
|
131
|
+
*cmakeArgs,
|
|
132
|
+
str(tflmcSrcDir),
|
|
133
|
+
debug=dbg,
|
|
134
|
+
cwd=tflmcBuildDir,
|
|
135
|
+
live=verbose,
|
|
136
|
+
)
|
|
137
|
+
utils.make(cwd=tflmcBuildDir, threads=threads, live=verbose)
|
|
138
|
+
utils.mkdirs(tflmcInstallDir)
|
|
139
|
+
utils.move(tflmcBuildDir / "compiler", tflmcExe)
|
|
140
|
+
context.cache["tflmc.build_dir", flags] = tflmcBuildDir
|
|
141
|
+
context.cache["tflmc.exe", flags] = tflmcExe
|
|
@@ -0,0 +1,172 @@
|
|
|
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
|
+
"""Definition of tasks used to dynamically install MLonMCU dependencies"""
|
|
20
|
+
|
|
21
|
+
import multiprocessing
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
|
|
24
|
+
from mlonmcu.setup.task import TaskType
|
|
25
|
+
from mlonmcu.context.context import MlonMcuContext
|
|
26
|
+
from mlonmcu.setup import utils
|
|
27
|
+
from mlonmcu.logging import get_logger
|
|
28
|
+
|
|
29
|
+
from .common import get_task_factory
|
|
30
|
+
|
|
31
|
+
logger = get_logger()
|
|
32
|
+
|
|
33
|
+
Tasks = get_task_factory()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _validate_tvm(context: MlonMcuContext, params=None):
|
|
37
|
+
user_vars = context.environment.vars
|
|
38
|
+
patch = bool(params.get("patch", False))
|
|
39
|
+
if patch:
|
|
40
|
+
if not context.environment.has_feature("disable_legalize"):
|
|
41
|
+
return False
|
|
42
|
+
return context.environment.has_framework("tvm")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _validate_tvm_build(context: MlonMcuContext, params=None):
|
|
46
|
+
user_vars = context.environment.vars
|
|
47
|
+
use_tlcpack = user_vars.get("tvm.use_tlcpack", False)
|
|
48
|
+
patch = bool(params.get("patch", False))
|
|
49
|
+
if patch:
|
|
50
|
+
if not context.environment.has_feature("disable_legalize"):
|
|
51
|
+
return False
|
|
52
|
+
if use_tlcpack:
|
|
53
|
+
assert not context.environment.has_feature("disable_legalize")
|
|
54
|
+
return False
|
|
55
|
+
|
|
56
|
+
return context.environment.has_framework("tvm")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@Tasks.provides(["tvm.src_dir", "tvm.configs_dir"])
|
|
60
|
+
@Tasks.optional(["tvm_extensions.src_dir"])
|
|
61
|
+
@Tasks.validate(_validate_tvm)
|
|
62
|
+
@Tasks.param("patch", [False, True]) # This is just a temporary workaround until the patch is hopefully upstreamed
|
|
63
|
+
@Tasks.validate(_validate_tvm)
|
|
64
|
+
@Tasks.register(category=TaskType.FRAMEWORK)
|
|
65
|
+
def clone_tvm(context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()):
|
|
66
|
+
"""Clone the TVM repository."""
|
|
67
|
+
if not params:
|
|
68
|
+
params = {}
|
|
69
|
+
patch = params["patch"]
|
|
70
|
+
flags = utils.makeFlags((patch, "patch"))
|
|
71
|
+
tvmName = utils.makeDirName("tvm", flags=flags)
|
|
72
|
+
tvmSrcDir = context.environment.paths["deps"].path / "src" / tvmName
|
|
73
|
+
tvmPythonPath = tvmSrcDir / "python"
|
|
74
|
+
if rebuild or not utils.is_populated(tvmSrcDir):
|
|
75
|
+
tvmRepo = context.environment.repos["tvm"]
|
|
76
|
+
utils.clone(tvmRepo.url, tvmSrcDir, branch=tvmRepo.ref, recursive=True)
|
|
77
|
+
if patch:
|
|
78
|
+
extSrcDir = context.cache["tvm_extensions.src_dir"]
|
|
79
|
+
patchFile = extSrcDir / "tvmc_diff.patch"
|
|
80
|
+
utils.apply(tvmSrcDir, patchFile)
|
|
81
|
+
|
|
82
|
+
context.cache["tvm.src_dir", flags] = tvmSrcDir
|
|
83
|
+
context.cache["tvm.configs_dir", flags] = tvmSrcDir / "configs"
|
|
84
|
+
context.cache["tvm.pythonpath", flags] = tvmPythonPath
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@Tasks.needs(["tvm.src_dir", "llvm.install_dir"])
|
|
88
|
+
@Tasks.provides(["tvm.build_dir", "tvm.lib"])
|
|
89
|
+
@Tasks.param("dbg", False)
|
|
90
|
+
@Tasks.param("cmsisnn", [False, True])
|
|
91
|
+
@Tasks.validate(_validate_tvm_build)
|
|
92
|
+
@Tasks.register(category=TaskType.FRAMEWORK)
|
|
93
|
+
def build_tvm(context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()):
|
|
94
|
+
"""Build the TVM framework."""
|
|
95
|
+
if not params:
|
|
96
|
+
params = {}
|
|
97
|
+
flags = utils.makeFlags((params["dbg"], "dbg"), (params["cmsisnn"], "cmsisnn"))
|
|
98
|
+
dbg = bool(params["dbg"])
|
|
99
|
+
cmsisnn = bool(params["cmsisnn"])
|
|
100
|
+
# FIXME: Try to use TVM dir outside of src dir to allow multiple versions/dbg etc!
|
|
101
|
+
# This should help: TVM_LIBRARY_PATH -> tvm.build_dir
|
|
102
|
+
tvmName = utils.makeDirName("tvm", flags=flags)
|
|
103
|
+
tvmSrcDir = context.cache["tvm.src_dir", ()] # params["patch"] does not affect the build
|
|
104
|
+
tvmBuildDir = context.environment.paths["deps"].path / "build" / tvmName
|
|
105
|
+
tvmLib = tvmBuildDir / "libtvm.so"
|
|
106
|
+
user_vars = context.environment.vars
|
|
107
|
+
if rebuild or not utils.is_populated(tvmBuildDir) or not tvmLib.is_file():
|
|
108
|
+
ninja = False
|
|
109
|
+
if "tvm.make_tool" in user_vars:
|
|
110
|
+
if user_vars["tvm.make_tool"] == "ninja":
|
|
111
|
+
ninja = True
|
|
112
|
+
utils.mkdirs(tvmBuildDir)
|
|
113
|
+
cfgFileSrc = Path(tvmSrcDir) / "cmake" / "config.cmake"
|
|
114
|
+
cfgFile = tvmBuildDir / "config.cmake"
|
|
115
|
+
llvmConfig = str(context.cache["llvm.install_dir"] / "bin" / "llvm-config")
|
|
116
|
+
llvmConfigEscaped = str(llvmConfig).replace("/", "\\/")
|
|
117
|
+
utils.copy(cfgFileSrc, cfgFile)
|
|
118
|
+
utils.exec(
|
|
119
|
+
"sed",
|
|
120
|
+
"-i",
|
|
121
|
+
"--",
|
|
122
|
+
r"s/USE_MICRO OFF/USE_MICRO ON/g",
|
|
123
|
+
str(cfgFile),
|
|
124
|
+
)
|
|
125
|
+
utils.exec(
|
|
126
|
+
"sed",
|
|
127
|
+
"-i",
|
|
128
|
+
"--",
|
|
129
|
+
r"s/USE_MICRO_STANDALONE_RUNTIME OFF/USE_MICRO_STANDALONE_RUNTIME ON/g",
|
|
130
|
+
str(cfgFile),
|
|
131
|
+
)
|
|
132
|
+
utils.exec(
|
|
133
|
+
"sed",
|
|
134
|
+
"-i",
|
|
135
|
+
"--",
|
|
136
|
+
r"s/USE_LLVM \(OFF\|ON\)/USE_LLVM " + llvmConfigEscaped + "/g",
|
|
137
|
+
str(cfgFile),
|
|
138
|
+
)
|
|
139
|
+
if cmsisnn:
|
|
140
|
+
utils.exec(
|
|
141
|
+
"sed",
|
|
142
|
+
"-i",
|
|
143
|
+
"--",
|
|
144
|
+
r"s/USE_CMSISNN \(OFF\|ON\)/USE_CMSISNN ON/g",
|
|
145
|
+
str(cfgFile),
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
utils.cmake(tvmSrcDir, cwd=tvmBuildDir, debug=dbg, use_ninja=ninja, live=verbose)
|
|
149
|
+
utils.make(cwd=tvmBuildDir, threads=threads, use_ninja=ninja, live=verbose)
|
|
150
|
+
context.cache["tvm.build_dir", flags] = tvmBuildDir
|
|
151
|
+
context.cache["tvm.lib", flags] = tvmLib
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def _validate_tvm_extensions(context: MlonMcuContext, params=None):
|
|
155
|
+
return _validate_tvm_build(context, params=params) and context.environment.has_feature("disable_legalize")
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
@Tasks.provides(["tvm_extensions.src_dir", "tvm_extensions.wrapper"])
|
|
159
|
+
@Tasks.validate(_validate_tvm_extensions)
|
|
160
|
+
@Tasks.register(category=TaskType.FEATURE)
|
|
161
|
+
def clone_tvm_extensions(
|
|
162
|
+
context: MlonMcuContext, params=None, rebuild=False, verbose=False, threads=multiprocessing.cpu_count()
|
|
163
|
+
):
|
|
164
|
+
"""Clone the TVM extensions repository."""
|
|
165
|
+
extName = utils.makeDirName("tvm_extensions")
|
|
166
|
+
extSrcDir = context.environment.paths["deps"].path / "src" / extName
|
|
167
|
+
extWrapper = extSrcDir / "tvmc_wrapper.py"
|
|
168
|
+
if rebuild or not utils.is_populated(extSrcDir):
|
|
169
|
+
extRepo = context.environment.repos["tvm_extensions"]
|
|
170
|
+
utils.clone(extRepo.url, extSrcDir, branch=extRepo.ref, refresh=rebuild)
|
|
171
|
+
context.cache["tvm_extensions.src_dir"] = extSrcDir
|
|
172
|
+
context.cache["tvm_extensions.wrapper"] = extWrapper
|