#!/bin/sh
#
# This file is part of the Alliance CAD System
# Copyright (C) Laboratoire LIP6 - Dpartement ASIM
# Universite Pierre et Marie Curie
# 
# Home page          : http://www-asim.lip6.fr/alliance/
# E-mail support     : mailto:alliance-support@asim.lip6.fr
# 
# This progam is  free software; you can redistribute it  and/or modify it
# under the  terms of the GNU  General Public License as  published by the
# Free Software Foundation;  either version 2 of the License,  or (at your
# option) any later version.
# 
# Alliance VLSI  CAD System  is distributed  in the hope  that it  will be
# useful, but WITHOUT  ANY WARRANTY; without even the  implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
# 
# You should have received a copy  of the GNU General Public License along
# with the GNU C Library; see the  file COPYING. If not, write to the Free
# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#

#
# $Id: fpgen,v 1.3 1999/11/05 16:43:35 czo Exp $               
#                                                                        
# /------------------------------------------------------------------\
# |                                                                  |
# |            Alliance CAD System 3.2b                              |
# |       F p G e n   P a c k a g e   1.15                           |
# |                                                                  |
# |    Copyright(c) 95-97, ASIM, CAO-VLSI Team                       |
# |                                                                  |
# |  Author    :                Jean-Paul CHAPUT                     |
# |  E-mail    :   alliance-support@asim.lip6.fr                     |
# | ================================================================ |
# |  File      :   "<>/source/fitpath/FpGen/fpgen.sh"                |
# | **************************************************************** |
# |  U p d a t e s                                                   |
# |                                                                  |
# \------------------------------------------------------------------/
#


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


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

 print_usage()
 {
   echo ""
   echo "  usage: fpgen [-cdlknv] [--keep-exec] [--no-exec] [--no-rm-core] \\"
   echo "               [--keep-log] [--verbose] \\"
   echo "               <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                   |
# |                                                                  |
# \------------------------------------------------------------------/


 alcbanner "FpGen" "1.15" "Fitpath Generation Language" "1993"

# --------------------------------------------------------------------
# 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

     --no-rm-core) KEEP_CORE="n";;
     --keep-exec)  KEEP_BIN="n";;
     --keep-log)   KEEP_LOG="n";;
     --no-exec)    EXECUTE="n";;
     --verbose)    VERBOSE=1;;

     -*) 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;;

     *)            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.

 if [ ! -z "$ALLIANCE_TOP" ]; then     ALLIANCE_TOP=$ALLIANCE_TOP; fi
 if [ ! -z "$ALLIANCE_OS"  ]; then ALLIANCE_OS=$ALLIANCE_OS;  fi

 vecho 1    "  o  Current Alliance environment:"
 vecho 1    "     - ALLIANCE_TOP    : ${ALLIANCE_TOP-not set}"
 vecho 1    "     - ALLIANCE_OS     : ${ALLIANCE_OS-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 << EOF > $MAKEFILE

#
#
# %| /---------------------------------------------------------------------\ |%
# %| |                                                                     | |%
# %| |                   Macros and Alliance libraries                     | |%
# %| |                                                                     | |%
# %| \---------------------------------------------------------------------/ |%
#

include \$(ALLIANCE_TOP)/etc/\$(ALLIANCE_OS).mk
include \$(ALLIANCE_TOP)/etc/libraries.mk


