oxidd/
bdd.rs

1//! Binary decision diagrams (BDDs)
2
3cfg_if::cfg_if! {
4    if #[cfg(feature = "manager-pointer")] {
5        pub use pointer::{BDDFunction, BDDManagerRef};
6    } else if #[cfg(feature = "manager-index")] {
7        pub use index::{BDDFunction, BDDManagerRef};
8    } else {
9        pub type BDDFunction = ();
10        pub type BDDManagerRef = ();
11    }
12}
13
14/// Create a new manager for a simple binary decision diagram
15#[allow(unused_variables)]
16pub fn new_manager(
17    inner_node_capacity: usize,
18    apply_cache_capacity: usize,
19    threads: u32,
20) -> BDDManagerRef {
21    cfg_if::cfg_if! {
22        if #[cfg(feature = "manager-pointer")] {
23            pointer::BDDManagerRef::new_manager(inner_node_capacity, apply_cache_capacity, threads)
24        } else if #[cfg(feature = "manager-index")] {
25            index::BDDManagerRef::new_manager(inner_node_capacity, 2, apply_cache_capacity, threads)
26        } else {
27            unreachable!()
28        }
29    }
30}
31
32/// Print statistics to stderr
33pub fn print_stats() {
34    #[cfg(not(feature = "statistics"))]
35    eprintln!("[statistics feature disabled]");
36
37    #[cfg(feature = "statistics")]
38    oxidd_rules_bdd::simple::print_stats();
39}
40
41#[cfg(all(feature = "manager-index", not(feature = "manager-pointer")))]
42mod index {
43    use oxidd_manager_index::node::fixed_arity::NodeWithLevelCons;
44    use oxidd_manager_index::terminal_manager::StaticTerminalManagerCons;
45    use oxidd_rules_bdd::simple::BDDOp;
46    use oxidd_rules_bdd::simple::BDDRules;
47    use oxidd_rules_bdd::simple::BDDTerminal;
48
49    use crate::util::type_cons::DD;
50
51    crate::util::dd_index_based!(BDD {
52        node: NodeWithLevelCons<2>,
53        edge_tag: (),
54        terminal_manager: StaticTerminalManagerCons<BDDTerminal>,
55        rules: BDDRulesCons for BDDRules,
56        manager_data: BDDManagerDataCons for BDDManagerData,
57        terminals: 2,
58    });
59
60    crate::util::manager_data!(BDDManagerData for BDD, operator: BDDOp, cache_max_arity: 3);
61
62    crate::util::manager_ref_index_based!(pub struct BDDManagerRef(<BDD as DD>::ManagerRef) with BDDManagerData);
63
64    #[cfg(not(feature = "multi-threading"))]
65    type FunctionInner = oxidd_rules_bdd::simple::BDDFunction<<BDD as DD>::Function>;
66    #[cfg(feature = "multi-threading")]
67    type FunctionInner = oxidd_rules_bdd::simple::BDDFunctionMT<<BDD as DD>::Function>;
68
69    /// Boolean function represented as BDD
70    #[derive(
71        Clone,
72        PartialEq,
73        Eq,
74        PartialOrd,
75        Ord,
76        Hash,
77        oxidd_derive::Function,
78        oxidd_derive::FunctionSubst,
79        oxidd_derive::BooleanFunction,
80        oxidd_derive::BooleanFunctionQuant,
81    )]
82    #[use_manager_ref(BDDManagerRef, BDDManagerRef(inner))]
83    pub struct BDDFunction(FunctionInner);
84    crate::util::derive_raw_function_index_based!(for: BDDFunction, inner: FunctionInner);
85
86    // Default implementation suffices
87    impl oxidd_dump::dot::DotStyle<()> for BDDFunction {}
88}
89
90#[cfg(feature = "manager-pointer")]
91mod pointer {
92    use oxidd_manager_pointer::node::fixed_arity::NodeWithLevelCons;
93    use oxidd_manager_pointer::terminal_manager::StaticTerminalManagerCons;
94    use oxidd_rules_bdd::simple::BDDOp;
95    use oxidd_rules_bdd::simple::BDDRules;
96    use oxidd_rules_bdd::simple::BDDTerminal;
97
98    use crate::util::type_cons::DD;
99
100    crate::util::dd_pointer_based!(BDD {
101        node: NodeWithLevelCons<2>,
102        edge_tag: (),
103        terminal_manager: StaticTerminalManagerCons<BDDTerminal>,
104        rules: BDDRulesCons for BDDRules,
105        manager_data: BDDManagerDataCons for BDDManagerData,
106        tag_bits: 2,
107    });
108
109    crate::util::manager_data!(BDDManagerData for BDD, operator: BDDOp, cache_max_arity: 3);
110
111    crate::util::manager_ref_pointer_based!(pub struct BDDManagerRef(<BDD as DD>::ManagerRef) with BDDManagerData);
112
113    #[cfg(not(feature = "multi-threading"))]
114    type FunctionInner = oxidd_rules_bdd::simple::BDDFunction<<BDD as DD>::Function>;
115    #[cfg(feature = "multi-threading")]
116    type FunctionInner = oxidd_rules_bdd::simple::BDDFunctionMT<<BDD as DD>::Function>;
117
118    /// Boolean function represented as BDD
119    #[derive(
120        Clone,
121        PartialEq,
122        Eq,
123        PartialOrd,
124        Ord,
125        Hash,
126        oxidd_derive::Function,
127        oxidd_derive::FunctionSubst,
128        oxidd_derive::BooleanFunction,
129        oxidd_derive::BooleanFunctionQuant,
130    )]
131    #[use_manager_ref(BDDManagerRef, BDDManagerRef(inner))]
132    pub struct BDDFunction(FunctionInner);
133    crate::util::derive_raw_function_pointer_based!(for: BDDFunction, inner: FunctionInner);
134
135    // Default implementation suffices
136    impl oxidd_dump::dot::DotStyle<()> for BDDFunction {}
137}