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