-- This corresponds to src/comp/Undefined.hs in bsc.
module Language.Bluespec.Classic.AST.Undefined
  ( UndefKind(..)
  ) where

import Language.Bluespec.Prelude

-- Undefined values in BSC carry information about their origin.
-- (The evaluator uses this for choosing error messages and optimizations.)

-- * UNotUsed is for values that we expect will never be used, such as
--   in unreachable code or the return value for an expression whose value
--   is unused.

-- * UNoMatch is the value returned from a case expression when no arm
--   matches but some value still needs to be returned.

-- * UDontCare is an explicit dont-care value written by the user, or
--   any other dont-care value that doesn't fit the above kinds.

data UndefKind = UNotUsed | UDontCare | UNoMatch
  deriving (UndefKind -> UndefKind -> Bool
(UndefKind -> UndefKind -> Bool)
-> (UndefKind -> UndefKind -> Bool) -> Eq UndefKind
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UndefKind -> UndefKind -> Bool
== :: UndefKind -> UndefKind -> Bool
$c/= :: UndefKind -> UndefKind -> Bool
/= :: UndefKind -> UndefKind -> Bool
Eq, Eq UndefKind
Eq UndefKind =>
(UndefKind -> UndefKind -> Ordering)
-> (UndefKind -> UndefKind -> Bool)
-> (UndefKind -> UndefKind -> Bool)
-> (UndefKind -> UndefKind -> Bool)
-> (UndefKind -> UndefKind -> Bool)
-> (UndefKind -> UndefKind -> UndefKind)
-> (UndefKind -> UndefKind -> UndefKind)
-> Ord UndefKind
UndefKind -> UndefKind -> Bool
UndefKind -> UndefKind -> Ordering
UndefKind -> UndefKind -> UndefKind
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: UndefKind -> UndefKind -> Ordering
compare :: UndefKind -> UndefKind -> Ordering
$c< :: UndefKind -> UndefKind -> Bool
< :: UndefKind -> UndefKind -> Bool
$c<= :: UndefKind -> UndefKind -> Bool
<= :: UndefKind -> UndefKind -> Bool
$c> :: UndefKind -> UndefKind -> Bool
> :: UndefKind -> UndefKind -> Bool
$c>= :: UndefKind -> UndefKind -> Bool
>= :: UndefKind -> UndefKind -> Bool
$cmax :: UndefKind -> UndefKind -> UndefKind
max :: UndefKind -> UndefKind -> UndefKind
$cmin :: UndefKind -> UndefKind -> UndefKind
min :: UndefKind -> UndefKind -> UndefKind
Ord, Int -> UndefKind -> ShowS
[UndefKind] -> ShowS
UndefKind -> String
(Int -> UndefKind -> ShowS)
-> (UndefKind -> String)
-> ([UndefKind] -> ShowS)
-> Show UndefKind
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UndefKind -> ShowS
showsPrec :: Int -> UndefKind -> ShowS
$cshow :: UndefKind -> String
show :: UndefKind -> String
$cshowList :: [UndefKind] -> ShowS
showList :: [UndefKind] -> ShowS
Show)