#!/bin/bash

if [ ! $# == 3 ]; then
    echo "Usage: $0 [NUM_PROCS] [MEM_SIZE_MB] [all | <apache | zeus | jbb | oltp> ]"
    exit
fi

ROOT_DIR=$PWD

. system.conf || exit
. workload.conf || exit

############################################################
## build the workload on the (possibly remote) sparc machine
############################################################

if [ ${WORKLOAD_CLEAN_BUILD} = "true" ]; then
    if [ -d ${WORKLOAD_BUILD_DIR} ]; then
        rm -rf ${WORKLOAD_BUILD_DIR}
    fi
fi

if [ ! -d ${WORKLOAD_BUILD_DIR} ]; then
    mkdir -p ${WORKLOAD_BUILD_DIR}
fi

#only log on to the remote machine is the source has not been compiled yet
if [ $3 = "apache" ]; then
    if [ ! -f ${WORKLOAD_BUILD_DIR}/apache.built ] || 
       [ ! -f ${WORKLOAD_BUILD_DIR}/surge.built  ] || 
       [ ! -f ${WORKLOAD_BUILD_DIR}/htdocs.built ]; then

        # first copy the files to the build machine
        echo "Enter Password for " ${SPARC_MACHINE_LOGIN}@${SPARC_MACHINE}
        scp -r remote_build/* system.conf workload.conf ${SPARC_MACHINE_LOGIN}@${SPARC_MACHINE}:${SPARC_MACHINE_BUILD_DIR} 
    
        # then exectue the remote build script to compile the workloads
        echo "Enter Password for " ${SPARC_MACHINE_LOGIN}@${SPARC_MACHINE}
        ssh ${SPARC_MACHINE_LOGIN}@${SPARC_MACHINE} "cd ${SPARC_MACHINE_BUILD_DIR}; remote-build.sh $3" || exit
    
        # now grab the built files for transfer into simics
        if [ ! -f ${WORKLOAD_BUILD_DIR}/apache.built ]; then
            scp -r ${SPARC_MACHINE_LOGIN}@${SPARC_MACHINE}:${SPARC_MACHINE_BUILD_DIR}/build/apache ${WORKLOAD_BUILD_DIR} || exit
            touch ${WORKLOAD_BUILD_DIR}/apache.built
        fi
        if [ ! -f ${WORKLOAD_BUILD_DIR}/surge.built ]; then
            scp -r ${SPARC_MACHINE_LOGIN}@${SPARC_MACHINE}:${SPARC_MACHINE_BUILD_DIR}/build/surge ${WORKLOAD_BUILD_DIR} || exit
            touch ${WORKLOAD_BUILD_DIR}/surge.built
        fi
        if [ ! -f ${WORKLOAD_BUILD_DIR}/htdocs.built ]; then
            scp -r ${SPARC_MACHINE_LOGIN}@${SPARC_MACHINE}:${SPARC_MACHINE_BUILD_DIR}/build/htdocs ${WORKLOAD_BUILD_DIR} || exit
            touch ${WORKLOAD_BUILD_DIR}/htdocs.built
        fi
    fi
fi
if [ $3 = "jbb" ]; then
    if [ ! -f ${WORKLOAD_BUILD_DIR}/magic-call.built ]; then
        echo "Enter Password for " ${SPARC_MACHINE_LOGIN}@${SPARC_MACHINE}
        scp -r remote_build/magic-call/* remote_build/remote-build.sh system.conf workload.conf ${SPARC_MACHINE_LOGIN}@${SPARC_MACHINE}:${SPARC_MACHINE_BUILD_DIR} 

        echo "Enter Password for " ${SPARC_MACHINE_LOGIN}@${SPARC_MACHINE}
        ssh ${SPARC_MACHINE_LOGIN}@${SPARC_MACHINE} "cd ${SPARC_MACHINE_BUILD_DIR}; remote-build.sh magic-call" || exit   

        # now grab the built files for transfer into simics
        scp -r ${SPARC_MACHINE_LOGIN}@${SPARC_MACHINE}:${SPARC_MACHINE_BUILD_DIR}/build/magic-call ${WORKLOAD_BUILD_DIR} || exit
        touch ${WORKLOAD_BUILD_DIR}/magic-call.built
    fi
    if [ ! -f ${WORKLOAD_BUILD_DIR}/SPECjbb2000.built ]; then
        jbb-build.sh || exit
        touch ${WORKLOAD_BUILD_DIR}/SPECjbb2000.built
    fi
fi

#############################################################
## Now copy the built code and/or dependent files into the Simics guest
## start execution, and checkpoin the state
#############################################################

export NUM_PROCESSORS=$1
export MEMORY_SIZE_MB=$2
export WORKLOAD=$3
export SIMICS_SCRIPT_DIR=${ROOT_DIR}/simics_scripts
export HOST_BUILD_DIR=${WORKLOAD_BUILD_DIR}
export INSTALL_PREFIX=${SPARC_MACHINE_BUILD_DIR}/build
export NAKED_CHECKPOINT_DIR=${NAKED_CHECKPOINT_DIR}/simics-${SIMICS_MAJOR_VERSION}.x 
export NAKED_CHECKPOINT_FAMILY_NAME
export WORKLOAD_CHECKPOINT_DIR
export JRE_ABSOLUTE_PATH
export SURGE_CLIENT_MAX_THINKTIME
export SURGE_THREADS_PER_PROC
export TARGET_NI_IP_ADDRESS
cp simics_scripts/mfacet.py ${SIMICS_DIR}/home/sarek
cd ${SIMICS_DIR}/home/sarek || exit
ls

if [ ! -f ${WORKLOAD_CHECKPOINT_DIR}/${WORKLOAD}_cold-${1}p-${2}mb.check ]; then
    for j in cold warm ; do
        export BUILD_MODE="$j"
        ./simics -x ${ROOT_DIR}/simics_scripts/start_workload.simics
    done
elif [ ! -f ${WORKLOAD_CHECKPOINT_DIR}/${WORKLOAD}_warm-${1}p-${2}mb.check ]; then
    for j in warm ; do
        export BUILD_MODE="$j"
        ./simics -x ${ROOT_DIR}/simics_scripts/start_workload.simics
    done
fi
