1*523fa7a6SAndroid Build Coastguard Worker#!/usr/bin/env bash 2*523fa7a6SAndroid Build Coastguard Worker# Copyright (c) Meta Platforms, Inc. and affiliates. 3*523fa7a6SAndroid Build Coastguard Worker# All rights reserved. 4*523fa7a6SAndroid Build Coastguard Worker# 5*523fa7a6SAndroid Build Coastguard Worker# Copyright 2023-2024 Arm Limited and/or its affiliates. 6*523fa7a6SAndroid Build Coastguard Worker# 7*523fa7a6SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the 8*523fa7a6SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree. 9*523fa7a6SAndroid Build Coastguard Worker 10*523fa7a6SAndroid Build Coastguard Workerset -eu 11*523fa7a6SAndroid Build Coastguard Worker 12*523fa7a6SAndroid Build Coastguard Worker 13*523fa7a6SAndroid Build Coastguard Worker 14*523fa7a6SAndroid Build Coastguard Worker######## 15*523fa7a6SAndroid Build Coastguard Worker### Hardcoded constants 16*523fa7a6SAndroid Build Coastguard Worker######## 17*523fa7a6SAndroid Build Coastguard Workerscript_dir=$(cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd) 18*523fa7a6SAndroid Build Coastguard Worker 19*523fa7a6SAndroid Build Coastguard Worker# Default Ethos-u tool folder override with --scratch-dir=<FOLDER> 20*523fa7a6SAndroid Build Coastguard Workerroot_dir=${script_dir}/ethos-u-scratch 21*523fa7a6SAndroid Build Coastguard Worker 22*523fa7a6SAndroid Build Coastguard Workermodel_name="" 23*523fa7a6SAndroid Build Coastguard Workeraot_arm_compiler_flags="--delegate --quantize" 24*523fa7a6SAndroid Build Coastguard Workertarget="ethos-u55-128" 25*523fa7a6SAndroid Build Coastguard Workeroutput_folder_set=false 26*523fa7a6SAndroid Build Coastguard Workeroutput_folder="." 27*523fa7a6SAndroid Build Coastguard Workerbuild_only=false 28*523fa7a6SAndroid Build Coastguard Workerportable_kernels="aten::_softmax.out" 29*523fa7a6SAndroid Build Coastguard Worker 30*523fa7a6SAndroid Build Coastguard Workerhelp() { 31*523fa7a6SAndroid Build Coastguard Worker echo "Usage: $(basename $0) [options]" 32*523fa7a6SAndroid Build Coastguard Worker echo "Options:" 33*523fa7a6SAndroid Build Coastguard Worker echo " --model_name=<MODEL> Model to run, can be a builtin, examples/models or a filename Default to all builtin models" 34*523fa7a6SAndroid Build Coastguard Worker echo " --aot_arm_compiler_flags=<FLAGS> Only used if --model_name is used Default: ${aot_arm_compiler_flags}" 35*523fa7a6SAndroid Build Coastguard Worker echo " --portable_kernels=<OPS> Comma separated list of portable (non delagated) kernels to include Default: ${portable_kernels}" 36*523fa7a6SAndroid Build Coastguard Worker echo " --target=<TARGET> Target to build and run for Default: ${target}" 37*523fa7a6SAndroid Build Coastguard Worker echo " --output=<FOLDER> Output folder Default: ${output_folder}" 38*523fa7a6SAndroid Build Coastguard Worker echo " --build_only Only build, don't run FVP" 39*523fa7a6SAndroid Build Coastguard Worker echo " --scratch-dir=<FOLDER> Path to your Ethos-U scrach dir if you not using default" 40*523fa7a6SAndroid Build Coastguard Worker exit 0 41*523fa7a6SAndroid Build Coastguard Worker} 42*523fa7a6SAndroid Build Coastguard Worker 43*523fa7a6SAndroid Build Coastguard Workerfor arg in "$@"; do 44*523fa7a6SAndroid Build Coastguard Worker case $arg in 45*523fa7a6SAndroid Build Coastguard Worker -h|--help) help ;; 46*523fa7a6SAndroid Build Coastguard Worker --model_name=*) model_name="${arg#*=}";; 47*523fa7a6SAndroid Build Coastguard Worker --aot_arm_compiler_flags=*) aot_arm_compiler_flags="${arg#*=}";; 48*523fa7a6SAndroid Build Coastguard Worker --portable_kernels=*) portable_kernels="${arg#*=}";; 49*523fa7a6SAndroid Build Coastguard Worker --target=*) target="${arg#*=}";; 50*523fa7a6SAndroid Build Coastguard Worker --output=*) output_folder="${arg#*=}" ; output_folder_set=true ;; 51*523fa7a6SAndroid Build Coastguard Worker --build_only) build_only=true ;; 52*523fa7a6SAndroid Build Coastguard Worker --scratch-dir=*) root_dir="${arg#*=}";; 53*523fa7a6SAndroid Build Coastguard Worker *) 54*523fa7a6SAndroid Build Coastguard Worker ;; 55*523fa7a6SAndroid Build Coastguard Worker esac 56*523fa7a6SAndroid Build Coastguard Workerdone 57*523fa7a6SAndroid Build Coastguard Worker 58*523fa7a6SAndroid Build Coastguard Workerroot_dir=$(realpath ${root_dir}) 59*523fa7a6SAndroid Build Coastguard Workeroutput_folder=$(realpath ${output_folder}) 60*523fa7a6SAndroid Build Coastguard Workermkdir -p ${output_folder} 61*523fa7a6SAndroid Build Coastguard Workerif [ "$output_folder_set" = true ] ; then 62*523fa7a6SAndroid Build Coastguard Worker executor_runner_path=${output_folder} 63*523fa7a6SAndroid Build Coastguard Workerelse 64*523fa7a6SAndroid Build Coastguard Worker executor_runner_path=${script_dir}/executor_runner 65*523fa7a6SAndroid Build Coastguard Workerfi 66*523fa7a6SAndroid Build Coastguard Workerexecutor_runner_path=$(realpath ${executor_runner_path}) 67*523fa7a6SAndroid Build Coastguard Worker 68*523fa7a6SAndroid Build Coastguard Workerethos_u_root_dir="$(cd ${root_dir}/ethos-u && pwd)" 69*523fa7a6SAndroid Build Coastguard Workerethos_u_build_dir=${ethos_u_root_dir}/core_platform/build 70*523fa7a6SAndroid Build Coastguard Workersetup_path_script=${root_dir}/setup_path.sh 71*523fa7a6SAndroid Build Coastguard Worker 72*523fa7a6SAndroid Build Coastguard Worker# Executorch 73*523fa7a6SAndroid Build Coastguard Workeret_root_dir=$(cd ${script_dir}/../.. && pwd) 74*523fa7a6SAndroid Build Coastguard Workeret_build_dir=${et_root_dir}/cmake-out 75*523fa7a6SAndroid Build Coastguard Worker 76*523fa7a6SAndroid Build Coastguard Workerfvp_model=FVP_Corstone_SSE-300_Ethos-U55 77*523fa7a6SAndroid Build Coastguard Workerif [[ ${target} =~ "ethos-u85" ]] 78*523fa7a6SAndroid Build Coastguard Workerthen 79*523fa7a6SAndroid Build Coastguard Worker echo "target is ethos-u85 variant so switching to CS320 FVP" 80*523fa7a6SAndroid Build Coastguard Worker fvp_model=FVP_Corstone_SSE-320 81*523fa7a6SAndroid Build Coastguard Workerfi 82*523fa7a6SAndroid Build Coastguard Worker 83*523fa7a6SAndroid Build Coastguard Workertoolchain_cmake=${script_dir}/ethos-u-setup/arm-none-eabi-gcc.cmake 84*523fa7a6SAndroid Build Coastguard Worker_setup_msg="please refer to ${script_dir}/ethos-u-setup/setup.sh to properly install necessary tools." 85*523fa7a6SAndroid Build Coastguard Worker 86*523fa7a6SAndroid Build Coastguard Workerif ! [[ $portable_kernels =~ ^((^|,)aten::[a-zA-Z0-9_]+\.[a-zA-Z0-9_]*out)*$ ]]; then 87*523fa7a6SAndroid Build Coastguard Worker echo " ERROR: specified argument --portable_kernels=${portable_kernels}" 88*523fa7a6SAndroid Build Coastguard Worker echo " is in the wrong format please use \"aten::<OP1>.out,aten::<OP2>.out,...\"" 89*523fa7a6SAndroid Build Coastguard Worker echo " e.g. \"aten::_softmax.out,aten::add.out\"" 90*523fa7a6SAndroid Build Coastguard Worker exit 1 91*523fa7a6SAndroid Build Coastguard Workerfi 92*523fa7a6SAndroid Build Coastguard Worker 93*523fa7a6SAndroid Build Coastguard Worker# Generate a pte file 94*523fa7a6SAndroid Build Coastguard Workerfunction generate_pte_file() { 95*523fa7a6SAndroid Build Coastguard Worker [[ $# -ne 2 ]] && { echo "[${FUNCNAME[0]}]" "Expecting model and model_compiler_flags flag, got, $*"; exit 1; } 96*523fa7a6SAndroid Build Coastguard Worker local model=${1} 97*523fa7a6SAndroid Build Coastguard Worker local model_short_name=$(basename -- "${model}" ".py") 98*523fa7a6SAndroid Build Coastguard Worker local model_compiler_flags=${2} 99*523fa7a6SAndroid Build Coastguard Worker 100*523fa7a6SAndroid Build Coastguard Worker local model_filename=${model_short_name}_arm_${target}.pte 101*523fa7a6SAndroid Build Coastguard Worker if [[ "${model_compiler_flags}" == *"--delegate"* ]]; then 102*523fa7a6SAndroid Build Coastguard Worker # Name aligned with default aot_arm_compiler output 103*523fa7a6SAndroid Build Coastguard Worker model_filename=${model_short_name}_arm_delegate_${target}.pte 104*523fa7a6SAndroid Build Coastguard Worker fi 105*523fa7a6SAndroid Build Coastguard Worker cd $et_root_dir 106*523fa7a6SAndroid Build Coastguard Worker 107*523fa7a6SAndroid Build Coastguard Worker local pte_file 108*523fa7a6SAndroid Build Coastguard Worker pte_file=$(realpath ${output_folder}/${model_filename}) 109*523fa7a6SAndroid Build Coastguard Worker rm -f "${pte_file}" 110*523fa7a6SAndroid Build Coastguard Worker 111*523fa7a6SAndroid Build Coastguard Worker SO_EXT=$(python3 -c 'import platform; print({"Darwin": "dylib", "Linux": "so", "Windows": "dll"}.get(platform.system(), None))') 112*523fa7a6SAndroid Build Coastguard Worker # We are using the aot_lib from build_quantization_aot_lib below 113*523fa7a6SAndroid Build Coastguard Worker SO_LIB=$(find cmake-out-aot-lib -name libquantized_ops_aot_lib.${SO_EXT}) 114*523fa7a6SAndroid Build Coastguard Worker 115*523fa7a6SAndroid Build Coastguard Worker python3 -m examples.arm.aot_arm_compiler --model_name="${model}" --target=${target} ${model_compiler_flags} --output ${output_folder} --so_library="$SO_LIB" 1>&2 116*523fa7a6SAndroid Build Coastguard Worker [[ -f ${pte_file} ]] || { >&2 echo "Failed to generate a pte file - ${pte_file}"; exit 1; } 117*523fa7a6SAndroid Build Coastguard Worker echo "${pte_file}" 118*523fa7a6SAndroid Build Coastguard Worker} 119*523fa7a6SAndroid Build Coastguard Worker 120*523fa7a6SAndroid Build Coastguard Worker# Build .so library to register quant ops with AoT flow 121*523fa7a6SAndroid Build Coastguard Workerfunction build_quantization_aot_lib() 122*523fa7a6SAndroid Build Coastguard Worker{ 123*523fa7a6SAndroid Build Coastguard Worker SITE_PACKAGES="$(python3 -c 'from distutils.sysconfig import get_python_lib; print(get_python_lib())')" 124*523fa7a6SAndroid Build Coastguard Worker CMAKE_PREFIX_PATH="${SITE_PACKAGES}/torch" 125*523fa7a6SAndroid Build Coastguard Worker 126*523fa7a6SAndroid Build Coastguard Worker cd $et_root_dir 127*523fa7a6SAndroid Build Coastguard Worker mkdir -p cmake-out-aot-lib 128*523fa7a6SAndroid Build Coastguard Worker cmake \ 129*523fa7a6SAndroid Build Coastguard Worker -DCMAKE_BUILD_TYPE=Release \ 130*523fa7a6SAndroid Build Coastguard Worker -DEXECUTORCH_BUILD_XNNPACK=OFF \ 131*523fa7a6SAndroid Build Coastguard Worker -DEXECUTORCH_BUILD_KERNELS_QUANTIZED=ON \ 132*523fa7a6SAndroid Build Coastguard Worker -DEXECUTORCH_BUILD_KERNELS_QUANTIZED_AOT=ON \ 133*523fa7a6SAndroid Build Coastguard Worker -DCMAKE_PREFIX_PATH="$CMAKE_PREFIX_PATH" \ 134*523fa7a6SAndroid Build Coastguard Worker -DPYTHON_EXECUTABLE=python3 \ 135*523fa7a6SAndroid Build Coastguard Worker -Bcmake-out-aot-lib \ 136*523fa7a6SAndroid Build Coastguard Worker "${et_root_dir}" 137*523fa7a6SAndroid Build Coastguard Worker 138*523fa7a6SAndroid Build Coastguard Worker cmake --build cmake-out-aot-lib --parallel -- quantized_ops_aot_lib 139*523fa7a6SAndroid Build Coastguard Worker} 140*523fa7a6SAndroid Build Coastguard Worker 141*523fa7a6SAndroid Build Coastguard Worker 142*523fa7a6SAndroid Build Coastguard Worker# build ExecuTorch Libraries 143*523fa7a6SAndroid Build Coastguard Workerfunction build_executorch() { 144*523fa7a6SAndroid Build Coastguard Worker set -x 145*523fa7a6SAndroid Build Coastguard Worker 146*523fa7a6SAndroid Build Coastguard Worker [[ -d "${et_build_dir}" ]] \ 147*523fa7a6SAndroid Build Coastguard Worker && echo "[${FUNCNAME[0]}] Warn: using already existing build-dir for executorch: ${et_build_dir}!!" 148*523fa7a6SAndroid Build Coastguard Worker mkdir -p "${et_build_dir}" 149*523fa7a6SAndroid Build Coastguard Worker 150*523fa7a6SAndroid Build Coastguard Worker cd "${et_root_dir}" 151*523fa7a6SAndroid Build Coastguard Worker cmake \ 152*523fa7a6SAndroid Build Coastguard Worker -DCMAKE_INSTALL_PREFIX=${et_build_dir} \ 153*523fa7a6SAndroid Build Coastguard Worker -DEXECUTORCH_BUILD_EXECUTOR_RUNNER=OFF \ 154*523fa7a6SAndroid Build Coastguard Worker -DCMAKE_BUILD_TYPE=Release \ 155*523fa7a6SAndroid Build Coastguard Worker -DEXECUTORCH_ENABLE_LOGGING=ON \ 156*523fa7a6SAndroid Build Coastguard Worker -DEXECUTORCH_BUILD_ARM_BAREMETAL=ON \ 157*523fa7a6SAndroid Build Coastguard Worker -DEXECUTORCH_BUILD_KERNELS_QUANTIZED=ON \ 158*523fa7a6SAndroid Build Coastguard Worker -DEXECUTORCH_BUILD_EXTENSION_RUNNER_UTIL=ON \ 159*523fa7a6SAndroid Build Coastguard Worker -DFLATC_EXECUTABLE="$(which flatc)" \ 160*523fa7a6SAndroid Build Coastguard Worker -DCMAKE_TOOLCHAIN_FILE="${toolchain_cmake}" \ 161*523fa7a6SAndroid Build Coastguard Worker -B${et_build_dir} \ 162*523fa7a6SAndroid Build Coastguard Worker "${et_root_dir}" 163*523fa7a6SAndroid Build Coastguard Worker 164*523fa7a6SAndroid Build Coastguard Worker echo "[${FUNCNAME[0]}] Configured CMAKE" 165*523fa7a6SAndroid Build Coastguard Worker 166*523fa7a6SAndroid Build Coastguard Worker cmake --build ${et_build_dir} --parallel --target install --config Release 167*523fa7a6SAndroid Build Coastguard Worker 168*523fa7a6SAndroid Build Coastguard Worker cmake \ 169*523fa7a6SAndroid Build Coastguard Worker -DCMAKE_INSTALL_PREFIX=${et_build_dir} \ 170*523fa7a6SAndroid Build Coastguard Worker -DCMAKE_BUILD_TYPE=Release \ 171*523fa7a6SAndroid Build Coastguard Worker -DEXECUTORCH_SELECT_OPS_LIST=${portable_kernels} \ 172*523fa7a6SAndroid Build Coastguard Worker -DEXECUTORCH_BUILD_ARM_BAREMETAL=ON \ 173*523fa7a6SAndroid Build Coastguard Worker -DCMAKE_TOOLCHAIN_FILE="${toolchain_cmake}" \ 174*523fa7a6SAndroid Build Coastguard Worker -B"${et_build_dir}"/examples/arm \ 175*523fa7a6SAndroid Build Coastguard Worker "${et_root_dir}"/examples/arm 176*523fa7a6SAndroid Build Coastguard Worker cmake --build ${et_build_dir}/examples/arm --parallel -- 177*523fa7a6SAndroid Build Coastguard Worker 178*523fa7a6SAndroid Build Coastguard Worker set +x 179*523fa7a6SAndroid Build Coastguard Worker 180*523fa7a6SAndroid Build Coastguard Worker cd "${et_build_dir}" 181*523fa7a6SAndroid Build Coastguard Worker echo "[${FUNCNAME[0]}] Generated static libraries for ExecuTorch:" 182*523fa7a6SAndroid Build Coastguard Worker find . -name "*.a" -exec ls -al {} \; 183*523fa7a6SAndroid Build Coastguard Worker} 184*523fa7a6SAndroid Build Coastguard Worker 185*523fa7a6SAndroid Build Coastguard Worker# build Arm Baremetal executor_runner 186*523fa7a6SAndroid Build Coastguard Workerfunction build_executorch_runner() { 187*523fa7a6SAndroid Build Coastguard Worker echo "[${FUNCNAME[0]}] Generating ExecuTorch libraries" 188*523fa7a6SAndroid Build Coastguard Worker [[ $# -ne 1 ]] && { echo "[${FUNCNAME[0]}]" "Expecting a single pte file as argument got, $*"; exit 1; } 189*523fa7a6SAndroid Build Coastguard Worker local pte=${1} 190*523fa7a6SAndroid Build Coastguard Worker if [[ ${target} == *"ethos-u55"* ]]; then 191*523fa7a6SAndroid Build Coastguard Worker local target_cpu=cortex-m55 192*523fa7a6SAndroid Build Coastguard Worker local target_board=corstone-300 193*523fa7a6SAndroid Build Coastguard Worker else 194*523fa7a6SAndroid Build Coastguard Worker local target_cpu=cortex-m85 195*523fa7a6SAndroid Build Coastguard Worker local target_board=corstone-320 196*523fa7a6SAndroid Build Coastguard Worker fi 197*523fa7a6SAndroid Build Coastguard Worker cd ${script_dir}/executor_runner 198*523fa7a6SAndroid Build Coastguard Worker cmake -DCMAKE_TOOLCHAIN_FILE=${toolchain_cmake} \ 199*523fa7a6SAndroid Build Coastguard Worker -DTARGET_CPU=${target_cpu} \ 200*523fa7a6SAndroid Build Coastguard Worker -DTARGET_BOARD=${target_board} \ 201*523fa7a6SAndroid Build Coastguard Worker -DETHOSU_TARGET_NPU_CONFIG=${target} \ 202*523fa7a6SAndroid Build Coastguard Worker -B ${executor_runner_path}/cmake-out \ 203*523fa7a6SAndroid Build Coastguard Worker -DETHOS_SDK_PATH:PATH=${ethos_u_root_dir} \ 204*523fa7a6SAndroid Build Coastguard Worker -DET_DIR_PATH:PATH=${et_root_dir} \ 205*523fa7a6SAndroid Build Coastguard Worker -DET_BUILD_DIR_PATH:PATH=${et_build_dir} \ 206*523fa7a6SAndroid Build Coastguard Worker -DET_PTE_FILE_PATH:PATH="${pte}" \ 207*523fa7a6SAndroid Build Coastguard Worker -DPYTHON_EXECUTABLE=$(which python3) 208*523fa7a6SAndroid Build Coastguard Worker echo "[${FUNCNAME[0]}] Configured CMAKE" 209*523fa7a6SAndroid Build Coastguard Worker 210*523fa7a6SAndroid Build Coastguard Worker cmake --build ${executor_runner_path}/cmake-out --parallel -- arm_executor_runner 211*523fa7a6SAndroid Build Coastguard Worker echo "[${FUNCNAME[0]}] Generated baremetal elf file:" 212*523fa7a6SAndroid Build Coastguard Worker find ${executor_runner_path}/cmake-out -name "arm_executor_runner" 213*523fa7a6SAndroid Build Coastguard Worker echo "executable_text: $(find ${executor_runner_path}/cmake-out -name arm_executor_runner -exec size {} \; | grep -v filename | awk '{print $1}') bytes" 214*523fa7a6SAndroid Build Coastguard Worker echo "executable_data: $(find ${executor_runner_path}/cmake-out -name arm_executor_runner -exec size {} \; | grep -v filename | awk '{print $2}') bytes" 215*523fa7a6SAndroid Build Coastguard Worker echo "executable_bss: $(find ${executor_runner_path}/cmake-out -name arm_executor_runner -exec size {} \; | grep -v filename | awk '{print $3}') bytes" 216*523fa7a6SAndroid Build Coastguard Worker} 217*523fa7a6SAndroid Build Coastguard Worker 218*523fa7a6SAndroid Build Coastguard Worker# Execute the executor_runner on FVP Simulator 219*523fa7a6SAndroid Build Coastguard Workerfunction run_fvp() { 220*523fa7a6SAndroid Build Coastguard Worker [[ $# -ne 1 ]] && { echo "[${FUNCNAME[0]}]" "Expexted elf binary name, got $*"; exit 1; } 221*523fa7a6SAndroid Build Coastguard Worker local elf_name=${1} 222*523fa7a6SAndroid Build Coastguard Worker elf=$(find ${executor_runner_path} -name "${elf_name}") 223*523fa7a6SAndroid Build Coastguard Worker [[ ! -f $elf ]] && { echo "[${FUNCNAME[0]}]: Unable to find executor_runner elf: ${elf}"; exit 1; } 224*523fa7a6SAndroid Build Coastguard Worker num_macs=$(echo ${target} | cut -d - -f 3) 225*523fa7a6SAndroid Build Coastguard Worker 226*523fa7a6SAndroid Build Coastguard Worker if [[ ${target} == *"ethos-u55"* ]]; then 227*523fa7a6SAndroid Build Coastguard Worker echo "Running ${elf} for ${target} run with FVP:${fvp_model} num_macs:${num_macs}" 228*523fa7a6SAndroid Build Coastguard Worker ${fvp_model} \ 229*523fa7a6SAndroid Build Coastguard Worker -C cpu0.CFGITCMSZ=11 \ 230*523fa7a6SAndroid Build Coastguard Worker -C ethosu.num_macs=${num_macs} \ 231*523fa7a6SAndroid Build Coastguard Worker -C mps3_board.visualisation.disable-visualisation=1 \ 232*523fa7a6SAndroid Build Coastguard Worker -C mps3_board.telnetterminal0.start_telnet=0 \ 233*523fa7a6SAndroid Build Coastguard Worker -C mps3_board.uart0.out_file='-' \ 234*523fa7a6SAndroid Build Coastguard Worker -C mps3_board.uart0.shutdown_on_eot=1 \ 235*523fa7a6SAndroid Build Coastguard Worker -a "${elf}" \ 236*523fa7a6SAndroid Build Coastguard Worker --timelimit 120 || true # seconds 237*523fa7a6SAndroid Build Coastguard Worker echo "[${FUNCNAME[0]}] Simulation complete, $?" 238*523fa7a6SAndroid Build Coastguard Worker elif [[ ${target} == *"ethos-u85"* ]]; then 239*523fa7a6SAndroid Build Coastguard Worker echo "Running ${elf} for ${target} run with FVP:${fvp_model} num_macs:${num_macs}" 240*523fa7a6SAndroid Build Coastguard Worker ${fvp_model} \ 241*523fa7a6SAndroid Build Coastguard Worker -C mps4_board.subsystem.cpu0.CFGITCMSZ=11 \ 242*523fa7a6SAndroid Build Coastguard Worker -C mps4_board.subsystem.ethosu.num_macs=${num_macs} \ 243*523fa7a6SAndroid Build Coastguard Worker -C mps4_board.visualisation.disable-visualisation=1 \ 244*523fa7a6SAndroid Build Coastguard Worker -C vis_hdlcd.disable_visualisation=1 \ 245*523fa7a6SAndroid Build Coastguard Worker -C mps4_board.telnetterminal0.start_telnet=0 \ 246*523fa7a6SAndroid Build Coastguard Worker -C mps4_board.uart0.out_file='-' \ 247*523fa7a6SAndroid Build Coastguard Worker -C mps4_board.uart0.shutdown_on_eot=1 \ 248*523fa7a6SAndroid Build Coastguard Worker -a "${elf}" \ 249*523fa7a6SAndroid Build Coastguard Worker --timelimit 120 || true # seconds 250*523fa7a6SAndroid Build Coastguard Worker echo "[${FUNCNAME[0]}] Simulation complete, $?" 251*523fa7a6SAndroid Build Coastguard Worker else 252*523fa7a6SAndroid Build Coastguard Worker echo "Running ${elf} for ${target} is not supported" 253*523fa7a6SAndroid Build Coastguard Worker exit 1 254*523fa7a6SAndroid Build Coastguard Worker fi 255*523fa7a6SAndroid Build Coastguard Worker} 256*523fa7a6SAndroid Build Coastguard Worker 257*523fa7a6SAndroid Build Coastguard Worker####### 258*523fa7a6SAndroid Build Coastguard Worker### Main 259*523fa7a6SAndroid Build Coastguard Worker####### 260*523fa7a6SAndroid Build Coastguard Worker# Source the tools 261*523fa7a6SAndroid Build Coastguard Worker# This should be prepared by the setup.sh 262*523fa7a6SAndroid Build Coastguard Worker[[ -f ${setup_path_script} ]] \ 263*523fa7a6SAndroid Build Coastguard Worker || { echo "Missing ${setup_path_script}. ${_setup_msg}"; exit 1; } 264*523fa7a6SAndroid Build Coastguard Workersource ${root_dir}/setup_path.sh 265*523fa7a6SAndroid Build Coastguard Worker 266*523fa7a6SAndroid Build Coastguard Worker# basic checks before we get started 267*523fa7a6SAndroid Build Coastguard Workerhash ${fvp_model} \ 268*523fa7a6SAndroid Build Coastguard Worker || { echo "Could not find ${fvp_model} on PATH, ${_setup_msg}"; exit 1; } 269*523fa7a6SAndroid Build Coastguard Worker 270*523fa7a6SAndroid Build Coastguard Workerhash arm-none-eabi-gcc \ 271*523fa7a6SAndroid Build Coastguard Worker || { echo "Could not find arm baremetal toolchain on PATH, ${_setup_msg}"; exit 1; } 272*523fa7a6SAndroid Build Coastguard Worker 273*523fa7a6SAndroid Build Coastguard Worker[[ -f ${toolchain_cmake} ]] \ 274*523fa7a6SAndroid Build Coastguard Worker || { echo "Could not find ${toolchain_cmake} file, ${_setup_msg}"; exit 1; } 275*523fa7a6SAndroid Build Coastguard Worker 276*523fa7a6SAndroid Build Coastguard Worker[[ -f ${et_root_dir}/CMakeLists.txt ]] \ 277*523fa7a6SAndroid Build Coastguard Worker || { echo "Executorch repo doesn't contain CMakeLists.txt file at root level"; exit 1; } 278*523fa7a6SAndroid Build Coastguard Worker 279*523fa7a6SAndroid Build Coastguard Worker# build executorch libraries 280*523fa7a6SAndroid Build Coastguard Workerbuild_executorch 281*523fa7a6SAndroid Build Coastguard Workerbuild_quantization_aot_lib 282*523fa7a6SAndroid Build Coastguard Worker 283*523fa7a6SAndroid Build Coastguard Workerif [[ -z "$model_name" ]]; then 284*523fa7a6SAndroid Build Coastguard Worker # the test models run, and whether to delegate 285*523fa7a6SAndroid Build Coastguard Worker test_model=( "softmax" "add" "add3" "mv2" ) 286*523fa7a6SAndroid Build Coastguard Worker model_compiler_flags=( "" "--delegate" "--delegate" "--delegate --quantize" ) 287*523fa7a6SAndroid Build Coastguard Workerelse 288*523fa7a6SAndroid Build Coastguard Worker test_model=( "$model_name" ) 289*523fa7a6SAndroid Build Coastguard Worker model_compiler_flags=( "$aot_arm_compiler_flags" ) 290*523fa7a6SAndroid Build Coastguard Workerfi 291*523fa7a6SAndroid Build Coastguard Worker 292*523fa7a6SAndroid Build Coastguard Worker# loop over running the AoT flow and executing the model on device 293*523fa7a6SAndroid Build Coastguard Workerfor i in "${!test_model[@]}"; do 294*523fa7a6SAndroid Build Coastguard Worker echo "--------------------------------------------------------------------------------" 295*523fa7a6SAndroid Build Coastguard Worker printf "Running e2e flow for model '%s' with flags '%s'\n" "${test_model[i]}" "${model_compiler_flags[i]}" 296*523fa7a6SAndroid Build Coastguard Worker echo "--------------------------------------------------------------------------------" 297*523fa7a6SAndroid Build Coastguard Worker pte=$(generate_pte_file "${test_model[i]}" "${model_compiler_flags[i]}") 298*523fa7a6SAndroid Build Coastguard Worker stat --printf="Generated pte_data_size: %s bytes\npte_file:%n\n" ${pte} 299*523fa7a6SAndroid Build Coastguard Worker if [[ ${target} == *"TOSA"* ]]; then 300*523fa7a6SAndroid Build Coastguard Worker echo "Build for ${target} skip generating .elf and running" 301*523fa7a6SAndroid Build Coastguard Worker else 302*523fa7a6SAndroid Build Coastguard Worker # Rebuild the application as the pte is imported as a header/c array 303*523fa7a6SAndroid Build Coastguard Worker build_executorch_runner "${pte}" 304*523fa7a6SAndroid Build Coastguard Worker if [ "$build_only" = false ] ; then 305*523fa7a6SAndroid Build Coastguard Worker run_fvp arm_executor_runner 306*523fa7a6SAndroid Build Coastguard Worker fi 307*523fa7a6SAndroid Build Coastguard Worker fi 308*523fa7a6SAndroid Build Coastguard Workerdone 309*523fa7a6SAndroid Build Coastguard Worker 310*523fa7a6SAndroid Build Coastguard Workerexit 0 311