{-# LANGUAGE DataKinds #-} {-# LANGUAGE NumericUnderscores #-} module Exceptions( Exception(..), exceptionCode, isSynchronousException ) where import Clash.Prelude import Types(Addr, Insn) data Exception = SupervisorSoftwareInterrupt | MachineSoftwareInterrupt | SupervisorTimerInterrupt | MachineTimerInterrupt | SupervisorExternalInterrupt | MachineExternalInterrupt | CounterOverflowInterrupt | InstructionAddressMisaligned | InstructionAccessFault | IllegalInstruction {insn :: Insn} | Breakpoint | LoadAddressMisaligned | LoadAccessFault | StoreAMOAddressMisaligned | StoreAMOAccessFault | EnvironmentCallFromUMode | EnvironmentCallFromSMode | EnvironmentCallFromMMode | InstructionPageFault | LoadPageFault | StoreAMOPageFault | DoubleTrap | SoftwareCheck | HardwareError deriving (Generic, Show, Eq, NFDataX) exceptionCode :: Exception -> Unsigned 6 exceptionCode SupervisorSoftwareInterrupt = 1 exceptionCode MachineSoftwareInterrupt = 3 exceptionCode SupervisorTimerInterrupt = 5 exceptionCode MachineTimerInterrupt = 7 exceptionCode SupervisorExternalInterrupt = 9 exceptionCode MachineExternalInterrupt = 11 exceptionCode CounterOverflowInterrupt = 13 exceptionCode InstructionAddressMisaligned = 0 exceptionCode InstructionAccessFault = 1 exceptionCode (IllegalInstruction _) = 2 exceptionCode Breakpoint = 3 exceptionCode LoadAddressMisaligned = 4 exceptionCode LoadAccessFault = 5 exceptionCode StoreAMOAddressMisaligned = 6 exceptionCode StoreAMOAccessFault = 7 exceptionCode EnvironmentCallFromUMode = 8 exceptionCode EnvironmentCallFromSMode = 9 exceptionCode EnvironmentCallFromMMode = 11 exceptionCode InstructionPageFault = 12 exceptionCode LoadPageFault = 13 exceptionCode StoreAMOPageFault = 15 exceptionCode DoubleTrap = 16 exceptionCode SoftwareCheck = 18 exceptionCode HardwareError = 19 isSynchronousException :: Exception -> Bool isSynchronousException SupervisorSoftwareInterrupt = False isSynchronousException MachineSoftwareInterrupt = False isSynchronousException SupervisorTimerInterrupt = False isSynchronousException MachineTimerInterrupt = False isSynchronousException SupervisorExternalInterrupt = False isSynchronousException MachineExternalInterrupt = False isSynchronousException CounterOverflowInterrupt = False isSynchronousException InstructionAddressMisaligned = True isSynchronousException InstructionAccessFault = True isSynchronousException (IllegalInstruction _) = True isSynchronousException Breakpoint = True isSynchronousException LoadAddressMisaligned = True isSynchronousException LoadAccessFault = True isSynchronousException StoreAMOAddressMisaligned = True isSynchronousException StoreAMOAccessFault = True isSynchronousException EnvironmentCallFromUMode = True isSynchronousException EnvironmentCallFromSMode = True isSynchronousException EnvironmentCallFromMMode = True isSynchronousException InstructionPageFault = True isSynchronousException LoadPageFault = True isSynchronousException StoreAMOPageFault = True isSynchronousException DoubleTrap = True isSynchronousException SoftwareCheck = True isSynchronousException HardwareError = True