111666Stushar@ece.gatech.edu/*
211666Stushar@ece.gatech.edu * Copyright (c) 2008 Princeton University
311666Stushar@ece.gatech.edu * Copyright (c) 2016 Georgia Institute of Technology
411666Stushar@ece.gatech.edu * All rights reserved.
511666Stushar@ece.gatech.edu *
611666Stushar@ece.gatech.edu * Redistribution and use in source and binary forms, with or without
711666Stushar@ece.gatech.edu * modification, are permitted provided that the following conditions are
811666Stushar@ece.gatech.edu * met: redistributions of source code must retain the above copyright
911666Stushar@ece.gatech.edu * notice, this list of conditions and the following disclaimer;
1011666Stushar@ece.gatech.edu * redistributions in binary form must reproduce the above copyright
1111666Stushar@ece.gatech.edu * notice, this list of conditions and the following disclaimer in the
1211666Stushar@ece.gatech.edu * documentation and/or other materials provided with the distribution;
1311666Stushar@ece.gatech.edu * neither the name of the copyright holders nor the names of its
1411666Stushar@ece.gatech.edu * contributors may be used to endorse or promote products derived from
1511666Stushar@ece.gatech.edu * this software without specific prior written permission.
1611666Stushar@ece.gatech.edu *
1711666Stushar@ece.gatech.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1811666Stushar@ece.gatech.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1911666Stushar@ece.gatech.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2011666Stushar@ece.gatech.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2111666Stushar@ece.gatech.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2211666Stushar@ece.gatech.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2311666Stushar@ece.gatech.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2411666Stushar@ece.gatech.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2511666Stushar@ece.gatech.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2611666Stushar@ece.gatech.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2711666Stushar@ece.gatech.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2811666Stushar@ece.gatech.edu *
2911666Stushar@ece.gatech.edu * Authors: Niket Agarwal
3011666Stushar@ece.gatech.edu *          Tushar Krishna
3111666Stushar@ece.gatech.edu */
3211666Stushar@ece.gatech.edu
3311666Stushar@ece.gatech.edu
3411666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/GarnetNetwork.hh"
3511666Stushar@ece.gatech.edu
3611666Stushar@ece.gatech.edu#include <cassert>
3711666Stushar@ece.gatech.edu
3811666Stushar@ece.gatech.edu#include "base/cast.hh"
3911666Stushar@ece.gatech.edu#include "base/stl_helpers.hh"
4011666Stushar@ece.gatech.edu#include "mem/ruby/common/NetDest.hh"
4111666Stushar@ece.gatech.edu#include "mem/ruby/network/MessageBuffer.hh"
4211666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/CommonTypes.hh"
4311666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/CreditLink.hh"
4411666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/GarnetLink.hh"
4511666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/NetworkInterface.hh"
4611666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/NetworkLink.hh"
4711666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/Router.hh"
4811666Stushar@ece.gatech.edu#include "mem/ruby/system/RubySystem.hh"
4911666Stushar@ece.gatech.edu
5011666Stushar@ece.gatech.eduusing namespace std;
5111666Stushar@ece.gatech.eduusing m5::stl_helpers::deletePointers;
5211666Stushar@ece.gatech.edu
5311666Stushar@ece.gatech.edu/*
5411666Stushar@ece.gatech.edu * GarnetNetwork sets up the routers and links and collects stats.
5511666Stushar@ece.gatech.edu * Default parameters (GarnetNetwork.py) can be overwritten from command line
5611666Stushar@ece.gatech.edu * (see configs/network/Network.py)
5711666Stushar@ece.gatech.edu */
5811666Stushar@ece.gatech.edu
5911666Stushar@ece.gatech.eduGarnetNetwork::GarnetNetwork(const Params *p)
6011666Stushar@ece.gatech.edu    : Network(p)
6111666Stushar@ece.gatech.edu{
6211666Stushar@ece.gatech.edu    m_num_rows = p->num_rows;
6311666Stushar@ece.gatech.edu    m_ni_flit_size = p->ni_flit_size;
6411666Stushar@ece.gatech.edu    m_vcs_per_vnet = p->vcs_per_vnet;
6511666Stushar@ece.gatech.edu    m_buffers_per_data_vc = p->buffers_per_data_vc;
6611666Stushar@ece.gatech.edu    m_buffers_per_ctrl_vc = p->buffers_per_ctrl_vc;
6711666Stushar@ece.gatech.edu    m_routing_algorithm = p->routing_algorithm;
6811666Stushar@ece.gatech.edu
6911666Stushar@ece.gatech.edu    m_enable_fault_model = p->enable_fault_model;
7011666Stushar@ece.gatech.edu    if (m_enable_fault_model)
7111666Stushar@ece.gatech.edu        fault_model = p->fault_model;
7211666Stushar@ece.gatech.edu
7311666Stushar@ece.gatech.edu    m_vnet_type.resize(m_virtual_networks);
7411666Stushar@ece.gatech.edu
7511666Stushar@ece.gatech.edu    for (int i = 0 ; i < m_virtual_networks ; i++) {
7611666Stushar@ece.gatech.edu        if (m_vnet_type_names[i] == "response")
7711666Stushar@ece.gatech.edu            m_vnet_type[i] = DATA_VNET_; // carries data (and ctrl) packets
7811666Stushar@ece.gatech.edu        else
7911666Stushar@ece.gatech.edu            m_vnet_type[i] = CTRL_VNET_; // carries only ctrl packets
8011666Stushar@ece.gatech.edu    }
8111666Stushar@ece.gatech.edu
8211666Stushar@ece.gatech.edu    // record the routers
8311666Stushar@ece.gatech.edu    for (vector<BasicRouter*>::const_iterator i =  p->routers.begin();
8411666Stushar@ece.gatech.edu         i != p->routers.end(); ++i) {
8511666Stushar@ece.gatech.edu        Router* router = safe_cast<Router*>(*i);
8611666Stushar@ece.gatech.edu        m_routers.push_back(router);
8711666Stushar@ece.gatech.edu
8811666Stushar@ece.gatech.edu        // initialize the router's network pointers
8911666Stushar@ece.gatech.edu        router->init_net_ptr(this);
9011666Stushar@ece.gatech.edu    }
9111666Stushar@ece.gatech.edu
9211666Stushar@ece.gatech.edu    // record the network interfaces
9311666Stushar@ece.gatech.edu    for (vector<ClockedObject*>::const_iterator i = p->netifs.begin();
9411666Stushar@ece.gatech.edu         i != p->netifs.end(); ++i) {
9511666Stushar@ece.gatech.edu        NetworkInterface *ni = safe_cast<NetworkInterface *>(*i);
9611666Stushar@ece.gatech.edu        m_nis.push_back(ni);
9711666Stushar@ece.gatech.edu        ni->init_net_ptr(this);
9811666Stushar@ece.gatech.edu    }
9911666Stushar@ece.gatech.edu}
10011666Stushar@ece.gatech.edu
10111666Stushar@ece.gatech.eduvoid
10211666Stushar@ece.gatech.eduGarnetNetwork::init()
10311666Stushar@ece.gatech.edu{
10411666Stushar@ece.gatech.edu    Network::init();
10511666Stushar@ece.gatech.edu
10611666Stushar@ece.gatech.edu    for (int i=0; i < m_nodes; i++) {
10711666Stushar@ece.gatech.edu        m_nis[i]->addNode(m_toNetQueues[i], m_fromNetQueues[i]);
10811666Stushar@ece.gatech.edu    }
10911666Stushar@ece.gatech.edu
11011666Stushar@ece.gatech.edu    // The topology pointer should have already been initialized in the
11111666Stushar@ece.gatech.edu    // parent network constructor
11211666Stushar@ece.gatech.edu    assert(m_topology_ptr != NULL);
11311666Stushar@ece.gatech.edu    m_topology_ptr->createLinks(this);
11411666Stushar@ece.gatech.edu
11511666Stushar@ece.gatech.edu    // Initialize topology specific parameters
11611666Stushar@ece.gatech.edu    if (getNumRows() > 0) {
11711666Stushar@ece.gatech.edu        // Only for Mesh topology
11811666Stushar@ece.gatech.edu        // m_num_rows and m_num_cols are only used for
11911666Stushar@ece.gatech.edu        // implementing XY or custom routing in RoutingUnit.cc
12011666Stushar@ece.gatech.edu        m_num_rows = getNumRows();
12111666Stushar@ece.gatech.edu        m_num_cols = m_routers.size() / m_num_rows;
12211666Stushar@ece.gatech.edu        assert(m_num_rows * m_num_cols == m_routers.size());
12311666Stushar@ece.gatech.edu    } else {
12411666Stushar@ece.gatech.edu        m_num_rows = -1;
12511666Stushar@ece.gatech.edu        m_num_cols = -1;
12611666Stushar@ece.gatech.edu    }
12711666Stushar@ece.gatech.edu
12811666Stushar@ece.gatech.edu    // FaultModel: declare each router to the fault model
12911666Stushar@ece.gatech.edu    if (isFaultModelEnabled()) {
13011666Stushar@ece.gatech.edu        for (vector<Router*>::const_iterator i= m_routers.begin();
13111666Stushar@ece.gatech.edu             i != m_routers.end(); ++i) {
13211666Stushar@ece.gatech.edu            Router* router = safe_cast<Router*>(*i);
13311666Stushar@ece.gatech.edu            int router_id M5_VAR_USED =
13411666Stushar@ece.gatech.edu                fault_model->declare_router(router->get_num_inports(),
13511666Stushar@ece.gatech.edu                                            router->get_num_outports(),
13611666Stushar@ece.gatech.edu                                            router->get_vc_per_vnet(),
13711666Stushar@ece.gatech.edu                                            getBuffersPerDataVC(),
13811666Stushar@ece.gatech.edu                                            getBuffersPerCtrlVC());
13911666Stushar@ece.gatech.edu            assert(router_id == router->get_id());
14011666Stushar@ece.gatech.edu            router->printAggregateFaultProbability(cout);
14111666Stushar@ece.gatech.edu            router->printFaultVector(cout);
14211666Stushar@ece.gatech.edu        }
14311666Stushar@ece.gatech.edu    }
14411666Stushar@ece.gatech.edu}
14511666Stushar@ece.gatech.edu
14611666Stushar@ece.gatech.eduGarnetNetwork::~GarnetNetwork()
14711666Stushar@ece.gatech.edu{
14811666Stushar@ece.gatech.edu    deletePointers(m_routers);
14911666Stushar@ece.gatech.edu    deletePointers(m_nis);
15011666Stushar@ece.gatech.edu    deletePointers(m_networklinks);
15111666Stushar@ece.gatech.edu    deletePointers(m_creditlinks);
15211666Stushar@ece.gatech.edu}
15311666Stushar@ece.gatech.edu
15411666Stushar@ece.gatech.edu/*
15511666Stushar@ece.gatech.edu * This function creates a link from the Network Interface (NI)
15611666Stushar@ece.gatech.edu * into the Network.
15711666Stushar@ece.gatech.edu * It creates a Network Link from the NI to a Router and a Credit Link from
15811666Stushar@ece.gatech.edu * the Router to the NI
15911666Stushar@ece.gatech.edu*/
16011666Stushar@ece.gatech.edu
16111666Stushar@ece.gatech.eduvoid
16211666Stushar@ece.gatech.eduGarnetNetwork::makeExtInLink(NodeID src, SwitchID dest, BasicLink* link,
16311666Stushar@ece.gatech.edu                            const NetDest& routing_table_entry)
16411666Stushar@ece.gatech.edu{
16511666Stushar@ece.gatech.edu    assert(src < m_nodes);
16611666Stushar@ece.gatech.edu
16711666Stushar@ece.gatech.edu    GarnetExtLink* garnet_link = safe_cast<GarnetExtLink*>(link);
16811666Stushar@ece.gatech.edu
16911666Stushar@ece.gatech.edu    // GarnetExtLink is bi-directional
17011666Stushar@ece.gatech.edu    NetworkLink* net_link = garnet_link->m_network_links[LinkDirection_In];
17111666Stushar@ece.gatech.edu    net_link->setType(EXT_IN_);
17211666Stushar@ece.gatech.edu    CreditLink* credit_link = garnet_link->m_credit_links[LinkDirection_In];
17311666Stushar@ece.gatech.edu
17411666Stushar@ece.gatech.edu    m_networklinks.push_back(net_link);
17511666Stushar@ece.gatech.edu    m_creditlinks.push_back(credit_link);
17611666Stushar@ece.gatech.edu
17711666Stushar@ece.gatech.edu    PortDirection dst_inport_dirn = "Local";
17811666Stushar@ece.gatech.edu    m_routers[dest]->addInPort(dst_inport_dirn, net_link, credit_link);
17911666Stushar@ece.gatech.edu    m_nis[src]->addOutPort(net_link, credit_link, dest);
18011666Stushar@ece.gatech.edu}
18111666Stushar@ece.gatech.edu
18211666Stushar@ece.gatech.edu/*
18311666Stushar@ece.gatech.edu * This function creates a link from the Network to a NI.
18411666Stushar@ece.gatech.edu * It creates a Network Link from a Router to the NI and
18511666Stushar@ece.gatech.edu * a Credit Link from NI to the Router
18611666Stushar@ece.gatech.edu*/
18711666Stushar@ece.gatech.edu
18811666Stushar@ece.gatech.eduvoid
18911666Stushar@ece.gatech.eduGarnetNetwork::makeExtOutLink(SwitchID src, NodeID dest, BasicLink* link,
19011666Stushar@ece.gatech.edu                             const NetDest& routing_table_entry)
19111666Stushar@ece.gatech.edu{
19211666Stushar@ece.gatech.edu    assert(dest < m_nodes);
19311666Stushar@ece.gatech.edu    assert(src < m_routers.size());
19411666Stushar@ece.gatech.edu    assert(m_routers[src] != NULL);
19511666Stushar@ece.gatech.edu
19611666Stushar@ece.gatech.edu    GarnetExtLink* garnet_link = safe_cast<GarnetExtLink*>(link);
19711666Stushar@ece.gatech.edu
19811666Stushar@ece.gatech.edu    // GarnetExtLink is bi-directional
19911666Stushar@ece.gatech.edu    NetworkLink* net_link = garnet_link->m_network_links[LinkDirection_Out];
20011666Stushar@ece.gatech.edu    net_link->setType(EXT_OUT_);
20111666Stushar@ece.gatech.edu    CreditLink* credit_link = garnet_link->m_credit_links[LinkDirection_Out];
20211666Stushar@ece.gatech.edu
20311666Stushar@ece.gatech.edu    m_networklinks.push_back(net_link);
20411666Stushar@ece.gatech.edu    m_creditlinks.push_back(credit_link);
20511666Stushar@ece.gatech.edu
20611666Stushar@ece.gatech.edu    PortDirection src_outport_dirn = "Local";
20711666Stushar@ece.gatech.edu    m_routers[src]->addOutPort(src_outport_dirn, net_link,
20811666Stushar@ece.gatech.edu                               routing_table_entry,
20911666Stushar@ece.gatech.edu                               link->m_weight, credit_link);
21011666Stushar@ece.gatech.edu    m_nis[dest]->addInPort(net_link, credit_link);
21111666Stushar@ece.gatech.edu}
21211666Stushar@ece.gatech.edu
21311666Stushar@ece.gatech.edu/*
21411666Stushar@ece.gatech.edu * This function creates an internal network link between two routers.
21511666Stushar@ece.gatech.edu * It adds both the network link and an opposite credit link.
21611666Stushar@ece.gatech.edu*/
21711666Stushar@ece.gatech.edu
21811666Stushar@ece.gatech.eduvoid
21911666Stushar@ece.gatech.eduGarnetNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link,
22011666Stushar@ece.gatech.edu                                const NetDest& routing_table_entry,
22111666Stushar@ece.gatech.edu                                PortDirection src_outport_dirn,
22211666Stushar@ece.gatech.edu                                PortDirection dst_inport_dirn)
22311666Stushar@ece.gatech.edu{
22411666Stushar@ece.gatech.edu    GarnetIntLink* garnet_link = safe_cast<GarnetIntLink*>(link);
22511666Stushar@ece.gatech.edu
22611666Stushar@ece.gatech.edu    // GarnetIntLink is unidirectional
22711666Stushar@ece.gatech.edu    NetworkLink* net_link = garnet_link->m_network_link;
22811666Stushar@ece.gatech.edu    net_link->setType(INT_);
22911666Stushar@ece.gatech.edu    CreditLink* credit_link = garnet_link->m_credit_link;
23011666Stushar@ece.gatech.edu
23111666Stushar@ece.gatech.edu    m_networklinks.push_back(net_link);
23211666Stushar@ece.gatech.edu    m_creditlinks.push_back(credit_link);
23311666Stushar@ece.gatech.edu
23411666Stushar@ece.gatech.edu    m_routers[dest]->addInPort(dst_inport_dirn, net_link, credit_link);
23511666Stushar@ece.gatech.edu    m_routers[src]->addOutPort(src_outport_dirn, net_link,
23611666Stushar@ece.gatech.edu                               routing_table_entry,
23711666Stushar@ece.gatech.edu                               link->m_weight, credit_link);
23811666Stushar@ece.gatech.edu}
23911666Stushar@ece.gatech.edu
24011666Stushar@ece.gatech.edu// Total routers in the network
24111666Stushar@ece.gatech.eduint
24211666Stushar@ece.gatech.eduGarnetNetwork::getNumRouters()
24311666Stushar@ece.gatech.edu{
24411666Stushar@ece.gatech.edu    return m_routers.size();
24511666Stushar@ece.gatech.edu}
24611666Stushar@ece.gatech.edu
24711666Stushar@ece.gatech.edu// Get ID of router connected to a NI.
24811666Stushar@ece.gatech.eduint
24911666Stushar@ece.gatech.eduGarnetNetwork::get_router_id(int ni)
25011666Stushar@ece.gatech.edu{
25111666Stushar@ece.gatech.edu    return m_nis[ni]->get_router_id();
25211666Stushar@ece.gatech.edu}
25311666Stushar@ece.gatech.edu
25411666Stushar@ece.gatech.eduvoid
25511666Stushar@ece.gatech.eduGarnetNetwork::regStats()
25611666Stushar@ece.gatech.edu{
25711666Stushar@ece.gatech.edu    Network::regStats();
25811666Stushar@ece.gatech.edu
25911666Stushar@ece.gatech.edu    // Packets
26011666Stushar@ece.gatech.edu    m_packets_received
26111666Stushar@ece.gatech.edu        .init(m_virtual_networks)
26211666Stushar@ece.gatech.edu        .name(name() + ".packets_received")
26311666Stushar@ece.gatech.edu        .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline)
26411666Stushar@ece.gatech.edu        ;
26511666Stushar@ece.gatech.edu
26611666Stushar@ece.gatech.edu    m_packets_injected
26711666Stushar@ece.gatech.edu        .init(m_virtual_networks)
26811666Stushar@ece.gatech.edu        .name(name() + ".packets_injected")
26911666Stushar@ece.gatech.edu        .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline)
27011666Stushar@ece.gatech.edu        ;
27111666Stushar@ece.gatech.edu
27211666Stushar@ece.gatech.edu    m_packet_network_latency
27311666Stushar@ece.gatech.edu        .init(m_virtual_networks)
27411666Stushar@ece.gatech.edu        .name(name() + ".packet_network_latency")
27511666Stushar@ece.gatech.edu        .flags(Stats::oneline)
27611666Stushar@ece.gatech.edu        ;
27711666Stushar@ece.gatech.edu
27811666Stushar@ece.gatech.edu    m_packet_queueing_latency
27911666Stushar@ece.gatech.edu        .init(m_virtual_networks)
28011666Stushar@ece.gatech.edu        .name(name() + ".packet_queueing_latency")
28111666Stushar@ece.gatech.edu        .flags(Stats::oneline)
28211666Stushar@ece.gatech.edu        ;
28311666Stushar@ece.gatech.edu
28411666Stushar@ece.gatech.edu    for (int i = 0; i < m_virtual_networks; i++) {
28511666Stushar@ece.gatech.edu        m_packets_received.subname(i, csprintf("vnet-%i", i));
28611666Stushar@ece.gatech.edu        m_packets_injected.subname(i, csprintf("vnet-%i", i));
28711666Stushar@ece.gatech.edu        m_packet_network_latency.subname(i, csprintf("vnet-%i", i));
28811666Stushar@ece.gatech.edu        m_packet_queueing_latency.subname(i, csprintf("vnet-%i", i));
28911666Stushar@ece.gatech.edu    }
29011666Stushar@ece.gatech.edu
29111666Stushar@ece.gatech.edu    m_avg_packet_vnet_latency
29211666Stushar@ece.gatech.edu        .name(name() + ".average_packet_vnet_latency")
29311666Stushar@ece.gatech.edu        .flags(Stats::oneline);
29411666Stushar@ece.gatech.edu    m_avg_packet_vnet_latency =
29511666Stushar@ece.gatech.edu        m_packet_network_latency / m_packets_received;
29611666Stushar@ece.gatech.edu
29711666Stushar@ece.gatech.edu    m_avg_packet_vqueue_latency
29811666Stushar@ece.gatech.edu        .name(name() + ".average_packet_vqueue_latency")
29911666Stushar@ece.gatech.edu        .flags(Stats::oneline);
30011666Stushar@ece.gatech.edu    m_avg_packet_vqueue_latency =
30111666Stushar@ece.gatech.edu        m_packet_queueing_latency / m_packets_received;
30211666Stushar@ece.gatech.edu
30311666Stushar@ece.gatech.edu    m_avg_packet_network_latency
30411666Stushar@ece.gatech.edu        .name(name() + ".average_packet_network_latency");
30511666Stushar@ece.gatech.edu    m_avg_packet_network_latency =
30611666Stushar@ece.gatech.edu        sum(m_packet_network_latency) / sum(m_packets_received);
30711666Stushar@ece.gatech.edu
30811666Stushar@ece.gatech.edu    m_avg_packet_queueing_latency
30911666Stushar@ece.gatech.edu        .name(name() + ".average_packet_queueing_latency");
31011666Stushar@ece.gatech.edu    m_avg_packet_queueing_latency
31111666Stushar@ece.gatech.edu        = sum(m_packet_queueing_latency) / sum(m_packets_received);
31211666Stushar@ece.gatech.edu
31311666Stushar@ece.gatech.edu    m_avg_packet_latency
31411666Stushar@ece.gatech.edu        .name(name() + ".average_packet_latency");
31511666Stushar@ece.gatech.edu    m_avg_packet_latency
31611666Stushar@ece.gatech.edu        = m_avg_packet_network_latency + m_avg_packet_queueing_latency;
31711666Stushar@ece.gatech.edu
31811666Stushar@ece.gatech.edu    // Flits
31911666Stushar@ece.gatech.edu    m_flits_received
32011666Stushar@ece.gatech.edu        .init(m_virtual_networks)
32111666Stushar@ece.gatech.edu        .name(name() + ".flits_received")
32211666Stushar@ece.gatech.edu        .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline)
32311666Stushar@ece.gatech.edu        ;
32411666Stushar@ece.gatech.edu
32511666Stushar@ece.gatech.edu    m_flits_injected
32611666Stushar@ece.gatech.edu        .init(m_virtual_networks)
32711666Stushar@ece.gatech.edu        .name(name() + ".flits_injected")
32811666Stushar@ece.gatech.edu        .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline)
32911666Stushar@ece.gatech.edu        ;
33011666Stushar@ece.gatech.edu
33111666Stushar@ece.gatech.edu    m_flit_network_latency
33211666Stushar@ece.gatech.edu        .init(m_virtual_networks)
33311666Stushar@ece.gatech.edu        .name(name() + ".flit_network_latency")
33411666Stushar@ece.gatech.edu        .flags(Stats::oneline)
33511666Stushar@ece.gatech.edu        ;
33611666Stushar@ece.gatech.edu
33711666Stushar@ece.gatech.edu    m_flit_queueing_latency
33811666Stushar@ece.gatech.edu        .init(m_virtual_networks)
33911666Stushar@ece.gatech.edu        .name(name() + ".flit_queueing_latency")
34011666Stushar@ece.gatech.edu        .flags(Stats::oneline)
34111666Stushar@ece.gatech.edu        ;
34211666Stushar@ece.gatech.edu
34311666Stushar@ece.gatech.edu    for (int i = 0; i < m_virtual_networks; i++) {
34411666Stushar@ece.gatech.edu        m_flits_received.subname(i, csprintf("vnet-%i", i));
34511666Stushar@ece.gatech.edu        m_flits_injected.subname(i, csprintf("vnet-%i", i));
34611666Stushar@ece.gatech.edu        m_flit_network_latency.subname(i, csprintf("vnet-%i", i));
34711666Stushar@ece.gatech.edu        m_flit_queueing_latency.subname(i, csprintf("vnet-%i", i));
34811666Stushar@ece.gatech.edu    }
34911666Stushar@ece.gatech.edu
35011666Stushar@ece.gatech.edu    m_avg_flit_vnet_latency
35111666Stushar@ece.gatech.edu        .name(name() + ".average_flit_vnet_latency")
35211666Stushar@ece.gatech.edu        .flags(Stats::oneline);
35311666Stushar@ece.gatech.edu    m_avg_flit_vnet_latency = m_flit_network_latency / m_flits_received;
35411666Stushar@ece.gatech.edu
35511666Stushar@ece.gatech.edu    m_avg_flit_vqueue_latency
35611666Stushar@ece.gatech.edu        .name(name() + ".average_flit_vqueue_latency")
35711666Stushar@ece.gatech.edu        .flags(Stats::oneline);
35811666Stushar@ece.gatech.edu    m_avg_flit_vqueue_latency =
35911666Stushar@ece.gatech.edu        m_flit_queueing_latency / m_flits_received;
36011666Stushar@ece.gatech.edu
36111666Stushar@ece.gatech.edu    m_avg_flit_network_latency
36211666Stushar@ece.gatech.edu        .name(name() + ".average_flit_network_latency");
36311666Stushar@ece.gatech.edu    m_avg_flit_network_latency =
36411666Stushar@ece.gatech.edu        sum(m_flit_network_latency) / sum(m_flits_received);
36511666Stushar@ece.gatech.edu
36611666Stushar@ece.gatech.edu    m_avg_flit_queueing_latency
36711666Stushar@ece.gatech.edu        .name(name() + ".average_flit_queueing_latency");
36811666Stushar@ece.gatech.edu    m_avg_flit_queueing_latency =
36911666Stushar@ece.gatech.edu        sum(m_flit_queueing_latency) / sum(m_flits_received);
37011666Stushar@ece.gatech.edu
37111666Stushar@ece.gatech.edu    m_avg_flit_latency
37211666Stushar@ece.gatech.edu        .name(name() + ".average_flit_latency");
37311666Stushar@ece.gatech.edu    m_avg_flit_latency =
37411666Stushar@ece.gatech.edu        m_avg_flit_network_latency + m_avg_flit_queueing_latency;
37511666Stushar@ece.gatech.edu
37611666Stushar@ece.gatech.edu
37711666Stushar@ece.gatech.edu    // Hops
37811666Stushar@ece.gatech.edu    m_avg_hops.name(name() + ".average_hops");
37911666Stushar@ece.gatech.edu    m_avg_hops = m_total_hops / sum(m_flits_received);
38011666Stushar@ece.gatech.edu
38111666Stushar@ece.gatech.edu    // Links
38211666Stushar@ece.gatech.edu    m_total_ext_in_link_utilization
38311666Stushar@ece.gatech.edu        .name(name() + ".ext_in_link_utilization");
38411666Stushar@ece.gatech.edu    m_total_ext_out_link_utilization
38511666Stushar@ece.gatech.edu        .name(name() + ".ext_out_link_utilization");
38611666Stushar@ece.gatech.edu    m_total_int_link_utilization
38711666Stushar@ece.gatech.edu        .name(name() + ".int_link_utilization");
38811666Stushar@ece.gatech.edu    m_average_link_utilization
38911666Stushar@ece.gatech.edu        .name(name() + ".avg_link_utilization");
39011666Stushar@ece.gatech.edu
39111666Stushar@ece.gatech.edu    m_average_vc_load
39211666Stushar@ece.gatech.edu        .init(m_virtual_networks * m_vcs_per_vnet)
39311666Stushar@ece.gatech.edu        .name(name() + ".avg_vc_load")
39411666Stushar@ece.gatech.edu        .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline)
39511666Stushar@ece.gatech.edu        ;
39611666Stushar@ece.gatech.edu}
39711666Stushar@ece.gatech.edu
39811666Stushar@ece.gatech.eduvoid
39911666Stushar@ece.gatech.eduGarnetNetwork::collateStats()
40011666Stushar@ece.gatech.edu{
40111666Stushar@ece.gatech.edu    RubySystem *rs = params()->ruby_system;
40211666Stushar@ece.gatech.edu    double time_delta = double(curCycle() - rs->getStartCycle());
40311666Stushar@ece.gatech.edu
40411666Stushar@ece.gatech.edu    for (int i = 0; i < m_networklinks.size(); i++) {
40511666Stushar@ece.gatech.edu        link_type type = m_networklinks[i]->getType();
40611666Stushar@ece.gatech.edu        int activity = m_networklinks[i]->getLinkUtilization();
40711666Stushar@ece.gatech.edu
40811666Stushar@ece.gatech.edu        if (type == EXT_IN_)
40911666Stushar@ece.gatech.edu            m_total_ext_in_link_utilization += activity;
41011666Stushar@ece.gatech.edu        else if (type == EXT_OUT_)
41111666Stushar@ece.gatech.edu            m_total_ext_out_link_utilization += activity;
41211666Stushar@ece.gatech.edu        else if (type == INT_)
41311666Stushar@ece.gatech.edu            m_total_int_link_utilization += activity;
41411666Stushar@ece.gatech.edu
41511666Stushar@ece.gatech.edu        m_average_link_utilization +=
41611666Stushar@ece.gatech.edu            (double(activity) / time_delta);
41711666Stushar@ece.gatech.edu
41811666Stushar@ece.gatech.edu        vector<unsigned int> vc_load = m_networklinks[i]->getVcLoad();
41911666Stushar@ece.gatech.edu        for (int j = 0; j < vc_load.size(); j++) {
42011666Stushar@ece.gatech.edu            m_average_vc_load[j] += ((double)vc_load[j] / time_delta);
42111666Stushar@ece.gatech.edu        }
42211666Stushar@ece.gatech.edu    }
42311666Stushar@ece.gatech.edu
42411666Stushar@ece.gatech.edu    // Ask the routers to collate their statistics
42511666Stushar@ece.gatech.edu    for (int i = 0; i < m_routers.size(); i++) {
42611666Stushar@ece.gatech.edu        m_routers[i]->collateStats();
42711666Stushar@ece.gatech.edu    }
42811666Stushar@ece.gatech.edu}
42911666Stushar@ece.gatech.edu
43011666Stushar@ece.gatech.eduvoid
43111666Stushar@ece.gatech.eduGarnetNetwork::print(ostream& out) const
43211666Stushar@ece.gatech.edu{
43311666Stushar@ece.gatech.edu    out << "[GarnetNetwork]";
43411666Stushar@ece.gatech.edu}
43511666Stushar@ece.gatech.edu
43611666Stushar@ece.gatech.eduGarnetNetwork *
43711666Stushar@ece.gatech.eduGarnetNetworkParams::create()
43811666Stushar@ece.gatech.edu{
43911666Stushar@ece.gatech.edu    return new GarnetNetwork(this);
44011666Stushar@ece.gatech.edu}
44111666Stushar@ece.gatech.edu
44211666Stushar@ece.gatech.eduuint32_t
44311666Stushar@ece.gatech.eduGarnetNetwork::functionalWrite(Packet *pkt)
44411666Stushar@ece.gatech.edu{
44511666Stushar@ece.gatech.edu    uint32_t num_functional_writes = 0;
44611666Stushar@ece.gatech.edu
44711666Stushar@ece.gatech.edu    for (unsigned int i = 0; i < m_routers.size(); i++) {
44811666Stushar@ece.gatech.edu        num_functional_writes += m_routers[i]->functionalWrite(pkt);
44911666Stushar@ece.gatech.edu    }
45011666Stushar@ece.gatech.edu
45111666Stushar@ece.gatech.edu    for (unsigned int i = 0; i < m_nis.size(); ++i) {
45211666Stushar@ece.gatech.edu        num_functional_writes += m_nis[i]->functionalWrite(pkt);
45311666Stushar@ece.gatech.edu    }
45411666Stushar@ece.gatech.edu
45511666Stushar@ece.gatech.edu    for (unsigned int i = 0; i < m_networklinks.size(); ++i) {
45611666Stushar@ece.gatech.edu        num_functional_writes += m_networklinks[i]->functionalWrite(pkt);
45711666Stushar@ece.gatech.edu    }
45811666Stushar@ece.gatech.edu
45911666Stushar@ece.gatech.edu    return num_functional_writes;
46011666Stushar@ece.gatech.edu}
461