cpu: Update DRAM traffic gen
[gem5.git] / src / cpu / inorder / resources / mult_div_unit.hh
index 003f6fbb173f08f807233803401da7b94b00b6af..d855dbb9d98767227e378a6d08b0f28867f992ac 100644 (file)
 #ifndef __CPU_INORDER_MULT_DIV_UNIT_HH__
 #define __CPU_INORDER_MULT_DIV_UNIT_HH__
 
-#include <vector>
 #include <list>
 #include <string>
+#include <vector>
 
-#include "cpu/func_unit.hh"
-#include "cpu/op_class.hh"
 #include "cpu/inorder/first_stage.hh"
-#include "cpu/inorder/resource.hh"
 #include "cpu/inorder/inorder_dyn_inst.hh"
+#include "cpu/inorder/resource.hh"
+#include "cpu/func_unit.hh"
+#include "cpu/op_class.hh"
 
 class MDUEvent;
 
@@ -56,52 +56,53 @@ class MultDivUnit : public Resource {
 
   public:
     MultDivUnit(std::string res_name, int res_id, int res_width,
-              int res_latency, InOrderCPU *_cpu, ThePipeline::Params *params);
-    virtual ~MultDivUnit() {}
+                Cycles res_latency, InOrderCPU *_cpu,
+                ThePipeline::Params *params);
 
   public:
     /** Override default Resource getSlot(). Will only getSlot if
      *  valid mult/div sequence is being maintained
      */
-    virtual int getSlot(DynInstPtr inst);
-
-    virtual int findSlot(DynInstPtr inst);
-
-    virtual void freeSlot(int slot_idx);
+    int getSlot(DynInstPtr inst);
     
-    virtual void init();
+    void init();
     
     /** Get Operand Size For A Division Operation */
     int getDivOpSize(DynInstPtr inst);
 
     /** Override default Resource execute */
-    virtual void execute(int slot_num);
+    void execute(int slot_num);
 
     void exeMulDiv(int slot_num);    
     
     /** Register extra resource stats */
-    virtual void regStats();
+    void regStats();
+
+    void requestAgain(DynInstPtr inst, bool &try_request);
+
+    void squash(DynInstPtr inst, int stage_num, InstSeqNum squash_seq_num,
+                ThreadID tid);
 
   protected:
     /** Latency & Repeat Rate for Multiply Insts */
     unsigned multRepeatRate;
-    unsigned multLatency;
+    Cycles multLatency;
 
     /** Latency & Repeat Rate for 8-bit Divide Insts */
     unsigned div8RepeatRate;
-    unsigned div8Latency;
+    Cycles div8Latency;
 
     /** Latency & Repeat Rate for 16-bit Divide Insts */
     unsigned div16RepeatRate;
-    unsigned div16Latency;
+    Cycles div16Latency;
 
     /** Latency & Repeat Rate for 24-bit Divide Insts */
     unsigned div24RepeatRate;
-    unsigned div24Latency;
+    Cycles div24Latency;
 
     /** Latency & Repeat Rate for 32-bit Divide Insts */
     unsigned div32RepeatRate;
-    unsigned div32Latency;
+    Cycles div32Latency;
 
     /** Last cycle that MDU was used */
     Tick lastMDUCycle;
@@ -115,11 +116,11 @@ class MultDivUnit : public Resource {
     /** Last instruction name the MDU used */
     std::string lastInstName;
 
-    /** Number of Instruction Requests the Resource Processes */
-    Stats::Scalar<> multInstReqsProcessed;
+    /** Number of Multiplies */
+    Stats::Scalar multiplies;
 
-    /** Number of Instruction Requests the Resource Processes */
-    Stats::Scalar<> divInstReqsProcessed;
+    /** Number of Divides */
+    Stats::Scalar divides;
 
     MDUEvent *mduEvent;    
 };
@@ -128,10 +129,10 @@ class MDUEvent : public ResourceEvent
 {
   public:
     MDUEvent();
-    virtual ~MDUEvent() { }
+    ~MDUEvent() { }
     
 
-    virtual void process();    
+    void process();
 };