sbv-program-1.0.0.0: src/Data/SBV/Program/SimpleLibrary.hs
module Data.SBV.Program.SimpleLibrary(
-- * Arithmetic components
inc,
dec,
add,
sub,
mul,
-- * Bitwise logic components
Data.SBV.Program.SimpleLibrary.and,
Data.SBV.Program.SimpleLibrary.or,
Data.SBV.Program.SimpleLibrary.not,
-- * Logic components
bXor,
bEquiv
)
where
import Data.SBV
import Data.SBV.Program.Types
inc :: (SymVal a, Ord a, Num a) => SimpleComponent a
inc = SimpleComponent "inc" $ SimpleSpec 1 $ \[i] o -> o .== (i+1)
dec :: (SymVal a, Ord a, Num a) => SimpleComponent a
dec = SimpleComponent "dec" $ SimpleSpec 1 $ \[i] o -> o .== (i-1)
add :: (SymVal a, Ord a, Num a) => SimpleComponent a
add = SimpleComponent "add" $ SimpleSpec 2 $ \[i1,i2] o -> o .== (i1 + i2)
sub :: (SymVal a, Ord a, Num a) => SimpleComponent a
sub = SimpleComponent "sub" $ SimpleSpec 2 $ \[i1,i2] o -> o .== (i1 - i2)
mul :: (SymVal a, Ord a, Num a) => SimpleComponent a
mul = SimpleComponent "mul" $ SimpleSpec 2 $ \[i1,i2] o -> o .== (i1 * i2)
and :: (SymVal a, Ord a, Num a, Bits a) => SimpleComponent a
and = SimpleComponent "and" $ SimpleSpec 2 $ \[i1,i2] o -> o .== (i1 .&. i2)
or :: (SymVal a, Ord a, Num a, Bits a) => SimpleComponent a
or = SimpleComponent "or" $ SimpleSpec 2 $ \[i1,i2] o -> o .== (i1 .|. i2)
not :: (SymVal a, Ord a, Num a, Bits a) => SimpleComponent a
not = SimpleComponent "not" $ SimpleSpec 1 $ \[i1] o -> o .== complement i1
bXor = SimpleComponent "bXor" $ SimpleSpec 2 $ \[i1,i2] o -> o .== i1 .<+> i2
-- | Logical equivalence implemented in "tabular" style
bEquiv = SimpleComponent "bEquiv" $ SimpleSpec 2 $ \[i1,i2] o -> sAnd [
sNot i1 .&& sNot i2 .=> o,
i1 .&& sNot i2 .=> sNot o,
sNot i1 .&& i2 .=> sNot o,
i1 .&& i2 .=> o
]