pub trait LogicGate {
fn get_result(&self) -> Option<bool>;
}
#[derive(PartialEq)]
pub struct Nand<'a> {
pub input1: &'a Option<bool>,
pub input2: &'a Option<bool>,
}
impl<'a> LogicGate for Nand<'a> {
fn get_result(&self) -> Option<bool> {
if *self.input1 == Some(true){
if *self.input2 == Some(true) {
return Some(false);
}
}
Some(true)
}
}
pub struct Not<'a> {
pub input: &'a Option<bool>,
}
impl<'a> LogicGate for Not<'a> {
fn get_result(&self) -> Option<bool> {
let a = Nand{input1: &self.input, input2: &self.input};
a.get_result()
}
}
pub struct Or<'a> {
pub input1: &'a Option<bool>,
pub input2: &'a Option<bool>,
}
impl<'a> LogicGate for Or<'a> {
fn get_result(&self) -> Option<bool> {
let a = Nand{input1: self.input1, input2: self.input1};
let b = Nand{input1: self.input2, input2: self.input2};
let c = Nand{input1: &a.get_result(),input2: &b.get_result()};
c.get_result()
}
}
pub struct Nor<'a>{
pub input1: &'a Option<bool>,
pub input2: &'a Option<bool>,
}
impl<'a> LogicGate for Nor<'a> {
fn get_result(&self) -> Option<bool> {
let a = Nand{input1: self.input1, input2: self.input1};
let b = Nand{input1: self.input2, input2: self.input2};
let c = Nand{input1: &a.get_result(),input2: &b.get_result()};
let d = Nand{input1: &c.get_result(),input2: &c.get_result()};
d.get_result()
}
}
pub struct And<'a> {
pub input1: &'a Option<bool>,
pub input2: &'a Option<bool>,
}
impl<'a> LogicGate for And<'a> {
fn get_result(&self) -> Option<bool> {
let a = Nand{input1: self.input1, input2: self.input2};
let b = Nand{input1: &a.get_result(), input2: &a.get_result()};
b.get_result()
}
}
pub struct HighLevel{
}
impl LogicGate for HighLevel {
fn get_result(&self) -> Option<bool> {
Some(true)
}
}
pub struct LowLevel{
}
impl LogicGate for LowLevel {
fn get_result(&self) -> Option<bool> {
Some(false)
}
}
pub struct Xor<'a>{
pub input1: &'a Option<bool>,
pub input2: &'a Option<bool>,
}
impl<'a> LogicGate for Xor<'a>{
fn get_result(&self) ->Option<bool> {
let a:And = And{input1:self.input1,input2:self.input2};
let b:Nor = Nor{input1:self.input1,input2:self.input2};
let c:Nor = Nor{input1:&a.get_result(),input2:&b.get_result()};
c.get_result()
}
}
pub struct ThreeOr<'a>{
pub input1: &'a Option<bool>,
pub input2: &'a Option<bool>,
pub input3: &'a Option<bool>,
}
impl<'a> LogicGate for ThreeOr<'a>{
fn get_result(&self) ->Option<bool> {
let a:Or = Or{input1:self.input1,input2:self.input2};
let b:Or = Or{input1:self.input2,input2:self.input3};
let c:Or = Or{input1:&a.get_result(),input2:&b.get_result()};
c.get_result()
}
}
pub struct ThreeAnd<'a>{
pub input1: &'a Option<bool>,
pub input2: &'a Option<bool>,
pub input3: &'a Option<bool>,
}
impl<'a> LogicGate for ThreeAnd<'a>{
fn get_result(&self) ->Option<bool> {
let a:And = And{input1:self.input1,input2:self.input2};
let b:And = And{input1:self.input2,input2:self.input3};
let c:And = And{input1:&a.get_result(),input2:&b.get_result()};
c.get_result()
}
}
pub struct Xnor<'a>{
pub input1: &'a Option<bool>,
pub input2: &'a Option<bool>,
}
impl<'a> LogicGate for Xnor<'a>{
fn get_result(&self) ->Option<bool> {
let a:Xor = Xor{input1:self.input1,input2:self.input2};
let b:Not = Not{input: &a.get_result()};
b.get_result()
}
}
use std::time::Duration;
pub struct DelayLine<'a> {
pub delay: u64,
pub input: &'a Option<bool>,
}
impl<'a> DelayLine<'a> {
pub fn get_result(&self) -> Option<bool> {
std::thread::sleep(Duration::from_millis(self.delay));
*self.input
}
}
pub struct HalfAdder<'a> {
pub input1: &'a Option<bool>,
pub input2: &'a Option<bool>,
}
impl<'a> HalfAdder<'a>{
pub fn get_result(&self) -> (Option<bool>,Option<bool>) {
let a:Xor = Xor{input1: self.input1,input2:self.input2};
let b:And = And{input1: self.input1,input2:self.input2};
(a.get_result(),b.get_result())
}
}
pub struct FullAdder<'a> {
pub input1: &'a Option<bool>,
pub input2: &'a Option<bool>,
pub input3: &'a Option<bool>,
}
impl<'a> FullAdder<'a> {
pub fn get_result(&self) ->(Option<bool>,Option<bool>) {
let a: Xor = Xor{input1: self.input1, input2: self.input2};
let b: And = And{input1: self.input1, input2: self.input2};
let c: Xor = Xor{input1: &a.get_result(), input2: self.input3};
let d: And = And{input1: &a.get_result(), input2: self.input3};
let e: Or = Or{input1: &b.get_result(),input2: &d.get_result()};
(c.get_result(),e.get_result())
}
}
pub struct Switch<'a> {
pub switch: &'a Option<bool>,
pub input: &'a Option<bool>,
}
impl<'a> LogicGate for Switch<'a> {
fn get_result(&self) -> Option<bool> {
if *self.switch == Some(true) {
return *self.input;
}
None
}
}
pub struct EightSwitch<'a> {
pub switch: &'a Option<bool>,
pub input: i32,
}
impl<'a> EightSwitch<'a> {
fn get_result(&self) -> Option<i32> {
if *self.switch == Some(true) {
return Some(self.input);
}
None
}
}
pub struct EightBitSplitter{
pub input: i32,
}
impl EightBitSplitter {
pub fn get_result(&self) ->(Option<bool>,Option<bool>,Option<bool>,Option<bool>,Option<bool>,Option<bool>,Option<bool>,Option<bool>) {
let bit1 = (self.input & 1) != 0;
let bit2 = (self.input & 2) != 0;
let bit3 = (self.input & 4) != 0;
let bit4 = (self.input & 8) != 0;
let bit5 = (self.input & 16) != 0;
let bit6 = (self.input & 32) != 0;
let bit7 = (self.input & 64) != 0;
let bit8 = (self.input & 128) != 0;
(Some(bit1), Some(bit2), Some(bit3), Some(bit4), Some(bit5), Some(bit6), Some(bit7),Some(bit8))
}
}
pub struct EightBitMux<'a> {
pub input1: &'a Option<bool>,
pub input2: &'a Option<bool>,
pub input3: &'a Option<bool>,
pub input4: &'a Option<bool>,
pub input5: &'a Option<bool>,
pub input6: &'a Option<bool>,
pub input7: &'a Option<bool>,
pub input8: &'a Option<bool>,
}
impl<'a> EightBitMux<'a> {
pub fn get_result(&self) -> i32 {
let result = (self.input8.unwrap_or(false) as i32) << 7 |
(self.input7.unwrap_or(false) as i32) << 6 |
(self.input6.unwrap_or(false) as i32) << 5 |
(self.input5.unwrap_or(false) as i32) << 4 |
(self.input4.unwrap_or(false) as i32) << 3 |
(self.input3.unwrap_or(false) as i32) << 2 |
(self.input2.unwrap_or(false) as i32) << 1 |
(self.input1.unwrap_or(false) as i32);
result
}
}
pub struct EightBitAdder<'a>{
pub input1: &'a Option<bool>,
pub input2: i32,
pub input3: i32,
}
impl<'a> EightBitAdder<'a> {
pub fn get_result(&self) -> (i32, Option<bool>) {
let splitter_one = EightBitSplitter { input: self.input2 }.get_result();
let splitter_two = EightBitSplitter { input: self.input3 }.get_result();
let adder_one = FullAdder { input1: self.input1, input2: & splitter_one.0, input3: & splitter_two.0 }.get_result();
let adder_two = FullAdder { input1: & adder_one.1, input2: & splitter_one.1, input3: & splitter_two.1 }.get_result();
let adder_three = FullAdder { input1: & adder_two.1, input2: & splitter_one.2, input3: & splitter_two.2 }.get_result();
let adder_four = FullAdder { input1: & adder_three.1, input2: & splitter_one.3, input3: & splitter_two.3 }.get_result();
let adder_five = FullAdder { input1: & adder_four.1, input2: & splitter_one.4, input3: & splitter_two.4 }.get_result();
let adder_six = FullAdder { input1: & adder_five.1, input2: & splitter_one.5, input3: & splitter_two.5 }.get_result();
let adder_seven = FullAdder { input1: & adder_six.1, input2: & splitter_one.6, input3: & splitter_two.6 }.get_result();
let adder_eight = FullAdder { input1: & adder_seven.1, input2: & splitter_one.7, input3: & splitter_two.7 }.get_result();
let selection = EightBitMux{input1:& adder_one.0, input2:& adder_two.0, input3:& adder_three.0, input4:& adder_four.0, input5:& adder_five.0, input6:& adder_six.0, input7:& adder_seven.0, input8:& adder_eight.0 }.get_result();
(selection, adder_eight.1)
}
}
pub struct EightBitNot{
pub input: i32,
}
impl EightBitNot {
pub fn get_result(&self) -> i32 {
let a = EightBitSplitter{input: self.input}.get_result();
let b = Not{input:& a.0}.get_result();
let c = Not{input:& a.1}.get_result();
let d = Not{input:& a.2}.get_result();
let e = Not{input:& a.3}.get_result();
let f = Not{input:& a.4}.get_result();
let g = Not{input:& a.5}.get_result();
let h = Not{input:& a.6}.get_result();
let i = Not{input:& a.7}.get_result();
EightBitMux{input1:& b,input2:& c,input3:& d,input4:& e,input5:& f,input6:& g,input7:& h,input8:& i}.get_result()
}
}
pub struct EightBitOr{
pub input1: i32,
pub input2: i32,
}
impl EightBitOr {
pub fn get_result(&self) -> i32 {
let a = EightBitSplitter{input: self.input1}.get_result();
let b = EightBitSplitter{input: self.input2}.get_result();
let c = Or{input1:& a.0,input2:& b.0}.get_result();
let d = Or{input1:& a.1,input2:& b.1}.get_result();
let e = Or{input1:& a.2,input2:& b.2}.get_result();
let f = Or{input1:& a.3,input2:& b.3}.get_result();
let g = Or{input1:& a.4,input2:& b.4}.get_result();
let h = Or{input1:& a.5,input2:& b.5}.get_result();
let i = Or{input1:& a.6,input2:& b.6}.get_result();
let j = Or{input1:& a.7,input2:& b.7}.get_result();
EightBitMux{input1:& c,input2: & d,input3:& e,input4:& f,input5:& g,input6:& h,input7:& i,input8:& j}.get_result()
}
}
pub struct DataSelector<'a>{
pub input1: &'a Option<bool>,
pub input2: i32,
pub input3: i32,
}
impl<'a> DataSelector<'a>{
pub fn get_result(&self) -> i32 {
if *self.input1 ==Some(true) {
return self.input3;
}
self.input2
}
}