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

unalias rm

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

set loaderrc = /home/pram/lib/ldrc.p4 # loaderrc-Datei
set simlog = /home/pram/bin/shsimlog

set sheap     = 1000000   # shared Heap

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

set pargs     = 1000      # Dummer default.

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

set trace     =

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:
    set trace=" -t "; 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=($*)

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 loader -o $codfile --stack $pstack --heap $pheap --shmem $shmemsize --loaderrc $loaderrc --numprocs $procnum --datastart $startoffset $file $args
     loader -o $codfile --stack $pstack --heap $pheap --shmem $shmemsize --loaderrc $loaderrc --numprocs $procnum --datastart $startoffset $file $args
set exitcode=$status
if ( ! $exitcode ) then
  if ( "$trace" != "" ) set trace="$trace$file"
  @ shmemsize += $startoffset
  echo $simlog -s -u -b $bkpr -c $virtnum -n $physnum -m $shmemsize$trace -o $codfile
       $simlog -s -u -b $bkpr -c $virtnum -n $physnum -m $shmemsize$trace -o $codfile
endif
rm -f $codfile.cod
exit $exitcode

usage:
set exitvalue=1
echo $msg
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            number of physical processors"
echo "  -virtnum $virtnum            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
