238,241c238,239
< if param["network"] == "To":
< code('${{param.ident}} = MasterPort(${dflt_str}"")')
< else:
< code('${{param.ident}} = SlavePort(${dflt_str}"")')
---
> # The MessageBuffer MUST be instantiated in the protocol config
> code('${{param.ident}} = Param.MessageBuffer("")')
250a249,255
>
> # Also add any MessageBuffers declared internally to the controller
> # Note: This includes mandatory and memory queues
> for var in self.objects:
> if var.type.c_ident == "MessageBuffer":
> code('${{var.ident}} = Param.MessageBuffer("")')
>
302c307,308
< void setNetQueue(const std::string& name, MessageBuffer *b);
---
> MessageBuffer* getMemoryQueue() const;
> void initNetQueues();
528,533d533
<
< # Do not initialize messgage buffers since they are initialized
< # when the port based connections are made.
< if param.type_ast.type.c_ident == "MessageBuffer":
< continue
<
543c543,547
< if var.ident.find("mandatoryQueue") >= 0:
---
> # Some MessageBuffers (e.g. mandatory and memory queues) are
> # instantiated internally to StateMachines but exposed to
> # components outside SLICC, so make sure to set up this
> # controller as their receivers
> if var.type.c_ident == "MessageBuffer":
545c549
< m_${{var.ident}}_ptr = new ${{var.type.c_ident}}();
---
> m_${{var.ident}}_ptr = p->${{var.ident}};
566c570
< $c_ident::setNetQueue(const std::string& name, MessageBuffer *b)
---
> $c_ident::initNetQueues()
584,589c588,589
< code('''
< if ("${{var.ident}}" == name) {
< $vid = b;
< assert($vid != NULL);
< ''')
< code.indent()
---
> code('assert($vid != NULL);')
>
592d591
< ordered = var["ordered"]
602,603c601,602
< m_net_ptr->set${network}NetQueue(m_version + base, $ordered, $vnet,
< "$vnet_type", b);
---
> m_net_ptr->set${network}NetQueue(m_version + base, $vid->getOrdered(), $vnet,
> "$vnet_type", $vid);
611,618d609
< # Set ordering
< code('$vid->setOrdering(${{var["ordered"]}});')
<
< # Set randomization
< if "random" in var:
< # A buffer
< code('$vid->setRandomization(${{var["random"]}});')
<
623,638d613
< # Set buffer size
< code('$vid->resize(m_buffer_size);')
<
< if "recycle_latency" in var:
< code('$vid->setRecycleLatency( ' \
< 'Cycles(${{var["recycle_latency"]}}));')
< else:
< code('$vid->setRecycleLatency(m_recycle_latency);')
<
< # set description (may be overriden later by port def)
< code('''
< $vid->setDescription("[Version " + to_string(m_version) + ", ${ident}, name=${{var.ident}}]");
< ''')
< code.dedent()
< code('}\n')
<
647c622
<
---
> initNetQueues();
663c638
< if var.ident.find("mandatoryQueue") < 0:
---
> if var.type.c_ident != "MessageBuffer":
679,688d653
< # Set ordering
< if "ordered" in var:
< # A buffer
< code('$vid->setOrdering(${{var["ordered"]}});')
<
< # Set randomization
< if "random" in var:
< # A buffer
< code('$vid->setRandomization(${{var["random"]}});')
<
703,709d667
< if vtype.isBuffer:
< if "recycle_latency" in var:
< code('$vid->setRecycleLatency( ' \
< 'Cycles(${{var["recycle_latency"]}}));')
< else:
< code('$vid->setRecycleLatency(m_recycle_latency);')
<
719,720d676
< # Set the queue descriptions
< code('${{port.code}}.setDescription("[Version " + to_string(m_version) + ", $ident, $port]");')
748a705,709
> memq_ident = "NULL"
> for port in self.in_ports:
> if port.code.find("responseFromMemory_ptr") >= 0:
> memq_ident = "m_responseFromMemory_ptr"
>
874a836,841
> MessageBuffer*
> $c_ident::getMemoryQueue() const
> {
> return $memq_ident;
> }
>