-- This corresponds to src/comp/IntLit.hs in bsc.
module Language.Bluespec.Classic.AST.IntLit
  ( IntLit(..)
  , ilDec
  , ilSizedDec
  , ilHex
  , ilSizedHex
  , ilBin
  , ilSizedBin
  ) where

import Text.PrettyPrint.HughesPJClass

import Language.Bluespec.IntegerUtil
import Language.Bluespec.Prelude

data IntLit = IntLit { IntLit -> Maybe Integer
ilWidth :: Maybe Integer,
                       IntLit -> Integer
ilBase  :: Integer,
                       IntLit -> Integer
ilValue :: Integer }

instance Eq IntLit where
     IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i1 } == :: IntLit -> IntLit -> Bool
== IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i2 }  =  Integer
i1 Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
i2
     IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i1 } /= :: IntLit -> IntLit -> Bool
/= IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i2 }  =  Integer
i1 Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
/= Integer
i2

instance Ord IntLit where
     IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i1 } <= :: IntLit -> IntLit -> Bool
<= IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i2 }  =  Integer
i1 Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
<= Integer
i2
     IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i1 } < :: IntLit -> IntLit -> Bool
<  IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i2 }  =  Integer
i1 Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
<  Integer
i2
     IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i1 } >= :: IntLit -> IntLit -> Bool
>= IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i2 }  =  Integer
i1 Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
>= Integer
i2
     IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i1 } > :: IntLit -> IntLit -> Bool
>  IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i2 }  =  Integer
i1 Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
>  Integer
i2
     IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i1 } compare :: IntLit -> IntLit -> Ordering
`compare` IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i2 }  =  Integer
i1 Integer -> Integer -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` Integer
i2

instance Show IntLit where
     showsPrec :: Int -> IntLit -> ShowS
showsPrec Int
_ (IntLit { ilValue :: IntLit -> Integer
ilValue = Integer
i, ilWidth :: IntLit -> Maybe Integer
ilWidth = Maybe Integer
_mw, ilBase :: IntLit -> Integer
ilBase = Integer
b }) String
s =
         -- width of 0 means don't pad with leading zeros
         Integer -> Integer -> Integer -> String
integerFormatPref Integer
0 Integer
b Integer
i String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
s

instance Pretty IntLit where
     pPrintPrec :: PrettyLevel -> Rational -> IntLit -> Doc
pPrintPrec PrettyLevel
_d Rational
_p IntLit
i = String -> Doc
text (IntLit -> String
forall a. Show a => a -> String
show IntLit
i)

ilDec :: Integer -> IntLit
ilDec :: Integer -> IntLit
ilDec Integer
i = IntLit { ilWidth :: Maybe Integer
ilWidth = Maybe Integer
forall a. Maybe a
Nothing, ilBase :: Integer
ilBase = Integer
10, ilValue :: Integer
ilValue = Integer
i }

ilSizedDec :: Integer -> Integer -> IntLit
ilSizedDec :: Integer -> Integer -> IntLit
ilSizedDec Integer
w Integer
i = IntLit { ilWidth :: Maybe Integer
ilWidth = Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
w, ilBase :: Integer
ilBase = Integer
10, ilValue :: Integer
ilValue = Integer
i }

ilHex :: Integer -> IntLit
ilHex :: Integer -> IntLit
ilHex Integer
i = IntLit { ilWidth :: Maybe Integer
ilWidth = Maybe Integer
forall a. Maybe a
Nothing, ilBase :: Integer
ilBase = Integer
16, ilValue :: Integer
ilValue = Integer
i }

ilSizedHex :: Integer -> Integer -> IntLit
ilSizedHex :: Integer -> Integer -> IntLit
ilSizedHex Integer
w Integer
i = IntLit { ilWidth :: Maybe Integer
ilWidth = Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
w, ilBase :: Integer
ilBase = Integer
16, ilValue :: Integer
ilValue = Integer
i }

ilBin :: Integer -> IntLit
ilBin :: Integer -> IntLit
ilBin Integer
i = IntLit { ilWidth :: Maybe Integer
ilWidth = Maybe Integer
forall a. Maybe a
Nothing, ilBase :: Integer
ilBase = Integer
2,  ilValue :: Integer
ilValue = Integer
i }

ilSizedBin :: Integer -> Integer -> IntLit
ilSizedBin :: Integer -> Integer -> IntLit
ilSizedBin Integer
w Integer
i = IntLit { ilWidth :: Maybe Integer
ilWidth = Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
w, ilBase :: Integer
ilBase = Integer
2, ilValue :: Integer
ilValue = Integer
i }