summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs
index 988a684..95d5b7b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -315,8 +315,6 @@ impl Display for Logic {
let s = logics.iter().map(|logic| logic.to_string()).join(" !| ");
f.write_fmt(format_args!("({s})"))
}
-
- _ => unreachable!(),
}
}
}
@@ -405,6 +403,7 @@ fn cubes_to_nand(cubes: &[Cube], vars: &[&str]) -> Logic {
}
}
+// NOTE: returns inverted result
fn cubes_to_nor(cubes: &[Cube], vars: &[&str]) -> Logic {
let cnf = cubes_to_cnf(cubes, vars);
match cnf {
@@ -414,6 +413,23 @@ fn cubes_to_nor(cubes: &[Cube], vars: &[&str]) -> Logic {
}
}
+// NOTE: returns inverted result
+// NOTE: returns just inverted DNF, which is enough to understand how to build
+fn cubes_to_wired_or(cubes: &[Cube], vars: &[&str]) -> Logic {
+ let mut dnf = cubes_to_dnf(cubes, vars);
+
+ // If we have standalone variables, we need to transform them into NAND gates
+ if let Logic::Or(logics) = &mut dnf {
+ for logic in logics {
+ if matches!(logic, Logic::Not(_) | Logic::Variable(_)) {
+ *logic = Logic::And(vec![logic.inverse(), logic.inverse()]);
+ }
+ }
+ }
+
+ Logic::Not(Box::new(dnf))
+}
+
fn main() {
let vars = &["X4", "X3", "X2", "X1"];
// let minterms = [0, 1, 2, 3, 4]; // Термы со значением 1
@@ -441,6 +457,7 @@ fn main() {
println!("{}", cubes_to_nand(&cubes, vars));
println!("{}", cubes_to_cnf(&inv_cubes, vars));
println!("{}", cubes_to_nor(&inv_cubes, vars));
+ println!("{}", cubes_to_wired_or(&inv_cubes, vars));
// dbg!(cubes_to_dnf(&cubes, vars));
// dbg!(cubes_to_nand(&cubes, vars));