@@ -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+
521591def parse_match (match_str ):
522592 """
523593 Convert the bit pattern string to an integer.
0 commit comments