#
# Copyright (c) 2017-2021 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:
#
# 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.
#

Import('*')

if not env['CONF']['BUILD_GPU']:
    Return()

if env['CONF']['PROTOCOL'] == 'None':
    Return()

SimObject('ProtocolTester.py', sim_objects=['ProtocolTester'])
SimObject('CpuThread.py', sim_objects=['CpuThread'])
SimObject('DmaThread.py', sim_objects=['DmaThread'])
SimObject('GpuWavefront.py', sim_objects=['GpuWavefront'])
SimObject('TesterThread.py', sim_objects=['TesterThread'])
SimObject('TesterDma.py', sim_objects=['TesterDma'])

Source('address_manager.cc')
Source('episode.cc')
Source('protocol_tester.cc')
Source('cpu_thread.cc')
Source('dma_thread.cc')
Source('gpu_wavefront.cc')
Source('tester_thread.cc')

DebugFlag('ProtocolTest')
