diff options
-rw-r--r-- | src/mem/ruby/slicc_interface/AbstractController.cc | 84 | ||||
-rw-r--r-- | src/mem/ruby/slicc_interface/AbstractController.hh | 7 | ||||
-rw-r--r-- | src/mem/slicc/symbols/StateMachine.py | 67 |
3 files changed, 90 insertions, 68 deletions
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<MsgVecType*> 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<MsgVecType*>::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 <string> #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; diff --git a/src/mem/slicc/symbols/StateMachine.py b/src/mem/slicc/symbols/StateMachine.py index 3f54a1cdb..3618563fd 100644 --- a/src/mem/slicc/symbols/StateMachine.py +++ b/src/mem/slicc/symbols/StateMachine.py @@ -262,9 +262,6 @@ class $c_ident : public AbstractController const int & getVersion() const; const std::string toString() const; const std::string getName() const; - void stallBuffer(MessageBuffer* buf, Address addr); - void wakeUpBuffers(Address addr); - void wakeUpAllBuffers(); void initNetworkPtr(Network* net_ptr) { m_net_ptr = net_ptr; } void print(std::ostream& out) const; void wakeup(); @@ -749,70 +746,6 @@ $c_ident::getName() const } void -$c_ident::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 -$c_ident::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 -$c_ident::wakeUpAllBuffers() -{ - // - // Wake up all possible buffers that could be waiting on any message. - // - - std::vector<MsgVecType*> 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<MsgVecType*>::iterator wb_iter = wokeUpMsgVecs.begin(); - wb_iter != wokeUpMsgVecs.end(); - ++wb_iter) { - delete (*wb_iter); - } - - m_waiting_buffers.clear(); - } -} - -void $c_ident::blockOnQueue(Address addr, MessageBuffer* port) { m_is_blocking = true; |