diff options
Diffstat (limited to '')
| -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)); | 
