diff options
author | Nilay Vaish <nilay@cs.wisc.edu> | 2013-03-22 15:53:23 -0500 |
---|---|---|
committer | Nilay Vaish <nilay@cs.wisc.edu> | 2013-03-22 15:53:23 -0500 |
commit | eccc86e8095995d49326a9fffc3a1088b97b03fc (patch) | |
tree | 1621ce6ec3a78f90a653628ba3d8b9108fc3d814 /src/mem/slicc/symbols | |
parent | 5aa43e130acec02bc616008a8758cf5096025c19 (diff) | |
download | gem5-eccc86e8095995d49326a9fffc3a1088b97b03fc.tar.xz |
ruby: connect two controllers using only message buffers
This patch modifies ruby so that two controllers can be connected to each
other with only message buffers in between. Before this patch, all the
controllers had to be connected to the network for them to communicate
with each other. With this patch, one can have protocols where a controller
is not connected to the network, but communicates with another controller
through a message buffer.
Diffstat (limited to 'src/mem/slicc/symbols')
-rw-r--r-- | src/mem/slicc/symbols/StateMachine.py | 67 |
1 files changed, 52 insertions, 15 deletions
diff --git a/src/mem/slicc/symbols/StateMachine.py b/src/mem/slicc/symbols/StateMachine.py index d5965d46d..3f54a1cdb 100644 --- a/src/mem/slicc/symbols/StateMachine.py +++ b/src/mem/slicc/symbols/StateMachine.py @@ -239,9 +239,12 @@ class $py_ident(RubyController): ''') seen_types = set() + has_peer = False for var in self.objects: if var.type.ident not in seen_types and not var.type.isPrimitive: code('#include "mem/protocol/${{var.type.c_ident}}.hh"') + if "network" in var and "physical_network" in var: + has_peer = True seen_types.add(var.type.ident) # for adding information to the protocol debug trace @@ -331,6 +334,8 @@ static int m_num_controllers; if proto: code('$proto') + if has_peer: + code('void getQueuesFromPeer(AbstractController *);') if self.EntryType != None: code(''' @@ -388,6 +393,7 @@ void unset_tbe(${{self.TBEType.c_ident}}*& m_tbe_ptr); code = self.symtab.codeFormatter() ident = self.ident c_ident = "%s_Controller" % self.ident + has_peer = False code(''' /** \\file $c_ident.cc @@ -515,7 +521,20 @@ m_dma_sequencer_ptr->setController(this); m_${{var.c_ident}}_ptr = new ${{var.type.c_ident}}(); m_${{var.c_ident}}_ptr->setReceiver(this); ''') + else: + if "network" in var and "physical_network" in var and \ + var["network"] == "To": + has_peer = True + code(''' +m_${{var.c_ident}}_ptr = new ${{var.type.c_ident}}(); +peerQueueMap[${{var["physical_network"]}}] = m_${{var.c_ident}}_ptr; +m_${{var.c_ident}}_ptr->setSender(this); +''') + code(''' +if (p->peer != NULL) + connectWithPeer(p->peer); +''') code.dedent() code(''' } @@ -549,10 +568,7 @@ $c_ident::init() code('(*$vid) = ${{var["default"]}};') else: # Normal Object - # added by SS - if "factory" in var: - code('$vid = ${{var["factory"]}};') - elif var.ident.find("mandatoryQueue") < 0: + if var.ident.find("mandatoryQueue") < 0: th = var.get("template", "") expr = "%s = new %s%s" % (vid, vtype.c_ident, th) args = "" @@ -593,21 +609,22 @@ $c_ident::init() # Network port object network = var["network"] ordered = var["ordered"] - vnet = var["virtual_network"] - vnet_type = var["vnet_type"] - assert var.machine is not None - code(''' + if "virtual_network" in var: + vnet = var["virtual_network"] + vnet_type = var["vnet_type"] + + assert var.machine is not None + code(''' $vid = m_net_ptr->get${network}NetQueue(m_version + base, $ordered, $vnet, "$vnet_type"); +assert($vid != NULL); ''') - code('assert($vid != NULL);') - - # Set the end - if network == "To": - code('$vid->setSender(this);') - else: - code('$vid->setReceiver(this);') + # Set the end + if network == "To": + code('$vid->setSender(this);') + else: + code('$vid->setReceiver(this);') # Set ordering if "ordered" in var: @@ -1007,6 +1024,26 @@ $c_ident::functionalWriteBuffers(PacketPtr& pkt) } ''') + # Check if this controller has a peer, if yes then write the + # function for connecting to the peer. + if has_peer: + code(''' + +void +$c_ident::getQueuesFromPeer(AbstractController *peer) +{ +''') + for var in self.objects: + if "network" in var and "physical_network" in var and \ + var["network"] == "From": + code(''' +m_${{var.c_ident}}_ptr = peer->getPeerQueue(${{var["physical_network"]}}); +assert(m_${{var.c_ident}}_ptr != NULL); +m_${{var.c_ident}}_ptr->setReceiver(this); + +''') + code('}') + code.write(path, "%s.cc" % c_ident) def printCWakeup(self, path, includes): |