#!/bin/csh
#
# (C) 1994 by Michael Bosch (hirbli@cs.uni-sb.de)
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted, provided
# that the above copyright notice appear in all copies.

unalias rm

alias usage 'set msg=\!:1; goto usage'
set ver="0v2 (c) 1994 by hirbli"

set pramdir = /home/pram
set bindir = $pramdir/bin
set libdir = $pramdir/lib

#set log_file = "$libdir/pramsim.log"

#echo -n "start: $user $HOST $$ ">> $log_file
#date >> $log_file

set loaderrc = $libdir/ldrc.p4
set simlog = $bindir/pramsim
set pbs = $libdir/sbo_pbs.cod
set timep = /usr/5bin/time

set simopt = ""

set sheap     = 1000000   # shared Heap

set pstack    = 20000     # lokaler Stack
set pheap     = 50000     # lokaler Heap

set pargs     = 1000      # Dummer default.

# Wegen Prozessornummer bei getnr.
set maxphysnum = 128
set maxvirtnum = 32

set physnum   = 1 # Zahl der physikalischen Prozessoren
set virtnum   = 4 # Zahl der virtuellen Prozessorenn pro pP

set trace     = ""

set strace    = ""

# !=0 wg Startupcode
# 128k wegen sbo_pbs
set datastart = 131072

# 1k wegen sbo_pgs
set programstart = 1024

while($#argv > 0)
  switch($1)
  case -sheap:
    shift; set sheap=$1; breaksw
  case -pstack:
    shift; set pstack=$1; breaksw
  case -pheap:
    shift; set pheap=$1; breaksw
  case -physnum:
    shift; set physnum=$1; breaksw
  case -virtnum:
    shift; set virtnum=$1; breaksw
  case -procs:
    shift; set physnum=$1; shift; set virtnum=$1; breaksw
  case -loaderrc:
    shift; set loaderrc=$1; breaksw
  case -simlog:
    shift; set simlog=$1; breaksw
  case -trace:
    shift; set trace=" --trace $1"; breaksw
  case -str:
    set strace="strace "; breaksw
  case -simopt:
    shift; set simopt=" $1"; breaksw
  case -version:
    echo $ver; exit 0
  case -help:
    set exitvalue=0
    goto help
  case -*:
    usage "unknown option $1"
  default:
    goto argument
  endsw
  shift
end
usage "You could at least specify a coff-file"

argument:
set file=$1
shift
set args=($*)

if ( $physnum > $maxphysnum || $physnum < 1 ) then
  usage "physnum out of range (1..$maxphysnum)"
endif
if ( $virtnum > $maxvirtnum || $virtnum < 1 ) then
  usage "virtnum out of range (1..$maxvirtnum)"
endif

set codfile=/tmp/ldr.$$
set progfile=/tmp/prg.$$

switch($file)
case *.gz:
  gunzip $file >$progfile
  set file=$progfile
  breaksw
endsw

onintr aufraeumen

set vals=(`objdump --header $file | awk 'BEGIN{pbss=0;pdata=0;sbss=0;sdata=0} /.gpbss/{pbss=$6} /.gpdata/{pdata=$6} /.gsbss/{sbss=$6} /.gsdata/{sdata=$6} END{print pdata, pbss, sdata, sbss}' | hex2dez -`)
@ pdata = $vals[1] / 4
@ pbss = $vals[2] / 4
@ sdata = $vals[3] / 4
@ sbss = $vals[4] / 4

@ private = $pheap + $pstack + $pdata + $pbss + $pargs
@ shared = $sdata + $sbss + $sheap + 11
@ procnum = $physnum * $virtnum
@ bkpr = 1
@ shmemsize = $private * $procnum + $shared

echo "section private shared"
echo "lddata		11"
echo "stack	$pstack"
echo "heap	$pheap	$sheap"
echo "data	$pdata	$sdata"
echo "bss	$pbss	$sbss"
echo "args	$pargs"
echo "       ----------------"
echo "$procnum *	$private +	$shared = $shmemsize Words"
if ( $procnum == 1 ) then
  @ additional = $pdata + $pbss + $pargs
  @ shmemsize += $additional
  echo "Using only one processor. Additional $additional bytes."
endif
echo ""

# loader
set run="$bindir/loader -o $codfile --stack $pstack --heap $pheap --shmem $shmemsize --loaderrc $loaderrc --numprocs $procnum --datastart $datastart --textstart $programstart $file $args"
rm -f $progfile
echo $run
$run
set exitcode=$status

# simulator
if ( ! $exitcode ) then
  @ shmemsize += $datastart
  set run="$timep $strace$simlog -s -i$simopt -l $bkpr -v $virtnum -p $physnum -P 500000 -M $shmemsize$trace $pbs $codfile.cod"
  echo $run
  $run
endif

aufraeumen:
rm -f $progfile $codfile.cod
#echo -n "end:   $user $$ ">> $log_file
#date >> $log_file
exit $exitcode

usage:
set exitvalue=1
echo "$msg"
echo "help with $0 -help"
exit $exitvalue
help:
echo "usage: $0 [options] coff-file args-for-pram-program"
echo "  -sheap $sheap        shared heap used by shmalloc()"
echo "  -pstack $pstack         private stack"
echo "  -pheap $pheap          private heap used by malloc()"
echo "  -physnum $physnum            (1..$maxphysnum) number of physical processors"
echo "  -virtnum $virtnum            (1..$maxvirtnum) number of virtual processors per physical"
echo "  -procs $physnum $virtnum            -physnum and -virtnum combined"
echo "  -loaderrc $loaderrc"
echo "  -simlog $simlog"
echo "  -simopt $simopt"
echo "  -trace                output trace-files coff-file.*"
echo "  -str                  strace simulator"
echo "  -version              $ver"
echo "  -help"
echo "The shown values are default values possibly changed by your options"
exit $exitvalue
