2009-02-11 00:49:29 +01:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2007 MIPS Technologies, Inc.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions are
|
|
|
|
* met: redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer;
|
|
|
|
* redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution;
|
|
|
|
* neither the name of the copyright holders nor the names of its
|
|
|
|
* contributors may be used to endorse or promote products derived from
|
|
|
|
* this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* Authors: Korey Sewell
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __CPU_INORDER_RESOURCE_HH__
|
|
|
|
#define __CPU_INORDER_RESOURCE_HH__
|
|
|
|
|
|
|
|
#include <list>
|
|
|
|
#include <string>
|
2011-04-15 19:44:06 +02:00
|
|
|
#include <vector>
|
2009-02-11 00:49:29 +01:00
|
|
|
|
2009-11-05 01:57:01 +01:00
|
|
|
#include "base/types.hh"
|
2009-02-11 00:49:29 +01:00
|
|
|
#include "cpu/inorder/inorder_dyn_inst.hh"
|
|
|
|
#include "cpu/inorder/pipeline_traits.hh"
|
2011-04-15 19:44:06 +02:00
|
|
|
#include "cpu/inst_seq.hh"
|
2009-02-11 00:49:29 +01:00
|
|
|
#include "sim/eventq.hh"
|
|
|
|
#include "sim/sim_object.hh"
|
|
|
|
|
|
|
|
class Event;
|
|
|
|
class InOrderCPU;
|
|
|
|
class ResourceEvent;
|
|
|
|
class ResourceRequest;
|
|
|
|
|
|
|
|
typedef ResourceRequest ResReq;
|
|
|
|
typedef ResourceRequest* ResReqPtr;
|
|
|
|
|
|
|
|
class Resource {
|
|
|
|
public:
|
|
|
|
typedef ThePipeline::DynInstPtr DynInstPtr;
|
|
|
|
|
|
|
|
friend class ResourceEvent;
|
|
|
|
friend class ResourceRequest;
|
|
|
|
|
|
|
|
public:
|
|
|
|
Resource(std::string res_name, int res_id, int res_width,
|
|
|
|
int res_latency, InOrderCPU *_cpu);
|
2009-05-12 21:01:16 +02:00
|
|
|
virtual ~Resource();
|
|
|
|
|
2009-02-11 00:49:29 +01:00
|
|
|
|
|
|
|
/** Return name of this resource */
|
|
|
|
virtual std::string name();
|
|
|
|
|
|
|
|
/** Define this function if resource, has a port to connect to an outside
|
|
|
|
* simulation object.
|
|
|
|
*/
|
2010-01-31 23:18:15 +01:00
|
|
|
virtual Port* getPort(const std::string &if_name, int idx)
|
|
|
|
{ return NULL; }
|
2009-02-11 00:49:29 +01:00
|
|
|
|
|
|
|
/** Return ID for this resource */
|
|
|
|
int getId() { return id; }
|
|
|
|
|
|
|
|
/** Any extra initiliazation stuff can be set up using this function that
|
|
|
|
* should get called before the simulation starts (tick 0)
|
|
|
|
*/
|
|
|
|
virtual void init();
|
|
|
|
virtual void initSlots();
|
|
|
|
|
|
|
|
/** Register Stats for this resource */
|
2010-06-26 15:41:39 +02:00
|
|
|
virtual void regStats() { }
|
2009-02-11 00:49:29 +01:00
|
|
|
|
|
|
|
/** Resources that care about thread activation override this. */
|
2009-05-26 18:23:13 +02:00
|
|
|
virtual void activateThread(ThreadID tid) { }
|
2009-02-11 00:49:29 +01:00
|
|
|
|
|
|
|
/** Deactivate Thread. Default action is to squash all instructions
|
|
|
|
* from deactivated thread.
|
|
|
|
*/
|
2009-05-26 18:23:13 +02:00
|
|
|
virtual void deactivateThread(ThreadID tid);
|
2009-02-11 00:49:29 +01:00
|
|
|
|
2010-02-01 00:27:02 +01:00
|
|
|
/** Resources that care about thread activation override this. */
|
|
|
|
virtual void suspendThread(ThreadID tid) { }
|
|
|
|
|
2010-02-01 00:27:49 +01:00
|
|
|
/** Will be called the cycle before a context switch. Any bookkeeping
|
|
|
|
* that needs to be kept for that, can be done here
|
|
|
|
*/
|
|
|
|
virtual void updateAfterContextSwitch(DynInstPtr inst, ThreadID tid) { }
|
2010-02-01 00:27:02 +01:00
|
|
|
|
2009-02-11 00:49:29 +01:00
|
|
|
/** Resources that care when an instruction has been graduated
|
|
|
|
* can override this
|
|
|
|
*/
|
2009-05-26 18:23:13 +02:00
|
|
|
virtual void instGraduated(InstSeqNum seq_num, ThreadID tid) { }
|
2009-02-11 00:49:29 +01:00
|
|
|
|
2011-06-20 03:43:36 +02:00
|
|
|
/** Post-processsing for Trap Generated from this instruction */
|
|
|
|
virtual void trap(Fault fault, ThreadID tid, DynInstPtr inst) { }
|
|
|
|
|
2009-02-11 00:49:29 +01:00
|
|
|
/** Request usage of this resource. Returns a ResourceRequest object
|
|
|
|
* with all the necessary resource information
|
|
|
|
*/
|
|
|
|
virtual ResourceRequest* request(DynInstPtr inst);
|
|
|
|
|
|
|
|
/** Get the next available slot in this resource. Instruction is passed
|
|
|
|
* so that resources can check the instruction before allocating a slot
|
|
|
|
* if necessary.
|
|
|
|
*/
|
|
|
|
virtual int getSlot(DynInstPtr inst);
|
|
|
|
|
|
|
|
/** Find the slot that this instruction is using in a resource */
|
|
|
|
virtual int findSlot(DynInstPtr inst);
|
|
|
|
|
|
|
|
/** Free a resource slot */
|
|
|
|
virtual void freeSlot(int slot_idx);
|
|
|
|
|
2010-01-31 23:18:15 +01:00
|
|
|
/** Request usage of a resource for this instruction. If this instruction
|
|
|
|
* already has made this request to this resource, and that request is
|
|
|
|
* uncompleted this function will just return that request
|
2009-02-11 00:49:29 +01:00
|
|
|
*/
|
|
|
|
virtual ResourceRequest* getRequest(DynInstPtr _inst, int stage_num,
|
|
|
|
int res_idx, int slot_num,
|
|
|
|
unsigned cmd);
|
|
|
|
|
|
|
|
/** Schedule Execution of This Resource For A Given Slot*/
|
2010-06-24 21:34:19 +02:00
|
|
|
void scheduleExecution(int slot_idx);
|
2009-02-11 00:49:29 +01:00
|
|
|
|
|
|
|
/** Execute the function of this resource. The Default is action
|
|
|
|
* is to do nothing. More specific models will derive from this
|
|
|
|
* class and define their own execute function.
|
|
|
|
*/
|
|
|
|
virtual void execute(int slot_idx);
|
|
|
|
|
|
|
|
/** Fetch on behalf of an instruction. Will check to see
|
|
|
|
* if instruction is actually in resource before
|
|
|
|
* trying to fetch. Needs to be defined for derived units.
|
|
|
|
*/
|
|
|
|
virtual Fault doFetchAccess(DynInstPtr inst)
|
|
|
|
{ panic("doFetchAccess undefined for %s", name()); return NoFault; }
|
|
|
|
|
|
|
|
/** Read/Write on behalf of an instruction. Will check to see
|
|
|
|
* if instruction is actually in resource before
|
|
|
|
* trying to do access.Needs to be defined for derived units.
|
|
|
|
*/
|
2009-05-12 21:01:16 +02:00
|
|
|
virtual Fault doCacheAccess(DynInstPtr inst, uint64_t *res=NULL)
|
|
|
|
{ panic("doCacheAccess undefined for %s", name()); return NoFault; }
|
2009-02-11 00:49:29 +01:00
|
|
|
|
2011-06-20 03:43:35 +02:00
|
|
|
/** Setup Squash to be sent out to pipeline and resource pool */
|
|
|
|
void setupSquash(DynInstPtr inst, int stage_num, ThreadID tid);
|
|
|
|
|
2009-02-11 00:49:29 +01:00
|
|
|
/** Squash All Requests After This Seq Num */
|
2009-05-26 18:23:13 +02:00
|
|
|
virtual void squash(DynInstPtr inst, int stage_num,
|
|
|
|
InstSeqNum squash_seq_num, ThreadID tid);
|
2009-02-11 00:49:29 +01:00
|
|
|
|
2011-06-20 03:43:35 +02:00
|
|
|
/** Squash Requests Due to a Memory Stall (By Default, same as "squash" */
|
2010-02-01 00:26:13 +01:00
|
|
|
virtual void squashDueToMemStall(DynInstPtr inst, int stage_num,
|
|
|
|
InstSeqNum squash_seq_num, ThreadID tid);
|
|
|
|
|
2011-06-20 03:43:39 +02:00
|
|
|
/** Handle Squash & Trap that occured from an instruction in a resource */
|
|
|
|
void squashThenTrap(int stage_num, DynInstPtr inst);
|
|
|
|
|
2009-02-11 00:49:29 +01:00
|
|
|
/** The number of instructions available that this resource can
|
|
|
|
* can still process
|
|
|
|
*/
|
|
|
|
int slotsAvail();
|
|
|
|
|
|
|
|
/** The number of instructions using this resource */
|
|
|
|
int slotsInUse();
|
|
|
|
|
|
|
|
/** Schedule resource event, regardless of its current state. */
|
|
|
|
void scheduleEvent(int slot_idx, int delay);
|
|
|
|
|
2010-01-31 23:18:15 +01:00
|
|
|
/** Find instruction in list, Schedule resource event, regardless of its
|
|
|
|
* current state. */
|
2009-02-11 00:49:29 +01:00
|
|
|
bool scheduleEvent(DynInstPtr inst, int delay);
|
|
|
|
|
|
|
|
/** Unschedule resource event, regardless of its current state. */
|
|
|
|
void unscheduleEvent(int slot_idx);
|
|
|
|
|
|
|
|
/** Unschedule resource event, regardless of its current state. */
|
|
|
|
bool unscheduleEvent(DynInstPtr inst);
|
|
|
|
|
|
|
|
/** Return the number of cycles in 'Tick' format */
|
|
|
|
Tick ticks(int numCycles);
|
|
|
|
|
|
|
|
/** Find the request that corresponds to this instruction */
|
|
|
|
virtual ResReqPtr findRequest(DynInstPtr inst);
|
|
|
|
|
|
|
|
/** */
|
2010-06-24 21:34:19 +02:00
|
|
|
void rejectRequest(DynInstPtr inst);
|
2009-02-11 00:49:29 +01:00
|
|
|
|
|
|
|
/** Request a Resource again. Some resources have to special process this
|
|
|
|
* in subsequent accesses.
|
|
|
|
*/
|
|
|
|
virtual void requestAgain(DynInstPtr inst, bool &try_request);
|
|
|
|
|
|
|
|
/** Return Latency of Resource */
|
|
|
|
/* Can be overridden for complex cases */
|
|
|
|
virtual int getLatency(int slot_num) { return latency; }
|
|
|
|
|
|
|
|
protected:
|
|
|
|
/** The name of this resource */
|
|
|
|
std::string resName;
|
|
|
|
|
|
|
|
/** ID of the resource. The Resource Pool uses this # to identify this
|
|
|
|
* resource.
|
|
|
|
*/
|
|
|
|
int id;
|
|
|
|
|
|
|
|
/** The number of instructions the resource can simultaneously
|
|
|
|
* process.
|
|
|
|
*/
|
|
|
|
int width;
|
|
|
|
|
|
|
|
/** Constant latency for this resource.
|
|
|
|
* Note: Dynamic latency resources set this to 0 and
|
|
|
|
* manage the latency themselves
|
|
|
|
*/
|
|
|
|
const int latency;
|
|
|
|
|
|
|
|
public:
|
2011-02-18 20:28:30 +01:00
|
|
|
/** List of all Requests the Resource is Servicing. Each request
|
|
|
|
represents part of the resource's bandwidth
|
|
|
|
*/
|
2011-02-18 20:27:52 +01:00
|
|
|
std::vector<ResReqPtr> reqs;
|
|
|
|
|
2009-02-11 00:49:29 +01:00
|
|
|
/** A list of all the available execution slots for this resource.
|
|
|
|
* This correlates with the actual resource event idx.
|
|
|
|
*/
|
|
|
|
std::vector<int> availSlots;
|
|
|
|
|
|
|
|
/** The CPU(s) that this resource interacts with */
|
|
|
|
InOrderCPU *cpu;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
/** The resource event used for scheduling resource slots on the
|
|
|
|
* event queue
|
|
|
|
*/
|
|
|
|
ResourceEvent *resourceEvent;
|
|
|
|
|
|
|
|
/** Default denied resource request pointer*/
|
|
|
|
ResReqPtr deniedReq;
|
|
|
|
};
|
|
|
|
|
|
|
|
class ResourceEvent : public Event
|
|
|
|
{
|
|
|
|
public:
|
2011-02-18 20:31:31 +01:00
|
|
|
/** Pointer to the Resource this is an event for */
|
2009-02-11 00:49:29 +01:00
|
|
|
Resource *resource;
|
|
|
|
|
|
|
|
|
|
|
|
/// Resource events that come before other associated CPU events
|
|
|
|
/// (for InOrderCPU model).
|
|
|
|
/// check src/sim/eventq.hh for more event priorities.
|
|
|
|
enum InOrderPriority {
|
2010-12-20 22:24:40 +01:00
|
|
|
Resource_Event_Pri = 45,
|
2009-02-11 00:49:29 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
/** The Resource Slot that this event is servicing */
|
|
|
|
int slotIdx;
|
|
|
|
|
|
|
|
/** Constructs a resource event. */
|
|
|
|
ResourceEvent();
|
|
|
|
ResourceEvent(Resource *res, int slot_idx);
|
|
|
|
virtual ~ResourceEvent() { }
|
|
|
|
|
|
|
|
/** Initialize data for this resource event. */
|
|
|
|
virtual void init(Resource *res, int slot_idx);
|
|
|
|
|
|
|
|
/** Processes a resource event. */
|
|
|
|
virtual void process();
|
|
|
|
|
|
|
|
/** Returns the description of the resource event. */
|
|
|
|
const char *description();
|
|
|
|
|
|
|
|
/** Set slot idx for event */
|
|
|
|
void setSlot(int slot) { slotIdx = slot; }
|
|
|
|
|
|
|
|
/** Schedule resource event, regardless of its current state. */
|
2011-01-08 06:50:29 +01:00
|
|
|
void scheduleEvent(int delay);
|
2009-02-11 00:49:29 +01:00
|
|
|
|
|
|
|
/** Unschedule resource event, regardless of its current state. */
|
|
|
|
void unscheduleEvent()
|
|
|
|
{
|
|
|
|
if (scheduled())
|
|
|
|
squash();
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
class ResourceRequest
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef ThePipeline::DynInstPtr DynInstPtr;
|
|
|
|
|
|
|
|
static int resReqID;
|
|
|
|
|
2010-01-31 23:18:15 +01:00
|
|
|
static int maxReqCount;
|
|
|
|
|
2011-02-18 20:28:22 +01:00
|
|
|
friend class Resource;
|
|
|
|
|
2009-02-11 00:49:29 +01:00
|
|
|
public:
|
2011-02-18 20:28:30 +01:00
|
|
|
ResourceRequest(Resource *_res);
|
2010-01-31 23:18:15 +01:00
|
|
|
|
|
|
|
virtual ~ResourceRequest();
|
2011-02-18 20:31:31 +01:00
|
|
|
|
|
|
|
std::string name();
|
2010-01-31 23:18:15 +01:00
|
|
|
|
2009-02-11 00:49:29 +01:00
|
|
|
int reqID;
|
|
|
|
|
2011-02-18 20:28:30 +01:00
|
|
|
virtual void setRequest(DynInstPtr _inst, int stage_num,
|
|
|
|
int res_idx, int slot_num, unsigned _cmd);
|
|
|
|
|
|
|
|
virtual void clearRequest();
|
|
|
|
|
2009-02-11 00:49:29 +01:00
|
|
|
/** Acknowledge that this is a request is done and remove
|
|
|
|
* from resource.
|
|
|
|
*/
|
|
|
|
void done(bool completed = true);
|
2010-02-01 00:30:48 +01:00
|
|
|
|
inorder: update pipeline interface for handling finished resource reqs
formerly, to free up bandwidth in a resource, we could just change the pointer in that resource
but at the same time the pipeline stages had visibility to see what happened to a resource request.
Now that we are recycling these requests (to avoid too much dynamic allocation), we can't throw
away the request too early or the pipeline stage gets bad information. Instead, mark when a request
is done with the resource all together and then let the pipeline stage call back to the resource
that it's time to free up the bandwidth for more instructions
*** inteface notes ***
- When an instruction completes and is done in a resource for that cycle, call done()
- When an instruction fails and is done with a resource for that cycle, call done(false)
- When an instruction completes, but isnt finished with a resource, call completed()
- When an instruction fails, but isnt finished with a resource, call completed(false)
* * *
inorder: tlbmiss wakeup bug fix
2011-02-18 20:28:37 +01:00
|
|
|
void freeSlot();
|
|
|
|
|
2009-02-11 00:49:29 +01:00
|
|
|
/////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// GET RESOURCE REQUEST IDENTIFICATION / INFO
|
|
|
|
//
|
|
|
|
/////////////////////////////////////////////
|
|
|
|
/** Get Resource Index */
|
|
|
|
int getResIdx() { return resIdx; }
|
2010-02-01 00:30:48 +01:00
|
|
|
|
2009-02-11 00:49:29 +01:00
|
|
|
/** Get Slot Number */
|
|
|
|
int getSlot() { return slotNum; }
|
2010-02-01 00:30:48 +01:00
|
|
|
bool hasSlot() { return slotNum >= 0; }
|
2009-02-11 00:49:29 +01:00
|
|
|
|
|
|
|
/** Get Stage Number */
|
|
|
|
int getStageNum() { return stageNum; }
|
|
|
|
|
|
|
|
/** Set/Get Thread Ids */
|
2009-05-26 18:23:13 +02:00
|
|
|
void setTid(ThreadID _tid) { tid = _tid; }
|
|
|
|
ThreadID getTid() { return tid; }
|
2009-02-11 00:49:29 +01:00
|
|
|
|
|
|
|
/** Instruction this request is for */
|
|
|
|
DynInstPtr getInst() { return inst; }
|
|
|
|
|
|
|
|
/** Data from this request. Overridden by Resource-Specific Request
|
|
|
|
* Objects
|
|
|
|
*/
|
|
|
|
virtual PacketDataPtr getData() { return NULL; }
|
|
|
|
|
|
|
|
/** Pointer to Resource that is being used */
|
|
|
|
Resource *res;
|
|
|
|
|
|
|
|
/** Instruction being used */
|
|
|
|
DynInstPtr inst;
|
|
|
|
|
2010-02-01 00:30:48 +01:00
|
|
|
/** Not guaranteed to be set, used for debugging */
|
|
|
|
InstSeqNum seqNum;
|
|
|
|
|
2009-02-11 00:49:29 +01:00
|
|
|
/** Command For This Resource */
|
|
|
|
unsigned cmd;
|
|
|
|
|
2011-02-18 20:28:30 +01:00
|
|
|
short stagePasses;
|
|
|
|
|
|
|
|
bool valid;
|
|
|
|
|
inorder: update pipeline interface for handling finished resource reqs
formerly, to free up bandwidth in a resource, we could just change the pointer in that resource
but at the same time the pipeline stages had visibility to see what happened to a resource request.
Now that we are recycling these requests (to avoid too much dynamic allocation), we can't throw
away the request too early or the pipeline stage gets bad information. Instead, mark when a request
is done with the resource all together and then let the pipeline stage call back to the resource
that it's time to free up the bandwidth for more instructions
*** inteface notes ***
- When an instruction completes and is done in a resource for that cycle, call done()
- When an instruction fails and is done with a resource for that cycle, call done(false)
- When an instruction completes, but isnt finished with a resource, call completed()
- When an instruction fails, but isnt finished with a resource, call completed(false)
* * *
inorder: tlbmiss wakeup bug fix
2011-02-18 20:28:37 +01:00
|
|
|
bool doneInResource;
|
|
|
|
|
2009-02-11 00:49:29 +01:00
|
|
|
////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// GET RESOURCE REQUEST STATUS FROM VARIABLES
|
|
|
|
//
|
|
|
|
////////////////////////////////////////
|
|
|
|
/** Get/Set Completed variables */
|
|
|
|
bool isCompleted() { return completed; }
|
|
|
|
void setCompleted(bool cond = true) { completed = cond; }
|
|
|
|
|
|
|
|
/** Get/Set Squashed variables */
|
|
|
|
bool isSquashed() { return squashed; }
|
|
|
|
void setSquashed() { squashed = true; }
|
|
|
|
|
|
|
|
/** Get/Set IsProcessing variables */
|
|
|
|
bool isProcessing() { return processing; }
|
2011-06-20 03:43:38 +02:00
|
|
|
void setProcessing(bool cond = true) { processing = cond; }
|
2009-02-11 00:49:29 +01:00
|
|
|
|
|
|
|
/** Get/Set IsWaiting variables */
|
2010-02-01 00:26:13 +01:00
|
|
|
bool isMemStall() { return memStall; }
|
|
|
|
void setMemStall(bool stall = true) { memStall = stall; }
|
2009-02-11 00:49:29 +01:00
|
|
|
|
|
|
|
protected:
|
|
|
|
/** Resource Identification */
|
2009-05-26 18:23:13 +02:00
|
|
|
ThreadID tid;
|
2009-02-11 00:49:29 +01:00
|
|
|
int stageNum;
|
|
|
|
int resIdx;
|
|
|
|
int slotNum;
|
2010-02-01 00:30:48 +01:00
|
|
|
|
2010-02-01 00:26:13 +01:00
|
|
|
/** Resource Request Status */
|
2009-02-11 00:49:29 +01:00
|
|
|
bool completed;
|
|
|
|
bool squashed;
|
|
|
|
bool processing;
|
2010-02-01 00:26:13 +01:00
|
|
|
|
|
|
|
bool memStall;
|
2009-02-11 00:49:29 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif //__CPU_INORDER_RESOURCE_HH__
|