BasicLink.hh revision 7454
14123Sbinkertn@umich.edu/*
24123Sbinkertn@umich.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
39983Sstever@gmail.com * All rights reserved.
49983Sstever@gmail.com *
54123Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without
64123Sbinkertn@umich.edu * modification, are permitted provided that the following conditions are
74123Sbinkertn@umich.edu * met: redistributions of source code must retain the above copyright
84123Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer;
94123Sbinkertn@umich.edu * redistributions in binary form must reproduce the above copyright
104123Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the
114123Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution;
124123Sbinkertn@umich.edu * neither the name of the copyright holders nor the names of its
134123Sbinkertn@umich.edu * contributors may be used to endorse or promote products derived from
144123Sbinkertn@umich.edu * this software without specific prior written permission.
154123Sbinkertn@umich.edu *
164123Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
174123Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
184123Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
194123Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
204123Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
214123Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
224123Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
234123Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
244123Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
254123Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
264123Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274123Sbinkertn@umich.edu */
284123Sbinkertn@umich.edu
294123Sbinkertn@umich.edu/*
304123Sbinkertn@umich.edu * The Network class is the base class for classes that implement the
314123Sbinkertn@umich.edu * interconnection network between components (processor/cache
324123Sbinkertn@umich.edu * components and memory/directory components).  The interconnection
334123Sbinkertn@umich.edu * network as described here is not a physical network, but a
344167Sbinkertn@umich.edu * programming concept used to implement all communication between
354167Sbinkertn@umich.edu * components.  Thus parts of this 'network' will model the on-chip
364167Sbinkertn@umich.edu * connections between cache controllers and directory controllers as
378274SAli.Saidi@ARM.com * well as the links between chip and network switches.
388274SAli.Saidi@ARM.com */
398274SAli.Saidi@ARM.com
408274SAli.Saidi@ARM.com#ifndef __MEM_RUBY_NETWORK_NETWORK_HH__
414123Sbinkertn@umich.edu#define __MEM_RUBY_NETWORK_NETWORK_HH__
424123Sbinkertn@umich.edu
436214Snate@binkert.org#include <iostream>
449356Snilay@cs.wisc.edu#include <string>
454123Sbinkertn@umich.edu#include <vector>
464167Sbinkertn@umich.edu
479983Sstever@gmail.com#include "mem/protocol/MessageSizeType.hh"
487823Ssteve.reinhardt@amd.com#include "mem/ruby/common/Global.hh"
494167Sbinkertn@umich.edu#include "mem/ruby/system/NodeID.hh"
504167Sbinkertn@umich.edu#include "mem/ruby/system/System.hh"
518274SAli.Saidi@ARM.com#include "params/RubyNetwork.hh"
528274SAli.Saidi@ARM.com#include "sim/sim_object.hh"
537064Snate@binkert.org
548274SAli.Saidi@ARM.comclass NetDest;
554167Sbinkertn@umich.educlass MessageBuffer;
564167Sbinkertn@umich.educlass Throttle;
574167Sbinkertn@umich.educlass Topology;
588274SAli.Saidi@ARM.com
598274SAli.Saidi@ARM.comclass Network : public SimObject
608274SAli.Saidi@ARM.com{
618274SAli.Saidi@ARM.com  public:
628274SAli.Saidi@ARM.com    typedef RubyNetworkParams Params;
638274SAli.Saidi@ARM.com    Network(const Params *p);
648274SAli.Saidi@ARM.com    virtual ~Network() {}
658274SAli.Saidi@ARM.com
668274SAli.Saidi@ARM.com    virtual void init();
678274SAli.Saidi@ARM.com
688274SAli.Saidi@ARM.com    int getBufferSize() { return m_buffer_size; }
698274SAli.Saidi@ARM.com    int getNumberOfVirtualNetworks() { return m_virtual_networks; }
708274SAli.Saidi@ARM.com    int getEndpointBandwidth() { return m_endpoint_bandwidth; }
718274SAli.Saidi@ARM.com    bool getAdaptiveRouting() {return m_adaptive_routing; }
728274SAli.Saidi@ARM.com    int getLinkLatency() { return m_link_latency; }
738274SAli.Saidi@ARM.com    int MessageSizeType_to_int(MessageSizeType size_type);
748274SAli.Saidi@ARM.com
758274SAli.Saidi@ARM.com    // returns the queue requested for the given component
768274SAli.Saidi@ARM.com    virtual MessageBuffer* getToNetQueue(NodeID id, bool ordered,
777811Ssteve.reinhardt@amd.com        int netNumber) = 0;
784167Sbinkertn@umich.edu    virtual MessageBuffer* getFromNetQueue(NodeID id, bool ordered,
798274SAli.Saidi@ARM.com        int netNumber) = 0;
808274SAli.Saidi@ARM.com    virtual const std::vector<Throttle*>* getThrottles(NodeID id) const;
818274SAli.Saidi@ARM.com    virtual int getNumNodes() {return 1;}
828274SAli.Saidi@ARM.com
838274SAli.Saidi@ARM.com    virtual void makeOutLink(SwitchID src, NodeID dest,
844167Sbinkertn@umich.edu        const NetDest& routing_table_entry, int link_latency, int link_weight,
858274SAli.Saidi@ARM.com        int bw_multiplier, bool isReconfiguration) = 0;
868274SAli.Saidi@ARM.com    virtual void makeInLink(SwitchID src, NodeID dest,
878274SAli.Saidi@ARM.com        const NetDest& routing_table_entry, int link_latency,
888274SAli.Saidi@ARM.com        int bw_multiplier, bool isReconfiguration) = 0;
898274SAli.Saidi@ARM.com    virtual void makeInternalLink(SwitchID src, NodeID dest,
908274SAli.Saidi@ARM.com        const NetDest& routing_table_entry, int link_latency, int link_weight,
917811Ssteve.reinhardt@amd.com        int bw_multiplier, bool isReconfiguration) = 0;
927811Ssteve.reinhardt@amd.com
938274SAli.Saidi@ARM.com    virtual void reset() = 0;
944167Sbinkertn@umich.edu
954167Sbinkertn@umich.edu    virtual void printStats(std::ostream& out) const = 0;
964123Sbinkertn@umich.edu    virtual void clearStats() = 0;
974123Sbinkertn@umich.edu    virtual void printConfig(std::ostream& out) const = 0;
988737Skoansin.tan@gmail.com    virtual void print(std::ostream& out) const = 0;
994123Sbinkertn@umich.edu
1004123Sbinkertn@umich.edu  protected:
1014167Sbinkertn@umich.edu    // Private copy constructor and assignment operator
1024167Sbinkertn@umich.edu    Network(const Network& obj);
103    Network& operator=(const Network& obj);
104
105  protected:
106    const std::string m_name;
107    int m_nodes;
108    int m_virtual_networks;
109    int m_buffer_size;
110    int m_endpoint_bandwidth;
111    Topology* m_topology_ptr;
112    bool m_adaptive_routing;
113    int m_link_latency;
114    int m_control_msg_size;
115    int m_data_msg_size;
116};
117
118inline std::ostream&
119operator<<(std::ostream& out, const Network& obj)
120{
121    obj.print(out);
122    out << std::flush;
123    return out;
124}
125
126#endif // __MEM_RUBY_NETWORK_NETWORK_HH__
127