summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLibravatar Mora Unie Youer <[email protected]>2025-04-23 11:34:32 +0300
committerLibravatar Mora Unie Youer <[email protected]>2025-04-23 11:34:32 +0300
commit4412333b2cd104a3390e9a04d852afddcc052caa (patch)
treeab1969c6b2353a9352b7a0f7fb194c65c0ea2ebc /src
parentfeat: transform cubes to logic (diff)
downloadlogic-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
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));