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