changeset d6fb95dbf3e2 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=d6fb95dbf3e2
description:
        ruby: update WireBuffer API to match that of MessageBuffer

        this patch updates the WireBuffer API to mirror the changes in revision 
11111

diffstat:

 src/mem/ruby/structures/WireBuffer.cc |  28 +++++++++++++---------------
 src/mem/ruby/structures/WireBuffer.hh |  14 ++++++--------
 src/mem/slicc/symbols/StateMachine.py |   2 +-
 3 files changed, 20 insertions(+), 24 deletions(-)

diffs (129 lines):

diff -r 39219e0eb24c -r d6fb95dbf3e2 src/mem/ruby/structures/WireBuffer.cc
--- a/src/mem/ruby/structures/WireBuffer.cc     Wed Sep 16 22:17:54 2015 -0500
+++ b/src/mem/ruby/structures/WireBuffer.cc     Thu Sep 17 14:00:33 2015 -0400
@@ -57,7 +57,6 @@
     : SimObject(p)
 {
     m_msg_counter = 0;
-    m_ruby_system = p->ruby_system;
 }
 
 void
@@ -70,11 +69,10 @@
 }
 
 void
-WireBuffer::enqueue(MsgPtr message, Cycles latency)
+WireBuffer::enqueue(MsgPtr message, Tick current_time, Tick delta)
 {
     m_msg_counter++;
-    Cycles current_time = m_ruby_system->curCycle();
-    Cycles arrival_time = current_time + latency;
+    Tick arrival_time = current_time + delta;
     assert(arrival_time > current_time);
 
     Message* msg_ptr = message.get();
@@ -82,16 +80,16 @@
     m_message_queue.push_back(message);
     if (m_consumer_ptr != NULL) {
         m_consumer_ptr->
-            scheduleEventAbsolute(m_ruby_system->clockPeriod() * arrival_time);
+            scheduleEventAbsolute(arrival_time);
     } else {
         panic("No Consumer for WireBuffer! %s\n", *this);
     }
 }
 
 void
-WireBuffer::dequeue()
+WireBuffer::dequeue(Tick current_time)
 {
-    assert(isReady());
+    assert(isReady(current_time));
     pop_heap(m_message_queue.begin(), m_message_queue.end(),
         greater<MsgPtr>());
     m_message_queue.pop_back();
@@ -106,31 +104,31 @@
 }
 
 void
-WireBuffer::recycle()
+WireBuffer::recycle(Tick current_time, Tick recycle_latency)
 {
     // Because you don't want anything reordered, make sure the recycle latency
     // is just 1 cycle. As a result, you really want to use this only in
     // Wire-like situations because you don't want to deadlock as a result of
     // being stuck behind something if you're not actually supposed to.
-    assert(isReady());
+    assert(isReady(current_time));
     MsgPtr node = m_message_queue.front();
     pop_heap(m_message_queue.begin(), m_message_queue.end(), 
greater<MsgPtr>());
 
-    node->setLastEnqueueTime(m_ruby_system->curCycle() + Cycles(1));
+    Tick future_time = current_time + recycle_latency;
+    node->setLastEnqueueTime(future_time);
+
     m_message_queue.back() = node;
     push_heap(m_message_queue.begin(), m_message_queue.end(),
         greater<MsgPtr>());
     m_consumer_ptr->
-        scheduleEventAbsolute(m_ruby_system->clockPeriod()
-                              * (m_ruby_system->curCycle() + Cycles(1)));
+        scheduleEventAbsolute(future_time);
 }
 
 bool
-WireBuffer::isReady()
+WireBuffer::isReady(Tick current_time)
 {
     return ((!m_message_queue.empty()) &&
-            (m_message_queue.front()->getLastEnqueueTime() <=
-                    m_ruby_system->curCycle()));
+            (m_message_queue.front()->getLastEnqueueTime() <= current_time));
 }
 
 void
diff -r 39219e0eb24c -r d6fb95dbf3e2 src/mem/ruby/structures/WireBuffer.hh
--- a/src/mem/ruby/structures/WireBuffer.hh     Wed Sep 16 22:17:54 2015 -0500
+++ b/src/mem/ruby/structures/WireBuffer.hh     Thu Sep 17 14:00:33 2015 -0400
@@ -72,12 +72,13 @@
     void setDescription(const std::string& name) { m_description = name; };
     std::string getDescription() { return m_description; };
 
-    void enqueue(MsgPtr message, Cycles latency);
-    void dequeue();
+    void enqueue(MsgPtr message, Tick current_time, Tick delta);
+    void dequeue(Tick current_time);
     const Message* peek();
-    void recycle();
-    bool isReady();
-    bool areNSlotsAvailable(int n) { return true; };  // infinite queue length
+    void recycle(Tick current_time, Tick recycle_latency);
+    bool isReady(Tick current_time);
+    // infinite queue length
+    bool areNSlotsAvailable(int n, Tick current_time) { return true; };
 
     void print(std::ostream& out) const;
     uint64_t m_msg_counter;
@@ -93,9 +94,6 @@
 
     // queues where memory requests live
     std::vector<MsgPtr> m_message_queue;
-
-    RubySystem * m_ruby_system;
-
 };
 
 std::ostream& operator<<(std::ostream& out, const WireBuffer& obj);
diff -r 39219e0eb24c -r d6fb95dbf3e2 src/mem/slicc/symbols/StateMachine.py
--- a/src/mem/slicc/symbols/StateMachine.py     Wed Sep 16 22:17:54 2015 -0500
+++ b/src/mem/slicc/symbols/StateMachine.py     Thu Sep 17 14:00:33 2015 -0400
@@ -1080,7 +1080,7 @@
             if len(ports) > 1:
                 # only produce checks when a buffer is shared by multiple ports
                 code('''
-        if (${{buf_name}}->isReady() && 
rejected[${{port_to_buf_map[ports[0]]}}] == ${{len(ports)}})
+        if (${{buf_name}}->isReady(clockEdge()) && 
rejected[${{port_to_buf_map[ports[0]]}}] == ${{len(ports)}})
         {
             // no port claimed the message on the top of this buffer
             panic("Runtime Error at Ruby Time: %d. "
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to