inorder: add event priority offset

allow for events to schedule themselves later if desired. this is important
because of cases like where you need to activate a thread only after the previous
thread has been deactivated. The ordering there has to be enforced
This commit is contained in:
Korey Sewell 2010-01-31 18:26:26 -05:00
parent eac5eac67a
commit 4a945aab19
2 changed files with 12 additions and 8 deletions

View file

@ -84,8 +84,10 @@ InOrderCPU::TickEvent::description()
} }
InOrderCPU::CPUEvent::CPUEvent(InOrderCPU *_cpu, CPUEventType e_type, InOrderCPU::CPUEvent::CPUEvent(InOrderCPU *_cpu, CPUEventType e_type,
Fault fault, ThreadID _tid, DynInstPtr inst) Fault fault, ThreadID _tid, DynInstPtr inst,
: Event(CPU_Tick_Pri), cpu(_cpu) unsigned event_pri_offset)
: Event(Event::Priority((unsigned int)CPU_Tick_Pri + event_pri_offset)),
cpu(_cpu)
{ {
setEvent(e_type, fault, _tid, inst); setEvent(e_type, fault, _tid, inst);
} }
@ -611,13 +613,14 @@ InOrderCPU::squashDueToMemStall(int stage_num, InstSeqNum seq_num, ThreadID tid)
void void
InOrderCPU::scheduleCpuEvent(CPUEventType c_event, Fault fault, InOrderCPU::scheduleCpuEvent(CPUEventType c_event, Fault fault,
ThreadID tid, DynInstPtr inst, ThreadID tid, DynInstPtr inst,
unsigned delay) unsigned delay, unsigned event_pri_offset)
{ {
CPUEvent *cpu_event = new CPUEvent(this, c_event, fault, tid, inst); CPUEvent *cpu_event = new CPUEvent(this, c_event, fault, tid, inst,
event_pri_offset);
if (delay >= 0) { if (delay >= 0) {
DPRINTF(InOrderCPU, "Scheduling CPU Event (%s) for cycle %i.\n", DPRINTF(InOrderCPU, "Scheduling CPU Event (%s) for cycle %i, [tid:%i].\n",
eventNames[c_event], curTick + delay); eventNames[c_event], curTick + delay, tid);
mainEventQueue.schedule(cpu_event,curTick + delay); mainEventQueue.schedule(cpu_event,curTick + delay);
} else { } else {
cpu_event->process(); cpu_event->process();

View file

@ -206,7 +206,7 @@ class InOrderCPU : public BaseCPU
public: public:
/** Constructs a CPU event. */ /** Constructs a CPU event. */
CPUEvent(InOrderCPU *_cpu, CPUEventType e_type, Fault fault, CPUEvent(InOrderCPU *_cpu, CPUEventType e_type, Fault fault,
ThreadID _tid, DynInstPtr inst); ThreadID _tid, DynInstPtr inst, unsigned event_pri_offset);
/** Set Type of Event To Be Scheduled */ /** Set Type of Event To Be Scheduled */
void setEvent(CPUEventType e_type, Fault _fault, ThreadID _tid, void setEvent(CPUEventType e_type, Fault _fault, ThreadID _tid,
@ -234,7 +234,8 @@ class InOrderCPU : public BaseCPU
/** Schedule a CPU Event */ /** Schedule a CPU Event */
void scheduleCpuEvent(CPUEventType cpu_event, Fault fault, ThreadID tid, void scheduleCpuEvent(CPUEventType cpu_event, Fault fault, ThreadID tid,
DynInstPtr inst, unsigned delay = 0); DynInstPtr inst, unsigned delay = 0,
unsigned event_pri_offset = 0);
public: public:
/** Interface between the CPU and CPU resources. */ /** Interface between the CPU and CPU resources. */