Switch.hh revision 10076:f81d94b53661
14519Sgblack@eecs.umich.edu/* 24519Sgblack@eecs.umich.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 34519Sgblack@eecs.umich.edu * All rights reserved. 44519Sgblack@eecs.umich.edu * 54519Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 64519Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 74519Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 84519Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 94519Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 104519Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 114519Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 124519Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 134519Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 144519Sgblack@eecs.umich.edu * this software without specific prior written permission. 154519Sgblack@eecs.umich.edu * 164519Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174519Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184519Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194519Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204519Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214519Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224519Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234519Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244519Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254519Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264519Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274519Sgblack@eecs.umich.edu */ 284519Sgblack@eecs.umich.edu 294519Sgblack@eecs.umich.edu/* 304519Sgblack@eecs.umich.edu * The actual modelled switch. It use the perfect switch and a 314519Sgblack@eecs.umich.edu * Throttle object to control and bandwidth and timing *only for the 324519Sgblack@eecs.umich.edu * output port*. So here we have un-realistic modelling, since the 334519Sgblack@eecs.umich.edu * order of PerfectSwitch and Throttle objects get woke up affect the 344519Sgblack@eecs.umich.edu * message timing. A more accurate model would be having two set of 354519Sgblack@eecs.umich.edu * system states, one for this cycle, one for next cycle. And on the 364519Sgblack@eecs.umich.edu * cycle boundary swap the two set of states. 374519Sgblack@eecs.umich.edu */ 384519Sgblack@eecs.umich.edu 394519Sgblack@eecs.umich.edu#ifndef __MEM_RUBY_NETWORK_SIMPLE_SWITCH_HH__ 404519Sgblack@eecs.umich.edu#define __MEM_RUBY_NETWORK_SIMPLE_SWITCH_HH__ 414519Sgblack@eecs.umich.edu 424519Sgblack@eecs.umich.edu#include <iostream> 434519Sgblack@eecs.umich.edu#include <vector> 444519Sgblack@eecs.umich.edu 454519Sgblack@eecs.umich.edu#include "mem/packet.hh" 464519Sgblack@eecs.umich.edu#include "mem/protocol/MessageSizeType.hh" 474519Sgblack@eecs.umich.edu#include "mem/ruby/common/TypeDefines.hh" 484519Sgblack@eecs.umich.edu#include "mem/ruby/network/BasicRouter.hh" 494519Sgblack@eecs.umich.edu#include "params/Switch.hh" 504519Sgblack@eecs.umich.edu 514519Sgblack@eecs.umich.educlass MessageBuffer; 524519Sgblack@eecs.umich.educlass PerfectSwitch; 534519Sgblack@eecs.umich.educlass NetDest; 544519Sgblack@eecs.umich.educlass SimpleNetwork; 554519Sgblack@eecs.umich.educlass Throttle; 564519Sgblack@eecs.umich.edu 574519Sgblack@eecs.umich.educlass Switch : public BasicRouter 584519Sgblack@eecs.umich.edu{ 594519Sgblack@eecs.umich.edu public: 604519Sgblack@eecs.umich.edu typedef SwitchParams Params; 614519Sgblack@eecs.umich.edu Switch(const Params *p); 624519Sgblack@eecs.umich.edu ~Switch(); 634519Sgblack@eecs.umich.edu 644519Sgblack@eecs.umich.edu void init(); 654519Sgblack@eecs.umich.edu void addInPort(const std::vector<MessageBuffer*>& in); 664519Sgblack@eecs.umich.edu void addOutPort(const std::vector<MessageBuffer*>& out, 674519Sgblack@eecs.umich.edu const NetDest& routing_table_entry, Cycles link_latency, 684809Sgblack@eecs.umich.edu int bw_multiplier); 694519Sgblack@eecs.umich.edu const Throttle* getThrottle(LinkID link_number) const; 704519Sgblack@eecs.umich.edu 714688Sgblack@eecs.umich.edu void resetStats(); 724688Sgblack@eecs.umich.edu void collateStats(); 734688Sgblack@eecs.umich.edu void regStats(); 744688Sgblack@eecs.umich.edu const Stats::Formula & getMsgCount(unsigned int type) const 754688Sgblack@eecs.umich.edu { return m_msg_counts[type]; } 764688Sgblack@eecs.umich.edu 774708Sgblack@eecs.umich.edu void print(std::ostream& out) const; 784708Sgblack@eecs.umich.edu void init_net_ptr(SimpleNetwork* net_ptr) { m_network_ptr = net_ptr; } 794708Sgblack@eecs.umich.edu 804708Sgblack@eecs.umich.edu bool functionalRead(Packet *); 814519Sgblack@eecs.umich.edu uint32_t functionalWrite(Packet *); 824519Sgblack@eecs.umich.edu 834519Sgblack@eecs.umich.edu private: 844519Sgblack@eecs.umich.edu // Private copy constructor and assignment operator 854519Sgblack@eecs.umich.edu Switch(const Switch& obj); 864519Sgblack@eecs.umich.edu Switch& operator=(const Switch& obj); 874519Sgblack@eecs.umich.edu 884519Sgblack@eecs.umich.edu PerfectSwitch* m_perfect_switch; 894519Sgblack@eecs.umich.edu SimpleNetwork* m_network_ptr; 904519Sgblack@eecs.umich.edu std::vector<Throttle*> m_throttles; 914519Sgblack@eecs.umich.edu std::vector<MessageBuffer*> m_buffers_to_free; 924519Sgblack@eecs.umich.edu 934519Sgblack@eecs.umich.edu // Statistical variables 944519Sgblack@eecs.umich.edu Stats::Formula m_avg_utilization; 954519Sgblack@eecs.umich.edu Stats::Formula m_msg_counts[MessageSizeType_NUM]; 964519Sgblack@eecs.umich.edu Stats::Formula m_msg_bytes[MessageSizeType_NUM]; 974519Sgblack@eecs.umich.edu}; 984519Sgblack@eecs.umich.edu 994688Sgblack@eecs.umich.eduinline std::ostream& 1004688Sgblack@eecs.umich.eduoperator<<(std::ostream& out, const Switch& obj) 1014688Sgblack@eecs.umich.edu{ 1024688Sgblack@eecs.umich.edu obj.print(out); 1034688Sgblack@eecs.umich.edu out << std::flush; 1044688Sgblack@eecs.umich.edu return out; 1054708Sgblack@eecs.umich.edu} 1064708Sgblack@eecs.umich.edu 1074708Sgblack@eecs.umich.edu#endif // __MEM_RUBY_NETWORK_SIMPLE_SWITCH_HH__ 1084708Sgblack@eecs.umich.edu