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
3412492Sodanrc@yahoo.com.br#ifndef __MEM_RUBY_NETWORK_GARNET2_0_GARNETNETWORK_HH__
3512492Sodanrc@yahoo.com.br#define __MEM_RUBY_NETWORK_GARNET2_0_GARNETNETWORK_HH__
3611666Stushar@ece.gatech.edu
3711666Stushar@ece.gatech.edu#include <iostream>
3811666Stushar@ece.gatech.edu#include <vector>
3911666Stushar@ece.gatech.edu
4011666Stushar@ece.gatech.edu#include "mem/ruby/network/Network.hh"
4111666Stushar@ece.gatech.edu#include "mem/ruby/network/fault_model/FaultModel.hh"
4211666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/CommonTypes.hh"
4311666Stushar@ece.gatech.edu#include "params/GarnetNetwork.hh"
4411666Stushar@ece.gatech.edu
4511666Stushar@ece.gatech.educlass FaultModel;
4611666Stushar@ece.gatech.educlass NetworkInterface;
4711666Stushar@ece.gatech.educlass Router;
4811666Stushar@ece.gatech.educlass NetDest;
4911666Stushar@ece.gatech.educlass NetworkLink;
5011666Stushar@ece.gatech.educlass CreditLink;
5111666Stushar@ece.gatech.edu
5211666Stushar@ece.gatech.educlass GarnetNetwork : public Network
5311666Stushar@ece.gatech.edu{
5411666Stushar@ece.gatech.edu  public:
5511666Stushar@ece.gatech.edu    typedef GarnetNetworkParams Params;
5611666Stushar@ece.gatech.edu    GarnetNetwork(const Params *p);
5711666Stushar@ece.gatech.edu
5811666Stushar@ece.gatech.edu    ~GarnetNetwork();
5911666Stushar@ece.gatech.edu    void init();
6011666Stushar@ece.gatech.edu
6111666Stushar@ece.gatech.edu    // Configuration (set externally)
6211666Stushar@ece.gatech.edu
6311666Stushar@ece.gatech.edu    // for 2D topology
6411666Stushar@ece.gatech.edu    int getNumRows() const { return m_num_rows; }
6511666Stushar@ece.gatech.edu    int getNumCols() { return m_num_cols; }
6611666Stushar@ece.gatech.edu
6711666Stushar@ece.gatech.edu    // for network
6811666Stushar@ece.gatech.edu    uint32_t getNiFlitSize() const { return m_ni_flit_size; }
6911666Stushar@ece.gatech.edu    uint32_t getVCsPerVnet() const { return m_vcs_per_vnet; }
7011666Stushar@ece.gatech.edu    uint32_t getBuffersPerDataVC() { return m_buffers_per_data_vc; }
7111666Stushar@ece.gatech.edu    uint32_t getBuffersPerCtrlVC() { return m_buffers_per_ctrl_vc; }
7211666Stushar@ece.gatech.edu    int getRoutingAlgorithm() const { return m_routing_algorithm; }
7311666Stushar@ece.gatech.edu
7411666Stushar@ece.gatech.edu    bool isFaultModelEnabled() const { return m_enable_fault_model; }
7511666Stushar@ece.gatech.edu    FaultModel* fault_model;
7611666Stushar@ece.gatech.edu
7711666Stushar@ece.gatech.edu
7811666Stushar@ece.gatech.edu    // Internal configuration
7911666Stushar@ece.gatech.edu    bool isVNetOrdered(int vnet) const { return m_ordered[vnet]; }
8011666Stushar@ece.gatech.edu    VNET_type
8111666Stushar@ece.gatech.edu    get_vnet_type(int vc)
8211666Stushar@ece.gatech.edu    {
8311666Stushar@ece.gatech.edu        int vnet = vc/getVCsPerVnet();
8411666Stushar@ece.gatech.edu        return m_vnet_type[vnet];
8511666Stushar@ece.gatech.edu    }
8611666Stushar@ece.gatech.edu    int getNumRouters();
8711666Stushar@ece.gatech.edu    int get_router_id(int ni);
8811666Stushar@ece.gatech.edu
8911666Stushar@ece.gatech.edu
9011666Stushar@ece.gatech.edu    // Methods used by Topology to setup the network
9111666Stushar@ece.gatech.edu    void makeExtOutLink(SwitchID src, NodeID dest, BasicLink* link,
9211666Stushar@ece.gatech.edu                     const NetDest& routing_table_entry);
9311666Stushar@ece.gatech.edu    void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link,
9411666Stushar@ece.gatech.edu                    const NetDest& routing_table_entry);
9511666Stushar@ece.gatech.edu    void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link,
9611666Stushar@ece.gatech.edu                          const NetDest& routing_table_entry,
9711666Stushar@ece.gatech.edu                          PortDirection src_outport_dirn,
9811666Stushar@ece.gatech.edu                          PortDirection dest_inport_dirn);
9911666Stushar@ece.gatech.edu
10011666Stushar@ece.gatech.edu    //! Function for performing a functional write. The return value
10111666Stushar@ece.gatech.edu    //! indicates the number of messages that were written.
10211666Stushar@ece.gatech.edu    uint32_t functionalWrite(Packet *pkt);
10311666Stushar@ece.gatech.edu
10411666Stushar@ece.gatech.edu    // Stats
10511666Stushar@ece.gatech.edu    void collateStats();
10611666Stushar@ece.gatech.edu    void regStats();
10711666Stushar@ece.gatech.edu    void print(std::ostream& out) const;
10811666Stushar@ece.gatech.edu
10911666Stushar@ece.gatech.edu    // increment counters
11011666Stushar@ece.gatech.edu    void increment_injected_packets(int vnet) { m_packets_injected[vnet]++; }
11111666Stushar@ece.gatech.edu    void increment_received_packets(int vnet) { m_packets_received[vnet]++; }
11211666Stushar@ece.gatech.edu
11311666Stushar@ece.gatech.edu    void
11411666Stushar@ece.gatech.edu    increment_packet_network_latency(Cycles latency, int vnet)
11511666Stushar@ece.gatech.edu    {
11611666Stushar@ece.gatech.edu        m_packet_network_latency[vnet] += latency;
11711666Stushar@ece.gatech.edu    }
11811666Stushar@ece.gatech.edu
11911666Stushar@ece.gatech.edu    void
12011666Stushar@ece.gatech.edu    increment_packet_queueing_latency(Cycles latency, int vnet)
12111666Stushar@ece.gatech.edu    {
12211666Stushar@ece.gatech.edu        m_packet_queueing_latency[vnet] += latency;
12311666Stushar@ece.gatech.edu    }
12411666Stushar@ece.gatech.edu
12511666Stushar@ece.gatech.edu    void increment_injected_flits(int vnet) { m_flits_injected[vnet]++; }
12611666Stushar@ece.gatech.edu    void increment_received_flits(int vnet) { m_flits_received[vnet]++; }
12711666Stushar@ece.gatech.edu
12811666Stushar@ece.gatech.edu    void
12911666Stushar@ece.gatech.edu    increment_flit_network_latency(Cycles latency, int vnet)
13011666Stushar@ece.gatech.edu    {
13111666Stushar@ece.gatech.edu        m_flit_network_latency[vnet] += latency;
13211666Stushar@ece.gatech.edu    }
13311666Stushar@ece.gatech.edu
13411666Stushar@ece.gatech.edu    void
13511666Stushar@ece.gatech.edu    increment_flit_queueing_latency(Cycles latency, int vnet)
13611666Stushar@ece.gatech.edu    {
13711666Stushar@ece.gatech.edu        m_flit_queueing_latency[vnet] += latency;
13811666Stushar@ece.gatech.edu    }
13911666Stushar@ece.gatech.edu
14011666Stushar@ece.gatech.edu    void
14111666Stushar@ece.gatech.edu    increment_total_hops(int hops)
14211666Stushar@ece.gatech.edu    {
14311666Stushar@ece.gatech.edu        m_total_hops += hops;
14411666Stushar@ece.gatech.edu    }
14511666Stushar@ece.gatech.edu
14611666Stushar@ece.gatech.edu  protected:
14711666Stushar@ece.gatech.edu    // Configuration
14811666Stushar@ece.gatech.edu    int m_num_rows;
14911666Stushar@ece.gatech.edu    int m_num_cols;
15011666Stushar@ece.gatech.edu    uint32_t m_ni_flit_size;
15111666Stushar@ece.gatech.edu    uint32_t m_vcs_per_vnet;
15211666Stushar@ece.gatech.edu    uint32_t m_buffers_per_ctrl_vc;
15311666Stushar@ece.gatech.edu    uint32_t m_buffers_per_data_vc;
15411666Stushar@ece.gatech.edu    int m_routing_algorithm;
15511666Stushar@ece.gatech.edu    bool m_enable_fault_model;
15611666Stushar@ece.gatech.edu
15711666Stushar@ece.gatech.edu    // Statistical variables
15811666Stushar@ece.gatech.edu    Stats::Vector m_packets_received;
15911666Stushar@ece.gatech.edu    Stats::Vector m_packets_injected;
16011666Stushar@ece.gatech.edu    Stats::Vector m_packet_network_latency;
16111666Stushar@ece.gatech.edu    Stats::Vector m_packet_queueing_latency;
16211666Stushar@ece.gatech.edu
16311666Stushar@ece.gatech.edu    Stats::Formula m_avg_packet_vnet_latency;
16411666Stushar@ece.gatech.edu    Stats::Formula m_avg_packet_vqueue_latency;
16511666Stushar@ece.gatech.edu    Stats::Formula m_avg_packet_network_latency;
16611666Stushar@ece.gatech.edu    Stats::Formula m_avg_packet_queueing_latency;
16711666Stushar@ece.gatech.edu    Stats::Formula m_avg_packet_latency;
16811666Stushar@ece.gatech.edu
16911666Stushar@ece.gatech.edu    Stats::Vector m_flits_received;
17011666Stushar@ece.gatech.edu    Stats::Vector m_flits_injected;
17111666Stushar@ece.gatech.edu    Stats::Vector m_flit_network_latency;
17211666Stushar@ece.gatech.edu    Stats::Vector m_flit_queueing_latency;
17311666Stushar@ece.gatech.edu
17411666Stushar@ece.gatech.edu    Stats::Formula m_avg_flit_vnet_latency;
17511666Stushar@ece.gatech.edu    Stats::Formula m_avg_flit_vqueue_latency;
17611666Stushar@ece.gatech.edu    Stats::Formula m_avg_flit_network_latency;
17711666Stushar@ece.gatech.edu    Stats::Formula m_avg_flit_queueing_latency;
17811666Stushar@ece.gatech.edu    Stats::Formula m_avg_flit_latency;
17911666Stushar@ece.gatech.edu
18011666Stushar@ece.gatech.edu    Stats::Scalar m_total_ext_in_link_utilization;
18111666Stushar@ece.gatech.edu    Stats::Scalar m_total_ext_out_link_utilization;
18211666Stushar@ece.gatech.edu    Stats::Scalar m_total_int_link_utilization;
18311666Stushar@ece.gatech.edu    Stats::Scalar m_average_link_utilization;
18411666Stushar@ece.gatech.edu    Stats::Vector m_average_vc_load;
18511666Stushar@ece.gatech.edu
18611666Stushar@ece.gatech.edu    Stats::Scalar  m_total_hops;
18711666Stushar@ece.gatech.edu    Stats::Formula m_avg_hops;
18811666Stushar@ece.gatech.edu
18911666Stushar@ece.gatech.edu  private:
19011666Stushar@ece.gatech.edu    GarnetNetwork(const GarnetNetwork& obj);
19111666Stushar@ece.gatech.edu    GarnetNetwork& operator=(const GarnetNetwork& obj);
19211666Stushar@ece.gatech.edu
19311666Stushar@ece.gatech.edu    std::vector<VNET_type > m_vnet_type;
19411666Stushar@ece.gatech.edu    std::vector<Router *> m_routers;   // All Routers in Network
19511666Stushar@ece.gatech.edu    std::vector<NetworkLink *> m_networklinks; // All flit links in the network
19611666Stushar@ece.gatech.edu    std::vector<CreditLink *> m_creditlinks; // All credit links in the network
19711666Stushar@ece.gatech.edu    std::vector<NetworkInterface *> m_nis;   // All NI's in Network
19811666Stushar@ece.gatech.edu};
19911666Stushar@ece.gatech.edu
20011666Stushar@ece.gatech.eduinline std::ostream&
20111666Stushar@ece.gatech.eduoperator<<(std::ostream& out, const GarnetNetwork& obj)
20211666Stushar@ece.gatech.edu{
20311666Stushar@ece.gatech.edu    obj.print(out);
20411666Stushar@ece.gatech.edu    out << std::flush;
20511666Stushar@ece.gatech.edu    return out;
20611666Stushar@ece.gatech.edu}
20711666Stushar@ece.gatech.edu
20812492Sodanrc@yahoo.com.br#endif //__MEM_RUBY_NETWORK_GARNET2_0_GARNETNETWORK_HH__
209