#! /bin/sh
######################################
##### Model Transformation Tools #####
######################################
# Bourne shell script: mtt_m2p
# Reduce octave 2 Pascal converter for MTT
# P.J.Gawthrop July 1998
# Copyright (c) P.J.Gawthrop 1998
###############################################################
## Version control history
###############################################################
## $Id$
## $Log$
## Revision 1.8 1998/07/26 19:38:17 peterg
## Replaced t0..t9 by mtt_temp0..
##
## Revision 1.7 1998/07/25 20:06:23 peterg
## Does the mtt_update function
##
## Revision 1.6 1998/07/25 16:59:40 peterg
## Give other procedures local i,j vars.
##
## Revision 1.5 1998/07/25 15:06:17 peterg
## Added DDT VAR
##
## Revision 1.4 1998/07/25 15:05:54 peterg
## DD
##
## Revision 1.3 1998/07/25 14:03:30 peterg
## Added () to [] conversion when the variable is i j k or an integer or
## combination
##
## Revision 1.2 1998/07/25 12:39:57 peterg
## begin on same line as for and if
##
## Revision 1.1 1998/07/25 09:42:52 peterg
## Initial revision
##
###############################################################
# Set up variables
args=`echo $1 | sed 's/_/ /' | sed 's/\./ /'`
Sys=`echo $args | awk '{print $1}'`
sys=`echo $Sys | awk '{print tolower($1)}'`
rep=`echo $args | awk '{print $2}'`
Sys_rep="$Sys""_""$rep"
Filename="$Sys""_""$rep.p"
filename="$sys""_""$rep.p"
# Inform user
echo Creating $Filename
# Find system constants
Nx=`grep "MTTNx " <$Sys\_def.r | awk '{print $3}' | sed 's/;//'`
Nu=`grep "MTTNu " <$Sys\_def.r | awk '{print $3}' | sed 's/;//'`
Ny=`grep "MTTNy " <$Sys\_def.r | awk '{print $3}' | sed 's/;//'`
# Heading
(case $rep in
state)
echo "PROCEDURE $Sys_rep(VAR mttx : StateVector);"
;;
input)
echo "PROCEDURE $Sys_rep(VAR mttu : InputVector;"
echo " mttx : StateVector;"
echo " mttt : REAL);"
;;
ode)
echo "PROCEDURE $Sys_rep(VAR mttdx: StateVector;"
echo " mttx : StateVector;"
echo " mttu : InputVector;"
echo " mttt : REAL);"
;;
odeo)
echo "PROCEDURE $Sys_rep(VAR mtty : OutputVector;"
echo " mttx : StateVector;"
echo " mttu : InputVector;"
echo " mttt : REAL);"
;;
ode2odes)
echo "PROGRAM $Sys_rep;"
echo "TYPE"
echo " StateVector =ARRAY[1..$Nx] OF REAL;"
echo " InputVector =ARRAY[1..$Nu] OF REAL;"
echo " OutputVector =ARRAY[1..$Ny] OF REAL;"
echo " IntegrationMethod = (Euler,ImplicitL,Implicit);"
echo "VAR"
echo " MTTt,mttLAST,mttDT,mttDDT : REAL;"
echo " mttx,mttdx : StateVector;"
echo " mttu : InputVector;"
echo " mtty : OutputVector;"
echo " MTTi,MTTj,MTTit,MTTiLast,mttSTEPFACTOR : INTEGER;"
echo " mttMETHOD : STRING;"
;;
switch)
echo "PROCEDURE $Sys_rep(VAR mttxs : StateVector;"
echo " mttx : StateVector);"
echo "VAR"
echo " MTTi,MTTj : INTEGER;"
;;
*) echo "PROCEDURE $Sys_rep;"
echo "VAR"
echo " MTTi,MTTj : INTEGER;"
;;
esac) > $Filename
cat<<EOF >> $Filename
{*** System $Sys, rep $rep, language Pascal, file $Filename ***}
{*** Translated by MTT from $Sys_rep.m on `date` ***}
EOF
#Regexps
name="[a-zA-Z0-9]*"
fun_name="$Sys\_$name"
mttfun_name="mtt_update"
space="[ \t]*"
spaces="[ \t][ \t]*"
non_space="[^ ]*"
# Body
grep -v '^[ ]*function' < $Sys_rep.m | sed "s/^$space%/#/" |\
awk -F# '{printf("%s",$1)
if (NF>1) printf("{* %s *}", $2)
printf("\n")
}' |\
sed "s/$space\[\($non_space\)\]$spaces=$spaces\($fun_name\)(\([a-zA-Z0-9,]*\))/\2(\1,\3)/" |\
sed "s/$space\[\($non_space\)\]$spaces=$spaces\($mttfun_name\)(\([a-zA-Z0-9,]*\))/\2(\1,\3)/" |\
sed "s/$space\[\($non_space\)\]$spaces=$spaces\($fun_name\)/\2(\1)/" |\
sed "s/$space\($non_space\)$spaces=$spaces\($fun_name\)(\([a-zA-Z0-9,]*\))/\2(\1,\3)/" |\
sed "s/$space\($non_space\)$spaces=$spaces\($fun_name\)/\2(\1)/" |\
awk '
BEGIN{
comment_regexp = "{"
doing_header = 0
doing_globals = 0
Nt = 9
inc ="$I"
}
{
if ($1=="global")
doing_globals = 1
else{
if (doing_globals==1){
if (match($1,";")==0){
global[++i]=$1;
}
else{
doing_globals = 0
doing_header = 1
}
}
else
{
if (doing_header==1){
if (rep=="ode2odes"){
printf("VAR ");
for (k=1;k<i;k++) printf("%s,",global[k])
printf("%s : REAL;\n", global[i])
printf("VAR "); for (k=1;k<=Nx;k++) printf("mttx%i,", k)
for (k=1;k<=Nu;k++) printf("mttu%i,", k)
for (k=1;k<=Nt;k++) printf("mtt_temp%i,", k)
printf("t%i : REAL;\n",Nt)
printf("{%s sign.p}\n",inc,sys)
printf("{%s mtt_update.p}\n",inc,sys)
printf("{%s mtt_write.p}\n",inc,sys)
printf("{%s %s_simpar.p}\n",inc,sys)
printf("{%s %s_numpar.p}\n",inc,sys)
printf("{%s %s_state.p}\n",inc,sys)
printf("{%s %s_input.p}\n",inc,sys)
printf("{%s %s_ode.p}\n",inc,sys)
printf("{%s %s_odeo.p}\n",inc,sys)
printf("{%s %s_switch.p}\n",inc,sys)
}
for (k=1;k<=j;k++) printf("%s\n", comment[k])
printf("\n")
printf("\nBEGIN\n")
doing_header = 0;
}
if (match($1,comment_regexp)>0){
if (doing_header==1)
comment[++j] = $0
else
printf("%s\n", $0)
}
else {
if ($1=="if") {
sub(/==/, "=", $0)
printf("%s THEN BEGIN\n", $0)
}
else{
if ($1=="for"){
sub(/:/," TO ",$0)
sub(/=/,":=",$0)
printf("%s DO BEGIN\n", $0)
}
else {
sub(/=/,":=",$0)
gsub(/\^/,"**",$0)
gsub(/&&/," AND ",$0)
gsub(/\|\|/," OR ",$0)
printf("%s\n",$0)
}
}
}
}
}
}
END{
if (rep=="def"){
printf("EULER = 1,\n")
printf("IMPLICITL = 2;\n")
printf("IMPLICIT = 3;\n")
}
else
if (rep=="ode2odes")
print "END."
else
print "END;"
}' sys=$sys rep=$rep Nx=$Nx Nu=$Nu |\
sed 's/(\([ijk0-9,]*\))/\[\1\]/g' |\
sed 's/(\(MTT[ijk0-9,]*\))/\[\1\]/g' \
>> $Filename
# p2c doesn't like mixed case filenames!
if [ "$Filename" != "$filename" ]; then
echo Creating $filename
cp -f $Filename $filename
fi