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