#!/lusr/bin/ksh
################################################################
#
# ss-viz: This main driver is Korn or Bash shell script. 
#
# $Revision: 1.3 $
#
################################################################
# IMPORTANT: Set the following BASE_DIR value to the top level 
# of where you unpack/install the ss-viz code:
BASE_DIR=$HOME/ss-viz
export BASE_DIR

# Note: Please set the following values according to where you
# have compiled and placed the SS benchmarks for your architecture.
#
SPEC_DIR=/p/bin/simplescalar/spec95
BENCHMARK_DIR=$SPEC_DIR/benchmarks
# 
# Set the user's results file
#
SS_LOG_NAME=ss_results.txt

printConfigMesg() {
    ConfigDir=$1
    echo "  Note:  To modify the default SimpleScalar configuration, edit the"
    echo "  .gconf and .cfg files in your $ConfigDir subdirectory."
    echo "  To restore the defaults, simply remove the whole "
    echo "  $ConfigDir subdirectory and restart ss-viz."
    echo " "
}
setupConfigFiles() 
{
    vSourceDir=$1
    userConfigDir=$HOME/.ss-viz
    if [ ! -d $userConfigDir ]
    then
	mkdir $userConfigDir
    fi
    if [ ! -f  $userConfigDir/lastrun.txt ]
    then
	cp $vSourceDir/*.gconf $userConfigDir
	cp $vSourceDir/configs/*.cfg $userConfigDir
	printConfigMesg $userConfigDir
    fi
    date > $userConfigDir/lastrun.txt
}

setOutputFile()
{
   originalPath=$1
   filePointerToNewOutputPath=$2
   weHaveSucceeded=0
   FINAL_PATH=$originalPath
   if [ -f $filePointerToNewOutputPath ]
   then
        # echo Get the new name from the $filePointerToNewOutputPath file.
	newPath=`cat $filePointerToNewOutputPath`
        # clean up
        rm -f $filePointerToNewOutputPath
	# echo New name is $newPath.
	if [ ! -d $newPath ]
	then
	    # echo This is not a directory, so can we write to it?
	    touch $newPath > /dev/null 2>&1
	    failureFlag=$?
	    if [[ "$failureFlag" == 0 ]]
	    then
		weHaveSucceeded=1
		FINAL_PATH=$newPath
	    fi
	fi
   else
       weHaveSucceeded=1
   fi

echo " "  >> $OUTPUT_PATH
   if [[ $weHaveSucceeded == 0 ]]
   then
	echo " "  
	echo " "  >> $OUTPUT_PATH
	echo "  Unable to save \"$originalPath\" as \"$newPath\"."
	echo "  Unable to save \"$originalPath\" as \"$newPath\"." >> $OUTPUT_PATH
	echo "  Using $FINAL_PATH instead."
	echo "  Using $FINAL_PATH instead." >> $OUTPUT_PATH
	echo " "  
	echo " "  >> $OUTPUT_PATH
   fi
}
# We are looking for ss-viz commands of the form:
#
# ss-viz  [-switch [option]] [-switch [option]]
#
# ss-viz  <benchmark> [-switch [option]] [-switch [option]]
#
# ss-viz  <benchmark> <input> [-switch [option]] [-switch [option]]
# 
# These break down as follows:
# 
# PARMS: 0      1           2
# A: ss-viz  
# B: ss-viz -switch [other_options_and_switches]
# C: ss-viz  <benchmark> [-switch [other_options_and_switches]]
# D: ss-viz  <benchmark> <input> [-switch [other_options_and_switches]]
# 
# Now let's write a parser.  Yuck.
# 
# We start nice and simple:
COMMAND_FORMAT="A"
if [ ! -z $1 ]
then
    # FIRST param
    ONE=$1
    shift
    if [[ $ONE = -* ]]
    then
	    # echo 1st parameter, $ONE, starts with a dash
	    COMMAND_FORMAT="B"
	    # echo Current Format: $COMMAND_FORMAT
    else
	    # echo 1st parameter, $ONE, gotta be the name of the benchmark
	    COMMAND_FORMAT="C"
	    # echo Current Format: $COMMAND_FORMAT
    fi
    if [ ! -z $1 ]
    then
	# SECOND param
	TWO=$1
	shift
	if [[ $TWO = -* ]]
	then
	    # echo 2nd parameter $TWO starts with a dash
	    if [[ $COMMAND_FORMAT == "B" ]]
	    then
		COMMAND_FORMAT="B"
	    elif [[ $COMMAND_FORMAT == "C" ]]
	    then
		COMMAND_FORMAT="C"
	    else
		COMMAND_FORMAT="D"
	    fi
	else
	    if [[ $COMMAND_FORMAT == "B" ]]
	    then
		COMMAND_FORMAT="B"
	    else
		# echo $TWO: no dash: must be the input file specifier
		COMMAND_FORMAT="D"
	    fi
	fi
	if [ ! -z $1 ]
	then
	    # THIRD param
	    REST=$*
	    if [[ $COMMAND_FORMAT == "C" ]]
	    then
		REST=${TWO}" "${REST}
		TWO=""
	    fi
	fi
    fi
fi
#
# The COMMAND invocation is typically and simply "ss-viz",
# but the COMMAND can include the complete pathname to the executable.
#
COMMAND=$0
FIRST_PARAM=$ONE
SECOND_PARAM=$TWO

# echo "COMMAND: $COMMAND"
# echo "FIRST: $FIRST_PARAM"
# echo "SECOND: $SECOND_PARAM"
# echo "REST: $REST"
# echo "FORMAT: $COMMAND_FORMAT"
MY_NAME=`basename $COMMAND`

SETUP_FILE_DIR=$BASE_DIR
SETUP_FILE=ss-viz-setup

SS_EXECUTABLE_DIR=$BASE_DIR/src
SS_EXECUTABLE=sswish

VISUAL_SOURCE_DIR="$BASE_DIR/ui"
export VISUAL_SOURCE_DIR
# echo The GUI simulator base directory is $BASE_DIR...
# echo The ui code directory is $VISUAL_SOURCE_DIR

SPEC_DIR=/p/bin/simplescalar/spec95
BENCHMARK_DIR=$SPEC_DIR/benchmarks
if [[ $COMMAND_FORMAT == "A" ]]
then
    # Random SimpleScalar options, included simply for illustration:
    #
    # These command line arguments take precedence over the values in the
    # the -config file specs, which take precedence over the built-in
    # SimpleScalar defaults.
    #
    REST="-lsq:size 8 -ruu:size 16 -res:fpmult 1 -res:ialu 4"

    BENCHMARK_FILE=compress95.ss
    COMESFROM_FILE=test.in
    COMESFROM_PATH=$SPEC_DIR/inputs/129.compress/train/$COMESFROM_FILE
    # COMESFROM_PATH=$SPEC_DIR/inputs/129.compress/test/$COMESFROM_FILE

    # BENCHMARK_FILE=mgrid.ss
    # COMESFROM_FILE=mgrid.2it.in
    # COMESFROM_FILE=mgrid.4it.in
    # COMESFROM_PATH=$SPEC_DIR/inputs/107.mgrid/test/$COMESFROM_FILE

    # BENCHMARK_FILE=cc1.ss
    # COMESFROM_FILE=genoutput.i
    # COMESFROM_FILE=insn-recog.i
    # COMESFROM_PATH=$SPEC_DIR/inputs/126.gcc/test/$COMESFROM_FILE

    # BENCHMARK_FILE=fpppp.ss
    # COMESFROM_FILE=natoms.in
    # COMESFROM_PATH=$SPEC_DIR/inputs/145.fpppp/train/$COMESFROM_FILE


    # Put it together:
    BENCHMARK_PATH=$BENCHMARK_DIR/$BENCHMARK_FILE
else
    # We are invoking the simulator manually with all the 
    # path information passed through the command line
    BENCHMARK_PATH=$FIRST_PARAM
    COMESFROM_PATH=$SECOND_PARAM
fi
SAFE_OUTPUT_PATH=${HOME}/${SS_LOG_NAME}
if [ -z "$OUTPUT_PATH" ]
then
    OUTPUT_PATH=$SAFE_OUTPUT_PATH
fi
# otherwise, a pathname was passed in to us, so go with it
NEW_OUTPUT_PATH_STORAGE=/tmp/.${SS_LOG_NAME}
#
# Determine the new ss log path--the setOutputFile() function 
# will return the name in $FINAL_PATH
#
setOutputFile "$OUTPUT_PATH" "$NEW_OUTPUT_PATH_STORAGE"
OUTPUT_PATH=$FINAL_PATH
touch $OUTPUT_PATH
chgrp cartel $OUTPUT_PATH > /dev/null 2>&1
chmod 664 $OUTPUT_PATH > /dev/null 2>&1
echo "  Hello, $LOGNAME.  "  
echo "  Hello, $LOGNAME.  "  >> $OUTPUT_PATH
echo " "  
echo " "  >> $OUTPUT_PATH
echo "  Running the SimpleScalar Visualizer on this benchmark:"  
echo "  Running the SimpleScalar Visualizer on this benchmark:"  >> $OUTPUT_PATH
echo "  '$BENCHMARK_PATH'"  
echo "  '$BENCHMARK_PATH'"  >> $OUTPUT_PATH
echo " "  
echo " "  >> $OUTPUT_PATH
if [ ! -z $COMESFROM_PATH ]
then
    echo "  Working from this dataset: "  
    echo "  Working from this dataset: "  >> $OUTPUT_PATH
    echo "  '$COMESFROM_PATH'"  
    echo "  '$COMESFROM_PATH'"  >> $OUTPUT_PATH
    echo " "  
    echo " "  >> $OUTPUT_PATH
fi

setupConfigFiles $VISUAL_SOURCE_DIR
echo "  Saving the simulator output as \"$OUTPUT_PATH\"."  
echo "  Saving the simulator output as \"$OUTPUT_PATH\"."  >> $OUTPUT_PATH
POSTOPS=""
BENCHMARK_IO=""
# first, set up the expectations of each benchmark
if [[ $BENCHMARK_PATH == "$BENCHMARK_DIR/compress95.ss" ]]
then
    BENCHMARK_IO="<"
elif [[ $BENCHMARK_PATH == "$BENCHMARK_DIR/mgrid.ss" ]]
then
    BENCHMARK_IO="<"
elif [[ $BENCHMARK_PATH == "$BENCHMARK_DIR/cc1.ss" ]]
then
    BENCHMARK_IO=""
    POSTOPS="-o genoutput.s"
elif [[ $BENCHMARK_PATH == "$BENCHMARK_DIR/fpppp.ss" ]]
then
    BENCHMARK_IO="<"
fi
# now, adjust for the way the tool has been invoked
if [[ $COMMAND_FORMAT == "A" ]]
then
	echo "" 
elif [[ $COMMAND_FORMAT == "B" ]]
then
	echo ""
elif [[ $COMMAND_FORMAT == "C" ]]
then
	echo ""
	BENCHMARK_IO=""
	COMESFROM_PATH=""
	POSTOPS=""
else
    # full-featured "D"
	echo ""
fi
CONFIG_OPTS=""
if [ -f $HOME/.ss-viz/cpu.cfg ]
then
    CONFIG_OPTS="-config $HOME/.ss-viz/cpu.cfg"
fi
if [ -f $HOME/.ss-viz/mem.cfg ]
then
    CONFIG_OPTS="${CONFIG_OPTS} -config $HOME/.ss-viz/mem.cfg"
fi
FINAL_EXEC_STRING="OUTPUT_PATH=$OUTPUT_PATH BENCHMARK_PATH=$BENCHMARK_PATH COMESFROM_PATH=$COMESFROM_PATH OPTIONS='$REST' APP_NAME=$MY_NAME $SS_EXECUTABLE_DIR/$SS_EXECUTABLE $CONFIG_OPTS $REST $BENCHMARK_PATH $BENCHMARK_IO $COMESFROM_PATH $POSTOPS 2>$OUTPUT_PATH"
echo $FINAL_EXEC_STRING > /tmp/ss-exec.$$
#
# A sanity check
# echo $FINAL_EXEC_STRING 
#
TIME=`date`
echo " " >> $OUTPUT_PATH
echo "  Beginning the visualization on $TIME..." 
echo "  Beginning the visualization on $TIME..." >> $OUTPUT_PATH
# Let us run
sh /tmp/ss-exec.$$
# Done with this game
rm -f /tmp/ss-exec.$$
echo " " 
echo " "  >> $OUTPUT_PATH
echo "  Thank you very much." 
echo "  Thank you very much."  >> $OUTPUT_PATH
echo " "  
echo " "  >> $OUTPUT_PATH
TIME=`date`
echo "  Time is now $TIME."  
echo "  Time is now $TIME."  >> $OUTPUT_PATH
##############         eof     ####################################
