mirror of
https://github.com/verilator/verilator.git
synced 2026-09-03 08:24:31 +02:00
Add a script that prints the job matrix of cases to run with RTLMeter. This enables running different sets based on parameters. It will run everything on scheduled nightly runs, but only a subset on PRs (to reduce time and variance due to short cases). Also prints the job matrix in descending duration order, which effectively makes GitHub actions schedule longest jobs first to reduce total workflow latency.
211 lines
9.1 KiB
Python
Executable File
211 lines
9.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# DESCRIPTION: Verilator: RTLMeter cases to run in the rtlmeter.yml CI workflow
|
|
#
|
|
# SPDX-FileCopyrightText: 2026 Wilson Snyder
|
|
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
|
|
|
###############################################################################
|
|
# Defines the RTLMeter cases to run in CI. This is consumed by the 'start' job
|
|
# in rtlmeter.yml, which captures the printed JSON and feeds it to the run job
|
|
# matrices.
|
|
###############################################################################
|
|
|
|
import argparse
|
|
import json
|
|
|
|
# Cases to run for scheduled runs, keyyed by the 'run tag' used in rtlmeter.yml
|
|
# The associated priority is roughly the number of minutes it takes to run the
|
|
# job, the emitted job matrix will try to start longest jobs first.
|
|
|
|
# Cases to run for non-PR jobs (e.g.: nightly schedule)
|
|
# fmt: off
|
|
CASES = {
|
|
"gcc": [
|
|
("BlackParrot:1x1:*", 5),
|
|
("BlackParrot:2x2:*", 14),
|
|
("BlackParrot:4x4:*", 25),
|
|
("Caliptra:default:*", 19),
|
|
("NVDLA:*", 29),
|
|
("OpenPiton:1x1:*", 4),
|
|
("OpenPiton:2x2:*", 7),
|
|
("OpenPiton:4x4:*", 10),
|
|
("OpenTitan:*", 16),
|
|
("Servant:qerv:*", 2),
|
|
("Servant:serv:*", 2),
|
|
("VeeR-EH1:asic:*", 4),
|
|
("VeeR-EH1:default:*", 6),
|
|
("VeeR-EH1:hiperf:*", 5),
|
|
("VeeR-EH2:asic:*", 13),
|
|
("VeeR-EH2:default:*", 6),
|
|
("VeeR-EH2:hiperf:*", 12),
|
|
("VeeR-EL2:asic:*", 4),
|
|
("VeeR-EL2:default:*", 4),
|
|
("VeeR-EL2:hiperf:*", 4),
|
|
("Vortex:mini:*", 3),
|
|
("Vortex:sane:*", 6),
|
|
("XiangShan:default-chisel3:* !*:linux", 31),
|
|
("XiangShan:default-chisel6:* !*:linux", 28),
|
|
("XiangShan:mini-chisel3:* !*:linux", 13),
|
|
("XiangShan:mini-chisel6:* !*:linux", 15),
|
|
("XuanTie-C906:*", 5),
|
|
("XuanTie-C910:*", 9),
|
|
("XuanTie-E902:*", 5),
|
|
("XuanTie-E906:*", 6),
|
|
],
|
|
"clang": [
|
|
("BlackParrot:1x1:*", 5),
|
|
("BlackParrot:2x2:*", 9),
|
|
("BlackParrot:4x4:*", 12),
|
|
("Caliptra:default:*", 16),
|
|
("NVDLA:*", 28),
|
|
("OpenPiton:1x1:*", 5),
|
|
("OpenPiton:2x2:*", 6),
|
|
("OpenPiton:4x4:*", 8),
|
|
("OpenTitan:*", 10),
|
|
("Servant:qerv:*", 17),
|
|
("Servant:serv:*", 15),
|
|
("VeeR-EH1:asic:*", 6),
|
|
("VeeR-EH1:default:*", 8),
|
|
("VeeR-EH1:hiperf:*", 5),
|
|
("VeeR-EH2:asic:*", 9),
|
|
("VeeR-EH2:default:*", 8),
|
|
("VeeR-EH2:hiperf:*", 7),
|
|
("VeeR-EL2:asic:*", 4),
|
|
("VeeR-EL2:default:*", 5),
|
|
("VeeR-EL2:hiperf:*", 5),
|
|
("Vortex:mini:*", 3),
|
|
("Vortex:sane:*", 5),
|
|
("XiangShan:default-chisel3:* !*:linux", 21),
|
|
("XiangShan:default-chisel6:* !*:linux", 19),
|
|
("XiangShan:mini-chisel3:* !*:linux", 8),
|
|
("XiangShan:mini-chisel6:* !*:linux", 8),
|
|
("XuanTie-C906:*", 3),
|
|
("XuanTie-C910:*", 7),
|
|
("XuanTie-E902:*", 7),
|
|
("XuanTie-E906:*", 7),
|
|
],
|
|
"gcc-hier": [
|
|
("BlackParrot:1x1:*", 4),
|
|
("BlackParrot:2x2:*", 16),
|
|
("BlackParrot:4x4:*", 25),
|
|
("NVDLA:*", 25),
|
|
("OpenPiton:16x16:dhry", 16),
|
|
("OpenPiton:1x1:*", 4),
|
|
("OpenPiton:2x2:*", 4),
|
|
("OpenPiton:4x4:*", 4),
|
|
("OpenPiton:8x8:*", 6),
|
|
("XuanTie-C910:*", 7),
|
|
],
|
|
}
|
|
# fmt: on
|
|
|
|
# Cases to run for PR jobs
|
|
# fmt: off
|
|
CASES_PR = {
|
|
"gcc": [
|
|
("BlackParrot:1x1:*", 5),
|
|
("BlackParrot:4x4:*", 25),
|
|
("Caliptra:default:*", 19),
|
|
("NVDLA:*", 29),
|
|
("OpenPiton:1x1:*", 4),
|
|
("OpenPiton:4x4:*", 10),
|
|
("OpenTitan:*", 16),
|
|
("Servant:qerv:*", 2),
|
|
("Servant:serv:*", 2),
|
|
("VeeR-EH1:asic:*", 4),
|
|
("VeeR-EH1:default:*", 6),
|
|
("VeeR-EH1:hiperf:*", 5),
|
|
("VeeR-EH2:asic:*", 13),
|
|
("VeeR-EH2:default:*", 6),
|
|
("VeeR-EH2:hiperf:*", 12),
|
|
("VeeR-EL2:asic:*", 4),
|
|
("VeeR-EL2:default:*", 4),
|
|
("VeeR-EL2:hiperf:*", 4),
|
|
("Vortex:mini:*", 3),
|
|
("Vortex:sane:*", 6),
|
|
("XiangShan:default-chisel3:* !*:linux", 31),
|
|
("XiangShan:default-chisel6:* !*:linux", 28),
|
|
("XiangShan:mini-chisel3:* !*:linux", 13),
|
|
("XiangShan:mini-chisel6:* !*:linux", 15),
|
|
("XuanTie-C906:*", 5),
|
|
("XuanTie-C910:*", 9),
|
|
("XuanTie-E902:*", 5),
|
|
("XuanTie-E906:*", 6),
|
|
],
|
|
"clang": [
|
|
("BlackParrot:1x1:*", 5),
|
|
("BlackParrot:4x4:*", 12),
|
|
("Caliptra:default:*", 16),
|
|
("NVDLA:*", 28),
|
|
("OpenPiton:1x1:*", 5),
|
|
("OpenPiton:4x4:*", 8),
|
|
("OpenTitan:*", 10),
|
|
("Servant:qerv:*", 17),
|
|
("Servant:serv:*", 15),
|
|
("VeeR-EH1:asic:*", 6),
|
|
("VeeR-EH1:default:*", 8),
|
|
("VeeR-EH1:hiperf:*", 5),
|
|
("VeeR-EH2:asic:*", 9),
|
|
("VeeR-EH2:default:*", 8),
|
|
("VeeR-EH2:hiperf:*", 7),
|
|
("VeeR-EL2:asic:*", 4),
|
|
("VeeR-EL2:default:*", 5),
|
|
("VeeR-EL2:hiperf:*", 5),
|
|
("Vortex:mini:*", 3),
|
|
("Vortex:sane:*", 5),
|
|
("XiangShan:default-chisel3:* !*:linux", 21),
|
|
("XiangShan:default-chisel6:* !*:linux", 19),
|
|
("XiangShan:mini-chisel3:* !*:linux", 8),
|
|
("XiangShan:mini-chisel6:* !*:linux", 8),
|
|
("XuanTie-C906:*", 3),
|
|
("XuanTie-C910:*", 7),
|
|
("XuanTie-E902:*", 7),
|
|
("XuanTie-E906:*", 7),
|
|
],
|
|
"gcc-hier": [
|
|
("BlackParrot:1x1:*", 4),
|
|
("BlackParrot:4x4:*", 25),
|
|
("NVDLA:*", 25),
|
|
("OpenPiton:16x16:dhry", 16),
|
|
("OpenPiton:1x1:*", 4),
|
|
("OpenPiton:4x4:*", 4),
|
|
("OpenPiton:8x8:*", 6),
|
|
("XuanTie-C910:*", 7),
|
|
],
|
|
}
|
|
# fmt: on
|
|
|
|
parser = argparse.ArgumentParser(
|
|
description="Print the RTLMeter CI cases as JSON, keyed by run tag")
|
|
parser.add_argument("--event-name",
|
|
required=True,
|
|
help="GitHub event name that triggered the workflow")
|
|
parser.add_argument(
|
|
"--ci-testing",
|
|
action="store_true",
|
|
help="Print only the shortest (lowest priority) case per tag, to reduce CI testing time")
|
|
args = parser.parse_args()
|
|
|
|
# Pull requests use the reduced 'CASES_PR' set, other events (e.g.: the nightly
|
|
# schedule) use the full 'CASES' set.
|
|
is_pr = args.event_name == "pull_request"
|
|
selected = CASES_PR if is_pr else CASES
|
|
|
|
cases = {}
|
|
for tag, entries in selected.items():
|
|
# Highest priority (longest) first
|
|
ordered = sorted(entries, key=lambda cp: cp[1], reverse=True)
|
|
# While tweaking the CI, keep only the shortest (lowest priority) case to minimise churn time
|
|
if args.ci_testing:
|
|
ordered = ordered[-1:]
|
|
# Case filters appended to every case for this tag/event
|
|
suffix = ""
|
|
# Filters out the non-hierarchical case variants for the hierarchical job
|
|
if tag == "gcc-hier":
|
|
suffix += " !-hier"
|
|
# Filter out hello tests on pull requests, these just add measurement noise
|
|
if is_pr:
|
|
suffix += " !*:hello"
|
|
cases[tag] = [case + suffix for case, _ in ordered]
|
|
print(json.dumps(cases, separators=(",", ":")))
|