#!/bin/bash
set your variables here
caches=32

M5PATH="./DICE/"
ckpt_dir="./ckpts/"
cmd_dir="./binaries/"
input_dir="./inputs/"

# Simulation parameters

# TOPO
TOPO="EPYC"
#TOPO="MeshDirCorners_XY"

# Base
cputype="DerivO3CPU"

# IOD
# FIG 17, 18
#IOD_router_latency="1"
#IOD_link_latency="1"

#IOD_router_latency="3"
#IOD_link_latency="3"

#IOD_router_latency="5"
#IOD_link_latency="5"

IOD_router_latency="4"
IOD_link_latency="2"


# Mapping
pin_to_core="0"

# ICL
# FIG 15, FIG 16
#inter_chiplet_symbol_rate="2"
#inter_chiplet_symbol_rate="4"
#inter_chiplet_symbol_rate="8"
inter_chiplet_symbol_rate="16"
#inter_chiplet_symbol_rate="32"

# inter_CCD_CC
inter_ccd_cc="No"
#inter_ccd_cc="Yes"

## CC
arch="X86"
#arch="X86_MOESI_CMP_directory"


# FIG 13, 14
### BASE_SNR
#base_SNR="45"
#base_SNR="40"
base_SNR="35"
#base_SNR="30"
#base_SNR="25"
#base_SNR="20"

save="./outputs/example/"
#########################
####### Constanct #######
#########################

l1dsize="64kB"
l1dassoc="8"

l2size="1MB"
l2assoc="16"
cl_size="64"

mem_size="32GB"
memType="DDR5_4400_4x8"
inst_num="100000"

frq="3GHz"
ibp_type="SimpleIndirectPredictor"
bp_type="TAGE_SC_L_64KB"
router_lat="1"

### Chiplet Config ###
# Core and layout
core_num="32"
dir_num="8"
# Grid Config.
num_ccd="4"
grid_rows="2"
# CCD Config.
CCD_router_latency="1"
CCD_core_count="8"
CCD_link_latency="1"
CCD_rows="2"
# IOD Config.
IOD_rows="2"
# Pining mode
chiplet_mode="mc"

mesh_rows="$((${core_num} / ${CCD_core_count}))"
run_program() {
    local program="$1"
    local dataset="$2"
    local path="$3"
    if [[ "$path" == "No" ]]; then
	    input_dir=""
    fi
    local gem5_command="${M5PATH}build/${arch}/gem5.fast \
		--outdir=${save}${program} \
		--redirect-stdout --redirect-stderr \
		${M5PATH}configs/deprecated/example/se_EPYC.py \
		--checkpoint-dir=${ckpt_dir}${program}/ -r 1 \
		--cpu-type=${cputype} \
		--restore-with-cpu=${cputype} \
		--cmd='${cmd_dir}${program};${cmd_dir}${program};${cmd_dir}${program};${cmd_dir}${program}' \
		--options='${input_dir}${dataset};${input_dir}${dataset};${input_dir}${dataset};${input_dir}${dataset}' \
		--mem-size=32GB \
		--ruby \
		--caches \
		--bp-type=${bp_type} \
		--indirect-bp-type=${ibp_type} \
		-n=${caches} \
		--l1d_size=${l1dsize} \
		--l1d_assoc=${l1dassoc} \
		--l1i_size=${l1dsize} \
		--l1i_assoc=${l1dassoc} \
		--network=garnet \
		--num-l2caches=${caches} \
		--l2_size=${l2size} \
		--l2_assoc=${l2assoc} \
		--num-dirs=${dir_num} \
		--mesh-rows=${CCD_rows} \
		--topology=${TOPO} \
		--num-ccd=${num_ccd} \
		--CCD-core-count=${CCD_core_count} \
		--CCD-router-latency=${CCD_router_latency} \
		--CCD-link-latency=${CCD_link_latency} \
		--CCD-rows=${CCD_rows} \
		--IOD-router-latency=${IOD_router_latency} \
		--IOD-link-latency=${IOD_link_latency} \
		--IOD-rows=${IOD_rows} \
		--pin-to-core=${pin_to_core} \
		--inter-chiplet-symbol-rate=${inter_chiplet_symbol_rate} \
		--inter-ccd-cc=${inter_ccd_cc} \
		--chiplet-mode=${chiplet_mode} \
		--base-snr-db=${base_SNR} \
		--router-latency=${router_lat} \
		--cpu-clock=${frq} \
		--cacheline_size=${cl_size} \
		--mem-type=${memType} \
		-I=${inst_num}"
    if [ ! -d ${save} ]; then
	    mkdir -p ${save}
    fi
    # Create a job script for this benchmark
    echo "#!/bin/sh" > "${save}${program}.sh"
    #echo "module load PROJ/9.4.1-GCCcore-13.3.0" >> "${save}${program}.sh"
    echo "${gem5_command}" >> "${save}${program}.sh"
    # Make the job script executable
    chmod +x "${save}${program}.sh"

    # Submit the job
    nohup bash "${save}${program}.sh" > ${save}${program}.log 2>&1 &
}

programs=("bc" "bfs" "cc"
	  "leela" "mcf" "omnet"
	  "lu_cb" "ocean_cp" "radix" "volrend" "radiosity"
	  "kmeans" "sc"
	  "XSBench")
datasets=("kron_g25_k20.sg" "kron_g25_k20.sg" "kron_g25_k20.sg"
	  "ref.sgf" "inp.in" "-c General -r 0"
	  "-p1 -n512" "-p1 -n258" "-p1 -n 1048576" "head 8" "-p 1 -ae 5000 -bf 0.1 -en 0.05 -room -batch"
	  "8000_128.txt -t 1" "2 3 256 1165536 1165536 1000 none output_0.txt 1"
	  "-s small -t 1")
paths=("Yes" "Yes" "Yes"
	"Yes" "Yes" "No"
	"No" "No" "No" "Yes" "No"
	"Yes" "No"
	"No")
# Run each benchmark in a separate process
for i in "${!programs[@]}"; do
    run_program "${programs[${i}]}"  "${datasets[${i}]}" "${paths[${i}]}"
done

# Wait for all background jobs to finish
wait


