diff options
author | Tushar Krishna <tushar@ece.gatech.edu> | 2016-10-06 14:35:21 -0400 |
---|---|---|
committer | Tushar Krishna <tushar@ece.gatech.edu> | 2016-10-06 14:35:21 -0400 |
commit | b512f4bf71fac79fb6e17bb2a9e05c1f494f69f4 (patch) | |
tree | ee4e62624aaf5a50e0f232bfea76cd2dcdd8f817 /src/mem/ruby/network/garnet | |
parent | 0962d768270696395dacfbd2ceabe4ee1035a496 (diff) | |
download | gem5-b512f4bf71fac79fb6e17bb2a9e05c1f494f69f4.tar.xz |
ruby: remove the original garnet code.
Only garnet2.0 will be supported henceforth.
Diffstat (limited to 'src/mem/ruby/network/garnet')
63 files changed, 0 insertions, 7167 deletions
diff --git a/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc b/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc deleted file mode 100644 index 2bd2acb9f..000000000 --- a/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "mem/ruby/network/garnet/BaseGarnetNetwork.hh" -#include "mem/ruby/network/MessageBuffer.hh" - -using namespace std; - -BaseGarnetNetwork::BaseGarnetNetwork(const Params *p) - : Network(p) -{ - m_ni_flit_size = p->ni_flit_size; - m_vcs_per_vnet = p->vcs_per_vnet; - m_enable_fault_model = p->enable_fault_model; - if (m_enable_fault_model) - fault_model = p->fault_model; - - // Currently Garnet only supports uniform bandwidth for all - // links and network interfaces. - for (std::vector<BasicExtLink*>::const_iterator i = p->ext_links.begin(); - i != p->ext_links.end(); ++i) { - BasicExtLink* ext_link = (*i); - if (ext_link->params()->bandwidth_factor != m_ni_flit_size) { - fatal("Garnet only supports uniform bw across all links and NIs\n"); - } - } - for (std::vector<BasicIntLink*>::const_iterator i = p->int_links.begin(); - i != p->int_links.end(); ++i) { - BasicIntLink* int_link = (*i); - if (int_link->params()->bandwidth_factor != m_ni_flit_size) { - fatal("Garnet only supports uniform bw across all links and NIs\n"); - } - } -} - -void -BaseGarnetNetwork::init() -{ - Network::init(); -} - -void -BaseGarnetNetwork::regStats() -{ - Network::regStats(); - - m_flits_received - .init(m_virtual_networks) - .name(name() + ".flits_received") - .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline) - ; - - m_flits_injected - .init(m_virtual_networks) - .name(name() + ".flits_injected") - .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline) - ; - - m_network_latency - .init(m_virtual_networks) - .name(name() + ".network_latency") - .flags(Stats::oneline) - ; - - m_queueing_latency - .init(m_virtual_networks) - .name(name() + ".queueing_latency") - .flags(Stats::oneline) - ; - - for (int i = 0; i < m_virtual_networks; i++) { - m_flits_received.subname(i, csprintf("vnet-%i", i)); - m_flits_injected.subname(i, csprintf("vnet-%i", i)); - m_network_latency.subname(i, csprintf("vnet-%i", i)); - m_queueing_latency.subname(i, csprintf("vnet-%i", i)); - } - - m_avg_vnet_latency - .name(name() + ".average_vnet_latency") - .flags(Stats::oneline); - m_avg_vnet_latency = m_network_latency / m_flits_received; - - m_avg_vqueue_latency - .name(name() + ".average_vqueue_latency") - .flags(Stats::oneline); - m_avg_vqueue_latency = m_queueing_latency / m_flits_received; - - m_avg_network_latency.name(name() + ".average_network_latency"); - m_avg_network_latency = sum(m_network_latency) / sum(m_flits_received); - - m_avg_queueing_latency.name(name() + ".average_queueing_latency"); - m_avg_queueing_latency = sum(m_queueing_latency) / sum(m_flits_received); - - m_avg_latency.name(name() + ".average_latency"); - m_avg_latency = m_avg_network_latency + m_avg_queueing_latency; -} diff --git a/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh b/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh deleted file mode 100644 index fe2cbacc3..000000000 --- a/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -/* - * This header file is used to define all configuration parameters - * required by the interconnection network. - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_BASEGARNETNETWORK_HH__ -#define __MEM_RUBY_NETWORK_GARNET_BASEGARNETNETWORK_HH__ - -#include "mem/ruby/network/garnet/NetworkHeader.hh" -#include "mem/ruby/network/Network.hh" -#include "mem/ruby/network/fault_model/FaultModel.hh" -#include "params/BaseGarnetNetwork.hh" - -class BaseGarnetNetwork : public Network -{ - public: - typedef BaseGarnetNetworkParams Params; - BaseGarnetNetwork(const Params *p); - - void init(); - int getNiFlitSize() const { return m_ni_flit_size; } - int getVCsPerVnet() const { return m_vcs_per_vnet; } - bool isFaultModelEnabled() const { return m_enable_fault_model; } - FaultModel* fault_model; - - void increment_injected_flits(int vnet) { m_flits_injected[vnet]++; } - void increment_received_flits(int vnet) { m_flits_received[vnet]++; } - - void - increment_network_latency(Cycles latency, int vnet) - { - m_network_latency[vnet] += latency; - } - - void - increment_queueing_latency(Cycles latency, int vnet) - { - m_queueing_latency[vnet] += latency; - } - - bool isVNetOrdered(int vnet) const { return m_ordered[vnet]; } - - virtual void regStats(); - virtual void collateStats() {} - - protected: - int m_ni_flit_size; - int m_vcs_per_vnet; - bool m_enable_fault_model; - - // Statistical variables - Stats::Vector m_flits_received; - Stats::Vector m_flits_injected; - Stats::Vector m_network_latency; - Stats::Vector m_queueing_latency; - - Stats::Formula m_avg_vnet_latency; - Stats::Formula m_avg_vqueue_latency; - Stats::Formula m_avg_network_latency; - Stats::Formula m_avg_queueing_latency; - Stats::Formula m_avg_latency; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_BASEGARNETNETWORK_HH__ diff --git a/src/mem/ruby/network/garnet/BaseGarnetNetwork.py b/src/mem/ruby/network/garnet/BaseGarnetNetwork.py deleted file mode 100644 index 0bcb0484d..000000000 --- a/src/mem/ruby/network/garnet/BaseGarnetNetwork.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (c) 2008 Princeton University -# Copyright (c) 2009 Advanced Micro Devices, Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer; -# redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution; -# neither the name of the copyright holders nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Authors: Steve Reinhardt -# Brad Beckmann - -from m5.params import * -from Network import RubyNetwork - -class BaseGarnetNetwork(RubyNetwork): - type = 'BaseGarnetNetwork' - cxx_header = "mem/ruby/network/garnet/BaseGarnetNetwork.hh" - abstract = True - ni_flit_size = Param.Int(16, "network interface flit size in bytes") - vcs_per_vnet = Param.Int(4, "virtual channels per virtual network"); - enable_fault_model = Param.Bool(False, "enable network fault model"); - fault_model = Param.FaultModel(NULL, "network fault model"); diff --git a/src/mem/ruby/network/garnet/NetworkHeader.hh b/src/mem/ruby/network/garnet/NetworkHeader.hh deleted file mode 100644 index eccb4b31c..000000000 --- a/src/mem/ruby/network/garnet/NetworkHeader.hh +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_NETWORKHEADER_HH__ -#define __MEM_RUBY_NETWORK_GARNET_NETWORKHEADER_HH__ - -enum flit_type {HEAD_, BODY_, TAIL_, HEAD_TAIL_, NUM_FLIT_TYPE_}; -enum VC_state_type {IDLE_, VC_AB_, ACTIVE_, NUM_VC_STATE_TYPE_}; -enum VNET_type {CTRL_VNET_, DATA_VNET_, NULL_VNET_, NUM_VNET_TYPE_}; -enum flit_stage {I_, VA_, SA_, ST_, LT_, NUM_FLIT_STAGE_}; - -#define INFINITE_ 10000 - -#endif // __MEM_RUBY_NETWORK_GARNET_NETWORKHEADER_HH__ diff --git a/src/mem/ruby/network/garnet/SConscript b/src/mem/ruby/network/garnet/SConscript deleted file mode 100644 index 516bdb564..000000000 --- a/src/mem/ruby/network/garnet/SConscript +++ /dev/null @@ -1,39 +0,0 @@ -# -*- mode:python -*- - -# Copyright (c) 2009 The Hewlett-Packard Development Company -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer; -# redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution; -# neither the name of the copyright holders nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Authors: Nathan Binkert - -Import('*') - -if env['PROTOCOL'] == 'None': - Return() - -SimObject('BaseGarnetNetwork.py') - -Source('BaseGarnetNetwork.cc') - diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/CreditLink_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/CreditLink_d.hh deleted file mode 100644 index e6c39475d..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/CreditLink_d.hh +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_CREDIT_LINK_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_CREDIT_LINK_D_HH__ - -#include "mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh" -#include "params/CreditLink_d.hh" - -class CreditLink_d : public NetworkLink_d -{ - public: - typedef CreditLink_dParams Params; - CreditLink_d(const Params *p) : NetworkLink_d(p) {} -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_CREDIT_LINK_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.cc deleted file mode 100644 index da9249690..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.cc +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2011 Advanced Micro Devices, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "mem/ruby/network/garnet/fixed-pipeline/CreditLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh" - -GarnetIntLink_d::GarnetIntLink_d(const Params *p) - : BasicLink(p) -{ - m_network_links[0] = p->network_links[0]; - m_credit_links[0] = p->credit_links[0]; - m_network_links[1] = p->network_links[1]; - m_credit_links[1] = p->credit_links[1]; -} - -void -GarnetIntLink_d::init() -{ -} - -void -GarnetIntLink_d::print(std::ostream& out) const -{ - out << name(); -} - -GarnetIntLink_d * -GarnetIntLink_dParams::create() -{ - return new GarnetIntLink_d(this); -} - -GarnetExtLink_d::GarnetExtLink_d(const Params *p) - : BasicLink(p) -{ - m_network_links[0] = p->network_links[0]; - m_credit_links[0] = p->credit_links[0]; - m_network_links[1] = p->network_links[1]; - m_credit_links[1] = p->credit_links[1]; -} - -void -GarnetExtLink_d::init() -{ -} - -void -GarnetExtLink_d::print(std::ostream& out) const -{ - out << name(); -} - -GarnetExtLink_d * -GarnetExtLink_dParams::create() -{ - return new GarnetExtLink_d(this); -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.hh deleted file mode 100644 index cb2ae62dc..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.hh +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2011 Advanced Micro Devices, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_LINK_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_LINK_HH__ - -#include <iostream> -#include <string> -#include <vector> - -#include "mem/ruby/network/BasicLink.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/CreditLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh" -#include "params/GarnetIntLink_d.hh" -#include "params/GarnetExtLink_d.hh" - -class GarnetIntLink_d : public BasicLink -{ - public: - typedef GarnetIntLink_dParams Params; - GarnetIntLink_d(const Params *p); - - void init(); - - void print(std::ostream& out) const; - - friend class GarnetNetwork_d; - - protected: - NetworkLink_d* m_network_links[2]; - CreditLink_d* m_credit_links[2]; -}; - -inline std::ostream& -operator<<(std::ostream& out, const GarnetIntLink_d& obj) -{ - obj.print(out); - out << std::flush; - return out; -} - -class GarnetExtLink_d : public BasicLink -{ - public: - typedef GarnetExtLink_dParams Params; - GarnetExtLink_d(const Params *p); - - void init(); - - void print(std::ostream& out) const; - - friend class GarnetNetwork_d; - - protected: - NetworkLink_d* m_network_links[2]; - CreditLink_d* m_credit_links[2]; -}; - -inline std::ostream& -operator<<(std::ostream& out, const GarnetExtLink_d& obj) -{ - obj.print(out); - out << std::flush; - return out; -} - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_LINK_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.py b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.py deleted file mode 100644 index 5a4f3026e..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.py +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright (c) 2008 Princeton University -# Copyright (c) 2009 Advanced Micro Devices, Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer; -# redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution; -# neither the name of the copyright holders nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Authors: Steve Reinhardt -# Brad Beckmann - -from m5.params import * -from m5.proxy import * -from ClockedObject import ClockedObject -from BasicLink import BasicIntLink, BasicExtLink - -class NetworkLink_d(ClockedObject): - type = 'NetworkLink_d' - cxx_header = "mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh" - link_id = Param.Int(Parent.link_id, "link id") - link_latency = Param.Cycles(Parent.latency, "link latency") - vcs_per_vnet = Param.Int(Parent.vcs_per_vnet, - "virtual channels per virtual network") - virt_nets = Param.Int(Parent.number_of_virtual_networks, - "number of virtual networks") - -class CreditLink_d(NetworkLink_d): - type = 'CreditLink_d' - cxx_header = "mem/ruby/network/garnet/fixed-pipeline/CreditLink_d.hh" - -# Interior fixed pipeline links between routers -class GarnetIntLink_d(BasicIntLink): - type = 'GarnetIntLink_d' - cxx_header = "mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.hh" - # The detailed fixed pipeline bi-directional link include two main - # forward links and two backward flow-control links, one per direction - _nls = [] - # In uni-directional link - _nls.append(NetworkLink_d()); - # Out uni-directional link - _nls.append(NetworkLink_d()); - network_links = VectorParam.NetworkLink_d(_nls, "forward links") - - _cls = [] - # In uni-directional link - _cls.append(CreditLink_d()); - # Out uni-directional link - _cls.append(CreditLink_d()); - credit_links = VectorParam.CreditLink_d(_cls, - "backward flow-control links") - -# Exterior fixed pipeline links between a router and a controller -class GarnetExtLink_d(BasicExtLink): - type = 'GarnetExtLink_d' - cxx_header = "mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.hh" - # The detailed fixed pipeline bi-directional link include two main - # forward links and two backward flow-control links, one per direction - _nls = [] - # In uni-directional link - _nls.append(NetworkLink_d()); - # Out uni-directional link - _nls.append(NetworkLink_d()); - network_links = VectorParam.NetworkLink_d(_nls, "forward links") - - _cls = [] - # In uni-directional link - _cls.append(CreditLink_d()); - # Out uni-directional link - _cls.append(CreditLink_d()); - credit_links = VectorParam.CreditLink_d(_cls, - "backward flow-control links") diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc deleted file mode 100644 index 9fd0c8669..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include <cassert> - -#include "base/cast.hh" -#include "base/stl_helpers.hh" -#include "mem/ruby/common/NetDest.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/CreditLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/Router_d.hh" -#include "mem/ruby/system/RubySystem.hh" - -using namespace std; -using m5::stl_helpers::deletePointers; - -GarnetNetwork_d::GarnetNetwork_d(const Params *p) - : BaseGarnetNetwork(p) -{ - m_buffers_per_data_vc = p->buffers_per_data_vc; - m_buffers_per_ctrl_vc = p->buffers_per_ctrl_vc; - - m_vnet_type.resize(m_virtual_networks); - - for (int i = 0 ; i < m_virtual_networks ; i++) - { - if (m_vnet_type_names[i] == "response") - m_vnet_type[i] = DATA_VNET_; // carries data (and ctrl) packets - else - m_vnet_type[i] = CTRL_VNET_; // carries only ctrl packets - } - - // record the routers - for (vector<BasicRouter*>::const_iterator i = p->routers.begin(); - i != p->routers.end(); ++i) { - Router_d* router = safe_cast<Router_d*>(*i); - m_routers.push_back(router); - - // initialize the router's network pointers - router->init_net_ptr(this); - } - - // record the network interfaces - for (vector<ClockedObject*>::const_iterator i = p->netifs.begin(); - i != p->netifs.end(); ++i) { - NetworkInterface_d *ni = safe_cast<NetworkInterface_d *>(*i); - m_nis.push_back(ni); - ni->init_net_ptr(this); - } -} - -void -GarnetNetwork_d::init() -{ - BaseGarnetNetwork::init(); - - for (int i=0; i < m_nodes; i++) { - m_nis[i]->addNode(m_toNetQueues[i], m_fromNetQueues[i]); - } - - // The topology pointer should have already been initialized in the - // parent network constructor - assert(m_topology_ptr != NULL); - m_topology_ptr->createLinks(this); - - // FaultModel: declare each router to the fault model - if (isFaultModelEnabled()){ - for (vector<Router_d*>::const_iterator i= m_routers.begin(); - i != m_routers.end(); ++i) { - Router_d* router = safe_cast<Router_d*>(*i); - int router_id M5_VAR_USED = - fault_model->declare_router(router->get_num_inports(), - router->get_num_outports(), - router->get_vc_per_vnet(), - getBuffersPerDataVC(), - getBuffersPerCtrlVC()); - assert(router_id == router->get_id()); - router->printAggregateFaultProbability(cout); - router->printFaultVector(cout); - } - } -} - -GarnetNetwork_d::~GarnetNetwork_d() -{ - deletePointers(m_routers); - deletePointers(m_nis); - deletePointers(m_links); - deletePointers(m_creditlinks); -} - -/* - * This function creates a link from the Network Interface (NI) - * into the Network. - * It creates a Network Link from the NI to a Router and a Credit Link from - * the Router to the NI -*/ - -void -GarnetNetwork_d::makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry) -{ - assert(src < m_nodes); - - GarnetExtLink_d* garnet_link = safe_cast<GarnetExtLink_d*>(link); - NetworkLink_d* net_link = garnet_link->m_network_links[0]; - CreditLink_d* credit_link = garnet_link->m_credit_links[0]; - - m_links.push_back(net_link); - m_creditlinks.push_back(credit_link); - - m_routers[dest]->addInPort(net_link, credit_link); - m_nis[src]->addOutPort(net_link, credit_link); -} - -/* - * This function creates a link from the Network to a NI. - * It creates a Network Link from a Router to the NI and - * a Credit Link from NI to the Router -*/ - -void -GarnetNetwork_d::makeExtOutLink(SwitchID src, NodeID dest, BasicLink* link, - const NetDest& routing_table_entry) -{ - assert(dest < m_nodes); - assert(src < m_routers.size()); - assert(m_routers[src] != NULL); - - GarnetExtLink_d* garnet_link = safe_cast<GarnetExtLink_d*>(link); - NetworkLink_d* net_link = garnet_link->m_network_links[1]; - CreditLink_d* credit_link = garnet_link->m_credit_links[1]; - - m_links.push_back(net_link); - m_creditlinks.push_back(credit_link); - - m_routers[src]->addOutPort(net_link, routing_table_entry, - link->m_weight, credit_link); - m_nis[dest]->addInPort(net_link, credit_link); -} - -/* - * This function creates an internal network link -*/ - -void -GarnetNetwork_d::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry, - PortDirection src_outport, - PortDirection dst_inport) -{ - GarnetIntLink_d* garnet_link = safe_cast<GarnetIntLink_d*>(link); - NetworkLink_d* net_link = garnet_link->m_network_links[0]; - CreditLink_d* credit_link = garnet_link->m_credit_links[0]; - - m_links.push_back(net_link); - m_creditlinks.push_back(credit_link); - - m_routers[dest]->addInPort(net_link, credit_link); - m_routers[src]->addOutPort(net_link, routing_table_entry, - link->m_weight, credit_link); -} - -void -GarnetNetwork_d::regStats() -{ - BaseGarnetNetwork::regStats(); - - m_average_link_utilization.name(name() + ".avg_link_utilization"); - - m_average_vc_load - .init(m_virtual_networks * m_vcs_per_vnet) - .name(name() + ".avg_vc_load") - .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline) - ; -} - -void -GarnetNetwork_d::collateStats() -{ - RubySystem *rs = params()->ruby_system; - double time_delta = double(curCycle() - rs->getStartCycle()); - - for (int i = 0; i < m_links.size(); i++) { - m_average_link_utilization += - (double(m_links[i]->getLinkUtilization())) / time_delta; - - vector<unsigned int> vc_load = m_links[i]->getVcLoad(); - for (int j = 0; j < vc_load.size(); j++) { - m_average_vc_load[j] += ((double)vc_load[j] / time_delta); - } - } - - // Ask the routers to collate their statistics - for (int i = 0; i < m_routers.size(); i++) { - m_routers[i]->collateStats(); - } -} - -void -GarnetNetwork_d::print(ostream& out) const -{ - out << "[GarnetNetwork_d]"; -} - -GarnetNetwork_d * -GarnetNetwork_dParams::create() -{ - return new GarnetNetwork_d(this); -} - -uint32_t -GarnetNetwork_d::functionalWrite(Packet *pkt) -{ - uint32_t num_functional_writes = 0; - - for (unsigned int i = 0; i < m_routers.size(); i++) { - num_functional_writes += m_routers[i]->functionalWrite(pkt); - } - - for (unsigned int i = 0; i < m_nis.size(); ++i) { - num_functional_writes += m_nis[i]->functionalWrite(pkt); - } - - for (unsigned int i = 0; i < m_links.size(); ++i) { - num_functional_writes += m_links[i]->functionalWrite(pkt); - } - - return num_functional_writes; -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh deleted file mode 100644 index 36a96e955..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_GARNETNETWORK_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_GARNETNETWORK_D_HH__ - -#include <iostream> -#include <vector> - -#include "mem/ruby/network/garnet/BaseGarnetNetwork.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" -#include "params/GarnetNetwork_d.hh" - -class FaultModel; -class NetworkInterface_d; -class Router_d; -class NetDest; -class NetworkLink_d; -class CreditLink_d; - -class GarnetNetwork_d : public BaseGarnetNetwork -{ - public: - typedef GarnetNetwork_dParams Params; - GarnetNetwork_d(const Params *p); - - ~GarnetNetwork_d(); - void init(); - - int getBuffersPerDataVC() { return m_buffers_per_data_vc; } - int getBuffersPerCtrlVC() { return m_buffers_per_ctrl_vc; } - - void collateStats(); - void regStats(); - void print(std::ostream& out) const; - - VNET_type - get_vnet_type(int vc) - { - int vnet = vc/getVCsPerVnet(); - return m_vnet_type[vnet]; - } - - // Methods used by Topology to setup the network - void makeExtOutLink(SwitchID src, NodeID dest, BasicLink* link, - const NetDest& routing_table_entry); - void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry); - void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry, - PortDirection src_outport, - PortDirection dst_inport); - - //! Function for performing a functional write. The return value - //! indicates the number of messages that were written. - uint32_t functionalWrite(Packet *pkt); - - private: - GarnetNetwork_d(const GarnetNetwork_d& obj); - GarnetNetwork_d& operator=(const GarnetNetwork_d& obj); - - std::vector<VNET_type > m_vnet_type; - std::vector<Router_d *> m_routers; // All Routers in Network - std::vector<NetworkLink_d *> m_links; // All links in the network - std::vector<CreditLink_d *> m_creditlinks; // All links in net - std::vector<NetworkInterface_d *> m_nis; // All NI's in Network - - int m_buffers_per_data_vc; - int m_buffers_per_ctrl_vc; - - // Statistical variables for performance - Stats::Scalar m_average_link_utilization; - Stats::Vector m_average_vc_load; -}; - -inline std::ostream& -operator<<(std::ostream& out, const GarnetNetwork_d& obj) -{ - obj.print(out); - out << std::flush; - return out; -} - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_GARNETNETWORK_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.py b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.py deleted file mode 100644 index 0191d45af..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (c) 2008 Princeton University -# Copyright (c) 2009 Advanced Micro Devices, Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer; -# redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution; -# neither the name of the copyright holders nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Authors: Steve Reinhardt -# Brad Beckmann - -from m5.params import * -from m5.proxy import * -from BaseGarnetNetwork import BaseGarnetNetwork -from BasicRouter import BasicRouter -from ClockedObject import ClockedObject - -class GarnetRouter_d(BasicRouter): - type = 'GarnetRouter_d' - cxx_class = 'Router_d' - cxx_header = "mem/ruby/network/garnet/fixed-pipeline/Router_d.hh" - vcs_per_vnet = Param.UInt32(Parent.vcs_per_vnet, - "virtual channels per virtual network") - virt_nets = Param.UInt32(Parent.number_of_virtual_networks, - "number of virtual networks") - -class GarnetNetworkInterface_d(ClockedObject): - type = 'GarnetNetworkInterface_d' - cxx_class = 'NetworkInterface_d' - cxx_header = "mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.hh" - - id = Param.UInt32("ID in relation to other network interfaces") - vcs_per_vnet = Param.UInt32(Parent.vcs_per_vnet, - "virtual channels per virtual network") - virt_nets = Param.UInt32(Parent.number_of_virtual_networks, - "number of virtual networks") - -class GarnetNetwork_d(BaseGarnetNetwork): - type = 'GarnetNetwork_d' - cxx_header = "mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh" - buffers_per_data_vc = Param.UInt32(4, "buffers per data virtual channel"); - buffers_per_ctrl_vc = Param.UInt32(1, "buffers per ctrl virtual channel"); diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.cc deleted file mode 100644 index 2f99d387a..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.cc +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "base/stl_helpers.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/Router_d.hh" - -using namespace std; -using m5::stl_helpers::deletePointers; - -InputUnit_d::InputUnit_d(int id, Router_d *router) : Consumer(router) -{ - m_id = id; - m_router = router; - m_num_vcs = m_router->get_num_vcs(); - m_vc_per_vnet = m_router->get_vc_per_vnet(); - - m_num_buffer_reads.resize(m_num_vcs/m_vc_per_vnet); - m_num_buffer_writes.resize(m_num_vcs/m_vc_per_vnet); - for (int i = 0; i < m_num_buffer_reads.size(); i++) { - m_num_buffer_reads[i] = 0; - m_num_buffer_writes[i] = 0; - } - - creditQueue = new flitBuffer_d(); - // Instantiating the virtual channels - m_vcs.resize(m_num_vcs); - for (int i=0; i < m_num_vcs; i++) { - m_vcs[i] = new VirtualChannel_d(i); - } -} - -InputUnit_d::~InputUnit_d() -{ - delete creditQueue; - deletePointers(m_vcs); -} - -void -InputUnit_d::wakeup() -{ - flit_d *t_flit; - if (m_in_link->isReady(m_router->curCycle())) { - - t_flit = m_in_link->consumeLink(); - int vc = t_flit->get_vc(); - - if ((t_flit->get_type() == HEAD_) || - (t_flit->get_type() == HEAD_TAIL_)) { - - assert(m_vcs[vc]->get_state() == IDLE_); - // Do the route computation for this vc - m_router->route_req(t_flit, this, vc); - - m_vcs[vc]->set_enqueue_time(m_router->curCycle()); - } else { - t_flit->advance_stage(SA_, m_router->curCycle()); - // Changing router latency to 2 cycles. Input Unit takes 1 cycle for wakeup. - // VCalloc, SWalloc, Sw-Xfer and output scheduling takes 1 cycle. The original - // design schedules VCallocator for head flit, and Swalloc for non-head flit. - // VCalloc now calls SWalloc directly instead of scheduling it for the next cycle, - // hence we should not allocate SWalloc, otherwise it might get called twice, once - // by the scheduler and once by VCalloc. - m_router->vcarb_req(); - } - // write flit into input buffer - m_vcs[vc]->insertFlit(t_flit); - - int vnet = vc/m_vc_per_vnet; - // number of writes same as reads - // any flit that is written will be read only once - m_num_buffer_writes[vnet]++; - m_num_buffer_reads[vnet]++; - } -} - -uint32_t -InputUnit_d::functionalWrite(Packet *pkt) -{ - uint32_t num_functional_writes = 0; - for (int i=0; i < m_num_vcs; i++) { - num_functional_writes += m_vcs[i]->functionalWrite(pkt); - } - - return num_functional_writes; -} - -void -InputUnit_d::resetStats() -{ - for (int j = 0; j < m_num_buffer_reads.size(); j++) { - m_num_buffer_reads[j] = 0; - m_num_buffer_writes[j] = 0; - } -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh deleted file mode 100644 index c9437a774..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_INPUT_UNIT_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_INPUT_UNIT_D_HH__ - -#include <iostream> -#include <vector> - -#include "mem/ruby/common/Consumer.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/CreditLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/Router_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class InputUnit_d : public Consumer -{ - public: - InputUnit_d(int id, Router_d *router); - ~InputUnit_d(); - - void wakeup(); - flitBuffer_d* getCreditQueue() { return creditQueue; } - void print(std::ostream& out) const {}; - - inline int get_inlink_id() { return m_in_link->get_id(); } - - inline void - set_vc_state(VC_state_type state, int vc, Cycles curTime) - { - m_vcs[vc]->set_state(state, curTime); - } - - inline void - set_enqueue_time(int invc, Cycles time) - { - m_vcs[invc]->set_enqueue_time(time); - } - - inline Cycles - get_enqueue_time(int invc) - { - return m_vcs[invc]->get_enqueue_time(); - } - - inline void - update_credit(int in_vc, int credit) - { - m_vcs[in_vc]->update_credit(credit); - } - - inline bool - has_credits(int vc) - { - return m_vcs[vc]->has_credits(); - } - - inline void - increment_credit(int in_vc, bool free_signal, Cycles curTime) - { - flit_d *t_flit = new flit_d(in_vc, free_signal, curTime); - creditQueue->insert(t_flit); - m_credit_link->scheduleEventAbsolute(m_router->clockEdge(Cycles(1))); - } - - inline int - get_outvc(int invc) - { - return m_vcs[invc]->get_outvc(); - } - - inline void - updateRoute(int vc, int outport, Cycles curTime) - { - m_vcs[vc]->set_outport(outport); - m_vcs[vc]->set_state(VC_AB_, curTime); - } - - inline void - grant_vc(int in_vc, int out_vc, Cycles curTime) - { - m_vcs[in_vc]->grant_vc(out_vc, curTime); - } - - inline flit_d* - peekTopFlit(int vc) - { - return m_vcs[vc]->peekTopFlit(); - } - - inline flit_d* - getTopFlit(int vc) - { - return m_vcs[vc]->getTopFlit(); - } - - inline bool - need_stage(int vc, VC_state_type state, flit_stage stage, Cycles cTime) - { - return m_vcs[vc]->need_stage(state, stage, cTime); - } - - inline bool - isReady(int invc, Cycles curTime) - { - return m_vcs[invc]->isReady(curTime); - } - - inline int - get_route(int vc) - { - return m_vcs[vc]->get_route(); - } - - inline void - set_in_link(NetworkLink_d *link) - { - m_in_link = link; - } - - inline void - set_credit_link(CreditLink_d *credit_link) - { - m_credit_link = credit_link; - } - - double get_buf_read_count(unsigned int vnet) const - { return m_num_buffer_reads[vnet]; } - double get_buf_write_count(unsigned int vnet) const - { return m_num_buffer_writes[vnet]; } - - uint32_t functionalWrite(Packet *pkt); - void resetStats(); - - private: - int m_id; - int m_num_vcs; - int m_vc_per_vnet; - - Router_d *m_router; - NetworkLink_d *m_in_link; - CreditLink_d *m_credit_link; - flitBuffer_d *creditQueue; - - // Virtual channels - std::vector<VirtualChannel_d *> m_vcs; - - // Statistical variables - std::vector<double> m_num_buffer_writes; - std::vector<double> m_num_buffer_reads; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_INPUT_UNIT_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc deleted file mode 100644 index b1ce027dc..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc +++ /dev/null @@ -1,394 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include <cassert> -#include <cmath> - -#include "base/cast.hh" -#include "base/stl_helpers.hh" -#include "debug/RubyNetwork.hh" -#include "mem/ruby/network/MessageBuffer.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh" -#include "mem/ruby/slicc_interface/Message.hh" - -using namespace std; -using m5::stl_helpers::deletePointers; - -NetworkInterface_d::NetworkInterface_d(const Params *p) - : ClockedObject(p), Consumer(this), m_id(p->id), - m_virtual_networks(p->virt_nets), m_vc_per_vnet(p->vcs_per_vnet), - m_num_vcs(m_vc_per_vnet * m_virtual_networks) -{ - m_vc_round_robin = 0; - m_ni_buffers.resize(m_num_vcs); - m_ni_enqueue_time.resize(m_num_vcs); - creditQueue = new flitBuffer_d(); - - // instantiating the NI flit buffers - for (int i = 0; i < m_num_vcs; i++) { - m_ni_buffers[i] = new flitBuffer_d(); - m_ni_enqueue_time[i] = Cycles(INFINITE_); - } - - m_vc_allocator.resize(m_virtual_networks); // 1 allocator per vnet - for (int i = 0; i < m_virtual_networks; i++) { - m_vc_allocator[i] = 0; - } -} - -void -NetworkInterface_d::init() -{ - for (int i = 0; i < m_num_vcs; i++) { - m_out_vc_state.push_back(new OutVcState_d(i, m_net_ptr)); - } -} - -NetworkInterface_d::~NetworkInterface_d() -{ - deletePointers(m_out_vc_state); - deletePointers(m_ni_buffers); - delete creditQueue; - delete outSrcQueue; -} - -void -NetworkInterface_d::addInPort(NetworkLink_d *in_link, - CreditLink_d *credit_link) -{ - inNetLink = in_link; - in_link->setLinkConsumer(this); - m_ni_credit_link = credit_link; - credit_link->setSourceQueue(creditQueue); -} - -void -NetworkInterface_d::addOutPort(NetworkLink_d *out_link, - CreditLink_d *credit_link) -{ - m_credit_link = credit_link; - credit_link->setLinkConsumer(this); - - outNetLink = out_link; - outSrcQueue = new flitBuffer_d(); - out_link->setSourceQueue(outSrcQueue); -} - -void -NetworkInterface_d::addNode(vector<MessageBuffer *>& in, - vector<MessageBuffer *>& out) -{ - inNode_ptr = in; - outNode_ptr = out; - - for (auto& it : in) { - if (it != nullptr) { - it->setConsumer(this); - } - } -} - -bool -NetworkInterface_d::flitisizeMessage(MsgPtr msg_ptr, int vnet) -{ - Message *net_msg_ptr = msg_ptr.get(); - NetDest net_msg_dest = net_msg_ptr->getDestination(); - - // gets all the destinations associated with this message. - vector<NodeID> dest_nodes = net_msg_dest.getAllDest(); - - // Number of flits is dependent on the link bandwidth available. - // This is expressed in terms of bytes/cycle or the flit size - int num_flits = (int) ceil((double) m_net_ptr->MessageSizeType_to_int( - net_msg_ptr->getMessageSize())/m_net_ptr->getNiFlitSize()); - - // loop to convert all multicast messages into unicast messages - for (int ctr = 0; ctr < dest_nodes.size(); ctr++) { - - // this will return a free output virtual channel - int vc = calculateVC(vnet); - - if (vc == -1) { - return false ; - } - MsgPtr new_msg_ptr = msg_ptr->clone(); - NodeID destID = dest_nodes[ctr]; - - Message *new_net_msg_ptr = new_msg_ptr.get(); - if (dest_nodes.size() > 1) { - NetDest personal_dest; - for (int m = 0; m < (int) MachineType_NUM; m++) { - if ((destID >= MachineType_base_number((MachineType) m)) && - destID < MachineType_base_number((MachineType) (m+1))) { - // calculating the NetDest associated with this destID - personal_dest.clear(); - personal_dest.add((MachineID) {(MachineType) m, (destID - - MachineType_base_number((MachineType) m))}); - new_net_msg_ptr->getDestination() = personal_dest; - break; - } - } - net_msg_dest.removeNetDest(personal_dest); - // removing the destination from the original message to reflect - // that a message with this particular destination has been - // flitisized and an output vc is acquired - net_msg_ptr->getDestination().removeNetDest(personal_dest); - } - - for (int i = 0; i < num_flits; i++) { - m_net_ptr->increment_injected_flits(vnet); - flit_d *fl = new flit_d(i, vc, vnet, num_flits, new_msg_ptr, - curCycle()); - - fl->set_delay(curCycle() - ticksToCycles(msg_ptr->getTime())); - m_ni_buffers[vc]->insert(fl); - } - - m_ni_enqueue_time[vc] = curCycle(); - m_out_vc_state[vc]->setState(ACTIVE_, curCycle()); - } - return true ; -} - -// Looking for a free output vc -int -NetworkInterface_d::calculateVC(int vnet) -{ - for (int i = 0; i < m_vc_per_vnet; i++) { - int delta = m_vc_allocator[vnet]; - m_vc_allocator[vnet]++; - if (m_vc_allocator[vnet] == m_vc_per_vnet) - m_vc_allocator[vnet] = 0; - - if (m_out_vc_state[(vnet*m_vc_per_vnet) + delta]->isInState( - IDLE_, curCycle())) { - return ((vnet*m_vc_per_vnet) + delta); - } - } - return -1; -} - -/* - * The NI wakeup checks whether there are any ready messages in the protocol - * buffer. If yes, it picks that up, flitisizes it into a number of flits and - * puts it into an output buffer and schedules the output link. On a wakeup - * it also checks whether there are flits in the input link. If yes, it picks - * them up and if the flit is a tail, the NI inserts the corresponding message - * into the protocol buffer. It also checks for credits being sent by the - * downstream router. - */ - -void -NetworkInterface_d::wakeup() -{ - DPRINTF(RubyNetwork, "m_id: %d woke up at time: %lld", m_id, curCycle()); - - MsgPtr msg_ptr; - Tick curTime = clockEdge(); - - // Checking for messages coming from the protocol - // can pick up a message/cycle for each virtual net - for (int vnet = 0; vnet < inNode_ptr.size(); ++vnet) { - MessageBuffer *b = inNode_ptr[vnet]; - if (b == nullptr) { - continue; - } - - while (b->isReady(curTime)) { // Is there a message waiting - msg_ptr = b->peekMsgPtr(); - if (flitisizeMessage(msg_ptr, vnet)) { - b->dequeue(curTime); - } else { - break; - } - } - } - - scheduleOutputLink(); - checkReschedule(); - - /*********** Picking messages destined for this NI **********/ - - if (inNetLink->isReady(curCycle())) { - flit_d *t_flit = inNetLink->consumeLink(); - bool free_signal = false; - if (t_flit->get_type() == TAIL_ || t_flit->get_type() == HEAD_TAIL_) { - free_signal = true; - - outNode_ptr[t_flit->get_vnet()]->enqueue( - t_flit->get_msg_ptr(), curTime, cyclesToTicks(Cycles(1))); - } - // Simply send a credit back since we are not buffering - // this flit in the NI - flit_d *credit_flit = new flit_d(t_flit->get_vc(), free_signal, - curCycle()); - creditQueue->insert(credit_flit); - m_ni_credit_link-> - scheduleEventAbsolute(clockEdge(Cycles(1))); - - int vnet = t_flit->get_vnet(); - m_net_ptr->increment_received_flits(vnet); - Cycles network_delay = curCycle() - t_flit->get_enqueue_time(); - Cycles queueing_delay = t_flit->get_delay(); - - m_net_ptr->increment_network_latency(network_delay, vnet); - m_net_ptr->increment_queueing_latency(queueing_delay, vnet); - delete t_flit; - } - - /****************** Checking for credit link *******/ - - if (m_credit_link->isReady(curCycle())) { - flit_d *t_flit = m_credit_link->consumeLink(); - m_out_vc_state[t_flit->get_vc()]->increment_credit(); - if (t_flit->is_free_signal()) { - m_out_vc_state[t_flit->get_vc()]->setState(IDLE_, curCycle()); - } - delete t_flit; - } -} - -/** This function looks at the NI buffers - * if some buffer has flits which are ready to traverse the link in the next - * cycle, and the downstream output vc associated with this flit has buffers - * left, the link is scheduled for the next cycle - */ - -void -NetworkInterface_d::scheduleOutputLink() -{ - int vc = m_vc_round_robin; - m_vc_round_robin++; - if (m_vc_round_robin == m_num_vcs) - m_vc_round_robin = 0; - - for (int i = 0; i < m_num_vcs; i++) { - vc++; - if (vc == m_num_vcs) - vc = 0; - - // model buffer backpressure - if (m_ni_buffers[vc]->isReady(curCycle()) && - m_out_vc_state[vc]->has_credits()) { - - bool is_candidate_vc = true; - int t_vnet = get_vnet(vc); - int vc_base = t_vnet * m_vc_per_vnet; - - if (m_net_ptr->isVNetOrdered(t_vnet)) { - for (int vc_offset = 0; vc_offset < m_vc_per_vnet; - vc_offset++) { - int t_vc = vc_base + vc_offset; - if (m_ni_buffers[t_vc]->isReady(curCycle())) { - if (m_ni_enqueue_time[t_vc] < m_ni_enqueue_time[vc]) { - is_candidate_vc = false; - break; - } - } - } - } - if (!is_candidate_vc) - continue; - - m_out_vc_state[vc]->decrement_credit(); - // Just removing the flit - flit_d *t_flit = m_ni_buffers[vc]->getTopFlit(); - t_flit->set_time(curCycle() + Cycles(1)); - outSrcQueue->insert(t_flit); - // schedule the out link - outNetLink->scheduleEventAbsolute(clockEdge(Cycles(1))); - - if (t_flit->get_type() == TAIL_ || - t_flit->get_type() == HEAD_TAIL_) { - m_ni_enqueue_time[vc] = Cycles(INFINITE_); - } - return; - } - } -} - -int -NetworkInterface_d::get_vnet(int vc) -{ - for (int i = 0; i < m_virtual_networks; i++) { - if (vc >= (i*m_vc_per_vnet) && vc < ((i+1)*m_vc_per_vnet)) { - return i; - } - } - fatal("Could not determine vc"); -} - -void -NetworkInterface_d::checkReschedule() -{ - for (const auto& it : inNode_ptr) { - if (it == nullptr) { - continue; - } - - while (it->isReady(clockEdge())) { // Is there a message waiting - scheduleEvent(Cycles(1)); - return; - } - } - - for (int vc = 0; vc < m_num_vcs; vc++) { - if (m_ni_buffers[vc]->isReady(curCycle() + Cycles(1))) { - scheduleEvent(Cycles(1)); - return; - } - } -} - -void -NetworkInterface_d::print(std::ostream& out) const -{ - out << "[Network Interface]"; -} - -uint32_t -NetworkInterface_d::functionalWrite(Packet *pkt) -{ - uint32_t num_functional_writes = 0; - for (unsigned int i = 0; i < m_num_vcs; ++i) { - num_functional_writes += m_ni_buffers[i]->functionalWrite(pkt); - } - - num_functional_writes += outSrcQueue->functionalWrite(pkt); - return num_functional_writes; -} - -NetworkInterface_d * -GarnetNetworkInterface_dParams::create() -{ - return new NetworkInterface_d(this); -} - diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.hh deleted file mode 100644 index 6432114c1..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.hh +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_NETWORK_INTERFACE_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_NETWORK_INTERFACE_D_HH__ - -#include <iostream> -#include <vector> - -#include "mem/ruby/common/Consumer.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/CreditLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/OutVcState_d.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" -#include "mem/ruby/slicc_interface/Message.hh" -#include "params/GarnetNetworkInterface_d.hh" - -class MessageBuffer; -class flitBuffer_d; - -class NetworkInterface_d : public ClockedObject, public Consumer -{ - public: - typedef GarnetNetworkInterface_dParams Params; - NetworkInterface_d(const Params *p); - ~NetworkInterface_d(); - - void init(); - - void addInPort(NetworkLink_d *in_link, CreditLink_d *credit_link); - void addOutPort(NetworkLink_d *out_link, CreditLink_d *credit_link); - - void wakeup(); - void addNode(std::vector<MessageBuffer *> &inNode, - std::vector<MessageBuffer *> &outNode); - - void print(std::ostream& out) const; - int get_vnet(int vc); - void init_net_ptr(GarnetNetwork_d *net_ptr) { m_net_ptr = net_ptr; } - - uint32_t functionalWrite(Packet *); - - private: - GarnetNetwork_d *m_net_ptr; - const NodeID M5_CLASS_VAR_USED m_id; - const int m_virtual_networks, m_vc_per_vnet, m_num_vcs; - std::vector<OutVcState_d *> m_out_vc_state; - std::vector<int> m_vc_allocator; - int m_vc_round_robin; // For round robin scheduling - flitBuffer_d *outSrcQueue; // For modelling link contention - flitBuffer_d *creditQueue; - - NetworkLink_d *inNetLink; - NetworkLink_d *outNetLink; - CreditLink_d *m_credit_link; - CreditLink_d *m_ni_credit_link; - - // Input Flit Buffers - // The flit buffers which will serve the Consumer - std::vector<flitBuffer_d *> m_ni_buffers; - std::vector<Cycles> m_ni_enqueue_time; - - // The Message buffers that takes messages from the protocol - std::vector<MessageBuffer *> inNode_ptr; - // The Message buffers that provides messages to the protocol - std::vector<MessageBuffer *> outNode_ptr; - - bool flitisizeMessage(MsgPtr msg_ptr, int vnet); - int calculateVC(int vnet); - void scheduleOutputLink(); - void checkReschedule(); -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_NETWORK_INTERFACE_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc deleted file mode 100644 index 60c7ca3f4..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "mem/ruby/network/garnet/fixed-pipeline/CreditLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh" - -NetworkLink_d::NetworkLink_d(const Params *p) - : ClockedObject(p), Consumer(this), m_id(p->link_id), - m_latency(p->link_latency), - linkBuffer(new flitBuffer_d()), link_consumer(nullptr), - link_srcQueue(nullptr), m_link_utilized(0), - m_vc_load(p->vcs_per_vnet * p->virt_nets) -{ -} - -NetworkLink_d::~NetworkLink_d() -{ - delete linkBuffer; -} - -void -NetworkLink_d::setLinkConsumer(Consumer *consumer) -{ - link_consumer = consumer; -} - -void -NetworkLink_d::setSourceQueue(flitBuffer_d *srcQueue) -{ - link_srcQueue = srcQueue; -} - -void -NetworkLink_d::wakeup() -{ - if (link_srcQueue->isReady(curCycle())) { - flit_d *t_flit = link_srcQueue->getTopFlit(); - t_flit->set_time(curCycle() + m_latency); - linkBuffer->insert(t_flit); - link_consumer->scheduleEventAbsolute(clockEdge(m_latency)); - m_link_utilized++; - m_vc_load[t_flit->get_vc()]++; - } -} - -NetworkLink_d * -NetworkLink_dParams::create() -{ - return new NetworkLink_d(this); -} - -CreditLink_d * -CreditLink_dParams::create() -{ - return new CreditLink_d(this); -} - -uint32_t -NetworkLink_d::functionalWrite(Packet *pkt) -{ - return linkBuffer->functionalWrite(pkt); -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh deleted file mode 100644 index be937f093..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_NETWORK_LINK_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_NETWORK_LINK_D_HH__ - -#include <iostream> -#include <vector> - -#include "mem/ruby/common/Consumer.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" -#include "params/NetworkLink_d.hh" -#include "sim/clocked_object.hh" - -class GarnetNetwork_d; - -class NetworkLink_d : public ClockedObject, public Consumer -{ - public: - typedef NetworkLink_dParams Params; - NetworkLink_d(const Params *p); - ~NetworkLink_d(); - - void setLinkConsumer(Consumer *consumer); - void setSourceQueue(flitBuffer_d *srcQueue); - void print(std::ostream& out) const {} - int get_id() const { return m_id; } - void wakeup(); - - unsigned int getLinkUtilization() const { return m_link_utilized; } - const std::vector<unsigned int> & getVcLoad() const { return m_vc_load; } - - inline bool isReady(Cycles curTime) - { return linkBuffer->isReady(curTime); } - - inline flit_d* peekLink() { return linkBuffer->peekTopFlit(); } - inline flit_d* consumeLink() { return linkBuffer->getTopFlit(); } - - uint32_t functionalWrite(Packet *); - - private: - const int m_id; - const Cycles m_latency; - - flitBuffer_d *linkBuffer; - Consumer *link_consumer; - flitBuffer_d *link_srcQueue; - - // Statistical variables - unsigned int m_link_utilized; - std::vector<unsigned int> m_vc_load; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_NETWORK_LINK_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/OutVcState_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/OutVcState_d.cc deleted file mode 100644 index 39cfc00b5..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/OutVcState_d.cc +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "mem/ruby/network/garnet/fixed-pipeline/OutVcState_d.hh" - -#include "mem/ruby/system/RubySystem.hh" - -OutVcState_d::OutVcState_d(int id, GarnetNetwork_d *network_ptr) - : m_time(0) -{ - m_id = id; - m_vc_state = IDLE_; - - if (network_ptr->get_vnet_type(id) == DATA_VNET_) - m_credit_count = network_ptr->getBuffersPerDataVC(); - else - m_credit_count = network_ptr->getBuffersPerCtrlVC(); - - assert(m_credit_count >= 1); -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/OutVcState_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/OutVcState_d.hh deleted file mode 100644 index 08ceecec0..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/OutVcState_d.hh +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_OUT_VC_STATE_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_OUT_VC_STATE_D_HH__ - -#include "mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class OutVcState_d -{ - public: - OutVcState_d(int id, GarnetNetwork_d *network_ptr); - - int get_inport() { return m_in_port; } - int get_invc() { return m_in_vc; } - int get_credit_count() { return m_credit_count; } - - void set_inport(int port) { m_in_port = port; } - void set_invc(int vc) { m_in_vc = vc; } - inline bool - isInState(VC_state_type state, Cycles request_time) - { - return ((m_vc_state == state) && (request_time >= m_time) ); - } - inline void - setState(VC_state_type state, Cycles time) - { - m_vc_state = state; - m_time = time; - } - inline bool has_credits() { return (m_credit_count > 0); } - inline void increment_credit() { m_credit_count++; } - inline void decrement_credit() { m_credit_count--; } - - private: - int m_id ; - Cycles m_time; - VC_state_type m_vc_state; - int m_in_port; - int m_in_vc; - int m_credit_count; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_OUT_VC_STATE_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.cc deleted file mode 100644 index 9ef2ca271..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.cc +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "base/stl_helpers.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/Router_d.hh" - -using namespace std; -using m5::stl_helpers::deletePointers; - -OutputUnit_d::OutputUnit_d(int id, Router_d *router) - : Consumer(router) -{ - m_id = id; - m_router = router; - m_num_vcs = m_router->get_num_vcs(); - m_out_buffer = new flitBuffer_d(); - - for (int i = 0; i < m_num_vcs; i++) { - m_outvc_state.push_back(new OutVcState_d(i, m_router->get_net_ptr())); - } -} - -OutputUnit_d::~OutputUnit_d() -{ - delete m_out_buffer; - deletePointers(m_outvc_state); -} - -void -OutputUnit_d::decrement_credit(int out_vc) -{ - m_outvc_state[out_vc]->decrement_credit(); - m_router->update_incredit(m_outvc_state[out_vc]->get_inport(), - m_outvc_state[out_vc]->get_invc(), - m_outvc_state[out_vc]->get_credit_count()); -} - -void -OutputUnit_d::wakeup() -{ - if (m_credit_link->isReady(m_router->curCycle())) { - flit_d *t_flit = m_credit_link->consumeLink(); - int out_vc = t_flit->get_vc(); - m_outvc_state[out_vc]->increment_credit(); - m_router->update_incredit(m_outvc_state[out_vc]->get_inport(), - m_outvc_state[out_vc]->get_invc(), - m_outvc_state[out_vc]->get_credit_count()); - - if (t_flit->is_free_signal()) - set_vc_state(IDLE_, out_vc, m_router->curCycle()); - - delete t_flit; - } -} - -flitBuffer_d* -OutputUnit_d::getOutQueue() -{ - return m_out_buffer; -} - -void -OutputUnit_d::set_out_link(NetworkLink_d *link) -{ - m_out_link = link; -} - -void -OutputUnit_d::set_credit_link(CreditLink_d *credit_link) -{ - m_credit_link = credit_link; -} - -void -OutputUnit_d::update_vc(int vc, int in_port, int in_vc) -{ - m_outvc_state[vc]->setState(ACTIVE_, m_router->curCycle()); - m_outvc_state[vc]->set_inport(in_port); - m_outvc_state[vc]->set_invc(in_vc); - m_router->update_incredit(in_port, in_vc, - m_outvc_state[vc]->get_credit_count()); -} - -uint32_t -OutputUnit_d::functionalWrite(Packet *pkt) -{ - return m_out_buffer->functionalWrite(pkt); -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh deleted file mode 100644 index 85b0f6a38..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_OUTPUT_UNIT_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_OUTPUT_UNIT_D_HH__ - -#include <iostream> -#include <vector> - -#include "mem/ruby/common/Consumer.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/CreditLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/OutVcState_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/Router_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class OutputUnit_d : public Consumer -{ - public: - OutputUnit_d(int id, Router_d *router); - ~OutputUnit_d(); - void set_out_link(NetworkLink_d *link); - void set_credit_link(CreditLink_d *credit_link); - void wakeup(); - flitBuffer_d* getOutQueue(); - void update_vc(int vc, int in_port, int in_vc); - void print(std::ostream& out) const {}; - void decrement_credit(int out_vc); - - int - get_credit_cnt(int vc) - { - return m_outvc_state[vc]->get_credit_count(); - } - - inline int - get_outlink_id() - { - return m_out_link->get_id(); - } - - inline void - set_vc_state(VC_state_type state, int vc, Cycles curTime) - { - m_outvc_state[vc]->setState(state, curTime); - } - - inline bool - is_vc_idle(int vc, Cycles curTime) - { - return (m_outvc_state[vc]->isInState(IDLE_, curTime)); - } - - inline void - insert_flit(flit_d *t_flit) - { - m_out_buffer->insert(t_flit); - m_out_link->scheduleEventAbsolute(m_router->clockEdge(Cycles(1))); - } - - uint32_t functionalWrite(Packet *pkt); - - private: - int m_id; - int m_num_vcs; - Router_d *m_router; - NetworkLink_d *m_out_link; - CreditLink_d *m_credit_link; - - flitBuffer_d *m_out_buffer; // This is for the network link to consume - std::vector<OutVcState_d *> m_outvc_state; // vc state of downstream router - -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_OUTPUT_UNIT_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc deleted file mode 100644 index dab9b7dda..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "base/stl_helpers.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/CreditLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/Router_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/RoutingUnit_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/Switch_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.hh" - -using namespace std; -using m5::stl_helpers::deletePointers; - -Router_d::Router_d(const Params *p) - : BasicRouter(p) -{ - m_virtual_networks = p->virt_nets; - m_vc_per_vnet = p->vcs_per_vnet; - m_num_vcs = m_virtual_networks * m_vc_per_vnet; - - m_routing_unit = new RoutingUnit_d(this); - m_vc_alloc = new VCallocator_d(this); - m_sw_alloc = new SWallocator_d(this); - m_switch = new Switch_d(this); - - m_input_unit.clear(); - m_output_unit.clear(); -} - -Router_d::~Router_d() -{ - deletePointers(m_input_unit); - deletePointers(m_output_unit); - delete m_routing_unit; - delete m_vc_alloc; - delete m_sw_alloc; - delete m_switch; -} - -void -Router_d::init() -{ - BasicRouter::init(); - - m_vc_alloc->init(); - m_sw_alloc->init(); - m_switch->init(); -} - -void -Router_d::addInPort(NetworkLink_d *in_link, CreditLink_d *credit_link) -{ - int port_num = m_input_unit.size(); - InputUnit_d *input_unit = new InputUnit_d(port_num, this); - - input_unit->set_in_link(in_link); - input_unit->set_credit_link(credit_link); - in_link->setLinkConsumer(input_unit); - credit_link->setSourceQueue(input_unit->getCreditQueue()); - - m_input_unit.push_back(input_unit); -} - -void -Router_d::addOutPort(NetworkLink_d *out_link, - const NetDest& routing_table_entry, int link_weight, - CreditLink_d *credit_link) -{ - int port_num = m_output_unit.size(); - OutputUnit_d *output_unit = new OutputUnit_d(port_num, this); - - output_unit->set_out_link(out_link); - output_unit->set_credit_link(credit_link); - credit_link->setLinkConsumer(output_unit); - out_link->setSourceQueue(output_unit->getOutQueue()); - - m_output_unit.push_back(output_unit); - - m_routing_unit->addRoute(routing_table_entry); - m_routing_unit->addWeight(link_weight); -} - -void -Router_d::route_req(flit_d *t_flit, InputUnit_d *in_unit, int invc) -{ - m_routing_unit->RC_stage(t_flit, in_unit, invc); -} - -void -Router_d::vcarb_req() -{ - m_vc_alloc->scheduleEventAbsolute(clockEdge(Cycles(1))); -} - -void -Router_d::swarb_req() -{ - m_sw_alloc->scheduleEventAbsolute(clockEdge(Cycles(1))); -} - -void -Router_d::call_sw_alloc() -{ - m_sw_alloc->wakeup(); -} - -void -Router_d::call_switch() -{ - m_switch->wakeup(); -} - -void -Router_d::update_incredit(int in_port, int in_vc, int credit) -{ - m_input_unit[in_port]->update_credit(in_vc, credit); -} - -void -Router_d::update_sw_winner(int inport, flit_d *t_flit) -{ - m_switch->update_sw_winner(inport, t_flit); - m_switch->scheduleEventAbsolute(clockEdge(Cycles(1))); -} - -void -Router_d::regStats() -{ - BasicRouter::regStats(); - - m_buffer_reads - .name(name() + ".buffer_reads") - .flags(Stats::nozero) - ; - - m_buffer_writes - .name(name() + ".buffer_writes") - .flags(Stats::nozero) - ; - - m_crossbar_activity - .name(name() + ".crossbar_activity") - .flags(Stats::nozero) - ; - - m_sw_local_arbiter_activity - .name(name() + ".sw_local_arbiter_activity") - .flags(Stats::nozero) - ; - - m_sw_global_arbiter_activity - .name(name() + ".sw_global_arbiter_activity") - .flags(Stats::nozero) - ; - - m_vc_local_arbiter_activity - .name(name() + ".vc_local_arbiter_activity") - .flags(Stats::nozero) - ; - - m_vc_global_arbiter_activity - .name(name() + ".vc_global_arbiter_activity") - .flags(Stats::nozero) - ; -} - -void -Router_d::collateStats() -{ - for (int j = 0; j < m_virtual_networks; j++) { - for (int i = 0; i < m_input_unit.size(); i++) { - m_buffer_reads += m_input_unit[i]->get_buf_read_count(j); - m_buffer_writes += m_input_unit[i]->get_buf_write_count(j); - } - - m_vc_local_arbiter_activity += m_vc_alloc->get_local_arbit_count(j); - m_vc_global_arbiter_activity += m_vc_alloc->get_global_arbit_count(j); - } - - m_sw_local_arbiter_activity = m_sw_alloc->get_local_arbit_count(); - m_sw_global_arbiter_activity = m_sw_alloc->get_global_arbit_count(); - m_crossbar_activity = m_switch->get_crossbar_count(); -} - -void -Router_d::resetStats() -{ - for (int j = 0; j < m_virtual_networks; j++) { - for (int i = 0; i < m_input_unit.size(); i++) { - m_input_unit[i]->resetStats(); - } - } -} - -void -Router_d::printFaultVector(ostream& out) -{ - int temperature_celcius = BASELINE_TEMPERATURE_CELCIUS; - int num_fault_types = m_network_ptr->fault_model->number_of_fault_types; - float fault_vector[num_fault_types]; - get_fault_vector(temperature_celcius, fault_vector); - out << "Router-" << m_id << " fault vector: " << endl; - for (int fault_type_index = 0; fault_type_index < num_fault_types; - fault_type_index++){ - out << " - probability of ("; - out << - m_network_ptr->fault_model->fault_type_to_string(fault_type_index); - out << ") = "; - out << fault_vector[fault_type_index] << endl; - } -} - -void -Router_d::printAggregateFaultProbability(std::ostream& out) -{ - int temperature_celcius = BASELINE_TEMPERATURE_CELCIUS; - float aggregate_fault_prob; - get_aggregate_fault_probability(temperature_celcius, - &aggregate_fault_prob); - out << "Router-" << m_id << " fault probability: "; - out << aggregate_fault_prob << endl; -} - -uint32_t -Router_d::functionalWrite(Packet *pkt) -{ - uint32_t num_functional_writes = 0; - num_functional_writes += m_switch->functionalWrite(pkt); - - for (uint32_t i = 0; i < m_input_unit.size(); i++) { - num_functional_writes += m_input_unit[i]->functionalWrite(pkt); - } - - for (uint32_t i = 0; i < m_output_unit.size(); i++) { - num_functional_writes += m_output_unit[i]->functionalWrite(pkt); - } - - return num_functional_writes; -} - -Router_d * -GarnetRouter_dParams::create() -{ - return new Router_d(this); -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.hh deleted file mode 100644 index 99a0046ce..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.hh +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_ROUTER_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_ROUTER_D_HH__ - -#include <iostream> -#include <vector> - -#include "mem/ruby/common/NetDest.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/flit_d.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" -#include "mem/ruby/network/BasicRouter.hh" -#include "params/GarnetRouter_d.hh" - -class NetworkLink_d; -class CreditLink_d; -class InputUnit_d; -class OutputUnit_d; -class RoutingUnit_d; -class VCallocator_d; -class SWallocator_d; -class Switch_d; -class FaultModel; - -class Router_d : public BasicRouter -{ - public: - typedef GarnetRouter_dParams Params; - Router_d(const Params *p); - - ~Router_d(); - - void init(); - void addInPort(NetworkLink_d *link, CreditLink_d *credit_link); - void addOutPort(NetworkLink_d *link, const NetDest& routing_table_entry, - int link_weight, CreditLink_d *credit_link); - - int get_num_vcs() { return m_num_vcs; } - int get_num_vnets() { return m_virtual_networks; } - int get_vc_per_vnet() { return m_vc_per_vnet; } - int get_num_inports() { return m_input_unit.size(); } - int get_num_outports() { return m_output_unit.size(); } - int get_id() { return m_id; } - - void init_net_ptr(GarnetNetwork_d* net_ptr) - { - m_network_ptr = net_ptr; - } - - GarnetNetwork_d* get_net_ptr() { return m_network_ptr; } - std::vector<InputUnit_d *>& get_inputUnit_ref() { return m_input_unit; } - std::vector<OutputUnit_d *>& get_outputUnit_ref() { return m_output_unit; } - - void update_sw_winner(int inport, flit_d *t_flit); - void update_incredit(int in_port, int in_vc, int credit); - void route_req(flit_d *t_flit, InputUnit_d* in_unit, int invc); - void vcarb_req(); - void swarb_req(); - void call_sw_alloc(); - void call_switch(); - - void printFaultVector(std::ostream& out); - void printAggregateFaultProbability(std::ostream& out); - - void regStats(); - void collateStats(); - void resetStats(); - - bool get_fault_vector(int temperature, float fault_vector[]){ - return m_network_ptr->fault_model->fault_vector(m_id, temperature, - fault_vector); - } - bool get_aggregate_fault_probability(int temperature, - float *aggregate_fault_prob){ - return m_network_ptr->fault_model->fault_prob(m_id, temperature, - aggregate_fault_prob); - } - - uint32_t functionalWrite(Packet *); - - private: - int m_virtual_networks, m_num_vcs, m_vc_per_vnet; - GarnetNetwork_d *m_network_ptr; - - std::vector<InputUnit_d *> m_input_unit; - std::vector<OutputUnit_d *> m_output_unit; - RoutingUnit_d *m_routing_unit; - VCallocator_d *m_vc_alloc; - SWallocator_d *m_sw_alloc; - Switch_d *m_switch; - - // Statistical variables required for power computations - Stats::Scalar m_buffer_reads; - Stats::Scalar m_buffer_writes; - - Stats::Scalar m_sw_local_arbiter_activity; - Stats::Scalar m_sw_global_arbiter_activity; - - Stats::Scalar m_vc_local_arbiter_activity; - Stats::Scalar m_vc_global_arbiter_activity; - - Stats::Scalar m_crossbar_activity; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_ROUTER_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/RoutingUnit_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/RoutingUnit_d.cc deleted file mode 100644 index cd8f974f6..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/RoutingUnit_d.cc +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "base/cast.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/Router_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/RoutingUnit_d.hh" -#include "mem/ruby/slicc_interface/Message.hh" - -RoutingUnit_d::RoutingUnit_d(Router_d *router) -{ - m_router = router; - m_routing_table.clear(); - m_weight_table.clear(); -} - -void -RoutingUnit_d::addRoute(const NetDest& routing_table_entry) -{ - m_routing_table.push_back(routing_table_entry); -} - -void -RoutingUnit_d::addWeight(int link_weight) -{ - m_weight_table.push_back(link_weight); -} - -void -RoutingUnit_d::RC_stage(flit_d *t_flit, InputUnit_d *in_unit, int invc) -{ - int outport = routeCompute(t_flit); - in_unit->updateRoute(invc, outport, m_router->curCycle()); - t_flit->advance_stage(VA_, m_router->curCycle() + Cycles(1)); - m_router->vcarb_req(); -} - -int -RoutingUnit_d::routeCompute(flit_d *t_flit) -{ - MsgPtr msg_ptr = t_flit->get_msg_ptr(); - Message *net_msg_ptr = msg_ptr.get(); - NetDest msg_destination = net_msg_ptr->getDestination(); - - int output_link = -1; - int min_weight = INFINITE_; - - for (int link = 0; link < m_routing_table.size(); link++) { - if (msg_destination.intersectionIsNotEmpty(m_routing_table[link])) { - if (m_weight_table[link] >= min_weight) - continue; - output_link = link; - min_weight = m_weight_table[link]; - } - } - - if (output_link == -1) { - fatal("Fatal Error:: No Route exists from this Router."); - exit(0); - } - - return output_link; -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/RoutingUnit_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/RoutingUnit_d.hh deleted file mode 100644 index 15e893150..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/RoutingUnit_d.hh +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_ROUTING_UNIT_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_ROUTING_UNIT_D_HH__ - -#include "mem/ruby/common/Consumer.hh" -#include "mem/ruby/common/NetDest.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/flit_d.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class InputUnit_d; -class Router_d; - -class RoutingUnit_d -{ - public: - RoutingUnit_d(Router_d *router); - void addRoute(const NetDest& routing_table_entry); - int routeCompute(flit_d *t_flit); - void addWeight(int link_weight); - void RC_stage(flit_d *t_flit, InputUnit_d *in_unit, int invc); - - private: - Router_d *m_router; - std::vector<NetDest> m_routing_table; - std::vector<int> m_weight_table; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_ROUTING_UNIT_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/SConscript b/src/mem/ruby/network/garnet/fixed-pipeline/SConscript deleted file mode 100644 index 534fdc884..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/SConscript +++ /dev/null @@ -1,53 +0,0 @@ -# -*- mode:python -*- - -# Copyright (c) 2009 The Hewlett-Packard Development Company -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer; -# redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution; -# neither the name of the copyright holders nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Authors: Nathan Binkert - -Import('*') - -if env['PROTOCOL'] == 'None': - Return() - -SimObject('GarnetLink_d.py') -SimObject('GarnetNetwork_d.py') - -Source('GarnetLink_d.cc') -Source('GarnetNetwork_d.cc') -Source('InputUnit_d.cc') -Source('NetworkInterface_d.cc') -Source('NetworkLink_d.cc') -Source('OutVcState_d.cc') -Source('OutputUnit_d.cc') -Source('Router_d.cc') -Source('RoutingUnit_d.cc') -Source('SWallocator_d.cc') -Source('Switch_d.cc') -Source('VCallocator_d.cc') -Source('VirtualChannel_d.cc') -Source('flitBuffer_d.cc') -Source('flit_d.cc') diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc deleted file mode 100644 index 2387d2e8a..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/Router_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.hh" - -SWallocator_d::SWallocator_d(Router_d *router) - : Consumer(router) -{ - m_router = router; - m_num_vcs = m_router->get_num_vcs(); - m_vc_per_vnet = m_router->get_vc_per_vnet(); - - m_local_arbiter_activity = 0; - m_global_arbiter_activity = 0; -} - -void -SWallocator_d::init() -{ - m_input_unit = m_router->get_inputUnit_ref(); - m_output_unit = m_router->get_outputUnit_ref(); - - m_num_inports = m_router->get_num_inports(); - m_num_outports = m_router->get_num_outports(); - m_round_robin_outport.resize(m_num_outports); - m_round_robin_inport.resize(m_num_inports); - m_port_req.resize(m_num_outports); - m_vc_winners.resize(m_num_outports); - - for (int i = 0; i < m_num_inports; i++) { - m_round_robin_inport[i] = 0; - } - - for (int i = 0; i < m_num_outports; i++) { - m_port_req[i].resize(m_num_inports); - m_vc_winners[i].resize(m_num_inports); - - m_round_robin_outport[i] = 0; - - for (int j = 0; j < m_num_inports; j++) { - m_port_req[i][j] = false; // [outport][inport] - } - } -} - -void -SWallocator_d::wakeup() -{ - arbitrate_inports(); // First stage of allocation - arbitrate_outports(); // Second stage of allocation - - clear_request_vector(); - check_for_wakeup(); - m_router->call_switch(); - -} - -void -SWallocator_d::arbitrate_inports() -{ - // First do round robin arbitration on a set of input vc requests - for (int inport = 0; inport < m_num_inports; inport++) { - int invc = m_round_robin_inport[inport]; - - // Select next round robin vc candidate within valid vnet - int next_round_robin_invc = invc; - next_round_robin_invc++; - if (next_round_robin_invc >= m_num_vcs) - next_round_robin_invc = 0; - m_round_robin_inport[inport] = next_round_robin_invc; - - for (int invc_iter = 0; invc_iter < m_num_vcs; invc_iter++) { - invc++; - if (invc >= m_num_vcs) - invc = 0; - - if (m_input_unit[inport]->need_stage(invc, ACTIVE_, SA_, - m_router->curCycle()) && - m_input_unit[inport]->has_credits(invc)) { - - if (is_candidate_inport(inport, invc)) { - int outport = m_input_unit[inport]->get_route(invc); - m_local_arbiter_activity++; - m_port_req[outport][inport] = true; - m_vc_winners[outport][inport]= invc; - break; // got one vc winner for this port - } - } - } - } -} - -bool -SWallocator_d::is_candidate_inport(int inport, int invc) -{ - int outport = m_input_unit[inport]->get_route(invc); - Cycles t_enqueue_time = m_input_unit[inport]->get_enqueue_time(invc); - int t_vnet = get_vnet(invc); - int vc_base = t_vnet*m_vc_per_vnet; - if ((m_router->get_net_ptr())->isVNetOrdered(t_vnet)) { - for (int vc_offset = 0; vc_offset < m_vc_per_vnet; vc_offset++) { - int temp_vc = vc_base + vc_offset; - if (m_input_unit[inport]->need_stage(temp_vc, ACTIVE_, SA_, - m_router->curCycle()) && - (m_input_unit[inport]->get_route(temp_vc) == outport) && - (m_input_unit[inport]->get_enqueue_time(temp_vc) < - t_enqueue_time)) { - return false; - break; - } - } - } - return true; -} - - -void -SWallocator_d::arbitrate_outports() -{ - // Now there are a set of input vc requests for output vcs. - // Again do round robin arbitration on these requests - for (int outport = 0; outport < m_num_outports; outport++) { - int inport = m_round_robin_outport[outport]; - m_round_robin_outport[outport]++; - - if (m_round_robin_outport[outport] >= m_num_outports) - m_round_robin_outport[outport] = 0; - - for (int inport_iter = 0; inport_iter < m_num_inports; inport_iter++) { - inport++; - if (inport >= m_num_inports) - inport = 0; - - // inport has a request this cycle for outport: - if (m_port_req[outport][inport]) { - m_port_req[outport][inport] = false; - int invc = m_vc_winners[outport][inport]; - int outvc = m_input_unit[inport]->get_outvc(invc); - - // remove flit from Input Unit - flit_d *t_flit = m_input_unit[inport]->getTopFlit(invc); - t_flit->advance_stage(ST_, m_router->curCycle()); - t_flit->set_vc(outvc); - t_flit->set_outport(outport); - t_flit->set_time(m_router->curCycle()); - - m_output_unit[outport]->decrement_credit(outvc); - m_router->update_sw_winner(inport, t_flit); - m_global_arbiter_activity++; - - if ((t_flit->get_type() == TAIL_) || - t_flit->get_type() == HEAD_TAIL_) { - - // Send a credit back - // along with the information that this VC is now idle - m_input_unit[inport]->increment_credit(invc, true, - m_router->curCycle()); - - // This Input VC should now be empty - assert(!m_input_unit[inport]-> - isReady(invc, m_router->curCycle())); - - m_input_unit[inport]->set_vc_state(IDLE_, invc, - m_router->curCycle()); - m_input_unit[inport]->set_enqueue_time(invc, - Cycles(INFINITE_)); - } else { - // Send a credit back - // but do not indicate that the VC is idle - m_input_unit[inport]->increment_credit(invc, false, - m_router->curCycle()); - } - break; // got a in request for this outport - } - } - } -} - -void -SWallocator_d::check_for_wakeup() -{ - Cycles nextCycle = m_router->curCycle() + Cycles(1); - - for (int i = 0; i < m_num_inports; i++) { - for (int j = 0; j < m_num_vcs; j++) { - if (m_input_unit[i]->need_stage(j, ACTIVE_, SA_, nextCycle)) { - m_router->vcarb_req(); - return; - } - } - } -} - -int -SWallocator_d::get_vnet(int invc) -{ - int vnet = invc/m_vc_per_vnet; - assert(vnet < m_router->get_num_vnets()); - return vnet; -} - -void -SWallocator_d::clear_request_vector() -{ - for (int i = 0; i < m_num_outports; i++) { - for (int j = 0; j < m_num_inports; j++) { - m_port_req[i][j] = false; - } - } -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.hh deleted file mode 100644 index 15f7b8bfe..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.hh +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_SW_ALLOCATOR_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_SW_ALLOCATOR_D_HH__ - -#include <iostream> -#include <vector> - -#include "mem/ruby/common/Consumer.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class Router_d; -class InputUnit_d; -class OutputUnit_d; - -class SWallocator_d : public Consumer -{ - public: - SWallocator_d(Router_d *router); - void wakeup(); - void init(); - void clear_request_vector(); - void check_for_wakeup(); - int get_vnet (int invc); - void print(std::ostream& out) const {}; - void arbitrate_inports(); - void arbitrate_outports(); - bool is_candidate_inport(int inport, int invc); - - inline double - get_local_arbit_count() - { - return m_local_arbiter_activity; - } - inline double - get_global_arbit_count() - { - return m_global_arbiter_activity; - } - - private: - int m_num_inports, m_num_outports; - int m_num_vcs, m_vc_per_vnet; - - double m_local_arbiter_activity, m_global_arbiter_activity; - - Router_d *m_router; - std::vector<int> m_round_robin_outport; - std::vector<int> m_round_robin_inport; - std::vector<std::vector<bool> > m_port_req; - std::vector<std::vector<int> > m_vc_winners; // a list for each outport - std::vector<InputUnit_d *> m_input_unit; - std::vector<OutputUnit_d *> m_output_unit; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_SW_ALLOCATOR_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/Switch_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/Switch_d.cc deleted file mode 100644 index 25dc26e51..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/Switch_d.cc +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "base/stl_helpers.hh" -#include "debug/RubyNetwork.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/Router_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/Switch_d.hh" - -using m5::stl_helpers::deletePointers; - -Switch_d::Switch_d(Router_d *router) - : Consumer(router) -{ - m_router = router; - m_num_vcs = m_router->get_num_vcs(); - m_crossbar_activity = 0; -} - -Switch_d::~Switch_d() -{ - deletePointers(m_switch_buffer); -} - -void -Switch_d::init() -{ - m_output_unit = m_router->get_outputUnit_ref(); - - m_num_inports = m_router->get_num_inports(); - m_switch_buffer.resize(m_num_inports); - for (int i = 0; i < m_num_inports; i++) { - m_switch_buffer[i] = new flitBuffer_d(); - } -} - -void -Switch_d::wakeup() -{ - DPRINTF(RubyNetwork, "Switch woke up at time: %lld\n", - m_router->curCycle()); - - for (int inport = 0; inport < m_num_inports; inport++) { - if (!m_switch_buffer[inport]->isReady(m_router->curCycle())) - continue; - flit_d *t_flit = m_switch_buffer[inport]->peekTopFlit(); - if (t_flit->is_stage(ST_, m_router->curCycle())) { - int outport = t_flit->get_outport(); - t_flit->advance_stage(LT_, m_router->curCycle()); - t_flit->set_time(m_router->curCycle()); - - // This will take care of waking up the Network Link - m_output_unit[outport]->insert_flit(t_flit); - m_switch_buffer[inport]->getTopFlit(); - m_crossbar_activity++; - } - } - check_for_wakeup(); -} - -void -Switch_d::check_for_wakeup() -{ - Cycles nextCycle = m_router->curCycle() + Cycles(1); - - for (int inport = 0; inport < m_num_inports; inport++) { - if (m_switch_buffer[inport]->isReady(nextCycle)) { - m_router->vcarb_req(); - break; - } - } -} - -uint32_t -Switch_d::functionalWrite(Packet *pkt) -{ - uint32_t num_functional_writes = 0; - - for (uint32_t i = 0; i < m_switch_buffer.size(); ++i) { - num_functional_writes += m_switch_buffer[i]->functionalWrite(pkt); - } - - return num_functional_writes; -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/Switch_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/Switch_d.hh deleted file mode 100644 index 24fe6083d..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/Switch_d.hh +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_SWITCH_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_SWITCH_D_HH__ - -#include <iostream> -#include <vector> - -#include "mem/ruby/common/Consumer.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class Router_d; -class OutputUnit_d; - -class Switch_d : public Consumer -{ - public: - Switch_d(Router_d *router); - ~Switch_d(); - void wakeup(); - void init(); - void check_for_wakeup(); - void print(std::ostream& out) const {}; - - inline void update_sw_winner(int inport, flit_d *t_flit) - { m_switch_buffer[inport]->insert(t_flit); } - - inline double get_crossbar_count() { return m_crossbar_activity; } - - uint32_t functionalWrite(Packet *pkt); - - private: - int m_num_vcs; - int m_num_inports; - double m_crossbar_activity; - Router_d *m_router; - std::vector<flitBuffer_d *> m_switch_buffer; - std::vector<OutputUnit_d *> m_output_unit; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_SWITCH_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc deleted file mode 100644 index d389f07ba..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/Router_d.hh" -#include "mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.hh" - -VCallocator_d::VCallocator_d(Router_d *router) - : Consumer(router) -{ - m_router = router; - m_num_vcs = m_router->get_num_vcs(); - m_vc_per_vnet = m_router->get_vc_per_vnet(); - - m_local_arbiter_activity.resize(m_num_vcs/m_vc_per_vnet); - m_global_arbiter_activity.resize(m_num_vcs/m_vc_per_vnet); - for (int i = 0; i < m_local_arbiter_activity.size(); i++) { - m_local_arbiter_activity[i] = 0; - m_global_arbiter_activity[i] = 0; - } -} - -void -VCallocator_d::init() -{ - m_input_unit = m_router->get_inputUnit_ref(); - m_output_unit = m_router->get_outputUnit_ref(); - - m_num_inports = m_router->get_num_inports(); - m_num_outports = m_router->get_num_outports(); - m_round_robin_invc.resize(m_num_inports); - m_round_robin_outvc.resize(m_num_outports); - m_outvc_req.resize(m_num_outports); - m_outvc_is_req.resize(m_num_outports); - - for (int i = 0; i < m_num_inports; i++) { - m_round_robin_invc[i].resize(m_num_vcs); - - for (int j = 0; j < m_num_vcs; j++) { - m_round_robin_invc[i][j] = 0; - } - } - - for (int i = 0; i < m_num_outports; i++) { - m_round_robin_outvc[i].resize(m_num_vcs); - m_outvc_req[i].resize(m_num_vcs); - m_outvc_is_req[i].resize(m_num_vcs); - - for (int j = 0; j < m_num_vcs; j++) { - m_round_robin_outvc[i][j].first = 0; - m_round_robin_outvc[i][j].second = 0; - m_outvc_is_req[i][j] = false; - - m_outvc_req[i][j].resize(m_num_inports); - - for (int k = 0; k < m_num_inports; k++) { - m_outvc_req[i][j][k].resize(m_num_vcs); - for (int l = 0; l < m_num_vcs; l++) { - m_outvc_req[i][j][k][l] = false; - } - } - } - } -} - -void -VCallocator_d::clear_request_vector() -{ - for (int i = 0; i < m_num_outports; i++) { - for (int j = 0; j < m_num_vcs; j++) { - if (!m_outvc_is_req[i][j]) - continue; - m_outvc_is_req[i][j] = false; - for (int k = 0; k < m_num_inports; k++) { - for (int l = 0; l < m_num_vcs; l++) { - m_outvc_req[i][j][k][l] = false; - } - } - } - } -} - -void -VCallocator_d::wakeup() -{ - arbitrate_invcs(); // First stage of allocation - arbitrate_outvcs(); // Second stage of allocation - - clear_request_vector(); - check_for_wakeup(); - m_router->call_sw_alloc(); -} - -bool -VCallocator_d::is_invc_candidate(int inport_iter, int invc_iter) -{ - int outport = m_input_unit[inport_iter]->get_route(invc_iter); - int vnet = get_vnet(invc_iter); - Cycles t_enqueue_time = - m_input_unit[inport_iter]->get_enqueue_time(invc_iter); - - int invc_base = vnet*m_vc_per_vnet; - - if ((m_router->get_net_ptr())->isVNetOrdered(vnet)) { - for (int vc_offset = 0; vc_offset < m_vc_per_vnet; vc_offset++) { - int temp_vc = invc_base + vc_offset; - if (m_input_unit[inport_iter]->need_stage(temp_vc, VC_AB_, VA_, - m_router->curCycle()) && - (m_input_unit[inport_iter]->get_route(temp_vc) == outport) && - (m_input_unit[inport_iter]->get_enqueue_time(temp_vc) < - t_enqueue_time)) { - return false; - } - } - } - return true; -} - -void -VCallocator_d::select_outvc(int inport_iter, int invc_iter) -{ - int outport = m_input_unit[inport_iter]->get_route(invc_iter); - int vnet = get_vnet(invc_iter); - int outvc_base = vnet*m_vc_per_vnet; - int num_vcs_per_vnet = m_vc_per_vnet; - - int outvc_offset = m_round_robin_invc[inport_iter][invc_iter]; - m_round_robin_invc[inport_iter][invc_iter]++; - - if (m_round_robin_invc[inport_iter][invc_iter] >= num_vcs_per_vnet) - m_round_robin_invc[inport_iter][invc_iter] = 0; - - for (int outvc_offset_iter = 0; outvc_offset_iter < num_vcs_per_vnet; - outvc_offset_iter++) { - outvc_offset++; - if (outvc_offset >= num_vcs_per_vnet) - outvc_offset = 0; - int outvc = outvc_base + outvc_offset; - if (m_output_unit[outport]->is_vc_idle(outvc, m_router->curCycle())) { - m_local_arbiter_activity[vnet]++; - m_outvc_req[outport][outvc][inport_iter][invc_iter] = true; - if (!m_outvc_is_req[outport][outvc]) - m_outvc_is_req[outport][outvc] = true; - return; // out vc acquired - } - } -} - -void -VCallocator_d::arbitrate_invcs() -{ - for (int inport_iter = 0; inport_iter < m_num_inports; inport_iter++) { - for (int invc_iter = 0; invc_iter < m_num_vcs; invc_iter++) { - if (m_input_unit[inport_iter]->need_stage(invc_iter, VC_AB_, - VA_, m_router->curCycle())) { - if (!is_invc_candidate(inport_iter, invc_iter)) - continue; - - select_outvc(inport_iter, invc_iter); - } - } - } -} - -void -VCallocator_d::arbitrate_outvcs() -{ - for (int outport_iter = 0; outport_iter < m_num_outports; outport_iter++) { - for (int outvc_iter = 0; outvc_iter < m_num_vcs; outvc_iter++) { - if (!m_outvc_is_req[outport_iter][outvc_iter]) { - // No requests for this outvc in this cycle - continue; - } - - int inport = m_round_robin_outvc[outport_iter][outvc_iter].first; - int invc_offset = - m_round_robin_outvc[outport_iter][outvc_iter].second; - int vnet = get_vnet(outvc_iter); - int invc_base = vnet*m_vc_per_vnet; - int num_vcs_per_vnet = m_vc_per_vnet; - - m_round_robin_outvc[outport_iter][outvc_iter].second++; - if (m_round_robin_outvc[outport_iter][outvc_iter].second >= - num_vcs_per_vnet) { - m_round_robin_outvc[outport_iter][outvc_iter].second = 0; - m_round_robin_outvc[outport_iter][outvc_iter].first++; - if (m_round_robin_outvc[outport_iter][outvc_iter].first >= - m_num_inports) - m_round_robin_outvc[outport_iter][outvc_iter].first = 0; - } - for (int in_iter = 0; in_iter < m_num_inports*num_vcs_per_vnet; - in_iter++) { - invc_offset++; - if (invc_offset >= num_vcs_per_vnet) { - invc_offset = 0; - inport++; - if (inport >= m_num_inports) - inport = 0; - } - int invc = invc_base + invc_offset; - if (m_outvc_req[outport_iter][outvc_iter][inport][invc]) { - m_global_arbiter_activity[vnet]++; - m_input_unit[inport]->grant_vc(invc, outvc_iter, - m_router->curCycle()); - m_output_unit[outport_iter]->update_vc( - outvc_iter, inport, invc); - break; - } - } - } - } -} - -int -VCallocator_d::get_vnet(int invc) -{ - int vnet = invc/m_vc_per_vnet; - assert(vnet < m_router->get_num_vnets()); - - return vnet; -} - -void -VCallocator_d::check_for_wakeup() -{ - Cycles nextCycle = m_router->curCycle() + Cycles(1); - - for (int i = 0; i < m_num_inports; i++) { - for (int j = 0; j < m_num_vcs; j++) { - if (m_input_unit[i]->need_stage(j, VC_AB_, VA_, nextCycle)) { - m_router->vcarb_req(); - return; - } - } - } -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.hh deleted file mode 100644 index 246b7ad2f..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.hh +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_VC_ALLOCATOR_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_VC_ALLOCATOR_D_HH__ - -#include <iostream> -#include <utility> -#include <vector> - -#include "mem/ruby/common/Consumer.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class Router_d; -class InputUnit_d; -class OutputUnit_d; - -class VCallocator_d : public Consumer -{ - public: - VCallocator_d(Router_d *router); - void init(); - void wakeup(); - void check_for_wakeup(); - void clear_request_vector(); - int get_vnet(int invc); - void print(std::ostream& out) const {} - void arbitrate_invcs(); - void arbitrate_outvcs(); - bool is_invc_candidate(int inport_iter, int invc_iter); - void select_outvc(int inport_iter, int invc_iter); - - double get_local_arbit_count(unsigned int vnet) const - { return m_local_arbiter_activity[vnet]; } - - double get_global_arbit_count(unsigned int vnet) const - { return m_global_arbiter_activity[vnet]; } - - private: - int m_num_vcs, m_vc_per_vnet; - int m_num_inports; - int m_num_outports; - - Router_d *m_router; - - // First stage of arbitration - // where all vcs select an output vc to contend for - std::vector<std::vector<int> > m_round_robin_invc; - - // Arbiter for every output vc - std::vector<std::vector<std::pair<int, int> > > m_round_robin_outvc; - - // [outport][outvc][inport][invc] - // set true in the first phase of allocation - std::vector<std::vector<std::vector<std::vector<bool> > > > m_outvc_req; - - std::vector<std::vector<bool> > m_outvc_is_req; - - std::vector<InputUnit_d *> m_input_unit; - std::vector<OutputUnit_d *> m_output_unit; - - // Statistical variables - std::vector<double> m_local_arbiter_activity; - std::vector<double> m_global_arbiter_activity; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_VC_ALLOCATOR_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.cc deleted file mode 100644 index 996837b1b..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.cc +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.hh" - -VirtualChannel_d::VirtualChannel_d(int id) - : m_enqueue_time(INFINITE_) -{ - m_id = id; - m_input_buffer = new flitBuffer_d(); - m_vc_state.first = IDLE_; - m_vc_state.second = Cycles(0); -} - -VirtualChannel_d::~VirtualChannel_d() -{ - delete m_input_buffer; -} - -void -VirtualChannel_d::set_outport(int outport) -{ - route = outport; -} - -void -VirtualChannel_d::grant_vc(int out_vc, Cycles curTime) -{ - m_output_vc = out_vc; - m_vc_state.first = ACTIVE_; - m_vc_state.second = curTime; - flit_d *t_flit = m_input_buffer->peekTopFlit(); - t_flit->advance_stage(SA_, curTime); -} - -bool -VirtualChannel_d::need_stage(VC_state_type state, flit_stage stage, - Cycles ct) -{ - if ((m_vc_state.first == state) && (ct >= m_vc_state.second)) { - if (m_input_buffer->isReady(ct)) { - flit_d *t_flit = m_input_buffer->peekTopFlit(); - return(t_flit->is_stage(stage, ct)) ; - } - } - return false; -} - -uint32_t -VirtualChannel_d::functionalWrite(Packet *pkt) -{ - return m_input_buffer->functionalWrite(pkt); -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.hh deleted file mode 100644 index b55b87feb..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.hh +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_VIRTUAL_CHANNEL_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_VIRTUAL_CHANNEL_D_HH__ - -#include <utility> - -#include "mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class VirtualChannel_d -{ - public: - VirtualChannel_d(int id); - ~VirtualChannel_d(); - - bool need_stage(VC_state_type state, flit_stage stage, Cycles curTime); - void set_outport(int outport); - void grant_vc(int out_vc, Cycles curTime); - - inline Cycles get_enqueue_time() { return m_enqueue_time; } - inline void set_enqueue_time(Cycles time) { m_enqueue_time = time; } - inline VC_state_type get_state() { return m_vc_state.first; } - inline int get_outvc() { return m_output_vc; } - inline bool has_credits() { return (m_credit_count > 0); } - inline int get_route() { return route; } - inline void update_credit(int credit) { m_credit_count = credit; } - inline void increment_credit() { m_credit_count++; } - - inline bool isReady(Cycles curTime) - { - return m_input_buffer->isReady(curTime); - } - - inline void - insertFlit(flit_d *t_flit) - { - m_input_buffer->insert(t_flit); - } - - inline void - set_state(VC_state_type m_state, Cycles curTime) - { - m_vc_state.first = m_state; - m_vc_state.second = curTime; - } - - inline flit_d* - peekTopFlit() - { - return m_input_buffer->peekTopFlit(); - } - - inline flit_d* - getTopFlit() - { - return m_input_buffer->getTopFlit(); - } - - uint32_t functionalWrite(Packet *pkt); - - private: - int m_id; - flitBuffer_d *m_input_buffer; - std::pair<VC_state_type, Cycles> m_vc_state; // I/R/V/A/C - int route; - Cycles m_enqueue_time; - int m_output_vc; - int m_credit_count; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_VIRTUAL_CHANNEL_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.cc deleted file mode 100644 index 1305b1547..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.cc +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh" - -flitBuffer_d::flitBuffer_d() -{ - max_size = INFINITE_; -} - -flitBuffer_d::flitBuffer_d(int maximum_size) -{ - max_size = maximum_size; -} - -bool -flitBuffer_d::isEmpty() -{ - return (m_buffer.size() == 0); -} - -bool -flitBuffer_d::isReady(Cycles curTime) -{ - if (m_buffer.size() != 0 ) { - flit_d *t_flit = peekTopFlit(); - if (t_flit->get_time() <= curTime) - return true; - } - return false; -} - -void -flitBuffer_d::print(std::ostream& out) const -{ - out << "[flitBuffer: " << m_buffer.size() << "] " << std::endl; -} - -bool -flitBuffer_d::isFull() -{ - return (m_buffer.size() >= max_size); -} - -void -flitBuffer_d::setMaxSize(int maximum) -{ - max_size = maximum; -} - -uint32_t -flitBuffer_d::functionalWrite(Packet *pkt) -{ - uint32_t num_functional_writes = 0; - - for (unsigned int i = 0; i < m_buffer.size(); ++i) { - if (m_buffer[i]->functionalWrite(pkt)) { - num_functional_writes++; - } - } - - return num_functional_writes; -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh deleted file mode 100644 index bfa6cc9a9..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_FLIT_BUFFER_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_FLIT_BUFFER_D_HH__ - -#include <algorithm> -#include <iostream> -#include <vector> - -#include "mem/ruby/network/garnet/fixed-pipeline/flit_d.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class flitBuffer_d -{ - public: - flitBuffer_d(); - flitBuffer_d(int maximum_size); - - bool isReady(Cycles curTime); - bool isEmpty(); - void print(std::ostream& out) const; - bool isFull(); - void setMaxSize(int maximum); - - flit_d * - getTopFlit() - { - flit_d *f = m_buffer.front(); - std::pop_heap(m_buffer.begin(), m_buffer.end(), flit_d::greater); - m_buffer.pop_back(); - return f; - } - - flit_d * - peekTopFlit() - { - return m_buffer.front(); - } - - void - insert(flit_d *flt) - { - m_buffer.push_back(flt); - std::push_heap(m_buffer.begin(), m_buffer.end(), flit_d::greater); - } - - uint32_t functionalWrite(Packet *pkt); - - private: - std::vector<flit_d *> m_buffer; - int max_size; -}; - -inline std::ostream& -operator<<(std::ostream& out, const flitBuffer_d& obj) -{ - obj.print(out); - out << std::flush; - return out; -} - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_FLIT_BUFFER_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.cc deleted file mode 100644 index bb0d3eda5..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.cc +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "mem/ruby/network/garnet/fixed-pipeline/flit_d.hh" - -flit_d::flit_d(int id, int vc, int vnet, int size, MsgPtr msg_ptr, - Cycles curTime) -{ - m_size = size; - m_msg_ptr = msg_ptr; - m_enqueue_time = curTime; - m_time = curTime; - m_id = id; - m_vnet = vnet; - m_vc = vc; - m_stage.first = I_; - m_stage.second = m_time; - - if (size == 1) { - m_type = HEAD_TAIL_; - return; - } - if (id == 0) - m_type = HEAD_; - else if (id == (size - 1)) - m_type = TAIL_; - else - m_type = BODY_; -} - -flit_d::flit_d(int vc, bool is_free_signal, Cycles curTime) -{ - m_id = 0; - m_vc = vc; - m_is_free_signal = is_free_signal; - m_time = curTime; -} - -void -flit_d::print(std::ostream& out) const -{ - out << "[flit:: "; - out << "Id=" << m_id << " "; - out << "Type=" << m_type << " "; - out << "Vnet=" << m_vnet << " "; - out << "VC=" << m_vc << " "; - out << "Enqueue Time=" << m_enqueue_time << " "; - out << "]"; -} - -bool -flit_d::functionalWrite(Packet *pkt) -{ - Message *msg = m_msg_ptr.get(); - return msg->functionalWrite(pkt); -} diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.hh deleted file mode 100644 index eb076d613..000000000 --- a/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.hh +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_FLIT_D_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_FLIT_D_HH__ - -#include <cassert> -#include <iostream> - -#include "base/types.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" -#include "mem/ruby/slicc_interface/Message.hh" - -class flit_d -{ - public: - flit_d(int id, int vc, int vnet, int size, MsgPtr msg_ptr, Cycles curTime); - flit_d(int vc, bool is_free_signal, Cycles curTime); - void set_outport(int port) { m_outport = port; } - int get_outport() {return m_outport; } - void print(std::ostream& out) const; - bool is_free_signal() { return m_is_free_signal; } - int get_size() { return m_size; } - Cycles get_enqueue_time() { return m_enqueue_time; } - int get_id() { return m_id; } - Cycles get_time() { return m_time; } - void set_time(Cycles time) { m_time = time; } - int get_vnet() { return m_vnet; } - int get_vc() { return m_vc; } - void set_vc(int vc) { m_vc = vc; } - MsgPtr& get_msg_ptr() { return m_msg_ptr; } - flit_type get_type() { return m_type; } - - bool - is_stage(flit_stage t_stage, Cycles curTime) - { - return (m_stage.first == t_stage && - curTime >= m_stage.second); - } - - void - advance_stage(flit_stage t_stage, Cycles newTime) - { - m_stage.first = t_stage; - m_stage.second = newTime; - } - - std::pair<flit_stage, Cycles> get_stage() { return m_stage; } - - void set_delay(Cycles delay) { src_delay = delay; } - Cycles get_delay() { return src_delay; } - - static bool - greater(flit_d* n1, flit_d* n2) - { - if (n1->get_time() == n2->get_time()) { - //assert(n1->flit_id != n2->flit_id); - return (n1->get_id() > n2->get_id()); - } else { - return (n1->get_time() > n2->get_time()); - } - } - - bool functionalWrite(Packet *pkt); - - private: - int m_id; - int m_vnet; - int m_vc; - int m_size; - bool m_is_free_signal; - Cycles m_enqueue_time, m_time; - flit_type m_type; - MsgPtr m_msg_ptr; - int m_outport; - Cycles src_delay; - std::pair<flit_stage, Cycles> m_stage; -}; - -inline std::ostream& -operator<<(std::ostream& out, const flit_d& obj) -{ - obj.print(out); - out << std::flush; - return out; -} - -#endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_FLIT_D_HH__ diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/FlexibleConsumer.hh b/src/mem/ruby/network/garnet/flexible-pipeline/FlexibleConsumer.hh deleted file mode 100644 index f0fe26314..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/FlexibleConsumer.hh +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_FLEXIBLE_CONSUMER_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_FLEXIBLE_CONSUMER_HH__ - -#include "mem/ruby/common/Consumer.hh" -#include "mem/ruby/common/NetDest.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class FlexibleConsumer : public Consumer -{ - public: - FlexibleConsumer(ClockedObject *em) : Consumer(em) {} - virtual bool isBufferNotFull(int vc, int inport) { return true; } - virtual void grant_vc(int out_port, int vc, Cycles grant_time) {} - virtual void release_vc(int out_port, int vc, Cycles release_time) {} - virtual void request_vc(int vc, int in_port, NetDest destination, - Cycles request_time) {} -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_FLEXIBLE_CONSUMER_HH__ diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetLink.cc b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetLink.cc deleted file mode 100644 index 270b1327e..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetLink.cc +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2011 Advanced Micro Devices, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "mem/ruby/network/garnet/flexible-pipeline/GarnetLink.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh" - -GarnetIntLink::GarnetIntLink(const Params *p) - : BasicLink(p) -{ - m_network_links[0] = p->network_links[0]; - m_network_links[1] = p->network_links[1]; -} - -void -GarnetIntLink::init() -{ -} - -void -GarnetIntLink::print(std::ostream& out) const -{ - out << name(); -} - -GarnetIntLink * -GarnetIntLinkParams::create() -{ - return new GarnetIntLink(this); -} - -GarnetExtLink::GarnetExtLink(const Params *p) - : BasicLink(p) -{ - m_network_links[0] = p->network_links[0]; - m_network_links[1] = p->network_links[1]; -} - -void -GarnetExtLink::init() -{ -} - -void -GarnetExtLink::print(std::ostream& out) const -{ - out << name(); -} - -GarnetExtLink * -GarnetExtLinkParams::create() -{ - return new GarnetExtLink(this); -} diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetLink.hh b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetLink.hh deleted file mode 100644 index cd42378bf..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetLink.hh +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2011 Advanced Micro Devices, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_LINK_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_LINK_HH__ - -#include <iostream> -#include <string> -#include <vector> - -#include "mem/ruby/network/BasicLink.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh" -#include "params/GarnetIntLink.hh" -#include "params/GarnetExtLink.hh" - -class GarnetIntLink : public BasicLink -{ - public: - typedef GarnetIntLinkParams Params; - GarnetIntLink(const Params *p); - - void init(); - - void print(std::ostream& out) const; - - friend class GarnetNetwork; - - protected: - NetworkLink* m_network_links[2]; -}; - -inline std::ostream& -operator<<(std::ostream& out, const GarnetIntLink& obj) -{ - obj.print(out); - out << std::flush; - return out; -} - -class GarnetExtLink : public BasicLink -{ - public: - typedef GarnetExtLinkParams Params; - GarnetExtLink(const Params *p); - - void init(); - - void print(std::ostream& out) const; - - friend class GarnetNetwork; - - protected: - NetworkLink* m_network_links[2]; -}; - -inline std::ostream& -operator<<(std::ostream& out, const GarnetExtLink& obj) -{ - obj.print(out); - out << std::flush; - return out; -} - -#endif // __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_LINK_HH__ diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetLink.py b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetLink.py deleted file mode 100644 index 1fefca2c5..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetLink.py +++ /dev/null @@ -1,72 +0,0 @@ -# Copyright (c) 2008 Princeton University -# Copyright (c) 2009 Advanced Micro Devices, Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer; -# redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution; -# neither the name of the copyright holders nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Authors: Steve Reinhardt -# Brad Beckmann - -from m5.params import * -from m5.proxy import * -from ClockedObject import ClockedObject -from BasicLink import BasicIntLink, BasicExtLink - -class NetworkLink(ClockedObject): - type = 'NetworkLink' - cxx_header = "mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh" - link_id = Param.Int(Parent.link_id, "link id") - link_latency = Param.Cycles(Parent.latency, "link latency") - vcs_per_vnet = Param.Int(Parent.vcs_per_vnet, - "virtual channels per virtual network") - virt_nets = Param.Int(Parent.number_of_virtual_networks, - "number of virtual networks") - channel_width = Param.Int(Parent.bandwidth_factor, - "channel width == bw factor") - -# Interior fixed pipeline links between routers -class GarnetIntLink(BasicIntLink): - type = 'GarnetIntLink' - cxx_header = "mem/ruby/network/garnet/flexible-pipeline/GarnetLink.hh" - # The flexible pipeline bi-directional link only include two main - # forward links and no backward flow-control links - nls = [] - # In uni-directional link - nls.append(NetworkLink()); - # Out uni-directional link - nls.append(NetworkLink()); - network_links = VectorParam.NetworkLink(nls, "forward links") - -# Exterior fixed pipeline links between a router and a controller -class GarnetExtLink(BasicExtLink): - type = 'GarnetExtLink' - cxx_header = "mem/ruby/network/garnet/flexible-pipeline/GarnetLink.hh" - # The flexible pipeline bi-directional link only include two main - # forward links and no backward flow-control links - nls = [] - # In uni-directional link - nls.append(NetworkLink()); - # Out uni-directional link - nls.append(NetworkLink()); - network_links = VectorParam.NetworkLink(nls, "forward links") diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc deleted file mode 100644 index bc37c62c5..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include <cassert> - -#include "base/cast.hh" -#include "base/stl_helpers.hh" -#include "mem/ruby/common/NetDest.hh" -#include "mem/ruby/network/BasicLink.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/GarnetLink.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/Router.hh" -#include "mem/ruby/system/RubySystem.hh" - -using namespace std; -using m5::stl_helpers::deletePointers; - -GarnetNetwork::GarnetNetwork(const Params *p) - : BaseGarnetNetwork(p) -{ - m_buffer_size = p->buffer_size; - m_number_of_pipe_stages = p->number_of_pipe_stages; - - // record the routers - for (vector<BasicRouter*>::const_iterator i = p->routers.begin(); - i != p->routers.end(); ++i) { - Router* router = safe_cast<Router*>(*i); - m_routers.push_back(router); - } - - for (int i=0; i < m_nodes; i++) { - NetworkInterface *ni = safe_cast<NetworkInterface *>(p->netifs[i]); - m_nis.push_back(ni); - } -} - -void -GarnetNetwork::init() -{ - BaseGarnetNetwork::init(); - - // Setup the network switches - assert (m_topology_ptr!=NULL); - - // initialize the router's network pointers - for (vector<Router*>::const_iterator i = m_routers.begin(); - i != m_routers.end(); ++i) { - Router* router = safe_cast<Router*>(*i); - router->init_net_ptr(this); - } - - for (int i=0; i < m_nodes; i++) { - m_nis[i]->init_net_ptr(this); - m_nis[i]->addNode(m_toNetQueues[i], m_fromNetQueues[i]); - } - - m_topology_ptr->createLinks(this); -} - -GarnetNetwork::~GarnetNetwork() -{ - deletePointers(m_routers); - deletePointers(m_nis); - deletePointers(m_links); -} - -void -GarnetNetwork::makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry) -{ - assert(src < m_nodes); - - GarnetExtLink* garnet_link = safe_cast<GarnetExtLink*>(link); - NetworkLink *net_link = garnet_link->m_network_links[0]; - - net_link->init_net_ptr(this); - m_links.push_back(net_link); - m_routers[dest]->addInPort(net_link); - m_nis[src]->addOutPort(net_link); -} - -void -GarnetNetwork::makeExtOutLink(SwitchID src, NodeID dest, BasicLink* link, - const NetDest& routing_table_entry) -{ - assert(dest < m_nodes); - assert(src < m_routers.size()); - assert(m_routers[src] != NULL); - - GarnetExtLink* garnet_link = safe_cast<GarnetExtLink*>(link); - NetworkLink *net_link = garnet_link->m_network_links[1]; - - net_link->init_net_ptr(this); - m_links.push_back(net_link); - m_routers[src]->addOutPort(net_link, routing_table_entry, - link->m_weight); - m_nis[dest]->addInPort(net_link); -} - -void -GarnetNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry, - PortDirection src_outport, - PortDirection dst_inport) -{ - GarnetIntLink* garnet_link = safe_cast<GarnetIntLink*>(link); - NetworkLink *net_link = garnet_link->m_network_links[0]; - - net_link->init_net_ptr(this); - m_links.push_back(net_link); - m_routers[dest]->addInPort(net_link); - m_routers[src]->addOutPort(net_link, routing_table_entry, - link->m_weight); -} - -/* - * Go through all the routers, network interfaces and the interconnecting - * links for reading/writing all the messages. - */ -bool -GarnetNetwork::functionalRead(Packet *pkt) -{ - for (unsigned int i = 0; i < m_routers.size(); i++) { - if (m_routers[i]->functionalRead(pkt)) { - return true; - } - } - - for (unsigned int i = 0; i < m_nis.size(); ++i) { - if (m_nis[i]->functionalRead(pkt)) { - return true; - } - } - - for (unsigned int i = 0; i < m_links.size(); ++i) { - if (m_links[i]->functionalRead(pkt)) { - return true; - } - } - - return false; -} - -uint32_t -GarnetNetwork::functionalWrite(Packet *pkt) -{ - uint32_t num_functional_writes = 0; - - for (unsigned int i = 0; i < m_routers.size(); i++) { - num_functional_writes += m_routers[i]->functionalWrite(pkt); - } - - for (unsigned int i = 0; i < m_nis.size(); ++i) { - num_functional_writes += m_nis[i]->functionalWrite(pkt); - } - - for (unsigned int i = 0; i < m_links.size(); ++i) { - num_functional_writes += m_links[i]->functionalWrite(pkt); - } - - return num_functional_writes; -} - -void -GarnetNetwork::regStats() -{ - BaseGarnetNetwork::regStats(); - - m_average_link_utilization.name(name() + ".avg_link_utilization"); - - m_average_vc_load - .init(m_virtual_networks * m_vcs_per_vnet) - .name(name() + ".avg_vc_load") - .flags(Stats::pdf | Stats::total | Stats::nozero) - ; - for (int i = 0; i < m_virtual_networks * m_vcs_per_vnet; i++) { - m_average_vc_load - .subname(i, csprintf(".%i", i)) - .flags(Stats::nozero) - ; - } -} - -void -GarnetNetwork::collateStats() -{ - RubySystem *rs = params()->ruby_system; - double time_delta = double(curCycle() - rs->getStartCycle()); - - for (int i = 0; i < m_links.size(); i++) { - m_average_link_utilization += - (double(m_links[i]->getLinkUtilization())) / time_delta; - - vector<unsigned int> vc_load = m_links[i]->getVcLoad(); - for (int j = 0; j < vc_load.size(); j++) { - m_average_vc_load[j] += vc_load[j]; - } - } -} - -void -GarnetNetwork::print(ostream& out) const -{ - out << "[GarnetNetwork]"; -} - -GarnetNetwork * -GarnetNetworkParams::create() -{ - return new GarnetNetwork(this); -} diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh deleted file mode 100644 index 6ffa06329..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_GARNET_NETWORK_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_GARNET_NETWORK_HH__ - -#include <iostream> -#include <vector> - -#include "mem/ruby/network/garnet/BaseGarnetNetwork.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" -#include "params/GarnetNetwork.hh" - -class NetworkInterface; -class Router; -class NetDest; -class NetworkLink; - -class GarnetNetwork : public BaseGarnetNetwork -{ - public: - typedef GarnetNetworkParams Params; - GarnetNetwork(const Params *p); - - ~GarnetNetwork(); - void init(); - - int getBufferSize() { return m_buffer_size; } - int getNumPipeStages() {return m_number_of_pipe_stages; } - - void collateStats(); - void regStats(); - void print(std::ostream& out) const; - - // Methods used by Topology to setup the network - void makeExtOutLink(SwitchID src, NodeID dest, BasicLink* link, - const NetDest& routing_table_entry); - void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry); - void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry, - PortDirection src_outport, - PortDirection dst_inport); - - //! Function for performing a functional read. The return value - //! indicates if a message was found that had the required address. - bool functionalRead(Packet *pkt); - - //! Function for performing a functional write. The return value - //! indicates the number of messages that were written. - uint32_t functionalWrite(Packet *pkt); - - private: - GarnetNetwork(const GarnetNetwork& obj); - GarnetNetwork& operator=(const GarnetNetwork& obj); - - std::vector<Router *> m_routers; // All Routers in Network - std::vector<NetworkLink *> m_links; // All links in network - std::vector<NetworkInterface *> m_nis; // All NI's in Network - - int m_buffer_size; - int m_number_of_pipe_stages; - - // Statistical variables - Stats::Scalar m_average_link_utilization; - Stats::Vector m_average_vc_load; -}; - -inline std::ostream& -operator<<(std::ostream& out, const GarnetNetwork& obj) -{ - obj.print(out); - out << std::flush; - return out; -} - -#endif // __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_GARNET_NETWORK_HH__ diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.py b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.py deleted file mode 100644 index 0c9b143a3..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (c) 2008 Princeton University -# Copyright (c) 2009 Advanced Micro Devices, Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer; -# redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution; -# neither the name of the copyright holders nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Authors: Steve Reinhardt -# Brad Beckmann - -from m5.params import * -from m5.proxy import * -from BaseGarnetNetwork import BaseGarnetNetwork -from BasicRouter import BasicRouter -from ClockedObject import ClockedObject - -class GarnetRouter(BasicRouter): - type = 'GarnetRouter' - cxx_class = 'Router' - cxx_header = "mem/ruby/network/garnet/flexible-pipeline/Router.hh" - vcs_per_vnet = Param.Int(Parent.vcs_per_vnet, - "virtual channels per virtual network") - virt_nets = Param.Int(Parent.number_of_virtual_networks, - "number of virtual networks") - -class GarnetNetworkInterface(ClockedObject): - type = 'GarnetNetworkInterface' - cxx_class = 'NetworkInterface' - cxx_header = "mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh" - - id = Param.UInt32("ID in relation to other network interfaces") - vcs_per_vnet = Param.UInt32(Parent.vcs_per_vnet, - "virtual channels per virtual network") - virt_nets = Param.UInt32(Parent.number_of_virtual_networks, - "number of virtual networks") - -class GarnetNetwork(BaseGarnetNetwork): - type = 'GarnetNetwork' - cxx_header = "mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh" - buffer_size = Param.UInt32(0, - "default buffer size; 0 indicates infinite buffering"); - number_of_pipe_stages = Param.UInt32(4, "router pipeline stages"); diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/InVcState.cc b/src/mem/ruby/network/garnet/flexible-pipeline/InVcState.cc deleted file mode 100644 index dc2d3f24a..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/InVcState.cc +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "mem/ruby/network/garnet/flexible-pipeline/InVcState.hh" - -InVcState::InVcState(int id) -{ - m_id = id; - m_vc_state = IDLE_; -} - -bool -InVcState::isInState(VC_state_type state, Cycles request_time) -{ - return ((m_vc_state == state) && (request_time >= m_time) ); -} - -void -InVcState::setRoute(int route) -{ - m_route = route; -} - -void -InVcState::setState(VC_state_type state, Cycles time) -{ - m_vc_state = state; - m_time = time; -} - -void -InVcState::grant_vc(int out_vc, Cycles grant_time) -{ - m_vc_state = ACTIVE_; - m_time = grant_time; - m_output_vc = out_vc; -} - -int -InVcState::get_outport() -{ - return m_route; -} - -int -InVcState::get_outvc() -{ - return m_output_vc; -} diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/InVcState.hh b/src/mem/ruby/network/garnet/flexible-pipeline/InVcState.hh deleted file mode 100644 index 4f4f95f5c..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/InVcState.hh +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_IN_VC_STATE_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_IN_VC_STATE_HH__ - -#include "base/types.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class InVcState -{ - public: - InVcState(int id); - - void setRoute(int route); - void setState(VC_state_type state, Cycles time); - int get_outport(); - int get_outvc(); - void grant_vc(int out_vc, Cycles grant_time); - bool isInState(VC_state_type state, Cycles time); - - private: - int m_id; - int m_route; - int m_output_vc; - VC_state_type m_vc_state; - Cycles m_time; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_IN_VC_STATE_HH__ diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc deleted file mode 100644 index d2a6ed4b1..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc +++ /dev/null @@ -1,384 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include <cassert> -#include <cmath> - -#include "base/cast.hh" -#include "base/stl_helpers.hh" -#include "debug/RubyNetwork.hh" -#include "mem/ruby/network/MessageBuffer.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh" -#include "mem/ruby/slicc_interface/Message.hh" - -using namespace std; -using m5::stl_helpers::deletePointers; - -NetworkInterface::NetworkInterface(const Params *p) - : ClockedObject(p), FlexibleConsumer(this) -{ - m_id = p->id; - m_virtual_networks = p->virt_nets; - m_vc_per_vnet = p->vcs_per_vnet; - m_num_vcs = m_vc_per_vnet*m_virtual_networks; - m_vc_round_robin = 0; - - // instantiating the NI flit buffers - m_ni_buffers.resize(m_num_vcs); - for (int i =0; i < m_num_vcs; i++) - m_ni_buffers[i] = new flitBuffer(); - - m_vc_allocator.resize(m_virtual_networks); - for (int i = 0; i < m_virtual_networks; i++) { - m_vc_allocator[i] = 0; - } - - for (int i = 0; i < m_num_vcs; i++) { - m_out_vc_state.push_back(new OutVcState(i)); - } -} - -NetworkInterface::~NetworkInterface() -{ - deletePointers(m_out_vc_state); - deletePointers(m_ni_buffers); - delete outSrcQueue; -} - -void -NetworkInterface::addInPort(NetworkLink *in_link) -{ - inNetLink = in_link; - in_link->setLinkConsumer(this); -} - -void -NetworkInterface::addOutPort(NetworkLink *out_link) -{ - outNetLink = out_link; - outSrcQueue = new flitBuffer(); - out_link->setSourceQueue(outSrcQueue); - out_link->setSource(this); -} - -void -NetworkInterface::addNode(vector<MessageBuffer*>& in, - vector<MessageBuffer*>& out) -{ - inNode_ptr = in; - outNode_ptr = out; - - for (auto& it: in) { - if (it != nullptr) { - it->setConsumer(this); - } - } -} - -void -NetworkInterface::request_vc(int in_vc, int in_port, NetDest destination, - Cycles request_time) -{ - inNetLink->grant_vc_link(in_vc, request_time); -} - -bool -NetworkInterface::flitisizeMessage(MsgPtr msg_ptr, int vnet) -{ - Message *net_msg_ptr = msg_ptr.get(); - NetDest net_msg_dest = net_msg_ptr->getDestination(); - - // get all the destinations associated with this message. - vector<NodeID> dest_nodes = net_msg_dest.getAllDest(); - - // Number of flits is dependent on the link bandwidth available. - // This is expressed in terms of bytes/cycle or the flit size - - int num_flits = (int) ceil((double) m_net_ptr->MessageSizeType_to_int( - net_msg_ptr->getMessageSize())/m_net_ptr->getNiFlitSize()); - - // loop to convert all multicast messages into unicast messages - for (int ctr = 0; ctr < dest_nodes.size(); ctr++) { - int vc = calculateVC(vnet); // this will return a free output vc - - if (vc == -1) { - // did not find a free output vc - return false ; - } - MsgPtr new_msg_ptr = msg_ptr->clone(); - NodeID destID = dest_nodes[ctr]; - - Message *new_net_msg_ptr = new_msg_ptr.get(); - if (dest_nodes.size() > 1) { - NetDest personal_dest; - for (int m = 0; m < (int) MachineType_NUM; m++) { - if ((destID >= MachineType_base_number((MachineType) m)) && - destID < MachineType_base_number((MachineType) (m+1))) { - // calculating the NetDest associated with this destID - personal_dest.clear(); - personal_dest.add((MachineID) {(MachineType) m, (destID - - MachineType_base_number((MachineType) m))}); - new_net_msg_ptr->getDestination() = personal_dest; - break; - } - } - net_msg_dest.removeNetDest(personal_dest); - - // removing the destination from the original message to reflect - // that a message with this particular destination has been - // flitisized and an output vc is acquired - net_msg_ptr->getDestination().removeNetDest(personal_dest); - } - for (int i = 0; i < num_flits; i++) { - m_net_ptr->increment_injected_flits(vnet); - flit *fl = new flit(i, vc, vnet, num_flits, new_msg_ptr, - curCycle()); - fl->set_delay(curCycle() - ticksToCycles(msg_ptr->getTime())); - m_ni_buffers[vc]->insert(fl); - } - - m_out_vc_state[vc]->setState(VC_AB_, curCycle()); - - // setting an output vc request for the next hop. - // This flit will be ready to traverse the link and into the next hop - // only when an output vc is acquired at the next hop - outNetLink->request_vc_link( - vc, new_net_msg_ptr->getDestination(), curCycle()); - } - - return true ; -} - -// An output vc has been granted at the next hop to one of the vc's. -// We have to update the state of the vc to reflect this -void -NetworkInterface::grant_vc(int out_port, int vc, Cycles grant_time) -{ - assert(m_out_vc_state[vc]->isInState(VC_AB_, grant_time)); - m_out_vc_state[vc]->grant_vc(grant_time); - scheduleEvent(Cycles(1)); -} - -// The tail flit corresponding to this vc has been buffered at the next hop -// and thus this vc is now free -void -NetworkInterface::release_vc(int out_port, int vc, Cycles release_time) -{ - assert(m_out_vc_state[vc]->isInState(ACTIVE_, release_time)); - m_out_vc_state[vc]->setState(IDLE_, release_time); - scheduleEvent(Cycles(1)); -} - -// Looking for a free output vc -int -NetworkInterface::calculateVC(int vnet) -{ - int vc_per_vnet; - if (m_net_ptr->isVNetOrdered(vnet)) - vc_per_vnet = 1; - else - vc_per_vnet = m_vc_per_vnet; - - for (int i = 0; i < vc_per_vnet; i++) { - int delta = m_vc_allocator[vnet]; - m_vc_allocator[vnet]++; - if (m_vc_allocator[vnet] == vc_per_vnet) - m_vc_allocator[vnet] = 0; - - if (m_out_vc_state[(vnet*m_vc_per_vnet) + delta]-> - isInState(IDLE_, curCycle())) { - return ((vnet*m_vc_per_vnet) + delta); - } - } - return -1; -} - -/* - * The NI wakeup checks whether there are any ready messages in the protocol - * buffer. If yes, it picks that up, flitisizes it into a number of flits and - * puts it into an output buffer and schedules the output link. - * On a wakeup it also checks whether there are flits in the input link. - * If yes, it picks them up and if the flit is a tail, the NI inserts the - * corresponding message into the protocol buffer. - */ - -void -NetworkInterface::wakeup() -{ - MsgPtr msg_ptr; - - //Checking for messages coming from the protocol - // can pick up a message/cycle for each virtual net - for (int vnet = 0; vnet < inNode_ptr.size(); ++vnet) { - MessageBuffer *b = inNode_ptr[vnet]; - if (b == nullptr) { - continue; - } - - while (b->isReady(clockEdge())) { // Is there a message waiting - msg_ptr = b->peekMsgPtr(); - if (flitisizeMessage(msg_ptr, vnet)) { - b->dequeue(clockEdge()); - } else { - break; - } - } - } - - scheduleOutputLink(); - checkReschedule(); - - /*********** Picking messages destined for this NI **********/ - - if (inNetLink->isReady()) { - flit *t_flit = inNetLink->consumeLink(); - if (t_flit->get_type() == TAIL_ || t_flit->get_type() == HEAD_TAIL_) { - DPRINTF(RubyNetwork, "m_id: %d, Message delivered at time: %lld\n", - m_id, curCycle()); - - outNode_ptr[t_flit->get_vnet()]->enqueue( - t_flit->get_msg_ptr(), clockEdge(), cyclesToTicks(Cycles(1))); - - // signal the upstream router that this vc can be freed now - inNetLink->release_vc_link(t_flit->get_vc(), - curCycle() + Cycles(1)); - } - - int vnet = t_flit->get_vnet(); - m_net_ptr->increment_received_flits(vnet); - Cycles network_delay = curCycle() - t_flit->get_creation_time(); - Cycles queueing_delay = t_flit->get_delay(); - - m_net_ptr->increment_network_latency(network_delay, vnet); - m_net_ptr->increment_queueing_latency(queueing_delay, vnet); - delete t_flit; - } -} - -/* This function looks at the NI buffers and if some buffer has flits which - * are ready to traverse the link in the next cycle and also the downstream - * output vc associated with this flit has buffers left, the link is scheduled - * for the next cycle - */ - -void -NetworkInterface::scheduleOutputLink() -{ - int vc = m_vc_round_robin; - m_vc_round_robin++; - if (m_vc_round_robin == m_num_vcs) - m_vc_round_robin = 0; - - for (int i = 0; i < m_num_vcs; i++) { - vc++; - if (vc == m_num_vcs) - vc = 0; - if (m_ni_buffers[vc]->isReady(curCycle())) { - if (m_out_vc_state[vc]->isInState(ACTIVE_, curCycle()) && - outNetLink->isBufferNotFull_link(vc)) { // buffer backpressure - - // Just removing the flit - flit *t_flit = m_ni_buffers[vc]->getTopFlit(); - t_flit->set_time(curCycle() + Cycles(1)); - outSrcQueue->insert(t_flit); - - // schedule the out link - outNetLink-> - scheduleEventAbsolute(clockEdge(Cycles(1))); - return; - } - } - } -} - -void -NetworkInterface::checkReschedule() -{ - for (const auto& it : inNode_ptr) { - if (it == nullptr) { - continue; - } - - while (it->isReady(clockEdge())) { // Is there a message waiting - scheduleEvent(Cycles(1)); - return; - } - } - - for (int vc = 0; vc < m_num_vcs; vc++) { - if (m_ni_buffers[vc]->isReady(curCycle() + Cycles(1))) { - scheduleEvent(Cycles(1)); - return; - } - } -} - -bool -NetworkInterface::functionalRead(Packet *pkt) -{ - // Go through the internal buffers - for (unsigned int i = 0; i < m_ni_buffers.size(); ++i) { - if (m_ni_buffers[i]->functionalRead(pkt)) { - return true; - } - } - - // Go through the buffer between this network interface and the router - if (outSrcQueue->functionalRead(pkt)) { - return true; - } - - return false; -} - -uint32_t -NetworkInterface::functionalWrite(Packet *pkt) -{ - uint32_t num_functional_writes = 0; - for (unsigned int i = 0; i < m_ni_buffers.size(); ++i) { - num_functional_writes += m_ni_buffers[i]->functionalWrite(pkt); - } - - num_functional_writes += outSrcQueue->functionalWrite(pkt); - return num_functional_writes; -} - -void -NetworkInterface::print(std::ostream& out) const -{ - out << "[Network Interface]"; -} - -NetworkInterface * -GarnetNetworkInterfaceParams::create() -{ - return new NetworkInterface(this); -} diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh deleted file mode 100644 index 9207c353a..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_NETWORK_INTERFACE_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_NETWORK_INTERFACE_HH__ - -#include <iostream> -#include <vector> - -#include "mem/ruby/network/garnet/flexible-pipeline/FlexibleConsumer.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/OutVcState.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" -#include "mem/ruby/slicc_interface/Message.hh" -#include "params/GarnetNetworkInterface.hh" - -class MessageBuffer; -class flitBuffer; - -class NetworkInterface : public ClockedObject, public FlexibleConsumer -{ - public: - typedef GarnetNetworkInterfaceParams Params; - NetworkInterface(const Params *p); - - ~NetworkInterface(); - - void addInPort(NetworkLink *in_link); - void addOutPort(NetworkLink *out_link); - void addNode(std::vector<MessageBuffer *> &inNode, - std::vector<MessageBuffer *> &outNode); - - void wakeup(); - void grant_vc(int out_port, int vc, Cycles grant_time); - void release_vc(int out_port, int vc, Cycles release_time); - - bool isBufferNotFull(int vc, int inport) { return true; } - void request_vc(int in_vc, int in_port, NetDest destination, - Cycles request_time); - - void print(std::ostream& out) const; - - bool functionalRead(Packet *); - uint32_t functionalWrite(Packet *); - - void init_net_ptr(GarnetNetwork* net_ptr) { m_net_ptr = net_ptr; } - - private: - GarnetNetwork *m_net_ptr; - uint32_t m_virtual_networks, m_num_vcs, m_vc_per_vnet; - NodeID m_id; - - std::vector<OutVcState *> m_out_vc_state; - std::vector<int> m_vc_allocator; - int m_vc_round_robin; // For round robin scheduling - flitBuffer *outSrcQueue; // For modelling link contention - - NetworkLink *inNetLink; - NetworkLink *outNetLink; - - // Input Flit Buffers - - // The flit buffers which will serve the Consumer - std::vector<flitBuffer *> m_ni_buffers; - - // The Message buffers that takes messages from the protocol - std::vector<MessageBuffer *> inNode_ptr; - - // The Message buffers that provides messages to the protocol - std::vector<MessageBuffer *> outNode_ptr; - - bool flitisizeMessage(MsgPtr msg_ptr, int vnet); - int calculateVC(int vnet); - void scheduleOutputLink(); - void checkReschedule(); -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_NETWORK_INTERFACE_HH__ diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.cc b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.cc deleted file mode 100644 index f445b5d07..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.cc +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh" - -NetworkLink::NetworkLink(const Params *p) - : ClockedObject(p), Consumer(this), m_id(p->link_id), - m_latency(p->link_latency), m_in_port(0), m_out_port(0), - linkBuffer(new flitBuffer()), link_consumer(nullptr), - link_source(nullptr), link_srcQueue(nullptr), m_link_utilized(0), - m_vc_load(p->virt_nets * p->vcs_per_vnet) -{ -} - -NetworkLink::~NetworkLink() -{ - delete linkBuffer; -} - -void -NetworkLink::setLinkConsumer(FlexibleConsumer *consumer) -{ - link_consumer = consumer; -} - -void -NetworkLink::setSourceQueue(flitBuffer *srcQueue) -{ - link_srcQueue = srcQueue; -} - -void -NetworkLink::setSource(FlexibleConsumer *source) -{ - link_source = source; -} - -void -NetworkLink::request_vc_link(int vc, NetDest destination, Cycles request_time) -{ - link_consumer->request_vc(vc, m_in_port, destination, request_time); -} - -bool -NetworkLink::isBufferNotFull_link(int vc) -{ - return link_consumer->isBufferNotFull(vc, m_in_port); -} - -void -NetworkLink::grant_vc_link(int vc, Cycles grant_time) -{ - link_source->grant_vc(m_out_port, vc, grant_time); -} - -void -NetworkLink::release_vc_link(int vc, Cycles release_time) -{ - link_source->release_vc(m_out_port, vc, release_time); -} - -bool -NetworkLink::isReady() -{ - return linkBuffer->isReady(curCycle()); -} - -void -NetworkLink::setInPort(int port) -{ - m_in_port = port; -} - -void -NetworkLink::setOutPort(int port) -{ - m_out_port = port; -} - -void -NetworkLink::wakeup() -{ - if (!link_srcQueue->isReady(curCycle())) - return; - - flit *t_flit = link_srcQueue->getTopFlit(); - t_flit->set_time(curCycle() + m_latency); - linkBuffer->insert(t_flit); - link_consumer->scheduleEventAbsolute(clockEdge(m_latency)); - - m_link_utilized++; - m_vc_load[t_flit->get_vc()]++; -} - -flit* -NetworkLink::peekLink() -{ - return linkBuffer->peekTopFlit(); -} - -flit* -NetworkLink::consumeLink() -{ - return linkBuffer->getTopFlit(); -} - -bool -NetworkLink::functionalRead(Packet *pkt) -{ - return linkBuffer->functionalRead(pkt); -} - -uint32_t -NetworkLink::functionalWrite(Packet *pkt) -{ - return linkBuffer->functionalWrite(pkt); -} - -NetworkLink * -NetworkLinkParams::create() -{ - return new NetworkLink(this); -} diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh deleted file mode 100644 index f821daf7a..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_NETWORK_LINK_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_NETWORK_LINK_HH__ - -#include <iostream> -#include <vector> - -#include "mem/ruby/common/NetDest.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/FlexibleConsumer.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" -#include "params/NetworkLink.hh" -#include "sim/clocked_object.hh" - -class GarnetNetwork; - -class NetworkLink : public ClockedObject, public Consumer -{ - public: - typedef NetworkLinkParams Params; - NetworkLink(const Params *p); - ~NetworkLink(); - - void setLinkConsumer(FlexibleConsumer *consumer); - void setSourceQueue(flitBuffer *srcQueue); - flit *peekLink(); - flit *consumeLink(); - - void print(std::ostream& out) const {} - - bool is_vc_ready(flit *t_flit); - - int get_id() const { return m_id; } - void setInPort(int port); - void setOutPort(int port); - void wakeup(); - bool isReady(); - void grant_vc_link(int vc, Cycles grant_time); - void release_vc_link(int vc, Cycles release_time); - void request_vc_link(int vc, NetDest destination, Cycles request_time); - bool isBufferNotFull_link(int vc); - void setSource(FlexibleConsumer *source); - void init_net_ptr(GarnetNetwork* net_ptr) { m_net_ptr = net_ptr; } - - unsigned int getLinkUtilization() const { return m_link_utilized; } - const std::vector<unsigned int> & getVcLoad() const { return m_vc_load; } - - bool functionalRead(Packet *); - uint32_t functionalWrite(Packet *); - - private: - int m_id; - Cycles m_latency; - int m_in_port, m_out_port; - GarnetNetwork *m_net_ptr; - - flitBuffer *linkBuffer; - FlexibleConsumer *link_consumer; - FlexibleConsumer *link_source; - flitBuffer *link_srcQueue; - - // Statistical variables - unsigned int m_link_utilized; - std::vector<unsigned int> m_vc_load; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_NETWORK_LINK_HH__ diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/OutVcState.cc b/src/mem/ruby/network/garnet/flexible-pipeline/OutVcState.cc deleted file mode 100644 index 114baa5cd..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/OutVcState.cc +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "mem/ruby/network/garnet/flexible-pipeline/OutVcState.hh" - -OutVcState::OutVcState(int id) - : m_time(0) -{ - m_id = id; - m_vc_state = IDLE_; -} - -bool -OutVcState::isInState(VC_state_type state, Cycles request_time) -{ - return ((m_vc_state == state) && (request_time >= m_time)); -} - -void -OutVcState::grant_vc(Cycles grant_time) -{ - m_time = grant_time; - m_vc_state = ACTIVE_; -} - -void -OutVcState::setState(VC_state_type state, Cycles time) -{ - m_vc_state = state; - m_time = time; -} diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/OutVcState.hh b/src/mem/ruby/network/garnet/flexible-pipeline/OutVcState.hh deleted file mode 100644 index 3462ee7bf..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/OutVcState.hh +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_OUT_VC_STATE_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_OUT_VC_STATE_HH__ - -#include "base/types.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class OutVcState -{ - public: - OutVcState(int id); - - bool isInState(VC_state_type state, Cycles request_time); - void setState(VC_state_type state, Cycles time); - void grant_vc(Cycles grant_time); - - private: - int m_id ; - Cycles m_time; - VC_state_type m_vc_state; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_OUT_VC_STATE_HH__ diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc b/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc deleted file mode 100644 index 9451439c9..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc +++ /dev/null @@ -1,448 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "base/cast.hh" -#include "base/stl_helpers.hh" -#include "debug/RubyNetwork.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/InVcState.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/OutVcState.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/Router.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/VCarbiter.hh" -#include "mem/ruby/slicc_interface/Message.hh" - -using namespace std; -using m5::stl_helpers::deletePointers; - -Router::Router(const Params *p) - : BasicRouter(p), FlexibleConsumer(this) -{ - m_virtual_networks = p->virt_nets; - m_vc_per_vnet = p->vcs_per_vnet; - m_round_robin_inport = 0; - m_round_robin_start = 0; - m_num_vcs = m_vc_per_vnet * m_virtual_networks; - m_vc_arbiter = new VCarbiter(this); -} - -Router::~Router() -{ - for (int i = 0; i < m_in_link.size(); i++) { - deletePointers(m_in_vc_state[i]); - } - for (int i = 0; i < m_out_link.size(); i++) { - deletePointers(m_out_vc_state[i]); - deletePointers(m_router_buffers[i]); - } - deletePointers(m_out_src_queue); - delete m_vc_arbiter; -} - -void -Router::addInPort(NetworkLink *in_link) -{ - int port = m_in_link.size(); - vector<InVcState *> in_vc_vector; - for (int i = 0; i < m_num_vcs; i++) { - in_vc_vector.push_back(new InVcState(i)); - in_vc_vector[i]->setState(IDLE_, curCycle()); - } - m_in_vc_state.push_back(in_vc_vector); - m_in_link.push_back(in_link); - in_link->setLinkConsumer(this); - in_link->setInPort(port); - - int start = 0; - m_round_robin_invc.push_back(start); -} - -void -Router::addOutPort(NetworkLink *out_link, const NetDest& routing_table_entry, - int link_weight) -{ - int port = m_out_link.size(); - out_link->setOutPort(port); - int start = 0; - m_vc_round_robin.push_back(start); - - m_out_src_queue.push_back(new flitBuffer()); - - m_out_link.push_back(out_link); - m_routing_table.push_back(routing_table_entry); - out_link->setSourceQueue(m_out_src_queue[port]); - out_link->setSource(this); - - vector<flitBuffer *> intermediateQueues; - for (int i = 0; i < m_num_vcs; i++) { - int buffer_size = m_net_ptr->getBufferSize(); - if (buffer_size > 0) // finite size - intermediateQueues.push_back(new flitBuffer(buffer_size)); - else // infinite size - intermediateQueues.push_back(new flitBuffer()); - } - m_router_buffers.push_back(intermediateQueues); - - vector<OutVcState *> out_vc_vector; - for (int i = 0; i < m_num_vcs; i++) { - out_vc_vector.push_back(new OutVcState(i)); - out_vc_vector[i]->setState(IDLE_, curCycle()); - } - m_out_vc_state.push_back(out_vc_vector); - m_link_weights.push_back(link_weight); -} - -bool -Router::isBufferNotFull(int vc, int inport) -{ - int outport = m_in_vc_state[inport][vc]->get_outport(); - int outvc = m_in_vc_state[inport][vc]->get_outvc(); - - return (!m_router_buffers[outport][outvc]->isFull()); -} - -// A request for an output vc has been placed by an upstream Router/NI. -// This has to be updated and arbitration performed -void -Router::request_vc(int in_vc, int in_port, NetDest destination, - Cycles request_time) -{ - assert(m_in_vc_state[in_port][in_vc]->isInState(IDLE_, request_time)); - - int outport = getRoute(destination); - m_in_vc_state[in_port][in_vc]->setRoute(outport); - m_in_vc_state[in_port][in_vc]->setState(VC_AB_, request_time); - assert(request_time >= curCycle()); - if (request_time > curCycle()) - m_vc_arbiter->scheduleEventAbsolute(clockPeriod() * request_time); - else - vc_arbitrate(); -} - -void -Router::vc_arbitrate() -{ - int inport = m_round_robin_inport; - m_round_robin_inport++; - if (m_round_robin_inport == m_in_link.size()) - m_round_robin_inport = 0; - - for (int port_iter = 0; port_iter < m_in_link.size(); port_iter++) { - inport++; - if (inport >= m_in_link.size()) - inport = 0; - int invc = m_round_robin_invc[inport]; - m_round_robin_invc[inport] = get_next_round_robin_vc(invc); - - for (int vc_iter = 0; vc_iter < m_num_vcs; vc_iter++) { - invc++; - if (invc >= m_num_vcs) - invc = 0; - - InVcState *in_vc_state = m_in_vc_state[inport][invc]; - - if (in_vc_state->isInState(VC_AB_, curCycle())) { - int outport = in_vc_state->get_outport(); - vector<int> valid_vcs = get_valid_vcs(invc); - for (int valid_vc_iter = 0; valid_vc_iter < valid_vcs.size(); - valid_vc_iter++) { - if (m_out_vc_state[outport][valid_vcs[valid_vc_iter]] - ->isInState(IDLE_, curCycle())) { - - in_vc_state->grant_vc(valid_vcs[valid_vc_iter], - curCycle()); - - m_in_link[inport]->grant_vc_link(invc, curCycle()); - - m_out_vc_state[outport][valid_vcs[valid_vc_iter]] - ->setState(VC_AB_, curCycle()); - break; - } - } - } - } - } -} - -vector<int> -Router::get_valid_vcs(int invc) -{ - vector<int> vc_list; - - for (int vnet = 0; vnet < m_virtual_networks; vnet++) { - if (invc >= (vnet*m_vc_per_vnet) && invc < ((vnet+1)*m_vc_per_vnet)) { - int base = vnet*m_vc_per_vnet; - int vc_per_vnet; - if (m_net_ptr->isVNetOrdered(vnet)) - vc_per_vnet = 1; - else - vc_per_vnet = m_vc_per_vnet; - - for (int offset = 0; offset < vc_per_vnet; offset++) { - vc_list.push_back(base+offset); - } - break; - } - } - return vc_list; -} - -void -Router::grant_vc(int out_port, int vc, Cycles grant_time) -{ - assert(m_out_vc_state[out_port][vc]->isInState(VC_AB_, grant_time)); - m_out_vc_state[out_port][vc]->grant_vc(grant_time); - scheduleEvent(Cycles(1)); -} - -void -Router::release_vc(int out_port, int vc, Cycles release_time) -{ - assert(m_out_vc_state[out_port][vc]->isInState(ACTIVE_, release_time)); - m_out_vc_state[out_port][vc]->setState(IDLE_, release_time); - scheduleEvent(Cycles(1)); -} - -// This function calculated the output port for a particular destination. -int -Router::getRoute(NetDest destination) -{ - int output_link = -1; - int min_weight = INFINITE_; - for (int link = 0; link < m_routing_table.size(); link++) { - if (destination.intersectionIsNotEmpty(m_routing_table[link])) { - if ((m_link_weights[link] >= min_weight)) - continue; - output_link = link; - min_weight = m_link_weights[link]; - } - } - return output_link; -} - -void -Router::routeCompute(flit *m_flit, int inport) -{ - int invc = m_flit->get_vc(); - int outport = m_in_vc_state[inport][invc]->get_outport(); - int outvc = m_in_vc_state[inport][invc]->get_outvc(); - - assert(m_net_ptr->getNumPipeStages() >= 1); - - // Subtract 1 as 1 cycle will be consumed in scheduling the output link - m_flit->set_time(curCycle() + Cycles((m_net_ptr->getNumPipeStages() - 1))); - m_flit->set_vc(outvc); - m_router_buffers[outport][outvc]->insert(m_flit); - - if (m_net_ptr->getNumPipeStages() > 1) - scheduleEvent(Cycles(m_net_ptr->getNumPipeStages() - 1)); - - if ((m_flit->get_type() == HEAD_) || (m_flit->get_type() == HEAD_TAIL_)) { - Message *nm = m_flit->get_msg_ptr().get(); - NetDest destination = nm->getDestination(); - - if (m_net_ptr->getNumPipeStages() > 1) { - m_out_vc_state[outport][outvc]->setState(VC_AB_, curCycle() + - Cycles(1)); - m_out_link[outport]->request_vc_link(outvc, destination, - curCycle() + Cycles(1)); - } else { - m_out_vc_state[outport][outvc]->setState(VC_AB_, curCycle()); - m_out_link[outport]->request_vc_link(outvc, destination, - curCycle()); - } - } - - if ((m_flit->get_type() == TAIL_) || (m_flit->get_type() == HEAD_TAIL_)) { - m_in_vc_state[inport][invc]->setState(IDLE_, curCycle() + Cycles(1)); - m_in_link[inport]->release_vc_link(invc, curCycle() + Cycles(1)); - } -} - -void -Router::wakeup() -{ - flit *t_flit; - - // This is for round-robin scheduling of incoming ports - int incoming_port = m_round_robin_start; - m_round_robin_start++; - if (m_round_robin_start >= m_in_link.size()) { - m_round_robin_start = 0; - } - - for (int port = 0; port < m_in_link.size(); port++) { - // Round robin scheduling - incoming_port++; - if (incoming_port >= m_in_link.size()) - incoming_port = 0; - - // checking the incoming link - if (m_in_link[incoming_port]->isReady()) { - DPRINTF(RubyNetwork, "m_id: %d, Time: %lld\n", m_id, curCycle()); - t_flit = m_in_link[incoming_port]->peekLink(); - routeCompute(t_flit, incoming_port); - m_in_link[incoming_port]->consumeLink(); - } - } - scheduleOutputLinks(); - checkReschedule(); // This is for flits lying in the router buffers - vc_arbitrate(); - check_arbiter_reschedule(); -} - -void -Router::scheduleOutputLinks() -{ - for (int port = 0; port < m_out_link.size(); port++) { - int vc_tolookat = m_vc_round_robin[port]; - m_vc_round_robin[port] = get_next_round_robin_vc(vc_tolookat); - - for (int i = 0; i < m_num_vcs; i++) { - vc_tolookat++; - if (vc_tolookat == m_num_vcs) - vc_tolookat = 0; - - if (m_router_buffers[port][vc_tolookat]->isReady(curCycle())) { - - // models buffer backpressure - if (m_out_vc_state[port][vc_tolookat]->isInState(ACTIVE_, - curCycle()) && - m_out_link[port]->isBufferNotFull_link(vc_tolookat)) { - - flit *t_flit = - m_router_buffers[port][vc_tolookat]->getTopFlit(); - t_flit->set_time(curCycle() + Cycles(1)); - m_out_src_queue[port]->insert(t_flit); - - m_out_link[port]-> - scheduleEventAbsolute(clockEdge(Cycles(1))); - break; // done for this port - } - } - } - } -} - -int -Router::get_vnet(int vc) const -{ - int vnet = vc/m_vc_per_vnet; - assert(vnet < m_virtual_networks); - return vnet; -} - -int -Router::get_next_round_robin_vc(int vc) const -{ - vc++; - if (vc == m_num_vcs) - vc = 0; - return vc; -} - -void -Router::checkReschedule() -{ - for (int port = 0; port < m_out_link.size(); port++) { - for (int vc = 0; vc < m_num_vcs; vc++) { - if (m_router_buffers[port][vc]->isReady(curCycle() + Cycles(1))) { - scheduleEvent(Cycles(1)); - return; - } - } - } -} - -void -Router::check_arbiter_reschedule() -{ - for (int port = 0; port < m_in_link.size(); port++) { - for (int vc = 0; vc < m_num_vcs; vc++) { - if (m_in_vc_state[port][vc]->isInState(VC_AB_, curCycle() + - Cycles(1))) { - m_vc_arbiter->scheduleEventAbsolute(clockEdge(Cycles(1))); - return; - } - } - } -} - -bool -Router::functionalRead(Packet *pkt) -{ - // Access the buffers in the router for performing a functional read - for (unsigned int i = 0; i < m_router_buffers.size(); i++) { - for (unsigned int j = 0; j < m_router_buffers[i].size(); ++j) { - if (m_router_buffers[i][j]->functionalRead(pkt)) { - return true; - } - } - } - - // Access the link queues for performing a functional read - for (unsigned int i = 0; i < m_out_src_queue.size(); i++) { - if (m_out_src_queue[i]->functionalRead(pkt)) { - return true; - } - } - return false; -} - -uint32_t -Router::functionalWrite(Packet *pkt) -{ - uint32_t num_functional_writes = 0; - - // Access the buffers in the router for performing a functional write - for (unsigned int i = 0; i < m_router_buffers.size(); i++) { - for (unsigned int j = 0; j < m_router_buffers[i].size(); ++j) { - num_functional_writes += - m_router_buffers[i][j]->functionalWrite(pkt); - } - } - - // Access the link queues for performing a functional write - for (unsigned int i = 0; i < m_out_src_queue.size(); i++) { - num_functional_writes += m_out_src_queue[i]->functionalWrite(pkt); - } - - return num_functional_writes; -} - -void -Router::print(ostream& out) const -{ - out << "[Router]"; -} - -Router * -GarnetRouterParams::create() -{ - return new Router(this); -} diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/Router.hh b/src/mem/ruby/network/garnet/flexible-pipeline/Router.hh deleted file mode 100644 index c225e8b71..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/Router.hh +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_ROUTER_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_ROUTER_HH__ - -#include <iostream> -#include <vector> - -#include "mem/ruby/common/NetDest.hh" -#include "mem/ruby/network/BasicRouter.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/FlexibleConsumer.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/InVcState.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/OutVcState.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" -#include "params/GarnetRouter.hh" - -class VCarbiter; - -class Router : public BasicRouter, public FlexibleConsumer -{ - public: - typedef GarnetRouterParams Params; - Router(const Params *p); - - ~Router(); - - void addInPort(NetworkLink *in_link); - void addOutPort(NetworkLink *out_link, const NetDest& routing_table_entry, - int link_weight); - void wakeup(); - void request_vc(int in_vc, int in_port, NetDest destination, - Cycles request_time); - bool isBufferNotFull(int vc, int inport); - void grant_vc(int out_port, int vc, Cycles grant_time); - void release_vc(int out_port, int vc, Cycles release_time); - void vc_arbitrate(); - - void print(std::ostream& out) const; - - void init_net_ptr(GarnetNetwork* net_ptr) - { - m_net_ptr = net_ptr; - } - - bool functionalRead(Packet *); - uint32_t functionalWrite(Packet *); - - private: - int m_virtual_networks, m_num_vcs, m_vc_per_vnet; - GarnetNetwork *m_net_ptr; - std::vector<int> m_vc_round_robin; // For scheduling of out source queues - int m_round_robin_inport, m_round_robin_start; // for vc arbitration - std::vector<int> m_round_robin_invc; // For vc arbitration of each outport - - // These are essentially output buffers - std::vector<std::vector<flitBuffer *> > m_router_buffers; - - // These are source queues for the output link - std::vector<flitBuffer *> m_out_src_queue; - - std::vector<NetworkLink *> m_in_link; - std::vector<NetworkLink *> m_out_link; - std::vector<std::vector<InVcState *> > m_in_vc_state; - std::vector<std::vector<OutVcState *> > m_out_vc_state; - std::vector<NetDest> m_routing_table; - std::vector<int> m_link_weights; - VCarbiter *m_vc_arbiter; - - int getRoute(NetDest destination); - std::vector<int> get_valid_vcs(int invc); - void routeCompute(flit *m_flit, int inport); - void checkReschedule(); - void check_arbiter_reschedule(); - void scheduleOutputLinks(); - int get_vnet(int vc) const; - int get_next_round_robin_vc(int vc) const; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_ROUTER_HH__ diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/SConscript b/src/mem/ruby/network/garnet/flexible-pipeline/SConscript deleted file mode 100644 index d4c1a2cb9..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/SConscript +++ /dev/null @@ -1,48 +0,0 @@ -# -*- mode:python -*- - -# Copyright (c) 2009 The Hewlett-Packard Development Company -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer; -# redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution; -# neither the name of the copyright holders nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Authors: Nathan Binkert - -Import('*') - -if env['PROTOCOL'] == 'None': - Return() - -SimObject('GarnetLink.py') -SimObject('GarnetNetwork.py') - -Source('GarnetLink.cc') -Source('GarnetNetwork.cc') -Source('InVcState.cc') -Source('NetworkInterface.cc') -Source('NetworkLink.cc') -Source('OutVcState.cc') -Source('Router.cc') -Source('VCarbiter.cc') -Source('flit.cc') -Source('flitBuffer.cc') diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/VCarbiter.cc b/src/mem/ruby/network/garnet/flexible-pipeline/VCarbiter.cc deleted file mode 100644 index 5ed336699..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/VCarbiter.cc +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "mem/ruby/network/garnet/flexible-pipeline/Router.hh" -#include "mem/ruby/network/garnet/flexible-pipeline/VCarbiter.hh" - -VCarbiter::VCarbiter(Router *router) - : Consumer(router) -{ - m_router = router; -} - -void -VCarbiter::wakeup() -{ - m_router->vc_arbitrate(); -} - diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/VCarbiter.hh b/src/mem/ruby/network/garnet/flexible-pipeline/VCarbiter.hh deleted file mode 100644 index a56bfae0d..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/VCarbiter.hh +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_VC_ARBITER_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_VC_ARBITER_HH__ - -#include <iostream> - -#include "mem/ruby/common/Consumer.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class Router; - -class VCarbiter : public Consumer -{ - public: - VCarbiter(Router *router); - ~VCarbiter() {} - - void print(std::ostream& out) const {} - void wakeup(); - - private: - Router *m_router; -}; - -#endif // __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_VC_ARBITER_HH__ diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/flit.cc b/src/mem/ruby/network/garnet/flexible-pipeline/flit.cc deleted file mode 100644 index aaf19b3b5..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/flit.cc +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include "mem/ruby/network/garnet/flexible-pipeline/flit.hh" - -flit::flit(int id, int vc, int vnet, int size, MsgPtr msg_ptr, Cycles curTime) - : m_id(id), m_vnet(vnet), m_vc(vc), m_size(size), m_creation_time(curTime) -{ - m_msg_ptr = msg_ptr; - m_time = curTime; - - if (size == 1) { - m_type = HEAD_TAIL_; - return; - } - if (id == 0) - m_type = HEAD_; - else if (id == (size - 1)) - m_type = TAIL_; - else - m_type = BODY_; -} - -void -flit::print(std::ostream& out) const -{ - out << "[flit:: "; - out << "Id=" << m_id << " "; - out << "Type=" << m_type << " "; - out << "Vnet=" << m_vnet << " "; - out << "VC=" << m_vc << " "; - out << "Creation Time=" << m_creation_time << " "; - out << "]"; -} - -bool -flit::functionalRead(Packet *pkt) -{ - Message *msg = m_msg_ptr.get(); - return msg->functionalRead(pkt); -} - -bool -flit::functionalWrite(Packet *pkt) -{ - Message *msg = m_msg_ptr.get(); - return msg->functionalWrite(pkt); -} diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/flit.hh b/src/mem/ruby/network/garnet/flexible-pipeline/flit.hh deleted file mode 100644 index 4049a9212..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/flit.hh +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include <cassert> -#include <iostream> - -#include "base/types.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" -#include "mem/ruby/slicc_interface/Message.hh" - -#ifndef __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_FLIT_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_FLIT_HH__ - -class flit -{ - public: - flit(int id, int vc, int vnet, int size, MsgPtr msg_ptr, Cycles curTime); - - int get_size() const { return m_size; } - int get_id() const { return m_id; } - Cycles get_time() const { return m_time; } - Cycles get_creation_time() const { return m_creation_time; } - void set_time(Cycles time) { m_time = time; } - int get_vnet() const { return m_vnet; } - int get_vc() const { return m_vc; } - void set_vc(int vc) { m_vc = vc; } - MsgPtr& get_msg_ptr() { return m_msg_ptr; } - flit_type get_type() const { return m_type; } - void set_delay(Cycles delay) { src_delay = delay; } - Cycles get_delay() const { return src_delay; } - void print(std::ostream& out) const; - - static bool - greater(flit* n1, flit* n2) - { - if (n1->get_time() == n2->get_time()) - //assert(n1->flit_id != n2->flit_id); - return (n1->get_id() > n2->get_id()); - else - return (n1->get_time() > n2->get_time()); - } - - bool functionalRead(Packet *pkt); - bool functionalWrite(Packet *pkt); - - private: - const int m_id; - const int m_vnet; - int m_vc; - const int m_size; - const Cycles m_creation_time; - Cycles m_time; - flit_type m_type; - MsgPtr m_msg_ptr; - Cycles src_delay; -}; - -inline std::ostream& -operator<<(std::ostream& out, const flit& obj) -{ - obj.print(out); - out << std::flush; - return out; -} - -#endif // __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_FLIT_HH__ diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.cc b/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.cc deleted file mode 100644 index ee31ac3d2..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.cc +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#include <algorithm> - -#include "mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh" - -using namespace std; - -flitBuffer::flitBuffer() -{ - max_size = INFINITE_; -} - -flitBuffer::flitBuffer(int maximum_size) -{ - max_size = maximum_size; -} - -bool -flitBuffer::isEmpty() -{ - return (m_buffer.size() == 0); -} - -bool -flitBuffer::isReady(Cycles curTime) -{ - if (m_buffer.size() != 0 ) { - flit *t_flit = m_buffer.front(); - if (t_flit->get_time() <= curTime) - return true; - } - return false; -} - -bool -flitBuffer::isFull() -{ - return (m_buffer.size() >= max_size); -} - -void -flitBuffer::setMaxSize(int maximum) -{ - max_size = maximum; -} - -flit* -flitBuffer:: getTopFlit() -{ - flit *f = m_buffer.front(); - pop_heap(m_buffer.begin(), m_buffer.end(), flit::greater); - m_buffer.pop_back(); - return f; -} - -flit* -flitBuffer::peekTopFlit() -{ - return m_buffer.front(); -} - -void -flitBuffer::insert(flit *flt) -{ - m_buffer.push_back(flt); - push_heap(m_buffer.begin(), m_buffer.end(), flit::greater); -} - -void -flitBuffer::print(std::ostream& out) const -{ - out << "[flitBuffer: "; - out << m_buffer.size() << "] " << std::endl; -} - -bool -flitBuffer::functionalRead(Packet *pkt) -{ - for (unsigned int i = 0; i < m_buffer.size(); ++i) { - if (m_buffer[i]->functionalRead(pkt)) { - return true; - } - } - return false; -} - -uint32_t -flitBuffer::functionalWrite(Packet *pkt) -{ - uint32_t num_functional_writes = 0; - - for (unsigned int i = 0; i < m_buffer.size(); ++i) { - if (m_buffer[i]->functionalWrite(pkt)) { - num_functional_writes++; - } - } - return num_functional_writes; -} diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh b/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh deleted file mode 100644 index 99fa2678b..000000000 --- a/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2008 Princeton University - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Niket Agarwal - */ - -#ifndef __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_FLIT_BUFFER_HH__ -#define __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_FLIT_BUFFER_HH__ - -#include <iostream> -#include <vector> - -#include "mem/ruby/network/garnet/flexible-pipeline/flit.hh" -#include "mem/ruby/network/garnet/NetworkHeader.hh" - -class flitBuffer -{ - public: - flitBuffer(); - flitBuffer(int maximum_size); - - bool isReady(Cycles curTime); - bool isFull(); - bool isEmpty(); - void setMaxSize(int maximum); - flit *getTopFlit(); - flit *peekTopFlit(); - void insert(flit *flt); - void print(std::ostream& out) const; - - bool functionalRead(Packet *); - uint32_t functionalWrite(Packet *); - - private: - std::vector<flit *> m_buffer; - int max_size; -}; - -inline std::ostream& -operator<<(std::ostream& out, const flitBuffer& obj) -{ - obj.print(out); - out << std::flush; - return out; -} - -#endif // __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_FLIT_BUFFER_HH__ |