summaryrefslogtreecommitdiff
path: root/src/mem/ruby/network/garnet/flexible-pipeline
diff options
context:
space:
mode:
authorTushar Krishna <tushar@ece.gatech.edu>2016-10-06 14:35:21 -0400
committerTushar Krishna <tushar@ece.gatech.edu>2016-10-06 14:35:21 -0400
commitb512f4bf71fac79fb6e17bb2a9e05c1f494f69f4 (patch)
treeee4e62624aaf5a50e0f232bfea76cd2dcdd8f817 /src/mem/ruby/network/garnet/flexible-pipeline
parent0962d768270696395dacfbd2ceabe4ee1035a496 (diff)
downloadgem5-b512f4bf71fac79fb6e17bb2a9e05c1f494f69f4.tar.xz
ruby: remove the original garnet code.
Only garnet2.0 will be supported henceforth.
Diffstat (limited to 'src/mem/ruby/network/garnet/flexible-pipeline')
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/FlexibleConsumer.hh49
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/GarnetLink.cc78
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/GarnetLink.hh89
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/GarnetLink.py72
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc240
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh104
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.py62
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/InVcState.cc76
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/InVcState.hh57
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc384
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh106
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.cc151
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh96
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/OutVcState.cc58
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/OutVcState.hh52
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/Router.cc448
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/Router.hh110
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/SConscript48
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/VCarbiter.cc45
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/VCarbiter.hh54
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/flit.cc75
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/flit.hh93
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.cc127
-rw-r--r--src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh71
24 files changed, 0 insertions, 2745 deletions
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__