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); } } }