public void Constructor()
        {
            // arrange, act
            var counter = new CounterRipple16("test");

            // assert
            Assert.AreEqual(VoltageSignal.LOW, counter.V.V, "Constructor: Voltage");
            Assert.AreEqual(VoltageSignal.LOW, counter.Clk.V, "Constructor: Clk");
            Assert.AreEqual(VoltageSignal.LOW, counter.Clr.V, "Constructor: Clr");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q0.V, "Constructor: Q0");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q1.V, "Constructor: Q1");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q2.V, "Constructor: Q2");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q3.V, "Constructor: Q3");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q4.V, "Constructor: Q4");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q5.V, "Constructor: Q5");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q6.V, "Constructor: Q6");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q7.V, "Constructor: Q7");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q8.V, "Constructor: Q8");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q9.V, "Constructor: Q9");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q10.V, "Constructor: Q10");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q11.V, "Constructor: Q11");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q12.V, "Constructor: Q12");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q13.V, "Constructor: Q13");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q14.V, "Constructor: Q14");
            Assert.AreEqual(VoltageSignal.LOW, counter.Q15.V, "Constructor: Q15");
            Assert.AreEqual("0000000000000000", counter.ToString(), "Contructor: ToString()");
        }
        public void Counter_driven_by_Oscillator()
        {
            var counter    = new CounterRipple16("test");
            var oscillator = new Oscillator("test", 0x10000);

            counter.V.V = oscillator.V.V = VoltageSignal.HIGH;

            oscillator.Output.ConnectTo(counter.Clk);
            //oscillator.Output.Changed += output => { if (output.V == VoltageSignal.LOW) System.Diagnostics.Trace.TraceInformation(counter.ToString()); };

            oscillator.Start();
        }
        public void Counter()
        {
            // arrange
            var counter = new CounterRipple16("test");

            counter.V.V = VoltageSignal.HIGH;

            // act, assert
            for (uint i = 0; i < 0x10000; ++i)
            {
                TestCount(counter, (ushort)i);
                counter.Clk.V = VoltageSignal.HIGH;
                counter.Clk.V = VoltageSignal.LOW;
            }
            Assert.AreEqual(0x0000, GetCount(counter), "wraparound; count all 0's");
        }
 private static void TestCount(CounterRipple16 counter, ushort count)
 {
     Assert.IsTrue((count & 0x0001) != 0 ? (counter.Q0.V == VoltageSignal.HIGH) : (counter.Q0.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x0002) != 0 ? (counter.Q1.V == VoltageSignal.HIGH) : (counter.Q1.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x0004) != 0 ? (counter.Q2.V == VoltageSignal.HIGH) : (counter.Q2.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x0008) != 0 ? (counter.Q3.V == VoltageSignal.HIGH) : (counter.Q3.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x0010) != 0 ? (counter.Q4.V == VoltageSignal.HIGH) : (counter.Q4.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x0020) != 0 ? (counter.Q5.V == VoltageSignal.HIGH) : (counter.Q5.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x0040) != 0 ? (counter.Q6.V == VoltageSignal.HIGH) : (counter.Q6.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x0080) != 0 ? (counter.Q7.V == VoltageSignal.HIGH) : (counter.Q7.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x0100) != 0 ? (counter.Q8.V == VoltageSignal.HIGH) : (counter.Q8.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x0200) != 0 ? (counter.Q9.V == VoltageSignal.HIGH) : (counter.Q9.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x0400) != 0 ? (counter.Q10.V == VoltageSignal.HIGH) : (counter.Q10.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x0800) != 0 ? (counter.Q11.V == VoltageSignal.HIGH) : (counter.Q11.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x1000) != 0 ? (counter.Q12.V == VoltageSignal.HIGH) : (counter.Q12.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x2000) != 0 ? (counter.Q13.V == VoltageSignal.HIGH) : (counter.Q13.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x4000) != 0 ? (counter.Q14.V == VoltageSignal.HIGH) : (counter.Q14.V == VoltageSignal.LOW));
     Assert.IsTrue((count & 0x8000) != 0 ? (counter.Q15.V == VoltageSignal.HIGH) : (counter.Q15.V == VoltageSignal.LOW));
 }
        public void TestClear()
        {
            // arrange
            var counter = new CounterRipple16("test");

            counter.V.V = VoltageSignal.HIGH;

            // act, assert
            counter.Clr.V = VoltageSignal.HIGH;
            counter.Clk.V = VoltageSignal.HIGH;
            counter.Clk.V = VoltageSignal.LOW;
            Assert.AreEqual(0x0000, GetCount(counter), "Counter on; Clr: H; Clk: ^v; count still all 0's");

            counter.Clr.V = VoltageSignal.LOW;
            counter.Clk.V = VoltageSignal.HIGH;
            counter.Clk.V = VoltageSignal.LOW;
            Assert.AreEqual(0x0001, GetCount(counter), "Counter on; Clr: L; Clk: ^v; count increments");

            counter.Clr.V = VoltageSignal.HIGH;
            counter.Clk.V = VoltageSignal.HIGH;
            counter.Clk.V = VoltageSignal.LOW;
            Assert.AreEqual(0x0000, GetCount(counter), "Counter on; Clr: H; Clk: ^v; count still all 0's");
        }
        private static ushort GetCount(CounterRipple16 counter)
        {
            ushort count = 0x00;

            count |= (counter.Q0.V == VoltageSignal.HIGH ? (ushort)0x0001 : (ushort)0x00);
            count |= (counter.Q1.V == VoltageSignal.HIGH ? (ushort)0x0002 : (ushort)0x00);
            count |= (counter.Q2.V == VoltageSignal.HIGH ? (ushort)0x0004 : (ushort)0x00);
            count |= (counter.Q3.V == VoltageSignal.HIGH ? (ushort)0x0008 : (ushort)0x00);
            count |= (counter.Q4.V == VoltageSignal.HIGH ? (ushort)0x0010 : (ushort)0x00);
            count |= (counter.Q5.V == VoltageSignal.HIGH ? (ushort)0x0020 : (ushort)0x00);
            count |= (counter.Q6.V == VoltageSignal.HIGH ? (ushort)0x0040 : (ushort)0x00);
            count |= (counter.Q7.V == VoltageSignal.HIGH ? (ushort)0x0080 : (ushort)0x00);
            count |= (counter.Q8.V == VoltageSignal.HIGH ? (ushort)0x0100 : (ushort)0x00);
            count |= (counter.Q9.V == VoltageSignal.HIGH ? (ushort)0x0200 : (ushort)0x00);
            count |= (counter.Q10.V == VoltageSignal.HIGH ? (ushort)0x0400 : (ushort)0x00);
            count |= (counter.Q11.V == VoltageSignal.HIGH ? (ushort)0x0800 : (ushort)0x00);
            count |= (counter.Q12.V == VoltageSignal.HIGH ? (ushort)0x1000 : (ushort)0x00);
            count |= (counter.Q13.V == VoltageSignal.HIGH ? (ushort)0x2000 : (ushort)0x00);
            count |= (counter.Q14.V == VoltageSignal.HIGH ? (ushort)0x4000 : (ushort)0x00);
            count |= (counter.Q15.V == VoltageSignal.HIGH ? (ushort)0x8000 : (ushort)0x00);

            return(count);
        }