summaryrefslogtreecommitdiff
path: root/src/mem/gems_common/ioutil/initvar.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/gems_common/ioutil/initvar.cc')
-rw-r--r--src/mem/gems_common/ioutil/initvar.cc585
1 files changed, 0 insertions, 585 deletions
diff --git a/src/mem/gems_common/ioutil/initvar.cc b/src/mem/gems_common/ioutil/initvar.cc
deleted file mode 100644
index 4388c0de4..000000000
--- a/src/mem/gems_common/ioutil/initvar.cc
+++ /dev/null
@@ -1,585 +0,0 @@
-/*
- * Copyright (c) 1999-2005 Mark D. Hill and David A. Wood
- * 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.
- */
-
-/*
- This file has been modified by Kevin Moore and Dan Nussbaum of the
- Scalable Systems Research Group at Sun Microsystems Laboratories
- (http://research.sun.com/scalable/) to support the Adaptive
- Transactional Memory Test Platform (ATMTP).
-
- Please send email to atmtp-interest@sun.com with feedback, questions, or
- to request future announcements about ATMTP.
-
- ----------------------------------------------------------------------
-
- File modification date: 2008-02-23
-
- ----------------------------------------------------------------------
-*/
-
-/*
- * FileName: initvar.C
- * Synopsis: implementation of global variable initialization in simics
- * Author: cmauer
- * Version: $Id$
- */
-
-/*------------------------------------------------------------------------*/
-/* Includes */
-/*------------------------------------------------------------------------*/
-
-using namespace std;
-#include <string>
-#include <map>
-#include <stdlib.h>
-
-// Maurice
-// extern "C" {
-// #include "global.hh"
-// #include "simics/api.hh"
-// #ifdef SIMICS22X
-// #include "configuration_api.hh"
-// #endif
-// #ifdef SIMICS30
-// #include "configuration.hh"
-// #endif
-// };
-
-#include "mem/ruby/common/Global.hh"
-
-#include "mem/gems_common/ioutil/confio.hh"
-#include "mem/gems_common/ioutil/initvar.hh"
-
-/*------------------------------------------------------------------------*/
-/* Variable declarations */
-/*------------------------------------------------------------------------*/
-
-// define global "constants" using centralized file
-#define PARAM( NAME ) \
- int32 NAME;
-#define PARAM_UINT( NAME ) \
- uint32 NAME;
-#define PARAM_ULONG( NAME ) \
- uint64 NAME;
-#define PARAM_BOOL( NAME ) \
- bool NAME;
-#define PARAM_DOUBLE( NAME ) \
- double NAME;
-#define PARAM_STRING( NAME ) \
- char *NAME;
-#define PARAM_ARRAY( PTYPE, NAME, ARRAY_SIZE ) \
- PTYPE NAME[ARRAY_SIZE];
-#include "mem/ruby/config/config.hh"
-#undef PARAM
-#undef PARAM_UINT
-#undef PARAM_ULONG
-#undef PARAM_BOOL
-#undef PARAM_DOUBLE
-#undef PARAM_STRING
-#undef PARAM_ARRAY
-
-/** global initvar object */
-initvar_t *initvar_t::m_inst = NULL;
-
-/*------------------------------------------------------------------------*/
-/* Forward declarations */
-/*------------------------------------------------------------------------*/
-
-static attr_value_t initvar_get_attr( void *ptr, void *obj );
-static set_error_t initvar_set_attr( void *ptr, void *obj,
- attr_value_t *value );
-
-/*------------------------------------------------------------------------*/
-/* Constructor(s) / destructor */
-/*------------------------------------------------------------------------*/
-
-//**************************************************************************
-initvar_t::initvar_t( const char *name, const char *relativeIncludePath,
- const char *initializingString,
- void (*allocate_fn)(void),
- void (*my_generate_fn)(void) )
-{
- m_is_init = false;
- m_name = (char *) malloc( sizeof(char)*(strlen( name ) + 2) );
- m_rel_include_path = (char *) malloc( sizeof(char)*(strlen( relativeIncludePath ) + 2) );
- m_config_filename = NULL;
- strcpy( m_name, name );
- strcpy( m_rel_include_path, relativeIncludePath );
- m_allocate_f = allocate_fn;
- m_generate_values_f = my_generate_fn;
-
- initvar_t::m_inst = this;
- init_config_reader( initializingString );
-}
-
-//**************************************************************************
-initvar_t::~initvar_t( )
-{
-#define PARAM( NAME )
-#define PARAM_UINT( NAME )
-#define PARAM_ULONG( NAME )
-#define PARAM_BOOL( NAME )
-#define PARAM_DOUBLE( NAME )
-#define PARAM_STRING( NAME ) \
- if (NAME != NULL) { \
- free( NAME ); \
- NAME = NULL; \
- }
-#define PARAM_ARRAY( PTYPE, NAME, ARRAY_SIZE )
-#include "mem/ruby/config/config.hh"
-#undef PARAM
-#undef PARAM_UINT
-#undef PARAM_ULONG
-#undef PARAM_BOOL
-#undef PARAM_DOUBLE
-#undef PARAM_STRING
-#undef PARAM_ARRAY
- if (m_name) {
- free( m_name );
- }
- if (m_rel_include_path) {
- free( m_rel_include_path );
- }
- if (m_config_reader) {
- delete m_config_reader;
- }
- if (m_config_filename) {
- delete m_config_filename;
- }
-}
-
-//**************************************************************************
-void initvar_t::init_config_reader( const char *initString )
-{
- int rc;
- const char *name;
-
- m_config_reader = new confio_t();
- m_config_reader->setVerbosity( false );
-
- // Initialize the config reader object to identify each parameter
-#define PARAM_UINT PARAM
-#define PARAM_ULONG PARAM
-#define PARAM_BOOL PARAM
-#define PARAM_DOUBLE PARAM
-#define PARAM( NAME ) \
- name = #NAME; \
- rc = m_config_reader->register_attribute( name, \
- initvar_get_attr, (void *) name, \
- initvar_set_attr, (void *) name );
-#define PARAM_STRING( NAME ) \
- NAME = NULL; \
- name = #NAME; \
- rc = m_config_reader->register_attribute( name, \
- initvar_get_attr, (void *) name, \
- initvar_set_attr, (void *) name );
-#define PARAM_ARRAY( PTYPE, NAME, ARRAY_SIZE ) \
- name = #NAME; \
- rc = m_config_reader->register_attribute( name, \
- initvar_get_attr, (void *) name, \
- initvar_set_attr, (void *) name );
-
-#include "mem/ruby/config/config.hh"
-#undef PARAM
-#undef PARAM_UINT
-#undef PARAM_ULONG
-#undef PARAM_BOOL
-#undef PARAM_DOUBLE
-#undef PARAM_STRING
-#undef PARAM_ARRAY
-
- // read the default configuration from the embedded text file
- rc = m_config_reader->readConfigurationString( initString );
- (*m_generate_values_f)();
-}
-
-/*------------------------------------------------------------------------*/
-/* Public methods */
-/*------------------------------------------------------------------------*/
-
-//**************************************************************************
-void initvar_t::allocate( void )
-{
- if ( confirm_init() ) {
- DEBUG_OUT("error: %s initvar::allocate() called twice\n", m_name);
- return;
- }
-
- (*m_generate_values_f)();
- (*m_allocate_f)();
- m_is_init = true;
-}
-
-//**************************************************************************
-void initvar_t::checkInitialization( void )
-{
- m_config_reader->checkInitialization();
-}
-
-//**************************************************************************
-int initvar_t::dispatch_get( void *id, void *obj,
- attr_value_t *idx )
-{
- const char *command = (const char *) id;
- if ( !confirm_init() ) {
- DEBUG_OUT("error: %s is uninitialized. unable to get \'%s\'\n", m_name, command);
- DEBUG_OUT(" : you must initialize %s with a configuration file first.\n", m_name);
- DEBUG_OUT(" : use the command \'%s0.init\'\n", m_name);
-
- return 0;
- }
-
- std::cerr << __FILE__ << "(" << __LINE__ << "): Not implmented." << std::endl;
- return 0;
-}
-
-
-//**************************************************************************
-set_error_t initvar_t::dispatch_set( void *id, void *obj,
- attr_value_t *val, attr_value_t *idx )
-{
- const char *command = (const char *) id;
-
- // DEBUG_OUT("set attribute: %s\n", command);
- if (!strcmp(command, "init")) {
- if (val->kind == Sim_Val_String) {
- if (!strcmp( val->u.string, "" )) {
- // update generated values, then allocate
- allocate();
- } else {
- read_config( val->u.string );
- allocate();
- }
- return Sim_Set_Ok;
- } else {
- return Sim_Set_Need_String;
- }
- } else if (!strcmp(command, "readparam")) {
- if (val->kind == Sim_Val_String) {
- read_config( val->u.string );
- return Sim_Set_Ok;
- } else {
- return Sim_Set_Need_String;
- }
- } else if (!strcmp(command, "saveparam")) {
- if (val->kind == Sim_Val_String) {
- FILE *fp = fopen( val->u.string, "w" );
- if (fp == NULL) {
- ERROR_OUT("error: unable to open file: %s\n", val->u.string);
- return Sim_Set_Illegal_Value;
- }
- list_param( fp );
- if (fp != NULL) {
- fclose( fp );
- }
- return Sim_Set_Ok;
- } else {
- ERROR_OUT("error: saveparam given wrong type.\n");
- return Sim_Set_Illegal_Value;
- }
- } else if (!strcmp(command, "param")) {
- if (val->kind == Sim_Val_Integer) {
- list_param( stdout );
- return Sim_Set_Ok;
- } else if ( val->kind == Sim_Val_List &&
- val->u.list.size == 2 &&
- val->u.list.vector[0].kind == Sim_Val_String ) {
- return (set_param( val->u.list.vector[0].u.string,
- &val->u.list.vector[1] ));
- } else {
- DEBUG_OUT("error: set parameter given wrong type.\n");
- return Sim_Set_Illegal_Value;
- }
- }
-
- if ( !confirm_init() ) {
- DEBUG_OUT("error: %s is uninitialized. unable to set \'%s\'\n", m_name, id);
- DEBUG_OUT(" : you must initialize %s with a configuration file first.\n", m_name);
- DEBUG_OUT(" : use the command \'%s0.init\'\n", m_name);
- return Sim_Set_Illegal_Value;
- }
-
-
- std::cerr << __FILE__ << "(" << __LINE__ << "): Not implmented." << std::endl;
- return Sim_Set_Illegal_Value;
-}
-
-/*------------------------------------------------------------------------*/
-/* Accessor(s) / mutator(s) */
-/*------------------------------------------------------------------------*/
-
-/*------------------------------------------------------------------------*/
-/* Private methods */
-/*------------------------------------------------------------------------*/
-
-/*------------------------------------------------------------------------*/
-/* Static methods */
-/*------------------------------------------------------------------------*/
-
-//**************************************************************************
-static attr_value_t initvar_get_attr( void *ptr, void *obj )
-{
- const char *name = (const char *) ptr;
- attr_value_t ret;
- memset( &ret, 0, sizeof(attr_value_t) );
-
-#define PARAM_UINT PARAM
-#define PARAM_ULONG PARAM
-#define PARAM_BOOL PARAM
-#define PARAM( NAME ) \
- if (!strcmp(name, #NAME)) { \
- ret.kind = Sim_Val_Integer; \
- ret.u.integer = NAME; \
- return (ret); \
- }
-#define PARAM_DOUBLE( NAME ) \
- if (!strcmp(name, #NAME)) { \
- ret.kind = Sim_Val_Floating; \
- ret.u.floating = NAME; \
- return (ret); \
- }
-#define PARAM_STRING( NAME ) \
- if (!strcmp(name, #NAME)) { \
- ret.kind = Sim_Val_String; \
- ret.u.string = NAME; \
- return (ret); \
- }
-#define PARAM_ARRAY( PTYPE, NAME, ARRAY_SIZE ) \
- if (!strcmp(name, #NAME)) { \
- ret.kind = Sim_Val_List; \
- ret.u.list.size = ARRAY_SIZE; \
- ret.u.list.vector = mallocAttribute( ARRAY_SIZE ); \
- for (int i = 0; i < ARRAY_SIZE; i++) { \
- ret.u.list.vector[i].u.integer = NAME[i]; \
- } \
- return (ret); \
- }
-
-#include "mem/ruby/config/config.hh"
-#undef PARAM
-#undef PARAM_UINT
-#undef PARAM_ULONG
-#undef PARAM_BOOL
-#undef PARAM_DOUBLE
-#undef PARAM_STRING
-#undef PARAM_ARRAY
-
- DEBUG_OUT("error: %s not found.\n", name);
- ret.kind = Sim_Val_Invalid;
- return (ret);
-}
-
-//***************************************************************************
-static set_error_t initvar_set_attr( void *ptr, void *obj,
- attr_value_t *value )
-{
- const char *name = (const char *) ptr;
-
-#define PARAM_UINT PARAM
-#define PARAM_ULONG PARAM
-#define PARAM( NAME ) \
- if (!strcmp(name, #NAME)) { \
- if ( value->kind != Sim_Val_Integer ) { \
- ERROR_OUT("error: %s is not an integer\n", name );\
- return Sim_Set_Need_Integer; \
- } \
- NAME = value->u.integer; \
- return Sim_Set_Ok; \
- }
-#define PARAM_BOOL( NAME ) \
- if (!strcmp(name, #NAME)) { \
- if ( value->kind != Sim_Val_String ) { \
- ERROR_OUT("error: %s is not an bool string\n", name );\
- return Sim_Set_Need_String; \
- } \
- if (!strcmp(value->u.string, "true")) { \
- NAME = true; \
- } else if (!strcmp(value->u.string, "false")) { \
- NAME = false; \
- } else { \
- ERROR_OUT("error: value %s for %s is not an bool string (set to false)\n", value->u.string, name );\
- NAME = false; \
- } \
- return Sim_Set_Ok; \
- }
-#define PARAM_DOUBLE( NAME ) \
- if (!strcmp(name, #NAME)) { \
- if ( value->kind != Sim_Val_String ) { \
- ERROR_OUT("error: %s is not a float\n", name );\
- return Sim_Set_Need_Floating; \
- } \
- NAME = atof( value->u.string ); \
- return Sim_Set_Ok; \
- }
-#define PARAM_STRING( NAME ) \
- if (!strcmp(name, #NAME)) { \
- if ( value->kind != Sim_Val_String ) { \
- ERROR_OUT("error: %s is not an string\n", name ); \
- return Sim_Set_Need_String; \
- } \
- if (NAME != NULL) { \
- free( NAME ); \
- } \
- NAME = strdup( value->u.string ); \
- return Sim_Set_Ok; \
- }
-#define PARAM_ARRAY( PTYPE, NAME, ARRAY_SIZE ) \
- if (!strcmp(name, #NAME)) { \
- if ( value->kind != Sim_Val_List ) { \
- ERROR_OUT("error: %s is not an list\n", name ); \
- return Sim_Set_Need_List; \
- } \
- if ( value->u.list.size != ARRAY_SIZE ) { \
- ERROR_OUT("error: %s has %lld elements (should be %d)\n", name, value->u.list.size, ARRAY_SIZE); \
- return Sim_Set_Illegal_Value; \
- } \
- for (int i = 0; i < ARRAY_SIZE; i++) { \
- NAME[i] = value->u.list.vector[i].u.integer; \
- } \
- return Sim_Set_Ok; \
- }
-
-#include "mem/ruby/config/config.hh"
-#undef PARAM
-#undef PARAM_UINT
-#undef PARAM_ULONG
-#undef PARAM_BOOL
-#undef PARAM_DOUBLE
-#undef PARAM_STRING
-#undef PARAM_ARRAY
-
- ERROR_OUT("error: %s not a parameter\n", name);
- return Sim_Set_Illegal_Value;
-}
-
-//***************************************************************************
-void initvar_t::read_config( const char *parameterFile )
-{
- DEBUG_OUT("read configuration: %s\n", parameterFile );
- m_config_filename = strdup( parameterFile );
- int rc = m_config_reader->readConfiguration( parameterFile,
- m_rel_include_path );
- if ( rc < 0 ) {
- ERROR_OUT("fatal error in read configuration: unable to continue.\n");
- exit(1);
- }
- // update generated values
- (*m_generate_values_f)();
-}
-
-/** sets one of the parameters */
-//**************************************************************************
-set_error_t initvar_t::set_param( const char *name, attr_value_t *value )
-{
-
- // [dann 2007-04-04] ATMTP VV
- //
- // HACK ALERT: allow setting REMOVE_SINGLE_CYCLE_DCACHE_FAST_PATH,
- // PROFILE_EXCEPTIONS, PROFILE_XACT, ATMTP_DEBUG_LEVEL and
- // ATMTP_ENABLED after initialization. This works is because ruby's
- // m_generate_values_f() does nothing -- more particularly, nothing
- // that depends on any of these parameters is pre-calculated
- // anywhere.
- //
- if (strcmp(name, "REMOVE_SINGLE_CYCLE_DCACHE_FAST_PATH") != 0 &&
- strcmp(name, "PROFILE_EXCEPTIONS") != 0 &&
- strcmp(name, "PROFILE_XACT") != 0 &&
- strcmp(name, "ATMTP_DEBUG_LEVEL") != 0 &&
- strcmp(name, "ATMTP_ENABLED") != 0) {
- //
- // [dann 2007-04-04] ATMTP ^^
- if ( confirm_init() ) {
- DEBUG_OUT("error: %s is already initialized.\n", m_name);
- DEBUG_OUT(" : setting parameters after initialization is unsupported\n");
- return (Sim_Set_Illegal_Value);
- }
- // [dann 2007-04-04] ATMTP VV
- //
- }
- //
- // [dann 2007-04-04] ATMTP ^^
-
- set_error_t result = initvar_set_attr( (void *) name, NULL, value );
- (*m_generate_values_f)();
- return (result);
-}
-
-/** print out a list of valid parameters */
-//**************************************************************************
-void initvar_t::list_param( FILE *fp )
-{
- if (!fp)
- fp = stdout;
-
-#define PARAM( NAME ) \
- fprintf( fp, "%-44.44s: %26d\n", #NAME, NAME );
-#define PARAM_UINT( NAME ) \
- fprintf( fp, "%-44.44s: %26u\n", #NAME, NAME );
-#define PARAM_ULONG( NAME ) \
- fprintf( fp, "%-44.44s: %26llu\n", #NAME, (unsigned long long)NAME );
-#define PARAM_BOOL( NAME ) \
- if (NAME == true) { \
- fprintf( fp, "%-44.44s: %26.26s\n", #NAME, "true" ); \
- } else { \
- fprintf( fp, "%-44.44s: %26.26s\n", #NAME, "false" );\
- }
-#define PARAM_DOUBLE( NAME ) \
- fprintf( fp, "%-44.44s: %26f\n", #NAME, NAME );
-#define PARAM_STRING( NAME ) \
- if ( NAME != NULL ) { \
- fprintf( fp, "%-44.44s: %26.26s\n", #NAME, NAME ); \
- }
-#define PARAM_ARRAY( PTYPE, NAME, ARRAY_SIZE ) \
- fprintf( fp, "%-44.44s: (", #NAME ); \
- for (int i = 0; i < ARRAY_SIZE; i++) { \
- if ( i != 0 ) { \
- fprintf( fp, ", " ); \
- } \
- fprintf( fp, "%d", NAME[i] ); \
- } \
- fprintf( fp, ")\n" );
-
-#include "mem/ruby/config/config.hh"
-#undef PARAM
-#undef PARAM_UINT
-#undef PARAM_ULONG
-#undef PARAM_BOOL
-#undef PARAM_DOUBLE
-#undef PARAM_STRING
-#undef PARAM_ARRAY
-}
-
-//**************************************************************************
-const char *initvar_t::get_config_name( void )
-{
- if (m_config_filename == NULL) {
- return "default";
- }
- return m_config_filename;
-}
-