Example #1
0
        public override bool TestGate()
        {
            for (int k = 1; k >= 0; k--)
            {
                Control.Value = k;
                for (int i = 0; i < Math.Pow(2, Size); i++)
                {
                    BitwiseDemux mgDemux = new BitwiseDemux(Size);
                    WireSet      ws      = new WireSet(Size);
                    ws.SetValue(i);
                    mgDemux.ConnectInput(ws);
                    mgDemux.ConnectControl(Control);

                    for (int j = Size - 1; j >= 0; j--)
                    {
                        if (k == 0)
                        {
                            if (mgDemux.Output1[j].Value != ws[j].Value || mgDemux.Output2[j].Value != 0)
                            {
                                return(false);
                            }
                        }
                        else if (mgDemux.Output1[j].Value != ws[j].Value ||
                                 mgDemux.Output2[j].Value != 0)
                        {
                            return(false);
                        }
                    }
                }
            }
            return(true);
        }
Example #2
0
        public override bool TestGate()
        {
            BitwiseDemux bwdm;
            Demux        m_gLocalDemux;
            Wire         w_local = new Wire();

            for (int l = 0; l < 2; l++)
            {
                w_local.Value = l;

                for (int j = 0; j < Math.Pow(2, Size); j++)
                {
                    bwdm = new BitwiseDemux(Size);
                    bwdm.Input.ConnectInput(InitTestVariables(j));
                    bwdm.ConnectControl(w_local);

                    for (int i = 0; i < Size; i++)
                    {
                        m_gLocalDemux = new Demux();
                        m_gLocalDemux.ConnectInput(bwdm.Input[i]);
                        m_gLocalDemux.ConnectControl(bwdm.Control);
                        if (bwdm.Output1[i].Value != m_gLocalDemux.Output1.Value || bwdm.Output2[i].Value != m_gLocalDemux.Output2.Value)
                        {
                            return(false);
                        }
                    }
                    //// UNCOMMENT THIS LINES TO SEE THE DEBUG PRINT
                    //System.Console.WriteLine("    Testing input " + " -> " + WStoString(bwdm.Input));
                    //System.Console.WriteLine("    Testing control " + " -> " + bwdm.Control);
                    //System.Console.WriteLine("    Testing output1 " + " -> " + WStoString(bwdm.Output1));
                    //System.Console.WriteLine("    Testing output2 " + " -> " + WStoString(bwdm.Output2));
                }
            }
            return(true);
        }
Example #3
0
        public BitwiseMultiwayDemux(int iSize, int cControlBits)
        {
            Size    = iSize;
            Input   = new WireSet(Size);
            Control = new WireSet(cControlBits);
            Outputs = new WireSet[(int)Math.Pow(2, cControlBits)];

            for (int i = 0; i < Outputs.Length; i++)
            {
                Outputs[i] = new WireSet(Size);
            }

            Queue <WireSet> temp1 = new Queue <WireSet>();
            Queue <WireSet> temp2 = new Queue <WireSet>();

            temp1.Enqueue(Input);
            int level = cControlBits - 1;

            while (level != -1)
            {
                if (temp1.Count == 0)
                {
                    while (temp2.Count != 0)
                    {
                        bitwiseDemux = new BitwiseDemux(iSize);
                        bitwiseDemux.ConnectControl(Control[level]);

                        bitwiseDemux.ConnectInput(temp2.Dequeue());
                        temp1.Enqueue(bitwiseDemux.Output1);
                        temp1.Enqueue(bitwiseDemux.Output2);
                    }
                }
                else if (temp2.Count == 0)
                {
                    while (temp1.Count != 0)
                    {
                        bitwiseDemux = new BitwiseDemux(iSize);
                        bitwiseDemux.ConnectControl(Control[level]);

                        bitwiseDemux.ConnectInput(temp1.Dequeue());
                        temp2.Enqueue(bitwiseDemux.Output1);
                        temp2.Enqueue(bitwiseDemux.Output2);
                    }
                }
                level--;
            }

            int j = 0;

            while (temp1.Count != 0)
            {
                Outputs[j].ConnectInput(temp1.Dequeue());
                j++;
            }
            while (temp2.Count != 0)
            {
                Outputs[j].ConnectInput(temp2.Dequeue());
                j++;
            }
        }
