SimpleNetwork.cc revision 8259:36987780169e
12810Srdreslin@umich.edu/* 212500Snikos.nikoleris@arm.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 311051Sandreas.hansson@arm.com * All rights reserved. 411051Sandreas.hansson@arm.com * 511051Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 611051Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 711051Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 811051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 911051Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 1011051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1111051Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 1211051Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 1311051Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 1411051Sandreas.hansson@arm.com * this software without specific prior written permission. 1511051Sandreas.hansson@arm.com * 162810Srdreslin@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172810Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182810Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192810Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202810Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212810Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222810Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232810Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242810Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252810Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262810Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272810Srdreslin@umich.edu */ 282810Srdreslin@umich.edu 292810Srdreslin@umich.edu#include <cassert> 302810Srdreslin@umich.edu#include <numeric> 312810Srdreslin@umich.edu 322810Srdreslin@umich.edu#include "base/stl_helpers.hh" 332810Srdreslin@umich.edu#include "mem/protocol/MachineType.hh" 342810Srdreslin@umich.edu#include "mem/protocol/Protocol.hh" 352810Srdreslin@umich.edu#include "mem/protocol/TopologyType.hh" 362810Srdreslin@umich.edu#include "mem/ruby/buffers/MessageBuffer.hh" 372810Srdreslin@umich.edu#include "mem/ruby/common/NetDest.hh" 382810Srdreslin@umich.edu#include "mem/ruby/network/BasicLink.hh" 392810Srdreslin@umich.edu#include "mem/ruby/network/simple/SimpleLink.hh" 402810Srdreslin@umich.edu#include "mem/ruby/network/simple/SimpleNetwork.hh" 412810Srdreslin@umich.edu#include "mem/ruby/network/simple/Switch.hh" 4211051Sandreas.hansson@arm.com#include "mem/ruby/network/simple/Throttle.hh" 4311051Sandreas.hansson@arm.com#include "mem/ruby/network/Topology.hh" 442810Srdreslin@umich.edu#include "mem/ruby/profiler/Profiler.hh" 4511051Sandreas.hansson@arm.com#include "mem/ruby/system/System.hh" 4611051Sandreas.hansson@arm.com 4712349Snikos.nikoleris@arm.comusing namespace std; 482810Srdreslin@umich.eduusing m5::stl_helpers::deletePointers; 492810Srdreslin@umich.edu 502810Srdreslin@umich.edu#if 0 512810Srdreslin@umich.edu// ***BIG HACK*** - This is actually code that _should_ be in Network.cc 5211051Sandreas.hansson@arm.com 532810Srdreslin@umich.edu// Note: Moved to Princeton Network 542810Srdreslin@umich.edu// calls new to abstract away from the network 5511051Sandreas.hansson@arm.comNetwork* 562810Srdreslin@umich.eduNetwork::createNetwork(int nodes) 5712724Snikos.nikoleris@arm.com{ 5812724Snikos.nikoleris@arm.com return new SimpleNetwork(nodes); 5912724Snikos.nikoleris@arm.com} 6012334Sgabeblack@google.com#endif 6112724Snikos.nikoleris@arm.com 6211051Sandreas.hansson@arm.comSimpleNetwork::SimpleNetwork(const Params *p) 6311051Sandreas.hansson@arm.com : Network(p) 6411051Sandreas.hansson@arm.com{ 6511288Ssteve.reinhardt@amd.com m_buffer_size = p->buffer_size; 6612724Snikos.nikoleris@arm.com m_endpoint_bandwidth = p->endpoint_bandwidth; 6713223Sodanrc@yahoo.com.br m_adaptive_routing = p->adaptive_routing; 6811051Sandreas.hansson@arm.com 6912724Snikos.nikoleris@arm.com // Note: the parent Network Object constructor is called before the 7012724Snikos.nikoleris@arm.com // SimpleNetwork child constructor. Therefore, the member variables 7112724Snikos.nikoleris@arm.com // used below should already be initialized. 7212724Snikos.nikoleris@arm.com 7311051Sandreas.hansson@arm.com m_endpoint_switches.resize(m_nodes); 7411053Sandreas.hansson@arm.com 7511053Sandreas.hansson@arm.com m_in_use.resize(m_virtual_networks); 7612724Snikos.nikoleris@arm.com m_ordered.resize(m_virtual_networks); 7711051Sandreas.hansson@arm.com for (int i = 0; i < m_virtual_networks; i++) { 7811051Sandreas.hansson@arm.com m_in_use[i] = false; 7911051Sandreas.hansson@arm.com m_ordered[i] = false; 8011051Sandreas.hansson@arm.com } 8111601Sandreas.hansson@arm.com 8211601Sandreas.hansson@arm.com // Allocate to and from queues 8311051Sandreas.hansson@arm.com m_toNetQueues.resize(m_nodes); 8412724Snikos.nikoleris@arm.com m_fromNetQueues.resize(m_nodes); 8511051Sandreas.hansson@arm.com for (int node = 0; node < m_nodes; node++) { 8612724Snikos.nikoleris@arm.com m_toNetQueues[node].resize(m_virtual_networks); 8711600Sandreas.hansson@arm.com m_fromNetQueues[node].resize(m_virtual_networks); 8811600Sandreas.hansson@arm.com for (int j = 0; j < m_virtual_networks; j++) { 8911051Sandreas.hansson@arm.com m_toNetQueues[node][j] = 9011051Sandreas.hansson@arm.com new MessageBuffer(csprintf("toNet node %d j %d", node, j)); 9111051Sandreas.hansson@arm.com m_fromNetQueues[node][j] = 9211284Sandreas.hansson@arm.com new MessageBuffer(csprintf("fromNet node %d j %d", node, j)); 9311051Sandreas.hansson@arm.com } 9411051Sandreas.hansson@arm.com } 9511051Sandreas.hansson@arm.com} 9611602Sandreas.hansson@arm.com 9711051Sandreas.hansson@arm.comvoid 9811051Sandreas.hansson@arm.comSimpleNetwork::init() 9911284Sandreas.hansson@arm.com{ 10011051Sandreas.hansson@arm.com Network::init(); 10111284Sandreas.hansson@arm.com 10211602Sandreas.hansson@arm.com // The topology pointer should have already been initialized in 10311051Sandreas.hansson@arm.com // the parent class network constructor. 10411051Sandreas.hansson@arm.com assert(m_topology_ptr != NULL); 10511284Sandreas.hansson@arm.com int number_of_switches = m_topology_ptr->numSwitches(); 10611051Sandreas.hansson@arm.com for (int i = 0; i < number_of_switches; i++) { 10711284Sandreas.hansson@arm.com m_switch_ptr_vector.push_back(new Switch(i, this)); 10811284Sandreas.hansson@arm.com } 10911284Sandreas.hansson@arm.com 11011051Sandreas.hansson@arm.com // false because this isn't a reconfiguration 11111051Sandreas.hansson@arm.com m_topology_ptr->createLinks(this, false); 11211051Sandreas.hansson@arm.com} 11311284Sandreas.hansson@arm.com 11411284Sandreas.hansson@arm.comvoid 11511284Sandreas.hansson@arm.comSimpleNetwork::reset() 11611284Sandreas.hansson@arm.com{ 11711051Sandreas.hansson@arm.com for (int node = 0; node < m_nodes; node++) { 11811051Sandreas.hansson@arm.com for (int j = 0; j < m_virtual_networks; j++) { 11911051Sandreas.hansson@arm.com m_toNetQueues[node][j]->clear(); 12011284Sandreas.hansson@arm.com m_fromNetQueues[node][j]->clear(); 12111284Sandreas.hansson@arm.com } 12211284Sandreas.hansson@arm.com } 12311197Sandreas.hansson@arm.com 12411601Sandreas.hansson@arm.com for(int i = 0; i < m_switch_ptr_vector.size(); i++){ 12511601Sandreas.hansson@arm.com m_switch_ptr_vector[i]->clearBuffers(); 12611601Sandreas.hansson@arm.com } 12711601Sandreas.hansson@arm.com} 12811601Sandreas.hansson@arm.com 12911601Sandreas.hansson@arm.comSimpleNetwork::~SimpleNetwork() 13011601Sandreas.hansson@arm.com{ 13111601Sandreas.hansson@arm.com for (int i = 0; i < m_nodes; i++) { 13211197Sandreas.hansson@arm.com deletePointers(m_toNetQueues[i]); 13311601Sandreas.hansson@arm.com deletePointers(m_fromNetQueues[i]); 13411601Sandreas.hansson@arm.com } 13511601Sandreas.hansson@arm.com deletePointers(m_switch_ptr_vector); 13611601Sandreas.hansson@arm.com deletePointers(m_buffers_to_free); 13711601Sandreas.hansson@arm.com // delete m_topology_ptr; 13811601Sandreas.hansson@arm.com} 13911601Sandreas.hansson@arm.com 14011051Sandreas.hansson@arm.com// From a switch to an endpoint node 14111051Sandreas.hansson@arm.comvoid 14211051Sandreas.hansson@arm.comSimpleNetwork::makeOutLink(SwitchID src, NodeID dest, BasicLink* link, 14311051Sandreas.hansson@arm.com LinkDirection direction, 14411051Sandreas.hansson@arm.com const NetDest& routing_table_entry, 14511284Sandreas.hansson@arm.com bool isReconfiguration) 14611284Sandreas.hansson@arm.com{ 14711051Sandreas.hansson@arm.com assert(dest < m_nodes); 14811051Sandreas.hansson@arm.com assert(src < m_switch_ptr_vector.size()); 14911051Sandreas.hansson@arm.com assert(m_switch_ptr_vector[src] != NULL); 15011051Sandreas.hansson@arm.com 15111284Sandreas.hansson@arm.com if (isReconfiguration) { 15211051Sandreas.hansson@arm.com m_switch_ptr_vector[src]->reconfigureOutPort(routing_table_entry); 15311051Sandreas.hansson@arm.com return; 15411051Sandreas.hansson@arm.com } 15511051Sandreas.hansson@arm.com 15611051Sandreas.hansson@arm.com SimpleExtLink *simple_link = safe_cast<SimpleExtLink*>(link); 15711051Sandreas.hansson@arm.com 15811051Sandreas.hansson@arm.com m_switch_ptr_vector[src]->addOutPort(m_fromNetQueues[dest], 15911051Sandreas.hansson@arm.com routing_table_entry, 16011051Sandreas.hansson@arm.com simple_link->m_latency, 16111051Sandreas.hansson@arm.com simple_link->m_bw_multiplier); 16211051Sandreas.hansson@arm.com 16311051Sandreas.hansson@arm.com m_endpoint_switches[dest] = m_switch_ptr_vector[src]; 16411051Sandreas.hansson@arm.com} 16511051Sandreas.hansson@arm.com 16611051Sandreas.hansson@arm.com// From an endpoint node to a switch 16711051Sandreas.hansson@arm.comvoid 16811051Sandreas.hansson@arm.comSimpleNetwork::makeInLink(NodeID src, SwitchID dest, BasicLink* link, 16912724Snikos.nikoleris@arm.com LinkDirection direction, 17012724Snikos.nikoleris@arm.com const NetDest& routing_table_entry, 17112724Snikos.nikoleris@arm.com bool isReconfiguration) 17212724Snikos.nikoleris@arm.com{ 17312724Snikos.nikoleris@arm.com assert(src < m_nodes); 17412724Snikos.nikoleris@arm.com if (isReconfiguration) { 17512724Snikos.nikoleris@arm.com // do nothing 17611051Sandreas.hansson@arm.com return; 17711051Sandreas.hansson@arm.com } 17811051Sandreas.hansson@arm.com 17911051Sandreas.hansson@arm.com m_switch_ptr_vector[dest]->addInPort(m_toNetQueues[src]); 18013358Sodanrc@yahoo.com.br} 18111051Sandreas.hansson@arm.com 18211051Sandreas.hansson@arm.com// From a switch to a switch 18311484Snikos.nikoleris@arm.comvoid 18411051Sandreas.hansson@arm.comSimpleNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, 18511051Sandreas.hansson@arm.com LinkDirection direction, 18611051Sandreas.hansson@arm.com const NetDest& routing_table_entry, 18711051Sandreas.hansson@arm.com bool isReconfiguration) 18811051Sandreas.hansson@arm.com{ 18912724Snikos.nikoleris@arm.com if (isReconfiguration) { 19011601Sandreas.hansson@arm.com m_switch_ptr_vector[src]->reconfigureOutPort(routing_table_entry); 19111601Sandreas.hansson@arm.com return; 19211601Sandreas.hansson@arm.com } 19311051Sandreas.hansson@arm.com 19411051Sandreas.hansson@arm.com // Create a set of new MessageBuffers 19511051Sandreas.hansson@arm.com std::vector<MessageBuffer*> queues; 19611051Sandreas.hansson@arm.com for (int i = 0; i < m_virtual_networks; i++) { 19711051Sandreas.hansson@arm.com // allocate a buffer 19812345Snikos.nikoleris@arm.com MessageBuffer* buffer_ptr = new MessageBuffer; 19912345Snikos.nikoleris@arm.com buffer_ptr->setOrdering(true); 20012345Snikos.nikoleris@arm.com if (m_buffer_size > 0) { 20112345Snikos.nikoleris@arm.com buffer_ptr->resize(m_buffer_size); 20211051Sandreas.hansson@arm.com } 20311051Sandreas.hansson@arm.com queues.push_back(buffer_ptr); 20411051Sandreas.hansson@arm.com // remember to deallocate it 20511051Sandreas.hansson@arm.com m_buffers_to_free.push_back(buffer_ptr); 20611051Sandreas.hansson@arm.com } 20711051Sandreas.hansson@arm.com // Connect it to the two switches 20811051Sandreas.hansson@arm.com SimpleIntLink *simple_link = safe_cast<SimpleIntLink*>(link); 20911199Sandreas.hansson@arm.com 21011199Sandreas.hansson@arm.com m_switch_ptr_vector[dest]->addInPort(queues); 21111199Sandreas.hansson@arm.com m_switch_ptr_vector[src]->addOutPort(queues, routing_table_entry, 21211199Sandreas.hansson@arm.com simple_link->m_latency, 21311199Sandreas.hansson@arm.com simple_link->m_bw_multiplier); 21411051Sandreas.hansson@arm.com} 21512345Snikos.nikoleris@arm.com 21612345Snikos.nikoleris@arm.comvoid 21711051Sandreas.hansson@arm.comSimpleNetwork::checkNetworkAllocation(NodeID id, bool ordered, int network_num) 21811051Sandreas.hansson@arm.com{ 21911051Sandreas.hansson@arm.com assert(id < m_nodes); 22011051Sandreas.hansson@arm.com assert(network_num < m_virtual_networks); 22111051Sandreas.hansson@arm.com 22211051Sandreas.hansson@arm.com if (ordered) { 22311051Sandreas.hansson@arm.com m_ordered[network_num] = true; 22411051Sandreas.hansson@arm.com } 22511051Sandreas.hansson@arm.com m_in_use[network_num] = true; 22611051Sandreas.hansson@arm.com} 22711051Sandreas.hansson@arm.com 22811051Sandreas.hansson@arm.comMessageBuffer* 22911051Sandreas.hansson@arm.comSimpleNetwork::getToNetQueue(NodeID id, bool ordered, int network_num) 23011051Sandreas.hansson@arm.com{ 23111051Sandreas.hansson@arm.com checkNetworkAllocation(id, ordered, network_num); 23211051Sandreas.hansson@arm.com return m_toNetQueues[id][network_num]; 23311051Sandreas.hansson@arm.com} 23411130Sali.jafri@arm.com 23511130Sali.jafri@arm.comMessageBuffer* 23611130Sali.jafri@arm.comSimpleNetwork::getFromNetQueue(NodeID id, bool ordered, int network_num) 23711130Sali.jafri@arm.com{ 23811130Sali.jafri@arm.com checkNetworkAllocation(id, ordered, network_num); 23911130Sali.jafri@arm.com return m_fromNetQueues[id][network_num]; 24011130Sali.jafri@arm.com} 24111130Sali.jafri@arm.com 24211130Sali.jafri@arm.comconst std::vector<Throttle*>* 24312345Snikos.nikoleris@arm.comSimpleNetwork::getThrottles(NodeID id) const 24412345Snikos.nikoleris@arm.com{ 24511130Sali.jafri@arm.com assert(id >= 0); 24611130Sali.jafri@arm.com assert(id < m_nodes); 24711130Sali.jafri@arm.com assert(m_endpoint_switches[id] != NULL); 24811130Sali.jafri@arm.com return m_endpoint_switches[id]->getThrottles(); 24911130Sali.jafri@arm.com} 25011130Sali.jafri@arm.com 25112724Snikos.nikoleris@arm.comvoid 25211130Sali.jafri@arm.comSimpleNetwork::printStats(ostream& out) const 25311130Sali.jafri@arm.com{ 25411130Sali.jafri@arm.com out << endl; 25511130Sali.jafri@arm.com out << "Network Stats" << endl; 25611130Sali.jafri@arm.com out << "-------------" << endl; 25711130Sali.jafri@arm.com out << endl; 25812724Snikos.nikoleris@arm.com 25911130Sali.jafri@arm.com // 26011130Sali.jafri@arm.com // Determine total counts before printing out each switch's stats 26111130Sali.jafri@arm.com // 26211130Sali.jafri@arm.com std::vector<uint64> total_msg_counts; 26311130Sali.jafri@arm.com total_msg_counts.resize(MessageSizeType_NUM); 26411130Sali.jafri@arm.com for (MessageSizeType type = MessageSizeType_FIRST; 26511130Sali.jafri@arm.com type < MessageSizeType_NUM; 26611130Sali.jafri@arm.com ++type) { 26711130Sali.jafri@arm.com total_msg_counts[type] = 0; 26811051Sandreas.hansson@arm.com } 26911051Sandreas.hansson@arm.com 27011051Sandreas.hansson@arm.com for (int i = 0; i < m_switch_ptr_vector.size(); i++) { 27111051Sandreas.hansson@arm.com const std::vector<Throttle*>* throttles = 27211744Snikos.nikoleris@arm.com m_switch_ptr_vector[i]->getThrottles(); 27311051Sandreas.hansson@arm.com 27411276Sandreas.hansson@arm.com for (int p = 0; p < throttles->size(); p++) { 27511276Sandreas.hansson@arm.com 27611276Sandreas.hansson@arm.com const std::vector<std::vector<int> >& message_counts = 27711276Sandreas.hansson@arm.com ((*throttles)[p])->getCounters(); 27811276Sandreas.hansson@arm.com 27911276Sandreas.hansson@arm.com for (MessageSizeType type = MessageSizeType_FIRST; 28011276Sandreas.hansson@arm.com type < MessageSizeType_NUM; 28111276Sandreas.hansson@arm.com ++type) { 28211276Sandreas.hansson@arm.com 28311051Sandreas.hansson@arm.com const std::vector<int> &mct = message_counts[type]; 28411276Sandreas.hansson@arm.com int sum = accumulate(mct.begin(), mct.end(), 0); 28511276Sandreas.hansson@arm.com total_msg_counts[type] += uint64(sum); 28611276Sandreas.hansson@arm.com } 28711276Sandreas.hansson@arm.com } 28811276Sandreas.hansson@arm.com } 28911051Sandreas.hansson@arm.com uint64 total_msgs = 0; 29011051Sandreas.hansson@arm.com uint64 total_bytes = 0; 29111051Sandreas.hansson@arm.com for (MessageSizeType type = MessageSizeType_FIRST; 29211051Sandreas.hansson@arm.com type < MessageSizeType_NUM; 29311051Sandreas.hansson@arm.com ++type) { 29411051Sandreas.hansson@arm.com 29511051Sandreas.hansson@arm.com if (total_msg_counts[type] > 0) { 29611051Sandreas.hansson@arm.com out << "total_msg_count_" << type << ": " << total_msg_counts[type] 29711051Sandreas.hansson@arm.com << " " << total_msg_counts[type] * 29811051Sandreas.hansson@arm.com uint64(RubySystem::getNetwork()->MessageSizeType_to_int(type)) 29911051Sandreas.hansson@arm.com << endl; 30012724Snikos.nikoleris@arm.com 30111051Sandreas.hansson@arm.com total_msgs += total_msg_counts[type]; 30211051Sandreas.hansson@arm.com 30311051Sandreas.hansson@arm.com total_bytes += total_msg_counts[type] * 30411051Sandreas.hansson@arm.com uint64(RubySystem::getNetwork()->MessageSizeType_to_int(type)); 30511051Sandreas.hansson@arm.com 30611051Sandreas.hansson@arm.com } 30711051Sandreas.hansson@arm.com } 30811051Sandreas.hansson@arm.com 30911051Sandreas.hansson@arm.com out << "total_msgs: " << total_msgs 31011051Sandreas.hansson@arm.com << " total_bytes: " << total_bytes << endl; 31111051Sandreas.hansson@arm.com 31211051Sandreas.hansson@arm.com out << endl; 31311051Sandreas.hansson@arm.com for (int i = 0; i < m_switch_ptr_vector.size(); i++) { 31412630Snikos.nikoleris@arm.com m_switch_ptr_vector[i]->printStats(out); 31512720Snikos.nikoleris@arm.com } 31612720Snikos.nikoleris@arm.com m_topology_ptr->printStats(out); 31712720Snikos.nikoleris@arm.com} 31812720Snikos.nikoleris@arm.com 31912720Snikos.nikoleris@arm.comvoid 32012720Snikos.nikoleris@arm.comSimpleNetwork::clearStats() 32112720Snikos.nikoleris@arm.com{ 32212724Snikos.nikoleris@arm.com for (int i = 0; i < m_switch_ptr_vector.size(); i++) { 32312720Snikos.nikoleris@arm.com m_switch_ptr_vector[i]->clearStats(); 32412720Snikos.nikoleris@arm.com } 32512720Snikos.nikoleris@arm.com m_topology_ptr->clearStats(); 32612720Snikos.nikoleris@arm.com} 32712720Snikos.nikoleris@arm.com 32812720Snikos.nikoleris@arm.comvoid 32912724Snikos.nikoleris@arm.comSimpleNetwork::printConfig(ostream& out) const 33012724Snikos.nikoleris@arm.com{ 33112724Snikos.nikoleris@arm.com out << endl; 33212724Snikos.nikoleris@arm.com out << "Network Configuration" << endl; 33312724Snikos.nikoleris@arm.com out << "---------------------" << endl; 33412724Snikos.nikoleris@arm.com out << "network: SIMPLE_NETWORK" << endl; 33512724Snikos.nikoleris@arm.com out << "topology: " << m_topology_ptr->getName() << endl; 33612724Snikos.nikoleris@arm.com out << endl; 33712724Snikos.nikoleris@arm.com 33812724Snikos.nikoleris@arm.com for (int i = 0; i < m_virtual_networks; i++) { 33912724Snikos.nikoleris@arm.com out << "virtual_net_" << i << ": "; 34012724Snikos.nikoleris@arm.com if (m_in_use[i]) { 34112724Snikos.nikoleris@arm.com out << "active, "; 34212724Snikos.nikoleris@arm.com if (m_ordered[i]) { 34312724Snikos.nikoleris@arm.com out << "ordered" << endl; 34412724Snikos.nikoleris@arm.com } else { 34512724Snikos.nikoleris@arm.com out << "unordered" << endl; 34612724Snikos.nikoleris@arm.com } 34712724Snikos.nikoleris@arm.com } else { 34812724Snikos.nikoleris@arm.com out << "inactive" << endl; 34912724Snikos.nikoleris@arm.com } 35012724Snikos.nikoleris@arm.com } 35112724Snikos.nikoleris@arm.com out << endl; 35212724Snikos.nikoleris@arm.com 35312724Snikos.nikoleris@arm.com for(int i = 0; i < m_switch_ptr_vector.size(); i++) { 35412720Snikos.nikoleris@arm.com m_switch_ptr_vector[i]->printConfig(out); 35512720Snikos.nikoleris@arm.com } 35612724Snikos.nikoleris@arm.com 35712720Snikos.nikoleris@arm.com m_topology_ptr->printConfig(out); 35812720Snikos.nikoleris@arm.com} 35912720Snikos.nikoleris@arm.com 36012720Snikos.nikoleris@arm.comvoid 36112720Snikos.nikoleris@arm.comSimpleNetwork::print(ostream& out) const 36212720Snikos.nikoleris@arm.com{ 36312720Snikos.nikoleris@arm.com out << "[SimpleNetwork]"; 36412720Snikos.nikoleris@arm.com} 36512720Snikos.nikoleris@arm.com 36612720Snikos.nikoleris@arm.com 36712720Snikos.nikoleris@arm.comSimpleNetwork * 36812720Snikos.nikoleris@arm.comSimpleNetworkParams::create() 36912720Snikos.nikoleris@arm.com{ 37012720Snikos.nikoleris@arm.com return new SimpleNetwork(this); 37112720Snikos.nikoleris@arm.com} 37212720Snikos.nikoleris@arm.com