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