module Copilot.Compile.SBV.Witness
( SymWordInst(..) , symWordInst
, HasSignAndSizeInst(..), hasSignAndSizeInst
, EqInst(..) , eqInst
, BVDivisibleInst(..) , divInst
, OrdInst(..) , ordInst
, MergeableInst(..) , mergeableInst
, BitsInst(..) , bitsInst
) where
import qualified Data.SBV as S
import qualified Data.SBV.Internals as S
import qualified Copilot.Core as C
import Data.Bits
badInst :: a
badInst = C.impossible "witnesses" "copilot-sbv"
data SymWordInst a = S.SymWord a => SymWordInst
symWordInst :: C.Type a -> SymWordInst a
symWordInst t =
case t of
C.Bool -> SymWordInst
C.Int8 -> SymWordInst ; C.Int16 -> SymWordInst
C.Int32 -> SymWordInst ; C.Int64 -> SymWordInst
C.Word8 -> SymWordInst ; C.Word16 -> SymWordInst
C.Word32 -> SymWordInst ; C.Word64 -> SymWordInst
C.Float -> badInst
C.Double -> badInst
data HasSignAndSizeInst a = S.HasSignAndSize a => HasSignAndSizeInst
hasSignAndSizeInst :: C.Type a -> HasSignAndSizeInst a
hasSignAndSizeInst t =
case t of
C.Bool -> HasSignAndSizeInst
C.Int8 -> HasSignAndSizeInst
C.Int16 -> HasSignAndSizeInst
C.Int32 -> HasSignAndSizeInst
C.Int64 -> HasSignAndSizeInst
C.Word8 -> HasSignAndSizeInst
C.Word16 -> HasSignAndSizeInst
C.Word32 -> HasSignAndSizeInst
C.Word64 -> HasSignAndSizeInst
C.Float -> badInst
C.Double -> badInst
data EqInst a = S.EqSymbolic (S.SBV a) => EqInst
eqInst :: C.Type a -> EqInst a
eqInst t =
case t of
C.Bool -> EqInst
C.Int8 -> EqInst ; C.Int16 -> EqInst
C.Int32 -> EqInst ; C.Int64 -> EqInst
C.Word8 -> EqInst ; C.Word16 -> EqInst
C.Word32 -> EqInst ; C.Word64 -> EqInst
C.Float -> badInst
C.Double -> badInst
data BVDivisibleInst a = S.BVDivisible (S.SBV a) => BVDivisibleInst
divInst :: C.Type a -> BVDivisibleInst a
divInst t =
case t of
C.Bool -> badInst
C.Int8 -> badInst
C.Int16 -> badInst
C.Int32 -> badInst
C.Int64 -> badInst
C.Word8 -> BVDivisibleInst
C.Word16 -> BVDivisibleInst
C.Word32 -> BVDivisibleInst
C.Word64 -> BVDivisibleInst
C.Float -> badInst
C.Double -> badInst
data OrdInst a = S.OrdSymbolic (S.SBV a) => OrdInst
ordInst :: C.Type a -> OrdInst a
ordInst t =
case t of
C.Bool -> OrdInst
C.Int8 -> OrdInst ; C.Int16 -> OrdInst
C.Int32 -> OrdInst ; C.Int64 -> OrdInst
C.Word8 -> OrdInst ; C.Word16 -> OrdInst
C.Word32 -> OrdInst ; C.Word64 -> OrdInst
C.Float -> badInst
C.Double -> badInst
data MergeableInst a = S.Mergeable (S.SBV a) => MergeableInst
mergeableInst :: C.Type a -> MergeableInst a
mergeableInst t =
case t of
C.Bool -> MergeableInst
C.Int8 -> MergeableInst ; C.Int16 -> MergeableInst
C.Int32 -> MergeableInst ; C.Int64 -> MergeableInst
C.Word8 -> MergeableInst ; C.Word16 -> MergeableInst
C.Word32 -> MergeableInst ; C.Word64 -> MergeableInst
C.Float -> badInst
C.Double -> badInst
data BitsInst a = (Bits a, S.Bits (S.SBV a)) => BitsInst
bitsInst :: C.Type a -> BitsInst a
bitsInst t =
case t of
C.Bool -> badInst
C.Int8 -> BitsInst ; C.Int16 -> BitsInst
C.Int32 -> BitsInst ; C.Int64 -> BitsInst
C.Word8 -> BitsInst ; C.Word16 -> BitsInst
C.Word32 -> BitsInst ; C.Word64 -> BitsInst
C.Float -> badInst
C.Double -> badInst