1# SPDX-FileCopyrightText: Copyright 2022 Arm Limited and/or its affiliates <open-source-office@arm.com>
2#
3# SPDX-License-Identifier: Apache-2.0
4#
5# Licensed under the Apache License, Version 2.0 (the License); you may
6# not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an AS IS BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17name: TFL Microspeech Example on Arm Virtual Hardware
18on:
19  push:
20    branches:
21      - microspeech
22  workflow_run:
23    workflows: ["Build documentation and pack"]
24    types:
25      - completed
26  workflow_dispatch:
27
28env:
29  AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }}
30  AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
31  AWS_S3_BUCKET_NAME: ${{ secrets.AWS_S3_BUCKET_NAME }}
32  AWS_IAM_PROFILE: ${{ secrets.AWS_IAM_PROFILE }}
33  AWS_SECURITY_GROUP_ID: ${{ secrets.AWS_SECURITY_GROUP_ID }}
34  AWS_SUBNET_ID: ${{ secrets.AWS_SUBNET_ID }}
35
36jobs:
37  set_pending_status_to_pr:
38    runs-on: ubuntu-latest
39    steps:
40      - name: Set a pending status to the PR
41        if: github.event.workflow_run
42        env:
43          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
44        run: |
45          curl --request POST \
46            --url https://api.github.com/repos/${{ github.repository }}/statuses/${{ github.event.workflow_run.head_commit.id }} \
47            --header "authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
48            --header 'content-type: application/json' \
49            --data '{
50              "state": "pending",
51              "context": "Microspeech",
52              "target_url": "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id	}}"
53              }' \
54            --fail
55
56  build_and_run:
57    name: Build and run projects on AVH
58    runs-on: ubuntu-latest
59    needs: set_pending_status_to_pr
60    permissions:
61      id-token: write
62      contents: read
63      issues: read
64      checks: write
65      pull-requests: write
66
67    steps:
68      - uses: actions/checkout@v3
69        with:
70          repository: ARM-software/AVH-TFLmicrospeech
71          ref: main
72
73      - name: Set up Python 3.10
74        uses: actions/setup-python@v4
75        with:
76          python-version: '3.10'
77
78      - name: Install AVH Client for Python
79        run: |
80          pip install arm-avhclient
81
82      - name: Download pack from upstream workflow
83        if: github.event.workflow_run
84        env:
85          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
86        run: |
87          mkdir -p artifacts && cd artifacts
88
89          artifacts_url=${{ github.event.workflow_run.artifacts_url }}
90
91          gh api "$artifacts_url" -q '.artifacts[] | select(.name=="artifact") | [.name, .archive_download_url] | @tsv' | \
92          while read artifact; do
93            IFS=$'\t' read name url <<< "$artifact"
94            gh api $url > "$name.zip"
95            unzip -d "$name" "$name.zip"
96          done
97
98          cp artifact/ARM.CMSIS-NN.*.pack ../Platform_FVP_Corstone_SSE-300_Ethos-U55/
99
100      - name: Download latest release pack
101        if: ${{ ! github.event.workflow_run }}
102        env:
103          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
104        run: |
105          gh -R ${{ github.repository }} release download -p "*.pack" -D Platform_FVP_Corstone_SSE-300_Ethos-U55
106
107      - name: Configure AWS Credentials
108        uses: aws-actions/configure-aws-credentials@v1-node16
109        with:
110          role-to-assume: ${{ env.AWS_ASSUME_ROLE }}
111          aws-region: ${{ env.AWS_DEFAULT_REGION }}
112
113      - name: Apply patch
114        run: |
115          VERSION=$(\
116            basename $(ls Platform_FVP_Corstone_SSE-300_Ethos-U55/ARM.CMSIS-NN.*.pack) | \
117            cut -d. -f 3-5 | cut -d+ -f 1 \
118          )
119          patch -p0 <<EOF
120          --- Platform_FVP_Corstone_SSE-300_Ethos-U55/microspeech.Example.Reference.cprj
121          +++ Platform_FVP_Corstone_SSE-300_Ethos-U55/microspeech.Example.Reference.cprj
122          @@ -11,2 +11,3 @@
123            <packages>
124          +    <package name="CMSIS-NN" vendor="ARM" version="${VERSION}:${VERSION}"/>
125               <package name="CMSIS" vendor="ARM" version="5.9.0:5.9.0"/>
126          @@ -130,3 +131,2 @@
127                 <file category="sourceCpp" name="../micro_speech/src/recognize_commands.cc"/>
128          -      <file category="sourceC" name="../micro_speech/src/arm_nn_softmax_common_s8.c"/>
129               </group>
130          --- Platform_FVP_Corstone_SSE-300_Ethos-U55/microspeech.Example.SIMD.cprj
131          +++ Platform_FVP_Corstone_SSE-300_Ethos-U55/microspeech.Example.SIMD.cprj
132          @@ -11,2 +11,3 @@
133            <packages>
134          +    <package name="CMSIS-NN" vendor="ARM" version="${VERSION}:${VERSION}"/>
135               <package name="CMSIS" vendor="ARM" version="5.9.0:5.9.0"/>
136          @@ -130,3 +131,2 @@
137                 <file category="sourceCpp" name="../micro_speech/src/recognize_commands.cc"/>
138          -      <file category="sourceC" name="../micro_speech/src/arm_nn_softmax_common_s8.c"/>
139               </group>
140          --- Platform_FVP_Corstone_SSE-300_Ethos-U55/microspeech.Example.Helium.cprj
141          +++ Platform_FVP_Corstone_SSE-300_Ethos-U55/microspeech.Example.Helium.cprj
142          @@ -11,2 +11,3 @@
143            <packages>
144          +    <package name="CMSIS-NN" vendor="ARM" version="${VERSION}:${VERSION}"/>
145               <package name="CMSIS" vendor="ARM" version="5.9.0:5.9.0"/>
146          @@ -130,3 +131,2 @@
147                 <file category="sourceCpp" name="../micro_speech/src/recognize_commands.cc"/>
148          -      <file category="sourceC" name="../micro_speech/src/arm_nn_softmax_common_s8.c"/>
149               </group>
150          --- avh.yml	Tue Nov 22 12:01:56 2022
151          +++ avh.yml	Tue Nov 22 12:02:08 2022
152          @@ -12,2 +12,5 @@
153           steps:
154          +  - run: |
155          +      cd Platform_FVP_Corstone_SSE-300_Ethos-U55
156          +      cpackget add ARM.CMSIS-NN.*.pack
157            - run: |
158          EOF
159
160      - name: Execute test suite on Arm Virtual Hardware at AWS
161        run: |
162          avhclient -b aws execute --specfile ./avh.yml
163
164      - name: Fetch results from Arm Virtual Hardware
165        run: |
166           cat ./Platform_FVP_Corstone_SSE-300_Ethos-U55/microspeech.Reference.log
167           cat ./Platform_FVP_Corstone_SSE-300_Ethos-U55/microspeech.SIMD.log
168           cat ./Platform_FVP_Corstone_SSE-300_Ethos-U55/microspeech.Helium.log
169
170      - name: Decode EventRecorder logs
171        run: |
172           wget https://github.com/ARM-software/CMSIS-View/releases/download/tools%2Feventlist%2F1.0.10/eventlist-linux64.tar.gz
173           tar -xvf eventlist-linux64.tar.gz
174           chmod +x eventlist-linux64/eventlist
175           eventlist-linux64/eventlist -s ./Platform_FVP_Corstone_SSE-300_Ethos-U55/microspeech.Reference.EventRecorder.log
176           eventlist-linux64/eventlist -s ./Platform_FVP_Corstone_SSE-300_Ethos-U55/microspeech.SIMD.EventRecorder.log
177           eventlist-linux64/eventlist -s ./Platform_FVP_Corstone_SSE-300_Ethos-U55/microspeech.Helium.EventRecorder.log
178
179  set_success_status_to_pr:
180    runs-on: ubuntu-latest
181    needs: build_and_run
182    if: github.event.workflow_run && success()
183    steps:
184      - name: Set success status to the PR
185        env:
186          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
187        run: |
188          curl --request POST \
189            --url https://api.github.com/repos/${{ github.repository }}/statuses/${{ github.event.workflow_run.head_commit.id }} \
190            --header "authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
191            --header 'content-type: application/json' \
192            --data '{
193              "state": "success",
194              "context": "Microspeech",
195              "target_url": "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id	}}"
196              }' \
197            --fail
198
199  set_failure_status_to_pr:
200    runs-on: ubuntu-latest
201    needs: build_and_run
202    if: github.event.workflow_run && failure()
203    steps:
204      - name: Set failure status to the PR
205        env:
206          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
207        run: |
208          curl --request POST \
209            --url https://api.github.com/repos/${{ github.repository }}/statuses/${{ github.event.workflow_run.head_commit.id }} \
210            --header "authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
211            --header 'content-type: application/json' \
212            --data '{
213              "state": "failure",
214              "context": "Microspeech",
215              "target_url": "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id	}}"
216              }' \
217            --fail
218