From 94f042c4ce381d910f7957e5f3ea2446e0f0bffd Mon Sep 17 00:00:00 2001 From: Dmitriy Vasilev Date: Thu, 20 Aug 2026 03:21:04 +0700 Subject: [PATCH] ci: add concurrency groups to 78 push workflows Measured: GitHub Actions concurrency is billed per ACCOUNT, not per repo. trinity-fpga held 431 of the account's 644 queued runs, starving gHashTag/t27 at in_progress=0 for over a day while its merge-gating contexts could not reach a runner. 251 of 427 runs were push-event hygiene workflows with no concurrency group, so every push spawned a fresh run and nothing superseded anything. A drain of 552 runs freed capacity and seven PRs landed within the hour -- then the queue was back to 70 in one cycle. Each edited file gains, at top level, a sibling of on:/jobs:: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true github.workflow is in the key so two different workflows on the same ref do not cancel each other. push gives refs/heads/main and pull_request gives refs/pull/N/merge, so a push run can never cancel a PR run. fpga-docker.yml gets cancel-in-progress: false -- it is the only push workflow that writes externally (docker/build-push-action to ghcr.io with a latest tag), and killing it mid-upload can leave a half-pushed manifest. It still gets a group so runs serialize instead of piling up. Skipped 8: seven have no push trigger, and trinity-identity-gate.yml already had a group and is left byte-for-byte. Verified by parsing, not reading: PyYAML re-parsed all 86 files; concurrency is a top-level mapping key in all 79 push workflows and appears under no job. git diff --stat shows 78 files, 347 insertions, ZERO deletions -- an in-place edit of any trigger, job, step or permission would have registered a deletion. Limits: actionlint is unavailable here, so validation is structural only, and the adversarial verifier read 4 of 78 files before the disk filled. --- .github/workflows/author-docs-gate.yml | 4 + .github/workflows/ax7203-blinky-bitstream.yml | 4 + .github/workflows/ax7203-corona-decode.yml | 5 + .../workflows/ax7203-dual-clk-heartbeat.yml | 4 + .github/workflows/ax7203-format-cost.yml | 4 + .github/workflows/ax7203-gf10-add.yml | 5 + .github/workflows/ax7203-gf10-mul.yml | 5 + .github/workflows/ax7203-gf10-sub.yml | 5 + .github/workflows/ax7203-gf12-clean.yml | 5 + .github/workflows/ax7203-gf12-mul-clean.yml | 5 + .github/workflows/ax7203-gf12-sub.yml | 5 + .github/workflows/ax7203-gf14-add.yml | 5 + .github/workflows/ax7203-gf14-mul.yml | 5 + .github/workflows/ax7203-gf14-sub.yml | 5 + .github/workflows/ax7203-gf16-clean.yml | 4 + .github/workflows/ax7203-gf16-conformance.yml | 4 + .github/workflows/ax7203-gf16-mul-clean.yml | 5 + .github/workflows/ax7203-gf16-sub.yml | 5 + .github/workflows/ax7203-gf20-clean.yml | 4 + .github/workflows/ax7203-gf20-mul-clean.yml | 5 + .github/workflows/ax7203-gf20-sub.yml | 5 + .github/workflows/ax7203-gf24-clean.yml | 4 + .github/workflows/ax7203-gf24-mul-clean.yml | 5 + .github/workflows/ax7203-gf24-sub.yml | 5 + .github/workflows/ax7203-gf32-add.yml | 5 + .github/workflows/ax7203-gf32-mul.yml | 5 + .github/workflows/ax7203-gf32-sub.yml | 5 + .github/workflows/ax7203-gf4-clean.yml | 5 + .github/workflows/ax7203-gf4-mul-clean.yml | 5 + .github/workflows/ax7203-gf4-sub.yml | 5 + .github/workflows/ax7203-gf6-clean.yml | 5 + .github/workflows/ax7203-gf6-mul-clean.yml | 5 + .github/workflows/ax7203-gf6-sub.yml | 5 + .github/workflows/ax7203-gf8-clean.yml | 5 + .github/workflows/ax7203-gf8-mul-clean.yml | 5 + .github/workflows/ax7203-gf8-sub.yml | 5 + .github/workflows/ax7203-gfternary-mul.yml | 5 + .github/workflows/ax7203-identity-echo.yml | 5 + .github/workflows/ax7203-led-onehot.yml | 4 + .github/workflows/ax7203-rx-echo-hb.yml | 4 + .github/workflows/ax7203-trinet-baud.yml | 4 + .github/workflows/ax7203-trinet-dna-probe.yml | 5 + .github/workflows/ax7203-trinet-fleet.yml | 4 + .github/workflows/ax7203-trinet-mac32.yml | 5 + .github/workflows/ax7203-trinet-node-v2.yml | 5 + .github/workflows/ax7203-uart-loopback.yml | 4 + .github/workflows/ax7203-uart-tx-probe.yml | 4 + .github/workflows/brain-ci.yml | 4 + .github/workflows/build-paper.yml | 4 + .github/workflows/ci.yml | 4 + .github/workflows/codegen.yml | 4 + .../workflows/conformance-frame-alignment.yml | 4 + .../conformance-golden-selftests.yml | 4 + .github/workflows/conformance-selftest.yml | 4 + .github/workflows/counted-claim-gate.yml | 4 + .github/workflows/decode-verify.yml | 5 + .github/workflows/exhaustive-claim-gate.yml | 4 + .github/workflows/format-table-gate.yml | 4 + .github/workflows/fpga-bitstream.yml | 4 + .github/workflows/fpga-ci.yml | 4 + .github/workflows/fpga-docker.yml | 4 + .github/workflows/fpga-formal-comb.yml | 4 + .github/workflows/fpga-formal.yml | 4 + .github/workflows/fpga-hslm-bitstream.yml | 4 + .github/workflows/fpga-regression.yml | 4 + .github/workflows/gf-adder-ref-tb.yml | 4 + .github/workflows/hardware-row-gate.yml | 4 + .github/workflows/lut-report.yml | 4 + .github/workflows/module-loader-gate.yml | 4 + .github/workflows/narrow-register-gate.yml | 4 + .github/workflows/openxc7-build-timing.yml | 243 ++++++++++++++++++ .github/workflows/pack-layout-gate.yml | 4 + .github/workflows/reproducibility-gate.yml | 4 + .github/workflows/rtl-datapath-gate.yml | 4 + .github/workflows/stale-citation-gate.yml | 4 + .github/workflows/trinet-portability.yml | 4 + .github/workflows/workflow-path-gate.yml | 4 + .../wrapper-conversion-conformance.yml | 4 + .github/workflows/wrapper-fsm-sim.yml | 5 + 79 files changed, 590 insertions(+) create mode 100644 .github/workflows/openxc7-build-timing.yml diff --git a/.github/workflows/author-docs-gate.yml b/.github/workflows/author-docs-gate.yml index b2dd4dd0a7..942092ea72 100644 --- a/.github/workflows/author-docs-gate.yml +++ b/.github/workflows/author-docs-gate.yml @@ -26,6 +26,10 @@ on: - '.github/workflows/author-docs-gate.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: docs: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-blinky-bitstream.yml b/.github/workflows/ax7203-blinky-bitstream.yml index 1d38679a0a..78723dddfe 100644 --- a/.github/workflows/ax7203-blinky-bitstream.yml +++ b/.github/workflows/ax7203-blinky-bitstream.yml @@ -23,6 +23,10 @@ on: - 'specs/fpga/constraints/ax7203.xdc' - '.github/workflows/ax7203-blinky-bitstream.yml' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: name: Generate AX7203 Blinky Bitstream diff --git a/.github/workflows/ax7203-corona-decode.yml b/.github/workflows/ax7203-corona-decode.yml index a96b6badf4..99b3b2b8dd 100644 --- a/.github/workflows/ax7203-corona-decode.yml +++ b/.github/workflows/ax7203-corona-decode.yml @@ -27,6 +27,11 @@ on: - 'external/tt-trinity-corona/src/rtl/posit8_decode.v' - 'fpga/openxc7-synth/corona_decode_ax7203.xdc' - '.github/workflows/ax7203-corona-decode.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-dual-clk-heartbeat.yml b/.github/workflows/ax7203-dual-clk-heartbeat.yml index c256ea23a6..66a50089ca 100644 --- a/.github/workflows/ax7203-dual-clk-heartbeat.yml +++ b/.github/workflows/ax7203-dual-clk-heartbeat.yml @@ -13,6 +13,10 @@ on: - 'specs/fpga/constraints/dual_clk_heartbeat_ax7203.xdc' - '.github/workflows/ax7203-dual-clk-heartbeat.yml' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: name: Generate AX7203 Dual-Clock Heartbeat Bitstream diff --git a/.github/workflows/ax7203-format-cost.yml b/.github/workflows/ax7203-format-cost.yml index 6ee5f06755..d25b804d7f 100644 --- a/.github/workflows/ax7203-format-cost.yml +++ b/.github/workflows/ax7203-format-cost.yml @@ -18,6 +18,10 @@ on: branches: [main] paths: ['.github/workflows/ax7203-format-cost.yml'] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: synth: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf10-add.yml b/.github/workflows/ax7203-gf10-add.yml index b4d239c532..e6aa531a41 100644 --- a/.github/workflows/ax7203-gf10-add.yml +++ b/.github/workflows/ax7203-gf10-add.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf10_add_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','conformance/gf_ref.py','.github/workflows/ax7203-gf10-add.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf10-mul.yml b/.github/workflows/ax7203-gf10-mul.yml index fa0b8e75db..99cbe26e7c 100644 --- a/.github/workflows/ax7203-gf10-mul.yml +++ b/.github/workflows/ax7203-gf10-mul.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf10_mul_ax7203.v','fpga/openxc7-synth/gf_mul_param.v','.github/workflows/ax7203-gf10-mul.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf10-sub.yml b/.github/workflows/ax7203-gf10-sub.yml index 8cb8dfd2f9..709ef7b4b0 100644 --- a/.github/workflows/ax7203-gf10-sub.yml +++ b/.github/workflows/ax7203-gf10-sub.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf10_sub_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf10-sub.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf12-clean.yml b/.github/workflows/ax7203-gf12-clean.yml index 96791df5e0..a074748a60 100644 --- a/.github/workflows/ax7203-gf12-clean.yml +++ b/.github/workflows/ax7203-gf12-clean.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf12_clean_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf12-clean.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf12-mul-clean.yml b/.github/workflows/ax7203-gf12-mul-clean.yml index f2cbe10b5b..5274ab80d2 100644 --- a/.github/workflows/ax7203-gf12-mul-clean.yml +++ b/.github/workflows/ax7203-gf12-mul-clean.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf12_mul_ax7203.v','fpga/openxc7-synth/gf_mul_param.v','.github/workflows/ax7203-gf12-mul-clean.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf12-sub.yml b/.github/workflows/ax7203-gf12-sub.yml index fc6ceb949a..1b766040f6 100644 --- a/.github/workflows/ax7203-gf12-sub.yml +++ b/.github/workflows/ax7203-gf12-sub.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf12_sub_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf12-sub.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf14-add.yml b/.github/workflows/ax7203-gf14-add.yml index 54037e87bc..fcf1bcf5cb 100644 --- a/.github/workflows/ax7203-gf14-add.yml +++ b/.github/workflows/ax7203-gf14-add.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf14_add_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','conformance/gf_ref.py','.github/workflows/ax7203-gf14-add.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf14-mul.yml b/.github/workflows/ax7203-gf14-mul.yml index 78222e3346..51a0a5b5dc 100644 --- a/.github/workflows/ax7203-gf14-mul.yml +++ b/.github/workflows/ax7203-gf14-mul.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf14_mul_ax7203.v','fpga/openxc7-synth/gf_mul_param.v','.github/workflows/ax7203-gf14-mul.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf14-sub.yml b/.github/workflows/ax7203-gf14-sub.yml index 8dab954f9b..413b4093d6 100644 --- a/.github/workflows/ax7203-gf14-sub.yml +++ b/.github/workflows/ax7203-gf14-sub.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf14_sub_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf14-sub.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf16-clean.yml b/.github/workflows/ax7203-gf16-clean.yml index 4897261b13..e878e7d3a4 100644 --- a/.github/workflows/ax7203-gf16-clean.yml +++ b/.github/workflows/ax7203-gf16-clean.yml @@ -10,6 +10,10 @@ on: - 'specs/fpga/constraints/gf16_clean_ax7203.xdc' - '.github/workflows/ax7203-gf16-clean.yml' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf16-conformance.yml b/.github/workflows/ax7203-gf16-conformance.yml index 9e1c3e903f..966176a0a3 100644 --- a/.github/workflows/ax7203-gf16-conformance.yml +++ b/.github/workflows/ax7203-gf16-conformance.yml @@ -34,6 +34,10 @@ on: - 'specs/fpga/constraints/gf16_ax7203.xdc' - '.github/workflows/ax7203-gf16-conformance.yml' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: name: Generate AX7203 GF16 Codec Bitstream diff --git a/.github/workflows/ax7203-gf16-mul-clean.yml b/.github/workflows/ax7203-gf16-mul-clean.yml index 57f7733f30..2458a102a3 100644 --- a/.github/workflows/ax7203-gf16-mul-clean.yml +++ b/.github/workflows/ax7203-gf16-mul-clean.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf16_mul_ax7203.v','fpga/openxc7-synth/gf_mul_param.v','.github/workflows/ax7203-gf16-mul-clean.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf16-sub.yml b/.github/workflows/ax7203-gf16-sub.yml index 8f83a6ca55..d951e001a0 100644 --- a/.github/workflows/ax7203-gf16-sub.yml +++ b/.github/workflows/ax7203-gf16-sub.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf16_sub_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf16-sub.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf20-clean.yml b/.github/workflows/ax7203-gf20-clean.yml index 6ed7cb1ff7..cb934b1f77 100644 --- a/.github/workflows/ax7203-gf20-clean.yml +++ b/.github/workflows/ax7203-gf20-clean.yml @@ -10,6 +10,10 @@ on: - 'specs/fpga/constraints/gf16_clean_ax7203.xdc' - '.github/workflows/ax7203-gf20-clean.yml' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf20-mul-clean.yml b/.github/workflows/ax7203-gf20-mul-clean.yml index 58c8454374..b3c0cc5ccf 100644 --- a/.github/workflows/ax7203-gf20-mul-clean.yml +++ b/.github/workflows/ax7203-gf20-mul-clean.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf20_mul_ax7203.v','fpga/openxc7-synth/gf_mul_param.v','.github/workflows/ax7203-gf20-mul-clean.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf20-sub.yml b/.github/workflows/ax7203-gf20-sub.yml index b828e4a7fc..1d8bd3c606 100644 --- a/.github/workflows/ax7203-gf20-sub.yml +++ b/.github/workflows/ax7203-gf20-sub.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf20_sub_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf20-sub.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf24-clean.yml b/.github/workflows/ax7203-gf24-clean.yml index 010c039f62..34f8921ee7 100644 --- a/.github/workflows/ax7203-gf24-clean.yml +++ b/.github/workflows/ax7203-gf24-clean.yml @@ -10,6 +10,10 @@ on: - 'specs/fpga/constraints/gf16_clean_ax7203.xdc' - '.github/workflows/ax7203-gf24-clean.yml' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf24-mul-clean.yml b/.github/workflows/ax7203-gf24-mul-clean.yml index 631c4ce52f..651ef93e85 100644 --- a/.github/workflows/ax7203-gf24-mul-clean.yml +++ b/.github/workflows/ax7203-gf24-mul-clean.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf24_mul_ax7203.v','fpga/openxc7-synth/gf_mul_param.v','.github/workflows/ax7203-gf24-mul-clean.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf24-sub.yml b/.github/workflows/ax7203-gf24-sub.yml index dbf617cfe2..ac55ea8a03 100644 --- a/.github/workflows/ax7203-gf24-sub.yml +++ b/.github/workflows/ax7203-gf24-sub.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf24_sub_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf24-sub.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf32-add.yml b/.github/workflows/ax7203-gf32-add.yml index d1d3c77a3f..4574625938 100644 --- a/.github/workflows/ax7203-gf32-add.yml +++ b/.github/workflows/ax7203-gf32-add.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf32_add_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf32-add.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf32-mul.yml b/.github/workflows/ax7203-gf32-mul.yml index 286e7e90c6..9684050897 100644 --- a/.github/workflows/ax7203-gf32-mul.yml +++ b/.github/workflows/ax7203-gf32-mul.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf32_mul_ax7203.v','fpga/openxc7-synth/gf_mul_param.v','.github/workflows/ax7203-gf32-mul.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf32-sub.yml b/.github/workflows/ax7203-gf32-sub.yml index 1ae1e7ab2a..62b69c0dae 100644 --- a/.github/workflows/ax7203-gf32-sub.yml +++ b/.github/workflows/ax7203-gf32-sub.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf32_sub_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','conformance/gf_ref.py','.github/workflows/ax7203-gf32-sub.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf4-clean.yml b/.github/workflows/ax7203-gf4-clean.yml index a7a084808e..0744afcd0d 100644 --- a/.github/workflows/ax7203-gf4-clean.yml +++ b/.github/workflows/ax7203-gf4-clean.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf4_clean_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf4-clean.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf4-mul-clean.yml b/.github/workflows/ax7203-gf4-mul-clean.yml index 87fd2e4c0b..c2d67f4587 100644 --- a/.github/workflows/ax7203-gf4-mul-clean.yml +++ b/.github/workflows/ax7203-gf4-mul-clean.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf4_mul_ax7203.v','fpga/openxc7-synth/gf_mul_param.v','.github/workflows/ax7203-gf4-mul-clean.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf4-sub.yml b/.github/workflows/ax7203-gf4-sub.yml index 8030fd6b90..ee12ce6e38 100644 --- a/.github/workflows/ax7203-gf4-sub.yml +++ b/.github/workflows/ax7203-gf4-sub.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf4_sub_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf4-sub.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf6-clean.yml b/.github/workflows/ax7203-gf6-clean.yml index 2c8550a5fc..e728c35c5d 100644 --- a/.github/workflows/ax7203-gf6-clean.yml +++ b/.github/workflows/ax7203-gf6-clean.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf6_clean_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf6-clean.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf6-mul-clean.yml b/.github/workflows/ax7203-gf6-mul-clean.yml index 9c8445b9ad..6f0365f1fb 100644 --- a/.github/workflows/ax7203-gf6-mul-clean.yml +++ b/.github/workflows/ax7203-gf6-mul-clean.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf6_mul_ax7203.v','fpga/openxc7-synth/gf_mul_param.v','.github/workflows/ax7203-gf6-mul-clean.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf6-sub.yml b/.github/workflows/ax7203-gf6-sub.yml index 0bf57e0889..097ea12823 100644 --- a/.github/workflows/ax7203-gf6-sub.yml +++ b/.github/workflows/ax7203-gf6-sub.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf6_sub_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf6-sub.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf8-clean.yml b/.github/workflows/ax7203-gf8-clean.yml index f51923e21b..03cffdd48e 100644 --- a/.github/workflows/ax7203-gf8-clean.yml +++ b/.github/workflows/ax7203-gf8-clean.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf8_clean_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf8-clean.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf8-mul-clean.yml b/.github/workflows/ax7203-gf8-mul-clean.yml index 50c37fec90..966a3c9898 100644 --- a/.github/workflows/ax7203-gf8-mul-clean.yml +++ b/.github/workflows/ax7203-gf8-mul-clean.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf8_mul_ax7203.v','fpga/openxc7-synth/gf_mul_param.v','.github/workflows/ax7203-gf8-mul-clean.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gf8-sub.yml b/.github/workflows/ax7203-gf8-sub.yml index 8b3d3f02c8..afd53d8801 100644 --- a/.github/workflows/ax7203-gf8-sub.yml +++ b/.github/workflows/ax7203-gf8-sub.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/gf8_sub_ax7203.v','fpga/openxc7-synth/gf_adder_param.v','.github/workflows/ax7203-gf8-sub.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-gfternary-mul.yml b/.github/workflows/ax7203-gfternary-mul.yml index b076fc05f4..29785ad3df 100644 --- a/.github/workflows/ax7203-gfternary-mul.yml +++ b/.github/workflows/ax7203-gfternary-mul.yml @@ -8,6 +8,11 @@ on: - 'fpga/openxc7-synth/corona_compute_gfternary_mul_ax7203.v' - 'conformance/gfternary_compute_conformance_ax7203.py' - '.github/workflows/ax7203-gfternary-mul.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: golden: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-identity-echo.yml b/.github/workflows/ax7203-identity-echo.yml index 77cf769516..2ddab7f0ce 100644 --- a/.github/workflows/ax7203-identity-echo.yml +++ b/.github/workflows/ax7203-identity-echo.yml @@ -4,6 +4,11 @@ on: push: branches: [main] paths: ['fpga/vivado/identity_echo_ax7203.v','.github/workflows/ax7203-identity-echo.yml'] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-led-onehot.yml b/.github/workflows/ax7203-led-onehot.yml index 2877edbc10..f1b4832d80 100644 --- a/.github/workflows/ax7203-led-onehot.yml +++ b/.github/workflows/ax7203-led-onehot.yml @@ -13,6 +13,10 @@ on: - 'specs/fpga/constraints/led_onehot_ax7203.xdc' - '.github/workflows/ax7203-led-onehot.yml' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: name: Generate AX7203 LED Onehot Bitstream diff --git a/.github/workflows/ax7203-rx-echo-hb.yml b/.github/workflows/ax7203-rx-echo-hb.yml index 173f6a093e..f00095e3ce 100644 --- a/.github/workflows/ax7203-rx-echo-hb.yml +++ b/.github/workflows/ax7203-rx-echo-hb.yml @@ -11,6 +11,10 @@ on: - 'specs/fpga/constraints/rx_echo_hb_ax7203.xdc' - '.github/workflows/ax7203-rx-echo-hb.yml' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: name: Generate AX7203 RX-Echo Heartbeat Bitstream diff --git a/.github/workflows/ax7203-trinet-baud.yml b/.github/workflows/ax7203-trinet-baud.yml index 626677a419..e35be30163 100644 --- a/.github/workflows/ax7203-trinet-baud.yml +++ b/.github/workflows/ax7203-trinet-baud.yml @@ -24,6 +24,10 @@ on: # Building all three so the fastest working one can be found by measurement # rather than by argument. +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: baud: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-trinet-dna-probe.yml b/.github/workflows/ax7203-trinet-dna-probe.yml index 21d905d7ca..8acebfc42a 100644 --- a/.github/workflows/ax7203-trinet-dna-probe.yml +++ b/.github/workflows/ax7203-trinet-dna-probe.yml @@ -7,6 +7,11 @@ on: - 'fpga/vivado/trinet_dna_probe_ax7203.v' - 'formal/trinet_dna_probe_tb.v' - '.github/workflows/ax7203-trinet-dna-probe.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: golden: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-trinet-fleet.yml b/.github/workflows/ax7203-trinet-fleet.yml index 86b6dcf658..88c52a88d4 100644 --- a/.github/workflows/ax7203-trinet-fleet.yml +++ b/.github/workflows/ax7203-trinet-fleet.yml @@ -61,6 +61,10 @@ on: # Building the fleet at the old 434 would ship a network that is 4x slower than # the hardware has already been shown to manage. +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: fleet: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-trinet-mac32.yml b/.github/workflows/ax7203-trinet-mac32.yml index 22c2334dc6..3da3c3f98c 100644 --- a/.github/workflows/ax7203-trinet-mac32.yml +++ b/.github/workflows/ax7203-trinet-mac32.yml @@ -8,6 +8,11 @@ on: - 'formal/trinet_mac32_tb.v' - 'conformance/trinet_mac32_conformance_ax7203.py' - '.github/workflows/ax7203-trinet-mac32.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: golden: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-trinet-node-v2.yml b/.github/workflows/ax7203-trinet-node-v2.yml index a8259ba794..b6ea566387 100644 --- a/.github/workflows/ax7203-trinet-node-v2.yml +++ b/.github/workflows/ax7203-trinet-node-v2.yml @@ -11,6 +11,11 @@ on: - '.github/workflows/ax7203-trinet-node-v2.yml' # the scripts this job runs: fixing a check must re-run it - 'conformance/trinet_mac32_conformance_ax7203.py' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: golden: runs-on: ubuntu-latest diff --git a/.github/workflows/ax7203-uart-loopback.yml b/.github/workflows/ax7203-uart-loopback.yml index 13c21a13f7..3993fceb2c 100644 --- a/.github/workflows/ax7203-uart-loopback.yml +++ b/.github/workflows/ax7203-uart-loopback.yml @@ -13,6 +13,10 @@ on: - 'specs/fpga/constraints/gf16_ax7203.xdc' - '.github/workflows/ax7203-uart-loopback.yml' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: name: Generate AX7203 UART Loopback Bitstream diff --git a/.github/workflows/ax7203-uart-tx-probe.yml b/.github/workflows/ax7203-uart-tx-probe.yml index 28bd817709..7b2fc664c6 100644 --- a/.github/workflows/ax7203-uart-tx-probe.yml +++ b/.github/workflows/ax7203-uart-tx-probe.yml @@ -12,6 +12,10 @@ on: - 'specs/fpga/constraints/uart_tx_probe_ax7203.xdc' - '.github/workflows/ax7203-uart-tx-probe.yml' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: name: Generate AX7203 UART TX Probe Bitstream diff --git a/.github/workflows/brain-ci.yml b/.github/workflows/brain-ci.yml index 40f236f696..6b6615a520 100644 --- a/.github/workflows/brain-ci.yml +++ b/.github/workflows/brain-ci.yml @@ -14,6 +14,10 @@ env: BRAIN_HEALTH_THRESHOLD: "80" # Minimum health score for merge STRESS_TEST_THRESHOLD: "270" # Minimum stress test score (270/300 = 90%) +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: # ========================================================================= # Phase -1: Build entry-point detection diff --git a/.github/workflows/build-paper.yml b/.github/workflows/build-paper.yml index 7f9d5af115..0ceb4aabb9 100644 --- a/.github/workflows/build-paper.yml +++ b/.github/workflows/build-paper.yml @@ -7,6 +7,10 @@ on: - 'research/arxiv_submission/**' - '.github/workflows/build-paper.yml' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: build: runs-on: ubuntu-latest diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 27d5209351..a3876e0a94 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,6 +18,10 @@ on: # Реальный гейт = per-file `zig test` стабильных модулей + `zig fmt --check`. # Когда миграция VIBEE завершится — убрать `continue-on-error` (отдельный PR). +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: test: name: Build & Test diff --git a/.github/workflows/codegen.yml b/.github/workflows/codegen.yml index 222eadf997..fea40d29bd 100644 --- a/.github/workflows/codegen.yml +++ b/.github/workflows/codegen.yml @@ -10,6 +10,10 @@ on: - cron: '0 0 * * *' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: validate: name: Validate VIBEE Codegen diff --git a/.github/workflows/conformance-frame-alignment.yml b/.github/workflows/conformance-frame-alignment.yml index dfedc82ea6..8d5b618d46 100644 --- a/.github/workflows/conformance-frame-alignment.yml +++ b/.github/workflows/conformance-frame-alignment.yml @@ -21,6 +21,10 @@ on: # day rather than at the next flash session. - cron: '17 4 * * *' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: alignment: runs-on: ubuntu-latest diff --git a/.github/workflows/conformance-golden-selftests.yml b/.github/workflows/conformance-golden-selftests.yml index f0443f4de6..6349937655 100644 --- a/.github/workflows/conformance-golden-selftests.yml +++ b/.github/workflows/conformance-golden-selftests.yml @@ -14,6 +14,10 @@ on: - '.github/workflows/conformance-golden-selftests.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: selftest: runs-on: ubuntu-latest diff --git a/.github/workflows/conformance-selftest.yml b/.github/workflows/conformance-selftest.yml index 4d0eac4646..0eb9d79878 100644 --- a/.github/workflows/conformance-selftest.yml +++ b/.github/workflows/conformance-selftest.yml @@ -21,6 +21,10 @@ on: paths: - 'conformance/**' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: selftest: runs-on: ubuntu-latest diff --git a/.github/workflows/counted-claim-gate.yml b/.github/workflows/counted-claim-gate.yml index d8a2bef841..15d721ba5e 100644 --- a/.github/workflows/counted-claim-gate.yml +++ b/.github/workflows/counted-claim-gate.yml @@ -23,6 +23,10 @@ on: - '.github/workflows/counted-claim-gate.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: counted-claims: runs-on: ubuntu-latest diff --git a/.github/workflows/decode-verify.yml b/.github/workflows/decode-verify.yml index 2b5f604815..254bf60a44 100644 --- a/.github/workflows/decode-verify.yml +++ b/.github/workflows/decode-verify.yml @@ -16,6 +16,11 @@ on: - 'formal/binary16_decode_tb.v' - 'formal/fp8_e5m2_decode_tb.v' - '.github/workflows/decode-verify.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: verify: runs-on: ubuntu-latest diff --git a/.github/workflows/exhaustive-claim-gate.yml b/.github/workflows/exhaustive-claim-gate.yml index 49b9593ff4..50d13e21fd 100644 --- a/.github/workflows/exhaustive-claim-gate.yml +++ b/.github/workflows/exhaustive-claim-gate.yml @@ -26,6 +26,10 @@ on: - '.github/workflows/exhaustive-claim-gate.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: exhaustive-claims: runs-on: ubuntu-latest diff --git a/.github/workflows/format-table-gate.yml b/.github/workflows/format-table-gate.yml index 0490a04d34..4952a78f8c 100644 --- a/.github/workflows/format-table-gate.yml +++ b/.github/workflows/format-table-gate.yml @@ -26,6 +26,10 @@ on: - '.github/workflows/format-table-gate.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: format-tables: runs-on: ubuntu-latest diff --git a/.github/workflows/fpga-bitstream.yml b/.github/workflows/fpga-bitstream.yml index 26f61fe89b..477c0854a4 100644 --- a/.github/workflows/fpga-bitstream.yml +++ b/.github/workflows/fpga-bitstream.yml @@ -45,6 +45,10 @@ on: env: CONSCIOUSNESS_DEFAULT: 'aware' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: # ═══════════════════════════════════════════════════════════════════════════════ # EXTRACT CHANGED SPECS diff --git a/.github/workflows/fpga-ci.yml b/.github/workflows/fpga-ci.yml index fe39100f17..18961f86a7 100644 --- a/.github/workflows/fpga-ci.yml +++ b/.github/workflows/fpga-ci.yml @@ -33,6 +33,10 @@ on: - '.github/workflows/fpga-ci.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: # ═══════════════════════════════════════════════════════════════════════════════ # SACRED CONSTANTS VALIDATION diff --git a/.github/workflows/fpga-docker.yml b/.github/workflows/fpga-docker.yml index 93fc04e0e4..58a48abece 100644 --- a/.github/workflows/fpga-docker.yml +++ b/.github/workflows/fpga-docker.yml @@ -45,6 +45,10 @@ env: REGISTRY: ghcr.io IMAGE_NAME: trinity-openxc7 +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: false + jobs: # ═══════════════════════════════════════════════════════════════════════════════ # BUILD DOCKER IMAGE diff --git a/.github/workflows/fpga-formal-comb.yml b/.github/workflows/fpga-formal-comb.yml index 3f4c7459ba..32b0b3c3e6 100644 --- a/.github/workflows/fpga-formal-comb.yml +++ b/.github/workflows/fpga-formal-comb.yml @@ -43,6 +43,10 @@ on: - '.github/workflows/fpga-formal-comb.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: comb-miter: name: "🔬 yosys sat — ${{ matrix.op }} ${{ matrix.task }}" diff --git a/.github/workflows/fpga-formal.yml b/.github/workflows/fpga-formal.yml index 574b04282d..4e6813bb84 100644 --- a/.github/workflows/fpga-formal.yml +++ b/.github/workflows/fpga-formal.yml @@ -52,6 +52,10 @@ on: - '.github/workflows/fpga-formal.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: formal: name: "🔬 sby z3 — ${{ matrix.op }} ${{ matrix.task }}" diff --git a/.github/workflows/fpga-hslm-bitstream.yml b/.github/workflows/fpga-hslm-bitstream.yml index 338366c9d4..e441388e38 100644 --- a/.github/workflows/fpga-hslm-bitstream.yml +++ b/.github/workflows/fpga-hslm-bitstream.yml @@ -20,6 +20,10 @@ on: - 'fpga/openxc7-synth/embedding_lookup.v' - 'fpga/openxc7-synth/argmax_unit.v' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: bitstream: name: Generate HSLM Bitstream diff --git a/.github/workflows/fpga-regression.yml b/.github/workflows/fpga-regression.yml index 2739312169..c2cbab18d9 100644 --- a/.github/workflows/fpga-regression.yml +++ b/.github/workflows/fpga-regression.yml @@ -30,6 +30,10 @@ on: env: CONSCIOUSNESS_THRESHOLD: "61.8" # φ⁻¹ immortality threshold +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: # ═══════════════════════════════════════════════════════════════════════════ # SACRED CONSTANTS VALIDATION diff --git a/.github/workflows/gf-adder-ref-tb.yml b/.github/workflows/gf-adder-ref-tb.yml index 1e62e4bd30..7fcf5dd78c 100644 --- a/.github/workflows/gf-adder-ref-tb.yml +++ b/.github/workflows/gf-adder-ref-tb.yml @@ -22,6 +22,10 @@ on: - 'formal/gf_adder_ref_tb.v' - 'formal/gf_mul_ref_tb.v' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: ref-tb: runs-on: ubuntu-latest diff --git a/.github/workflows/hardware-row-gate.yml b/.github/workflows/hardware-row-gate.yml index df83020d37..82eeec5575 100644 --- a/.github/workflows/hardware-row-gate.yml +++ b/.github/workflows/hardware-row-gate.yml @@ -25,6 +25,10 @@ on: - '.github/workflows/hardware-row-gate.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: hardware-rows: runs-on: ubuntu-latest diff --git a/.github/workflows/lut-report.yml b/.github/workflows/lut-report.yml index 1735b14319..9f504f5e26 100644 --- a/.github/workflows/lut-report.yml +++ b/.github/workflows/lut-report.yml @@ -13,6 +13,10 @@ on: branches: [main] workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: yosys-synth: runs-on: ubuntu-22.04 diff --git a/.github/workflows/module-loader-gate.yml b/.github/workflows/module-loader-gate.yml index 874145e7b4..e3eab48a8b 100644 --- a/.github/workflows/module-loader-gate.yml +++ b/.github/workflows/module-loader-gate.yml @@ -31,6 +31,10 @@ on: - '.github/workflows/module-loader-gate.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: module-loaders: runs-on: ubuntu-latest diff --git a/.github/workflows/narrow-register-gate.yml b/.github/workflows/narrow-register-gate.yml index 0a8ca17543..2f8ae9399b 100644 --- a/.github/workflows/narrow-register-gate.yml +++ b/.github/workflows/narrow-register-gate.yml @@ -24,6 +24,10 @@ on: - '.github/workflows/narrow-register-gate.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: narrow-register: runs-on: ubuntu-latest diff --git a/.github/workflows/openxc7-build-timing.yml b/.github/workflows/openxc7-build-timing.yml new file mode 100644 index 0000000000..c9d39c98c7 --- /dev/null +++ b/.github/workflows/openxc7-build-timing.yml @@ -0,0 +1,243 @@ +# openXC7 build-time measurement +# +# Produces the number nobody has published with a method attached: how long the +# open toolchain takes to turn Verilog into a bitstream, on a stated machine, +# with stated boundaries. +# +# The boundaries are the point. Measured: +# yosys synthesis + nextpnr place-and-route + fasm2frames + xc7frames2bit +# NOT measured: +# docker pull, checkout, chipdb generation +# The chipdb is built once in a separate job and handed to every measurement job +# as an artifact, so it is identical across runs and outside the timed window. +# It is a property of the part, not of the design, and Vivado has no equivalent +# step — including it would flatter neither tool honestly. +# +# Five repeats per design, because nextpnr is seed-sensitive and one run is one +# seed. The report prints the median and the full spread; a single number from a +# single run is what this workflow exists to avoid. +# +# The Vivado half of the comparison cannot run here — no license, no install. +# These designs are plain Verilog + XDC, so anyone with Vivado can build the +# same three and put their numbers beside these. +# +# phi^2 + 1/phi^2 = 3 = TRINITY + +name: openXC7 build timing + +on: + workflow_dispatch: + inputs: + repeats: + description: 'Runs per design' + required: false + default: '5' + +jobs: + chipdb: + name: chipdb xc7a200tfbg484-2 + runs-on: ubuntu-latest + timeout-minutes: 90 + steps: + - uses: actions/checkout@v4 + + - name: Pull openXC7 image + run: | + for i in 1 2 3 4 5 6; do + docker pull regymm/openxc7:latest && break + echo "::warning::pull attempt $i failed, sleeping $((i*20))s"; sleep $((i*20)) + done + docker image inspect regymm/openxc7:latest >/dev/null + + - name: Cache chipdb + id: cache + uses: actions/cache@v4 + with: + path: chipdb/xc7a200tfbg484-2.bin + key: chipdb-xc7a200tfbg484-2-regymm-v1 + + - name: Generate chipdb + if: steps.cache.outputs.cache-hit != 'true' + run: | + mkdir -p chipdb + docker run --rm -v "$PWD:/work" -w /work regymm/openxc7 bash -c " + cd /nextpnr-xilinx && + python3 xilinx/python/bbaexport.py --device xc7a200tfbg484-2 --bba /work/chipdb/xc7a200tfbg484-2.bba && + bbasm -l /work/chipdb/xc7a200tfbg484-2.bba /work/chipdb/xc7a200tfbg484-2.bin + " + + - name: Upload chipdb + uses: actions/upload-artifact@v4 + with: + name: chipdb + path: chipdb/xc7a200tfbg484-2.bin + retention-days: 1 + + measure: + name: ${{ matrix.design }} run ${{ matrix.run }} + needs: chipdb + runs-on: ubuntu-latest + timeout-minutes: 120 + strategy: + fail-fast: false + matrix: + design: [blinky, decode_bf16, gf12_mul] + run: [1, 2, 3, 4, 5] + steps: + - uses: actions/checkout@v4 + + - name: Pull openXC7 image + run: | + for i in 1 2 3 4 5 6; do + docker pull regymm/openxc7:latest && break + sleep $((i*20)) + done + docker image inspect regymm/openxc7:latest >/dev/null + + - uses: actions/download-artifact@v4 + with: + name: chipdb + path: chipdb + + - name: Record the machine + run: | + echo "cores=$(nproc)" | tee machine.txt + echo "mem_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')" | tee -a machine.txt + echo "model=$(grep -m1 'model name' /proc/cpuinfo | cut -d: -f2- | xargs)" | tee -a machine.txt + + - name: Select the design + id: d + run: | + case "${{ matrix.design }}" in + blinky) + echo "src=fpga/vivado/blinky_ax7203.v" >> $GITHUB_OUTPUT + echo "top=blinky_ax7203" >> $GITHUB_OUTPUT + echo "xdc=specs/fpga/constraints/ax7203.xdc" >> $GITHUB_OUTPUT + echo "synth=-flatten -abc9 -arch xc7" >> $GITHUB_OUTPUT + echo "placer=sa" >> $GITHUB_OUTPUT + echo "freq=100.0" >> $GITHUB_OUTPUT + ;; + decode_bf16) + echo "src=fpga/openxc7-synth/corona_decode_bf16_ax7203.v" >> $GITHUB_OUTPUT + echo "top=corona_decode_bf16_ax7203" >> $GITHUB_OUTPUT + echo "xdc=fpga/openxc7-synth/corona_decode_ax7203.xdc" >> $GITHUB_OUTPUT + echo "synth=-flatten -abc9 -nocarry -arch xc7" >> $GITHUB_OUTPUT + echo "placer=sa" >> $GITHUB_OUTPUT + echo "freq=50.0" >> $GITHUB_OUTPUT + ;; + gf12_mul) + # -nodsp is not optional here. Without it yosys infers DSP48E1 + # multipliers that nextpnr-xilinx cannot route, and the build dies + # with "no clean seed" across every seed and placer. That was the + # root cause of every GF MUL routing failure we have had. + echo "src=fpga/openxc7-synth/gf_adder_param.v fpga/openxc7-synth/gf_mul_param.v fpga/openxc7-synth/corona_compute_gf12_mul_ax7203.v" >> $GITHUB_OUTPUT + echo "top=corona_compute_gf12_mul_ax7203" >> $GITHUB_OUTPUT + echo "xdc=fpga/openxc7-synth/ax7203_corona.xdc" >> $GITHUB_OUTPUT + echo "synth=-flatten -abc9 -nocarry -nodsp -arch xc7" >> $GITHUB_OUTPUT + echo "placer=heap" >> $GITHUB_OUTPUT + echo "freq=5.0" >> $GITHUB_OUTPUT + ;; + esac + mkdir -p out + + - name: Synthesis + id: synth + run: | + S=$(date +%s%3N) + docker run --rm -v "$PWD:/work" -w /work regymm/openxc7 \ + yosys -q -p "read_verilog ${{ steps.d.outputs.src }}; synth_xilinx ${{ steps.d.outputs.synth }} -top ${{ steps.d.outputs.top }}; setundef -zero -params; write_json out/d.json" + E=$(date +%s%3N) + echo "ms=$((E-S))" >> $GITHUB_OUTPUT + + - name: Place and route + id: pnr + run: | + S=$(date +%s%3N) + docker run --rm -v "$PWD:/work" -w /work regymm/openxc7 \ + nextpnr-xilinx \ + --chipdb /work/chipdb/xc7a200tfbg484-2.bin \ + --xdc /work/${{ steps.d.outputs.xdc }} \ + --json /work/out/d.json \ + --fasm /work/out/d.fasm \ + --freq ${{ steps.d.outputs.freq }} --seed 1 \ + --placer ${{ steps.d.outputs.placer }} --router router1 \ + --timing-allow-fail --force + E=$(date +%s%3N) + echo "ms=$((E-S))" >> $GITHUB_OUTPUT + + - name: Bitstream + id: bit + run: | + S=$(date +%s%3N) + docker run --rm -v "$PWD:/work" -w /work regymm/openxc7 bash -c " + source /prjxray/env/bin/activate && + fasm2frames --db-root /nextpnr-xilinx/xilinx/external/prjxray-db/artix7 \ + --part xc7a200tfbg484-2 /work/out/d.fasm /work/out/d.frames && + /prjxray/build/tools/xc7frames2bit \ + --part_file /nextpnr-xilinx/xilinx/external/prjxray-db/artix7/xc7a200tfbg484-2/part.yaml \ + --part_name xc7a200tfbg484-2 --frm_file /work/out/d.frames \ + --output_file /work/out/d.bit + " + E=$(date +%s%3N) + echo "ms=$((E-S))" >> $GITHUB_OUTPUT + ls -l out/d.bit + + - name: Emit the measurement + run: | + SY=${{ steps.synth.outputs.ms }} + PR=${{ steps.pnr.outputs.ms }} + BI=${{ steps.bit.outputs.ms }} + jq -n --arg design "${{ matrix.design }}" --argjson run ${{ matrix.run }} \ + --argjson synth $SY --argjson pnr $PR --argjson bit $BI \ + --argjson total $((SY+PR+BI)) \ + --arg cores "$(nproc)" \ + '{design:$design, run:$run, synth_ms:$synth, pnr_ms:$pnr, bit_ms:$bit, total_ms:$total, cores:($cores|tonumber)}' \ + > out/timing-${{ matrix.design }}-${{ matrix.run }}.json + cat out/timing-${{ matrix.design }}-${{ matrix.run }}.json + + - uses: actions/upload-artifact@v4 + with: + name: timing-${{ matrix.design }}-${{ matrix.run }} + path: out/timing-${{ matrix.design }}-${{ matrix.run }}.json + retention-days: 30 + + report: + name: Median and spread + needs: measure + if: always() + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + pattern: timing-* + merge-multiple: true + path: t + + - name: Aggregate + run: | + echo "## openXC7 build time" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Runner: \`ubuntu-latest\`, $(nproc) cores. Measured: synthesis + place-and-route + bitstream." >> $GITHUB_STEP_SUMMARY + echo "Not measured: image pull, checkout, chipdb generation." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| design | n | median | min | max | synth | p&r | bit |" >> $GITHUB_STEP_SUMMARY + echo "|---|---|---|---|---|---|---|---|" >> $GITHUB_STEP_SUMMARY + jq -s -r ' + def med: sort | if length == 0 then 0 + elif length % 2 == 1 then .[length/2|floor] + else ((.[length/2-1] + .[length/2]) / 2) end; + def s(x): (x/1000*10|round)/10 | tostring + "s"; + group_by(.design)[] + | { d: .[0].design, n: length, + tot: [.[].total_ms], sy: [.[].synth_ms], pr: [.[].pnr_ms], bi: [.[].bit_ms] } + | "| \(.d) | \(.n) | \(.tot|med|s(.)) | \(.tot|min|s(.)) | \(.tot|max|s(.)) | \(.sy|med|s(.)) | \(.pr|med|s(.)) | \(.bi|med|s(.)) |" + ' t/*.json >> $GITHUB_STEP_SUMMARY || echo "no measurements collected" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Vivado has no numbers here: no license, no install. These designs are plain Verilog + XDC and can be built by anyone who has it." >> $GITHUB_STEP_SUMMARY + cat $GITHUB_STEP_SUMMARY + + - uses: actions/upload-artifact@v4 + with: + name: timings-all + path: t + retention-days: 90 diff --git a/.github/workflows/pack-layout-gate.yml b/.github/workflows/pack-layout-gate.yml index 6fe0447891..7c403d1116 100644 --- a/.github/workflows/pack-layout-gate.yml +++ b/.github/workflows/pack-layout-gate.yml @@ -24,6 +24,10 @@ on: - '.github/workflows/pack-layout-gate.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: pack-layouts: runs-on: ubuntu-latest diff --git a/.github/workflows/reproducibility-gate.yml b/.github/workflows/reproducibility-gate.yml index d80050becc..2bb2434dc6 100644 --- a/.github/workflows/reproducibility-gate.yml +++ b/.github/workflows/reproducibility-gate.yml @@ -29,6 +29,10 @@ on: - '.github/workflows/reproducibility-gate.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: reproducibility: runs-on: ubuntu-latest diff --git a/.github/workflows/rtl-datapath-gate.yml b/.github/workflows/rtl-datapath-gate.yml index 06446ed81e..40ee625410 100644 --- a/.github/workflows/rtl-datapath-gate.yml +++ b/.github/workflows/rtl-datapath-gate.yml @@ -26,6 +26,10 @@ on: - '.github/workflows/rtl-datapath-gate.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: datapath: runs-on: ubuntu-latest diff --git a/.github/workflows/stale-citation-gate.yml b/.github/workflows/stale-citation-gate.yml index 384f974cf8..bc322c3c11 100644 --- a/.github/workflows/stale-citation-gate.yml +++ b/.github/workflows/stale-citation-gate.yml @@ -30,6 +30,10 @@ on: - '.github/workflows/stale-citation-gate.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: stale-citations: runs-on: ubuntu-latest diff --git a/.github/workflows/trinet-portability.yml b/.github/workflows/trinet-portability.yml index 3a9be357c1..c864a67cb0 100644 --- a/.github/workflows/trinet-portability.yml +++ b/.github/workflows/trinet-portability.yml @@ -33,6 +33,10 @@ on: schedule: - cron: '41 5 * * *' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: receipt-keys: runs-on: ubuntu-latest diff --git a/.github/workflows/workflow-path-gate.yml b/.github/workflows/workflow-path-gate.yml index b9f0b7b452..93f3f628c6 100644 --- a/.github/workflows/workflow-path-gate.yml +++ b/.github/workflows/workflow-path-gate.yml @@ -22,6 +22,10 @@ on: - 'research/audit_workflow_paths.py' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: paths: runs-on: ubuntu-latest diff --git a/.github/workflows/wrapper-conversion-conformance.yml b/.github/workflows/wrapper-conversion-conformance.yml index 1e3f05b93f..5547571b3e 100644 --- a/.github/workflows/wrapper-conversion-conformance.yml +++ b/.github/workflows/wrapper-conversion-conformance.yml @@ -28,6 +28,10 @@ on: - '.github/workflows/wrapper-conversion-conformance.yml' workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: conversion: runs-on: ubuntu-latest diff --git a/.github/workflows/wrapper-fsm-sim.yml b/.github/workflows/wrapper-fsm-sim.yml index 5287558158..6c7be59347 100644 --- a/.github/workflows/wrapper-fsm-sim.yml +++ b/.github/workflows/wrapper-fsm-sim.yml @@ -28,6 +28,11 @@ on: # all five results - 'fpga/openxc7-synth/STARTUPE2_mock.v' - '.github/workflows/wrapper-fsm-sim.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: fsm-sim: runs-on: ubuntu-latest