Skip to content

Commit 80e2b1c

Browse files
committed
fix: improve error handling for loading resolved codes file in exception code generation
1 parent 10dafd4 commit 80e2b1c

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

backends/generators/generator.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,76 @@ def load_csrs(csr_root, enabled_extensions, include_all=False, target_arch="RV64
518518
return csrs
519519

520520

521+
def load_exception_codes(
522+
ext_dir, enabled_extensions=None, include_all=False, resolved_codes_file=None
523+
):
524+
"""Load exception codes from extension YAML files or pre-resolved JSON file."""
525+
exception_codes = []
526+
found_extensions = 0
527+
found_files = 0
528+
529+
if enabled_extensions is None:
530+
enabled_extensions = []
531+
# If we have a resolved codes file, use it instead of processing YAML files
532+
if resolved_codes_file and os.path.exists(resolved_codes_file):
533+
try:
534+
with open(resolved_codes_file, encoding="utf-8") as f:
535+
resolved_codes = json.load(f)
536+
537+
for code in resolved_codes:
538+
num = code.get("num")
539+
name = code.get("name")
540+
if num is not None and name is not None:
541+
sanitized_name = (
542+
name.lower()
543+
.replace(" ", "_")
544+
.replace("/", "_")
545+
.replace("-", "_")
546+
)
547+
exception_codes.append((num, sanitized_name))
548+
549+
logging.info(
550+
f"Loaded {len(exception_codes)} pre-resolved exception codes from {resolved_codes_file}"
551+
)
552+
553+
# Sort by exception code number and deduplicate
554+
seen_nums = set()
555+
unique_codes = []
556+
for num, name in sorted(exception_codes, key=lambda x: x[0]):
557+
if num not in seen_nums:
558+
seen_nums.add(num)
559+
unique_codes.append((num, name))
560+
561+
return unique_codes
562+
563+
except Exception as e:
564+
logging.error(
565+
f"Error loading resolved codes file {resolved_codes_file}: {e}"
566+
)
567+
# Logging an error and skipping the exception cause generation if no resolved codes file found
568+
else:
569+
logging.error(f"Error loading resolved codes file {resolved_codes_file}: {e}")
570+
return
571+
572+
if found_extensions > 0:
573+
logging.info(
574+
f"Found {found_extensions} extension definitions in {found_files} files"
575+
)
576+
logging.info(f"Added {len(exception_codes)} exception codes to the output")
577+
else:
578+
logging.warning(f"No extension definitions found in {ext_dir}")
579+
580+
# Sort by exception code number and deduplicate
581+
seen_nums = set()
582+
unique_codes = []
583+
for num, name in sorted(exception_codes, key=lambda x: x[0]):
584+
if num not in seen_nums:
585+
seen_nums.add(num)
586+
unique_codes.append((num, name))
587+
588+
return unique_codes
589+
590+
521591
def parse_match(match_str):
522592
"""
523593
Convert the bit pattern string to an integer.

0 commit comments

Comments
 (0)