SimpleNetwork.cc revision 8645
112027Sjungma@eit.uni-kl.de/*
212027Sjungma@eit.uni-kl.de * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
312027Sjungma@eit.uni-kl.de * All rights reserved.
412027Sjungma@eit.uni-kl.de *
512027Sjungma@eit.uni-kl.de * Redistribution and use in source and binary forms, with or without
612027Sjungma@eit.uni-kl.de * modification, are permitted provided that the following conditions are
712027Sjungma@eit.uni-kl.de * met: redistributions of source code must retain the above copyright
812027Sjungma@eit.uni-kl.de * notice, this list of conditions and the following disclaimer;
912027Sjungma@eit.uni-kl.de * redistributions in binary form must reproduce the above copyright
1012027Sjungma@eit.uni-kl.de * notice, this list of conditions and the following disclaimer in the
1112027Sjungma@eit.uni-kl.de * documentation and/or other materials provided with the distribution;
1212027Sjungma@eit.uni-kl.de * neither the name of the copyright holders nor the names of its
1312027Sjungma@eit.uni-kl.de * contributors may be used to endorse or promote products derived from
1412027Sjungma@eit.uni-kl.de * this software without specific prior written permission.
1512027Sjungma@eit.uni-kl.de *
1612027Sjungma@eit.uni-kl.de * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1712027Sjungma@eit.uni-kl.de * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1812027Sjungma@eit.uni-kl.de * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1912027Sjungma@eit.uni-kl.de * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2012027Sjungma@eit.uni-kl.de * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2112027Sjungma@eit.uni-kl.de * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2212027Sjungma@eit.uni-kl.de * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2312027Sjungma@eit.uni-kl.de * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2412027Sjungma@eit.uni-kl.de * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2512027Sjungma@eit.uni-kl.de * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2612027Sjungma@eit.uni-kl.de * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2712027Sjungma@eit.uni-kl.de */
2812027Sjungma@eit.uni-kl.de
2912027Sjungma@eit.uni-kl.de#include <cassert>
3012027Sjungma@eit.uni-kl.de#include <numeric>
3112027Sjungma@eit.uni-kl.de
3212027Sjungma@eit.uni-kl.de#include "base/cast.hh"
3312027Sjungma@eit.uni-kl.de#include "base/stl_helpers.hh"
3412027Sjungma@eit.uni-kl.de#include "mem/protocol/TopologyType.hh"
3512027Sjungma@eit.uni-kl.de#include "mem/ruby/buffers/MessageBuffer.hh"
3612027Sjungma@eit.uni-kl.de#include "mem/ruby/common/NetDest.hh"
3712027Sjungma@eit.uni-kl.de#include "mem/ruby/network/BasicLink.hh"
3812027Sjungma@eit.uni-kl.de#include "mem/ruby/network/simple/SimpleLink.hh"
3912027Sjungma@eit.uni-kl.de#include "mem/ruby/network/simple/SimpleNetwork.hh"
4012027Sjungma@eit.uni-kl.de#include "mem/ruby/network/simple/Switch.hh"
4112027Sjungma@eit.uni-kl.de#include "mem/ruby/network/simple/Throttle.hh"
4212027Sjungma@eit.uni-kl.de#include "mem/ruby/network/Topology.hh"
4312027Sjungma@eit.uni-kl.de#include "mem/ruby/profiler/Profiler.hh"
4412027Sjungma@eit.uni-kl.de#include "mem/ruby/system/System.hh"
4512027Sjungma@eit.uni-kl.de
4612027Sjungma@eit.uni-kl.deusing namespace std;
4712027Sjungma@eit.uni-kl.deusing m5::stl_helpers::deletePointers;
4812027Sjungma@eit.uni-kl.de
4912027Sjungma@eit.uni-kl.deSimpleNetwork::SimpleNetwork(const Params *p)
5012027Sjungma@eit.uni-kl.de    : Network(p)
5112027Sjungma@eit.uni-kl.de{
5212027Sjungma@eit.uni-kl.de    m_buffer_size = p->buffer_size;
5312027Sjungma@eit.uni-kl.de    m_endpoint_bandwidth = p->endpoint_bandwidth;
5412027Sjungma@eit.uni-kl.de    m_adaptive_routing = p->adaptive_routing;
5512027Sjungma@eit.uni-kl.de
5612027Sjungma@eit.uni-kl.de    // Note: the parent Network Object constructor is called before the
5712027Sjungma@eit.uni-kl.de    // SimpleNetwork child constructor.  Therefore, the member variables
5812027Sjungma@eit.uni-kl.de    // used below should already be initialized.
5912027Sjungma@eit.uni-kl.de
6012027Sjungma@eit.uni-kl.de    m_endpoint_switches.resize(m_nodes);
6112027Sjungma@eit.uni-kl.de
6212027Sjungma@eit.uni-kl.de    m_in_use.resize(m_virtual_networks);
6312027Sjungma@eit.uni-kl.de    m_ordered.resize(m_virtual_networks);
6412027Sjungma@eit.uni-kl.de    for (int i = 0; i < m_virtual_networks; i++) {
6512027Sjungma@eit.uni-kl.de        m_in_use[i] = false;
6612027Sjungma@eit.uni-kl.de        m_ordered[i] = false;
6712027Sjungma@eit.uni-kl.de    }
6812027Sjungma@eit.uni-kl.de
6912027Sjungma@eit.uni-kl.de    // Allocate to and from queues
7012027Sjungma@eit.uni-kl.de    m_toNetQueues.resize(m_nodes);
7112027Sjungma@eit.uni-kl.de    m_fromNetQueues.resize(m_nodes);
7212027Sjungma@eit.uni-kl.de    for (int node = 0; node < m_nodes; node++) {
7312027Sjungma@eit.uni-kl.de        m_toNetQueues[node].resize(m_virtual_networks);
7412027Sjungma@eit.uni-kl.de        m_fromNetQueues[node].resize(m_virtual_networks);
7512027Sjungma@eit.uni-kl.de        for (int j = 0; j < m_virtual_networks; j++) {
7612027Sjungma@eit.uni-kl.de            m_toNetQueues[node][j] =
7712027Sjungma@eit.uni-kl.de                new MessageBuffer(csprintf("toNet node %d j %d", node, j));
7812027Sjungma@eit.uni-kl.de            m_fromNetQueues[node][j] =
7912027Sjungma@eit.uni-kl.de                new MessageBuffer(csprintf("fromNet node %d j %d", node, j));
8012027Sjungma@eit.uni-kl.de        }
8112027Sjungma@eit.uni-kl.de    }
8212027Sjungma@eit.uni-kl.de}
8312027Sjungma@eit.uni-kl.de
8412027Sjungma@eit.uni-kl.devoid
8512027Sjungma@eit.uni-kl.deSimpleNetwork::init()
8612027Sjungma@eit.uni-kl.de{
8712027Sjungma@eit.uni-kl.de    Network::init();
8812027Sjungma@eit.uni-kl.de
8912027Sjungma@eit.uni-kl.de    // The topology pointer should have already been initialized in
9012027Sjungma@eit.uni-kl.de    // the parent class network constructor.
9112027Sjungma@eit.uni-kl.de    assert(m_topology_ptr != NULL);
9212027Sjungma@eit.uni-kl.de    int number_of_switches = m_topology_ptr->numSwitches();
9312027Sjungma@eit.uni-kl.de    for (int i = 0; i < number_of_switches; i++) {
9412027Sjungma@eit.uni-kl.de        m_switch_ptr_vector.push_back(new Switch(i, this));
9512027Sjungma@eit.uni-kl.de    }
9612027Sjungma@eit.uni-kl.de
9712027Sjungma@eit.uni-kl.de    // false because this isn't a reconfiguration
9812027Sjungma@eit.uni-kl.de    m_topology_ptr->createLinks(this, false);
9912027Sjungma@eit.uni-kl.de}
10012027Sjungma@eit.uni-kl.de
10112027Sjungma@eit.uni-kl.devoid
10212027Sjungma@eit.uni-kl.deSimpleNetwork::reset()
10312027Sjungma@eit.uni-kl.de{
10412027Sjungma@eit.uni-kl.de    for (int node = 0; node < m_nodes; node++) {
10512027Sjungma@eit.uni-kl.de        for (int j = 0; j < m_virtual_networks; j++) {
10612027Sjungma@eit.uni-kl.de            m_toNetQueues[node][j]->clear();
10712027Sjungma@eit.uni-kl.de            m_fromNetQueues[node][j]->clear();
10812027Sjungma@eit.uni-kl.de        }
10912027Sjungma@eit.uni-kl.de    }
11012027Sjungma@eit.uni-kl.de
11112027Sjungma@eit.uni-kl.de    for(int i = 0; i < m_switch_ptr_vector.size(); i++){
11212027Sjungma@eit.uni-kl.de        m_switch_ptr_vector[i]->clearBuffers();
11312027Sjungma@eit.uni-kl.de    }
11412027Sjungma@eit.uni-kl.de}
11512027Sjungma@eit.uni-kl.de
11612027Sjungma@eit.uni-kl.deSimpleNetwork::~SimpleNetwork()
11712027Sjungma@eit.uni-kl.de{
11812027Sjungma@eit.uni-kl.de    for (int i = 0; i < m_nodes; i++) {
11912027Sjungma@eit.uni-kl.de        deletePointers(m_toNetQueues[i]);
12012027Sjungma@eit.uni-kl.de        deletePointers(m_fromNetQueues[i]);
12112027Sjungma@eit.uni-kl.de    }
12212027Sjungma@eit.uni-kl.de    deletePointers(m_switch_ptr_vector);
12312027Sjungma@eit.uni-kl.de    deletePointers(m_buffers_to_free);
12412027Sjungma@eit.uni-kl.de    // delete m_topology_ptr;
12512027Sjungma@eit.uni-kl.de}
12612027Sjungma@eit.uni-kl.de
12712027Sjungma@eit.uni-kl.de// From a switch to an endpoint node
12812027Sjungma@eit.uni-kl.devoid
12912027Sjungma@eit.uni-kl.deSimpleNetwork::makeOutLink(SwitchID src, NodeID dest, BasicLink* link,
13012027Sjungma@eit.uni-kl.de                           LinkDirection direction,
13112027Sjungma@eit.uni-kl.de                           const NetDest& routing_table_entry,
13212027Sjungma@eit.uni-kl.de                           bool isReconfiguration)
13312027Sjungma@eit.uni-kl.de{
13412027Sjungma@eit.uni-kl.de    assert(dest < m_nodes);
13512027Sjungma@eit.uni-kl.de    assert(src < m_switch_ptr_vector.size());
13612027Sjungma@eit.uni-kl.de    assert(m_switch_ptr_vector[src] != NULL);
13712027Sjungma@eit.uni-kl.de
13812027Sjungma@eit.uni-kl.de    if (isReconfiguration) {
13912027Sjungma@eit.uni-kl.de        m_switch_ptr_vector[src]->reconfigureOutPort(routing_table_entry);
14012027Sjungma@eit.uni-kl.de        return;
14112027Sjungma@eit.uni-kl.de    }
14212027Sjungma@eit.uni-kl.de
14312027Sjungma@eit.uni-kl.de    SimpleExtLink *simple_link = safe_cast<SimpleExtLink*>(link);
14412027Sjungma@eit.uni-kl.de
14512027Sjungma@eit.uni-kl.de    m_switch_ptr_vector[src]->addOutPort(m_fromNetQueues[dest],
14612027Sjungma@eit.uni-kl.de                                         routing_table_entry,
14712027Sjungma@eit.uni-kl.de                                         simple_link->m_latency,
14812027Sjungma@eit.uni-kl.de                                         simple_link->m_bw_multiplier);
14912027Sjungma@eit.uni-kl.de
15012027Sjungma@eit.uni-kl.de    m_endpoint_switches[dest] = m_switch_ptr_vector[src];
15112027Sjungma@eit.uni-kl.de}
15212027Sjungma@eit.uni-kl.de
15312027Sjungma@eit.uni-kl.de// From an endpoint node to a switch
15412027Sjungma@eit.uni-kl.devoid
15512027Sjungma@eit.uni-kl.deSimpleNetwork::makeInLink(NodeID src, SwitchID dest, BasicLink* link,
15612027Sjungma@eit.uni-kl.de                          LinkDirection direction,
15712027Sjungma@eit.uni-kl.de                          const NetDest& routing_table_entry,
15812027Sjungma@eit.uni-kl.de                          bool isReconfiguration)
15912027Sjungma@eit.uni-kl.de{
16012027Sjungma@eit.uni-kl.de    assert(src < m_nodes);
16112027Sjungma@eit.uni-kl.de    if (isReconfiguration) {
16212027Sjungma@eit.uni-kl.de        // do nothing
16312027Sjungma@eit.uni-kl.de        return;
16412027Sjungma@eit.uni-kl.de    }
16512027Sjungma@eit.uni-kl.de
16612027Sjungma@eit.uni-kl.de    m_switch_ptr_vector[dest]->addInPort(m_toNetQueues[src]);
16712027Sjungma@eit.uni-kl.de}
16812027Sjungma@eit.uni-kl.de
16912027Sjungma@eit.uni-kl.de// From a switch to a switch
17012027Sjungma@eit.uni-kl.devoid
17112027Sjungma@eit.uni-kl.deSimpleNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link,
17212027Sjungma@eit.uni-kl.de                                LinkDirection direction,
17312027Sjungma@eit.uni-kl.de                                const NetDest& routing_table_entry,
17412027Sjungma@eit.uni-kl.de                                bool isReconfiguration)
17512027Sjungma@eit.uni-kl.de{
17612027Sjungma@eit.uni-kl.de    if (isReconfiguration) {
17712027Sjungma@eit.uni-kl.de        m_switch_ptr_vector[src]->reconfigureOutPort(routing_table_entry);
17812027Sjungma@eit.uni-kl.de        return;
17912027Sjungma@eit.uni-kl.de    }
18012027Sjungma@eit.uni-kl.de
18112027Sjungma@eit.uni-kl.de    // Create a set of new MessageBuffers
18212027Sjungma@eit.uni-kl.de    std::vector<MessageBuffer*> queues;
18312027Sjungma@eit.uni-kl.de    for (int i = 0; i < m_virtual_networks; i++) {
18412027Sjungma@eit.uni-kl.de        // allocate a buffer
18512027Sjungma@eit.uni-kl.de        MessageBuffer* buffer_ptr = new MessageBuffer;
18612027Sjungma@eit.uni-kl.de        buffer_ptr->setOrdering(true);
18712027Sjungma@eit.uni-kl.de        if (m_buffer_size > 0) {
18812027Sjungma@eit.uni-kl.de            buffer_ptr->resize(m_buffer_size);
18912027Sjungma@eit.uni-kl.de        }
19012027Sjungma@eit.uni-kl.de        queues.push_back(buffer_ptr);
19112027Sjungma@eit.uni-kl.de        // remember to deallocate it
19212027Sjungma@eit.uni-kl.de        m_buffers_to_free.push_back(buffer_ptr);
19312027Sjungma@eit.uni-kl.de    }
19412027Sjungma@eit.uni-kl.de    // Connect it to the two switches
19512027Sjungma@eit.uni-kl.de    SimpleIntLink *simple_link = safe_cast<SimpleIntLink*>(link);
19612027Sjungma@eit.uni-kl.de
19712027Sjungma@eit.uni-kl.de    m_switch_ptr_vector[dest]->addInPort(queues);
19812027Sjungma@eit.uni-kl.de    m_switch_ptr_vector[src]->addOutPort(queues, routing_table_entry,
19912027Sjungma@eit.uni-kl.de                                         simple_link->m_latency,
20012027Sjungma@eit.uni-kl.de                                         simple_link->m_bw_multiplier);
20112027Sjungma@eit.uni-kl.de}
20212027Sjungma@eit.uni-kl.de
20312027Sjungma@eit.uni-kl.devoid
20412027Sjungma@eit.uni-kl.deSimpleNetwork::checkNetworkAllocation(NodeID id, bool ordered, int network_num)
20512027Sjungma@eit.uni-kl.de{
20612027Sjungma@eit.uni-kl.de    assert(id < m_nodes);
20712027Sjungma@eit.uni-kl.de    assert(network_num < m_virtual_networks);
20812027Sjungma@eit.uni-kl.de
20912027Sjungma@eit.uni-kl.de    if (ordered) {
21012027Sjungma@eit.uni-kl.de        m_ordered[network_num] = true;
21112027Sjungma@eit.uni-kl.de    }
21212027Sjungma@eit.uni-kl.de    m_in_use[network_num] = true;
21312027Sjungma@eit.uni-kl.de}
21412027Sjungma@eit.uni-kl.de
21512027Sjungma@eit.uni-kl.deMessageBuffer*
21612027Sjungma@eit.uni-kl.deSimpleNetwork::getToNetQueue(NodeID id, bool ordered, int network_num,
21712027Sjungma@eit.uni-kl.de                             std::string vnet_type)
21812027Sjungma@eit.uni-kl.de{
21912027Sjungma@eit.uni-kl.de    checkNetworkAllocation(id, ordered, network_num);
22012027Sjungma@eit.uni-kl.de    return m_toNetQueues[id][network_num];
22112027Sjungma@eit.uni-kl.de}
22212027Sjungma@eit.uni-kl.de
22312027Sjungma@eit.uni-kl.deMessageBuffer*
22412027Sjungma@eit.uni-kl.deSimpleNetwork::getFromNetQueue(NodeID id, bool ordered, int network_num,
22512027Sjungma@eit.uni-kl.de                               std::string vnet_type)
22612027Sjungma@eit.uni-kl.de{
22712027Sjungma@eit.uni-kl.de    checkNetworkAllocation(id, ordered, network_num);
22812027Sjungma@eit.uni-kl.de    return m_fromNetQueues[id][network_num];
22912027Sjungma@eit.uni-kl.de}
23012027Sjungma@eit.uni-kl.de
23112027Sjungma@eit.uni-kl.deconst std::vector<Throttle*>*
23212027Sjungma@eit.uni-kl.deSimpleNetwork::getThrottles(NodeID id) const
23312027Sjungma@eit.uni-kl.de{
23412027Sjungma@eit.uni-kl.de    assert(id >= 0);
23512027Sjungma@eit.uni-kl.de    assert(id < m_nodes);
23612027Sjungma@eit.uni-kl.de    assert(m_endpoint_switches[id] != NULL);
23712027Sjungma@eit.uni-kl.de    return m_endpoint_switches[id]->getThrottles();
23812027Sjungma@eit.uni-kl.de}
23912027Sjungma@eit.uni-kl.de
24012027Sjungma@eit.uni-kl.devoid
24112027Sjungma@eit.uni-kl.deSimpleNetwork::printStats(ostream& out) const
24212027Sjungma@eit.uni-kl.de{
24312027Sjungma@eit.uni-kl.de    out << endl;
24412027Sjungma@eit.uni-kl.de    out << "Network Stats" << endl;
24512027Sjungma@eit.uni-kl.de    out << "-------------" << endl;
24612027Sjungma@eit.uni-kl.de    out << endl;
24712027Sjungma@eit.uni-kl.de
24812027Sjungma@eit.uni-kl.de    //
24912027Sjungma@eit.uni-kl.de    // Determine total counts before printing out each switch's stats
25012027Sjungma@eit.uni-kl.de    //
25112027Sjungma@eit.uni-kl.de    std::vector<uint64> total_msg_counts;
25212027Sjungma@eit.uni-kl.de    total_msg_counts.resize(MessageSizeType_NUM);
25312027Sjungma@eit.uni-kl.de    for (MessageSizeType type = MessageSizeType_FIRST;
25412027Sjungma@eit.uni-kl.de         type < MessageSizeType_NUM;
25512027Sjungma@eit.uni-kl.de         ++type) {
25612027Sjungma@eit.uni-kl.de        total_msg_counts[type] = 0;
25712027Sjungma@eit.uni-kl.de    }
25812027Sjungma@eit.uni-kl.de
25912027Sjungma@eit.uni-kl.de    for (int i = 0; i < m_switch_ptr_vector.size(); i++) {
26012027Sjungma@eit.uni-kl.de        const std::vector<Throttle*>* throttles =
26112027Sjungma@eit.uni-kl.de            m_switch_ptr_vector[i]->getThrottles();
26212027Sjungma@eit.uni-kl.de
26312027Sjungma@eit.uni-kl.de        for (int p = 0; p < throttles->size(); p++) {
26412027Sjungma@eit.uni-kl.de
26512027Sjungma@eit.uni-kl.de            const std::vector<std::vector<int> >& message_counts =
26612027Sjungma@eit.uni-kl.de                ((*throttles)[p])->getCounters();
26712027Sjungma@eit.uni-kl.de
26812027Sjungma@eit.uni-kl.de            for (MessageSizeType type = MessageSizeType_FIRST;
26912027Sjungma@eit.uni-kl.de                 type < MessageSizeType_NUM;
27012027Sjungma@eit.uni-kl.de                 ++type) {
27112027Sjungma@eit.uni-kl.de
27212027Sjungma@eit.uni-kl.de                const std::vector<int> &mct = message_counts[type];
27312027Sjungma@eit.uni-kl.de                int sum = accumulate(mct.begin(), mct.end(), 0);
27412027Sjungma@eit.uni-kl.de                total_msg_counts[type] += uint64(sum);
27512027Sjungma@eit.uni-kl.de            }
27612027Sjungma@eit.uni-kl.de        }
27712027Sjungma@eit.uni-kl.de    }
27812027Sjungma@eit.uni-kl.de    uint64 total_msgs = 0;
27912027Sjungma@eit.uni-kl.de    uint64 total_bytes = 0;
28012027Sjungma@eit.uni-kl.de    for (MessageSizeType type = MessageSizeType_FIRST;
28112027Sjungma@eit.uni-kl.de         type < MessageSizeType_NUM;
28212027Sjungma@eit.uni-kl.de         ++type) {
28312027Sjungma@eit.uni-kl.de
28412027Sjungma@eit.uni-kl.de        if (total_msg_counts[type] > 0) {
28512027Sjungma@eit.uni-kl.de            out << "total_msg_count_" << type << ": " << total_msg_counts[type]
28612027Sjungma@eit.uni-kl.de                << " " << total_msg_counts[type] *
28712027Sjungma@eit.uni-kl.de                uint64(RubySystem::getNetwork()->MessageSizeType_to_int(type))
28812027Sjungma@eit.uni-kl.de                << endl;
28912027Sjungma@eit.uni-kl.de
29012027Sjungma@eit.uni-kl.de            total_msgs += total_msg_counts[type];
29112027Sjungma@eit.uni-kl.de
29212027Sjungma@eit.uni-kl.de            total_bytes += total_msg_counts[type] *
29312027Sjungma@eit.uni-kl.de                uint64(RubySystem::getNetwork()->MessageSizeType_to_int(type));
29412027Sjungma@eit.uni-kl.de
29512027Sjungma@eit.uni-kl.de        }
29612027Sjungma@eit.uni-kl.de    }
29712027Sjungma@eit.uni-kl.de
29812027Sjungma@eit.uni-kl.de    out << "total_msgs: " << total_msgs
29912027Sjungma@eit.uni-kl.de        << " total_bytes: " << total_bytes << endl;
30012027Sjungma@eit.uni-kl.de
30112027Sjungma@eit.uni-kl.de    out << endl;
30212027Sjungma@eit.uni-kl.de    for (int i = 0; i < m_switch_ptr_vector.size(); i++) {
30312027Sjungma@eit.uni-kl.de        m_switch_ptr_vector[i]->printStats(out);
30412027Sjungma@eit.uni-kl.de    }
30512027Sjungma@eit.uni-kl.de    m_topology_ptr->printStats(out);
30612027Sjungma@eit.uni-kl.de}
30712027Sjungma@eit.uni-kl.de
30812027Sjungma@eit.uni-kl.devoid
30912027Sjungma@eit.uni-kl.deSimpleNetwork::clearStats()
31012027Sjungma@eit.uni-kl.de{
31112027Sjungma@eit.uni-kl.de    for (int i = 0; i < m_switch_ptr_vector.size(); i++) {
31212027Sjungma@eit.uni-kl.de        m_switch_ptr_vector[i]->clearStats();
31312027Sjungma@eit.uni-kl.de    }
31412027Sjungma@eit.uni-kl.de    m_topology_ptr->clearStats();
31512027Sjungma@eit.uni-kl.de}
31612027Sjungma@eit.uni-kl.de
31712027Sjungma@eit.uni-kl.devoid
31812027Sjungma@eit.uni-kl.deSimpleNetwork::printConfig(ostream& out) const
31912027Sjungma@eit.uni-kl.de{
32012027Sjungma@eit.uni-kl.de    out << endl;
32112027Sjungma@eit.uni-kl.de    out << "Network Configuration" << endl;
32212027Sjungma@eit.uni-kl.de    out << "---------------------" << endl;
32312027Sjungma@eit.uni-kl.de    out << "network: SIMPLE_NETWORK" << endl;
32412027Sjungma@eit.uni-kl.de    out << "topology: " << m_topology_ptr->getName() << endl;
32512027Sjungma@eit.uni-kl.de    out << endl;
32612027Sjungma@eit.uni-kl.de
32712027Sjungma@eit.uni-kl.de    for (int i = 0; i < m_virtual_networks; i++) {
32812027Sjungma@eit.uni-kl.de        out << "virtual_net_" << i << ": ";
32912027Sjungma@eit.uni-kl.de        if (m_in_use[i]) {
33012027Sjungma@eit.uni-kl.de            out << "active, ";
33112027Sjungma@eit.uni-kl.de            if (m_ordered[i]) {
33212027Sjungma@eit.uni-kl.de                out << "ordered" << endl;
33312027Sjungma@eit.uni-kl.de            } else {
33412027Sjungma@eit.uni-kl.de                out << "unordered" << endl;
33512027Sjungma@eit.uni-kl.de            }
33612027Sjungma@eit.uni-kl.de        } else {
33712027Sjungma@eit.uni-kl.de            out << "inactive" << endl;
33812027Sjungma@eit.uni-kl.de        }
33912027Sjungma@eit.uni-kl.de    }
34012027Sjungma@eit.uni-kl.de    out << endl;
34112027Sjungma@eit.uni-kl.de
34212027Sjungma@eit.uni-kl.de    for(int i = 0; i < m_switch_ptr_vector.size(); i++) {
34312027Sjungma@eit.uni-kl.de        m_switch_ptr_vector[i]->printConfig(out);
34412027Sjungma@eit.uni-kl.de    }
34512027Sjungma@eit.uni-kl.de
34612027Sjungma@eit.uni-kl.de    m_topology_ptr->printConfig(out);
34712027Sjungma@eit.uni-kl.de}
34812027Sjungma@eit.uni-kl.de
34912027Sjungma@eit.uni-kl.devoid
35012027Sjungma@eit.uni-kl.deSimpleNetwork::print(ostream& out) const
35112027Sjungma@eit.uni-kl.de{
35212027Sjungma@eit.uni-kl.de    out << "[SimpleNetwork]";
35312027Sjungma@eit.uni-kl.de}
35412027Sjungma@eit.uni-kl.de
35512027Sjungma@eit.uni-kl.de
35612027Sjungma@eit.uni-kl.deSimpleNetwork *
35712027Sjungma@eit.uni-kl.deSimpleNetworkParams::create()
35812027Sjungma@eit.uni-kl.de{
35912027Sjungma@eit.uni-kl.de    return new SimpleNetwork(this);
36012027Sjungma@eit.uni-kl.de}
36112027Sjungma@eit.uni-kl.de