From a6eefcd788f25c046257ee1ae5ea25054386ad2f Mon Sep 17 00:00:00 2001 From: AurumTheEnd <47597303+aurumtheend@users.noreply.github.com> Date: Fri, 10 May 2024 11:35:15 +0200 Subject: [PATCH] refactor(bdd): moved BitAnd impl into traits module --- src/bdd/mod.rs | 1 + src/bdd/traits/bit/and.rs | 32 ++++++++++++++++++++++++++++++++ src/bdd/traits/bit/mod.rs | 1 + src/bdd/traits/mod.rs | 1 + 4 files changed, 35 insertions(+) create mode 100644 src/bdd/traits/bit/and.rs create mode 100644 src/bdd/traits/bit/mod.rs create mode 100644 src/bdd/traits/mod.rs diff --git a/src/bdd/mod.rs b/src/bdd/mod.rs index 08b29a0..fe76510 100644 --- a/src/bdd/mod.rs +++ b/src/bdd/mod.rs @@ -1,4 +1,5 @@ mod iterators; +mod traits; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::fmt::Debug; diff --git a/src/bdd/traits/bit/and.rs b/src/bdd/traits/bit/and.rs new file mode 100644 index 0000000..5b3f8a2 --- /dev/null +++ b/src/bdd/traits/bit/and.rs @@ -0,0 +1,32 @@ +use crate::bdd::{extend_bdd_variables, Bdd}; +use std::fmt::Debug; +use std::ops::BitAnd; + +impl BitAnd for Bdd { + type Output = Bdd; + + fn bitand(self, rhs: Self) -> Self::Output { + if self.inputs == rhs.inputs { + Bdd { + inputs: self.inputs.clone(), + bdd: self.bdd.and(&rhs.bdd), + } + } else { + let mut common_inputs = self.inputs.clone(); + for other in &rhs.inputs { + if !common_inputs.contains(other) { + common_inputs.push(other.clone()); + } + } + common_inputs.sort(); + + let self_lifted = extend_bdd_variables(&self, &common_inputs); + let rhs_lifted = extend_bdd_variables(&rhs, &common_inputs); + + Bdd { + inputs: common_inputs, + bdd: self_lifted.bdd.and(&rhs_lifted.bdd), + } + } + } +} diff --git a/src/bdd/traits/bit/mod.rs b/src/bdd/traits/bit/mod.rs new file mode 100644 index 0000000..b3dc7e1 --- /dev/null +++ b/src/bdd/traits/bit/mod.rs @@ -0,0 +1 @@ +mod and; diff --git a/src/bdd/traits/mod.rs b/src/bdd/traits/mod.rs new file mode 100644 index 0000000..9a8d73b --- /dev/null +++ b/src/bdd/traits/mod.rs @@ -0,0 +1 @@ +mod bit;