# 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.

from m5.params import *
from m5.proxy import *
from m5.objects.ClockedObject import ClockedObject
from m5.objects.BasicLink import BasicIntLink, BasicExtLink

class CDCType(Enum): vals = [
    'LINK_OBJECT',
    'OBJECT_LINK',
    ]

class NetworkLink(ClockedObject):
    type = 'NetworkLink'
    cxx_header = "mem/ruby/network/garnet/NetworkLink.hh"
    cxx_class = 'gem5::ruby::garnet::NetworkLink'

    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")
    supported_vnets = VectorParam.Int(Parent.supported_vnets,
                                      "Vnets supported")
    width = Param.UInt32(Parent.width, "bit-width of the link")

class CreditLink(NetworkLink):
    type = 'CreditLink'
    cxx_header = "mem/ruby/network/garnet/CreditLink.hh"
    cxx_class = 'gem5::ruby::garnet::CreditLink'

class NetworkBridge(CreditLink):
    type = 'NetworkBridge'
    cxx_header = "mem/ruby/network/garnet/NetworkBridge.hh"
    cxx_class = 'gem5::ruby::garnet::NetworkBridge'

    link = Param.NetworkLink("Associated Network Link")
    vtype = Param.CDCType('LINK_OBJECT',
              "Direction of CDC LINK->OBJECT or OBJECT->LINK")
    serdes_latency = Param.Cycles(1, "Latency of SerDes Unit")
    cdc_latency = Param.Cycles(1, "Latency of CDC Unit")

# Interior fixed pipeline links between routers
class GarnetIntLink(BasicIntLink):
    type = 'GarnetIntLink'
    cxx_header = "mem/ruby/network/garnet/GarnetLink.hh"
    cxx_class = 'gem5::ruby::garnet::GarnetIntLink'

    # The internal link includes one forward link (for flit)
    # and one backward flow-control link (for credit)
    network_link = Param.NetworkLink(NetworkLink(), "forward link")
    credit_link  = Param.CreditLink(CreditLink(), "backward flow-control link")

    # The src_cdc and dst_cdc flags are used to enable the
    # clock domain crossing(CDC) at the source and destination
    # end of the link respectively. This is required when the
    # link and the objected connected to the link are operating
    # at different clock domains. These flags should be set
    # in the network topology files.
    src_cdc = Param.Bool(False, "Enable Clock Domain Crossing")
    dst_cdc = Param.Bool(False, "Enable Clock Domain Crossing")

    # The src_serdes and dst_serdes flags are used to enable
    # the Serializer-Deserializer units at the source and
    # destination end of the link respectively. Enabling
    # these flags is necessary when the connecting object
    # supports a different flit width.
    src_serdes = Param.Bool(False, "Enable Serializer-Deserializer")
    dst_serdes = Param.Bool(False, "Enable Serializer-Deserializer")

    # The network bridge encapsulates both the CDC and Ser-Des
    # units in HeteroGarnet. This is automatically enabled when
    # either CDC or Ser-Des is enabled.
    src_net_bridge = Param.NetworkBridge(NULL, "Network Bridge at source")
    dst_net_bridge = Param.NetworkBridge(NULL, "Network Bridge at dest")
    src_cred_bridge = Param.NetworkBridge(NULL, "Credit Bridge at source")
    dst_cred_bridge = Param.NetworkBridge(NULL, "Credit Bridge at dest")

    width = Param.UInt32(Parent.ni_flit_size,
                          "bit width supported by the router")

# Exterior fixed pipeline links between a router and a controller
class GarnetExtLink(BasicExtLink):
    type = 'GarnetExtLink'
    cxx_header = "mem/ruby/network/garnet/GarnetLink.hh"
    cxx_class = 'gem5::ruby::garnet::GarnetExtLink'

    # The external link is bi-directional.
    # It includes two forward links (for flits)
    # and two backward flow-control links (for credits),
    # one per direction
    _nls = []
    # In uni-directional link
    _nls.append(NetworkLink());
    # Out uni-directional link
    _nls.append(NetworkLink());
    network_links = VectorParam.NetworkLink(_nls, "forward links")

    _cls = []
    # In uni-directional link
    _cls.append(CreditLink());
    # Out uni-directional link
    _cls.append(CreditLink());
    credit_links = VectorParam.CreditLink(_cls, "backward flow-control links")

    # The ext_cdc and intt_cdc flags are used to enable the
    # clock domain crossing(CDC) at the external and internal
    # end of the link respectively. This is required when the
    # link and the objected connected to the link are operating
    # at different clock domains. These flags should be set
    # in the network topology files.
    ext_cdc = Param.Bool(False, "Enable Clock Domain Crossing")
    int_cdc = Param.Bool(False, "Enable Clock Domain Crossing")

    # The ext_serdes and int_serdes flags are used to enable
    # the Serializer-Deserializer units at the external and
    # internal end of the link respectively. Enabling
    # these flags is necessary when the connecting object
    # supports a different flit width.
    ext_serdes = Param.Bool(False, "Enable Serializer-Deserializer")
    int_serdes = Param.Bool(False, "Enable Serializer-Deserializer")

    # The network bridge encapsulates both the CDC and Ser-Des
    # units in HeteroGarnet. This is automatically enabled when
    # either CDC or Ser-Des is enabled.
    ext_net_bridge = VectorParam.NetworkBridge([],
        "Network Bridge at external end")
    ext_cred_bridge = VectorParam.NetworkBridge([],
        "Credit Bridge at external end")
    int_net_bridge = VectorParam.NetworkBridge([],
        "Network Bridge at internal end")
    int_cred_bridge = VectorParam.NetworkBridge([],
        "Credit Bridge at internal end")


    width = Param.UInt32(Parent.ni_flit_size,
                          "bit width supported by the router")
