# -*- mode:python -*-

# Copyright (c) 2006 The Regents of The University of Michigan
# 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('*')

SimObject('Graphics.py', enums=['ImageFormat'])
GTest('amo.test', 'amo.test.cc')
Source('atomicio.cc', add_tags='gem5 trace')
GTest('atomicio.test', 'atomicio.test.cc', 'atomicio.cc')
Source('bitfield.cc')
GTest('bitfield.test', 'bitfield.test.cc', 'bitfield.cc')
Source('imgwriter.cc')
Source('bmpwriter.cc')
Source('channel_addr.cc')
Source('cprintf.cc', add_tags='gtest lib')
GTest('cprintf.test', 'cprintf.test.cc')
Executable('cprintftime', 'cprintftime.cc', 'cprintf.cc')
Source('debug.cc', add_tags='gem5 trace')
GTest('debug.test', 'debug.test.cc', 'debug.cc')
if env['HAVE_FENV']:
    Source('fenv.cc')
else:
    warning("No IEEE FP rounding mode control.\n"
            "FP results may deviate slightly from other platforms.")
if env['HAVE_PNG']:
    env.Append(LIBS=['png'])
    Source('pngwriter.cc')
Source('fiber.cc')
GTest('fiber.test', 'fiber.test.cc', 'fiber.cc')
GTest('flags.test', 'flags.test.cc')
GTest('coroutine.test', 'coroutine.test.cc', 'fiber.cc')
Source('framebuffer.cc')
Source('hostinfo.cc')
Source('inet.cc')
Source('inifile.cc', add_tags='gem5 serialize')
GTest('inifile.test', 'inifile.test.cc', 'inifile.cc', 'str.cc')
GTest('intmath.test', 'intmath.test.cc')
Source('logging.cc')
GTest('logging.test', 'logging.test.cc', 'logging.cc', 'hostinfo.cc',
    'cprintf.cc', 'gtest/logging.cc', skip_lib=True)
Source('match.cc', add_tags='gem5 trace')
GTest('match.test', 'match.test.cc', 'match.cc', 'str.cc')
Source('output.cc')
Source('pixel.cc')
GTest('pixel.test', 'pixel.test.cc', 'pixel.cc')
Source('pollevent.cc')
Source('random.cc')
if env['TARGET_ISA'] != 'null':
    Source('remote_gdb.cc')
Source('socket.cc')
GTest('socket.test', 'socket.test.cc', 'socket.cc')
Source('statistics.cc')
Source('str.cc', add_tags=['gem5 trace', 'gem5 serialize'])
GTest('str.test', 'str.test.cc', 'str.cc')
Source('time.cc')
Source('version.cc')
Source('temperature.cc')
GTest('temperature.test', 'temperature.test.cc', 'temperature.cc')
Source('trace.cc', add_tags='gem5 trace')
GTest('trace.test', 'trace.test.cc', with_tag('gem5 trace'))
GTest('trie.test', 'trie.test.cc')
Source('types.cc')
GTest('types.test', 'types.test.cc', 'types.cc')
GTest('uncontended_mutex.test', 'uncontended_mutex.test.cc')

GTest('addr_range.test', 'addr_range.test.cc')
GTest('addr_range_map.test', 'addr_range_map.test.cc')
GTest('bitunion.test', 'bitunion.test.cc')
GTest('channel_addr.test', 'channel_addr.test.cc', 'channel_addr.cc')
GTest('circlebuf.test', 'circlebuf.test.cc')
GTest('circular_queue.test', 'circular_queue.test.cc')
GTest('sat_counter.test', 'sat_counter.test.cc')
GTest('refcnt.test','refcnt.test.cc')
GTest('condcodes.test', 'condcodes.test.cc')
GTest('chunk_generator.test', 'chunk_generator.test.cc')

DebugFlag('Annotate', "State machine annotation debugging")
DebugFlag('AnnotateQ', "State machine annotation queue debugging")
DebugFlag('AnnotateVerbose', "Dump all state machine annotation details")
DebugFlag('GDBAcc', "Remote debugger accesses")
DebugFlag('GDBExtra', "Dump extra information on reads and writes")
DebugFlag('GDBMisc', "Breakpoints, traps, watchpoints, etc.")
DebugFlag('GDBRead', "Reads to the remote address space")
DebugFlag('GDBRecv', "Messages received from the remote application")
DebugFlag('GDBSend', "Messages sent to the remote application")
DebugFlag('GDBWrite', "Writes to the remote address space")
DebugFlag('SQL', "SQL queries sent to the server")
DebugFlag('Stats', "Statistics management")
DebugFlag('StatEvents', "Statistics event tracking")

CompoundFlag('GDBAll',
    [ 'GDBMisc', 'GDBAcc', 'GDBRead', 'GDBWrite', 'GDBSend', 'GDBRecv',
      'GDBExtra' ],
    desc="All Remote debugging flags")
CompoundFlag('AnnotateAll', ['Annotate', 'AnnotateQ', 'AnnotateVerbose'],
    desc="All Annotation flags")

DebugFormatFlag('FmtFlag',
    "Show the --debug-flag that enabled each debug message")
DebugFormatFlag('FmtStackTrace',
    "Print a stack trace after every debug message")
DebugFormatFlag('FmtTicksOff', "Don't show tick count on debug messages")