#
# %| /---------------------------------------------------------------------\ |%
# %| |                                                                     | |%
# %| |                       MBK Additionnal Macros                        | |%
# %| |                                                                     | |%
# %| \---------------------------------------------------------------------/ |%
#

  LOCAL_ALC_IDIR = -I\$(ALLIANCE_INCLUDE)
  LOCAL_ALC_DEFS = -DALLIANCE_VERSION=\$(ALLIANCE_VERSION) \\
                   -DFGN_H='<\$(FGN_H)>' \\
                   -DGFP_H='<\$(GFP_H)>' \\
                   -DGRF_H='<\$(GRF_H)>' \\
                   -DGBS_H='<\$(GBS_H)>' \\
                   -DGAM_H='<\$(GAM_H)>' \\
                   -DRSA_H='<\$(GGA_H)>' \\
                   -DAPR_H='<\$(APR_H)>' \\
                   -DMGN_H='<\$(MGN_H)>' \\
                   -DMLU_H='<\$(MLU_H)>' \\
                   -DMLO_H='<\$(MLO_H)>' \\
                   -DMPH_H='<\$(MPH_H)>' \\
                   -DMPU_H='<\$(MPU_H)>' \\
                   -DMUT_H='<\$(MUT_H)>' \\
                   -DMGN_H='<\$(MGN_H)>' \\
                   -DBEH_H='<\$(BEH_H)>' \\
                   -DLOG_H='<\$(LOG_H)>'
  LOCAL_ALC_INCS = \$(LOCAL_ALC_IDIR) \$(LOCAL_ALC_DEFS)

  LOCAL_ALC_LDIR = -L\$(ALLIANCE_LIB)
  LOCAL_ALC_LFPG = \$(FGN_L) \\
                   \$(GFP_L)
  LOCAL_ALC_LGEN = \$(GRF_L) \\
                   \$(GBS_L) \\
                   \$(GAM_L) \\
                   \$(GGA_L)
  LOCAL_ALC_LVBE = \$(BVL_L) \\
                   \$(BEH_L) \\
                   \$(BHL_L) \\
                   \$(LOG_L)
  LOCAL_ALC_LAPR = \$(APR_L)
  LOCAL_ALC_LICO = \$(ICU_L) \\
                   \$(ICC_L) \\
                   \$(ICA_L) \\
                   \$(ICN_L)
  LOCAL_ALC_LMGN = \$(MGN_L)
  LOCAL_ALC_LMUT = \$(MUT_L)
  LOCAL_ALC_LMLO = \$(MLU_L) \\
                   \$(MLO_L) \\
                   \$(MAL_L) \\
                   \$(MCL_L) \\
                   \$(MGL_L) \\
                   \$(MEL_L) \\
                   \$(MHL_L) \\
                   \$(MSL_L) \\
                   \$(MVL_L) \\
                   \$(RCN_L)
  LOCAL_ALC_LMPH = \$(MPU_L) \\
                   \$(MPH_L) \\
                   \$(MAP_L) \\
                   \$(MCP_L) \\
                   \$(MMG_L)
  LOCAL_ALC_LIBS = \$(LOCAL_ALC_LDIR) \\
                   \$(LOCAL_ALC_LFPG) \\
                   \$(LOCAL_ALC_LGEN) \\
                   \$(LOCAL_ALC_LVBE) \\
                   \$(LOCAL_ALC_LAPR) \\
                   \$(LOCAL_ALC_LICO) \\
                   \$(LOCAL_ALC_LMGN) \\
                   \$(LOCAL_ALC_LMLO) \\
                   \$(LOCAL_ALC_LMPH) \\
                   \$(LOCAL_ALC_LMUT)

  LOCAL_STD_LIBS = -lm

#
# %| /---------------------------------------------------------------------\ |%
# %| |                                                                     | |%
# %| |                          Internal Macros                            | |%
# %| |                                                                     | |%
# %| \---------------------------------------------------------------------/ |%
#
#  C Flags for normal compilation.
 LOCAL_CFLAGS = \$(CFLAGS) -c -g -D\$(ALLIANCE_OS)
 LOCAL_OFLAGS = \$(OFLAGS) -o


#
# %| /---------------------------------------------------------------------\ |%
# %| |                                                                     | |%
# %| |                         Compilation Rules                           | |%
# %| |                                                                     | |%
# %| \---------------------------------------------------------------------/ |%
#

all: $CSOURCE

$CSOURCE: $CSOURCE.o
	\$(CC) \$(LOCAL_OFLAGS) \$@ \$? \$(LOCAL_ALC_LIBS) \$(LOCAL_STD_LIBS)
	rm -f \$?

$CSOURCE.o: $CSOURCE.c
	\$(CC) \$(LOCAL_CFLAGS) \$(LOCAL_ALC_INCS) \$?


clean:
	rm -f $CSOURCE $CSOURCE.o


EOF

 vecho 1 "     - Running Makefile."

 make -f $MAKEFILE ALLIANCE_TOP=$ALLIANCE_TOP 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

 
