#!/bin/sh

           TOP="/users/cao7/czo/dev/distrib3.2b/alliance/archi/Solaris"
     DEVEL_TOP=""
 DEVEL_VERSION="110"

#
# %% \textrm{This File Looks Nicer with\textsf{ LGrind} and \LaTeXe.}        %%
# %|                                                                         |%
# %| $Id: B.fpgen.sh,v 1.10 1997/10/30 13:27:45 fitpath Exp fitpath $          |%
# %|                                                                         |%
# %| /---------------------------------------------------------------------\ |%
# %| |                                                                     | |%
# %| |            Alliance CAD System 3.2b                                  | |%
# %| |       F p G e n   P a c k a g e   1.10                              | |%
# %| |                                                                     | |%
# %| |    Copyright(c) 95-97, ASIM, CAO-VLSI Team                          | |%
# %| |                                                                     | |%
# %| |  Author    :                Jean-Paul CHAPUT                        | |%
# %| |  E-mail    :   alliance-support@asim.lip6.fr                        | |%
# %| | =================================================================== | |%
# %| |  File      :   "<>/dev/sce/FpGen/fpgen.sh"                          | |%
# %| | ******************************************************************* | |%
# %| |  U p d a t e s                                                      | |%
# %| |                                                                     | |%
# %| \---------------------------------------------------------------------/ |%
#


# %| /---------------------------------------------------------------------\ |%
# %| |                                                                     | |%
# %| |                        Functions Definitions                        | |%
# %| |                                                                     | |%
# %| \---------------------------------------------------------------------/ |%

# --------------------------------------------------------------------------
#  Function  :  `print_banner()'.

 print_banner()
 {
   echo ""
   echo "             @@@@@@@@@                @@@@ @                        "
   echo "               @@    @              @@    @@                        "
   echo "               @@     @            @@      @                        "
   echo "               @@       @@@ @@@   @@             @@@@@   @@@ @@@    "
   echo "               @@   @    @@@  @@  @@            @     @   @@@   @   "
   echo "               @@@@@@    @@    @@ @@     @@@@@ @@     @@  @@    @@  "
   echo "               @@   @    @@    @@ @@     @ @@  @@@@@@@@@  @@    @@  "
   echo "               @@        @@    @@ @@    @  @@  @@         @@    @@  "
   echo "               @@        @@    @@  @@      @@  @@      @  @@    @@  "
   echo "               @@        @@@  @@    @@    @@    @@    @@  @@    @@  "
   echo "             @@@@@@      @@ @@@       @@@@        @@@@   @@@@  @@@@ "
   echo "                         @@                                         "
   echo "                        @@@@                                        "
   echo ""
   echo "                           Fitpath Generation Language         "
   echo ""
   echo "                 Alliance CAD System 3.2b,           fpgen 1.10 "
   echo "                 Copyright (c) 93-97,           ASIM/LIP6/UPMC "
   echo "                 E-mail support: alliance-support@asim.lip6.fr "
   echo ""
   echo ""
 }


# --------------------------------------------------------------------------
#  Function  :  `print_usage()'.

 print_usage()
 {
   echo ""
   echo "  usage: fpgen [-clknv] [--keep-exec] [--no-exec] [--no-rm-core]"
   echo "               [--keep-log] [--verbose] <progam> [-e [args]]"
   echo ""
   echo "  Options:"
   echo "    [-c|--no-rm-core] : Don't remove core file."
   echo "    [-l|--keep-log]   : Keep log file (.frr) after execution."
   echo "    [-k|--keep-exec]  : Keep binary after execution."
   echo "    [-n|--no-exec]    : Do not execute the binary."
   echo "    [-v|--verbose]    : Issue more informations."
   echo "    [-e [args]]       : [args] are passed to the binary."
   echo ""
 }


