ruby: enable multiple clock domains
authorNilay Vaish <nilay@cs.wisc.edu>
Mon, 11 Feb 2013 03:43:17 +0000 (21:43 -0600)
committerNilay Vaish <nilay@cs.wisc.edu>
Mon, 11 Feb 2013 03:43:17 +0000 (21:43 -0600)
This patch allows ruby to have multiple clock domains. As I understand
with this patch, controllers can have different frequencies. The entire
network needs to run at a single frequency.

The idea is that with in an object, time is treated in terms of cycles.
But the messages that are passed from one entity to another should contain
the time in Ticks. As of now, this is only true for the message buffers,
but not for the links in the network. As I understand the code, all the
entities in different networks (simple, garnet-fixed, garnet-flexible) should
be clocked at the same frequency.

Another problem is that the directory controller has to operate at the same
frequency as the ruby system. This is because the memory controller does
not make use of the Message Buffer, and instead implements a buffer of its
own. So, it has no idea of the frequency at which the directory controller
is operating and uses ruby system's frequency for scheduling events.

23 files changed:
src/mem/ruby/buffers/MessageBuffer.cc
src/mem/ruby/buffers/MessageBuffer.hh
src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc
src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc
src/mem/ruby/network/simple/PerfectSwitch.cc
src/mem/ruby/network/simple/PerfectSwitch.hh
src/mem/ruby/network/simple/Switch.cc
src/mem/ruby/network/simple/Throttle.cc
src/mem/ruby/network/simple/Throttle.hh
src/mem/ruby/profiler/Profiler.cc
src/mem/ruby/slicc_interface/Message.hh
src/mem/ruby/slicc_interface/NetworkMessage.hh
src/mem/ruby/slicc_interface/RubyRequest.hh
src/mem/ruby/system/DMASequencer.cc
src/mem/ruby/system/RubyMemoryControl.cc
src/mem/ruby/system/RubyPort.cc
src/mem/ruby/system/RubyPort.hh
src/mem/ruby/system/Sequencer.cc
src/mem/ruby/system/System.hh
src/mem/ruby/system/WireBuffer.cc
src/mem/slicc/ast/EnqueueStatementAST.py
src/mem/slicc/symbols/StateMachine.py
src/mem/slicc/symbols/Type.py

