File size: 1,006 Bytes
56de343 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | module IR.Boolean where
import qualified Data.Map.Strict as Map
data BExpr
= BVar Int
| BTrue
| BFalse
| BNand BExpr BExpr
deriving (Eq, Ord, Show)
data Circuit = Circuit
{ circuitName :: String
, circuitInputs :: [Int]
, circuitBody :: BExpr
} deriving (Show)
bnot :: BExpr -> BExpr
bnot x = BNand x x
band :: BExpr -> BExpr -> BExpr
band a b = bnot (BNand a b)
bor :: BExpr -> BExpr -> BExpr
bor a b = BNand (bnot a) (bnot b)
bxor :: BExpr -> BExpr -> BExpr
bxor a b = BNand (BNand a (BNand a b)) (BNand b (BNand a b))
eval :: Map.Map Int Bool -> BExpr -> Bool
eval _ BTrue = True
eval _ BFalse = False
eval env (BVar v) = Map.findWithDefault False v env
eval env (BNand a b) = not (eval env a && eval env b)
vars :: BExpr -> [Int]
vars BTrue = []
vars BFalse = []
vars (BVar v) = [v]
vars (BNand a b) = vars a ++ vars b
size :: BExpr -> Int
size BTrue = 1
size BFalse = 1
size (BVar _) = 1
size (BNand a b) = 1 + size a + size b
|