# --------------------------------------------------------------------------
#  Function  :  `vecho()'.

 vecho()
 { 
   ECHOFLAGS="" 
   if [ $1 -gt $VERBOSE ]; then return 0; fi
   if [ "$2" = "-n" ]; then
     ECHOFLAGS="-n"; shift;
   fi
   echo $ECHOFLAGS "$2" 2>&1 | tee -a $CSOURCE.frr
 }


# %| /---------------------------------------------------------------------\ |%
# %| |                                                                     | |%
# %| |                    Main Part of the Shell Script                    | |%
# %| |                                                                     | |%
# %| \---------------------------------------------------------------------/ |%


 print_banner

# --------------------------------------------------------------------------
#  Process the command line.

# If no arguments, print usage.
 if [ $# -eq 0 ]; then print_usage; exit 0; fi

  KEEP_BIN="n"
  KEEP_LOG="n"
 KEEP_CORE="n"
   VERBOSE=0
   EXECUTE="y"
 ARGUMENTS=""
   PROGRAM="not set"

#  Parse the arguments.
 while [ $# -gt 0 ]
 do
   case $1 in
     -*) NB=2; CH=`echo $1 | cut -c$NB`
	 while [ "$CH" != "" ]; do
	   case $CH in
             c) KEEP_CORE="y";;
             k) KEEP_BIN="y";;
             l) KEEP_LOG="y";;
             n) EXECUTE="n";;
             v) VERBOSE=1;;
             e) echo "fpgen:warning: misplaced -e option.";
                print_usage; exit 1;;
             *) echo "fpgen:warning: Invalid option \`$CH' (ignored)."
                print_usage;;
	   esac
           NB=`expr $NB + 1`
           CH=`echo $1 | cut -c$NB`
         done;;
     --no-rm-core) KEEP_CORE="n";;
     --keep-exec)  KEEP_BIN="n";;
     --keep-log)   KEEP_LOG="n";;
     --no-exec)    EXECUTE="n";;
     --verbose)    VERBOSE=1;;
     *)            PROGRAM=$1; shift; break;;
   esac
   shift
 done
