logical 0.2.1

Library for simulating digital circuit networks.
use logical::dump::Vcd;
use logical::models::{
    gates::{Mux, XorGate},
    inputs::Switch,
    outputs::Led,
};
use logical::{Circuit, Ieee1164, Ieee1164Value, Signal};

fn main() {
    let mut val = Ieee1164::Strong(Ieee1164Value::One);

    let xor = XorGate::default();
    let mux = Mux::default();
    let mut input1 = Switch::new_with_value(val);
    let input2 = Switch::new_with_value(Ieee1164::Strong(Ieee1164Value::One));
    let mut mux_switch = Switch::new_with_value(Ieee1164::Strong(Ieee1164Value::Zero));
    let output = Led::default();

    let mut sig_input_signal = Signal::new();
    sig_input_signal.connect_as_input(&input1.output);
    sig_input_signal.connect_as_output(&xor.a);

    let mut sig_input_mux = Signal::new();
    sig_input_mux.connect_as_input(&input2.output);
    sig_input_mux.connect_as_output(&mux.a);

    let mut sig_mux_switch = Signal::new();
    sig_mux_switch.connect_as_input(&mux_switch.output);
    sig_mux_switch.connect_as_output(&mux.s);

    let mut sig_rec = Signal::new();
    sig_rec.connect_as_output(&mux.b);
    sig_rec.connect_as_output(&output.input);
    sig_rec.connect_as_input(&xor.z);

    let mut sig_mux_xor = Signal::new();
    sig_mux_xor.connect_as_input(&mux.z);
    sig_mux_xor.connect_as_output(&xor.b);

    let mut circuit = Circuit::new();
    circuit.add_updater(&xor);
    circuit.add_updater(&mux);
    circuit.add_updater(&sig_input_signal);
    circuit.add_updater(&sig_input_mux);
    circuit.add_updater(&sig_mux_switch);
    circuit.add_updater(&sig_rec);
    circuit.add_updater(&sig_mux_xor);

    circuit.tick();
    circuit.tick();
    circuit.tick();
    mux_switch.set_value(Ieee1164::Strong(Ieee1164Value::One));
    circuit.tick();

    let mut dumper = Vcd::new("VCD Example");

    for i in 0..90 {
        dumper.serialize_ports(&xor);
        circuit.tick();
        circuit.tick();
        dumper.tick();
        dumper.tick();
        if i % 20 == 0 {
            val = !val;
            input1.set_value(val);
        }
    }

    dumper.dump("/home/marcel/a.vcd").unwrap();
}