summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNilay Vaish <nilay@cs.wisc.edu>2013-03-22 15:53:24 -0500
committerNilay Vaish <nilay@cs.wisc.edu>2013-03-22 15:53:24 -0500
commit8573a69d8f7bf7b3f074e3e0ac64994801c551be (patch)
tree825b13a2bda66152fda68c5f463f627a4ba2c174
parenteccc86e8095995d49326a9fffc3a1088b97b03fc (diff)
downloadgem5-8573a69d8f7bf7b3f074e3e0ac64994801c551be.tar.xz
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.
-rw-r--r--src/mem/ruby/slicc_interface/AbstractController.cc84
-rw-r--r--src/mem/ruby/slicc_interface/AbstractController.hh7
-rw-r--r--src/mem/slicc/symbols/StateMachine.py67
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;