Example #4
0
        //your code here

        public BitwiseMultiwayDemux(int iSize, int cControlBits)
        {
            Size    = iSize;
            Input   = new WireSet(Size);
            Control = new WireSet(cControlBits);
            Outputs = new WireSet[(int)Math.Pow(2, cControlBits)];
            for (int i = 0; i < Outputs.Length; i++)
            {
                Outputs[i] = new WireSet(Size);
            }

            BitwiseDemux[] demux = new BitwiseDemux[(int)Math.Pow(2, cControlBits) - 1];


            int currentDemux   = 0;
            int maxDemux       = 0;
            int currentControl = cControlBits - 1;

            demux[0] = new BitwiseDemux(Size);
            demux[0].ConnectInput(Input);
            demux[0].ConnectControl(Control[currentControl]);
            currentControl--;

            for (int i = 1; i < cControlBits; i++)
            {
                while (currentDemux <= maxDemux)
                {
                    demux[currentDemux * 2 + 1] = new BitwiseDemux(Size);
                    demux[currentDemux * 2 + 1].ConnectInput(demux[currentDemux].Output1);
                    demux[currentDemux * 2 + 1].ConnectControl(Control[currentControl]);
                    demux[currentDemux * 2 + 2] = new BitwiseDemux(Size);
                    demux[currentDemux * 2 + 2].ConnectInput(demux[currentDemux].Output2);
                    demux[currentDemux * 2 + 2].ConnectControl(Control[currentControl]);

                    currentDemux++;
                }


                maxDemux += (int)Math.Pow(2, i);
                currentControl--;
            }



            int c = 0;

            for (int j = ((demux.Length + 1) / 2) - 1; j < demux.Length; j++)
            {
                Outputs[c].ConnectInput(demux[j].Output1);
                Outputs[c + 1].ConnectInput(demux[j].Output2);



                c = c + 2;
            }
        }
