xref: /aosp_15_r20/external/executorch/examples/arm/run.sh (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
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