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

import os
import sys

from os.path import basename, isdir, join as joinpath

import SCons

from gem5_scons import Transform

Import('*')

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

DebugFlag('ProtocolTrace')
DebugFlag('RubyCache')
DebugFlag('RubyCacheTrace')
DebugFlag('RubyDma')
DebugFlag('RubyGenerated')
DebugFlag('RubyNetwork')
DebugFlag('RubyPort')
DebugFlag('RubyPrefetcher')
DebugFlag('RubyQueue')
DebugFlag('RubySequencer')
DebugFlag('RubySlicc')
DebugFlag('RubySystem')
DebugFlag('RubyTester')
DebugFlag('RubyStats')
DebugFlag('RubyResourceStalls')

CompoundFlag('Ruby', [ 'RubyQueue', 'RubyNetwork', 'RubyTester',
    'RubyGenerated', 'RubySlicc', 'RubySystem', 'RubyCache',
    'RubyDma', 'RubyPort', 'RubySequencer', 'RubyCacheTrace',
    'RubyPrefetcher'])

#
# Link includes
#
generated_dir = Dir('protocol')

def MakeIncludeAction(target, source, env):
    with open(str(target[0]), 'w') as f:
        for s in source:
            print('#include "%s"' % str(s.abspath), file=f)

def MakeInclude(source):
    target = generated_dir.File(basename(source))
    include_action = MakeAction(MakeIncludeAction, Transform("MAKE INC", 1))
    env.Command(target, source, include_action)

MakeInclude('slicc_interface/AbstractCacheEntry.hh')
MakeInclude('slicc_interface/Message.hh')
MakeInclude('slicc_interface/RubyRequest.hh')

# External types
MakeInclude('common/Address.hh')
MakeInclude('common/BoolVec.hh')
MakeInclude('common/DataBlock.hh')
MakeInclude('common/ExpectedMap.hh')
MakeInclude('common/IntVec.hh')
MakeInclude('common/MachineID.hh')
MakeInclude('common/NetDest.hh')
MakeInclude('common/TriggerQueue.hh')
MakeInclude('common/Set.hh')
MakeInclude('common/WriteMask.hh')
MakeInclude('network/MessageBuffer.hh')
MakeInclude('structures/CacheMemory.hh')
MakeInclude('structures/DirectoryMemory.hh')
MakeInclude('structures/PerfectCacheMemory.hh')
MakeInclude('structures/PersistentTable.hh')
MakeInclude('structures/RubyPrefetcher.hh')
MakeInclude('structures/TBEStorage.hh')
MakeInclude('structures/TBETable.hh')
MakeInclude('structures/TimerTable.hh')
MakeInclude('structures/WireBuffer.hh')
MakeInclude('system/DMASequencer.hh')
MakeInclude('system/Sequencer.hh')

# External types : Group "mem/ruby/protocol" : include "header.hh" to the
# bottom of this MakeIncludes if it is referenced as
# <# include "mem/ruby/protocol/header.hh"> in any file
# generated_dir = Dir('protocol')
MakeInclude('system/GPUCoalescer.hh')
MakeInclude('system/HTMSequencer.hh')
MakeInclude('system/VIPERCoalescer.hh')
