diff --git a/.github/scripts/all_check.py b/.github/scripts/all_check.py new file mode 100755 index 0000000..d842c1a --- /dev/null +++ b/.github/scripts/all_check.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +""" +Makes sure: + + * All jobs are listed in the 'all' job + * Only existing tests are listed + +""" + +# SPDX-FileCopyrightText: 2022 Google LLC +# +# SPDX-License-Identifier: Apache-2.0 + +import sys +import yaml + +CI_PATH = ".github/workflows/ci.yml" +ALL_TEST = "all" + +def main(): + ci_yml_fp = open(CI_PATH, "r") + ci_yml_parsed = yaml.load(ci_yml_fp, Loader=yaml.FullLoader) + + all_jobs = set(ci_yml_parsed['jobs'].keys()) - {ALL_TEST} + all_needs = set(ci_yml_parsed["jobs"][ALL_TEST]["needs"]) + + if all_jobs - all_needs: + sys.exit(f"Not all jobs mentioned in {ALL_TEST}.needs: {all_jobs - all_needs}") + + if all_needs - all_jobs: + sys.exit(f"Non-existing jobs found in {ALL_TEST}.needs: {all_needs - all_jobs}") + + +if __name__ == '__main__': + main() diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 779e7ae..6bc405e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -179,3 +179,36 @@ jobs: - name: Run `clash-vexriscv-sim` HDL test run: | cabal run clash-vexriscv-sim:hdl-test + + all: + name: All jobs finished + if: ${{ !cancelled() }} + needs: [ + 'license-check', + 'rust-checks', + 'vex-riscv', + 'rust-build-programs' + ] + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Check dependencies for failures + run: | + # Test all dependencies for success/failure + set -x + success="${{ contains(needs.*.result, 'success') }}" + fail="${{ contains(needs.*.result, 'failure') }}" + set +x + + # Test whether success/fail variables contain sane values + if [[ "${success}" != "true" && "${success}" != "false" ]]; then exit 1; fi + if [[ "${fail}" != "true" && "${fail}" != "false" ]]; then exit 1; fi + + # We want to fail if one or more dependencies fail. For safety, we introduce + # a second check: if no dependencies succeeded something weird is going on. + if [[ "${fail}" == "true" || "${success}" == "false" ]]; then + echo "One or more dependency failed, or no dependency succeeded." + exit 1 + fi diff --git a/clash-vexriscv/src/ffi/impl.cpp b/clash-vexriscv/src/ffi/impl.cpp index 88eda62..ce10a32 100644 --- a/clash-vexriscv/src/ffi/impl.cpp +++ b/clash-vexriscv/src/ffi/impl.cpp @@ -95,7 +95,7 @@ void set_comb_inputs(VVexRiscv *top, const COMB_INPUT *input) } // Set all outputs -void set_ouputs(VVexRiscv *top, OUTPUT *output) +void set_outputs(VVexRiscv *top, OUTPUT *output) { output->iBusWishbone_CYC = top->iBusWishbone_CYC; output->iBusWishbone_STB = top->iBusWishbone_STB; @@ -129,7 +129,7 @@ void vexr_init_stage1(VerilatedVcdC *vcd, VVexRiscv *top, const NON_COMB_INPUT * if (vcd != NULL) { vcd->dump(contextp->time()); } - set_ouputs(top, output); + set_outputs(top, output); // Advance time by 50 nanoseconds. This is an arbitrary value. Ideally, we would // do something similar to Clash's template tag "~LONGESTPERIOD". @@ -166,7 +166,7 @@ void vexr_step_rising_edge(VerilatedVcdC *vcd, VVexRiscv *top, uint64_t time_add } // Set all outputs - set_ouputs(top, output); + set_outputs(top, output); } void vexr_step_falling_edge(VerilatedVcdC *vcd, VVexRiscv *top, uint64_t time_add, const COMB_INPUT *input)