| 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 | |