""" Custom exceptions for UVM TB Generator with structured error codes. Industry-standard error taxonomy. """ from __future__ import annotations class UVMGenError(Exception): """Base exception for all UVM TB Generator errors.""" code: str = "UNKNOWN_ERROR" status_code: int = 500 details: str = "" def __init__(self, message: str = "", details: str = "", status_code: int | None = None): self.message = message or self.__doc__ or str(self.code) self.details = details if status_code is not None: self.status_code = status_code super().__init__(self.message) def to_dict(self) -> dict: return { "error": self.code, "message": self.message, "details": self.details, "status_code": self.status_code, } class SpecNotFoundError(UVMGenError): code = "SPEC_NOT_FOUND" status_code = 404 class SpecValidationError(UVMGenError): code = "SPEC_VALIDATION_FAILED" status_code = 422 class SpecParseError(UVMGenError): code = "SPEC_PARSE_ERROR" status_code = 422 class PipelineRunError(UVMGenError): code = "PIPELINE_RUN_FAILED" status_code = 500 class ModelNotTrainedError(UVMGenError): code = "MODEL_NOT_TRAINED" status_code = 400 class GenerationError(UVMGenError): code = "GENERATION_FAILED" status_code = 500 class SimulationError(UVMGenError): code = "SIMULATION_FAILED" status_code = 500 class SimulatorNotFoundError(UVMGenError): code = "SIMULATOR_NOT_FOUND" status_code = 400 class RegistryError(UVMGenError): code = "REGISTRY_ERROR" status_code = 500 class ConfigurationError(UVMGenError): code = "CONFIGURATION_ERROR" status_code = 400 class ProtocolNotSupportedError(UVMGenError): code = "PROTOCOL_NOT_SUPPORTED" status_code = 400 details = "Supported protocols: uart, spi, i2c, axi4lite, apb, wishbone"