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();
}