BasicLink.hh revision 7055
110916Sandreas.sandberg@arm.com/*
211349Sandreas.sandberg@arm.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
310916Sandreas.sandberg@arm.com * All rights reserved.
410916Sandreas.sandberg@arm.com *
510916Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
610916Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
710916Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
810916Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
910916Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
1010916Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
1110916Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
1210916Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
1310916Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
1410916Sandreas.sandberg@arm.com * this software without specific prior written permission.
1510916Sandreas.sandberg@arm.com *
1610916Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1710916Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1810916Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1910916Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2010916Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2110916Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2210916Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2310916Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2410916Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2510916Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2610916Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2710916Sandreas.sandberg@arm.com */
2810916Sandreas.sandberg@arm.com
2910916Sandreas.sandberg@arm.com/*
3010916Sandreas.sandberg@arm.com * The Network class is the base class for classes that implement the
3110916Sandreas.sandberg@arm.com * interconnection network between components (processor/cache
3210916Sandreas.sandberg@arm.com * components and memory/directory components).  The interconnection
3310916Sandreas.sandberg@arm.com * network as described here is not a physical network, but a
3410916Sandreas.sandberg@arm.com * programming concept used to implement all communication between
3510916Sandreas.sandberg@arm.com * components.  Thus parts of this 'network' will model the on-chip
3610916Sandreas.sandberg@arm.com * connections between cache controllers and directory controllers as
3710916Sandreas.sandberg@arm.com * well as the links between chip and network switches.
3810916Sandreas.sandberg@arm.com */
3910916Sandreas.sandberg@arm.com
4010916Sandreas.sandberg@arm.com#ifndef __MEM_RUBY_NETWORK_NETWORK_HH__
4110916Sandreas.sandberg@arm.com#define __MEM_RUBY_NETWORK_NETWORK_HH__
4210916Sandreas.sandberg@arm.com
4310916Sandreas.sandberg@arm.com#include <iostream>
4410916Sandreas.sandberg@arm.com#include <string>
4510916Sandreas.sandberg@arm.com
4610916Sandreas.sandberg@arm.com#include "mem/protocol/MessageSizeType.hh"
4710916Sandreas.sandberg@arm.com#include "mem/ruby/common/Global.hh"
4810916Sandreas.sandberg@arm.com#include "mem/ruby/system/NodeID.hh"
4910916Sandreas.sandberg@arm.com#include "mem/ruby/system/System.hh"
5010916Sandreas.sandberg@arm.com#include "params/RubyNetwork.hh"
5110916Sandreas.sandberg@arm.com#include "sim/sim_object.hh"
5210916Sandreas.sandberg@arm.com
5310916Sandreas.sandberg@arm.comclass NetDest;
5410916Sandreas.sandberg@arm.comclass MessageBuffer;
5510916Sandreas.sandberg@arm.comclass Throttle;
5610916Sandreas.sandberg@arm.comclass Topology;
5710916Sandreas.sandberg@arm.com
5811168Sandreas.hansson@arm.comclass Network : public SimObject
5911168Sandreas.hansson@arm.com{
6010916Sandreas.sandberg@arm.com  public:
6110916Sandreas.sandberg@arm.com    typedef RubyNetworkParams Params;
6211168Sandreas.hansson@arm.com    Network(const Params *p);
6311168Sandreas.hansson@arm.com    virtual ~Network() {}
6411168Sandreas.hansson@arm.com
6510916Sandreas.sandberg@arm.com    virtual void init();
6611349Sandreas.sandberg@arm.com
6710916Sandreas.sandberg@arm.com    int getBufferSize() { return m_buffer_size; }
6811349Sandreas.sandberg@arm.com    int getNumberOfVirtualNetworks() { return m_virtual_networks; }
6911349Sandreas.sandberg@arm.com    int getEndpointBandwidth() { return m_endpoint_bandwidth; }
7010916Sandreas.sandberg@arm.com    bool getAdaptiveRouting() {return m_adaptive_routing; }
7110916Sandreas.sandberg@arm.com    int getLinkLatency() { return m_link_latency; }
7211349Sandreas.sandberg@arm.com    int MessageSizeType_to_int(MessageSizeType size_type);
7311349Sandreas.sandberg@arm.com
7410916Sandreas.sandberg@arm.com    // returns the queue requested for the given component
7510916Sandreas.sandberg@arm.com    virtual MessageBuffer* getToNetQueue(NodeID id, bool ordered,
7610916Sandreas.sandberg@arm.com        int netNumber) = 0;
7710916Sandreas.sandberg@arm.com    virtual MessageBuffer* getFromNetQueue(NodeID id, bool ordered,
7810916Sandreas.sandberg@arm.com        int netNumber) = 0;
7910916Sandreas.sandberg@arm.com    virtual const Vector<Throttle*>* getThrottles(NodeID id) const;
8010916Sandreas.sandberg@arm.com    virtual int getNumNodes() {return 1;}
8110916Sandreas.sandberg@arm.com
8210916Sandreas.sandberg@arm.com    virtual void makeOutLink(SwitchID src, NodeID dest,
8310916Sandreas.sandberg@arm.com        const NetDest& routing_table_entry, int link_latency, int link_weight,
8410916Sandreas.sandberg@arm.com        int bw_multiplier, bool isReconfiguration) = 0;
8510916Sandreas.sandberg@arm.com    virtual void makeInLink(SwitchID src, NodeID dest,
8611349Sandreas.sandberg@arm.com        const NetDest& routing_table_entry, int link_latency,
8711349Sandreas.sandberg@arm.com        int bw_multiplier, bool isReconfiguration) = 0;
8811349Sandreas.sandberg@arm.com    virtual void makeInternalLink(SwitchID src, NodeID dest,
8911349Sandreas.sandberg@arm.com        const NetDest& routing_table_entry, int link_latency, int link_weight,
9011349Sandreas.sandberg@arm.com        int bw_multiplier, bool isReconfiguration) = 0;
9111349Sandreas.sandberg@arm.com
9211349Sandreas.sandberg@arm.com    virtual void reset() = 0;
9311349Sandreas.sandberg@arm.com
9411349Sandreas.sandberg@arm.com    virtual void printStats(std::ostream& out) const = 0;
9511349Sandreas.sandberg@arm.com    virtual void clearStats() = 0;
9610916Sandreas.sandberg@arm.com    virtual void printConfig(std::ostream& out) const = 0;
9710916Sandreas.sandberg@arm.com    virtual void print(std::ostream& out) const = 0;
9810916Sandreas.sandberg@arm.com
9910916Sandreas.sandberg@arm.com  protected:
10010916Sandreas.sandberg@arm.com    // Private copy constructor and assignment operator
10110916Sandreas.sandberg@arm.com    Network(const Network& obj);
10210916Sandreas.sandberg@arm.com    Network& operator=(const Network& obj);
10310916Sandreas.sandberg@arm.com
10410916Sandreas.sandberg@arm.com  protected:
10510916Sandreas.sandberg@arm.com    const std::string m_name;
10610916Sandreas.sandberg@arm.com    int m_nodes;
10710916Sandreas.sandberg@arm.com    int m_virtual_networks;
10810916Sandreas.sandberg@arm.com    int m_buffer_size;
10910916Sandreas.sandberg@arm.com    int m_endpoint_bandwidth;
11010916Sandreas.sandberg@arm.com    Topology* m_topology_ptr;
11110916Sandreas.sandberg@arm.com    bool m_adaptive_routing;
11210916Sandreas.sandberg@arm.com    int m_link_latency;
11311349Sandreas.sandberg@arm.com    int m_control_msg_size;
11411349Sandreas.sandberg@arm.com    int m_data_msg_size;
11511349Sandreas.sandberg@arm.com};
11611349Sandreas.sandberg@arm.com
11711349Sandreas.sandberg@arm.cominline std::ostream&
11811349Sandreas.sandberg@arm.comoperator<<(std::ostream& out, const Network& obj)
11911349Sandreas.sandberg@arm.com{
12011349Sandreas.sandberg@arm.com    obj.print(out);
12111349Sandreas.sandberg@arm.com    out << std::flush;
12211349Sandreas.sandberg@arm.com    return out;
12311349Sandreas.sandberg@arm.com}
12411349Sandreas.sandberg@arm.com
12511349Sandreas.sandberg@arm.com#endif // __MEM_RUBY_NETWORK_NETWORK_HH__
12611349Sandreas.sandberg@arm.com