From c6793adf4fbc3de14df265487d14d9afa4fee77b Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Mon, 15 Jul 2002 22:19:26 +0000 Subject: [PATCH] * genlib/src/dpgen_RAM.c, genlib/src/dpgen_ROM.c, genlib/src/dpgen_ROM_code.y, genlib/src/dpgen_Macro.c, genlib/src/dgn.h : - Ajout des generateurs de RAM & de ROM. Trois nouvelles fonctions : DPGEN_RAM DPGEN_ROM DPGEN_ROMTS - La ROM n'est pas encore utilisable : la filasse de codage est en commentaire. - La lecture des ".vbe" source de la ROM n'a pas ete testee (c'est la reprise de celui de grog). --- alliance/src/genlib/configure.in | 5 +- alliance/src/genlib/man3/DPGEN_SHROT.3 | 75 ++ alliance/src/genlib/src/Makefile.am | 11 +- alliance/src/genlib/src/dgn.h | 21 +- alliance/src/genlib/src/dpgen_Defs.h | 23 +- alliance/src/genlib/src/dpgen_Macro.c | 17 +- alliance/src/genlib/src/dpgen_RAM.c | 629 +++++++++++++++ alliance/src/genlib/src/dpgen_ROM.c | 988 +++++++++++++++++++++++ alliance/src/genlib/src/dpgen_ROM_code.y | 739 +++++++++++++++++ alliance/src/genlib/src/genlib.sh | 5 +- 10 files changed, 2495 insertions(+), 18 deletions(-) create mode 100644 alliance/src/genlib/man3/DPGEN_SHROT.3 create mode 100644 alliance/src/genlib/src/dpgen_RAM.c create mode 100644 alliance/src/genlib/src/dpgen_ROM.c create mode 100644 alliance/src/genlib/src/dpgen_ROM_code.y diff --git a/alliance/src/genlib/configure.in b/alliance/src/genlib/configure.in index 43e29dbb..f6659de9 100644 --- a/alliance/src/genlib/configure.in +++ b/alliance/src/genlib/configure.in @@ -25,7 +25,7 @@ dnl Almost ten years since I wrote this stuff, I just can't dnl believe it dnl Date : 01/02/2002 dnl Author : Frederic Petrot -dnl $Id: configure.in,v 1.4 2002/05/24 18:34:23 jpc Exp $ +dnl $Id: configure.in,v 1.5 2002/07/15 22:19:11 jpc Exp $ dnl dnl AC_INIT(src/genlib.c) @@ -38,6 +38,9 @@ AC_C_CONST AC_TYPE_SIGNAL AC_PROG_RANLIB AC_CHECK_PROG(SED, sed, sed) +AM_PROG_LEX +AC_PROG_YACC +AC_PROG_MAKE_SET changequote(,)dnl if test -z $SED ; then diff --git a/alliance/src/genlib/man3/DPGEN_SHROT.3 b/alliance/src/genlib/man3/DPGEN_SHROT.3 new file mode 100644 index 00000000..aa5673d8 --- /dev/null +++ b/alliance/src/genlib/man3/DPGEN_SHROT.3 @@ -0,0 +1,75 @@ +.\\" auto-generated by docbook2man-spec $Revision: 1.1 $ +.TH "DPGEN_SHROT" "3" "17 June 2002" "ASIM/LIP6" "Alliance - genlib User's Manual" +.SH NAME +DPGEN_SHROT \- Shift/Rotation Macro-Generator +.SH SYNOPSIS +\fB#include +.sp +void GENLIB_MACRO( +.nf +.ta 7n +20n + DPGEN_SHROT, + char *\fImodelname\fB, + long \fIflags\fB, + long \fIN\fB +); +.fi +\fR.SH "DESCRIPTION" +.PP +Generate a \fIN\fR bits shift/rotation operator with name \fImodelname\fR. +.PP +How it works : +.TP 0.2i +\(bu +if the op[0] signal is set to '1' +right shift/rotation occurs, otherwise left shift/rotation +occurs. +.TP 0.2i +\(bu +if the op[1] signal is set to '1' performs +an arithmetic shift (only meaningful in case of a right shift). +.TP 0.2i +\(bu +if the op[2] signal is set to '1' performs +a rotation, otherwise performs a shift. +.TP 0.2i +\(bu +shamt : specifies the shift amount. The width of this signal +(\fIY\fR) is computed from the operator's width : +Y = ceil(log2(N)) - 1. +.PP +.SS "TERMINAL NAMES" +.IP 1. +op : select the kind of shift/rotation (input, 3 bit). +.IP 2. +shamt : the shift amount (input, \fIY\fR bits). +.IP 3. +: value to shift (input, \fIN\fR bits). +.IP 4. +: output (\fIN\fR bits). +.IP 5. +vdd : power. +.IP 6. +vss : ground. +.SH "EXAMPLE" +.PP +.sp +.nf +GENLIB_MACRO(DPGEN_SHROT, "rot25", + F_BEHAV|F_PLACE, + 25); + +GENLIB_LOINS("rot25", + "instance1_rot25", + "op[2:0]", + "shamt[4:0]", + "x[31:0]", + "y[31:0]", + "vdd", "vss", NULL); + +.sp +.fi +.SH "SEE ALSO" +.PP +\fBGENLIB_MACRO\fR(3), +\fBgenlib\fR(1) diff --git a/alliance/src/genlib/src/Makefile.am b/alliance/src/genlib/src/Makefile.am index 9f217047..1fb4cb35 100644 --- a/alliance/src/genlib/src/Makefile.am +++ b/alliance/src/genlib/src/Makefile.am @@ -1,4 +1,6 @@ AM_CFLAGS = @ALLIANCE_CFLAGS@ +AM_YFLAGS = +AM_LFLAGS = lib_LIBRARIES = libMgn.a include_HEADERS = mgn.h mbkgen.h genlib.h dgn.h libMgn_a_SOURCES = genlib.c \ @@ -14,6 +16,9 @@ libMgn_a_SOURCES = genlib.c \ dpgen_Regular.c \ dpgen_RF1.c \ dpgen_RF2.c \ + dpgen_RAM.c \ + dpgen_ROM.c \ + dpgen_ROM_code.y \ dpgen_Nul.c \ dpgen_Macro.c \ dpgen_Adder.c \ @@ -21,10 +26,10 @@ libMgn_a_SOURCES = genlib.c \ dpgen_Shifter.c bin_SCRIPTS = genlib -CLEANFILES = genlib +CLEANFILES = genlib y.output dpgen_ROM_code.c dpgen_ROM_code.h genlib : ${srcdir}/genlib.sh - ${SED} 's,__ALLIANCE_INSTALL_DIR__,$(ALLIANCE_INSTALL_DIR),' $< > $@ + ${SED} 's,__ALLIANCE_INSTALL_DIR__,$(prefix),' $< > $@ chmod a+x $@ -EXTRA_DIST = genlib.sh +EXTRA_DIST = genlib.sh dpgen_ROM_code.h diff --git a/alliance/src/genlib/src/dgn.h b/alliance/src/genlib/src/dgn.h index 4adbe624..c5e7cd4d 100644 --- a/alliance/src/genlib/src/dgn.h +++ b/alliance/src/genlib/src/dgn.h @@ -1,5 +1,5 @@ /* - * $Id: dgn.h,v 1.2 2002/06/17 09:40:27 fred Exp $ + * $Id: dgn.h,v 1.3 2002/07/15 22:19:25 jpc Exp $ * * /----------------------------------------------------------------\ * | | @@ -91,14 +91,17 @@ # define DPGEN_RF2R0 34 # define DPGEN_RF2D 35 # define DPGEN_RF2DR0 36 -# define DPGEN_DFF 37 -# define DPGEN_DFFT 38 -# define DPGEN_SFF 39 -# define DPGEN_SFFT 40 -# define DPGEN_ROM2 41 -# define DPGEN_ROM4 42 -# define DPGEN_SHROT 43 -# define DPGEN_UNKNOWN 44 +# define DPGEN_RAM 37 +# define DPGEN_ROM 38 +# define DPGEN_ROMTS 39 +# define DPGEN_DFF 40 +# define DPGEN_DFFT 41 +# define DPGEN_SFF 42 +# define DPGEN_SFFT 43 +# define DPGEN_ROM2 44 +# define DPGEN_ROM4 45 +# define DPGEN_SHROT 46 +# define DPGEN_UNKNOWN 47 /* ---------------------------------------------------------------------- diff --git a/alliance/src/genlib/src/dpgen_Defs.h b/alliance/src/genlib/src/dpgen_Defs.h index 9dc994af..d3af2a04 100644 --- a/alliance/src/genlib/src/dpgen_Defs.h +++ b/alliance/src/genlib/src/dpgen_Defs.h @@ -1,5 +1,5 @@ /* - * $Id: dpgen_Defs.h,v 1.1 2002/04/29 13:40:54 jpc Exp $ + * $Id: dpgen_Defs.h,v 1.2 2002/07/15 22:19:25 jpc Exp $ * * /----------------------------------------------------------------\ * | | @@ -63,6 +63,27 @@ extern void dpgen_RF2 __FP((long aFunction, va_list aAL)); +/* ---------------------------------------------------------------------- + * Module : "dpgen_RAM.c" + */ + + extern void dpgen_RAM __FP((long aFunction, va_list aAL)); + + +/* ---------------------------------------------------------------------- + * Module : "dpgen_ROM.c" + */ + + extern void dpgen_ROM __FP((long aFunction, va_list aAL)); + extern void dpgen_ROM_code __FP(( char *s + , long nb + , long nw + , long r + , long msb + , long *data + )); + + /* ---------------------------------------------------------------------- * Module : "dpgen_Shifter.c" */ diff --git a/alliance/src/genlib/src/dpgen_Macro.c b/alliance/src/genlib/src/dpgen_Macro.c index 41f7f807..6db8931f 100644 --- a/alliance/src/genlib/src/dpgen_Macro.c +++ b/alliance/src/genlib/src/dpgen_Macro.c @@ -1,5 +1,5 @@ /* - * $Id: dpgen_Macro.c,v 1.2 2002/06/17 09:40:27 fred Exp $ + * $Id: dpgen_Macro.c,v 1.3 2002/07/15 22:19:25 jpc Exp $ * * /----------------------------------------------------------------\ * | | @@ -69,6 +69,8 @@ extern char *function_To_String(aFunction) case DPGEN_SHIFT: return ("DPGEN_SHIFT"); case DPGEN_NUL: return ("DPGEN_NUL"); case DPGEN_RF1: return ("DPGEN_RF1"); + case DPGEN_RAM: return ("DPGEN_RAM"); + case DPGEN_ROM: return ("DPGEN_ROM"); case DPGEN_FIFO: return ("DPGEN_FIFO"); default: return ("unknown?!"); } @@ -88,7 +90,7 @@ extern void GENLIB_MACRO __FPV((long aFunction, ...)) if (firstCall) { firstCall = FALSE; - util_init (C_VerboseLevel0, F_DUMPCORE, "dpgen"); + util_init (C_VerboseLevel0, F_DUMPCORE, "genlib"); } @@ -171,10 +173,19 @@ extern void GENLIB_MACRO __FPV((long aFunction, ...)) case DPGEN_RF2DR0: dpgen_RF2 (aFunction, aAL); break; + case DPGEN_RAM: + dpgen_RAM (aFunction, aAL); + break; + case DPGEN_ROM: + dpgen_ROM (aFunction, aAL); + break; + case DPGEN_ROMTS: + dpgen_ROM (aFunction, aAL); + break; default: eprinth (NULL); eprintf ("GENLIB_MACRO: Unknown function Id: %ld.\n", aFunction); - eprints (" Please have a look to \"dgnVRR.h\" in which all "); + eprints (" Please have a look to \"dgn.h\" in which all "); eprints ( "authorized\n values are listed.\n"); EXIT (1); } diff --git a/alliance/src/genlib/src/dpgen_RAM.c b/alliance/src/genlib/src/dpgen_RAM.c new file mode 100644 index 00000000..a1718a39 --- /dev/null +++ b/alliance/src/genlib/src/dpgen_RAM.c @@ -0,0 +1,629 @@ +// auteur Alain Greiner +// +// Derniere modification 20/05/2001 +// +// Memoire statique simple acces respectant le gabarit SXLIB +// pour pouvoir etre utilise dans un chemin de donnees. +// Le programme genere une net-list et un placement optimise. +// Il y a 2 parametres : +// - nmot definit le nombre de mots +// il doit etre multiple de 8, >= 32 et =< 256 +// - nbit definit le nombre de bits +// il doit etre pair, non nul et =< 64 +// +// On utilise les cellules suivantes : +// colonne d'entree +// - ram_prech_data +// - ram_prech_buf0 +// - ram_prech_buf1 +// - ram_prech_dec +// - ram_mem_data +// - ram_mem_buf0 +// - ram_mem_buf1 +// - ram_mem_deci +// - ram_mem_dec2 +// - ram_mem_dec3 +// - ram_mem_dec4 +// - ram_mem_dec5 +// - ram_sense_data +// - ram_sense_buf0 +// - ram_sense_buf1 +// - ram_sense_decad12 +// - ram_sense_decad2 +// - ram_sense_decad3 +// - ram_sense_decad4 +// - ram_sense_decad5 + +#include "util_Defs.h" +#include "dpgen_Defs.h" + + +#define genNAME s64printf + + +//---------------------------------------------------------------- +// DEBUT PROGRAMME PRINCIPAL +//---------------------------------------------------------------- +// aFunction : le type : +// DPGEN_RAM +// +// aAL : liste des parametres : +// model_name : nom de modele. +// flags : indexation des connecteurs. +// nbit : nombre de bits (largeur du bus). +// nmot : nombre de mots. +// - le nombre de mots doit etre un multiple de 8 compris entre 32 et 256 +// - le nombre de bits doit etre pair, non nul et =< 64 +//---------------------------------------------------------------- + +extern void dpgen_RAM (aFunction, aAL) + long aFunction; + va_list aAL; +{ +int nmot; /* nombre de mots */ +int nbit; /* nombre de bits */ +char *model_name; /* nom de modele */ +long flags; + +int HCELL = 50; + +int bottom,i,j,k; +int sym1,sym2; +int adrange; + +char x3[10]; +char x4[10]; +char x5[10]; +char x6[10]; +char x7[10]; + +////////////////////////////////////////////////////////// +// +// acquisition et verification des parametres +// +////////////////////////////////////////////////////////// + +model_name = va_arg (aAL, char*); +flags = va_arg (aAL, long ); +nbit = va_arg (aAL, long ); +nmot = va_arg (aAL, long ); + + +if ((nmot%8 != 0) || (nmot > 256) || (nmot < 32)) { + eprinth ("GENLIB_MACRO (DPGEN_RAM, ...)"); + eprintf ("\n The word number (nword := %d) ", nmot); + eprints ("must be multiple of 8, at least 32"); + eprints ("\n and no larger than 256.\n"); + EXIT (1); +} +if ((nbit%2 == 1) || (nbit > 64) || (nbit < 2)) { + eprinth ("GENLIB_MACRO (DPGEN_RAM, ...)"); + eprintf ("\n The bus width (nbit := %d) ", nbit); + eprints ("must be even and no larger than 64.\n"); + EXIT (1); +} + +GENLIB_DEF_PHFIG(model_name); +GENLIB_DEF_LOFIG(model_name); + +/////////////////////////////////////////////////////////////////// +// +// Definition de l'interface logique +// +/////////////////////////////////////////////////////////////////// + +if (nmot > 128) adrange = 8; +else if (nmot > 64) adrange = 7; +else if (nmot > 32) adrange = 6; +else adrange = 5; + +GENLIB_LOCON("ck",IN,"ck"); +GENLIB_LOCON("w",IN,"w"); +GENLIB_LOCON("selram",IN,"selram"); +for (i=0;i> 3) % 2 == 0) strcpy(x3,"nad3x"); + else strcpy(x3,"ad3x"); + if ((j >> 4) % 2 == 0) strcpy(x4,"nad4x"); + else strcpy(x4,"ad4x"); + if ((j >> 5) % 2 == 0) strcpy(x5,"nad5x"); + else strcpy(x5,"ad5x"); + if ((j >> 6) % 2 == 0) strcpy(x6,"nad6x"); + else strcpy(x6,"ad6x"); + if ((j >> 7) % 2 == 0) strcpy(x7,"nad7x"); + else strcpy(x7,"ad7x"); + GENLIB_PLACE_RIGHT("ram_mem_dec5",GENLIB_NAME("memdec%d",j),SYM_Y); + GENLIB_LOINS("ram_mem_dec5",GENLIB_NAME("memdec%d",j), + x3, + x4, + x5, + x6, + x7, + GENLIB_NAME("ndeca%d",j), + GENLIB_NAME("ndecb%d",j), + "vdd", + "vss",NULL); + } +GENLIB_PLACE_RIGHT("ram_sense_decad5","sensedecad",SYM_Y); +GENLIB_LOINS("ram_sense_decad5","sensedecad", + "ad3", + "ad4", + "ad5", + "ad6", + "ad7", + "ad3x", + "nad3x", + "ad4x", + "nad4x", + "ad5x", + "nad5x", + "ad6x", + "nad6x", + "ad7x", + "nad7x", + "vdd", + "vss",NULL); +} + +if (adrange == 7) { /* adresse sur 7 bits : on decode 4 bits */ + +GENLIB_PLACE("ram_prech_dec0","prechdecu",SYM_Y,0,bottom); +GENLIB_LOINS("ram_prech_dec0","prechdecu", + "vdd", + "vss",NULL); +for(j=0 ; j> 3) % 2 == 0) strcpy(x3,"nad3x"); + else strcpy(x3,"ad3x"); + if ((j >> 4) % 2 == 0) strcpy(x4,"nad4x"); + else strcpy(x4,"ad4x"); + if ((j >> 5) % 2 == 0) strcpy(x5,"nad5x"); + else strcpy(x5,"ad5x"); + if ((j >> 6) % 2 == 0) strcpy(x6,"nad6x"); + else strcpy(x6,"ad6x"); + GENLIB_PLACE_RIGHT("ram_mem_dec4",GENLIB_NAME("memdec%d",j),SYM_Y); + GENLIB_LOINS("ram_mem_dec4",GENLIB_NAME("memdec%d",j), + x3, + x4, + x5, + x6, + GENLIB_NAME("ndeca%d",j), + GENLIB_NAME("ndecb%d",j), + "vdd", + "vss",NULL); + } +GENLIB_PLACE_RIGHT("ram_sense_decad4","sensedecad",SYM_Y); +GENLIB_LOINS("ram_sense_decad4","sensedecad", + "ad3", + "ad4", + "ad5", + "ad6", + "ad3x", + "nad3x", + "ad4x", + "nad4x", + "ad5x", + "nad5x", + "ad6x", + "nad6x", + "vdd", + "vss",NULL); +} + +if (adrange == 6) { /* adresse sur 6 bits : on decode 3 bits */ + +GENLIB_PLACE("ram_prech_dec0","prechdecu",SYM_Y,0,bottom); +GENLIB_LOINS("ram_prech_dec0","prechdecu", + "vdd", + "vss",NULL); +for(j=0 ; j> 3) % 2 == 0) strcpy(x3,"nad3x"); + else strcpy(x3,"ad3x"); + if ((j >> 4) % 2 == 0) strcpy(x4,"nad4x"); + else strcpy(x4,"ad4x"); + if ((j >> 5) % 2 == 0) strcpy(x5,"nad5x"); + else strcpy(x5,"ad5x"); + GENLIB_PLACE_RIGHT("ram_mem_dec3",GENLIB_NAME("memdec%d",j),SYM_Y); + GENLIB_LOINS("ram_mem_dec3",GENLIB_NAME("memdec%d",j), + x3, + x4, + x5, + GENLIB_NAME("ndeca%d",j), + GENLIB_NAME("ndecb%d",j), + "vdd", + "vss",NULL); + } +GENLIB_PLACE_RIGHT("ram_sense_decad3","sensedecad",SYM_Y); +GENLIB_LOINS("ram_sense_decad3","sensedecad", + "ad3", + "ad4", + "ad5", + "ad3x", + "nad3x", + "ad4x", + "nad4x", + "ad5x", + "nad5x", + "vdd", + "vss",NULL); +} + +if (adrange == 5) { /* adresse sur 5 bits : on decode 2 bits */ + +GENLIB_PLACE("ram_prech_dec0","prechdecu",SYM_Y,0,bottom); +GENLIB_LOINS("ram_prech_dec0","prechdecu", + "vdd", + "vss",NULL); +for(j=0 ; j> 3) % 2 == 0) strcpy(x3,"nad3x"); + else strcpy(x3,"ad3x"); + if ((j >> 4) % 2 == 0) strcpy(x4,"nad4x"); + else strcpy(x4,"ad4x"); + GENLIB_PLACE_RIGHT("ram_mem_dec2",GENLIB_NAME("memdec%d",j),SYM_Y); + GENLIB_LOINS("ram_mem_dec2",GENLIB_NAME("memdec%d",j), + x3, + x4, + GENLIB_NAME("ndeca%d",j), + GENLIB_NAME("ndecb%d",j), + "vdd", + "vss",NULL); + } +GENLIB_PLACE_RIGHT("ram_sense_decad2","sensedecad",SYM_Y); +GENLIB_LOINS("ram_sense_decad2","sensedecad", + "ad3", + "ad4", + "ad3x", + "nad3x", + "ad4x", + "nad4x", + "vdd", + "vss",NULL); +} + +/////////////////////////////////////////////////////////////////// +// +// connecteurs d'alimemtation +// +/////////////////////////////////////////////////////////////////// + +// Metal 1 face ouest +GENLIB_COPY_UP_SEG("vss","prechdecu","vss"); +GENLIB_COPY_UP_SEG("vdd","prechdecu","vdd"); +GENLIB_COPY_UP_SEG("vss","prechdecb","vss"); +GENLIB_COPY_UP_SEG("vdd","prechdecb","vdd"); +GENLIB_COPY_UP_SEG("vss","prechbuf1","vss"); +GENLIB_COPY_UP_SEG("vdd","prechbuf1","vdd"); +GENLIB_COPY_UP_SEG("vss","prechbuf0","vss"); +GENLIB_COPY_UP_SEG("vdd","prechbuf0","vdd"); +for(i=0;i 64) || (nbit < 4)) { + eprinth ("GENLIB_MACRO (DPGEN_ROM, ...)"); + eprintf ("\n The bus width (nbit := %d) ", nbit); + eprints ("must be even and no larger than 64.\n"); + EXIT (1); +} + +/////////////////////////////////////////////////////////////////// +// +// Acquisition du tableau des valeurs a encoder +// +/////////////////////////////////////////////////////////////////// + +/* ICI IL FAUT APPELER LE PARSER DE FICHIER .vbe */ +/* + for(i=0 ; i<1024 ; i++) { + data[2*i] = i; + data[2*i+1] = 1024 - i; + } +*/ + + dpgen_ROM_code (model_name, nbit, nmot, 0, 0, data); + +/////////////////////////////////////////////////////////////////// +// +// Definition de l'interface logique +// +/////////////////////////////////////////////////////////////////// + +GENLIB_DEF_PHFIG(model_name); +GENLIB_DEF_LOFIG(model_name); + +GENLIB_LOCON("ck",IN,"ck"); +GENLIB_LOCON("selrom",IN,"selrom"); +GENLIB_LOCON(GENLIB_BUS("ad",adrange-1,0),IN,GENLIB_BUS("ad",adrange-1,0)); +GENLIB_LOCON(GENLIB_BUS("data",nbit-1,0),IN,GENLIB_BUS("data",nbit-1,0)); +GENLIB_LOCON("vdd",IN,"vdd"); +GENLIB_LOCON("vss",IN,"vss"); + +/////////////////////////////////////////////////////////////////// +// +// Placement des lignes du plan memoire +// +/////////////////////////////////////////////////////////////////// + +for(i=0;i> 6) % 2 == 0) strcpy(x6,"na6x"); + else strcpy(x6,"a6x"); + if ((j >> 7) % 2 == 0) strcpy(x7,"na7x"); + else strcpy(x7,"a7x"); + if ((j >> 8) % 2 == 0) strcpy(x8,"na8x"); + else strcpy(x8,"a8x"); + if ((j >> 9) % 2 == 0) strcpy(x9,"na9x"); + else strcpy(x9,"a9x"); + GENLIB_PLACE_RIGHT("rom_dec_col4",GENLIB_NAME("col_%d",j),NOSYM); + GENLIB_LOINS("rom_dec_col4",GENLIB_NAME("col_%d",j), + x6, + x7, + x8, + x9, + GENLIB_NAME("col_%d",j), + "vdd", + "vss",NULL); + } +GENLIB_PLACE_RIGHT("rom_dec_colbuf","colbuf6",NOSYM); +GENLIB_LOINS("rom_dec_colbuf","colbuf6", +"ad[6]", +"a6x", +"na6x", +"vdd", +"vss",NULL); +GENLIB_PLACE_RIGHT("rom_dec_colbuf","colbuf7",NOSYM); +GENLIB_LOINS("rom_dec_colbuf","colbuf7", +"ad[7]", +"a7x", +"na7x", +"vdd", +"vss",NULL); +GENLIB_PLACE_RIGHT("rom_dec_colbuf","colbuf8",NOSYM); +GENLIB_LOINS("rom_dec_colbuf","colbuf8", +"ad[8]", +"a8x", +"na8x", +"vdd", +"vss",NULL); +GENLIB_PLACE_RIGHT("rom_dec_colbuf","colbuf9",NOSYM); +GENLIB_LOINS("rom_dec_colbuf","colbuf9", +"ad[9]", +"a9x", +"na9x", +"vdd", +"vss",NULL); +} + +// Ligne 9 dans le cas 512 mots + +if (nmot == 512) { +GENLIB_PLACE("rom_dec_nop","nop",NOSYM, 0, (nbit+8)*HCELL); +GENLIB_LOINS("rom_dec_nop","nop", "vdd", "vss", NULL); + +for (j=0;j> 6) % 2 == 0) strcpy(x6,"na6x"); + else strcpy(x6,"a6x"); + if ((j >> 7) % 2 == 0) strcpy(x7,"na7x"); + else strcpy(x7,"a7x"); + if ((j >> 8) % 2 == 0) strcpy(x8,"na8x"); + else strcpy(x8,"a8x"); + GENLIB_PLACE_RIGHT("rom_dec_col3",GENLIB_NAME("col_%d",j),NOSYM); + GENLIB_LOINS("rom_dec_col3",GENLIB_NAME("col_%d",j), + x6, + x7, + x8, + GENLIB_NAME("col_%d",j), + "vdd", + "vss",NULL); + } +GENLIB_PLACE_RIGHT("rom_dec_colbuf","colbuf6",NOSYM); +GENLIB_LOINS("rom_dec_colbuf","colbuf6", +"ad[6]", +"a6x", +"na6x", +"vdd", +"vss",NULL); +GENLIB_PLACE_RIGHT("rom_dec_colbuf","colbuf7",NOSYM); +GENLIB_LOINS("rom_dec_colbuf","colbuf7", +"ad[7]", +"a7x", +"na7x", +"vdd", +"vss",NULL); +GENLIB_PLACE_RIGHT("rom_dec_colbuf","colbuf8",NOSYM); +GENLIB_LOINS("rom_dec_colbuf","colbuf8", +"ad[8]", +"a8x", +"na8x", +"vdd", +"vss",NULL); +} + +// Ligne 9 dans le cas 256 mots + +if (nmot == 256) { +GENLIB_PLACE("rom_dec_nop","nop",NOSYM, 0, (nbit+8)*HCELL); +GENLIB_LOINS("rom_dec_nop","nop", "vdd", "vss", NULL); + +for (j=0;j> 6) % 2 == 0) strcpy(x6,"na6x"); + else strcpy(x6,"a6x"); + if ((j >> 7) % 2 == 0) strcpy(x7,"na7x"); + else strcpy(x7,"a7x"); + GENLIB_PLACE_RIGHT("rom_dec_col2",GENLIB_NAME("col_%d",j),NOSYM); + GENLIB_LOINS("rom_dec_col2",GENLIB_NAME("col_%d",j), + x6, + x7, + GENLIB_NAME("col_%d",j), + "vdd", + "vss",NULL); + } +GENLIB_PLACE_RIGHT("rom_dec_colbuf","colbuf6",NOSYM); +GENLIB_LOINS("rom_dec_colbuf","colbuf6", +"ad[6]", +"a6x", +"na6x", +"vdd", +"vss",NULL); +GENLIB_PLACE_RIGHT("rom_dec_colbuf","colbuf7",NOSYM); +GENLIB_LOINS("rom_dec_colbuf","colbuf7", +"ad[7]", +"a7x", +"na7x", +"vdd", +"vss",NULL); +} + +/////////////////////////////////////////////////////////////////// +// +// Routage des rappels d'alimentation et des signaux hors grille +// +/////////////////////////////////////////////////////////////////// + +y1 = nbit*HCELL; + +if(nmot > 128) y2 = (nbit + 9)*HCELL; +else y2 = (nbit + 8)*HCELL; + +if(type == 0) x2 = (nmot/64*50) + 150; +else x2 = (nmot/64*50) + 170; + +// alimentations verticales ALU3 + +GENLIB_PHSEG(CALU3,12,"vdd", 10, 0, 10, y2); +GENLIB_PHSEG(CALU3, 2,"vss", 20, 0, 20, y2); +GENLIB_PHSEG(CALU3, 2,"vss", 30, 0, 30, y2); + +for(j=0 ; j 128) GENLIB_PHSEG(CALU2, 2,"vdd", 0, (nbit+9)*HCELL, x2, (nbit+9)*HCELL); + +// alimentations horizontales ALU1 + +for(i=0 ; i 128) { + GENLIB_PHSEG(CALU1, 6,"vss", 0, y1+403, x2, y1+403); + GENLIB_PHSEG(CALU1, 6,"vdd", 0, y1+447, x2, y1+447); + } + +// routage des lignes de bit horizontales hors grille + +for(i=0 ; i>i) % 2 == 0) GENLIB_PHSEG(NTRANS,1,"",x1,y1-3,x1,y1+3); + else GENLIB_PHSEG(POLY ,1,"",x1,y1-3,x1,y1+3); + } + else { + value = data[2*(j + 8*k + l)+1]; + if((value>>(i-32)) % 2 == 0) GENLIB_PHSEG(NTRANS,1,"",x1,y1-3,x1,y1+3); + else GENLIB_PHSEG(POLY ,1,"",x1,y1-3,x1,y1+3); + } + + } + } + } +} + +*/ + +GENLIB_DEF_AB(0,0,0,0); + +GENLIB_SAVE_PHFIG(model_name); +GENLIB_SAVE_LOFIG(model_name); + +} + + diff --git a/alliance/src/genlib/src/dpgen_ROM_code.y b/alliance/src/genlib/src/dpgen_ROM_code.y new file mode 100644 index 00000000..603219b1 --- /dev/null +++ b/alliance/src/genlib/src/dpgen_ROM_code.y @@ -0,0 +1,739 @@ +/* + * This file has been stolen from the old full custom ROM generator : Grog... + * Courtesy of Mr Fred Petrot. + * + */ + +%{ +#include +#include +#include +#include + +typedef struct vhdl_constant { + struct vhdl_constant *NEXT; + char *string; + char *value; +} dptr; + +static char oct2bin[8][4] = { + "000", + "001", + "010", + "011", + "100", + "101", + "110", + "111" +}; + +static char hex2bin[16][5] = { + "0000", + "0001", + "0010", + "0011", + "0100", + "0101", + "0110", + "0111", + "1000", + "1001", + "1010", + "1011", + "1100", + "1101", + "1110", + "1111" +}; + +static char *vhdl_line; +static dptr *asc = NULL; +static int line = 0; +static int notempty = 0; +static char datbuf[65]; +static char adrbuf[33]; +static long nwords, nbits, rf, ibmbull; +static long *ydata; +static long used[8912]; +static char aorder; /* vector order for addresses */ +static char forder; /* vector order for data out */ +static void readvhdlfile(); +static int yylex(); +static int yyerror(); + +/* danger : + These three functions use an internal buffer when called, so + avoid calling them twice in the same function call. */ +static char *octbin(s) +char *s; +{ +static char b[256]; +char t[2]; + + b[0] = t[1] = '\0'; + while (*s) { + *t = *s; + strcat(b, oct2bin[strtol(t, (char **)NULL, 8)]); + s++; + } + return b; +} + +static char *hexbin(s) +char *s; +{ +static char b[256]; +char t[2]; + + b[0] = t[1] = '\0'; + while (*s) { + *t = *s; + strcat(b, hex2bin[strtol(t, (char **)NULL, 16)]); + s++; + } + return b; +} + +static char *binvert(s) +char *s; +{ +static char b[256]; +int l = strlen(s) - 1, i = 0; + + while (l >= 0) + b[i++] = s[l--]; + b[i] = '\0'; + return b; +} + +static dptr *adddptr(h, s, v) +dptr *h; +char *s, *v; +{ +dptr *p; + + p = (dptr *)mbkalloc(sizeof(dptr)); + p->string = (char *)mbkalloc(strlen(s) + 1); + (void)strcpy(p->string, s); + p->value = (char *)mbkalloc(strlen(v) + 1); + (void)strcpy(p->value, v); + p->NEXT = h; + return p; +} + +static char *getdptr(h, s) +dptr *h; +char *s; +{ + while (h != NULL) { + if (!strcmp(h->string, s)) + return h->value; + h = h->NEXT; + } + return NULL; +} + +%} + +%union { + int integer; + char string[256]; +} +%token CONSTANT OTHERS WHEN SELECT WITH +%token STRING BSTRING OSTRING XSTRING +%type value dvalues avalues +/* needed only to avoid bison `type clash', as I do not care about it */ +%type line constant + +%% + +line : constant + | STRING /* forget it */ + | WITH STRING '(' STRING STRING STRING ')' SELECT + { + if (atoi($4) != 0 && atoi($6) != 0) + yyerror("illegal vector boundaries for GRoG"); + /* address order choice : + depends upon the bit ordering convention, and what is read + from the file. */ + if ((!ibmbull && !strcmp($5, "TO")) + || (ibmbull && !strcmp($5, "DOWNTO"))) + aorder = -1; + else + aorder = 1; + } + | STRING '(' STRING STRING STRING ')' '<' '=' dvalues WHEN avalues ',' + { + int i; +#ifdef PARSEOUT + fprintf(stdout, "\n%s when %s\n", datbuf, adrbuf); +#endif + if (atoi($3) != 0 && atoi($5) != 0) + yyerror("illegal vector boundaries for GRoG"); + /* output ordering : + internally, the data is seen in the ibmbull convention, since + the generator was designed with this convention I hate + demanded. */ + if ((rf && !strcmp($4, "TO")) || (!rf && !strcmp($4, "DOWNTO"))) + forder = -1; + else + forder = 1; + notempty = 1; + if (strlen(datbuf) > nbits) + yyerror("data too wide for the number of bits"); + if (strlen(adrbuf) > nwords) + yyerror("address too high for the number of words"); + if (aorder == -1) + strcpy(adrbuf, binvert(adrbuf)); + if (forder == -1) + strcpy(datbuf, binvert(datbuf)); + if (nbits < 32) { + i = strtol(adrbuf, 0, 2); + ydata[(i << 1) ] = strtol(datbuf, 0, 2); + ydata[(i << 1) + 1] = 0; + } else { + i = strtol(adrbuf, 0, 2); + ydata[(i << 1) ] = strtol(&datbuf[nbits - 32], 0, 2); + datbuf[nbits - 32] = '\0'; + ydata[(i << 1) + 1] = strtol(datbuf, 0, 2); + } + + if (!used[i]) + used[i] = 1; + else + yyerror("same address used twice"); + } + | dvalues WHEN avalues ',' + { + int i; +#ifdef PARSEOUT + fprintf(stdout, "\n%s when %s\n", datbuf, adrbuf); +#endif + if (strlen(datbuf) > nbits) + yyerror("data too wide for the number of bits"); + if (strlen(adrbuf) > nwords) + yyerror("address too high for the number of words"); + if (aorder == -1) + strcpy(adrbuf, binvert(adrbuf)); + if (forder == -1) + strcpy(datbuf, binvert(datbuf)); + if (nbits < 32) { + i = strtol(adrbuf, 0, 2); + ydata[(i << 1) ] = strtol(datbuf, 0, 2); + ydata[(i << 1) + 1] = 0; + } else { + i = strtol(adrbuf, 0, 2); + ydata[(i << 1) ] = strtol(&datbuf[nbits - 32], 0, 2); + datbuf[nbits - 32] = '\0'; + ydata[(i << 1) + 1] = strtol(datbuf, 0, 2); + } + if (!used[i]) + used[i] = 1; + else + yyerror("same address used twice"); + } + | dvalues WHEN avalues ';' + { + int i; +#ifdef PARSEOUT + fprintf(stdout, "\n%s when %s\n", datbuf, adrbuf); +#endif + if (strlen(datbuf) > nbits) + yyerror("data too wide for the number of bits"); + if (strlen(adrbuf) > nwords) + yyerror("address too high for the number of words"); + if (aorder == -1) + strcpy(adrbuf, binvert(adrbuf)); + if (forder == -1) + strcpy(datbuf, binvert(datbuf)); + if (nbits < 32) { + i = strtol(adrbuf, 0, 2); + ydata[(i << 1) ] = strtol(datbuf, 0, 2); + ydata[(i << 1) + 1] = 0; + } else { + i = strtol(adrbuf, 0, 2); + ydata[(i << 1) ] = strtol(&datbuf[nbits - 32], 0, 2); + datbuf[nbits - 32] = '\0'; + ydata[(i << 1) + 1] = strtol(datbuf, 0, 2); + } + if (!used[i]) + used[i] = 1; + else + yyerror("same address used twice"); + } + | dvalues WHEN OTHERS ';' + { + int i; + long j[2]; +#ifdef PARSEOUT + fprintf(stdout, "\n%s when others\n", datbuf); +#endif + if (strlen(datbuf) > nbits) + yyerror("data too wide for the number of bits"); + if (strlen(adrbuf) > nwords) + yyerror("address too high for the number of words"); + if (forder == -1) + strcpy(datbuf, binvert(datbuf)); + if (nbits < 32) { + j[0] = strtol(datbuf, 0, 2); + j[1] = 0; + } else { + j[0] = strtol(&datbuf[nbits - 32], 0, 2); + datbuf[nbits - 32] = '\0'; + j[1] = strtol(datbuf, 0, 2); + } + for (i = 0; i < nwords; i++) + if (!used[i]) + ydata[(i << 1) ] = j[0], + ydata[(i << 1) + 1] = j[1]; + } + | {strcpy($$, "Just to have bison shut up");} + ; + +constant : CONSTANT STRING '=' value ';' + { + asc = adddptr(asc, $2, $4); + } + ; + +value : BSTRING {strcpy($$, $1);} + | OSTRING {strcpy($$, octbin($1));} + | XSTRING {strcpy($$, hexbin($1));} + ; + +dvalues : value {strcat(datbuf, $1);} + | value {strcat(datbuf, $1);} '&' dvalues + | STRING + { + char *p = getdptr(asc, $1); + + if (p == NULL) { + sprintf(datbuf, "unknown constant %s", $1); + yyerror(datbuf); + } + strcat(datbuf, p); + } + | STRING { + char *p = getdptr(asc, $1); + + if (p == NULL) { + sprintf(datbuf, "unknown constant %s", $1); + yyerror(datbuf); + } + strcat(datbuf, p); + } '&' dvalues + ; + +avalues : value {strcat(adrbuf, $1);} + | value {strcat(adrbuf, $1);} '&' avalues + | STRING + { + char *p = getdptr(asc, $1); + + if (p == NULL) { + sprintf(adrbuf, "unknown constant %s", $1); + yyerror(adrbuf); + } + strcat(adrbuf, p); + } + | STRING { + char *p = getdptr(asc, $1); + + if (p == NULL) { + sprintf(adrbuf, "unknown constant %s", $1); + yyerror(adrbuf); + } + strcat(adrbuf, p); + } '&' avalues + ; + +%% + +void dpgen_ROM_code(s, nb, nw, r, msb, data) +char *s; +long nb, nw, r, msb; +long *data; +{ +FILE *f; + + if ((f = mbkfopen(s, "vbe", "r")) == NULL) { + fprintf(stderr, "DPGEN_ROM error : cannot open file %s.vbe\n", s); + EXIT(1); + } + readvhdlfile(f, s, nb, nw, r, msb, data); + if (!notempty) { + (void)fflush(stdout); + (void)fprintf(stdout, "DPGEN_ROM : the file was empty of usable data\n"); + (void)fprintf(stdout, " the generated ROM will contain zeros\n"); + } + fclose(f); +} + +static FILE *vhdlfile; + +static void nextvhdlline(f, str) +FILE *f; +char *str; +{ +char *s, *t; +int space; + + if (fgets(str, 512, f) == (char *)NULL) + return; + s = t = str; + space = isspace(*t) ? 0 : 1; + while (*t) + if (!isspace(*t) || space) { + space = isspace(*t) || *t == ':' ? 0 : 1; + if (islower(*t)) + *t = toupper(*t); + *s++ = *t++; + } else { + t++; + space = 0; + } + *s = '\0'; +} + +static char *nextline() +{ +static char str[256]; + + nextvhdlline(vhdlfile, str); + return str; +} + +static void readvhdlfile(f, s, nb, nw, r, msb, data) +FILE *f; +char *s; +long nb, nw, r, msb; +long *data; +{ +char str[256]; +char *t; +int space, i; + + /* globalize variables for yacc */ + nwords = nw; + nbits = nb; + rf = r; + ibmbull = msb; + ydata = data; + vhdlfile = f; + + /* initialize stuff for OTHERS */ + for (i = 0; i < 8912; i++) + used[i] = 0; + + while (!feof(f)) { + line++; + nextvhdlline(f, str); + vhdl_line = str; + datbuf[0] = adrbuf[0] = '\0'; + yyparse(); + } +} + +/* lexical analyser */ +static int yylex() +{ +static int c; +int i = 0; +char *s = vhdl_line; /* remember where to start from */ + + while (*s && isspace(*s)) + s++; + + switch (*s) { + case '\0': + +#ifdef PARSEOUT + printf("\n"); +#endif + + return -1; /* expected by yacc as end of entries */ + + case ';': + c = '\0'; /* reset to nul state */ + case '<': + case '=': + case ',': + case '&': + case '(': + case ')': + +#ifdef PARSEOUT + printf("(%c)", *s); +#endif + + if (*s == '<' && c == SELECT) + c = WITH; + vhdl_line = s; + return *vhdl_line++; + + case ':': + s++; + while (*s && *s != '=') + s++; + +#ifdef PARSEOUT + printf("(%c)", *s); +#endif + + vhdl_line = ++s; + return '='; + + case '-': + if (*++s == '-') { +#ifdef PARSEOUT + printf("COMMENT\n"); +#endif + return -1; + } + return *vhdl_line++; + + case 'C': + while (*s && (isalnum(*s) || *s == '_')) + yylval.string[i++] = *s++; + yylval.string[i] = '\0'; + vhdl_line = s; + if (!strcmp(yylval.string, "CONSTANT")) { + +#ifdef PARSEOUT + printf("TOKEN[%s]", yylval.string); +#endif + + return c = CONSTANT; + } + +#ifdef PARSEOUT + printf("STRING{%s}", yylval.string); +#endif + if (c != SELECT && c != WITH && c != CONSTANT) + *vhdl_line = '\0'; + return STRING; + + + case 'G': + while (*s && (isalnum(*s) || *s == '_')) + yylval.string[i++] = *s++; + yylval.string[i] = '\0'; + vhdl_line = s; + if (!strcmp(yylval.string, "GENERIC")) { + while (1) { + if (!*s) + s = nextline(); + if (*s++ == '(') { + s--; + i = 0; + break; + } + } + while (1) { + if (!*s) + s = nextline(); + switch (*s++) { + case '(': + i++; + break; + case ')': + i--; + break; + case '\n': + line++; + } + if (i == 0) + break; + } + + *vhdl_line = '\0'; + return STRING; + } + +#ifdef PARSEOUT + printf("STRING{%s}", yylval.string); +#endif + if (c != SELECT && c != WITH && c != CONSTANT) + *vhdl_line = '\0'; + return STRING; + + case 'W': + while (*s && (isalnum(*s) || *s == '_')) + yylval.string[i++] = *s++; + yylval.string[i] = '\0'; + vhdl_line = s; + if (!strcmp(yylval.string, "WHEN")) { + +#ifdef PARSEOUT + printf("TOKEN[%s]", yylval.string); +#endif + + return WHEN; + } else if (!strcmp(yylval.string, "WITH")) { + +#ifdef PARSEOUT + printf("TOKEN[%s]", yylval.string); +#endif + + c = SELECT; + return WITH; + } else { + +#ifdef PARSEOUT + printf("STRING{%s}", yylval.string); +#endif + if (c != SELECT && c != WITH && c != CONSTANT) + *vhdl_line = '\0'; + return STRING; + } + + case 'S': + while (*s && (isalnum(*s) || *s == '_')) + yylval.string[i++] = *s++; + yylval.string[i] = '\0'; + vhdl_line = s; + if (!strcmp(yylval.string, "SELECT")) { + +#ifdef PARSEOUT + printf("TOKEN[%s]", yylval.string); +#endif + + *vhdl_line = '\0'; + return SELECT; + } else { + +#ifdef PARSEOUT + printf("STRING{%s}", yylval.string); +#endif + if (c != SELECT && c != WITH && c != CONSTANT) + *vhdl_line = '\0'; + return STRING; + } + + case 'B': + if (c != SELECT && c != WITH && c != CONSTANT) { + *vhdl_line = '\0'; + return STRING; + } + if (*(s + 1) == '"') { + s += 2; + while (*s && *s != '"') + if (*s != '0' && *s != '1') + yyerror("bad binary number"); + else + yylval.string[i++] = *s++; + yylval.string[i] = '\0'; + vhdl_line = ++s; + +#ifdef PARSEOUT + printf("BSTRING{%s}", yylval.string); +#endif + return BSTRING; + } + while (*s && (isalnum(*s) || *s == '_')) + yylval.string[i++] = *s++; + yylval.string[i] = '\0'; + vhdl_line = s; + +#ifdef PARSEOUT + printf("STRING{%s}", yylval.string); +#endif + return STRING; + + case 'O': + if (c != SELECT && c != WITH && c != CONSTANT) { + *vhdl_line = '\0'; + return STRING; + } + + if (*(s + 1) == '"') { + s += 2; + while (*s && *s != '"') + if (!isdigit(*s) && *s != '8' && *s != '9') + yyerror("bad octal number"); + else + yylval.string[i++] = *s++; + yylval.string[i] = '\0'; + vhdl_line = ++s; + +#ifdef PARSEOUT + printf("OSTRING{%s}", yylval.string); +#endif + return OSTRING; + } + while (*s && (isalnum(*s) || *s == '_')) + yylval.string[i++] = *s++; + yylval.string[i] = '\0'; + vhdl_line = s; + if (!strcmp(yylval.string, "OTHERS")) { + +#ifdef PARSEOUT + printf("TOKEN[%s]", yylval.string); +#endif + + return OTHERS; + } + +#ifdef PARSEOUT + printf("STRING{%s}", yylval.string); +#endif + return STRING; + + case 'X': + if (c != SELECT && c != WITH && c != CONSTANT) { + *vhdl_line = '\0'; + return STRING; + } + if (*(s + 1) == '"') { + s += 2; + while (*s && *s != '"') + if (!isxdigit(*s)) + yyerror("bad hexadecimal number"); + else + yylval.string[i++] = *s++; + yylval.string[i] = '\0'; + vhdl_line = ++s; + +#ifdef PARSEOUT + printf("XSTRING{%s}", yylval.string); +#endif + return XSTRING; + } + while (*s && (isalnum(*s) || *s == '_')) + yylval.string[i++] = *s++; + yylval.string[i] = '\0'; + vhdl_line = s; + +#ifdef PARSEOUT + printf("STRING{%s}", yylval.string); +#endif + return STRING; + + default: + if (c == SELECT) + while (*s && !isspace(*s) && *s != '(' && *s != ')') + yylval.string[i++] = *s++; + else + while (*s && !isspace(*s)) + yylval.string[i++] = *s++; + yylval.string[i] = '\0'; + vhdl_line = s; + if (c != SELECT && c != WITH && c != CONSTANT) + *vhdl_line = '\0'; + +#ifdef PARSEOUT + printf("STRING{%s}", yylval.string); +#endif + + return STRING; + } +} + +static int yyerror(s) +char *s; +{ + fflush(stdout); + fprintf(stderr, "DPGEN_ROM : %s on line %d (%s), '%c'\n", + s, line, vhdl_line, yychar); + exit(1); +} diff --git a/alliance/src/genlib/src/genlib.sh b/alliance/src/genlib/src/genlib.sh index f562ad20..7d9ddf33 100755 --- a/alliance/src/genlib/src/genlib.sh +++ b/alliance/src/genlib/src/genlib.sh @@ -1,6 +1,6 @@ #!/bin/sh # -# $Id: genlib.sh,v 1.5 2002/06/06 15:46:49 fred Exp $ +# $Id: genlib.sh,v 1.6 2002/07/15 22:19:26 jpc Exp $ # # /------------------------------------------------------------------\ # | | @@ -218,6 +218,9 @@ ALLIANCE_DEVEL_INCLUDE="-I${ALLIANCE_INSTALL_DIR}/include" ALLIANCE_DEVEL_LIB="-L${ALLIANCE_INSTALL_DIR}/lib" export ALLIANCE_INSTALL_DIR ALLIANCE_DEVEL_INCLUDE ALLIANCE_DEVEL_LIB + + vecho 0 " o Switching to development environment :" + vecho 0 " - ALLIANCE_INSTALL_DIR : ${ALLIANCE_INSTALL_DIR-not set}" fi