/* Copyright (c) 2006-2007 by Princeton University
 * All rights reserved.
 * Author: Christian Bienia
 *
 * 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 Princeton University 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 PRINCETON UNIVERSITY ``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 PRINCETON UNIVERSITY 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.
 */

/** \file config.h
 * \brief The configuration file for PARSEC Hooks Instrumentation API.
 *
 * This file serves as a central point to enable or disable functionality of
 * the hooks library functions. To enable functionality simply define the
 * corresponding macro to be 1 and 0 otherwise.
 *
 * The Hooks API is specified in file hooks.h and the functionality is
 * implemented in file hooks.c.
 */

#ifndef _PARSEC_HOOKS_CONFIG_H
/** Guard macro to prevent multiple inclusions. */
#define _PARSEC_HOOKS_CONFIG_H 1



/*** Configuration ***/

/** \brief Measure execution time of Region-of-Interest.
 *
 * If this macro is defined to 1 code is added to the hook functions to
 * measure the execution time of the Region-of-Interest. Measuring execution
 * time of the whole program is inaccurate because it includes the
 * initialization and shutdown phase.
 *
 * This functionality is enabled by default.
 */
#define ENABLE_TIMING 1

/* Affinity control at the command line. */
#if defined(__linux__) || defined(__linux) || defined(linux__) || defined(linux)
/** \brief Enable process affinity control via environment variables
 *
 * If this macro is defined to 1 code is added to the hook functions which
 * allows thread affinity control of all PARSEC workloads via two environment 
 * variables. This functionality can be used to restrict which CPUs the
 * workloads can use at runtime. At the moment thread affinity control is only
 * supported on Linux systems.
 * 
 * The name of the environment variables is determined by the macros 
 * __PARSEC_CPU_NUM and __PARSEC_CPU_BASE.
 *
 * This functionality is enabled by default on Linux systems.
 */
//NOTE: Requires sched_setaffinity() (Linux only)
#define ENABLE_SETAFFINITY 1
/** \brief Name of environment variable to control number of CPUs.
 *
 * This macro defines the name of one of the two environment variables which
 * can be used for thread affinity control at the command line. It determines
 * the total number of CPUs to use. The base CPU can be set with the environment
 * variable defined by __PARSEC_CPU_BASE.
 *
 * Define the macro ENABLE_SETAFFINITY to enable this feature.
 */
#define __PARSEC_CPU_NUM "PARSEC_CPU_NUM"
/** \brief Name of environment variable to set base CPU.
 *
 * This macro defines the name of one of the two environment variables which
 * can be used for thread affinity control at the command line. It determines
 * the base CPU to use. The total number of CPUs can be set with the environment
 * variable defined by __PARSEC_CPU_NUM.
 *
 * Define the macro ENABLE_SETAFFINITY to enable this feature.
 */
#define __PARSEC_CPU_BASE "PARSEC_CPU_BASE"
#endif //__LINUX__

/** \brief Execute SIMICS magic instruction at beginning and end of
 * Region-of-Interest.
 *
 * If this macro is defined to 1 a `magic instruction' recognized by the Simics
 * simulator is inserted at the beginning and end of the Region-of-Interest.
 * It can be used to interrupt simulation at these locations. To use this
 * feature you need to make sure that the correct Simics header file is included
 * in file config.h
 *
 * This functionality is disabled by default.
 */
#define ENABLE_SIMICS_MAGIC 0
/* Path to Simics directory, if you want to use its magic instructions */
#if ENABLE_SIMICS_MAGIC
#include "/opt/virtutech/simics-latest/src/include/simics/magic-instruction.h"
#endif

/** \brief Execute PTLsim trigger calls at beginning and end of
 * Region-of-Interest.
 *
 * If this macro is defined to 1 the PTLsim trigger functions are called
 * at the beginning and end of the Region-of-Interest. The hooks library will
 * execute ptlcall_switch_to_sim() at the beginning of the Region-of-Interest
 * and ptlcall_switch_to_native() at its end.
 *
 * PTLsim uses these functions to switch between simulation and native
 * execution. To use this feature you need to make sure that the correct
 * PTLsim header file is included in file config.h
 *
 * This functionality is disabled by default.
 */
#define ENABLE_PTLSIM_TRIGGER 0
/* Path to PTLsim directory, if you want to use its trigger functions */
#if ENABLE_PTLSIM_TRIGGER
#include "/opt/PTLsim/ptlcalls.h"
#endif

#define ENABLE_M5_TRIGGER 1
//#define ENABLE_M5_CKPTS 1
//#if ENABLE_M5_TRIGGER
//#include <stdint.h>
//void m5_dumpreset_stats(uint64_t ns_delay, uint64_t ns_period);
//void m5_checkpoint(uint64_t ns_delay, uint64_t ns_period);
//#endif

/** \brief Prefix for all output.
 *
 * This macro defines the prefix to use for all output generated by the hooks
 * library. A descriptive prefix makes it easier to distinguish hooks library
 * output from program output at runtime.
 *
 * By default the string "[HOOKS]" is used.
 */
#define HOOKS_PREFIX "[HOOKS]"

/** \brief Version number of this implementation of the PARSEC hooks
 *
 * This macro defines a version string which is part of the output that is
 * printed by the hooks library at the beginning of program execution if the
 * PARSEC workload was compiled with hook support enabled. A unique version
 * string makes it easier to distinguish which version of the hooks library the
 * program has been linked to.
 */
#define HOOKS_VERSION "1.2"

#endif //_PARSEC_HOOKS_CONFIG_H

