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]); }
private Gates.IC CreateAndChain(int len) { Gates.Circuit andc = new Gates.Circuit(); andc.Start(); Gates.IOGates.UserInput in1 = new Gates.IOGates.UserInput(); andc.Add(in1); Gates.IOGates.UserOutput out1 = new Gates.IOGates.UserOutput(); andc.Add(out1); if (len > 1) { Gates.IC cand1 = CreateAndChain(len / 2); Gates.IC cand2 = CreateAndChain(len / 2); andc.Add(cand1); andc.Add(cand2); andc[new Gates.Terminal(0, cand1)] = new Gates.Terminal(0, in1); andc[new Gates.Terminal(0, cand2)] = new Gates.Terminal(0, cand1); andc[new Gates.Terminal(0, out1)] = new Gates.Terminal(0, cand2); } else { Gates.BasicGates.And mand = new Gates.BasicGates.And(); andc.Add(mand); andc[new Gates.Terminal(0, mand)] = new Gates.Terminal(0, in1); andc[new Gates.Terminal(1, mand)] = new Gates.Terminal(0, in1); andc[new Gates.Terminal(0, out1)] = new Gates.Terminal(0, mand); } return(new Gates.IC(andc, new Gates.IOGates.UserInput[] { in1 }, new Gates.IOGates.UserOutput[] { out1 }, "AndChain")); }
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 PropagationTest() { // this test checks for the accuracy // of wait for propagation // by determining if it fully waits for all propagation // to occur through the contained sub-circuits // this came from a problem where all sub-circuits // were instructed to wait BUT // the loop didn't repeat this based on that // so one could pass off an incomplete result // to another and the waiting could end before // it was all really done Gates.Circuit c = new Gates.Circuit(); c.Start(); // EXTREMELY SPECIFIC // The long chain appears FIRST in the circuit add list // But the input connects to the short chain first // Then the wait waits on the long chain, which has nothing // then briefly on the short chain, which passes a change // to the long chain... // but it DOESN'T wait for the long chain to finish // (because it already waited on the long chain before it had any work!) Gates.IC ac1 = CreateAndChain(64); Gates.IC ac2 = CreateAndChain(10); Gates.IOGates.UserInput ui = new Gates.IOGates.UserInput(); Gates.BasicGates.And mand = new Gates.BasicGates.And(); c.Add(ac1); c.Add(ac2); c.Add(ui); c.Add(mand); c[new Gates.Terminal(0, ac2)] = new Gates.Terminal(0, ui); c[new Gates.Terminal(0, ac1)] = new Gates.Terminal(0, ac2); c[new Gates.Terminal(0, mand)] = new Gates.Terminal(0, ac1); c[new Gates.Terminal(1, mand)] = new Gates.Terminal(0, ac2); ui.Value = false; Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(false, mand.Output[0]); ui.Value = true; Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(true, mand.Output[0]); }
public void NorInCiruit() { Gates.IC nor = CreateNor(); Gates.Circuit c = new Gates.Circuit(); c.Start(); c.Add(nor); // primarily just tests that c's wait // also makes the nor wait nor[0] = false; nor[1] = true; Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(false, nor.Output[0]); nor[0] = true; nor[1] = false; Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(false, nor.Output[0]); nor[0] = false; nor[1] = false; Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(true, nor.Output[0]); nor[0] = true; nor[1] = true; Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(false, nor.Output[0]); }
public void SRLatch() { Gates.Circuit c = new Gates.Circuit(); c.Start(); Gates.IOGates.UserInput ui_r = new Gates.IOGates.UserInput(); Gates.IOGates.UserInput ui_s = new Gates.IOGates.UserInput(); Gates.IOGates.UserOutput uo = new Gates.IOGates.UserOutput(); Gates.IC latch = CreateSRLatch(); c.Add(ui_r); c.Add(ui_s); c.Add(uo); c.Add(latch); c[new Gates.Terminal(0, latch)] = new Gates.Terminal(0, ui_r); c[new Gates.Terminal(1, latch)] = new Gates.Terminal(0, ui_s); c[new Gates.Terminal(0, uo)] = new Gates.Terminal(0, latch); for (int i = 0; i < 4; i++) { // SET ui_r.Value = false; ui_s.Value = true; Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(true, uo.Value); // HOLD ui_r.Value = false; ui_s.Value = false; Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(true, uo.Value); // RESET ui_r.Value = true; ui_s.Value = false; Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(false, uo.Value); // HOLD ui_r.Value = false; ui_s.Value = false; Gates.PropagationThread.Instance.WaitOnPropagation(); Assert.AreEqual(false, uo.Value); } }
// // You can use the following additional attributes as you write your tests: // // Use ClassInitialize to run code before running the first test in the class // [ClassInitialize()] // public static void MyClassInitialize(TestContext testContext) { } // // Use ClassCleanup to run code after all tests in a class have run // [ClassCleanup()] // public static void MyClassCleanup() { } // // Use TestInitialize to run code before running each test // [TestInitialize()] // public void MyTestInitialize() { } // // Use TestCleanup to run code after each test has run // [TestCleanup()] // public void MyTestCleanup() { } // #endregion Gates.IC CreateNor() { Gates.Circuit nor = new Gates.Circuit(); nor.Start(); 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 Gates.Terminal(0, mnot1)] = new Gates.Terminal(0, in1); nor[new Gates.Terminal(0, mnot2)] = new Gates.Terminal(0, in2); nor[new Gates.Terminal(0, mand)] = new Gates.Terminal(0, mnot1); nor[new Gates.Terminal(1, mand)] = new Gates.Terminal(0, mnot2); nor[new Gates.Terminal(0, out1)] = new Gates.Terminal(0, mand); return(new Gates.IC(nor, new Gates.IOGates.UserInput[] { in1, in2 }, new Gates.IOGates.UserOutput[] { out1 }, "Nor")); }
Gates.IC CreateSRLatch() { Gates.Circuit sr = new Gates.Circuit(); sr.Start(); Gates.IC nor1 = CreateNor(); Gates.IC nor2 = CreateNor(); Gates.IOGates.UserInput in1 = new Gates.IOGates.UserInput(); Gates.IOGates.UserInput in2 = new Gates.IOGates.UserInput(); Gates.IOGates.UserOutput out1 = new Gates.IOGates.UserOutput(); Gates.IOGates.UserOutput out2 = new Gates.IOGates.UserOutput(); sr.Add(nor1); sr.Add(nor2); sr.Add(in1); sr.Add(in2); sr.Add(out1); sr.Add(out2); sr[new Gates.Terminal(0, nor1)] = new Gates.Terminal(0, in1); sr[new Gates.Terminal(1, nor2)] = new Gates.Terminal(0, in2); sr[new Gates.Terminal(1, nor1)] = new Gates.Terminal(0, nor2); sr[new Gates.Terminal(0, nor2)] = new Gates.Terminal(0, nor1); sr[new Gates.Terminal(0, out1)] = new Gates.Terminal(0, nor1); sr[new Gates.Terminal(0, out2)] = new Gates.Terminal(0, nor2); return(new Gates.IC(sr, new Gates.IOGates.UserInput[] { in1, in2 }, new Gates.IOGates.UserOutput[] { out1, out2 }, "SRLatch")); }
/// <summary> /// Given an XML circuit representation, create an IC. /// The local IC List will be used to deference any nested ICs. /// </summary> /// <param name="circuit"></param> /// <returns></returns> public UIGates.IC LoadCircuit(XElement circuit) { Gates.Circuit c = new Gates.Circuit(); Dictionary <int, Gates.AbstractGate> gid = new Dictionary <int, Gates.AbstractGate>(); Dictionary <Gates.AbstractGate, GateLocation> gpt = new Dictionary <Gates.AbstractGate, GateLocation>(); foreach (XElement gate in circuit.Element("Gates").Elements()) { Gates.AbstractGate abgate = CreateGate(gate); c.Add(abgate); gid.Add(int.Parse(gate.Attribute("ID").Value), abgate); double x = double.Parse(gate.Element("Point").Attribute("X").Value); double y = double.Parse(gate.Element("Point").Attribute("Y").Value); double angle = double.Parse(gate.Element("Point").Attribute("Angle").Value); gpt.Add(abgate, new GateLocation() { X = x, Y = y, Angle = angle }); } foreach (XElement wire in circuit.Element("Wires").Elements()) { c[CreateTerminal(gid, wire.Element("To"))] = CreateTerminal(gid, wire.Element("From")); } ICBuilder icb = new ICBuilder(c, (Gates.AbstractGate abgate) => { return(gpt[abgate]); }); // for top level circuit, must not create terminals // otherwise input/output overridden if (circuit.Attribute("Name") != null) { string cname = circuit.Attribute("Name").Value; // check first if we need to rename if (UpdateICNames.ContainsKey(cname)) { cname = UpdateICNames[cname]; } return(icb.CreateIC(cname)); } else { return(icb.CreateNonTerminaledIC("")); } }
/// <summary> /// Given an XML circuit representation, create an IC. /// The local IC List will be used to deference any nested ICs. /// </summary> /// <param name="circuit"></param> /// <returns></returns> public UIGates.IC LoadCircuit(XElement circuit) { Gates.Circuit c = new Gates.Circuit(); Dictionary<int, Gates.AbstractGate> gid = new Dictionary<int, Gates.AbstractGate>(); Dictionary<Gates.AbstractGate, GateLocation> gpt = new Dictionary<Gates.AbstractGate, GateLocation>(); foreach (XElement gate in circuit.Element("Gates").Elements()) { Gates.AbstractGate abgate = CreateGate(gate); c.Add(abgate); gid.Add(int.Parse(gate.Attribute("ID").Value), abgate); double x = double.Parse(gate.Element("Point").Attribute("X").Value); double y = double.Parse(gate.Element("Point").Attribute("Y").Value); double angle = double.Parse(gate.Element("Point").Attribute("Angle").Value); gpt.Add(abgate, new GateLocation(x, y, angle)); } foreach (XElement wire in circuit.Element("Wires").Elements()) { c[CreateTerminal(gid, wire.Element("To"))] = CreateTerminal(gid, wire.Element("From")); } ICBuilder icb = new ICBuilder(c, (Gates.AbstractGate abgate) => { return gpt[abgate]; }); // for top level circuit, must not create terminals // otherwise input/output overridden if (circuit.Attribute("Name") != null) { string cname = circuit.Attribute("Name").Value; // check first if we need to rename if (UpdateICNames.ContainsKey(cname)) cname = UpdateICNames[cname]; return icb.CreateIC(cname); } else return icb.CreateNonTerminaledIC(""); }
public InterTree ParseXElement(XElement root) { parsedWires.Clear(); diagramGid.Clear(); XElement circuit = root.Element("Circuit"); //Like load XElement if (root.Attribute("Version") != null && root.Attribute("Version").Value != "1.2") throw new Exception("Unsupport version " + root.Attribute("Version").Value); Gates.Circuit c = new Gates.Circuit(); XElement outputGate = null; foreach (XElement gate in circuit.Element("Gates").Elements()) { Gates.AbstractGate abgate = this.CreateGate(gate); if (gate.Attribute("Type").Value == "UserOutput") { outputGate = gate; } c.Add(abgate); int gateIDTest = int.Parse(gate.Attribute("ID").Value); diagramGid.Add(int.Parse(gate.Attribute("ID").Value), abgate); } if(outputGate == null) return null; char letter = outputGate.Attribute("Name").Value[0]; InterTree rootInterTree = new InterTree(InterTree.LogicOperator.EQUAL); rootInterTree.LeftNode = new InterTree(letter.ToString()); int gateID = int.Parse(outputGate.Attribute("ID").Value); ConvertXElementToInterTree(gateID, ref rootInterTree, circuit); return rootInterTree; }