# -*- 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.
#
# Authors: Nathan Binkert

from __future__ import print_function

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):
    f = file(str(target[0]), 'w')
    for s in source:
        print('#include "%s"' % str(s.abspath), file=f)
    f.close()

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/AbstractEntry.hh')
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/IntVec.hh')
MakeInclude('common/MachineID.hh')
MakeInclude('common/NetDest.hh')
MakeInclude('common/Set.hh')
MakeInclude('common/WriteMask.hh')
MakeInclude('filters/AbstractBloomFilter.hh')
MakeInclude('network/MessageBuffer.hh')
MakeInclude('structures/CacheMemory.hh')
MakeInclude('structures/DirectoryMemory.hh')
MakeInclude('structures/PerfectCacheMemory.hh')
MakeInclude('structures/PersistentTable.hh')
MakeInclude('structures/Prefetcher.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/protocol" : include "header.hh" to the bottom
# of this MakeIncludes if it is referenced as
# <# include "mem/protocol/header.hh"> in any file
# generated_dir = Dir('../protocol')
MakeInclude('system/GPUCoalescer.hh')
MakeInclude('system/VIPERCoalescer.hh')
