PerfectSwitch.hh revision 7454:3a3e8e8cce1b
19241Sandreas.hansson@arm.com/* 29241Sandreas.hansson@arm.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 39241Sandreas.hansson@arm.com * All rights reserved. 49241Sandreas.hansson@arm.com * 59241Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 69241Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 79241Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 89241Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 99241Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 109241Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 119241Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 129241Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 139241Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 149241Sandreas.hansson@arm.com * this software without specific prior written permission. 159241Sandreas.hansson@arm.com * 169241Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179241Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189241Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199241Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209241Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219241Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229241Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239241Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249241Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259241Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269241Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279241Sandreas.hansson@arm.com */ 289241Sandreas.hansson@arm.com 299241Sandreas.hansson@arm.com/* 309241Sandreas.hansson@arm.com * Perfect switch, of course it is perfect and no latency or what so 319241Sandreas.hansson@arm.com * ever. Every cycle it is woke up and perform all the necessary 329241Sandreas.hansson@arm.com * routings that must be done. Note, this switch also has number of 339241Sandreas.hansson@arm.com * input ports/output ports and has a routing table as well. 349241Sandreas.hansson@arm.com */ 359241Sandreas.hansson@arm.com 369241Sandreas.hansson@arm.com#ifndef __MEM_RUBY_NETWORK_SIMPLE_PERFECTSWITCH_HH__ 379241Sandreas.hansson@arm.com#define __MEM_RUBY_NETWORK_SIMPLE_PERFECTSWITCH_HH__ 389241Sandreas.hansson@arm.com 399241Sandreas.hansson@arm.com#include <iostream> 409241Sandreas.hansson@arm.com#include <vector> 419241Sandreas.hansson@arm.com 429241Sandreas.hansson@arm.com#include "mem/ruby/common/Consumer.hh" 439241Sandreas.hansson@arm.com#include "mem/ruby/common/Global.hh" 449241Sandreas.hansson@arm.com#include "mem/ruby/system/NodeID.hh" 459241Sandreas.hansson@arm.com 469241Sandreas.hansson@arm.comclass MessageBuffer; 479241Sandreas.hansson@arm.comclass NetDest; 489402Sandreas.hansson@arm.comclass SimpleNetwork; 499241Sandreas.hansson@arm.com 509241Sandreas.hansson@arm.comstruct LinkOrder 519241Sandreas.hansson@arm.com{ 529241Sandreas.hansson@arm.com int m_link; 539241Sandreas.hansson@arm.com int m_value; 549241Sandreas.hansson@arm.com}; 559241Sandreas.hansson@arm.com 569241Sandreas.hansson@arm.comclass PerfectSwitch : public Consumer 579241Sandreas.hansson@arm.com{ 589241Sandreas.hansson@arm.com public: 599241Sandreas.hansson@arm.com PerfectSwitch(SwitchID sid, SimpleNetwork* network_ptr); 609241Sandreas.hansson@arm.com ~PerfectSwitch(); 619241Sandreas.hansson@arm.com 629241Sandreas.hansson@arm.com void addInPort(const std::vector<MessageBuffer*>& in); 639241Sandreas.hansson@arm.com void addOutPort(const std::vector<MessageBuffer*>& out, 649241Sandreas.hansson@arm.com const NetDest& routing_table_entry); 659241Sandreas.hansson@arm.com void clearRoutingTables(); 669241Sandreas.hansson@arm.com void clearBuffers(); 679241Sandreas.hansson@arm.com void reconfigureOutPort(const NetDest& routing_table_entry); 689241Sandreas.hansson@arm.com int getInLinks() const { return m_in.size(); } 699241Sandreas.hansson@arm.com int getOutLinks() const { return m_out.size(); } 709294Sandreas.hansson@arm.com 719294Sandreas.hansson@arm.com void wakeup(); 729241Sandreas.hansson@arm.com 739241Sandreas.hansson@arm.com void printStats(std::ostream& out) const; 749241Sandreas.hansson@arm.com void clearStats(); 759241Sandreas.hansson@arm.com void printConfig(std::ostream& out) const; 769241Sandreas.hansson@arm.com 779241Sandreas.hansson@arm.com void print(std::ostream& out) const; 789241Sandreas.hansson@arm.com 799241Sandreas.hansson@arm.com private: 809241Sandreas.hansson@arm.com // Private copy constructor and assignment operator 819241Sandreas.hansson@arm.com PerfectSwitch(const PerfectSwitch& obj); 829241Sandreas.hansson@arm.com PerfectSwitch& operator=(const PerfectSwitch& obj); 839241Sandreas.hansson@arm.com 849241Sandreas.hansson@arm.com SwitchID m_switch_id; 859241Sandreas.hansson@arm.com 869241Sandreas.hansson@arm.com // vector of queues from the components 879524SAndreas.Sandberg@ARM.com std::vector<std::vector<MessageBuffer*> > m_in; 889241Sandreas.hansson@arm.com std::vector<std::vector<MessageBuffer*> > m_out; 899241Sandreas.hansson@arm.com std::vector<NetDest> m_routing_table; 909241Sandreas.hansson@arm.com std::vector<LinkOrder> m_link_order; 919241Sandreas.hansson@arm.com int m_virtual_networks; 929241Sandreas.hansson@arm.com int m_round_robin_start; 939241Sandreas.hansson@arm.com int m_wakeups_wo_switch; 949241Sandreas.hansson@arm.com SimpleNetwork* m_network_ptr; 959241Sandreas.hansson@arm.com}; 969241Sandreas.hansson@arm.com 979241Sandreas.hansson@arm.cominline std::ostream& 989241Sandreas.hansson@arm.comoperator<<(std::ostream& out, const PerfectSwitch& obj) 999241Sandreas.hansson@arm.com{ 1009241Sandreas.hansson@arm.com obj.print(out); 1019241Sandreas.hansson@arm.com out << std::flush; 1029524SAndreas.Sandberg@ARM.com return out; 1039241Sandreas.hansson@arm.com} 1049241Sandreas.hansson@arm.com 1059241Sandreas.hansson@arm.com#endif // __MEM_RUBY_NETWORK_SIMPLE_PERFECTSWITCH_HH__ 1069241Sandreas.hansson@arm.com