# Copyright (c) 2017-2021 Advanced Micro Devices, Inc.
# All rights reserved.
#
# For use for simulation and test purposes only
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. 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.
#
# 3. Neither the name of the copyright holder 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 HOLDER 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.objects.ClockedObject import ClockedObject
from m5.params import *
from m5.proxy import *

class ProtocolTester(ClockedObject):
    type = 'ProtocolTester'
    cxx_header = "cpu/testers/gpu_ruby_test/protocol_tester.hh"
    cxx_class = 'gem5::ProtocolTester'

    cpu_ports = VectorRequestPort("Ports for CPUs")
    dma_ports = VectorRequestPort("Ports for DMAs")
    cu_vector_ports = VectorRequestPort("Vector ports for GPUs")
    cu_sqc_ports = VectorRequestPort("SQC ports for GPUs")
    cu_scalar_ports = VectorRequestPort("Scalar ports for GPUs")
    cu_token_ports = VectorRequestPort("Token ports for GPU")

    cus_per_sqc = Param.Int(4, "Number of CUs per SQC")
    cus_per_scalar = Param.Int(4, "Number of CUs per scalar cache")

    wavefronts_per_cu = Param.Int(1, "Number of wavefronts per CU")
    workitems_per_wavefront = Param.Int(64, "Number of workitems per wf")

    max_cu_tokens = Param.Int(4, "Maximum number of tokens, i.e., the number"
                                 " of instructions that can be uncoalesced"
                                 " before back-pressure occurs from the"
                                 " coalescer.")

    cpu_threads = VectorParam.CpuThread("All cpus")
    dma_threads = VectorParam.DmaThread("All DMAs")
    wavefronts = VectorParam.GpuWavefront("All wavefronts")

    num_atomic_locations = Param.Int(2, "Number of atomic locations")
    num_normal_locs_per_atomic = Param.Int(1000, \
                                "Number of normal locations per atomic")

    episode_length = Param.Int(10, "Number of actions per episode")
    max_num_episodes = Param.Int(20, "Maximum number of episodes")
    debug_tester = Param.Bool(False, "Are we debugging the tester?")
    random_seed = Param.Int(0, "Random seed number. Default value (0) means \
                                using runtime-specific value.")
    log_file = Param.String("Log file's name")
    system = Param.System(Parent.any, "System we belong to")
