module Lava.Error
  ( Error(..)
  , wrong
  )
 where

----------------------------------------------------------------
-- Error

data Error
  = DelayEval
  | VarEval
  | CombinationalLoop
  | BadCombinationalLoop
  | UndefinedWire
  | IncompatibleStructures
  | NoEquality
  | NoArithmetic
  | EnumOnSymbols

  | Internal_OptionNotFound
 deriving (Error -> Error -> Bool
(Error -> Error -> Bool) -> (Error -> Error -> Bool) -> Eq Error
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Error -> Error -> Bool
$c/= :: Error -> Error -> Bool
== :: Error -> Error -> Bool
$c== :: Error -> Error -> Bool
Eq, Int -> Error -> ShowS
[Error] -> ShowS
Error -> String
(Int -> Error -> ShowS)
-> (Error -> String) -> ([Error] -> ShowS) -> Show Error
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Error] -> ShowS
$cshowList :: [Error] -> ShowS
show :: Error -> String
$cshow :: Error -> String
showsPrec :: Int -> Error -> ShowS
$cshowsPrec :: Int -> Error -> ShowS
Show)

wrong :: Error -> a
wrong :: Error -> a
wrong err :: Error
err =
  String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$
    case Error
err of
      DelayEval              -> "evaluating a delay component"
      VarEval                -> "evaluating a symbolic value"
      CombinationalLoop      -> "combinational loop"
      BadCombinationalLoop   -> "short circuit"
      UndefinedWire          -> "undriven output"
      IncompatibleStructures -> "combining incompatible structures"
      NoEquality             -> "no equality defined for this type"
      NoArithmetic           -> "arithmetic operations are not supported"
      EnumOnSymbols          -> "enumerating symbolic values"

      Internal_OptionNotFound -> ShowS
internal "option not found"
      _                       -> ShowS
internal "unknown error"

internal :: String -> String
internal :: ShowS
internal msg :: String
msg = "INTERNAL ERROR: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
msg
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ ".\nPlease report this as a bug to `koen@cs.chalmers.se'."

----------------------------------------------------------------
-- the end.