#  Parse optionals program arguments.
 if [ $# -gt 0 ]; then
   if [ "$1" != "-e" ]; then
     echo "fpgen:warning: ignored \`$1' parameter after program name."
     print_usage
   else
     shift; ARGUMENTS="$*"
   fi
 fi
#  Check arguments coherency.
 if [ "$PROGRAM" = "not set" ]; then
   echo "fpgen:error: Missing <program> argument."
   print_usage; exit 1;
 fi
 CSOURCE=`basename $PROGRAM .c`

# Removing previously generated files.
 rm -f $CSOURCE.frr $CSOURCE.o > /dev/null 2>&1

# --------------------------------------------------------------------------
#  Print the current MBK environment.

 DEVEL_MACS=""
 if [ ! -z "$DEVEL_TOP" ]; then
   vecho 1    "  o  Alliance Devellopment environment:"
   vecho 1    "     - DEVEL_TOP       : ${DEVEL_TOP-not set}"
   vecho 1    "     - DEVEL_VERSION   : ${DEVEL_VERSION-not set}"
   DEVEL_MACS="$DEVEL_MACS     DEVEL_TOP=$DEVEL_TOP"
   DEVEL_MACS="$DEVEL_MACS DEVEL_INCLUDE=-I$DEVEL_TOP/include"
   DEVEL_MACS="$DEVEL_MACS     DEVEL_LIB=-L$DEVEL_TOP/lib "
   DEVEL_MACS="$DEVEL_MACS         FGN_H=fgn$DEVEL_VERSION.h"
   DEVEL_MACS="$DEVEL_MACS         GFP_H=gfp$DEVEL_VERSION.h"
   DEVEL_MACS="$DEVEL_MACS         FGN_L=-lFgn$DEVEL_VERSION"
   DEVEL_MACS="$DEVEL_MACS         GFP_L=-lGfp$DEVEL_VERSION"
 else
   DEVEL_MACS="$DEVEL_MACS     DEVEL_TOP=$TOP"
 fi
 if [ ! -z "$ALLIANCE_TOP" ]; then TOP=$ALLIANCE_TOP; fi

 vecho 1    "  o  Current Alliance environment:"
 vecho 1    "     - ALLIANCE_TOP    : ${ALLIANCE_TOP-not set}"
 vecho 1    "     -      MACHINE    : ${MACHINE-not set}"
 vecho 1    "  o  Current MBK environment:"
 vecho 1    "     - MBK_IN_LO       : ${MBK_IN_LO-not set}"
 vecho 1    "     - MBK_OUT_LO      : ${MBK_OUT_LO-not set}"
 vecho 1    "     - MBK_IN_PH       : ${MBK_IN_PH-not set}"
 vecho 1    "     - MBK_OUT_PH      : ${MBK_OUT_PH-not set}"
 vecho 1    "     - MBK_WORK_LIB    : ${MBK_WORK_LIB-not set}"
 vecho 1 -n "     - MBK_CATA_LIB    : "
 if [ -z "$MBK_CATA_LIB" ]; then
   vecho 1 "not set"
 else
   STRING=`echo ${MBK_CATA_LIB} |                            \
             awk 'BEGIN { FS=":"; }                          \
                  { for( i=1; i<=NF; i++) {                  \
                      printf("%s\n", $i);                    \
                      if (i < NF)                            \
                        printf("                         "); \
                    }                                        \
                  }' -`
   vecho 1 "$STRING"
 fi
 vecho 1    "     - MBK_CATAL_NAME  : ${MBK_CATAL_NAME-not set}"
 vecho 1    "     - MBK_VDD         : ${MBK_VDD-not set}"
 vecho 1    "     - MBK_VSS         : ${MBK_VSS-not set}"
 vecho 1    "     - RDS_TECHNO_NAME : ${RDS_TECHNO_NAME-not set}"
 vecho 1    "  o  FpGen Macro-Functions library:"
 vecho 1    "     - FPGEN_LIB       : ${FPGEN_LIB-not set}"
 vecho 1    ""

# Adding FPGEN_LIB to MBK_CATA_LIB.
# (needed for hierarchical analysis functions)
 MBK_CATA_LIB=$MBK_CATA_LIB:$FPGEN_LIB


# --------------------------------------------------------------------------
#  Build and execute the Makefile.

 vecho 1 "  o  Program generation."
 vecho 1 "     - Creating Makefile."
 MAKEFILE="Makefile-$$"

 cat << EOT  > $MAKEFILE
include \$(TOP)/etc/libraries.mk
include \$(TOP)/etc/\$(MACHINE).mk

include \$(DEVEL_TOP)/etc/fpgen.mk
EOT

 vecho 1 "     - Running Makefile."
 make -f $MAKEFILE       TOP=$TOP        \
                             $DEVEL_MACS \
                     CSOURCE=$CSOURCE    clean all >> $CSOURCE.frr 2>&1
 exit_code=$?
 if [ $exit_code -ne 0 ]; then
   echo "fpgen:error: Compilation failed."
   exit $exit_code
 else
   if [ "$EXECUTE" = "y" ]; then
     vecho 1 "  o  Execute program..."
     ./$CSOURCE $ARGUMENTS; exit_code=$?
     vecho 1 "     - Exit code := $exit_code."
     if [ $exit_code -ne 0 ]; then
       echo "fpgen:error: Execution failed."
     fi
     if [ "$KEEP_CORE" != "y" ]; then rm -f core >> $CSOURCE.frr 2>&1; fi
   else
     vecho 1 "  o  Execution step skipped."
   fi
 fi

 vecho 1 ""
 vecho 1 "  o  Remove temporary file."
 rm -f $MAKEFILE
 if [ "$KEEP_BIN"  != "y" ]; then rm -f $CSOURCE >> $CSOURCE.frr 2>&1; fi
 if [ \( $exit_code -eq 0 \) -a \( "$KEEP_LOG" != "y" \) ]; then
   rm -f $CSOURCE.frr > /dev/null 2>&1
 fi
 echo ""

 exit $exit_code
