diff options
author | 2025-04-23 11:34:32 +0300 | |
---|---|---|
committer | 2025-04-23 11:34:32 +0300 | |
commit | 4412333b2cd104a3390e9a04d852afddcc052caa (patch) | |
tree | ab1969c6b2353a9352b7a0f7fb194c65c0ea2ebc | |
parent | feat: transform cubes to logic (diff) | |
download | logic-rust-4412333b2cd104a3390e9a04d852afddcc052caa.tar.gz logic-rust-4412333b2cd104a3390e9a04d852afddcc052caa.tar.bz2 logic-rust-4412333b2cd104a3390e9a04d852afddcc052caa.tar.lz logic-rust-4412333b2cd104a3390e9a04d852afddcc052caa.tar.xz logic-rust-4412333b2cd104a3390e9a04d852afddcc052caa.tar.zst logic-rust-4412333b2cd104a3390e9a04d852afddcc052caa.zip |
feat: wired OR
-rw-r--r-- | src/main.rs | 21 |
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)); |