# -*- 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['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'])

def do_embed_text(target, source, env):
    """convert a text file into a file that can be embedded in C
    using an #include statement, that defines a \"const char *\" pointing
    to the same text.

    This is useful to embed scripts and configuration files in object files.
    """

    escape = [ "\'", "\"", "\\", "\?" ]

    # reads the text file in, line by line, converting it to a C string
    fin = open(str(source[0]), 'r')
    fout = open(str(target[0]), 'w' )
    fout.write("static const char *%s =\n" % source[1].get_contents());
    for l in fin:
        # add escape sequences for the characters in escape
        fout.write("\"")
        for char in l:
            if char == "\n":
                break
            if char in escape:
                fout.write("\\")
                fout.write(char)
            else:
                fout.write(char)
        fout.write("\\n\"\n");
    fout.write(";\n");
    fin.close()
    fout.close()

#
# 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')