Example #5
0
        public BitwiseMultiwayDemux(int iSize, int cControlBits)
        {
            Size    = iSize;
            Input   = new WireSet(Size);
            Control = new WireSet(cControlBits);
            Outputs = new WireSet[(int)Math.Pow(2, cControlBits)];
            for (int i = 0; i < Outputs.Length; i++)
            {
                Outputs[i] = new WireSet(Size);
            }

            BitwiseDemux[] demuxes = new BitwiseDemux[Outputs.Length - 1];

            demuxes[0] = new BitwiseDemux(Size);
            demuxes[0].ConnectControl(Control[cControlBits - 1]);

            for (int i = 1, index2 = 1, nextStep = 1, currControl = cControlBits - 1; i < demuxes.Length; i++)
            {
                demuxes[i] = new BitwiseDemux(Size);
                if (i == index2)
                {
                    currControl--;
                    demuxes[index2].ConnectControl(Control[currControl]);
                    index2   += nextStep * 2;
                    nextStep *= 2;
                }
                else
                {
                    demuxes[i].ConnectControl(Control[currControl]);
                }
            }

            try
            {
                for (int position = demuxes.Length / 2, j = 0, i = demuxes.Length / 2; i >= 0; i--)
                {
                    Outputs[j].ConnectInput(demuxes[position].Output1);
                    Outputs[j + 1].ConnectInput(demuxes[position].Output2);
                    j = j + 2;
                    position++;
                }

                for (int currDemux = demuxes.Length - 1, index0 = demuxes.Length / 2 - 1, i = index0; i >= 0; i--)
                {
                    demuxes[currDemux].ConnectInput(demuxes[index0].Output2);
                    demuxes[currDemux - 1].ConnectInput(demuxes[index0].Output1);
                    index0--;
                    currDemux -= 2;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally{ demuxes[0].ConnectInput(Input); }
        }
Example #6
0
        public BitwiseMultiwayDemux(int iSize, int cControlBits)
        {
            Size    = iSize;
            Input   = new WireSet(Size);
            Control = new WireSet(cControlBits);
            Outputs = new WireSet[(int)Math.Pow(2, cControlBits)];
            for (int i = 0; i < Outputs.Length; i++)
            {
                Outputs[i] = new WireSet(Size);
            }
            //your code here

            int numOfOutputs = Outputs.Length;

            m_gBitwiseDemux = new BitwiseDemux[numOfOutputs - 1];
            for (int i = 0; i < m_gBitwiseDemux.Length; i++)
            {
                m_gBitwiseDemux[i] = new BitwiseDemux(Size);
            }

            int currOutputsToConnect = Outputs.Length - 1;
            int currGateToConnect    = m_gBitwiseDemux.Length - 1;
            int level          = 1;
            int currNumOfGates = numOfOutputs / 2;


            for (int j = 0; j < currNumOfGates; j++) //connecting all the last level gates to outputs
            {
                Outputs[currOutputsToConnect].ConnectInput(m_gBitwiseDemux[currGateToConnect].Output2);
                Outputs[currOutputsToConnect - 1].ConnectInput(m_gBitwiseDemux[currGateToConnect].Output1);
                m_gBitwiseDemux[currGateToConnect].ConnectControl(Control[level - 1]);
                currGateToConnect--;
                currOutputsToConnect -= 2;
            }

            int previousGatesIndex = numOfOutputs - 2;

            for (level = 2; level <= numOfOutputs; level++) // connectig gates' outputs to next level gates' inputs
            {
                currNumOfGates = currNumOfGates / 2;
                for (int j = 0; j < currNumOfGates; j++) //connecting all the inputs to gates
                {
                    m_gBitwiseDemux[previousGatesIndex].ConnectInput(m_gBitwiseDemux[currGateToConnect].Output2);
                    m_gBitwiseDemux[previousGatesIndex - 1].ConnectInput(m_gBitwiseDemux[currGateToConnect].Output1);
                    m_gBitwiseDemux[currGateToConnect].ConnectControl(Control[level - 1]);
                    currGateToConnect--;
                    previousGatesIndex -= 2;
                }
            }

            m_gBitwiseDemux[currGateToConnect + 1].ConnectInput(Input);
        }
Example #7
0
        // similar procudre to the multimux just the opposite - creates bitwise demux array
        // saves the 2 outputs as input of new bitwise demux
        // the cotrol bit are checking in reverse order
        public BitwiseMultiwayDemux(int iSize, int cControlBits)
        {
            //initilaize
            Size    = iSize;
            Input   = new WireSet(Size);
            Control = new WireSet(cControlBits);
            Outputs = new WireSet[(int)Math.Pow(2, cControlBits)];
            bitwise_demux_operation = new BitwiseDemux[(int)Math.Pow(2, cControlBits) - 1];

            for (int i = 0; i < Outputs.Length; i++)
            {
                Outputs[i] = new WireSet(Size);
            }

            for (int i = 0; i < bitwise_demux_operation.Length; i++)
            {
                bitwise_demux_operation[i] = new BitwiseDemux(Size);
            }

            // making demux on the input with the last contol bit - to save in the array
            bitwise_demux_operation[0].ConnectControl(Control[cControlBits - 1]);
            bitwise_demux_operation[0].ConnectInput(Input);

            // for each control bit making bitwise demux on all the outputs in that level
            // the outputs in last half of the bitwise demux array are the final outputs
            int start_of_input = 0, end_of_input = 1, counter = 0, iterator = 1;

            for (int contol_bit = cControlBits - 2; contol_bit > -1; contol_bit--)
            {
                for (int out_bit = start_of_input; out_bit < end_of_input; out_bit++)
                {
                    bitwise_demux_operation[counter + end_of_input].ConnectControl(Control[contol_bit]);
                    bitwise_demux_operation[counter + end_of_input + 1].ConnectControl(Control[contol_bit]);
                    bitwise_demux_operation[counter + end_of_input].ConnectInput(bitwise_demux_operation[out_bit].Output1);
                    bitwise_demux_operation[counter + end_of_input + 1].ConnectInput(bitwise_demux_operation[out_bit].Output2);
                    counter = counter + 2;
                }
                counter        = 0;
                start_of_input = end_of_input;
                end_of_input   = end_of_input + 2 * iterator;
                iterator++;
            }

            // connects the outputs
            counter = 0;
            for (int start = bitwise_demux_operation.Length / 2; start < bitwise_demux_operation.Length; start++)
            {
                Outputs[counter].ConnectInput(bitwise_demux_operation[start].Output1);
                Outputs[counter + 1].ConnectInput(bitwise_demux_operation[start].Output2);
                counter = counter + 2;
            }
        }
        public BitwiseMultiwayDemux(int iSize, int cControlBits)
        {
            Size    = iSize;
            Input   = new WireSet(Size);
            Control = new WireSet(cControlBits);
            Outputs = new WireSet[(int)Math.Pow(2, cControlBits)];
            for (int i = 0; i < Outputs.Length; i++)
            {
                Outputs[i] = new WireSet(Size);
            }
            //your code here

            bwdmx = new BitwiseDemux[(int)Math.Pow(2, cControlBits) - 1];

            for (int i = 0; i < bwdmx.Length; i++)
            {
                bwdmx[i] = new BitwiseDemux(iSize);
            }

            bwdmx[0].ConnectInput(Input);

            //Level
            int j = 0;

            for (int i = 0; 2 * i + 2 < bwdmx.Length; i++)
            {
                bwdmx[2 * i + 1].ConnectInput(bwdmx[i].Output1);
                bwdmx[2 * i + 2].ConnectInput(bwdmx[i].Output2);
                j = i + 1;
            }

            for (int i = 0; i < Outputs.Length; i = i + 2)
            {
                Outputs[i].ConnectInput(bwdmx[j].Output1);
                Outputs[i + 1].ConnectInput(bwdmx[j].Output2);
                j++;
            }

            int k = 0;

            for (int i = 0; i < bwdmx.Length; i++)
            {
                if (i == (int)Math.Pow(2, k + 1) - 1)
                {
                    k++;
                }

                bwdmx[i].ConnectControl(Control[Control.Size - k - 1]);
            }
        }
Example #9
0
        public BitwiseMultiwayDemux(int iSize, int cControlBits)
        {
            Size         = iSize;
            Input        = new WireSet(Size);
            Control      = new WireSet(cControlBits);
            Outputs      = new WireSet[(int)Math.Pow(2, cControlBits)];
            demux        = new BitwiseDemux[Outputs.Length];
            demuxOutputs = new WireSet[2 * demux.Length];
            int freeDemux = 1, whereToStart = 0, whereToEnd = 2;

            for (int i = 0; i < Outputs.Length; i++)
            {
                Outputs[i] = new WireSet(Size);
                demux[i]   = new BitwiseDemux(Size);
            }
            for (int a = 0; a < demuxOutputs.Length; a++)
            {
                demuxOutputs[a] = new WireSet(Size);
            }
            demux[0].ConnectControl(Control[Control.Size - 1]);//CHANGED
            demux[0].ConnectInput(Input);
            demuxOutputs[0].ConnectInput(demux[0].Output1);
            demuxOutputs[1].ConnectInput(demux[0].Output2);

            for (int j = 1; j < cControlBits; j++)
            {
                for (int k = whereToStart; k < whereToEnd; k++)
                {
                    demux[freeDemux].ConnectInput(demuxOutputs[whereToStart]);
                    demux[freeDemux].ConnectControl(Control[Control.Size - j - 1]); //CHANGED
                    demuxOutputs[2 * freeDemux].ConnectInput(demux[freeDemux].Output1);
                    demuxOutputs[(2 * freeDemux) + 1].ConnectInput(demux[freeDemux].Output2);
                    freeDemux++;
                    whereToStart++;
                }
                whereToEnd = 2 * freeDemux;
            }
            for (int l = 0; l < Outputs.Length; l++)
            {
                Outputs[l].ConnectInput(demuxOutputs[l + whereToStart]);
            }
        }
Example #10
0
        static void Main(string[] args)
        {
            OrGate               or        = new OrGate();
            XorGate              xor       = new XorGate();
            AndGate              and       = new AndGate();
            MuxGate              mux       = new MuxGate();
            Demux                demux     = new Demux();
            HalfAdder            halfAdder = new HalfAdder();
            FullAdder            fullAdder = new FullAdder();
            WireSet              wireSet   = new WireSet(9);
            BitwiseAndGate       bwag      = new BitwiseAndGate(2);
            BitwiseNotGate       bwng      = new BitwiseNotGate(3);
            BitwiseOrGate        bwog      = new BitwiseOrGate(2);
            BitwiseMux           bwm       = new BitwiseMux(2);
            BitwiseDemux         bwd       = new BitwiseDemux(2);
            MultiBitAndGate      mbag      = new MultiBitAndGate(4);
            MultiBitAdder        mba       = new MultiBitAdder(3);
            BitwiseMultiwayMux   bwmwm     = new BitwiseMultiwayMux(5, 4);
            BitwiseMultiwayDemux bwmwd     = new BitwiseMultiwayDemux(4, 4);
            SingleBitRegister    sbr       = new SingleBitRegister();
            MultiBitRegister     mbr       = new MultiBitRegister(4);

            if (!sbr.TestGate())
            {
                Console.WriteLine("SingleBitRegisterbugbug");
            }
            if (!mbr.TestGate())
            {
                Console.WriteLine("MultiBitRegisterbugbug");
            }
            ALU alu = new ALU(4);

            if (!alu.TestGate())
            {
                Console.WriteLine("ALUbugbug");
            }
            if (!bwmwd.TestGate())
            {
                Console.WriteLine("BitwiseMultiwayDemuxbugbug");
            }
            if (!bwmwm.TestGate())
            {
                Console.WriteLine("BitwiseMultiwayMuxbugbug");
            }
            if (!mba.TestGate())
            {
                Console.WriteLine("MultiBitAdderbugbug");
            }
            if (!mbag.TestGate())
            {
                Console.WriteLine("MultiBitAndGatebugbug");
            }
            if (!bwd.TestGate())
            {
                Console.WriteLine("BitWiseDemuxbugbug");
            }
            if (!bwm.TestGate())
            {
                Console.WriteLine("BitWiseMuxbugbug");
            }
            if (!bwog.TestGate())
            {
                Console.WriteLine("BitWiseOrGatebugbug");
            }
            if (!bwng.TestGate())
            {
                Console.WriteLine("BitWiseNotGatebugbug");
            }
            if (!bwag.TestGate())
            {
                Console.WriteLine("BitWiseAndGatebugbug");
            }
            wireSet.SetValue(137);
            wireSet.Set2sComplement(-32);
            if (!and.TestGate())
            {
                Console.WriteLine("andbugbug");
            }
            if (!or.TestGate())
            {
                Console.WriteLine("orbugbug");
            }
            if (!xor.TestGate())
            {
                Console.WriteLine("xorbugbug");
            }
            if (!mux.TestGate())
            {
                Console.WriteLine("muxbugbug");
            }
            if (!demux.TestGate())
            {
                Console.WriteLine("demuxbugbug");
            }
            if (!halfAdder.TestGate())
            {
                Console.WriteLine("HAbugbug");
            }
            if (!fullAdder.TestGate())
            {
                Console.WriteLine("FAbugbug");
            }
            Memory memory = new Memory(2, 6);

            if (!memory.TestGate())
            {
                Console.WriteLine("Membugbug");
            }
            Console.WriteLine("done");
            Console.ReadLine();
        }
Example #11
0
        static void Main(string[] args)
        {
            AndGate   and   = new AndGate();
            OrGate    or    = new OrGate();
            XorGate   xor   = new XorGate();
            MuxGate   mux   = new MuxGate();
            Demux     demux = new Demux();
            HalfAdder ha    = new HalfAdder();
            FullAdder fa    = new FullAdder();

            if (!and.TestGate())
            {
                Console.WriteLine("bugbug");
            }



            Console.WriteLine("done And");

            if (!or.TestGate())
            {
                Console.WriteLine("bugbug");
            }



            Console.WriteLine("done Or");

            if (!xor.TestGate())
            {
                Console.WriteLine("bugbug");
            }



            Console.WriteLine("done Xor");

            if (!mux.TestGate())
            {
                Console.WriteLine("bugbug");
            }



            Console.WriteLine("done Mux");

            if (!demux.TestGate())
            {
                Console.WriteLine("bugbug");
            }



            Console.WriteLine("done Demux");

            if (!ha.TestGate())
            {
                Console.WriteLine("bugbug");
            }



            Console.WriteLine("done HalfAdder");

            if (!fa.TestGate())
            {
                Console.WriteLine("bugbug");
            }



            Console.WriteLine("done FullAdder");



            WireSet num = new WireSet(4);

            num.SetValue(6);
            Console.WriteLine(num.ToString());
            Console.WriteLine(num.GetValue());

            Console.WriteLine("trying 2's complement");
            WireSet num2 = new WireSet(4);

            num2.Set2sComplement(6);
            Console.WriteLine(num2.Get2sComplement());
            WireSet num3 = new WireSet(4);

            num3.Set2sComplement(-2);
            Console.WriteLine(num3.Get2sComplement());

            BitwiseAndGate BWAnd = new BitwiseAndGate(3);

            BWAnd.TestGate();

            BitwiseNotGate BWNot = new BitwiseNotGate(3);

            BWNot.TestGate();

            BitwiseOrGate BWOr = new BitwiseOrGate(3);

            BWOr.TestGate();

            BitwiseMux BWMux = new BitwiseMux(3);

            BWMux.TestGate();

            BitwiseDemux BWDemux = new BitwiseDemux(3);

            BWDemux.TestGate();

            MultiBitAndGate multiAnd = new MultiBitAndGate(3);

            multiAnd.TestGate();

            MultiBitAdder multiAdd = new MultiBitAdder(5);

            multiAdd.TestGate();

            BitwiseMultiwayMux multimux = new BitwiseMultiwayMux(8, 2);

            WireSet[] inp = new WireSet[4];
            inp[0] = new WireSet(8);
            inp[0].Set2sComplement(1);
            multimux.ConnectInput(0, inp[0]);
            inp[1] = new WireSet(8);
            inp[1].Set2sComplement(2);
            multimux.ConnectInput(1, inp[1]);
            inp[2] = new WireSet(8);
            inp[2].Set2sComplement(3);
            multimux.ConnectInput(2, inp[2]);
            inp[3] = new WireSet(8);
            inp[3].Set2sComplement(4);
            multimux.ConnectInput(3, inp[3]);



            WireSet control = new WireSet(2);

            control.Set2sComplement(3);
            multimux.ConnectControl(control);

            multimux.TestGate();

            BitwiseMultiwayDemux multidemux = new BitwiseMultiwayDemux(8, 1);


            ALU alu = new ALU(16);

            alu.TestGate();



            SingleBitRegister sbr = new SingleBitRegister();

            if (sbr.TestGate())
            {
                Console.WriteLine("sbr IS OK");
            }

            MultiBitRegister mbr = new MultiBitRegister(8);

            if (mbr.TestGate())
            {
                Console.WriteLine("mbr IS OK");
            }

            Memory mem = new Memory(3, 6);

            if (mem.TestGate())
            {
                Console.WriteLine("mem IS OK");
            }



            Console.ReadLine();
        }
Example #12
0
        static void Main(string[] args)
        {
            //This is an example of a testing code that you should run for all the gates that you create
//
//            //Create a gate
//            AndGate and = new AndGate();
//            //Test that the unit testing works properly
//            if (!and.TestGate())
//                Console.WriteLine("bugbug");
//
//            //test or gate
//            OrGate or = new OrGate();
//            if (or.TestGate())
//                Console.WriteLine("done or");
//
            //test xor gate
//            XorGate xor = new XorGate();
//            if (xor.TestGate())
//                Console.WriteLine("done xor");
//
//            MultiBitAndGate mbaGate = new MultiBitAndGate(4);
//            if (mbaGate.TestGate())
//                Console.WriteLine("done mba");
//
//            MultiBitOrGate mboGate = new MultiBitOrGate(4);
//            if (mboGate.TestGate())
//                Console.WriteLine("done mbo");
//
//            MuxGate mux = new MuxGate();
//            if (mux.TestGate())
//                Console.WriteLine("done mux");
//
//            Demux demux = new Demux();
//            if (demux.TestGate())
//                Console.WriteLine("done demux");
//
//            BitwiseAndGate bwAg = new BitwiseAndGate(4);
//            if (bwAg.TestGate())
//                Console.WriteLine("done bwAg");
//
//            BitwiseNotGate bwNg = new BitwiseNotGate(4);
//            if (bwNg.TestGate())
//                Console.WriteLine("done bwNg");
////
//            BitwiseOrGate bwOg = new BitwiseOrGate(4);
//            if (bwOg.TestGate())
//                Console.WriteLine("done bwOg");
//
//
//            WireSet ws = new WireSet(4);
//            ws.SetValue(8);
//            Console.WriteLine(ws.ToString());
////
//            BitwiseMux bwMux = new BitwiseMux(4);
//            if (bwMux.TestGate())
//                Console.WriteLine("done bwMux");
//
//            BitwiseDemux bwDemux = new BitwiseDemux(4);
//            if (bwDemux.TestGate())
//                Console.WriteLine("done bwDemux");
//
//            BitwiseMultiwayMux bwMwMux = new BitwiseMultiwayMux(3,3);
//            if (bwMwMux.TestGate())
//                Console.WriteLine("done bwMwMux");


            OrGate               or        = new OrGate();
            XorGate              xor       = new XorGate();
            AndGate              and       = new AndGate();
            MuxGate              mux       = new MuxGate();
            Demux                demux     = new Demux();
            HalfAdder            halfAdder = new HalfAdder();
            FullAdder            fullAdder = new FullAdder();
            WireSet              wireSet   = new WireSet(9);
            BitwiseAndGate       bwag      = new BitwiseAndGate(2);
            BitwiseNotGate       bwng      = new BitwiseNotGate(3);
            BitwiseOrGate        bwog      = new BitwiseOrGate(2);
            BitwiseMux           bwm       = new BitwiseMux(2);
            BitwiseDemux         bwd       = new BitwiseDemux(2);
            MultiBitAndGate      mbag      = new MultiBitAndGate(4);
            MultiBitAdder        mba       = new MultiBitAdder(3);
            BitwiseMultiwayMux   bwmwm     = new BitwiseMultiwayMux(5, 4);
            BitwiseMultiwayDemux bwmwd     = new BitwiseMultiwayDemux(4, 4);
            SingleBitRegister    sbr       = new SingleBitRegister();
            MultiBitRegister     mbr       = new MultiBitRegister(4);

            wireSet.SetValue(137);
            wireSet.Set2sComplement(-32);
            if (halfAdder.TestGate())
            {
                Console.WriteLine("HAbugbug");
            }
            if (fullAdder.TestGate())
            {
                Console.WriteLine("FAbugbug");
            }
            if (mba.TestGate())
            {
                Console.WriteLine("MultiBitAdderbugbug");
            }
            ALU alu = new ALU(16);

            if (alu.TestGate())
            {
                Console.WriteLine("ALU bugbug");
            }

            Console.WriteLine("FINISH HIM");
        }