Histogram& getDelayVCHist(uint32_t index)
{ return m_delayVCHistogram[index]; }
+ MessageBuffer *getPeerQueue(uint32_t pid)
+ {
+ std::map<uint32_t, MessageBuffer *>::iterator it =
+ peerQueueMap.find(pid);
+ assert(it != peerQueueMap.end());
+ return (*it).second;
+ }
+
protected:
//! Profiles original cache requests including PUTs
void profileRequest(const std::string &request);
//! Profiles the delay associated with messages.
void profileMsgDelay(uint32_t virtualNetwork, Cycles delay);
+ //! Function for connecting peer controllers
+ void connectWithPeer(AbstractController *);
+ virtual void getQueuesFromPeer(AbstractController *)
+ { fatal("getQueuesFromPeer() should be called only if implemented!"); }
+
protected:
int m_transitions_per_cycle;
int m_buffer_size;
int m_cur_in_port_rank;
int m_number_of_TBEs;
+ //! Map from physical network number to the Message Buffer.
+ std::map<uint32_t, MessageBuffer*> peerQueueMap;
+
//! Counter for the number of cycles when the transitions carried out
//! were equal to the maximum allowed
uint64_t m_fully_busy_cycles;
''')
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
if proto:
code('$proto')
+ if has_peer:
+ code('void getQueuesFromPeer(AbstractController *);')
if self.EntryType != None:
code('''
code = self.symtab.codeFormatter()
ident = self.ident
c_ident = "%s_Controller" % self.ident
+ has_peer = False
code('''
/** \\file $c_ident.cc
code('''
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('''
}
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 = ""
# 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:
}
''')
+ # 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):