imp-ppl-0.1.0.0: src/Imp/BDD.hs
-- | Core BDD types.
module Imp.BDD
( VarLabel(..)
, NodeId(..)
, BDD(..)
, BDDNode(..)
) where
-- | A BDD variable label (index into the variable ordering).
newtype VarLabel = VarLabel { unVarLabel :: Int }
deriving newtype (Eq, Ord, Show)
-- | A BDD node ID (index into the node table).
newtype NodeId = NodeId { unNodeId :: Int }
deriving newtype (Eq, Ord, Show)
-- | A BDD pointer with complemented edges for O(1) negation.
data BDD
= BDDTrue
| BDDFalse
| BDDRef !NodeId -- ^ positive reference
| BDDComp !NodeId -- ^ complemented reference
deriving stock (Eq, Ord, Show)
-- | Internal BDD node: variable, low child, and high child.
data BDDNode = BDDNode
{ bddVar :: !VarLabel
, bddLow :: !BDD
, bddHigh :: !BDD
} deriving stock (Eq, Ord, Show)