Ruby System: Convert to Clocked Object
authorNilay Vaish <nilay@cs.wisc.edu>
Mon, 10 Sep 2012 17:21:01 +0000 (12:21 -0500)
committerNilay Vaish <nilay@cs.wisc.edu>
Mon, 10 Sep 2012 17:21:01 +0000 (12:21 -0500)
This patch moves Ruby System from being a SimObject to recently introduced
ClockedObject.

src/mem/ruby/buffers/MessageBuffer.cc
src/mem/ruby/common/Consumer.cc
src/mem/ruby/profiler/Profiler.cc
src/mem/ruby/system/RubyMemoryControl.cc
src/mem/ruby/system/RubyPort.cc
src/mem/ruby/system/RubySystem.py
src/mem/ruby/system/Sequencer.cc
src/mem/ruby/system/System.cc
src/mem/ruby/system/System.hh
src/mem/slicc/symbols/Type.py

index ee1c709f15b5f2b9eb708635ad782641c6eb4463..f0d372a5214f2bc0036c21793fbb6481594a7c14 100644 (file)
@@ -192,10 +192,10 @@ MessageBuffer::enqueue(MsgPtr message, Time delta)
             panic("FIFO ordering violated: %s name: %s current time: %d "
                   "delta: %d arrival_time: %d last arrival_time: %d\n",
                   *this, m_name,
-                  current_time * g_system_ptr->getClock(),
-                  delta * g_system_ptr->getClock(),
-                  arrival_time * g_system_ptr->getClock(),
-                  m_last_arrival_time * g_system_ptr->getClock());
+                  current_time * g_system_ptr->clockPeriod(),
+                  delta * g_system_ptr->clockPeriod(),
+                  arrival_time * g_system_ptr->clockPeriod(),
+                  m_last_arrival_time * g_system_ptr->clockPeriod());
         }
     }
 
@@ -223,7 +223,7 @@ MessageBuffer::enqueue(MsgPtr message, Time delta)
         greater<MessageBufferNode>());
 
     DPRINTF(RubyQueue, "Enqueue with arrival_time %lld.\n",
-            arrival_time * g_system_ptr->getClock());
+            arrival_time * g_system_ptr->clockPeriod());
     DPRINTF(RubyQueue, "Enqueue Message: %s.\n", (*(message.get())));
 
     // Schedule the wakeup
index a813962177c3c9c21950fc81354fd5c7d0bced05..1f7aeebd58f8141a3bd9642f7f7d954727a78813 100644 (file)
@@ -51,7 +51,7 @@ Consumer::scheduleEventAbsolute(Time timeAbs)
 void
 Consumer::scheduleEventAbsolute(EventManager *em, Time timeAbs)
 {
-    Tick evt_time = timeAbs * g_system_ptr->getClock();
+    Tick evt_time = g_system_ptr->clockPeriod() * timeAbs;
     if (!alreadyScheduled(evt_time)) {
         // This wakeup is not redundant
         ConsumerEvent *evt = new ConsumerEvent(this);
index 2ab68d2498ce994d1b2609612f48cd9f971a30e6..b6982aca9d656ceaaca2decec2010df1e33d0b15 100644 (file)
@@ -137,7 +137,7 @@ Profiler::wakeup()
     }
 
     //g_system_ptr->getNetwork()->printStats(out);
-    schedule(m_event, curTick() + m_stats_period * g_system_ptr->getClock());
+    schedule(m_event, g_system_ptr->clockEdge(Cycles(m_stats_period )));
 }
 
 void
@@ -151,7 +151,7 @@ Profiler::setPeriodicStatsFile(const string& filename)
     }
 
     m_periodic_output_file_ptr = new ofstream(filename.c_str());
-    schedule(m_event, curTick() + g_system_ptr->getClock());
+    schedule(m_event, g_system_ptr->clockEdge(Cycles(1)));
 }
 
 void
@@ -161,7 +161,7 @@ Profiler::setPeriodicStatsInterval(integer_t period)
          << " Ruby cycles" << endl;
 
     m_stats_period = period;
-    schedule(m_event, curTick() + g_system_ptr->getClock());
+    schedule(m_event, g_system_ptr->clockEdge(Cycles(1)));
 }
 
 void
index f931e4618dbcbaee6c351d268d0dc9c94f842b7f..cfdaaaef7184f8725860e7f779daa3e8f5cba168 100644 (file)
@@ -301,7 +301,7 @@ RubyMemoryControl::enqueueMemRef(MemoryNode& memRef)
     DPRINTF(RubyMemory,
             "New memory request%7d: %#08x %c arrived at %10d bank = %3x sched %c\n",
             m_msg_counter, addr, memRef.m_is_mem_read ? 'R':'W',
-            memRef.m_time * g_system_ptr->getClock(),
+            memRef.m_time * g_system_ptr->clockPeriod(),
             bank, m_event.scheduled() ? 'Y':'N');
 
     m_profiler_ptr->profileMemReq(bank);
@@ -377,7 +377,7 @@ void
 RubyMemoryControl::enqueueToDirectory(MemoryNode req, int latency)
 {
     Time arrival_time = curTick() + (latency * clock);
-    Time ruby_arrival_time = arrival_time / g_system_ptr->getClock();
+    Time ruby_arrival_time = arrival_time / g_system_ptr->clockPeriod();
     req.m_time = ruby_arrival_time;
     m_response_queue.push_back(req);
 
index b24f649a5fdff2dd37ddc95873701d0b2a688ffd..d14b3dba7739a304221863224d889711b1e50e06 100644 (file)
@@ -197,8 +197,8 @@ RubyPort::M5Port::recvTimingReq(PacketPtr pkt)
                 pkt->getAddr());
 
         // send next cycle
