diff --git a/.gitignore b/.gitignore index 26b05ae84..06cc8226c 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ tools/alif/**/*.ds tools/alif/**/*.bin tools/alif/**/*.bin.sign tools/alif/build/*-map.txt +tools/st/stedgeai diff --git a/tools/ci.sh b/tools/ci.sh index 125dacccf..aa87900b6 100755 --- a/tools/ci.sh +++ b/tools/ci.sh @@ -5,12 +5,6 @@ GCC_TOOLCHAIN_PATH=${HOME}/cache/gcc GCC_TOOLCHAIN_URL="https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz" -LLVM_TOOLCHAIN_PATH=${HOME}/cache/llvm -LLVM_TOOLCHAIN_URL="https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-18.1.3/LLVM-ET-Arm-18.1.3-Linux-x86_64.tar.xz" - -GNU_MAKE_PATH=${HOME}/cache/make -GNU_MAKE_URL="https://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz" - ci_install_arm_gcc() { mkdir -p ${GCC_TOOLCHAIN_PATH} wget --no-check-certificate -O - ${GCC_TOOLCHAIN_URL} | tar --strip-components=1 -Jx -C ${GCC_TOOLCHAIN_PATH} @@ -18,6 +12,11 @@ ci_install_arm_gcc() { arm-none-eabi-gcc --version } +######################################################################################## +# Install ARM LLVM. +LLVM_TOOLCHAIN_PATH=${HOME}/cache/llvm +LLVM_TOOLCHAIN_URL="https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-18.1.3/LLVM-ET-Arm-18.1.3-Linux-x86_64.tar.xz" + ci_install_arm_llvm() { mkdir -p ${LLVM_TOOLCHAIN_PATH} wget --no-check-certificate -O - ${LLVM_TOOLCHAIN_URL} | tar --strip-components=1 -Jx -C ${LLVM_TOOLCHAIN_PATH} @@ -25,6 +24,11 @@ ci_install_arm_llvm() { clang --version } +######################################################################################## +# Install GNU Make. +GNU_MAKE_PATH=${HOME}/cache/make +GNU_MAKE_URL="https://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz" + ci_install_gnu_make() { mkdir -p ${GNU_MAKE_PATH} wget --no-check-certificate -O - ${GNU_MAKE_URL} | tar --strip-components=1 -zx -C ${GNU_MAKE_PATH} @@ -35,7 +39,6 @@ ci_install_gnu_make() { ######################################################################################## # Update Submodules. - ci_update_submodules() { git submodule update --init --depth=1 --no-single-branch git -C lib/micropython/ submodule update --init --depth=1 @@ -43,7 +46,6 @@ ci_update_submodules() { ######################################################################################## # Build Targets. - ci_build_target() { export LLVM_PATH=${LLVM_TOOLCHAIN_PATH}/bin export PATH=${GNU_MAKE_PATH}:${GCC_TOOLCHAIN_PATH}/bin:${PATH} @@ -59,7 +61,6 @@ ci_build_target() { ######################################################################################## # Prepare Firmware Packages. - ci_package_firmware_release() { # Add WiFi firmware blobs cp -rf drivers/cyw4343/firmware firmware/CYW4343 @@ -93,7 +94,6 @@ ci_install_code_format_deps() { ######################################################################################## # Run code formatter - ci_run_code_format_check() { export PATH=${CODEFORMAT_PATH}/bin:${PATH} UNCRUSTIFY_CONFIG=tools/uncrustify.cfg @@ -110,3 +110,52 @@ ci_run_code_format_check() { done exit $exit_code } + +######################################################################################## +# Install STEdgeAI tools +STEDGEAI_URL="https://upload.openmv.io/stedgeai/STEdgeAI-2.1.0.tar.gz" +STEDGEAI_SHA256="888e71715127ff6384e38fcde96eea28f53f8370b2bb9cf0d2f6f939001b350c" +STEDGEAI_CACHE="${HOME}/cache/stedgeai" + +ci_install_stedgeai() { + STEDGEAI_PATH="${1}" + + # If cached in CI, copy from cache to build. + if [ -d "${STEDGEAI_CACHE}" ]; then + mkdir -p "${STEDGEAI_PATH}" + cp -r "${STEDGEAI_CACHE}/." "${STEDGEAI_PATH}" + touch "${STEDGEAI_PATH}/stedgeai.stamp" + return 0 + fi + + # Download and install to STEDGEAI_PATH + echo "Downloading STEdge AI tools..." + mkdir -p "${STEDGEAI_PATH}" + + # Create temporary file + tmpfile=$(mktemp) + trap 'rm -f "$tmpfile"' EXIT + + # Download and verify checksum + wget --no-check-certificate -O "$tmpfile" "$STEDGEAI_URL" || { + echo "Download failed!" + return 1 + } + + echo "${STEDGEAI_SHA256} ${tmpfile}" | sha256sum -c - || { + echo "Checksum failed!" + return 1 + } + + # Extract the tools + echo "Extracting to ${STEDGEAI_PATH}..." + tar -xzf "$tmpfile" -C "${STEDGEAI_PATH}" --strip-components=1 || { + echo "Extraction failed!" + return 1 + } + + touch "${STEDGEAI_PATH}/stedgeai.stamp" + + echo "STEdgeAI installed successfully to ${STEDGEAI_PATH}" + return 0 +} diff --git a/tools/st/scripts/neuralart.json b/tools/st/scripts/neuralart.json new file mode 100644 index 000000000..df7afd50a --- /dev/null +++ b/tools/st/scripts/neuralart.json @@ -0,0 +1,10 @@ +{ + "Globals": { + }, + "Profiles": { + "default": { + "memory_pool": "stm32n6.mpool", + "options": "--native-float --mvei --cache-maintenance --Ocache-opt --enable-virtual-mem-pools --Os --optimization 3 --Oauto-sched --all-buffers-info --csv-file network.csv --enable-epoch-controller" + } + } +} diff --git a/tools/st/scripts/stm32n6.mpool b/tools/st/scripts/stm32n6.mpool new file mode 100755 index 000000000..d0dcc2168 --- /dev/null +++ b/tools/st/scripts/stm32n6.mpool @@ -0,0 +1,171 @@ +{ + "params": { + "param": [ + { + "paramname": "max_onchip_sram_size", + "value": "1024", + "magnitude": "KBYTES" + } + ] + }, + "memory": { + "cacheinfo": [ + { + "nlines": 512, + "linesize": 64, + "associativity": 8, + "bypass_enable": 1, + "prop": { + "rights": "ACC_WRITE", + "throughput": "MID", + "latency": "MID", + "byteWidth": 8, + "freqRatio": 2.50, + "read_power": 13.584, + "write_power": 12.645 + } + } + ], + "mem_file_prefix": "atonbuf", + "mempools": [ + { + "fname": "AXISRAM3", + "name": "npuRAM3", + "fformat": "FORMAT_RAW", + "prop": { + "rights": "ACC_WRITE", + "throughput": "HIGH", + "latency": "LOW", + "byteWidth": 8, + "freqRatio": 1.25, + "read_power": 18.531, + "write_power": 16.201 + }, + "offset": { + "value": "0x34200000", + "magnitude": "BYTES" + }, + "size": { + "value": "448", + "magnitude": "KBYTES" + } + }, + { + "fname": "AXISRAM4", + "name": "npuRAM4", + "fformat": "FORMAT_RAW", + "prop": { + "rights": "ACC_WRITE", + "throughput": "HIGH", + "latency": "LOW", + "byteWidth": 8, + "freqRatio": 1.25, + "read_power": 18.531, + "write_power": 16.201 + }, + "offset": { + "value": "0x34270000", + "magnitude": "BYTES" + }, + "size": { + "value": "448", + "magnitude": "KBYTES" + } + }, + { + "fname": "AXISRAM5", + "name": "npuRAM5", + "fformat": "FORMAT_RAW", + "prop": { + "rights": "ACC_WRITE", + "throughput": "HIGH", + "latency": "LOW", + "byteWidth": 8, + "freqRatio": 1.25, + "read_power": 18.531, + "write_power": 16.201 + }, + "offset": { + "value": "0x342e0000", + "magnitude": "BYTES" + }, + "size": { + "value": "448", + "magnitude": "KBYTES" + } + }, + { + "fname": "AXISRAM6", + "name": "npuRAM6", + "fformat": "FORMAT_RAW", + "prop": { + "rights": "ACC_WRITE", + "throughput": "HIGH", + "latency": "LOW", + "byteWidth": 8, + "freqRatio": 1.25, + "read_power": 18.531, + "write_power": 16.201 + }, + "offset": { + "value": "0x34350000", + "magnitude": "BYTES" + }, + "size": { + "value": "448", + "magnitude": "KBYTES" + } + }, + { + "fname": "xSPI1", + "name": "hyperRAM", + "fformat": "FORMAT_RAW", + "prop": { + "rights": "ACC_WRITE", + "throughput": "MID", + "latency": "HIGH", + "byteWidth": 2, + "freqRatio": 5.00, + "cacheable": "CACHEABLE_ON", + "read_power": 380, + "write_power": 340.0, + "constants_preferred": "true" + }, + "offset": { + "value": "0x92000000", + "magnitude": "BYTES" + }, + "size": { + "value": "16", + "magnitude": "MBYTES" + }, + "mode": "USEMODE_RELATIVE" + }, + { + "fname": "xSPI2", + "name": "octoFlash", + "fformat": "FORMAT_RAW", + "prop": { + "rights": "ACC_READ", + "throughput": "MID", + "latency": "HIGH", + "byteWidth": 1, + "freqRatio": 6.00, + "cacheable": "CACHEABLE_ON", + "read_power": 110, + "write_power": 400.0, + "constants_preferred": "true" + }, + "offset": { + "value": "0x71000000", + "magnitude": "BYTES" + }, + "size": { + "value": "16", + "magnitude": "MBYTES" + }, + "mode": "USEMODE_RELATIVE" + } + ] + } +}