open-standards/.github/workflows/wai-quantum-sme.yml
Transaction Science e5191a6079 ci: the 0.5.1 member workflows run only when the pull request's own diff touches them
Neural processor, matrix extension, signal processor, vector units and the
dataflow device gain the same gate as the other wai-quantum workflows.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 19:56:41 -04:00

140 lines
6.6 KiB
YAML

name: wai-quantum matrix-extension member
# The fabric's matrix-extension member: the gate's fixed-point arithmetic in the
# processor's streaming vector mode (SME), 64-bit lanes, certified bit-exact
# against the CPU reference's pinned corpus digests.
#
# - sme-emulated (the container runner): the member's device tests for aarch64
# Linux, run through the host's user-mode emulator (its binfmt handler, which
# emulates SME); the runner declares the emulator, and every certificate says
# it was earned there, never on silicon.
# - sme-absent (the macOS runner, whose processor has no SME): the same build
# finds no member and says why.
#
# Silicon: a processor with SME runs the same tests with the declaration
# `cpu-matrix-sme` and no emulator.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
push:
branches: [main]
paths:
- 'wai/wai-quantum/**'
- 'rust-toolchain.toml'
- '.github/workflows/wai-quantum-sme.yml'
pull_request:
paths:
- 'wai/wai-quantum/**'
- 'rust-toolchain.toml'
- '.github/workflows/wai-quantum-sme.yml'
jobs:
# Does this pull request's own diff touch the paths below? This forge matches a
# workflow's `paths:` against the push, so a merge of main into a branch fires the
# workflow whatever the pull request changes; every job here waits on this answer.
# A push to main, a schedule, or anything the script cannot determine answers
# `true` (scripts/pr-touches-paths.py).
relevant:
name: does this change touch it
runs-on: linux-arm64
outputs:
run: ${{ steps.gate.outputs.run }}
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
- id: gate
run: |
set -euo pipefail
r=$(python3 scripts/pr-touches-paths.py .github/workflows/wai-quantum-sme.yml \
"${{ github.event.pull_request.base.sha }}" \
"${{ github.event.pull_request.head.sha }}")
echo "this change touches wai-quantum-sme: $r"
echo "run=$r" >> "$GITHUB_OUTPUT"
sme-emulated:
name: member · matrix extension, emulated (aarch64 Linux)
needs: relevant
if: needs.relevant.outputs.run == 'true'
runs-on: linux
timeout-minutes: 90
container:
image: ghcr.io/cross-rs/aarch64-unknown-linux-gnu@sha256:7f8308a8734d9fcd2ebbe9a3e4bdea74af293f0799d80c3cc341e340cda49a4c
options: --memory=6g --memory-swap=6g
env:
WAI_QUANTUM_SME_EXPECT: cpu-matrix-sme
# The host's binfmt handler runs every aarch64 binary; its emulator is
# what the certificates name.
WAI_QUANTUM_SME_EMULATOR: qemu-user 8.2.2 (the host's binfmt handler)
# Run the test binary directly, so the host's handler (which emulates
# SME) runs it, not the image's older emulator.
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUNNER: env
steps:
# The image has no Node for a checkout action: the forge's archive of the
# exact commit, its embedded commit id checked.
- name: Fetch the source
shell: bash
run: |
set -euo pipefail
want="${{ github.event.pull_request.head.sha || github.sha }}"
rm -rf src src.tar.gz src.tar && mkdir src
curl -sSf -o src.tar.gz "http://100.64.224.0:3400/Transaction-Science/open-standards/archive/$want.tar.gz"
gzip -dc src.tar.gz > src.tar
got="$(git get-tar-commit-id < src.tar)"
[ "$got" = "$want" ] || { echo "::error::the archive is of $got, not $want"; exit 1; }
tar -xf src.tar -C src --strip-components=1
rm src.tar.gz src.tar
- name: The member's device tests under the emulator
shell: bash
working-directory: src/wai/wai-quantum
run: |
set -euo pipefail
cache=/ci-cache/wai-quantum-sme
mkdir -p "$cache"
exec 9>"$cache/.lock"
flock 9
export RUSTUP_HOME="$cache/rustup" CARGO_HOME="$cache/cargo" CARGO_TARGET_DIR="$cache/target"
export PATH="$CARGO_HOME/bin:$PATH"
if ! command -v rustup >/dev/null; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --profile minimal --default-toolchain none
fi
rustup toolchain install
rustup target add aarch64-unknown-linux-gnu
report="$(mktemp)"
WAI_QUANTUM_SME_REPORT="$report" cargo test --locked --release -j 6 --target aarch64-unknown-linux-gnu --features quantum_fabric_sme --test sme_member -- --test-threads=1 2>&1 | tee "$cache/device.log"
grep -qE '^test result: ok\. 9 passed; 0 failed' "$cache/device.log" || { echo "::error::not every device test ran and passed"; exit 1; }
cat "$report"
key="$WAI_QUANTUM_SME_EXPECT"
grep -qx "sme devices: as declared ($key)" "$report" || { echo "::error::the member found is not the declared one"; exit 1; }
grep -q "^sme member: key=$key .*emulator:qemu-user" "$report" || { echo "::error::the member does not say it ran under the emulator"; exit 1; }
n="$(grep -c "^sme certified: key=$key .* parity=bit-exact " "$report")"
[ "$n" = 4 ] || { echo "::error::$n of 4 certificates were earned"; exit 1; }
grep -qx "sme mutants: key=$key killed 3 of 3" "$report" || { echo "::error::a kernel mutant survived"; exit 1; }
sme-absent:
name: member · matrix extension absent (macos)
needs: relevant
if: needs.relevant.outputs.run == 'true'
runs-on: macos
timeout-minutes: 60
env:
WAI_QUANTUM_SME_EXPECT: none
steps:
- uses: actions/checkout@v5
# launchd's PATH omits cargo on the macOS host runner.
- name: Put cargo on PATH
shell: bash
run: echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
- name: No matrix extension here, and the member says so
shell: bash
working-directory: wai/wai-quantum
run: |
set -euo pipefail
[ "$(sysctl -n hw.optional.arm.FEAT_SME 2>/dev/null || echo 0)" = 0 ] || { echo "::error::this runner has SME; declare it and run the silicon tests"; exit 1; }
report="$RUNNER_TEMP/sme-report.txt"; : > "$report"
WAI_QUANTUM_SME_REPORT="$report" nice -n 10 cargo test --locked --features quantum_fabric_sme --test sme_member -- --test-threads=1 2>&1 | tee "$RUNNER_TEMP/device.log"
grep -qE '^test result: ok\. 9 passed; 0 failed' "$RUNNER_TEMP/device.log" || { echo "::error::not every device test ran and passed"; exit 1; }
grep -qx 'sme devices: as declared (none)' "$report" || { echo "::error::the absent case was not established"; exit 1; }