xref: /aosp_15_r20/external/executorch/examples/arm/setup.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 Workerif [[ "${1:-'.'}" == "-h" || "${#}" -gt 2 ]]; then
13*523fa7a6SAndroid Build Coastguard Worker    echo "Usage: $(basename $0) <--i-agree-to-the-contained-eula> [path-to-a-scratch-dir]"
14*523fa7a6SAndroid Build Coastguard Worker    echo "Supplied args: $*"
15*523fa7a6SAndroid Build Coastguard Worker    exit 1
16*523fa7a6SAndroid Build Coastguard Workerfi
17*523fa7a6SAndroid Build Coastguard Worker
18*523fa7a6SAndroid Build Coastguard Worker
19*523fa7a6SAndroid Build Coastguard Worker########
20*523fa7a6SAndroid Build Coastguard Worker### Helper functions
21*523fa7a6SAndroid Build Coastguard Worker########
22*523fa7a6SAndroid Build Coastguard WorkerARCH="$(uname -m)"
23*523fa7a6SAndroid Build Coastguard WorkerOS="$(uname -s)"
24*523fa7a6SAndroid Build Coastguard Worker
25*523fa7a6SAndroid Build Coastguard Workerfunction verify_md5() {
26*523fa7a6SAndroid Build Coastguard Worker    [[ $# -ne 2 ]]  \
27*523fa7a6SAndroid Build Coastguard Worker        && { echo "[${FUNCNAME[0]}] Invalid number of args, expecting 2, but got $#"; exit 1; }
28*523fa7a6SAndroid Build Coastguard Worker    local ref_checksum="${1}"
29*523fa7a6SAndroid Build Coastguard Worker    local file="${2}"
30*523fa7a6SAndroid Build Coastguard Worker
31*523fa7a6SAndroid Build Coastguard Worker    if [[ "${OS}" == "Darwin" ]]; then
32*523fa7a6SAndroid Build Coastguard Worker        local file_checksum="$(md5 -q $file)"
33*523fa7a6SAndroid Build Coastguard Worker    else
34*523fa7a6SAndroid Build Coastguard Worker        local file_checksum="$(md5sum $file | awk '{print $1}')"
35*523fa7a6SAndroid Build Coastguard Worker    fi
36*523fa7a6SAndroid Build Coastguard Worker    if [[ ${ref_checksum} != ${file_checksum} ]]; then
37*523fa7a6SAndroid Build Coastguard Worker        echo "Mismatched MD5 checksum for file: ${file}. Expecting ${ref_checksum} but got ${file_checksum}. Exiting."
38*523fa7a6SAndroid Build Coastguard Worker        exit 1
39*523fa7a6SAndroid Build Coastguard Worker    fi
40*523fa7a6SAndroid Build Coastguard Worker}
41*523fa7a6SAndroid Build Coastguard Worker
42*523fa7a6SAndroid Build Coastguard Worker########
43*523fa7a6SAndroid Build Coastguard Worker### Hardcoded constants
44*523fa7a6SAndroid Build Coastguard Worker########
45*523fa7a6SAndroid Build Coastguard Workerscript_dir=$(cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd)
46*523fa7a6SAndroid Build Coastguard Worker
47*523fa7a6SAndroid Build Coastguard Workerif [[ "${ARCH}" == "x86_64" ]]; then
48*523fa7a6SAndroid Build Coastguard Worker    # FVPs
49*523fa7a6SAndroid Build Coastguard Worker    corstone300_url="https://developer.arm.com/-/media/Arm%20Developer%20Community/Downloads/OSS/FVP/Corstone-300/FVP_Corstone_SSE-300_11.22_20_Linux64.tgz?rev=018659bd574f4e7b95fa647e7836ccf4&hash=22A79103C6FA5FFA7AFF3BE0447F3FF9"
50*523fa7a6SAndroid Build Coastguard Worker    corstone300_model_dir="Linux64_GCC-9.3"
51*523fa7a6SAndroid Build Coastguard Worker    corstone300_md5_checksum="98e93b949d0fbac977292d8668d34523"
52*523fa7a6SAndroid Build Coastguard Worker
53*523fa7a6SAndroid Build Coastguard Worker    corstone320_url="https://developer.arm.com/-/media/Arm%20Developer%20Community/Downloads/OSS/FVP/Corstone-320/FVP_Corstone_SSE-320_11.27_25_Linux64.tgz?rev=a507bffc219a4d5792f1192ab7002d89&hash=D9A824AA8227D2E679C9B9787FF4E8B6FBE3D7C6"
54*523fa7a6SAndroid Build Coastguard Worker    corstone320_model_dir="Linux64_GCC-9.3"
55*523fa7a6SAndroid Build Coastguard Worker    corstone320_md5_checksum="3deb3c68f9b2d145833f15374203514d"
56*523fa7a6SAndroid Build Coastguard Worker
57*523fa7a6SAndroid Build Coastguard Worker    # toochain
58*523fa7a6SAndroid Build Coastguard Worker    toolchain_url="https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu/12.3.rel1/binrel/arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-eabi.tar.xz"
59*523fa7a6SAndroid Build Coastguard Worker    toolchain_dir="arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-eabi"
60*523fa7a6SAndroid Build Coastguard Worker    toolchain_md5_checksum="00ebb1b70b1f88906c61206457eacb61"
61*523fa7a6SAndroid Build Coastguard Workerelif [[ "${ARCH}" == "aarch64" ]] || [[ "${ARCH}" == "arm64" ]]; then
62*523fa7a6SAndroid Build Coastguard Worker    # FVPs
63*523fa7a6SAndroid Build Coastguard Worker    corstone300_url="https://developer.arm.com/-/media/Arm%20Developer%20Community/Downloads/OSS/FVP/Corstone-300/FVP_Corstone_SSE-300_11.22_20_Linux64_armv8l.tgz?rev=9cc6e9a32bb947ca9b21fa162144cb01&hash=7657A4CF27D42E892E3F08D452AAB073"
64*523fa7a6SAndroid Build Coastguard Worker    corstone300_model_dir="Linux64_armv8l_GCC-9.3"
65*523fa7a6SAndroid Build Coastguard Worker    corstone300_md5_checksum="cbbabbe39b07939cff7a3738e1492ef1"
66*523fa7a6SAndroid Build Coastguard Worker
67*523fa7a6SAndroid Build Coastguard Worker    corstone320_url="https://developer.arm.com/-/media/Arm%20Developer%20Community/Downloads/OSS/FVP/Corstone-320/FVP_Corstone_SSE-320_11.27_25_Linux64_armv8l.tgz?rev=b6ebe0923cb84f739e017385fd3c333c&hash=8965C4B98E2FF7F792A099B08831FE3CB6120493"
68*523fa7a6SAndroid Build Coastguard Worker    corstone320_model_dir="Linux64_armv8l_GCC-9.3"
69*523fa7a6SAndroid Build Coastguard Worker    corstone320_md5_checksum="3889f1d80a6d9861ea4aa6f1c88dd0ae"
70*523fa7a6SAndroid Build Coastguard Worker
71*523fa7a6SAndroid Build Coastguard Worker    # toochain
72*523fa7a6SAndroid Build Coastguard Worker    if [[ "${OS}" == "Darwin" ]]; then
73*523fa7a6SAndroid Build Coastguard Worker        toolchain_url="https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu/12.3.rel1/binrel/arm-gnu-toolchain-12.3.rel1-darwin-arm64-arm-none-eabi.tar.xz"
74*523fa7a6SAndroid Build Coastguard Worker        toolchain_dir="arm-gnu-toolchain-12.3.rel1-darwin-arm64-arm-none-eabi"
75*523fa7a6SAndroid Build Coastguard Worker        toolchain_md5_checksum="53d034e9423e7f470acc5ed2a066758e"
76*523fa7a6SAndroid Build Coastguard Worker    elif [[ "${OS}" == "Linux" ]]; then
77*523fa7a6SAndroid Build Coastguard Worker        toolchain_url="https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu/12.3.rel1/binrel/arm-gnu-toolchain-12.3.rel1-aarch64-arm-none-eabi.tar.xz"
78*523fa7a6SAndroid Build Coastguard Worker        toolchain_dir="arm-gnu-toolchain-12.3.rel1-aarch64-arm-none-eabi"
79*523fa7a6SAndroid Build Coastguard Worker        toolchain_md5_checksum="02c9b0d3bb1110575877d8eee1f223f2"
80*523fa7a6SAndroid Build Coastguard Worker    fi
81*523fa7a6SAndroid Build Coastguard Workerelse
82*523fa7a6SAndroid Build Coastguard Worker    echo "[main] Error: only x86-64 & aarch64/arm64 architecture is supported for now!"; exit 1;
83*523fa7a6SAndroid Build Coastguard Workerfi
84*523fa7a6SAndroid Build Coastguard Worker
85*523fa7a6SAndroid Build Coastguard Worker# ethos-u
86*523fa7a6SAndroid Build Coastguard Workerethos_u_repo_url="https://review.mlplatform.org/ml/ethos-u/ethos-u"
87*523fa7a6SAndroid Build Coastguard Workerethos_u_base_rev="24.08"
88*523fa7a6SAndroid Build Coastguard Worker
89*523fa7a6SAndroid Build Coastguard Worker# tosa reference model
90*523fa7a6SAndroid Build Coastguard Workertosa_reference_model_url="https://review.mlplatform.org/tosa/reference_model"
91*523fa7a6SAndroid Build Coastguard Workertosa_reference_model_rev="f9ea4ab7da19318fe36b1c34d68a3e40fd6e56c5"
92*523fa7a6SAndroid Build Coastguard Worker
93*523fa7a6SAndroid Build Coastguard Worker########
94*523fa7a6SAndroid Build Coastguard Worker### Mandatory user args
95*523fa7a6SAndroid Build Coastguard Worker########
96*523fa7a6SAndroid Build Coastguard Workereula_acceptance="${1:-'.'}"
97*523fa7a6SAndroid Build Coastguard Workerif [[ "${eula_acceptance}" != "--i-agree-to-the-contained-eula" ]]; then
98*523fa7a6SAndroid Build Coastguard Worker    if [[ ${ARM_FVP_INSTALL_I_AGREE_TO_THE_CONTAINED_EULA} != "True" ]]; then
99*523fa7a6SAndroid Build Coastguard Worker	echo "Must pass first positional argument '--i-agree-to-the-contained-eula' to agree to EULA associated with downloading the FVP. Exiting!"
100*523fa7a6SAndroid Build Coastguard Worker	exit 1
101*523fa7a6SAndroid Build Coastguard Worker    else
102*523fa7a6SAndroid Build Coastguard Worker	echo "Arm EULA for FVP agreed to with ARM_FVP_INSTALL_I_AGREE_TO_THE_CONTAINED_EULA=True environment variable"
103*523fa7a6SAndroid Build Coastguard Worker    fi
104*523fa7a6SAndroid Build Coastguard Workerelse
105*523fa7a6SAndroid Build Coastguard Worker    shift; # drop this arg
106*523fa7a6SAndroid Build Coastguard Workerfi
107*523fa7a6SAndroid Build Coastguard Worker
108*523fa7a6SAndroid Build Coastguard Worker########
109*523fa7a6SAndroid Build Coastguard Worker### Optional user args
110*523fa7a6SAndroid Build Coastguard Worker########
111*523fa7a6SAndroid Build Coastguard Workerroot_dir=${1:-"${script_dir}/ethos-u-scratch"}
112*523fa7a6SAndroid Build Coastguard Workermkdir -p ${root_dir}
113*523fa7a6SAndroid Build Coastguard Workerroot_dir=$(realpath ${root_dir})
114*523fa7a6SAndroid Build Coastguard Worker
115*523fa7a6SAndroid Build Coastguard Worker########
116*523fa7a6SAndroid Build Coastguard Worker### Functions
117*523fa7a6SAndroid Build Coastguard Worker########
118*523fa7a6SAndroid Build Coastguard Worker
119*523fa7a6SAndroid Build Coastguard Workerfunction setup_fvp() {
120*523fa7a6SAndroid Build Coastguard Worker    if [[ "${OS}" != "Linux" ]]; then
121*523fa7a6SAndroid Build Coastguard Worker        echo "[${FUNCNAME[0]}] Warning: FVP only supported with Linux OS, skipping FVP setup..."
122*523fa7a6SAndroid Build Coastguard Worker        echo "[${FUNCNAME[0]}] Warning: For MacOS, using https://github.com/Arm-Examples/FVPs-on-Mac is recommended."
123*523fa7a6SAndroid Build Coastguard Worker        echo "[${FUNCNAME[0]}] Warning:   Follow the instructions and make sure the path is set correctly."
124*523fa7a6SAndroid Build Coastguard Worker        return 1
125*523fa7a6SAndroid Build Coastguard Worker    fi
126*523fa7a6SAndroid Build Coastguard Worker
127*523fa7a6SAndroid Build Coastguard Worker    # Download and install the Corstone 300 FVP simulator platform
128*523fa7a6SAndroid Build Coastguard Worker    fvps=("corstone300" "corstone320")
129*523fa7a6SAndroid Build Coastguard Worker
130*523fa7a6SAndroid Build Coastguard Worker    for fvp in "${fvps[@]}"; do
131*523fa7a6SAndroid Build Coastguard Worker        cd "${root_dir}"
132*523fa7a6SAndroid Build Coastguard Worker        if [[ ! -e "FVP_${fvp}.tgz" ]]; then
133*523fa7a6SAndroid Build Coastguard Worker            echo "[${FUNCNAME[0]}] Downloading FVP ${fvp}..."
134*523fa7a6SAndroid Build Coastguard Worker            url_variable=${fvp}_url
135*523fa7a6SAndroid Build Coastguard Worker            fvp_url=${!url_variable}
136*523fa7a6SAndroid Build Coastguard Worker            curl --output "FVP_${fvp}.tgz" "${fvp_url}"
137*523fa7a6SAndroid Build Coastguard Worker            md5_variable=${fvp}_md5_checksum
138*523fa7a6SAndroid Build Coastguard Worker            fvp_md5_checksum=${!md5_variable}
139*523fa7a6SAndroid Build Coastguard Worker            verify_md5 ${fvp_md5_checksum} FVP_${fvp}.tgz
140*523fa7a6SAndroid Build Coastguard Worker        fi
141*523fa7a6SAndroid Build Coastguard Worker
142*523fa7a6SAndroid Build Coastguard Worker        echo "[${FUNCNAME[0]}] Installing FVP ${fvp}..."
143*523fa7a6SAndroid Build Coastguard Worker        rm -rf FVP-${fvp}
144*523fa7a6SAndroid Build Coastguard Worker        mkdir -p FVP-${fvp}
145*523fa7a6SAndroid Build Coastguard Worker        cd FVP-${fvp}
146*523fa7a6SAndroid Build Coastguard Worker        tar xf ../FVP_${fvp}.tgz
147*523fa7a6SAndroid Build Coastguard Worker
148*523fa7a6SAndroid Build Coastguard Worker        # Install the FVP
149*523fa7a6SAndroid Build Coastguard Worker        case ${fvp} in
150*523fa7a6SAndroid Build Coastguard Worker            corstone300)
151*523fa7a6SAndroid Build Coastguard Worker                ./FVP_Corstone_SSE-300.sh --i-agree-to-the-contained-eula --force --destination ./ --quiet --no-interactive
152*523fa7a6SAndroid Build Coastguard Worker                ;;
153*523fa7a6SAndroid Build Coastguard Worker            corstone320)
154*523fa7a6SAndroid Build Coastguard Worker                ./FVP_Corstone_SSE-320.sh --i-agree-to-the-contained-eula --force --destination ./ --quiet --no-interactive
155*523fa7a6SAndroid Build Coastguard Worker                ;;
156*523fa7a6SAndroid Build Coastguard Worker            *)
157*523fa7a6SAndroid Build Coastguard Worker                echo "[${FUNCNAME[0]}] Error: Unknown FVP model ${fvp}. Exiting."
158*523fa7a6SAndroid Build Coastguard Worker                exit 1
159*523fa7a6SAndroid Build Coastguard Worker                ;;
160*523fa7a6SAndroid Build Coastguard Worker        esac
161*523fa7a6SAndroid Build Coastguard Worker
162*523fa7a6SAndroid Build Coastguard Worker        model_dir_variable=${fvp}_model_dir
163*523fa7a6SAndroid Build Coastguard Worker        fvp_model_dir=${!model_dir_variable}
164*523fa7a6SAndroid Build Coastguard Worker        fvp_bin_path="$(cd models/${fvp_model_dir} && pwd)"
165*523fa7a6SAndroid Build Coastguard Worker        export PATH=${PATH}:${fvp_bin_path}
166*523fa7a6SAndroid Build Coastguard Worker
167*523fa7a6SAndroid Build Coastguard Worker        echo "export PATH=\${PATH}:${fvp_bin_path}" >> ${setup_path_script}
168*523fa7a6SAndroid Build Coastguard Worker    done
169*523fa7a6SAndroid Build Coastguard Worker
170*523fa7a6SAndroid Build Coastguard Worker    # Fixup for Corstone-320 python dependency
171*523fa7a6SAndroid Build Coastguard Worker    echo "export LD_LIBRARY_PATH=${root_dir}/FVP-corstone320/python/lib/" >> ${setup_path_script}
172*523fa7a6SAndroid Build Coastguard Worker}
173*523fa7a6SAndroid Build Coastguard Worker
174*523fa7a6SAndroid Build Coastguard Workerfunction setup_toolchain() {
175*523fa7a6SAndroid Build Coastguard Worker    # Download and install the arm-none-eabi toolchain
176*523fa7a6SAndroid Build Coastguard Worker    cd "${root_dir}"
177*523fa7a6SAndroid Build Coastguard Worker    if [[ ! -e gcc.tar.xz ]]; then
178*523fa7a6SAndroid Build Coastguard Worker        echo "[${FUNCNAME[0]}] Downloading toolchain ..."
179*523fa7a6SAndroid Build Coastguard Worker        curl --output gcc.tar.xz "${toolchain_url}"
180*523fa7a6SAndroid Build Coastguard Worker        verify_md5 ${toolchain_md5_checksum} gcc.tar.xz
181*523fa7a6SAndroid Build Coastguard Worker    fi
182*523fa7a6SAndroid Build Coastguard Worker
183*523fa7a6SAndroid Build Coastguard Worker    echo "[${FUNCNAME[0]}] Installing toolchain ..."
184*523fa7a6SAndroid Build Coastguard Worker    rm -rf "${toolchain_dir}"
185*523fa7a6SAndroid Build Coastguard Worker    tar xf gcc.tar.xz
186*523fa7a6SAndroid Build Coastguard Worker    toolchain_bin_path="$(cd ${toolchain_dir}/bin && pwd)"
187*523fa7a6SAndroid Build Coastguard Worker    export PATH=${PATH}:${toolchain_bin_path}
188*523fa7a6SAndroid Build Coastguard Worker    hash arm-none-eabi-gcc
189*523fa7a6SAndroid Build Coastguard Worker    echo "export PATH=\${PATH}:${toolchain_bin_path}" >> ${setup_path_script}
190*523fa7a6SAndroid Build Coastguard Worker}
191*523fa7a6SAndroid Build Coastguard Worker
192*523fa7a6SAndroid Build Coastguard Workerfunction setup_ethos_u() {
193*523fa7a6SAndroid Build Coastguard Worker    # This is the main dir which will pull more repos to do baremetal software dev for cs300
194*523fa7a6SAndroid Build Coastguard Worker    echo "[${FUNCNAME[0]}] Setting up the repo"
195*523fa7a6SAndroid Build Coastguard Worker    cd "${root_dir}"
196*523fa7a6SAndroid Build Coastguard Worker    [[ ! -d ethos-u ]] && \
197*523fa7a6SAndroid Build Coastguard Worker        git clone ${ethos_u_repo_url}
198*523fa7a6SAndroid Build Coastguard Worker    cd ethos-u
199*523fa7a6SAndroid Build Coastguard Worker    git reset --hard ${ethos_u_base_rev}
200*523fa7a6SAndroid Build Coastguard Worker    python3 ./fetch_externals.py -c ${ethos_u_base_rev}.json fetch
201*523fa7a6SAndroid Build Coastguard Worker    pip install pyelftools
202*523fa7a6SAndroid Build Coastguard Worker    echo "[${FUNCNAME[0]}] Done @ $(git describe --all --long 3> /dev/null) in ${root_dir}/ethos-u dir."
203*523fa7a6SAndroid Build Coastguard Worker}
204*523fa7a6SAndroid Build Coastguard Worker
205*523fa7a6SAndroid Build Coastguard Workerfunction patch_repo() {
206*523fa7a6SAndroid Build Coastguard Worker    # This is a temporary hack until it finds a better home in one for the ARM Ml repos
207*523fa7a6SAndroid Build Coastguard Worker    name="$(basename $repo_dir)"
208*523fa7a6SAndroid Build Coastguard Worker    echo -e "[${FUNCNAME[0]}] Preparing ${name}..."
209*523fa7a6SAndroid Build Coastguard Worker    cd $repo_dir
210*523fa7a6SAndroid Build Coastguard Worker    git fetch
211*523fa7a6SAndroid Build Coastguard Worker    git reset --hard ${base_rev}
212*523fa7a6SAndroid Build Coastguard Worker
213*523fa7a6SAndroid Build Coastguard Worker    patch_dir=${script_dir}/ethos-u-setup/${name}/patches/
214*523fa7a6SAndroid Build Coastguard Worker    [[ -e ${patch_dir} && $(ls -A ${patch_dir}) ]] && \
215*523fa7a6SAndroid Build Coastguard Worker        git am -3 ${patch_dir}/*.patch
216*523fa7a6SAndroid Build Coastguard Worker
217*523fa7a6SAndroid Build Coastguard Worker    echo -e "[${FUNCNAME[0]}] Patched ${name} @ $(git describe --all --long 2> /dev/null) in ${repo_dir} dir.\n"
218*523fa7a6SAndroid Build Coastguard Worker}
219*523fa7a6SAndroid Build Coastguard Worker
220*523fa7a6SAndroid Build Coastguard Workerfunction setup_tosa_reference_model() {
221*523fa7a6SAndroid Build Coastguard Worker    # The debug flow on the host includes running on a reference implementation of TOSA
222*523fa7a6SAndroid Build Coastguard Worker    # This is useful primarily for debug of quantization accuracy, but also for internal
223*523fa7a6SAndroid Build Coastguard Worker    # errors for the early codebase
224*523fa7a6SAndroid Build Coastguard Worker    cd "${root_dir}"
225*523fa7a6SAndroid Build Coastguard Worker    if [[ ! -e reference_model ]]; then
226*523fa7a6SAndroid Build Coastguard Worker        git clone ${tosa_reference_model_url}
227*523fa7a6SAndroid Build Coastguard Worker        cd reference_model
228*523fa7a6SAndroid Build Coastguard Worker        git checkout ${tosa_reference_model_rev}
229*523fa7a6SAndroid Build Coastguard Worker        git submodule update --init --recursive
230*523fa7a6SAndroid Build Coastguard Worker        cd ..
231*523fa7a6SAndroid Build Coastguard Worker    fi
232*523fa7a6SAndroid Build Coastguard Worker    cd reference_model
233*523fa7a6SAndroid Build Coastguard Worker    mkdir -p build
234*523fa7a6SAndroid Build Coastguard Worker    cd build
235*523fa7a6SAndroid Build Coastguard Worker    cmake ..
236*523fa7a6SAndroid Build Coastguard Worker
237*523fa7a6SAndroid Build Coastguard Worker    # make use of half the cores for building
238*523fa7a6SAndroid Build Coastguard Worker    if [[ "${OS}" == "Linux" ]]; then
239*523fa7a6SAndroid Build Coastguard Worker        n=$(( $(nproc) / 2 ))
240*523fa7a6SAndroid Build Coastguard Worker    elif [[ "${OS}" == "Darwin" ]]; then
241*523fa7a6SAndroid Build Coastguard Worker        n=$(( $(sysctl -n hw.logicalcpu) / 2 ))
242*523fa7a6SAndroid Build Coastguard Worker    else
243*523fa7a6SAndroid Build Coastguard Worker        n=1
244*523fa7a6SAndroid Build Coastguard Worker    fi
245*523fa7a6SAndroid Build Coastguard Worker
246*523fa7a6SAndroid Build Coastguard Worker    if [[ "$n" -lt 1 ]]; then
247*523fa7a6SAndroid Build Coastguard Worker        n=1
248*523fa7a6SAndroid Build Coastguard Worker    fi
249*523fa7a6SAndroid Build Coastguard Worker
250*523fa7a6SAndroid Build Coastguard Worker    make -j"${n}"
251*523fa7a6SAndroid Build Coastguard Worker    cd reference_model
252*523fa7a6SAndroid Build Coastguard Worker    tosa_bin_path=`pwd`
253*523fa7a6SAndroid Build Coastguard Worker    echo "export PATH=\${PATH}:${tosa_bin_path}" >> "${setup_path_script}"
254*523fa7a6SAndroid Build Coastguard Worker}
255*523fa7a6SAndroid Build Coastguard Worker
256*523fa7a6SAndroid Build Coastguard Workerfunction setup_vela() {
257*523fa7a6SAndroid Build Coastguard Worker    #
258*523fa7a6SAndroid Build Coastguard Worker    # Prepare the Vela compiler for AoT to Ethos-U compilation
259*523fa7a6SAndroid Build Coastguard Worker    #
260*523fa7a6SAndroid Build Coastguard Worker    cd "${root_dir}"
261*523fa7a6SAndroid Build Coastguard Worker    if [[ ! -e ethos-u-vela ]]; then
262*523fa7a6SAndroid Build Coastguard Worker        git clone https://review.mlplatform.org/ml/ethos-u/ethos-u-vela
263*523fa7a6SAndroid Build Coastguard Worker        repo_dir="${root_dir}/ethos-u-vela"
264*523fa7a6SAndroid Build Coastguard Worker        base_rev=57ce18c89ccc6f6309333dccb24ed30dc68b571f
265*523fa7a6SAndroid Build Coastguard Worker        patch_repo
266*523fa7a6SAndroid Build Coastguard Worker    fi
267*523fa7a6SAndroid Build Coastguard Worker    cd "${root_dir}/ethos-u-vela"
268*523fa7a6SAndroid Build Coastguard Worker
269*523fa7a6SAndroid Build Coastguard Worker    # different command for conda vs venv
270*523fa7a6SAndroid Build Coastguard Worker    VNV=$(python3 -c "import sys; print('venv') if (sys.prefix != sys.base_prefix) else print('not_venv')")
271*523fa7a6SAndroid Build Coastguard Worker    if [ ${VNV} == "venv" ]; then
272*523fa7a6SAndroid Build Coastguard Worker	pip install .
273*523fa7a6SAndroid Build Coastguard Worker    else
274*523fa7a6SAndroid Build Coastguard Worker       # if not venv, we need the site-path where the vela
275*523fa7a6SAndroid Build Coastguard Worker       vela_path=$(python -c "import site; print(site.USER_BASE+'/bin')")
276*523fa7a6SAndroid Build Coastguard Worker       echo "export PATH=\${PATH}:${vela_path}" >> ${setup_path_script}
277*523fa7a6SAndroid Build Coastguard Worker       pip install . --user
278*523fa7a6SAndroid Build Coastguard Worker    fi
279*523fa7a6SAndroid Build Coastguard Worker}
280*523fa7a6SAndroid Build Coastguard Worker
281*523fa7a6SAndroid Build Coastguard Worker########
282*523fa7a6SAndroid Build Coastguard Worker### main
283*523fa7a6SAndroid Build Coastguard Worker########
284*523fa7a6SAndroid Build Coastguard Worker# do basic checks
285*523fa7a6SAndroid Build Coastguard Worker# Make sure we are on a supported platform
286*523fa7a6SAndroid Build Coastguard Workerif [[ "${ARCH}" != "x86_64" ]] && [[ "${ARCH}" != "aarch64" ]] \
287*523fa7a6SAndroid Build Coastguard Worker    && [[ "${ARCH}" != "arm64" ]]; then
288*523fa7a6SAndroid Build Coastguard Worker    echo "[main] Error: only x86-64 & aarch64 architecture is supported for now!"
289*523fa7a6SAndroid Build Coastguard Worker    exit 1
290*523fa7a6SAndroid Build Coastguard Workerfi
291*523fa7a6SAndroid Build Coastguard Worker
292*523fa7a6SAndroid Build Coastguard Workercd "${script_dir}"
293*523fa7a6SAndroid Build Coastguard Worker
294*523fa7a6SAndroid Build Coastguard Worker# Setup the root dir
295*523fa7a6SAndroid Build Coastguard Workercd "${root_dir}"
296*523fa7a6SAndroid Build Coastguard Workerecho "[main] Using root dir ${root_dir}"
297*523fa7a6SAndroid Build Coastguard Worker
298*523fa7a6SAndroid Build Coastguard Workersetup_path_script="${root_dir}/setup_path.sh"
299*523fa7a6SAndroid Build Coastguard Workerecho "" > "${setup_path_script}"
300*523fa7a6SAndroid Build Coastguard Worker
301*523fa7a6SAndroid Build Coastguard Worker# Setup toolchain
302*523fa7a6SAndroid Build Coastguard Workersetup_toolchain
303*523fa7a6SAndroid Build Coastguard Worker
304*523fa7a6SAndroid Build Coastguard Worker# Setup the ethos-u dev environment
305*523fa7a6SAndroid Build Coastguard Workersetup_ethos_u
306*523fa7a6SAndroid Build Coastguard Worker
307*523fa7a6SAndroid Build Coastguard Worker# Patch the ethos-u dev environment to include executorch application
308*523fa7a6SAndroid Build Coastguard Workerrepo_dir="${root_dir}/ethos-u/core_platform"
309*523fa7a6SAndroid Build Coastguard Workerbase_rev=b728c774158248ba2cad8e78a515809e1eb9b77f
310*523fa7a6SAndroid Build Coastguard Workerpatch_repo
311*523fa7a6SAndroid Build Coastguard Worker
312*523fa7a6SAndroid Build Coastguard Worker# Setup the tosa_reference_model
313*523fa7a6SAndroid Build Coastguard Workersetup_tosa_reference_model
314*523fa7a6SAndroid Build Coastguard Worker
315*523fa7a6SAndroid Build Coastguard Worker# Setup vela and patch in codegen fixes
316*523fa7a6SAndroid Build Coastguard Workersetup_vela
317*523fa7a6SAndroid Build Coastguard Worker
318*523fa7a6SAndroid Build Coastguard Worker# Setup FVP
319*523fa7a6SAndroid Build Coastguard Workersetup_fvp
320*523fa7a6SAndroid Build Coastguard Worker
321*523fa7a6SAndroid Build Coastguard Workerecho "[main] update path by doing 'source ${setup_path_script}'"
322*523fa7a6SAndroid Build Coastguard Worker
323*523fa7a6SAndroid Build Coastguard Workerecho "[main] success!"
324*523fa7a6SAndroid Build Coastguard Workerexit 0
325