use libttl::chips::Chip7400; use libttl::circuit::Circuit;
use libttl::logic_level::LogicLevel::{High, Low};
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("Building Standard Active-Low SR Latch Circuit...");
let mut circuit = Circuit::new();
let nand_chip_idx = circuit.add_chip(Box::new(Chip7400::new()));
println!("Chip 0: 7400 (NAND)");
circuit.add_wire(nand_chip_idx, 3, nand_chip_idx, 4)?;
circuit.add_wire(nand_chip_idx, 6, nand_chip_idx, 1)?;
println!("\nWiring complete. Initial state (Hold: ~S=H, ~R=H):");
circuit.set_external_input(nand_chip_idx, 2, High)?; circuit.set_external_input(nand_chip_idx, 5, High)?;
println!("Running initial ticks to stabilize...");
circuit.run(5); circuit.print_state();
let q = circuit.get_output_level(nand_chip_idx, 3)?; let q_bar = circuit.get_output_level(nand_chip_idx, 6)?; println!("Initial State (Hold): Q = {:?}, ~Q = {:?}", q, q_bar);
println!("\nStep 1: Force initial RESET (~S=H, ~R=L)");
circuit.set_external_input(nand_chip_idx, 2, High)?; circuit.set_external_input(nand_chip_idx, 5, Low)?; circuit.tick();
circuit.run(5);
circuit.print_state();
let q = circuit.get_output_level(nand_chip_idx, 3)?;
let q_bar = circuit.get_output_level(nand_chip_idx, 6)?;
println!("After Initial RESET: Q = {:?}, ~Q = {:?}", q, q_bar);
assert_eq!(q, Low, "Initial Reset Failed (Q)");
assert_eq!(q_bar, High, "Initial Reset Failed (~Q)");
println!("\nStep 2: HOLD after RESET (~S=H, ~R=H)");
circuit.set_external_input(nand_chip_idx, 2, High)?; circuit.set_external_input(nand_chip_idx, 5, High)?; circuit.tick();
circuit.run(5);
circuit.print_state();
let q = circuit.get_output_level(nand_chip_idx, 3)?;
let q_bar = circuit.get_output_level(nand_chip_idx, 6)?;
println!("After HOLD: Q = {:?}, ~Q = {:?}", q, q_bar);
assert_eq!(q, Low, "Hold after Reset Failed (Q)"); assert_eq!(q_bar, High, "Hold after Reset Failed (~Q)");
println!("\nStep 3: SET operation (~S=L, ~R=H)");
circuit.set_external_input(nand_chip_idx, 2, Low)?; circuit.set_external_input(nand_chip_idx, 5, High)?; circuit.tick();
circuit.run(5);
circuit.print_state();
let q = circuit.get_output_level(nand_chip_idx, 3)?;
let q_bar = circuit.get_output_level(nand_chip_idx, 6)?;
println!("After SET: Q = {:?}, ~Q = {:?}", q, q_bar);
assert_eq!(q, High, "Set Failed (Q)");
assert_eq!(q_bar, Low, "Set Failed (~Q)");
println!("\nStep 4: HOLD after SET (~S=H, ~R=H)");
circuit.set_external_input(nand_chip_idx, 2, High)?; circuit.set_external_input(nand_chip_idx, 5, High)?; circuit.tick();
circuit.run(5);
circuit.print_state();
let q = circuit.get_output_level(nand_chip_idx, 3)?;
let q_bar = circuit.get_output_level(nand_chip_idx, 6)?;
println!("After HOLD: Q = {:?}, ~Q = {:?}", q, q_bar);
assert_eq!(q, High, "Hold after Set Failed (Q)"); assert_eq!(q_bar, Low, "Hold after Set Failed (~Q)");
println!("\nStep 5: RESET operation (~S=H, ~R=L)");
circuit.set_external_input(nand_chip_idx, 2, High)?; circuit.set_external_input(nand_chip_idx, 5, Low)?; circuit.tick();
circuit.run(5);
circuit.print_state();
let q = circuit.get_output_level(nand_chip_idx, 3)?;
let q_bar = circuit.get_output_level(nand_chip_idx, 6)?;
println!("After RESET: Q = {:?}, ~Q = {:?}", q, q_bar);
assert_eq!(q, Low, "Reset Failed (Q)");
assert_eq!(q_bar, High, "Reset Failed (~Q)");
println!("\nStep 6: INVALID state (~S=L, ~R=L)");
circuit.set_external_input(nand_chip_idx, 2, Low)?; circuit.set_external_input(nand_chip_idx, 5, Low)?; circuit.tick();
circuit.run(5);
circuit.print_state();
let q = circuit.get_output_level(nand_chip_idx, 3)?;
let q_bar = circuit.get_output_level(nand_chip_idx, 6)?;
println!("After INVALID: Q = {:?}, ~Q = {:?}", q, q_bar);
assert_eq!(q, High, "Invalid State Failed (Q)");
assert_eq!(q_bar, High, "Invalid State Failed (~Q)");
println!("\nStandard SR Latch simulation complete.");
Ok(())
}