ruby: slicc: replace max_in_port_rank with number of inports
authorNilay Vaish <nilay@cs.wisc.edu>
Sat, 21 Dec 2013 02:34:04 +0000 (20:34 -0600)
committerNilay Vaish <nilay@cs.wisc.edu>
Sat, 21 Dec 2013 02:34:04 +0000 (20:34 -0600)
This patch replaces max_in_port_rank with the number of inports.  The use of
max_in_port_rank was causing spurious re-builds and incorrect initialization
of variables in ruby related regression tests.  This was due to the variable
value being used across threads while compiling when it was not meant to be.

Since the number of inports is state machine specific value, this problem
should get solved.

src/mem/ruby/slicc_interface/AbstractController.cc
src/mem/ruby/slicc_interface/AbstractController.hh
src/mem/slicc/ast/InPortDeclAST.py
src/mem/slicc/symbols/StateMachine.py

index 2e4109c01eecd8133dd9777aabb32344826748d3..26cf91e9f55ed5a73da218e0b37f684d0cbb817a 100644 (file)
@@ -104,10 +104,10 @@ 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);
+        msgVec->resize(m_in_ports, NULL);
         m_waiting_buffers[addr] = msgVec;
     }
-    (*(m_waiting_buffers[addr]))[m_cur_in_port_rank] = buf;
+    (*(m_waiting_buffers[addr]))[m_cur_in_port] = buf;
 }
 
 void
@@ -118,7 +118,7 @@ AbstractController::wakeUpBuffers(Address addr)
         // 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;
+        for (int in_port_rank = m_cur_in_port - 1;
              in_port_rank >= 0;
              in_port_rank--) {
             if ((*(m_waiting_buffers[addr]))[in_port_rank] != NULL) {
@@ -138,7 +138,7 @@ AbstractController::wakeUpAllBuffers(Address addr)
         // 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;
+        for (int in_port_rank = m_in_ports - 1;
              in_port_rank >= 0;
              in_port_rank--) {
             if ((*(m_waiting_buffers[addr]))[in_port_rank] != NULL) {
index 3ad1a0fba046f355b762c512d2ef020fe200066c..3bf331c62d81fd404e924c4477ea88d54ef0be50 100644 (file)
@@ -145,8 +145,8 @@ class AbstractController : public ClockedObject, public Consumer
     typedef std::vector<MessageBuffer*> MsgVecType;
     typedef std::map< Address, MsgVecType* > WaitingBufType;
     WaitingBufType m_waiting_buffers;
-    int m_max_in_port_rank;
-    int m_cur_in_port_rank;
+    unsigned int m_in_ports;
+    unsigned int m_cur_in_port;
     int m_number_of_TBEs;
 
     //! Map from physical network number to the Message Buffer.
index c88d353d3336746677569b4c6190366873b9e4d0..75f917f9ab16ed5b212f455a3cd3163cd59a434b 100644 (file)
@@ -30,8 +30,6 @@ from slicc.ast.TypeAST import TypeAST
 from slicc.symbols import Func, Type, Var
 
 class InPortDeclAST(DeclAST):
-    max_port_rank = 0
-    
     def __init__(self, slicc, ident, msg_type, var_expr, pairs, statements):
         super(InPortDeclAST, self).__init__(slicc, pairs)
 
@@ -40,9 +38,6 @@ class InPortDeclAST(DeclAST):
         self.var_expr = var_expr
         self.statements = statements
         self.queue_type = TypeAST(slicc, "InPort")
-        if self.pairs.has_key("rank"):
-            InPortDeclAST.max_port_rank = max(self.pairs["rank"],
-                                              InPortDeclAST.max_port_rank)
 
     def __repr__(self):
         return "[InPortDecl: %s]" % self.ident
@@ -120,6 +115,3 @@ class InPortDeclAST(DeclAST):
 
         # Add port to state machine
         machine.addInPort(in_port)
-
-        # Include max_rank to be used by StateMachine.py
-        in_port["max_port_rank"] = InPortDeclAST.max_port_rank
index c96af4a9062e6feb0c97605d81b4829aa65b646a..b969d79a336bb0e8a68ea5a85e6acae1e6421318 100644 (file)
@@ -460,12 +460,8 @@ $c_ident::$c_ident(const Params *p)
 {
     m_name = "${ident}";
 ''')
-        #
-        # max_port_rank is used to size vectors and thus should be one plus the
-        # largest port rank
-        #
-        max_port_rank = self.in_ports[0].pairs["max_port_rank"] + 1
-        code('    m_max_in_port_rank = $max_port_rank;')
+        num_in_ports = len(self.in_ports)
+        code('    m_in_ports = $num_in_ports;')
         code.indent()
 
         #
@@ -1104,9 +1100,9 @@ ${ident}_Controller::wakeup()
             code.indent()
             code('// ${ident}InPort $port')
             if port.pairs.has_key("rank"):
-                code('m_cur_in_port_rank = ${{port.pairs["rank"]}};')
+                code('m_cur_in_port = ${{port.pairs["rank"]}};')
             else:
-                code('m_cur_in_port_rank = 0;')
+                code('m_cur_in_port = 0;')
             code('${{port["c_code_in_port"]}}')
             code.dedent()