From 1123a3f047b384caf079d5c094c7afa1cefd5f42 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 02:04:46 +0000 Subject: [PATCH 1/4] Warn when implemented extensions have no selected tests Agent-Logs-Url: https://github.com/MainakSil/riscv-arch-test/sessions/348fab9e-3289-4b7e-8fcc-79bc6dfb4116 Co-authored-by: MainakSil <145980094+MainakSil@users.noreply.github.com> --- framework/src/act/act.py | 16 +++++++++++++++- framework/src/act/select_tests.py | 19 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/framework/src/act/act.py b/framework/src/act/act.py index de7d4e0cec..6cde9545f7 100644 --- a/framework/src/act/act.py +++ b/framework/src/act/act.py @@ -22,7 +22,7 @@ from act.coverreport import print_coverage_summary from act.parse_test_constraints import TestYamlHeaderError, generate_test_dict from act.parse_udb_config import generate_udb_files, get_config_params, get_implemented_extensions -from act.select_tests import select_tests +from act.select_tests import get_untested_implemented_extensions, select_tests # CLI interface setup act_app = typer.Typer(context_settings={"help_option_names": ["-h", "--help"]}) @@ -100,6 +100,7 @@ def run_act( config_names: list[str] = [] tasks: list[BuildTask] = [] + excluded_extensions = {ext.strip() for ext in exclude.split(",") if ext.strip()} for config_file in config_files: # Load configuration config = load_config(config_file) @@ -115,6 +116,19 @@ def run_act( selected_tests = select_tests( full_test_dict, implemented_extensions, config_params, include_priv_tests=config.include_priv_tests ) + if extensions == "all": + untested_extensions = get_untested_implemented_extensions( + selected_tests, + implemented_extensions, + include_priv_tests=config.include_priv_tests, + excluded_extensions=excluded_extensions, + ) + if untested_extensions: + print( + f"Warning: {config.name}: no applicable tests selected for implemented extension(s): " + f"{', '.join(untested_extensions)}. Tests may not exist for this ISA profile.", + file=sys.stderr, + ) mxlen = config_params["MXLEN"] if not isinstance(mxlen, int): raise TypeError(f"MXLEN must be an integer, got {type(mxlen)}: {mxlen!r}") diff --git a/framework/src/act/select_tests.py b/framework/src/act/select_tests.py index 9cf8105ca3..a260834e4c 100644 --- a/framework/src/act/select_tests.py +++ b/framework/src/act/select_tests.py @@ -81,3 +81,22 @@ def select_tests( if check_test_params(test_params, config_params): selected_tests[test_name] = test_metadata return selected_tests + + +def get_untested_implemented_extensions( + selected_tests: dict[str, TestMetadata], + implemented_extensions: set[str], + *, + include_priv_tests: bool = True, + excluded_extensions: set[str] | None = None, +) -> list[str]: + """Return implemented extensions that have no selected tests.""" + covered_extensions = { + extension for test_metadata in selected_tests.values() for extension in test_metadata.required_extensions + } + untested_extensions = implemented_extensions - covered_extensions + if not include_priv_tests: + untested_extensions -= PRIV_EXTENSIONS + if excluded_extensions: + untested_extensions -= excluded_extensions + return sorted(untested_extensions) From 7f49b148865c1639f008af6ea6f81d4d7cdab439 Mon Sep 17 00:00:00 2001 From: Mainak Sil Date: Sun, 19 Apr 2026 08:09:57 +0530 Subject: [PATCH 2/4] Update framework/src/act/act.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Mainak Sil --- framework/src/act/act.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/act/act.py b/framework/src/act/act.py index 6cde9545f7..6271994502 100644 --- a/framework/src/act/act.py +++ b/framework/src/act/act.py @@ -126,7 +126,8 @@ def run_act( if untested_extensions: print( f"Warning: {config.name}: no applicable tests selected for implemented extension(s): " - f"{', '.join(untested_extensions)}. Tests may not exist for this ISA profile.", + f"{', '.join(untested_extensions)}. Tests may be missing, excluded, or " + "otherwise inapplicable for the current configuration.", file=sys.stderr, ) mxlen = config_params["MXLEN"] From 4d9eac512e8e2c81afa4a417963f53073b762fb9 Mon Sep 17 00:00:00 2001 From: Mainak Sil Date: Mon, 20 Apr 2026 06:46:09 +0530 Subject: [PATCH 3/4] Implement warning for untested extensions in select_tests Added warning for untested implemented extensions in select tests. Signed-off-by: Mainak Sil --- framework/src/act/select_tests.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/framework/src/act/select_tests.py b/framework/src/act/select_tests.py index a260834e4c..934d9ee24b 100644 --- a/framework/src/act/select_tests.py +++ b/framework/src/act/select_tests.py @@ -6,9 +6,8 @@ # # Select tests to run based on UDB config and test list ################################## - from __future__ import annotations - +import sys import re from act.parse_test_constraints import TestMetadata @@ -67,6 +66,7 @@ def select_tests( config_params: dict[str, ConfigParamValue], *, include_priv_tests: bool = True, + excluded_extensions: set[str] | None = None, ) -> dict[str, TestMetadata]: """Select tests that match the UDB configuration.""" selected_tests: dict[str, TestMetadata] = {} @@ -80,8 +80,25 @@ def select_tests( test_params = test_metadata.params if check_test_params(test_params, config_params): selected_tests[test_name] = test_metadata + # Warn about implemented extensions with no tests + untested_extensions = get_untested_implemented_extensions( + selected_tests, + implemented_extensions, + include_priv_tests=include_priv_tests, + excluded_extensions=excluded_extensions, + ) + + if untested_extensions: + print( + "Warning: no applicable tests selected for implemented extension(s): " + + ", ".join(untested_extensions), + file=sys.stderr, + ) + return selected_tests +def _is_excluded_extension(ext: str, excluded_extensions: set[str]) -> bool: + return any(ext.startswith(ex) for ex in excluded_extensions) def get_untested_implemented_extensions( selected_tests: dict[str, TestMetadata], @@ -98,5 +115,8 @@ def get_untested_implemented_extensions( if not include_priv_tests: untested_extensions -= PRIV_EXTENSIONS if excluded_extensions: - untested_extensions -= excluded_extensions + untested_extensions = { + ext for ext in untested_extensions + if not _is_excluded_extension(ext, excluded_extensions) + } return sorted(untested_extensions) From d7ccfcb1d278a579a5f086ba97b3fe291ff0c876 Mon Sep 17 00:00:00 2001 From: Mainak Sil Date: Mon, 20 Apr 2026 06:49:45 +0530 Subject: [PATCH 4/4] Remove untested extensions warning from select_tests Removed untested extensions warning logic from test selection process. Signed-off-by: Mainak Sil --- framework/src/act/act.py | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/framework/src/act/act.py b/framework/src/act/act.py index 6271994502..05fd8c8af9 100644 --- a/framework/src/act/act.py +++ b/framework/src/act/act.py @@ -22,7 +22,7 @@ from act.coverreport import print_coverage_summary from act.parse_test_constraints import TestYamlHeaderError, generate_test_dict from act.parse_udb_config import generate_udb_files, get_config_params, get_implemented_extensions -from act.select_tests import get_untested_implemented_extensions, select_tests +from act.select_tests import select_tests # CLI interface setup act_app = typer.Typer(context_settings={"help_option_names": ["-h", "--help"]}) @@ -114,22 +114,12 @@ def run_act( # Select tests for config selected_tests = select_tests( - full_test_dict, implemented_extensions, config_params, include_priv_tests=config.include_priv_tests + full_test_dict, + implemented_extensions, + config_params, + include_priv_tests=config.include_priv_tests, + excluded_extensions=excluded_extensions, ) - if extensions == "all": - untested_extensions = get_untested_implemented_extensions( - selected_tests, - implemented_extensions, - include_priv_tests=config.include_priv_tests, - excluded_extensions=excluded_extensions, - ) - if untested_extensions: - print( - f"Warning: {config.name}: no applicable tests selected for implemented extension(s): " - f"{', '.join(untested_extensions)}. Tests may be missing, excluded, or " - "otherwise inapplicable for the current configuration.", - file=sys.stderr, - ) mxlen = config_params["MXLEN"] if not isinstance(mxlen, int): raise TypeError(f"MXLEN must be an integer, got {type(mxlen)}: {mxlen!r}")