211 lines
9.1 KiB
Python
211 lines
9.1 KiB
Python
|
|
#!/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=(",", ":")))
|