public void Init()
        {
            clocks = 0;
            originalInstructions = instructionUnit.GetCurrentInstructions();

            issueClocks   = new int[100];
            executeClocks = new int[100];
            writeClocks   = new int[100];

            for (int i = 0; i < 100; i++)
            {
                issueClocks[i]   = -1;
                executeClocks[i] = -1;
                writeClocks[i]   = -1;
            }

            loadStation     = new ReservationStation(3, ReservationStation.RSType.Load);
            storeStation    = new ReservationStation(3, ReservationStation.RSType.Store);
            addStation      = new ReservationStation(3, ReservationStation.RSType.Add);
            multiplyStation = new ReservationStation(2, ReservationStation.RSType.Multiply);
            branchStation   = new ReservationStation(5, ReservationStation.RSType.Multiply);

            floatRegs = new FloatingPointRegisters(30);
            for (int i = 0; i < 30; i++)
            {
                floatRegs.Set(WaitInfo.WaitState.Avail, i + 1, i);
            }
            intRegs = new IntegerRegisters(30);
            memLocs = new FloatingPointMemoryArrary(64);
            for (int i = 0; i < 64; i++)
            {
                memLocs.Set(i + 1, i);
            }

            UpdateInstructionQueueBox();
            UpdateIssuedInstructionsBox();
            UpdateReservationStationBoxes();
            UpdateFPRegisterBox();
            UpdateIntRegisterBox();
            UpdateClockCountBox();
        }
        private void Write()
        {
            // Add Results.
            for (int i = 0; i < addStation.numBuffers; i++)
            {
                if (addStation.isReady[i])
                {
                    writeClocks[addStation.instrNum[i]] = clocks;
                    if (addStation.dest[i].opType == Operand.OperandType.FloatReg)
                    {
                        floatRegs.Set(WaitInfo.WaitState.Avail, addStation.Compute(floatRegs, intRegs, i),
                                      (int)addStation.dest[i].opVal);
                    }
                    else if (addStation.dest[i].opType == Operand.OperandType.IntReg)
                    {
                        intRegs.Set(WaitInfo.WaitState.Avail, (int)addStation.Compute(floatRegs, intRegs, i),
                                    (int)addStation.dest[i].opVal);
                    }
                    else
                    {
                        Console.WriteLine("Don't know what to do with result.");
                    }
                    addStation.Free(i);
                }
            }

            // Multiply Results.
            for (int i = 0; i < multiplyStation.numBuffers; i++)
            {
                if (multiplyStation.isReady[i])
                {
                    writeClocks[multiplyStation.instrNum[i]] = clocks;
                    if (multiplyStation.dest[i].opType == Operand.OperandType.FloatReg)
                    {
                        floatRegs.Set(WaitInfo.WaitState.Avail, multiplyStation.Compute(floatRegs, intRegs, i),
                                      (int)multiplyStation.dest[i].opVal);
                    }
                    else if (multiplyStation.dest[i].opType == Operand.OperandType.IntReg)
                    {
                        intRegs.Set(WaitInfo.WaitState.Avail, (int)multiplyStation.Compute(floatRegs, intRegs, i),
                                    (int)multiplyStation.dest[i].opVal);
                    }
                    else
                    {
                        Console.WriteLine("Don't know what to do with result.");
                    }
                    multiplyStation.Free(i);
                }
            }

            // Load Results.
            for (int i = 0; i < loadStation.numBuffers; i++)
            {
                if (loadStation.isReady[i])
                {
                    writeClocks[loadStation.instrNum[i]] = clocks;
                    if (loadStation.dest[i].opType == Operand.OperandType.FloatReg)
                    {
                        floatRegs.Set(WaitInfo.WaitState.Avail, memLocs.Get(loadStation.addresses[i]),
                                      (int)loadStation.dest[i].opVal);
                    }
                    else if (loadStation.dest[i].opType == Operand.OperandType.IntReg)
                    {
                        intRegs.Set(WaitInfo.WaitState.Avail, (int)memLocs.Get(loadStation.addresses[i]),
                                    (int)loadStation.dest[i].opVal);
                    }
                    else
                    {
                        Console.WriteLine("Don't know what to do with result.");
                    }
                    loadStation.Free(i);
                }
            }

            // Store Results.
            for (int i = 0; i < loadStation.numBuffers; i++)
            {
                if (storeStation.isReady[i])
                {   // Ready.
                    writeClocks[storeStation.instrNum[i]] = clocks;
                    memLocs.Set(storeStation.results[i], (int)storeStation.addresses[i]);
                    storeStation.Free(i);
                }
            }

            // Branch Results.
            for (int i = 0; i < branchStation.numBuffers; i++)
            {
                if (branchStation.isReady[i])
                {
                    writeClocks[branchStation.instrNum[i]] = clocks;
                    int amtToBranch = (int)branchStation.DetermineBranch(floatRegs, intRegs, i);
                    if (amtToBranch == 0)
                    {
                    }
                    else
                    {
                        // Clear Instruction Queue.
                        instructionUnit = new InstructionUnit();

                        // Put new instructions in.
                        int j;
                        for (j = branchStation.instrNum[i] + amtToBranch - instrOffset; j < originalInstructions.Length; j++)
                        {
                            instructionUnit.AddInstruction(originalInstructions[j]);
                        }
                        instrOffset += j;
                    }
                    branchStation.Free(i);
                }
            }
        }