Skip to content

[autofix.ci] apply automated fixes #192

[autofix.ci] apply automated fixes

[autofix.ci] apply automated fixes #192

Workflow file for this run

# jcarlin@hmc.edu 19 Nov 2025
# SPDX-License-Identifier: Apache-2.0
name: ACT Regression
on:
push:
pull_request:
# Only run CI on the latest commit if a PR is updated
concurrency:
group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}"
cancel-in-progress: true
env:
SAIL_VERSION: "0.13.1"
RISCV_TOOLCHAIN_VERSION: "2026.08.27"
LLVM_VERSION: "23"
permissions:
contents: read
jobs:
lint:
name: Pre-commit (prek) check
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up tools
uses: $/.github/actions/setup-tools
- name: Run prek
uses: j178/prek-action@4e14d07f9231acabce116ccfca13b13dd9755ece # v3.0.0
# Data-driven regression.
# Configs are auto-discovered from the config directory.
# Simulator/core wide setup is in config/<simulator>/ci.yaml.
# The config-specific execution command is in config/<simulator>/<config>/run_cmd.txt.
# To add a new simulator or config, just add the config files — no workflow changes needed.
discover-configs:
name: Discover CI Configs
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.discover.outputs.matrix }}
steps:
- name: Checkout code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up tools
uses: $/.github/actions/setup-tools
with:
udb-gems: "true"
# The act build cache is content-hash based and self-validating, so a
# stale restore is safe: only configs whose UDB yaml changed rebuild.
# Gemfile.lock stays in the primary prefix (not just restore-keys)
# because the build cache hashes commands, not tool binaries — a udb
# gem update must drop these caches entirely.
- name: Cache UDB outputs
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: work/ci-config
key: ci-config-udb-${{ hashFiles('framework/src/act/data/Gemfile.lock') }}-${{ hashFiles('config/**/*.yaml') }}
restore-keys: |
ci-config-udb-${{ hashFiles('framework/src/act/data/Gemfile.lock') }}-
# Generated tests (e.g. priv) are not checked in but count toward the
# suite weights used for shard bin-packing, so generate them first.
- name: Generate tests
run: make tests --jobs "$(nproc)"
- name: Discover CI configs
id: discover
run: .github/scripts/ci_config.py
regress:
name: ${{ matrix.simulator }} (${{ matrix.config }})${{ matrix.shard_suffix }}
needs: discover-configs
runs-on: ubuntu-latest
strategy:
matrix: ${{ fromJson(needs.discover-configs.outputs.matrix) }}
env:
MATRIX_CONFIG: ${{ matrix.config }}
MATRIX_EXTENSIONS: ${{ matrix.extensions }}
MATRIX_SIMULATOR: ${{ matrix.simulator }}
steps:
- name: Checkout code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up tools
uses: $/.github/actions/setup-tools
with:
udb-gems: "true"
- name: Report shard assignment
env:
MATRIX_SHARD_INDEX: ${{ matrix.shard_index }}
MATRIX_SHARD_TOTAL: ${{ matrix.shard_total }}
run: |
if [ -z "${MATRIX_EXTENSIONS}" ]; then
echo "::notice::Shard $((MATRIX_SHARD_INDEX + 1))/${MATRIX_SHARD_TOTAL} for ${MATRIX_CONFIG} is empty after exclusions; skipping heavy steps."
else
echo "Shard $((MATRIX_SHARD_INDEX + 1))/${MATRIX_SHARD_TOTAL} extensions: ${MATRIX_EXTENSIONS}"
fi
- name: Install sail-riscv model
if: matrix.extensions != ''
run: |
runner_uname=$(uname)
runner_arch=$(arch)
sudo mkdir -p /usr/local
curl --location "https://github.com/riscv/sail-riscv/releases/download/${SAIL_VERSION}/sail-riscv-${runner_uname}-${runner_arch}.tar.gz" \
| sudo tar xvz --directory=/usr/local --strip-components=1
- name: Install RISC-V GCC toolchain
if: matrix.extensions != ''
run: |
curl --location "https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/${RISCV_TOOLCHAIN_VERSION}/riscv64-elf-ubuntu-24.04-gcc.tar.xz" \
| sudo tar xvJ --directory=/usr/local --strip-components=1
- name: Install Clang
if: matrix.extensions != ''
run: |
retry() {
local max_attempts="$1"
shift
local attempt=1
while ! "$@"; do
if [ "$attempt" -ge "$max_attempts" ]; then
echo "Command failed after ${attempt} attempts: $*"
return 1
fi
local backoff=$((attempt * 10))
echo "Attempt ${attempt} failed: $*"
echo "Retrying in ${backoff}s..."
sleep "$backoff"
attempt=$((attempt + 1))
done
}
curl --fail --location --retry 5 --retry-all-errors --retry-delay 5 \
https://apt.llvm.org/llvm.sh \
--output /tmp/llvm.sh
chmod +x /tmp/llvm.sh
retry 3 sudo bash /tmp/llvm.sh "$LLVM_VERSION"
retry 3 sudo apt-get update
retry 3 sudo apt-get install -y -o Acquire::Retries=3 \
clang-"$LLVM_VERSION" lld-"$LLVM_VERSION" llvm-"$LLVM_VERSION"
for tool in clang clang++ lld llvm-objdump llvm-as llvm-ar llvm-nm llvm-readelf; do
sudo ln -sf "/usr/bin/${tool}-${LLVM_VERSION}" "/usr/bin/${tool}"
done
- name: Install runtime dependencies
if: matrix.extensions != '' && matrix.apt_packages != ''
env:
MATRIX_APT_PACKAGES: ${{ matrix.apt_packages }}
run: |
sudo apt-get update
read -r -a apt_packages <<< "${MATRIX_APT_PACKAGES}"
sudo apt-get install -y "${apt_packages[@]}"
- name: Restore cached simulator
if: matrix.extensions != '' && matrix.cache_key != ''
id: cache-restore
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: ${{ github.workspace }}/${{ matrix.simulator }}
key: ${{ matrix.cache_key }}
- name: Install simulator
if: matrix.extensions != '' && matrix.install_script != '' && steps.cache-restore.outputs.cache-hit != 'true'
env:
MATRIX_INSTALL_SCRIPT: ${{ matrix.install_script }}
run: bash "${MATRIX_INSTALL_SCRIPT}" "${GITHUB_WORKSPACE}/${MATRIX_SIMULATOR}"
- name: Save cached simulator
if: matrix.extensions != '' && matrix.cache_key != '' && steps.cache-restore.outputs.cache-hit != 'true'
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: ${{ github.workspace }}/${{ matrix.simulator }}
key: ${{ matrix.cache_key }}
- name: Add simulator to PATH
if: matrix.extensions != '' && matrix.install_script != ''
run: echo "$GITHUB_WORKSPACE/${MATRIX_SIMULATOR}/bin" >> "$GITHUB_PATH"
- name: Run setup script
if: matrix.extensions != '' && matrix.setup_script != ''
env:
MATRIX_SETUP_SCRIPT: ${{ matrix.setup_script }}
run: bash "${MATRIX_SETUP_SCRIPT}" "${GITHUB_WORKSPACE}/${MATRIX_SIMULATOR}"
- name: Generate tests and coverpoints
if: matrix.extensions != ''
run: EXTENSIONS="${MATRIX_EXTENSIONS}" make tests --jobs "$(nproc)"
- name: Build ELFs
if: matrix.extensions != ''
env:
MATRIX_EXCLUDE_EXTENSIONS: ${{ matrix.exclude_extensions }}
MATRIX_CONFIG_FILE: ${{ matrix.config_file }}
run: |
FAST=True \
EXTENSIONS="${MATRIX_EXTENSIONS}" \
EXCLUDE_EXTENSIONS="${MATRIX_EXCLUDE_EXTENSIONS}" \
CONFIG_FILES="${MATRIX_CONFIG_FILE}" \
make elfs --jobs "$(nproc)"
- name: Run tests
if: matrix.extensions != '' && matrix.run_cmd != ''
run: |
./run_tests.py "${MATRIX_RUN_CMD}" \
"work/${MATRIX_CONFIG}/elfs"
env:
MATRIX_RUN_CMD: ${{ matrix.run_cmd }}
- name: Upload logs
if: always() && matrix.extensions != ''
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: ${{ matrix.config }}${{ matrix.shard_suffix }}-logs
path: work/${{ matrix.config }}/logs
vector-testgen:
name: Vector Testgen
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up tools
uses: $/.github/actions/setup-tools
- name: Generate vector tests
run: make vector-tests --jobs "$(nproc)"
ctp-build:
name: Build CTP
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up tools
uses: $/.github/actions/setup-tools
- run: git submodule update --init docs/docs-resources
- name: Build CTP
run: cd docs/ctp && make docker-pull-latest && make -j6
crd-build:
name: Build CRD
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- run: git submodule update --init docs/docs-resources
- name: Build CRD
run: cd docs/crd && make docker-pull-latest && make -j6
check-tests:
name: Check generated tests
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up tools
uses: $/.github/actions/setup-tools
- name: Regenerate tests and coverpoints
run: make tests
- name: Check for differences
run: |
dirs=(tests coverpoints)
changed=$(git diff --name-only -- "${dirs[@]}")
untracked=$(git ls-files --others --exclude-standard -- "${dirs[@]}")
if [ -n "$changed" ] || [ -n "$untracked" ]; then
echo "::error::Checked-in generated files are out of sync with the generators. Run 'make tests' and commit the results."
[ -n "$changed" ] && echo "Changed files:" && git diff -- "${dirs[@]}"
[ -n "$untracked" ] && echo "New files:" && echo "$untracked"
exit 1
fi
echo "Checked-in generated files are up to date."
# Test testgen and framework with oldest supported Python version
python-versions:
name: Python ${{ matrix.python-version }} (uv)
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10"]
steps:
- name: Checkout code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Pin Python version for this job
run: echo "${{ matrix.python-version }}" > .python-version
- name: Set up tools
uses: $/.github/actions/setup-tools
with:
udb-gems: "true"
- name: Verify Python version
run: uv run python --version
- name: Install sail-riscv model
run: |
runner_uname=$(uname)
runner_arch=$(arch)
sudo mkdir -p /usr/local
curl --location "https://github.com/riscv/sail-riscv/releases/download/${SAIL_VERSION}/sail-riscv-${runner_uname}-${runner_arch}.tar.gz" \
| sudo tar xvz --directory=/usr/local --strip-components=1
- name: Install RISC-V GCC toolchain
run: |
curl --location "https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/${RISCV_TOOLCHAIN_VERSION}/riscv64-elf-ubuntu-24.04-gcc.tar.xz" \
| sudo tar xvJ --directory=/usr/local --strip-components=1
- name: Build ELFs (exercises full act build DAG)
run: |
FAST=True \
EXTENSIONS=I \
make
# This is here so that the "Status checks that are required" Github
# option doesn't need to list all of the matrix jobs (it doesn't seem
# to work if you just specify the job ID of the matrix itself).
ci_pass:
runs-on: ubuntu-latest
needs:
[
lint,
regress,
vector-testgen,
check-tests,
python-versions,
ctp-build,
crd-build,
]
if: "${{ always() }}"
steps:
- name: Job status check
env:
RESULTS: ${{ join(needs.*.result, ' ') }}
run: |
for result in $RESULTS; do
[[ "$result" == "success" ]] || exit 1
done