sim: Add support for dynamic frequency scaling
authorChristopher Torng <clt67@cornell.edu>
Mon, 30 Dec 2013 01:29:45 +0000 (19:29 -0600)
committerChristopher Torng <clt67@cornell.edu>
Mon, 30 Dec 2013 01:29:45 +0000 (19:29 -0600)
This patch provides support for DFS by having ClockedObjects register
themselves with their clock domain at construction time in a member list.
Using this list, a clock domain can update each member's tick to the
curTick() before modifying the clock period.

Committed by: Nilay Vaish <nilay@cs.wisc.edu>

src/sim/clock_domain.cc
src/sim/clock_domain.hh
src/sim/clocked_object.hh

index 8b563d598451a6aa42b8f22ab39a18f9c5a39b4a..ff96f280892fffa240c5d105224ce8342b730593 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2013 ARM Limited
+ * Copyright (c) 2013 Cornell University
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -37,6 +38,7 @@
  * Authors: Vasileios Spiliopoulos
  *          Akash Bagdia
  *          Andreas Hansson
+ *          Christopher Torng
  */
 
 #include "debug/ClockDomain.hh"
@@ -45,6 +47,7 @@
 #include "params/SrcClockDomain.hh"
 #include "sim/clock_domain.hh"
 #include "sim/voltage_domain.hh"
+#include "sim/clocked_object.hh"
 
 double
 ClockDomain::voltage() const
@@ -65,6 +68,11 @@ SrcClockDomain::clockPeriod(Tick clock_period)
         fatal("%s has a clock period of zero\n", name());
     }
 
+    // Align all members to the current tick
+    for (auto m = members.begin(); m != members.end(); ++m) {
+        (*m)->updateClockPeriod();
+    }
+
     _clockPeriod = clock_period;
 
     DPRINTF(ClockDomain,
@@ -105,6 +113,11 @@ DerivedClockDomain::DerivedClockDomain(const Params *p) :
 void
 DerivedClockDomain::updateClockPeriod()
 {
+    // Align all members to the current tick
+    for (auto m = members.begin(); m != members.end(); ++m) {
+        (*m)->updateClockPeriod();
+    }
+
     // recalculate the clock period, relying on the fact that changes
     // propagate downwards in the tree
     _clockPeriod = parent.clockPeriod() * clockDivider;
index 619f30696ad60c9fe9cd758c18b0caab8ebb18ce..e6b7273c1f297ad937472ffa512da49e8b51e7fb 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2013 ARM Limited
+ * Copyright (c) 2013 Cornell University
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -36,6 +37,7 @@
  *
  * Authors: Vasileios Spiliopoulos
  *          Akash Bagdia
+ *          Christopher Torng
  */
 
 /**
@@ -46,6 +48,8 @@
 #ifndef __SIM_CLOCK_DOMAIN_HH__
 #define __SIM_CLOCK_DOMAIN_HH__
 
+#include <algorithm>
+
 #include "base/statistics.hh"
 #include "params/ClockDomain.hh"
 #include "params/DerivedClockDomain.hh"
@@ -57,6 +61,7 @@
  */
 class DerivedClockDomain;
 class VoltageDomain;
+class ClockedObject;
 
 /**
  * The ClockDomain provides clock to group of clocked objects bundled
@@ -86,6 +91,12 @@ class ClockDomain : public SimObject
      */
     std::vector<DerivedClockDomain*> children;
 
+    /**
+     * Pointers to members of this clock domain, so that when the clock
+     * period changes, we can update each member's tick.
+     */
+    std::vector<ClockedObject*> members;
+
   public:
 
     typedef ClockDomainParams Params;
@@ -101,6 +112,18 @@ class ClockDomain : public SimObject
      */
     inline Tick clockPeriod() const { return _clockPeriod; }
 
+    /**
+     * Register a ClockedObject to this ClockDomain.
+     *
+     * @param ClockedObject to add as a member
+     */
+    void registerWithClockDomain(ClockedObject *c)
+    {
+        assert(c != NULL);
+        assert(std::find(members.begin(), members.end(), c) == members.end());
+        members.push_back(c);
+    }
+
     /**
      * Get the voltage domain.
      *
@@ -145,6 +168,8 @@ class SrcClockDomain : public ClockDomain
      */
     void clockPeriod(Tick clock_period);
 
+    // Explicitly import the otherwise hidden clockPeriod
+    using ClockDomain::clockPeriod;
 };
 
 /**
index 304397a3873ac71431bca272973ab56f6812f0a3..fb020f567095879ed294a4900cfc0b7cc9deed1a 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2012-2013 ARM Limited
+ * Copyright (c) 2013 Cornell University
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -35,6 +36,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * Authors: Andreas Hansson
+ *          Christopher Torng
  */
 
 /**
@@ -118,6 +120,9 @@ class ClockedObject : public SimObject
     ClockedObject(const ClockedObjectParams* p) :
         SimObject(p), tick(0), cycle(0), clockDomain(*p->clk_domain)
     {
+        // Register with the clock domain, so that if the clock domain
+        // frequency changes, we can update this object's tick.
+        clockDomain.registerWithClockDomain(this);
     }
 
     /**
@@ -139,6 +144,15 @@ class ClockedObject : public SimObject
 
   public:
 
+    /**
+     * Update the tick to the current tick.
+     *
+     */
+    inline void updateClockPeriod() const
+    {
+        update();
+    }
+
     /**
      * Determine the tick when a cycle begins, by default the current
      * one, but the argument also enables the caller to determine a