m_fromNetQueues.resize(m_nodes);
m_ordered.resize(m_virtual_networks);
+ m_vnet_type_names.resize(m_virtual_networks);
for (int i = 0; i < m_virtual_networks; i++) {
m_ordered[i] = false;
// Register a callback function for combining the statistics
Stats::registerDumpCallback(new StatsCallback(this));
+
+ for (auto &it : dynamic_cast<Network *>(this)->params()->ext_links) {
+ it->params()->ext_node->initNetQueues();
+ }
}
Network::~Network()
break;
}
}
+
+void
+Network::checkNetworkAllocation(NodeID id, bool ordered,
+ int network_num,
+ std::string vnet_type)
+{
+ fatal_if(id >= m_nodes, "Node ID is out of range");
+ fatal_if(network_num >= m_virtual_networks, "Network id is out of range");
+
+ if (ordered) {
+ m_ordered[network_num] = true;
+ }
+
+ m_vnet_type_names[network_num] = vnet_type;
+}
+
+
+void
+Network::setToNetQueue(NodeID id, bool ordered, int network_num,
+ std::string vnet_type, MessageBuffer *b)
+{
+ checkNetworkAllocation(id, ordered, network_num, vnet_type);
+ while (m_toNetQueues[id].size() <= network_num) {
+ m_toNetQueues[id].push_back(nullptr);
+ }
+ m_toNetQueues[id][network_num] = b;
+}
+
+void
+Network::setFromNetQueue(NodeID id, bool ordered, int network_num,
+ std::string vnet_type, MessageBuffer *b)
+{
+ checkNetworkAllocation(id, ordered, network_num, vnet_type);
+ while (m_fromNetQueues[id].size() <= network_num) {
+ m_fromNetQueues[id].push_back(nullptr);
+ }
+ m_fromNetQueues[id][network_num] = b;
+}
static uint32_t MessageSizeType_to_int(MessageSizeType size_type);
// returns the queue requested for the given component
- virtual void setToNetQueue(NodeID id, bool ordered, int netNumber,
- std::string vnet_type, MessageBuffer *b) = 0;
+ void setToNetQueue(NodeID id, bool ordered, int netNumber,
+ std::string vnet_type, MessageBuffer *b);
virtual void setFromNetQueue(NodeID id, bool ordered, int netNumber,
- std::string vnet_type, MessageBuffer *b) = 0;
+ std::string vnet_type, MessageBuffer *b);
+
+ virtual void checkNetworkAllocation(NodeID id, bool ordered,
+ int network_num, std::string vnet_type);
virtual void makeOutLink(SwitchID src, NodeID dest, BasicLink* link,
LinkDirection direction,
uint32_t m_nodes;
static uint32_t m_virtual_networks;
+ std::vector<std::string> m_vnet_type_names;
Topology* m_topology_ptr;
static uint32_t m_control_msg_size;
static uint32_t m_data_msg_size;
Network::init();
}
-void
-BaseGarnetNetwork::setToNetQueue(NodeID id, bool ordered, int network_num,
- string vnet_type, MessageBuffer *b)
-{
- checkNetworkAllocation(id, ordered, network_num, vnet_type);
- while (m_toNetQueues[id].size() <= network_num) {
- m_toNetQueues[id].push_back(nullptr);
- }
- m_toNetQueues[id][network_num] = b;
-}
-
-void
-BaseGarnetNetwork::setFromNetQueue(NodeID id, bool ordered, int network_num,
- string vnet_type, MessageBuffer *b)
-{
- checkNetworkAllocation(id, ordered, network_num, vnet_type);
- while (m_fromNetQueues[id].size() <= network_num) {
- m_fromNetQueues[id].push_back(nullptr);
- }
- m_fromNetQueues[id][network_num] = b;
-}
-
void
BaseGarnetNetwork::regStats()
{
m_queueing_latency[vnet] += latency;
}
- // set the queue
- void setToNetQueue(NodeID id, bool ordered, int network_num,
- std::string vnet_type, MessageBuffer *b);
- void setFromNetQueue(NodeID id, bool ordered, int network_num,
- std::string vnet_type, MessageBuffer *b);
-
bool isVNetOrdered(int vnet) const { return m_ordered[vnet]; }
- virtual void checkNetworkAllocation(NodeID id, bool ordered,
- int network_num, std::string vnet_type) = 0;
virtual void regStats();
virtual void collateStats() {}
m_buffers_per_ctrl_vc = p->buffers_per_ctrl_vc;
m_vnet_type.resize(m_virtual_networks);
- for (int i = 0; i < m_vnet_type.size(); i++) {
- m_vnet_type[i] = NULL_VNET_; // default
+
+ for(int i = 0 ; i < m_virtual_networks ; i++)
+ {
+ if (m_vnet_type_names[i] == "response")
+ m_vnet_type[i] = DATA_VNET_; // carries data (and ctrl) packets
+ else
+ m_vnet_type[i] = CTRL_VNET_; // carries only ctrl packets
}
// record the routers
link->m_weight, credit_link);
}
-void
-GarnetNetwork_d::checkNetworkAllocation(NodeID id, bool ordered,
- int network_num, string vnet_type)
-{
- assert(id < m_nodes);
- assert(network_num < m_virtual_networks);
-
- if (ordered) {
- m_ordered[network_num] = true;
- }
-
- if (vnet_type == "response")
- m_vnet_type[network_num] = DATA_VNET_; // carries data (and ctrl) packets
- else
- m_vnet_type[network_num] = CTRL_VNET_; // carries only ctrl packets
-}
-
void
GarnetNetwork_d::regStats()
{
uint32_t functionalWrite(Packet *pkt);
private:
- void checkNetworkAllocation(NodeID id, bool ordered, int network_num,
- std::string vnet_type);
-
GarnetNetwork_d(const GarnetNetwork_d& obj);
GarnetNetwork_d& operator=(const GarnetNetwork_d& obj);
link->m_weight);
}
-void
-GarnetNetwork::checkNetworkAllocation(NodeID id, bool ordered,
- int network_num, std::string vnet_type)
-{
- assert(id < m_nodes);
- assert(network_num < m_virtual_networks);
-
- if (ordered) {
- m_ordered[network_num] = true;
- }
-}
-
/*
* Go through all the routers, network interfaces and the interconnecting
* links for reading/writing all the messages.
uint32_t functionalWrite(Packet *pkt);
private:
- void checkNetworkAllocation(NodeID id, bool ordered, int network_num,
- std::string vnet_type);
-
GarnetNetwork(const GarnetNetwork& obj);
GarnetNetwork& operator=(const GarnetNetwork& obj);
simple_link->m_bw_multiplier);
}
-void
-SimpleNetwork::checkNetworkAllocation(NodeID id, bool ordered, int network_num)
-{
- assert(id < m_nodes);
- assert(network_num < m_virtual_networks);
-
- if (ordered) {
- m_ordered[network_num] = true;
- }
-}
-
-void
-SimpleNetwork::setToNetQueue(NodeID id, bool ordered, int network_num,
- std::string vnet_type, MessageBuffer *b)
-{
- checkNetworkAllocation(id, ordered, network_num);
- while (m_toNetQueues[id].size() <= network_num) {
- m_toNetQueues[id].push_back(nullptr);
- }
- m_toNetQueues[id][network_num] = b;
-}
-
-void
-SimpleNetwork::setFromNetQueue(NodeID id, bool ordered, int network_num,
- std::string vnet_type, MessageBuffer *b)
-{
- checkNetworkAllocation(id, ordered, network_num);
- while (m_fromNetQueues[id].size() <= network_num) {
- m_fromNetQueues[id].push_back(nullptr);
- }
- m_fromNetQueues[id][network_num] = b;
-}
-
void
SimpleNetwork::regStats()
{
void collateStats();
void regStats();
- // sets the queue requested
- void setToNetQueue(NodeID id, bool ordered, int network_num,
- std::string vnet_type, MessageBuffer *b);
- void setFromNetQueue(NodeID id, bool ordered, int network_num,
- std::string vnet_type, MessageBuffer *b);
-
bool isVNetOrdered(int vnet) const { return m_ordered[vnet]; }
// Methods used by Topology to setup the network
- void makeOutLink(SwitchID src, NodeID dest, BasicLink* link,
- LinkDirection direction,
+ void makeOutLink(SwitchID src, NodeID dest, BasicLink* link,
+ LinkDirection direction,
const NetDest& routing_table_entry);
void makeInLink(NodeID src, SwitchID dest, BasicLink* link,
- LinkDirection direction,
+ LinkDirection direction,
const NetDest& routing_table_entry);
void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link,
- LinkDirection direction,
+ LinkDirection direction,
const NetDest& routing_table_entry);
void print(std::ostream& out) const;
uint32_t functionalWrite(Packet *pkt);
private:
- void checkNetworkAllocation(NodeID id, bool ordered, int network_num);
void addLink(SwitchID src, SwitchID dest, int link_latency);
void makeLink(SwitchID src, SwitchID dest,
const NetDest& routing_table_entry, int link_latency);
int m_buffer_size;
int m_endpoint_bandwidth;
- bool m_adaptive_routing;
+ bool m_adaptive_routing;
//Statistical variables
Stats::Formula m_msg_counts[MessageSizeType_NUM];
$c_ident::init()
{
// initialize objects
- initNetQueues();
''')
code.indent()