#!/bin/csh
#
# (c) 1994 by hirbli
#

set log_file = "/home/pram/lib/pramsim.log"

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

unalias rm

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

set loaderrc = /home/pram/lib/ldrc.p4
set simlog = /home/pram/bin/pramsim2.0p7

set sheap     = 1000000   # shared Heap

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

set pargs     = 1000      # Dummer default.

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    = ""

set startoffset = 65664

## parsen

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 -time:
    set strace = "/usr/5bin/time "; breaksw
  case -str:
    set strace="strace "; 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 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 ""

set codfile=/tmp/ldr.$$

echo /home/pram/bin/loader -o $codfile --stack $pstack --heap $pheap --shmem $shmemsize --loaderrc $loaderrc --numprocs $procnum --datastart $startoffset $file $args
/home/pram/bin/loader -o $codfile --stack $pstack --heap $pheap --shmem $shmemsize --loaderrc $loaderrc --numprocs $procnum --datastart $startoffset $file $args
set exitcode=$status
if ( ! $exitcode ) then
  @ shmemsize += $startoffset
  echo $strace $simlog -s -l $bkpr  -v $virtnum -p $physnum -P 50000 -M $shmemsize$trace $codfile.cod
  $strace$simlog -s -l $bkpr  -v $virtnum -p $physnum -P 50000 -M $shmemsize$trace $codfile.cod
endif
rm -f $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 "  -trace                output trace-files coff-file.*"
echo "  -version              $ver"
echo "  -help"
echo "The shown values are default values possibly changed by your options"
exit $exitvalue
