MEM: Enable multiple distributed generalized memories
[gem5.git] / src / cpu / inorder / resource.hh
index b423b16254c9dc86950a0ebf2a36ca270d5282a0..3c1a8cc470e802d2995af82e18e4c559a268056b 100644 (file)
 #ifndef __CPU_INORDER_RESOURCE_HH__
 #define __CPU_INORDER_RESOURCE_HH__
 
-#include <vector>
 #include <list>
 #include <string>
+#include <vector>
 
 #include "base/types.hh"
-#include "cpu/inst_seq.hh"
 #include "cpu/inorder/inorder_dyn_inst.hh"
 #include "cpu/inorder/pipeline_traits.hh"
+#include "cpu/inst_seq.hh"
 #include "sim/eventq.hh"
 #include "sim/sim_object.hh"
 
@@ -51,6 +51,9 @@ class ResourceRequest;
 typedef ResourceRequest ResReq;
 typedef ResourceRequest* ResReqPtr;
 
+class CacheRequest;
+typedef CacheRequest* CacheReqPtr;
+
 class Resource {
   public:
     typedef ThePipeline::DynInstPtr DynInstPtr;
@@ -67,12 +70,6 @@ class Resource {
     /** Return name of this resource */
     virtual std::string name();
 
-    /** Define this function if resource, has a port to connect to an outside
-     *  simulation object.
-     */
-    virtual Port* getPort(const std::string &if_name, int idx) 
-    { return NULL; }
-
     /** Return ID for this resource */
     int getId() { return id; }
 
@@ -83,7 +80,7 @@ class Resource {
     virtual void initSlots();
 
     /** Register Stats for this resource */
-    virtual void regStats();
+    virtual void regStats() { }
 
     /** Resources that care about thread activation override this. */
     virtual void activateThread(ThreadID tid) { }
@@ -106,6 +103,9 @@ class Resource {
      */
     virtual void instGraduated(InstSeqNum seq_num, ThreadID tid) { }
 
+    /** Post-processsing for Trap Generated from this instruction */
+    virtual void trap(Fault fault, ThreadID tid, DynInstPtr inst) { }
+
     /** Request usage of this resource. Returns a ResourceRequest object
      *  with all the necessary resource information
      */
@@ -132,7 +132,7 @@ class Resource {
                                         unsigned cmd);
 
     /** Schedule Execution of This Resource For A Given Slot*/
-    virtual void scheduleExecution(int slot_idx);
+    void scheduleExecution(int slot_idx);
 
     /** Execute the function of this resource. The Default is action
      *  is to do nothing. More specific models will derive from this
@@ -151,22 +151,24 @@ class Resource {
      *  if instruction is actually in resource before
      *  trying to do access.Needs to be defined for derived units.
      */
-    virtual Fault doCacheAccess(DynInstPtr inst, uint64_t *res=NULL)
-    { panic("doCacheAccess undefined for %s", name()); return NoFault; }
+    virtual void doCacheAccess(DynInstPtr inst, uint64_t *write_result = NULL,
+                               CacheReqPtr split_req = NULL)
+    { panic("doCacheAccess undefined for %s", name()); }
 
-    virtual void prefetch(DynInstPtr inst)
-    { panic("prefetch undefined for %s", name()); }
-
-    virtual void writeHint(DynInstPtr inst)
-    { panic("writeHint undefined for %s", name()); }
+    /** Setup Squash to be sent out to pipeline and resource pool */
+    void setupSquash(DynInstPtr inst, int stage_num, ThreadID tid);
 
     /** Squash All Requests After This Seq Num */
     virtual void squash(DynInstPtr inst, int stage_num,
                         InstSeqNum squash_seq_num, ThreadID tid);
 
+    /** Squash Requests Due to a Memory Stall (By Default, same as "squash" */
     virtual void squashDueToMemStall(DynInstPtr inst, int stage_num,
                                      InstSeqNum squash_seq_num, ThreadID tid);
 
+    /** Handle Squash & Trap that occured from an instruction in a resource */
+    void squashThenTrap(int stage_num, DynInstPtr inst);
+
     /** The number of instructions available that this resource can
      *  can still process
      */
@@ -195,7 +197,7 @@ class Resource {
     virtual ResReqPtr findRequest(DynInstPtr inst);
 
     /** */
-    virtual void rejectRequest(DynInstPtr inst);
+    void rejectRequest(DynInstPtr inst);
 
     /** Request a Resource again. Some resources have to special process this
      *  in subsequent accesses.
@@ -227,8 +229,10 @@ class Resource {
     const int latency;
 
   public:
-    /** Mapping of slot-numbers to the resource-request pointers */
-    std::map<int, ResReqPtr> reqMap;
+    /** List of all Requests the Resource is Servicing. Each request
+        represents part of the resource's bandwidth
+    */
+    std::vector<ResReqPtr> reqs;
 
     /** A list of all the available execution slots for this resource.
      *  This correlates with the actual resource event idx.
@@ -246,23 +250,12 @@ class Resource {
 
     /** Default denied resource request pointer*/
     ResReqPtr deniedReq;
-
-  public:
-    /////////////////////////////////////////////////////////////////
-    //
-    // DEFAULT RESOURCE STATISTICS
-    //
-    /////////////////////////////////////////////////////////////////
-#ifdef DEBUG
-    /** Number of Instruction Requests the Resource Processes */
-    Stats::Scalar instReqsProcessed;
-#endif
 };
 
 class ResourceEvent : public Event
 {
   public:
-    /** Pointer to the CPU. */
+    /** Pointer to the Resource this is an event for */
     Resource *resource;
 
 
@@ -270,7 +263,7 @@ class ResourceEvent : public Event
     /// (for InOrderCPU model).
     /// check src/sim/eventq.hh for more event priorities.
     enum InOrderPriority {
-        Resource_Event_Pri     =   45,
+        Resource_Event_Pri = 45
     };
 
     /** The Resource Slot that this event is servicing */
@@ -288,19 +281,13 @@ class ResourceEvent : public Event
     virtual void process();
 
     /** Returns the description of the resource event. */
-    const char *description();
+    const char *description() const;
 
     /** Set slot idx for event */
     void setSlot(int slot) { slotIdx = slot; }
 
     /** Schedule resource event, regardless of its current state. */
-    void scheduleEvent(int delay)
-    {
-        if (squashed())
-          mainEventQueue.reschedule(this, curTick + resource->ticks(delay));
-        else if (!scheduled())
-          mainEventQueue.schedule(this, curTick + resource->ticks(delay));
-    }
+    void scheduleEvent(int delay);
 
     /** Unschedule resource event, regardless of its current state. */
     void unscheduleEvent()
@@ -320,21 +307,29 @@ class ResourceRequest
 
     static int maxReqCount;
     
+    friend class Resource;
+
   public:
-    ResourceRequest(Resource *_res, DynInstPtr _inst, int stage_num,
-                    int res_idx, int slot_num, unsigned _cmd);
+    ResourceRequest(Resource *_res);
     
     virtual ~ResourceRequest();
+
+    std::string name();
     
     int reqID;
 
+    void setRequest(DynInstPtr _inst, int stage_num,
+                    int res_idx, int slot_num, unsigned _cmd);
+
+    virtual void clearRequest();
+
     /** Acknowledge that this is a request is done and remove
      *  from resource.
      */
     void done(bool completed = true);
-
-    short stagePasses;
     
+    void freeSlot();
+
     /////////////////////////////////////////////
     //
     // GET RESOURCE REQUEST IDENTIFICATION / INFO
@@ -342,11 +337,9 @@ class ResourceRequest
     /////////////////////////////////////////////
     /** Get Resource Index */
     int getResIdx() { return resIdx; }
-
        
     /** Get Slot Number */
     int getSlot() { return slotNum; }
-    int getComplSlot() { return complSlotNum; }
     bool hasSlot()  { return slotNum >= 0; }     
 
     /** Get Stage Number */
@@ -373,12 +366,15 @@ class ResourceRequest
     /** Not guaranteed to be set, used for debugging */
     InstSeqNum seqNum;
     
-    /** Fault Associated With This Resource Request */
-    Fault fault;
-
     /** Command For This Resource */
     unsigned cmd;
 
+    short stagePasses;
+
+    bool valid;
+
+    bool doneInResource;
+
     ////////////////////////////////////////
     //
     // GET RESOURCE REQUEST STATUS FROM VARIABLES
@@ -394,7 +390,7 @@ class ResourceRequest
 
     /** Get/Set IsProcessing variables */
     bool isProcessing() { return processing; }
-    void setProcessing() { processing = true; }
+    void setProcessing(bool cond = true) { processing = cond; }
 
     /** Get/Set IsWaiting variables */
     bool isMemStall() { return memStall; }
@@ -406,7 +402,6 @@ class ResourceRequest
     int stageNum;
     int resIdx;
     int slotNum;
-    int complSlotNum;
     
     /** Resource Request Status */
     bool completed;