Tejas/src/simulator/pipeline/outoforder/IWPushLogic.java

102 lines
2.6 KiB
Java
Executable File

package pipeline.outoforder;
import config.SimulationConfig;
import generic.Core;
import generic.Event;
import generic.EventQueue;
import generic.GenericCircularQueue;
import generic.GlobalClock;
import generic.OperationType;
import generic.PortType;
import generic.SimulationElement;
public class IWPushLogic extends SimulationElement {
Core core;
OutOrderExecutionEngine execEngine;
GenericCircularQueue<ReorderBufferEntry> renameBuffer;
InstructionWindow IW;
int renameWidth;
public IWPushLogic(Core core, OutOrderExecutionEngine execEngine)
{
super(PortType.Unlimited, -1, -1 , -1, -1);
this.core = core;
this.execEngine = execEngine;
renameBuffer = execEngine.getRenameBuffer();
IW = execEngine.getInstructionWindow();
renameWidth = core.getRenameWidth();
}
/*
* for each instruction in the renameBuffer, if there is place in the IW, make an entry
* else, indicate that all preceding stages must stall from the next cycle
*/
public void performIWPush()
{
if(execEngine.isToStall5() == true /*pipeline stalled due to branch mis-prediction*/)
{
return;
}
for(int i = 0; i < renameWidth; i++)
{
ReorderBufferEntry headROBEntry = renameBuffer.peek(0);
if(headROBEntry != null)
{
if(headROBEntry.getInstruction().getOperationType() == OperationType.inValid ||
headROBEntry.getInstruction().getOperationType() == OperationType.nop ||
headROBEntry.getInstruction().getOperationType() == OperationType.cpuid ||
headROBEntry.getInstruction().getOperationType() == OperationType.mfence ||
headROBEntry.getInstruction().getOperationType() == OperationType.sfence ||
headROBEntry.getInstruction().getOperationType() == OperationType.lfence)
{
//need not be added to instruction window
headROBEntry.setIssued(true);
headROBEntry.setExecuted(true);
headROBEntry.setWriteBackDone1(true);
headROBEntry.setWriteBackDone2(true);
}
else
{
if(IW.isFull())
{
execEngine.setToStall1(true);
break;
}
else
{
if(headROBEntry.isRenameDone() == false)
{
misc.Error.showErrorAndExit("cannot push an instruction that hasn't been renamed");
}
if(SimulationConfig.debugMode)
{
System.out.println("IW push : " + GlobalClock.getCurrentTime()/core.getStepSize() + " : " + headROBEntry.getInstruction());
}
//add to IW
IW.addToWindow(headROBEntry);
}
}
//remove from rename buffer
renameBuffer.dequeue();
execEngine.setToStall1(false);
}
else
{
break;
}
}
}
@Override
public void handleEvent(EventQueue eventQ, Event event) {
}
}