-        ruby_port->pio_port.schedTimingReq(pkt, curTick() +
-                                           g_system_ptr->getClock());
+        ruby_port->pio_port.schedTimingReq(pkt,
+            curTick() + g_system_ptr->clockPeriod());
         return true;
     }
 
@@ -651,7 +651,7 @@ RubyPort::M5Port::hitCallback(PacketPtr pkt)
     if (needsResponse) {
         DPRINTF(RubyPort, "Sending packet back over port\n");
         // send next cycle
-        schedTimingResp(pkt, curTick() + g_system_ptr->getClock());
+        schedTimingResp(pkt, curTick() + g_system_ptr->clockPeriod());
     } else {
         delete pkt;
     }
index d66ada4b91f2c05522e6320f62af9dacac45240d..c9d2e96ac00c8a75d382870073e7c1c6df5e2153 100644 (file)
 #          Brad Beckmann
 
 from m5.params import *
-from m5.SimObject import SimObject
+from ClockedObject import ClockedObject
 
-class RubySystem(SimObject):
+class RubySystem(ClockedObject):
     type = 'RubySystem'
     random_seed = Param.Int(1234, "random seed used by the simulation");
     randomization = Param.Bool(False,
         "insert random delays on message enqueue times");
-    clock = Param.Clock('1GHz', "")
+    clock = '1GHz'
     block_size_bytes = Param.Int(64,
         "default cache block size; must be a power of two");
     mem_size = Param.MemorySize("total memory size of the system");
index 01d34814f642a44df0056ca8000b922a29dac5c7..c48ff59cf4bd33b53b5730b4371c0488dafd798e 100644 (file)
@@ -129,8 +129,7 @@ Sequencer::wakeup()
     if (m_outstanding_count > 0) {
         // If there are still outstanding requests, keep checking
         schedule(deadlockCheckEvent,
-                 m_deadlock_threshold * g_system_ptr->getClock() +
-                 curTick());
+            g_system_ptr->clockPeriod() * m_deadlock_threshold + curTick());
     }
 }
 
@@ -210,8 +209,7 @@ Sequencer::insertRequest(PacketPtr pkt, RubyRequestType request_type)
     // See if we should schedule a deadlock check
     if (deadlockCheckEvent.scheduled() == false) {
         schedule(deadlockCheckEvent,
-                 m_deadlock_threshold * g_system_ptr->getClock()
-                 + curTick());
+            g_system_ptr->clockPeriod() * m_deadlock_threshold + curTick());
     }
 
     Address line_addr(pkt->getAddr());
index 7921d306d7400fcdf3a242e675d2194aaffcba31..c22272e0303288053e5df836416d6769abe76e64 100644 (file)
@@ -45,7 +45,6 @@ using namespace std;
 
 int RubySystem::m_random_seed;
 bool RubySystem::m_randomization;
-Tick RubySystem::m_clock;
 int RubySystem::m_block_size_bytes;
 int RubySystem::m_block_size_bits;
 uint64 RubySystem::m_memory_size_bytes;
@@ -56,7 +55,7 @@ Profiler* RubySystem::m_profiler_ptr;
 MemoryVector* RubySystem::m_mem_vec_ptr;
 
 RubySystem::RubySystem(const Params *p)
-    : SimObject(p)
+    : ClockedObject(p)
 {
     if (g_system_ptr != NULL)
         fatal("Only one RubySystem object currently allowed.\n");
@@ -64,7 +63,6 @@ RubySystem::RubySystem(const Params *p)
     m_random_seed = p->random_seed;
     srandom(m_random_seed);
     m_randomization = p->randomization;
-    m_clock = p->clock;
 
     m_block_size_bytes = p->block_size_bytes;
     assert(isPowerOf2(m_block_size_bytes));
index e6501f7bfb53936d5716629425dd5183adfcc73e..7426894d88f28773f5aff38c0ff1b7882f68fc2b 100644 (file)
 #include "mem/ruby/system/MemoryVector.hh"
 #include "mem/ruby/system/SparseMemory.hh"
 #include "params/RubySystem.hh"
-#include "sim/sim_object.hh"
+#include "sim/clocked_object.hh"
 
 class Network;
 class Profiler;
 class MemoryControl;
 
-class RubySystem : public SimObject
+class RubySystem : public ClockedObject
 {
   public:
     class RubyEvent : public Event
@@ -77,8 +77,7 @@ class RubySystem : public SimObject
     static int getBlockSizeBits() { return m_block_size_bits; }
     static uint64 getMemorySizeBytes() { return m_memory_size_bytes; }
     static int getMemorySizeBits() { return m_memory_size_bits; }
-    Tick getTime() const { return curTick() / m_clock; }
-    Tick getClock() const { return m_clock; }
+    Cycles getTime() const { return curCycle(); }
 
     // Public Methods
     static Network*
@@ -145,7 +144,6 @@ class RubySystem : public SimObject
     // configuration parameters
     static int m_random_seed;
     static bool m_randomization;
-    static Tick m_clock;
     static int m_block_size_bytes;
     static int m_block_size_bits;
     static uint64 m_memory_size_bytes;
index 42ee8894a1f00e631e9f0b0ef84e2ed678722dbf..3285b767f5e9d486ced48b295731d8d528722465 100644 (file)
@@ -415,7 +415,7 @@ ${{self.c_ident}}::print(ostream& out) const
             code('out << "${{dm.ident}} = " << m_${{dm.ident}} << " ";''')
 
         if self.isMessage:
-            code('out << "Time = " << getTime() * g_system_ptr->getClock() << " ";')
+            code('out << "Time = " << g_system_ptr->clockPeriod() * getTime() << " ";')
         code.dedent()
 
         # Trailer