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