packages feed

sbv-program-1.1.0.0: src/Data/SBV/Program/SimpleLibrary.hs

module Data.SBV.Program.SimpleLibrary(
    Data.SBV.Program.SimpleLibrary.const,

    -- * 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,
    bNand,
    bEquiv
  )
where

import Data.SBV
import Data.SBV.Program.Types


const = mkSimpleComp "const" $ SimpleSpec 0 $ \[] o -> sTrue


inc :: (SymVal a, Ord a, Num a) => SimpleComponent a
inc = mkSimpleComp "inc" $ SimpleSpec 1 $ \[i] o -> o .== (i+1)

dec :: (SymVal a, Ord a, Num a) => SimpleComponent a
dec = mkSimpleComp "dec" $ SimpleSpec 1 $ \[i] o -> o .== (i-1)

add :: (SymVal a, Ord a, Num a) => SimpleComponent a
add = mkSimpleComp "add" $ SimpleSpec 2 $ \[i1,i2] o -> o .== (i1 + i2)

sub :: (SymVal a, Ord a, Num a) => SimpleComponent a
sub = mkSimpleComp "sub" $ SimpleSpec 2 $ \[i1,i2] o -> o .== (i1 - i2)

mul :: (SymVal a, Ord a, Num a) => SimpleComponent a
mul = mkSimpleComp "mul" $ SimpleSpec 2 $ \[i1,i2] o -> o .== (i1 * i2)


and :: (SymVal a, Ord a, Num a, Bits a) => SimpleComponent a
and = mkSimpleComp "and" $ SimpleSpec 2 $ \[i1,i2] o -> o .== (i1 .&. i2)

or :: (SymVal a, Ord a, Num a, Bits a) => SimpleComponent a
or = mkSimpleComp "or" $ SimpleSpec 2 $ \[i1,i2] o -> o .== (i1 .|. i2)

not :: (SymVal a, Ord a, Num a, Bits a) => SimpleComponent a
not = mkSimpleComp "not" $ SimpleSpec 1 $ \[i1] o -> o .== complement i1


bXor :: SimpleComponent Bool
bXor = mkSimpleComp "bXor" $ SimpleSpec 2 $ \[i1,i2] o -> o .== i1 .<+> i2

bNand :: SimpleComponent Bool
bNand = mkSimpleComp "bNand" $ SimpleSpec 2 $ \[i1,i2] o -> o .== sNot (i1 .&& i2)

-- | Logical equivalence implemented in "tabular" style
bEquiv :: SimpleComponent Bool
bEquiv = mkSimpleComp "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
  ]