From 8573a69d8f7bf7b3f074e3e0ac64994801c551be Mon Sep 17 00:00:00 2001 From: Nilay Vaish Date: Fri, 22 Mar 2013 15:53:24 -0500 Subject: ruby: move stall and wakeup functions to AbstractController These functions are currently implemented in one of the files related to Slicc. Since these are purely C++ functions, they are better suited to be in the base class. --- src/mem/ruby/slicc_interface/AbstractController.cc | 84 ++++++++++++++++++++++ src/mem/ruby/slicc_interface/AbstractController.hh | 7 +- 2 files changed, 90 insertions(+), 1 deletion(-) (limited to 'src/mem/ruby/slicc_interface') diff --git a/src/mem/ruby/slicc_interface/AbstractController.cc b/src/mem/ruby/slicc_interface/AbstractController.cc index 1615f8c1d..13107038c 100644 --- a/src/mem/ruby/slicc_interface/AbstractController.cc +++ b/src/mem/ruby/slicc_interface/AbstractController.cc @@ -86,3 +86,87 @@ AbstractController::connectWithPeer(AbstractController *c) getQueuesFromPeer(c); c->getQueuesFromPeer(this); } + +void +AbstractController::stallBuffer(MessageBuffer* buf, Address addr) +{ + if (m_waiting_buffers.count(addr) == 0) { + MsgVecType* msgVec = new MsgVecType; + msgVec->resize(m_max_in_port_rank, NULL); + m_waiting_buffers[addr] = msgVec; + } + (*(m_waiting_buffers[addr]))[m_cur_in_port_rank] = buf; +} + +void +AbstractController::wakeUpBuffers(Address addr) +{ + if (m_waiting_buffers.count(addr) > 0) { + // + // Wake up all possible lower rank (i.e. lower priority) buffers that could + // be waiting on this message. + // + for (int in_port_rank = m_cur_in_port_rank - 1; + in_port_rank >= 0; + in_port_rank--) { + if ((*(m_waiting_buffers[addr]))[in_port_rank] != NULL) { + (*(m_waiting_buffers[addr]))[in_port_rank]->reanalyzeMessages(addr); + } + } + delete m_waiting_buffers[addr]; + m_waiting_buffers.erase(addr); + } +} + +void +AbstractController::wakeUpAllBuffers(Address addr) +{ + if (m_waiting_buffers.count(addr) > 0) { + // + // Wake up all possible lower rank (i.e. lower priority) buffers that could + // be waiting on this message. + // + for (int in_port_rank = m_max_in_port_rank - 1; + in_port_rank >= 0; + in_port_rank--) { + if ((*(m_waiting_buffers[addr]))[in_port_rank] != NULL) { + (*(m_waiting_buffers[addr]))[in_port_rank]->reanalyzeMessages(addr); + } + } + delete m_waiting_buffers[addr]; + m_waiting_buffers.erase(addr); + } +} + +void +AbstractController::wakeUpAllBuffers() +{ + // + // Wake up all possible buffers that could be waiting on any message. + // + + std::vector wokeUpMsgVecs; + + if(m_waiting_buffers.size() > 0) { + for (WaitingBufType::iterator buf_iter = m_waiting_buffers.begin(); + buf_iter != m_waiting_buffers.end(); + ++buf_iter) { + for (MsgVecType::iterator vec_iter = buf_iter->second->begin(); + vec_iter != buf_iter->second->end(); + ++vec_iter) { + if (*vec_iter != NULL) { + (*vec_iter)->reanalyzeAllMessages(); + } + } + wokeUpMsgVecs.push_back(buf_iter->second); + } + + for (std::vector::iterator wb_iter = wokeUpMsgVecs.begin(); + wb_iter != wokeUpMsgVecs.end(); + ++wb_iter) { + delete (*wb_iter); + } + + m_waiting_buffers.clear(); + } +} diff --git a/src/mem/ruby/slicc_interface/AbstractController.hh b/src/mem/ruby/slicc_interface/AbstractController.hh index 81ef3c52b..e2471777b 100644 --- a/src/mem/ruby/slicc_interface/AbstractController.hh +++ b/src/mem/ruby/slicc_interface/AbstractController.hh @@ -33,6 +33,7 @@ #include #include "mem/protocol/AccessPermission.hh" +#include "mem/ruby/buffers/MessageBuffer.hh" #include "mem/ruby/common/Address.hh" #include "mem/ruby/common/Consumer.hh" #include "mem/ruby/common/DataBlock.hh" @@ -44,7 +45,6 @@ #include "params/RubyController.hh" #include "sim/clocked_object.hh" -class MessageBuffer; class Network; class AbstractController : public ClockedObject, public Consumer @@ -116,6 +116,11 @@ class AbstractController : public ClockedObject, public Consumer virtual void getQueuesFromPeer(AbstractController *) { fatal("getQueuesFromPeer() should be called only if implemented!"); } + void stallBuffer(MessageBuffer* buf, Address addr); + void wakeUpBuffers(Address addr); + void wakeUpAllBuffers(Address addr); + void wakeUpAllBuffers(); + protected: int m_transitions_per_cycle; int m_buffer_size; -- cgit v1.2.3