index c9b255c025ed822a08ec497488d9e910cba23eb6..92c989851e3c23e693adf445627c55f8635dafcc 100644 (file)
@@ -44,7 +44,8 @@ MessageBuffer::MessageBuffer(const string &name)
 {
     m_msg_counter = 0;
     m_consumer_ptr = NULL;
-    m_clockobj_ptr = NULL;
+    m_sender_ptr = NULL;
+    m_receiver_ptr = NULL;
 
     m_ordering_set = false;
     m_strict_fifo = true;
@@ -66,10 +67,10 @@ MessageBuffer::MessageBuffer(const string &name)
 int
 MessageBuffer::getSize()
 {
-    if (m_time_last_time_size_checked == m_clockobj_ptr->curCycle()) {
+    if (m_time_last_time_size_checked == m_receiver_ptr->curCycle()) {
         return m_size_last_time_size_checked;
     } else {
-        m_time_last_time_size_checked = m_clockobj_ptr->curCycle();
+        m_time_last_time_size_checked = m_receiver_ptr->curCycle();
         m_size_last_time_size_checked = m_size;
         return m_size;
     }
@@ -89,11 +90,11 @@ MessageBuffer::areNSlotsAvailable(int n)
     // until next cycle, but enqueue operations effect the visible
     // size immediately
     int current_size = max(m_size_at_cycle_start, m_size);
-    if (m_time_last_time_pop < m_clockobj_ptr->curCycle()) {
+    if (m_time_last_time_pop < m_receiver_ptr->curCycle()) {
         // no pops this cycle - m_size is correct
         current_size = m_size;
     } else {
-        if (m_time_last_time_enqueue < m_clockobj_ptr->curCycle()) {
+        if (m_time_last_time_enqueue < m_receiver_ptr->curCycle()) {
             // no enqueues this cycle - m_size_at_cycle_start is correct
             current_size = m_size_at_cycle_start;
         } else {
@@ -149,15 +150,15 @@ random_time()
 }
 
 void
-MessageBuffer::enqueue(MsgPtr message, Cycles delta)
+MessageBuffer::enqueue(MsgPtr message, Cycles delay)
 {
     m_msg_counter++;
     m_size++;
 
     // record current time incase we have a pop that also adjusts my size
-    if (m_time_last_time_enqueue < m_clockobj_ptr->curCycle()) {
+    if (m_time_last_time_enqueue < m_receiver_ptr->curCycle()) {
         m_msgs_this_cycle = 0;  // first msg this cycle
-        m_time_last_time_enqueue = m_clockobj_ptr->curCycle();
+        m_time_last_time_enqueue = m_receiver_ptr->curCycle();
     }
     m_msgs_this_cycle++;
 
@@ -167,8 +168,11 @@ MessageBuffer::enqueue(MsgPtr message, Cycles delta)
 
     // Calculate the arrival time of the message, that is, the first
     // cycle the message can be dequeued.
-    assert(delta>0);
-    Cycles current_time(m_clockobj_ptr->curCycle());
+    assert(delay > 0);
+    Cycles delta = m_receiver_ptr->ticksToCycles(delay *
+                                                 m_sender_ptr->clockPeriod());
+
+    Cycles current_time(m_receiver_ptr->curCycle());
     Cycles arrival_time(0);
 
     if (!RubySystem::getRandomization() || (m_randomization == false)) {
@@ -192,10 +196,10 @@ MessageBuffer::enqueue(MsgPtr message, Cycles delta)
         if (arrival_time < m_last_arrival_time) {
             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 * m_clockobj_ptr->clockPeriod(),
-                  delta * m_clockobj_ptr->clockPeriod(),
-                  arrival_time * m_clockobj_ptr->clockPeriod(),
-                  m_last_arrival_time * m_clockobj_ptr->clockPeriod());
+                  *this, m_name, current_time * m_receiver_ptr->clockPeriod(),
+                  delta * m_receiver_ptr->clockPeriod(),
+                  arrival_time * m_receiver_ptr->clockPeriod(),
+                  m_last_arrival_time * m_receiver_ptr->clockPeriod());
         }
     }
 
@@ -208,13 +212,13 @@ MessageBuffer::enqueue(MsgPtr message, Cycles delta)
     Message* msg_ptr = message.get();
     assert(msg_ptr != NULL);
 
-    assert(m_clockobj_ptr->curCycle() >= msg_ptr->getLastEnqueueTime() &&
+    assert(m_receiver_ptr->clockEdge() >= msg_ptr->getLastEnqueueTime() &&
            "ensure we aren't dequeued early");
 
-    msg_ptr->setDelayedCycles(m_clockobj_ptr->curCycle() -
+    msg_ptr->setDelayedTicks(m_receiver_ptr->clockEdge() -
                               msg_ptr->getLastEnqueueTime() +
-                              msg_ptr->getDelayedCycles());
-    msg_ptr->setLastEnqueueTime(arrival_time);
+                              msg_ptr->getDelayedTicks());
+    msg_ptr->setLastEnqueueTime(arrival_time * m_receiver_ptr->clockPeriod());
 
     // Insert the message into the priority heap
     MessageBufferNode thisNode(arrival_time, m_msg_counter, message);
@@ -223,7 +227,7 @@ MessageBuffer::enqueue(MsgPtr message, Cycles delta)
         greater<MessageBufferNode>());
 
     DPRINTF(RubyQueue, "Enqueue arrival_time: %lld, Message: %s\n",
-            arrival_time * m_clockobj_ptr->clockPeriod(), *(message.get()));
+            arrival_time * m_receiver_ptr->clockPeriod(), *(message.get()));
 
     // Schedule the wakeup
     if (m_consumer_ptr != NULL) {
@@ -275,9 +279,9 @@ MessageBuffer::pop()
 
     // record previous size and time so the current buffer size isn't
     // adjusted until next cycle
-    if (m_time_last_time_pop < m_clockobj_ptr->curCycle()) {
+    if (m_time_last_time_pop < m_receiver_ptr->curCycle()) {
         m_size_at_cycle_start = m_size;
-        m_time_last_time_pop = m_clockobj_ptr->curCycle();
+        m_time_last_time_pop = m_receiver_ptr->curCycle();
     }
     m_size--;
 }
@@ -304,11 +308,11 @@ MessageBuffer::recycle()
     pop_heap(m_prio_heap.begin(), m_prio_heap.end(),
         greater<MessageBufferNode>());
 
-    node.m_time = m_clockobj_ptr->curCycle() + m_recycle_latency;
+    node.m_time = m_receiver_ptr->curCycle() + m_recycle_latency;
     m_prio_heap.back() = node;
     push_heap(m_prio_heap.begin(), m_prio_heap.end(),
         greater<MessageBufferNode>());
-    m_consumer_ptr->scheduleEventAbsolute(m_clockobj_ptr->curCycle() +
+    m_consumer_ptr->scheduleEventAbsolute(m_receiver_ptr->curCycle() +
                                           m_recycle_latency);
 }
 
@@ -317,7 +321,7 @@ MessageBuffer::reanalyzeMessages(const Address& addr)
 {
     DPRINTF(RubyQueue, "ReanalyzeMessages\n");
     assert(m_stall_msg_map.count(addr) > 0);
-    Cycles nextCycle = m_clockobj_ptr->curCycle() + Cycles(1);
+    Cycles nextCycle = m_receiver_ptr->curCycle() + Cycles(1);
 
     //
     // Put all stalled messages associated with this address back on the
@@ -342,7 +346,7 @@ void
 MessageBuffer::reanalyzeAllMessages()
 {
     DPRINTF(RubyQueue, "ReanalyzeAllMessages %s\n");
-    Cycles nextCycle = m_clockobj_ptr->curCycle() + Cycles(1);
+    Cycles nextCycle = m_receiver_ptr->curCycle() + Cycles(1);
 
     //
     // Put all stalled messages associated with this address back on the
@@ -393,12 +397,13 @@ MessageBuffer::setAndReturnDelayCycles(MsgPtr msg_ptr)
 
     // this function should only be called on dequeue
     // ensure the msg hasn't been enqueued
-    assert(msg_ptr->getLastEnqueueTime() <= m_clockobj_ptr->curCycle());
-    msg_ptr->setDelayedCycles(m_clockobj_ptr->curCycle() -
-                             msg_ptr->getLastEnqueueTime() +
-                             msg_ptr->getDelayedCycles());
+    assert(msg_ptr->getLastEnqueueTime() <= m_receiver_ptr->clockEdge());
+
+    msg_ptr->setDelayedTicks(m_receiver_ptr->clockEdge() -
+                              msg_ptr->getLastEnqueueTime() +
+                              msg_ptr->getDelayedTicks());
 
-    return msg_ptr->getDelayedCycles();
+    return m_receiver_ptr->ticksToCycles(msg_ptr->getDelayedTicks());
 }
 
 void
@@ -425,7 +430,7 @@ bool
 MessageBuffer::isReady() const
 {
     return ((m_prio_heap.size() > 0) &&
-            (m_prio_heap.front().m_time <= m_clockobj_ptr->curCycle()));
+            (m_prio_heap.front().m_time <= m_receiver_ptr->curCycle()));
 }
 
 bool
index e68a05786fd995d585414d77b7eb1ea766e64906..74023a8accb1586d6fffe19fc2a73fed3193dc94 100644 (file)
@@ -83,10 +83,16 @@ class MessageBuffer
         m_consumer_ptr = consumer_ptr;
     }
 
-    void setClockObj(ClockedObject* obj)
+    void setSender(ClockedObject* obj)
     {
-        assert(m_clockobj_ptr == NULL);
-        m_clockobj_ptr = obj;
+        assert(m_sender_ptr == NULL || m_sender_ptr == obj);
+        m_sender_ptr = obj;
+    }
+
+    void setReceiver(ClockedObject* obj)
+    {
+        assert(m_receiver_ptr == NULL || m_receiver_ptr == obj);
+        m_receiver_ptr = obj;
     }
 
     void setDescription(const std::string& name) { m_name = name; }
@@ -167,8 +173,10 @@ class MessageBuffer
     MessageBuffer& operator=(const MessageBuffer& obj);
 
     // Data Members (m_ prefix)
-    //! Object used for querying time.
-    ClockedObject* m_clockobj_ptr;
+    //! The two ends of the buffer.
+    ClockedObject* m_sender_ptr;
+    ClockedObject* m_receiver_ptr;
+
     //! Consumer to signal a wakeup(), can be NULL
     Consumer* m_consumer_ptr;
     std::vector<MessageBufferNode> m_prio_heap;
index 3d915598e5e2d4a37fec887175a7d16710262f03..ca4d6aabe519e66ac9c19a481eabe1dc36bd1951 100644 (file)
@@ -116,7 +116,9 @@ NetworkInterface_d::addNode(vector<MessageBuffer *>& in,
 
         // the protocol injects messages into the NI
         inNode_ptr[j]->setConsumer(this);
-        inNode_ptr[j]->setClockObj(m_net_ptr);
+        inNode_ptr[j]->setReceiver(m_net_ptr);
+
+        outNode_ptr[j]->setSender(m_net_ptr);
     }
 }
 
@@ -173,7 +175,8 @@ NetworkInterface_d::flitisizeMessage(MsgPtr msg_ptr, int vnet)
             flit_d *fl = new flit_d(i, vc, vnet, num_flits, new_msg_ptr,
                 m_net_ptr->curCycle());
 
-            fl->set_delay(m_net_ptr->curCycle() - msg_ptr->getTime());
+            fl->set_delay(m_net_ptr->curCycle() -
+                          m_net_ptr->ticksToCycles(msg_ptr->getTime()));
             m_ni_buffers[vc]->insert(fl);
         }
 
index ddb5da716b25eef220cfd71fb1cc7c24e8df3018..79e295601e2587e8e6d0de8a4bad5825a04a9738 100644 (file)
@@ -106,7 +106,9 @@ NetworkInterface::addNode(vector<MessageBuffer*>& in,
     // protocol injects messages into the NI
     for (int j = 0; j < m_virtual_networks; j++) {
         inNode_ptr[j]->setConsumer(this);
-        inNode_ptr[j]->setClockObj(m_net_ptr);
+        inNode_ptr[j]->setReceiver(m_net_ptr);
+
+        outNode_ptr[j]->setSender(m_net_ptr);
     }
 }
 
@@ -169,7 +171,8 @@ NetworkInterface::flitisizeMessage(MsgPtr msg_ptr, int vnet)
             m_net_ptr->increment_injected_flits(vnet);
             flit *fl = new flit(i, vc, vnet, num_flits, new_msg_ptr,
                                 m_net_ptr->curCycle());
-            fl->set_delay(m_net_ptr->curCycle() - msg_ptr->getTime());
+            fl->set_delay(m_net_ptr->curCycle() -
+                          m_net_ptr->ticksToCycles(msg_ptr->getTime()));
             m_ni_buffers[vc]->insert(fl);
         }
 
index 687bdbd86e4311d7112592a2de8ee3bb42209458..ecfe12f154ab0f5197de8d860136081c4af1ff99 100644 (file)
@@ -68,7 +68,7 @@ PerfectSwitch::init(SimpleNetwork *network_ptr)
 }
 
 void
-PerfectSwitch::addInPort(const vector<MessageBuffer*>& in, Switch *sw)
+PerfectSwitch::addInPort(const vector<MessageBuffer*>& in)
 {
     assert(in.size() == m_virtual_networks);
     NodeID port = m_in.size();
@@ -76,7 +76,6 @@ PerfectSwitch::addInPort(const vector<MessageBuffer*>& in, Switch *sw)
 
     for (int j = 0; j < m_virtual_networks; j++) {
         m_in[port][j]->setConsumer(this);
-        m_in[port][j]->setClockObj(sw);
 
         string desc = csprintf("[Queue from port %s %s %s to PerfectSwitch]",
             to_string(m_switch_id), to_string(port), to_string(j));
index ffd1f84ba08020d201dd05e6b98d46463948d3d9..695c848bcf4e157e5ba93ed527152ee88e47cc9d 100644 (file)
@@ -63,7 +63,7 @@ class PerfectSwitch : public Consumer
     { return csprintf("PerfectSwitch-%i", m_switch_id); }
 
     void init(SimpleNetwork *);
-    void addInPort(const std::vector<MessageBuffer*>& in, Switch *);
+    void addInPort(const std::vector<MessageBuffer*>& in);
     void addOutPort(const std::vector<MessageBuffer*>& out,
         const NetDest& routing_table_entry);
     void clearRoutingTables();
index 76d37c3218d8715c57bd5713cce78bd68d505270..d951ea38df54c4b3cf70bb62f20d7a8843ad09d8 100644 (file)
@@ -67,7 +67,11 @@ Switch::init()
 void
 Switch::addInPort(const vector<MessageBuffer*>& in)
 {
-    m_perfect_switch_ptr->addInPort(in, this);
+    m_perfect_switch_ptr->addInPort(in);
+
+    for (int i = 0; i < in.size(); i++) {
+        in[i]->setReceiver(this);
+    }
 }
 
 void
@@ -83,21 +87,27 @@ Switch::addOutPort(const vector<MessageBuffer*>& out,
     // Create one buffer per vnet (these are intermediaryQueues)
     vector<MessageBuffer*> intermediateBuffers;
     for (int i = 0; i < out.size(); i++) {
+        out[i]->setSender(this);
+
         MessageBuffer* buffer_ptr = new MessageBuffer;
         // Make these queues ordered
         buffer_ptr->setOrdering(true);
         if (m_network_ptr->getBufferSize() > 0) {
             buffer_ptr->resize(m_network_ptr->getBufferSize());
         }
+
         intermediateBuffers.push_back(buffer_ptr);
         m_buffers_to_free.push_back(buffer_ptr);
+
+        buffer_ptr->setSender(this);
+        buffer_ptr->setReceiver(this);
     }
 
     // Hook the queues to the PerfectSwitch
     m_perfect_switch_ptr->addOutPort(intermediateBuffers, routing_table_entry);
 
     // Hook the queues to the Throttle
-    throttle_ptr->addLinks(intermediateBuffers, out, this);
+    throttle_ptr->addLinks(intermediateBuffers, out);
 }
 
 void
index bb5d9cf53c3db0d81f4b493570e56842fd64c008..88abe416724cf3ee3703eb8f41fe100d6e17486e 100644 (file)
@@ -93,11 +93,11 @@ Throttle::clear()
 
 void
 Throttle::addLinks(const std::vector<MessageBuffer*>& in_vec,
-    const std::vector<MessageBuffer*>& out_vec, ClockedObject *em)
+    const std::vector<MessageBuffer*>& out_vec)
 {
     assert(in_vec.size() == out_vec.size());
     for (int i=0; i<in_vec.size(); i++) {
-        addVirtualNetwork(in_vec[i], out_vec[i], em);
+        addVirtualNetwork(in_vec[i], out_vec[i]);
     }
 
     m_message_counters.resize(MessageSizeType_NUM);
@@ -110,8 +110,7 @@ Throttle::addLinks(const std::vector<MessageBuffer*>& in_vec,
 }
 
 void
-Throttle::addVirtualNetwork(MessageBuffer* in_ptr, MessageBuffer* out_ptr,
-                            ClockedObject *em)
+Throttle::addVirtualNetwork(MessageBuffer* in_ptr, MessageBuffer* out_ptr)
 {
     m_units_remaining.push_back(0);
     m_in.push_back(in_ptr);
@@ -119,7 +118,6 @@ Throttle::addVirtualNetwork(MessageBuffer* in_ptr, MessageBuffer* out_ptr,
 
     // Set consumer and description
     m_in[m_vnets]->setConsumer(this);
-    m_in[m_vnets]->setClockObj(em);
 
     string desc = "[Queue to Throttle " + to_string(m_sID) + " " +
         to_string(m_node) + "]";
@@ -174,7 +172,7 @@ Throttle::wakeup()
                 DPRINTF(RubyNetwork, "throttle: %d my bw %d bw spent "
                         "enqueueing net msg %d time: %lld.\n",
                         m_node, getLinkBandwidth(), m_units_remaining[vnet],
-                        g_system_ptr->getTime());
+                        g_system_ptr->curCycle());
 
                 // Move the message
                 m_out[vnet]->enqueue(m_in[vnet]->peekMsgPtr(), m_link_latency);
@@ -235,7 +233,7 @@ Throttle::printStats(ostream& out) const
 void
 Throttle::clearStats()
 {
-    m_ruby_start = g_system_ptr->getTime();
+    m_ruby_start = g_system_ptr->curCycle();
     m_links_utilized = 0.0;
 
     for (int i = 0; i < m_message_counters.size(); i++) {
@@ -249,7 +247,7 @@ double
 Throttle::getUtilization() const
 {
     return 100.0 * double(m_links_utilized) /
-        double(g_system_ptr->getTime()-m_ruby_start);
+        double(g_system_ptr->curCycle()-m_ruby_start);
 }
 
 void
index 4a84227fb2d22aecd532241a525efb58ca988f23..2ca474f4186ae6d5ac4a4edea0bb8a0a70ca4eb4 100644 (file)
@@ -63,7 +63,7 @@ class Throttle : public Consumer
     { return csprintf("Throttle-%i", m_sID); }
 
     void addLinks(const std::vector<MessageBuffer*>& in_vec,
-        const std::vector<MessageBuffer*>& out_vec, ClockedObject *em);
+        const std::vector<MessageBuffer*>& out_vec);
     void wakeup();
 
     void printStats(std::ostream& out) const;
@@ -87,8 +87,7 @@ class Throttle : public Consumer
   private:
     void init(NodeID node, Cycles link_latency, int link_bandwidth_multiplier,
               int endpoint_bandwidth);
-    void addVirtualNetwork(MessageBuffer* in_ptr, MessageBuffer* out_ptr,
-        ClockedObject *em);
+    void addVirtualNetwork(MessageBuffer* in_ptr, MessageBuffer* out_ptr);
     void linkUtilized(double ratio) { m_links_utilized += ratio; }
 
     // Private copy constructor and assignment operator
index e1528578401bfb15c0a6627cfa5b1a978e6a8125..e78e7ede54555f2cc33a885adb14d0534f9d9c1f 100644 (file)
@@ -113,13 +113,13 @@ Profiler::wakeup()
 
     for (int i = 0; i < m_num_of_sequencers; i++) {
         perProcCycleCount[i] =
-            g_system_ptr->getTime() - m_cycles_executed_at_start[i] + 1;
+            g_system_ptr->curCycle() - m_cycles_executed_at_start[i] + 1;
         // The +1 allows us to avoid division by zero
     }
 
     ostream &out = *m_periodic_output_file_ptr;
 
-    out << "ruby_cycles: " << g_system_ptr->getTime()-m_ruby_start << endl
+    out << "ruby_cycles: " << g_system_ptr->curCycle()-m_ruby_start << endl
         << "mbytes_resident: " << process_memory_resident() << endl
         << "mbytes_total: " << process_memory_total() << endl;
 
@@ -270,7 +270,7 @@ Profiler::printStats(ostream& out, bool short_stats)
     double minutes = seconds / 60.0;
     double hours = minutes / 60.0;
     double days = hours / 24.0;
-    Cycles ruby_cycles = g_system_ptr->getTime()-m_ruby_start;
+    Cycles ruby_cycles = g_system_ptr->curCycle()-m_ruby_start;
 
     if (!short_stats) {
         out << "Elapsed_time_in_seconds: " << seconds << endl;
@@ -293,7 +293,7 @@ Profiler::printStats(ostream& out, bool short_stats)
     out << "Virtual_time_in_days:    " << days << endl;
     out << endl;
 
-    out << "Ruby_current_time: " << g_system_ptr->getTime() << endl;
+    out << "Ruby_current_time: " << g_system_ptr->curCycle() << endl;
     out << "Ruby_start_time: " << m_ruby_start << endl;
     out << "Ruby_cycles: " << ruby_cycles << endl;
     out << endl;
@@ -312,7 +312,7 @@ Profiler::printStats(ostream& out, bool short_stats)
 
     for (int i = 0; i < m_num_of_sequencers; i++) {
         perProcCycleCount[i] =
-            g_system_ptr->getTime() - m_cycles_executed_at_start[i] + 1;
+            g_system_ptr->curCycle() - m_cycles_executed_at_start[i] + 1;
         // The +1 allows us to avoid division by zero
     }
 
@@ -497,7 +497,7 @@ Profiler::printResourceUsage(ostream& out) const
 void
 Profiler::clearStats()
 {
-    m_ruby_start = g_system_ptr->getTime();
+    m_ruby_start = g_system_ptr->curCycle();
     m_real_time_start_time = time(NULL);
 
     m_cycles_executed_at_start.resize(m_num_of_sequencers);
@@ -505,7 +505,7 @@ Profiler::clearStats()
         if (g_system_ptr == NULL) {
             m_cycles_executed_at_start[i] = 0;
         } else {
-            m_cycles_executed_at_start[i] = g_system_ptr->getTime();
+            m_cycles_executed_at_start[i] = g_system_ptr->curCycle();
         }
     }
 
@@ -563,7 +563,7 @@ Profiler::clearStats()
     //g_eventQueue_ptr->triggerAllEvents();
 
     // update the start time
-    m_ruby_start = g_system_ptr->getTime();
+    m_ruby_start = g_system_ptr->curCycle();
 }
 
 void
@@ -734,7 +734,7 @@ Profiler::rubyWatch(int id)
     uint64 tr = 0;
     Address watch_address = Address(tr);
 
-    DPRINTFN("%7s %3s RUBY WATCH %d\n", g_system_ptr->getTime(), id,
+    DPRINTFN("%7s %3s RUBY WATCH %d\n", g_system_ptr->curCycle(), id,
         watch_address);
 
     // don't care about success or failure
index c99d66f5ca30f0cb55b9d5a17a88b84fff580a68..e78ad9a764ffc325e3d4d89f9e1ec3e8bb0730a2 100644 (file)
@@ -40,16 +40,16 @@ typedef RefCountingPtr<Message> MsgPtr;
 class Message : public RefCounted
 {
   public:
-    Message(Cycles curTime)
+    Message(Tick curTime)
         : m_time(curTime),
           m_LastEnqueueTime(curTime),
-          m_DelayedCycles(0)
+          m_DelayedTicks(0)
     { }
 
     Message(const Message &other)
         : m_time(other.m_time),
           m_LastEnqueueTime(other.m_LastEnqueueTime),
-          m_DelayedCycles(other.m_DelayedCycles)
+          m_DelayedTicks(other.m_DelayedTicks)
     { }
 
     virtual ~Message() { }
@@ -71,19 +71,19 @@ class Message : public RefCounted
     virtual bool functionalWrite(Packet *pkt) = 0;
     //{ fatal("Write functional access not implemented!"); }
 
-    void setDelayedCycles(const Cycles cycles) { m_DelayedCycles = cycles; }
-    const Cycles getDelayedCycles() const {return m_DelayedCycles;}
+    void setDelayedTicks(const Tick ticks) { m_DelayedTicks = ticks; }
+    const Tick getDelayedTicks() const {return m_DelayedTicks;}
 
-    void setLastEnqueueTime(const Cycles& time) { m_LastEnqueueTime = time; }
-    const Cycles getLastEnqueueTime() const {return m_LastEnqueueTime;}
+    void setLastEnqueueTime(const Tick& time) { m_LastEnqueueTime = time; }
+    const Tick getLastEnqueueTime() const {return m_LastEnqueueTime;}
 
-    const Cycles& getTime() const { return m_time; }
-    void setTime(const Cycles& new_time) { m_time = new_time; }
+    const Tick& getTime() const { return m_time; }
+    void setTime(const Tick& new_time) { m_time = new_time; }
 
   private:
-    Cycles m_time;
-    Cycles m_LastEnqueueTime; // my last enqueue time
-    Cycles m_DelayedCycles; // my delayed cycles
+    Tick m_time;
+    Tick m_LastEnqueueTime; // my last enqueue time
+    Tick m_DelayedTicks; // my delayed cycles
 };
 
 inline std::ostream&
index 4d2968f417df8e4aba71ff47c8f5724a69733c22..3ee13a44a016836408b6b3f166f743d9982ec49e 100644 (file)
@@ -42,7 +42,7 @@ typedef RefCountingPtr<NetworkMessage> NetMsgPtr;
 class NetworkMessage : public Message
 {
   public:
-    NetworkMessage(Cycles curTime)
+    NetworkMessage(Tick curTime)
         : Message(curTime), m_internal_dest_valid(false)
     { }
 
index 654656132a2d2e9063ab3bcf46c56ba47d0f285e..49964ebb92cd122e4acfc10c918f7ddfa5419ec9 100644 (file)
@@ -51,7 +51,7 @@ class RubyRequest : public Message
     PacketPtr pkt;
     unsigned m_contextId;
 
-    RubyRequest(Cycles curTime, uint64_t _paddr, uint8_t* _data, int _len,
+    RubyRequest(Tick curTime, uint64_t _paddr, uint8_t* _data, int _len,
         uint64_t _pc, RubyRequestType _type, RubyAccessMode _access_mode,
         PacketPtr _pkt, PrefetchBit _pb = PrefetchBit_No,
         unsigned _proc_id = 100)
@@ -70,60 +70,18 @@ class RubyRequest : public Message
       m_LineAddress.makeLineAddress();
     }
 
-    RubyRequest(Cycles curTime) : Message(curTime)
-    {
-    }
-
-    RubyRequest*
-    clone() const
-    {
-        return new RubyRequest(*this);
-    }
-
-    const Address&
-    getLineAddress() const
-    {
-        return m_LineAddress;
-    }
-
-    const Address&
-    getPhysicalAddress() const
-    {
-        return m_PhysicalAddress;
-    }
-
-    const RubyRequestType&
-    getType() const
-    {
-        return m_Type;
-    }
+    RubyRequest(Tick curTime) : Message(curTime) {}
+    RubyRequest* clone() const { return new RubyRequest(*this); }
 
-    const Address&
-    getProgramCounter() const
-    {
-        return m_ProgramCounter;
-    }
-
-    const RubyAccessMode&
-    getAccessMode() const
-    {
-      return m_AccessMode;
-    }
-
-    const int&
-    getSize() const
-    {
-      return m_Size;
-    }
-
-    const PrefetchBit&
-    getPrefetch() const
-    {
-      return m_Prefetch;
-    }
+    const Address& getLineAddress() const { return m_LineAddress; }
+    const Address& getPhysicalAddress() const { return m_PhysicalAddress; }
+    const RubyRequestType& getType() const { return m_Type; }
+    const Address& getProgramCounter() const { return m_ProgramCounter; }
+    const RubyAccessMode& getAccessMode() const { return m_AccessMode; }
+    const int& getSize() const { return m_Size; }
+    const PrefetchBit& getPrefetch() const { return m_Prefetch; }
 
     void print(std::ostream& out) const;
-
     bool functionalRead(Packet *pkt);
     bool functionalWrite(Packet *pkt);
 };
index fe9ab39bedf49bc4ced0c435b3bd6a00ebb309e1..37df1c65307c44d7a43ed4fdf1a1ab5e9f6ef612 100644 (file)
@@ -70,7 +70,7 @@ DMASequencer::makeRequest(PacketPtr pkt)
     active_request.bytes_issued = 0;
     active_request.pkt = pkt;
 
-    SequencerMsg *msg = new SequencerMsg(curCycle());
+    SequencerMsg *msg = new SequencerMsg(clockEdge());
     msg->getPhysicalAddress() = Address(paddr);
     msg->getLineAddress() = line_address(msg->getPhysicalAddress());
     msg->getType() = write ? SequencerRequestType_ST : SequencerRequestType_LD;
@@ -108,7 +108,7 @@ DMASequencer::issueNext()
         return;
     }
 
-    SequencerMsg *msg = new SequencerMsg(curCycle());
+    SequencerMsg *msg = new SequencerMsg(clockEdge());
     msg->getPhysicalAddress() = Address(active_request.start_paddr +
                                        active_request.bytes_completed);
 
index 542835102504f67e7b450c9b1a76df4e4f6b7c9f..6212f049ceee8e08e704c580edb8901eeee94f6b 100644 (file)
@@ -278,7 +278,7 @@ RubyMemoryControl::~RubyMemoryControl()
 void
 RubyMemoryControl::enqueue(const MsgPtr& message, Cycles latency)
 {
-    Cycles arrival_time = g_system_ptr->getTime() + latency;
+    Cycles arrival_time = curCycle() + latency;
     const MemoryMsg* memMess = safe_cast<const MemoryMsg*>(message.get());
     physical_address_t addr = memMess->getAddress().getAddress();
     MemoryRequestType type = memMess->getType();
@@ -345,7 +345,7 @@ bool
 RubyMemoryControl::isReady()
 {
     return ((!m_response_queue.empty()) &&
-            (m_response_queue.front().m_time <= g_system_ptr->getTime()));
+            (m_response_queue.front().m_time <= g_system_ptr->curCycle()));
 }
 
 void
index dd9e9676ebb3a520b1fddb9e9dbfce35f9c77af8..2f1cc622d38fe9273fe85f31e539d92fe57d1a1c 100644 (file)
@@ -76,6 +76,7 @@ RubyPort::init()
 {
     assert(m_controller != NULL);
     m_mandatory_q_ptr = m_controller->getMandatoryQueue();
+    m_mandatory_q_ptr->setSender(this);
 }
 
 BaseMasterPort &
index 98bcede446c81c6df7e3cddbc1369c58fa57d3e6..cec356edb13f5931742506b7364e8a98a4bc56e4 100644 (file)
 #include <string>
 
 #include "mem/protocol/RequestStatus.hh"
+#include "mem/ruby/buffers/MessageBuffer.hh"
 #include "mem/ruby/system/System.hh"
 #include "mem/mem_object.hh"
 #include "mem/physical.hh"
 #include "mem/tport.hh"
 #include "params/RubyPort.hh"
 
-class MessageBuffer;
 class AbstractController;
 
 class RubyPort : public MemObject
index 94ad42d9d50d57f4bcc38376540ee8740a54e1d5..1cdd6d8062643fd8ad04b89bafd3450d369f4999 100644 (file)
@@ -39,7 +39,6 @@
 #include "debug/RubyStats.hh"
 #include "mem/protocol/PrefetchBit.hh"
 #include "mem/protocol/RubyAccessMode.hh"
-#include "mem/ruby/buffers/MessageBuffer.hh"
 #include "mem/ruby/common/Global.hh"
 #include "mem/ruby/profiler/Profiler.hh"
 #include "mem/ruby/slicc_interface/RubyRequest.hh"
@@ -657,7 +656,7 @@ Sequencer::issueRequest(PacketPtr pkt, RubyRequestType secondary_type)
         pc = pkt->req->getPC();
     }
 
-    RubyRequest *msg = new RubyRequest(curCycle(), pkt->getAddr(),
+    RubyRequest *msg = new RubyRequest(clockEdge(), pkt->getAddr(),
                                        pkt->getPtr<uint8_t>(true),
                                        pkt->getSize(), pc, secondary_type,
                                        RubyAccessMode_Supervisor, pkt,
index f07303cf400ee72908c65d4c2dfcbafdfd99aafa..1e0be6da7ef1b03c347f54bc8304fc90c06f9062 100644 (file)
@@ -79,7 +79,6 @@ class RubySystem : public ClockedObject
     static uint32_t getBlockSizeBits() { return m_block_size_bits; }
     static uint64_t getMemorySizeBytes() { return m_memory_size_bytes; }
     static uint32_t getMemorySizeBits() { return m_memory_size_bits; }
-    Cycles getTime() const { return curCycle(); }
 
     // Public Methods
     Network*
index fba53b90216e501bfe188da74333b9f929039c96..e0458550a5c750a0d6436d0af4a9d6100a312150 100644 (file)
@@ -73,7 +73,7 @@ void
 WireBuffer::enqueue(MsgPtr message, Cycles latency)
 {
     m_msg_counter++;
-    Cycles current_time = g_system_ptr->getTime();
+    Cycles current_time = g_system_ptr->curCycle();
     Cycles arrival_time = current_time + latency;
     assert(arrival_time > current_time);
 
@@ -124,7 +124,7 @@ WireBuffer::recycle()
     pop_heap(m_message_queue.begin(), m_message_queue.end(),
         greater<MessageBufferNode>());
 
-    node.m_time = g_system_ptr->getTime() + Cycles(1);
+    node.m_time = g_system_ptr->curCycle() + Cycles(1);
     m_message_queue.back() = node;
     push_heap(m_message_queue.begin(), m_message_queue.end(),
         greater<MessageBufferNode>());
@@ -135,7 +135,7 @@ bool
 WireBuffer::isReady()
 {
     return ((!m_message_queue.empty()) &&
-            (m_message_queue.front().m_time <= g_system_ptr->getTime()));
+            (m_message_queue.front().m_time <= g_system_ptr->curCycle()));
 }
 
 void
index 329ed30a3ec5c39261ed0952868d2621544305f8..7ad6f00a05a68bff986b4df1ecdb1bbcb98bb698 100644 (file)
@@ -54,7 +54,7 @@ class EnqueueStatementAST(StatementAST):
 
         # Declare message
         code("${{msg_type.ident}} *out_msg = "\
-             "new ${{msg_type.ident}}(curCycle());")
+             "new ${{msg_type.ident}}(clockEdge());")
 
         # The other statements
         t = self.statements.generate(code, None)
index e6674325585f18a0811d27c31f1a4aa6486c66cd..ddaa3e440119e5902249e44e517ca6ab609b2f6a 100644 (file)
@@ -518,7 +518,10 @@ m_dma_sequencer_ptr->setController(this);
         code('m_num_controllers++;')
         for var in self.objects:
             if var.ident.find("mandatoryQueue") >= 0:
-                code('m_${{var.c_ident}}_ptr = new ${{var.type.c_ident}}();')
+                code('''
+m_${{var.c_ident}}_ptr = new ${{var.type.c_ident}}();
+m_${{var.c_ident}}_ptr->setReceiver(this);
+''')
 
         code.dedent()
         code('''
@@ -573,7 +576,7 @@ $c_ident::init()
                         code('*$vid = ${{vtype["default"]}}; // $comment')
 
                     # Set ordering
-                    if "ordered" in var and "trigger_queue" not in var:
+                    if "ordered" in var:
                         # A buffer
                         code('$vid->setOrdering(${{var["ordered"]}});')
 
@@ -583,10 +586,16 @@ $c_ident::init()
                         code('$vid->setRandomization(${{var["random"]}});')
 
                     # Set Priority
-                    if vtype.isBuffer and \
-                           "rank" in var and "trigger_queue" not in var:
+                    if vtype.isBuffer and "rank" in var:
                         code('$vid->setPriority(${{var["rank"]}});')
 
+                    # Set sender and receiver for trigger queue
+                    if var.ident.find("triggerQueue") >= 0:
+                        code('$vid->setSender(this);')
+                        code('$vid->setReceiver(this);')
+                    elif vtype.c_ident == "TimerTable":
+                        code('$vid->setClockObj(this);')
+
             else:
                 # Network port object
                 network = var["network"]
@@ -601,6 +610,12 @@ $vid = m_net_ptr->get${network}NetQueue(m_version + base, $ordered, $vnet, "$vne
 
                 code('assert($vid != NULL);')
 
+                # Set the end
+                if network == "To":
+                    code('$vid->setSender(this);')
+                else:
+                    code('$vid->setReceiver(this);')
+
                 # Set ordering
                 if "ordered" in var:
                     # A buffer
@@ -647,8 +662,6 @@ $vid->setDescription("[Version " + to_string(m_version) + ", ${ident}, name=${{v
             code('${{port.code}}.setConsumer(this);')
             # Set the queue descriptions
             code('${{port.code}}.setDescription("[Version " + to_string(m_version) + ", $ident, $port]");')
-            # Set the clock object
-            code('${{port.code}}.setClockObj(this);')
 
         # Initialize the transition profiling
         code()
index f40036e8ef70e4da225501dd64c0a391e2d6b9e2..6ee48ba8bee2f0e6a73cce05be64d50c649f3a75 100644 (file)
@@ -246,7 +246,7 @@ $klass ${{self.c_ident}}$parent
 ''', klass="class")
 
         if self.isMessage:
-            code('(Cycles curTime) : %s(curTime) {' % self["interface"])
+            code('(Tick curTime) : %s(curTime) {' % self["interface"])
         else:
             code('()\n\t\t{')
 
@@ -291,7 +291,7 @@ $klass ${{self.c_ident}}$parent
             params = ', '.join(params)
 
             if self.isMessage:
-                params = "const Cycles curTime, " + params
+                params = "const Tick curTime, " + params
 
             code('${{self.c_ident}}($params)')