static void TestRing(bool oscillation) { Circuit c = new Circuit(); Gates.BasicGates.Not mnot1 = new Gates.BasicGates.Not(); Gates.BasicGates.Not mnot2 = new Gates.BasicGates.Not(); Gates.BasicGates.Not mnot3 = new Gates.BasicGates.Not(); c.Add(mnot1); c.Add(mnot2); c.Add(mnot3); mnot3.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(mnot3_PropertyChanged); mnot1[0] = false; c[new Terminal(0, mnot2)] = new Terminal(0, mnot1); c[new Terminal(0, mnot3)] = new Terminal(0, mnot2); if (oscillation) { c[new Terminal(0, mnot1)] = new Terminal(0, mnot3); } Thread.Sleep(1000); c.Disconnect(new Terminal(0, mnot1)); }
public void ThruCircuit2() { Gates.Circuit c = new Gates.Circuit(); c.Start(); Gates.BasicGates.Not mnot1 = new Gates.BasicGates.Not(); Gates.BasicGates.Not mnot2 = new Gates.BasicGates.Not(); Gates.BasicGates.Not mnot3 = new Gates.BasicGates.Not(); c.Add(mnot1); c.Add(mnot2); c.Add(mnot3); mnot1[0] = true; c[new Gates.Terminal(0, mnot2)] = new Gates.Terminal(0, mnot1); c[new Gates.Terminal(0, mnot3)] = new Gates.Terminal(0, mnot2); Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(false, mnot3.Output[0]); mnot1[0] = false; Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(true, mnot3.Output[0]); c.Disconnect(new Gates.Terminal(0, mnot2)); Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(false, mnot3.Output[0]); }
static IC Nor() { Circuit nor = new Circuit(); Gates.BasicGates.And mand = new Gates.BasicGates.And(); Gates.BasicGates.Not mnot1 = new Gates.BasicGates.Not(); Gates.BasicGates.Not mnot2 = new Gates.BasicGates.Not(); Gates.IOGates.UserInput in1 = new Gates.IOGates.UserInput(); Gates.IOGates.UserInput in2 = new Gates.IOGates.UserInput(); Gates.IOGates.UserOutput out1 = new Gates.IOGates.UserOutput(); nor.Add(mand); nor.Add(mnot1); nor.Add(mnot2); nor.Add(in1); nor.Add(in2); nor.Add(out1); nor[new Terminal(0, mnot1)] = new Terminal(0, in1); nor[new Terminal(0, mnot2)] = new Terminal(0, in2); nor[new Terminal(0, mand)] = new Terminal(0, mnot1); nor[new Terminal(1, mand)] = new Terminal(0, mnot2); nor[new Terminal(0, out1)] = new Terminal(0, mand); return(new IC(nor, new Gates.IOGates.UserInput[] { in1, in2 }, new Gates.IOGates.UserOutput[] { out1 }, "Nor")); }
public void ThruCircuit1() { Gates.Circuit c = new Gates.Circuit(); c.Start(); Gates.BasicGates.And mand = new Gates.BasicGates.And(); Gates.BasicGates.And mand2 = new Gates.BasicGates.And(); Gates.BasicGates.Not mnot = new Gates.BasicGates.Not(); c.Add(mand); c.Add(mand2); c.Add(mnot); mand2[0] = true; c[new Gates.Terminal(1, mand2)] = new Gates.Terminal(0, mand); c[new Gates.Terminal(0, mnot)] = new Gates.Terminal(0, mand2); Assert.AreEqual(true, mnot.Output[0]); mand[1] = true; Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(true, mnot.Output[0]); mand[0] = true; Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(false, mnot.Output[0]); }
public void OscillationCircuit2() { Gates.Circuit c = new Gates.Circuit(); c.Start(); Gates.BasicGates.Not mnot1 = new Gates.BasicGates.Not(); Gates.BasicGates.Not mnot2 = new Gates.BasicGates.Not(); Gates.BasicGates.Not mnot3 = new Gates.BasicGates.Not(); c.Add(mnot1); c.Add(mnot2); c.Add(mnot3); mnot1[0] = true; c[new Gates.Terminal(0, mnot2)] = new Gates.Terminal(0, mnot1); c[new Gates.Terminal(0, mnot3)] = new Gates.Terminal(0, mnot2); c[new Gates.Terminal(0, mnot1)] = new Gates.Terminal(0, mnot3); int cnt = 0; bool oldval = true; DateTime start = DateTime.Now; while (DateTime.Now - start < new TimeSpan(0, 0, 5)) { if (mnot1.Output[0] != oldval) { oldval = mnot1.Output[0]; cnt++; } } // after 5 seconds expect at least 5 oscillations if (cnt < 5) { Assert.Fail("Unacceptable count = " + cnt.ToString()); } c.Disconnect(new Gates.Terminal(0, mnot2)); cnt = 0; oldval = false; start = DateTime.Now; while (DateTime.Now - start < new TimeSpan(0, 0, 5)) { if (mnot1.Output[0] != oldval) { oldval = mnot1.Output[0]; cnt++; } } // wire is disconnected; no changes should occur // 1 change allowable for final sync if (cnt > 1) { Assert.Fail("Disconnect didn't: " + cnt.ToString()); } }
public void OscillationCircuit1() { Gates.Circuit c = new Gates.Circuit(); c.Start(); Gates.BasicGates.And mand = new Gates.BasicGates.And(); Gates.BasicGates.And mand2 = new Gates.BasicGates.And(); Gates.BasicGates.Not mnot = new Gates.BasicGates.Not(); c.Add(mand); c.Add(mand2); c.Add(mnot); mand2[0] = true; mand[1] = false; c[new Gates.Terminal(1, mand2)] = new Gates.Terminal(0, mand); c[new Gates.Terminal(0, mnot)] = new Gates.Terminal(0, mand2); c[new Gates.Terminal(0, mand)] = new Gates.Terminal(0, mnot); int cnt = 0; bool oldval = true; DateTime start = DateTime.Now; while (DateTime.Now - start < new TimeSpan(0, 0, 5)) { if (mnot.Output[0] != oldval) { oldval = mnot.Output[0]; cnt++; } } // 5 seconds but circuit should be "off" due to first and Assert.AreEqual(0, cnt); // turn circuit on and try again mand[1] = true; cnt = 0; oldval = false; start = DateTime.Now; while (DateTime.Now - start < new TimeSpan(0, 0, 5)) { if (mnot.Output[0] != oldval) { oldval = mnot.Output[0]; cnt++; } } // 5 seconds at arbitrarily high propagation rate // we'll assume AT LEAST 1 prop a second if (cnt < 5) { Assert.Fail("Unacceptable count = " + cnt.ToString()); } c.Stop(); }
public void Not() { Gates.BasicGates.Not not = new Gates.BasicGates.Not(); not[0] = false; Assert.AreEqual(not.Output[0], true); not[0] = true; Assert.AreEqual(not.Output[0], false); }
static void TestUserIO() { Circuit c = new Circuit(); Gates.BasicGates.Not mnot1 = new Gates.BasicGates.Not(); Gates.BasicGates.And mand = new Gates.BasicGates.And(); Gates.BasicGates.Not mnot3 = new Gates.BasicGates.Not(); Gates.BasicGates.Not mnot2 = new Gates.BasicGates.Not(); Gates.IOGates.UserInput ui = new Gates.IOGates.UserInput(); Gates.IOGates.UserOutput uo = new Gates.IOGates.UserOutput(); c.Add(mnot1); c.Add(mnot2); c.Add(mand); c.Add(mnot3); c.Add(ui); c.Add(uo); uo.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(uo_PropertyChanged); c[new Terminal(0, mand)] = new Terminal(0, mnot2); c[new Terminal(0, mnot3)] = new Terminal(0, mand); c[new Terminal(0, mnot1)] = new Terminal(0, mnot3); c[new Terminal(0, mnot2)] = new Terminal(0, mnot1); c[new Terminal(1, mand)] = new Terminal(0, ui); c[new Terminal(0, uo)] = new Terminal(0, mnot3); do { Console.Out.WriteLine("Ready for X"); Console.In.ReadLine(); ui.Value = !ui.Value; } while (true); }
static void TestAndNotLoop(bool oscillation) { Circuit c = new Circuit(); Gates.BasicGates.And mand = new Gates.BasicGates.And(); Gates.BasicGates.And mand2 = new Gates.BasicGates.And(); Gates.BasicGates.Not mnot = new Gates.BasicGates.Not(); mand2.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(mand2_PropertyChanged); mnot.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(mnot3_PropertyChanged); c.Add(mand); c.Add(mand2); c.Add(mnot); mand2[0] = true; c[new Terminal(1, mand2)] = new Terminal(0, mand); c[new Terminal(0, mnot)] = new Terminal(0, mand2); if (oscillation) { c[new Terminal(0, mand)] = new Terminal(0, mnot); } Console.Out.WriteLine(mand2.Output[0].ToString()); mand[1] = true; Console.Out.WriteLine(mand2.Output[0].ToString()); mand[0] = true; Console.Out.WriteLine(mand2.Output[0].ToString()); Console.Out.Write(mnot.Output[0].ToString()); Gates.PropagationThread.Instance.WaitOnPropagation(); Console.Out.Write(mnot.Output[0].ToString()); Console.Out.Write(mnot[0].ToString()); Console.Out.Write("X"); }
static void mnot3_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { Gates.BasicGates.Not mnot = (Gates.BasicGates.Not)sender; Console.Out.WriteLine("MNOT3 NOTIFY: " + mnot.Output[0].ToString()); }