This commit was generated by cvs2svn to track changes on a CVS vendor
branch.
This commit is contained in:
commit
a79fd9b05c
|
@ -0,0 +1 @@
|
||||||
|
SUBDIRS = src
|
|
@ -0,0 +1,52 @@
|
||||||
|
dnl
|
||||||
|
dnl This file is part of the Alliance CAD System
|
||||||
|
dnl Copyright (C) Laboratoire LIP6 - Département ASIM
|
||||||
|
dnl Universite Pierre et Marie Curie
|
||||||
|
dnl
|
||||||
|
dnl Home page : http://www-asim.lip6.fr/alliance/
|
||||||
|
dnl E-mail support : mailto:alliance-support@asim.lip6.fr
|
||||||
|
dnl
|
||||||
|
dnl This library is free software; you can redistribute it and/or modify it
|
||||||
|
dnl under the terms of the GNU Library General Public License as published
|
||||||
|
dnl by the Free Software Foundation; either version 2 of the License, or (at
|
||||||
|
dnl your option) any later version.
|
||||||
|
dnl
|
||||||
|
dnl Alliance VLSI CAD System is distributed in the hope that it will be
|
||||||
|
dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
dnl Public License for more details.
|
||||||
|
dnl
|
||||||
|
dnl You should have received a copy of the GNU General Public License along
|
||||||
|
dnl with the GNU C Library; see the file COPYING. If not, write to the Free
|
||||||
|
dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
dnl
|
||||||
|
dnl Purpose : Auto stuffing Alliance
|
||||||
|
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 <Frederic.Petrot@lip6.fr>
|
||||||
|
dnl $Id: configure.in,v 1.1 2002/03/13 17:59:01 fred Exp $
|
||||||
|
dnl
|
||||||
|
dnl
|
||||||
|
AC_INIT(src/drive_vlog.c)
|
||||||
|
AM_INIT_AUTOMAKE(mbkverilog, 0.8)
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_HEADER_STDC
|
||||||
|
AC_CHECK_HEADERS(strings.h unistd.h)
|
||||||
|
AC_C_CONST
|
||||||
|
AC_PROG_RANLIB
|
||||||
|
|
||||||
|
changequote(,)dnl
|
||||||
|
INCLUDES=-I${ALLIANCE_TOP}/include
|
||||||
|
LDFLAGS=-L${ALLIANCE_TOP}/lib
|
||||||
|
changequote([,])dnl
|
||||||
|
|
||||||
|
AC_SUBST(INCLUDES)
|
||||||
|
AC_SUBST(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
AC_OUTPUT([
|
||||||
|
Makefile
|
||||||
|
src/Makefile
|
||||||
|
])
|
|
@ -0,0 +1,2 @@
|
||||||
|
lib_LIBRARIES = libMgl.a
|
||||||
|
libMgl_a_SOURCES = drive_vlog.c
|
|
@ -0,0 +1,427 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the Alliance CAD System
|
||||||
|
* Copyright (C) Laboratoire LIP6 - Département ASIM
|
||||||
|
* Universite Pierre et Marie Curie
|
||||||
|
*
|
||||||
|
* Home page : http://www-asim.lip6.fr/alliance/
|
||||||
|
* E-mail support : mailto:alliance-support@asim.lip6.fr
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Library 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Purpose : verilog driver, mainly used to enable simulating with Cadence Verilog.
|
||||||
|
* Version : 002
|
||||||
|
* Date : Jul 1995
|
||||||
|
* Author : Aldo Mozzi <aldo.mozzi@libero.it>
|
||||||
|
* Modified by Mourad Aberbour in Sept. 1997
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ident "$Id: drive_vlog.c,v 1.1 2002/03/13 17:59:01 fred Exp $"
|
||||||
|
|
||||||
|
#include <mut.h>
|
||||||
|
#include <mlo.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
extern char *mvl_vhdlname(); /*see ../mbkvhdl/mbkvhdl/mvl_drive.h*/
|
||||||
|
|
||||||
|
static char name_buffer[255];
|
||||||
|
static char vec_name_buffer[255];
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* function vlg_name: gets a name and returns a legal verilog name *
|
||||||
|
* in name_buffer. Characteres not allowed in a valid verilog name *
|
||||||
|
* are replaced by "_"<ascii code in hex>"_". *
|
||||||
|
* If the name is indexed the indexing syntax is translated: *
|
||||||
|
* <name><space><number> --> <name>[<number>] *
|
||||||
|
******************************************************************/
|
||||||
|
char *vlg_name (name)
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
char *scan_new;
|
||||||
|
int i, indexed;
|
||||||
|
static char hextable[] = "0123456789ABCDEF";
|
||||||
|
#ifdef mark_in_out
|
||||||
|
printf ("entering vlg_name %s\n", name);
|
||||||
|
#endif
|
||||||
|
scan_new = name_buffer;
|
||||||
|
i = 0;
|
||||||
|
indexed = 0;
|
||||||
|
while (*name)
|
||||||
|
{
|
||||||
|
if (i != 0 && *name == ' ')
|
||||||
|
{
|
||||||
|
*scan_new++ = '[';
|
||||||
|
indexed = 1;
|
||||||
|
name++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (isalpha(*name) || *name == '_' || (i != 0 && (isdigit(*name)) || *name == '$'))
|
||||||
|
{
|
||||||
|
*scan_new = *name++;
|
||||||
|
/* modif mourad : le 03/12/97
|
||||||
|
Le driver verilog pour les netlists alliance doit garder les noms de models et des coneecteurs
|
||||||
|
en minuscule pour une compatibilite avec les cellules ScLib et PadLib exportees vers Cadence.
|
||||||
|
Les noms de signaux et d'instances peuvent rester tel quel.
|
||||||
|
|
||||||
|
if (islower(*scan_new)) *scan_new = toupper(*scan_new);
|
||||||
|
----*/
|
||||||
|
if (isupper(*scan_new)) *scan_new = tolower(*scan_new);
|
||||||
|
scan_new++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*scan_new++ = '_';
|
||||||
|
*scan_new++ = hextable[(*name >> 4) & 0x0f];
|
||||||
|
*scan_new++ = hextable[*name++ & 0x0f];
|
||||||
|
*scan_new++ = '_';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
if (indexed != 0) *scan_new++ = ']';
|
||||||
|
*scan_new = '\0';
|
||||||
|
|
||||||
|
#ifdef mark_in_out
|
||||||
|
printf ("exiting vlg_name %s\n", name_buffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (name_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* function vlg_busname: gets a pointer to a list of connectors and returns *
|
||||||
|
* the next connector name in *name (that points to vec_buffer), the left *
|
||||||
|
* and right indices of the vector (-1 if signal is a scalar) and the *
|
||||||
|
* pointer to the next vector as the return value. Performs vectorization *
|
||||||
|
* of locon names, that are always scalar. *
|
||||||
|
***************************************************************************/
|
||||||
|
locon_list *vlg_busname(pt_list,left,right,name)
|
||||||
|
locon_list *pt_list;
|
||||||
|
int *left, *right;
|
||||||
|
char **name;
|
||||||
|
{
|
||||||
|
char *blank_space;
|
||||||
|
locon_list *ptcon;
|
||||||
|
char END = 0;
|
||||||
|
|
||||||
|
#ifdef mark_in_out
|
||||||
|
printf("entering vlg_busname %s\n", pt_list->NAME);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ptcon = pt_list;
|
||||||
|
/* Extract the name and number of an element */
|
||||||
|
*left = *right = -1;
|
||||||
|
strcpy(vec_name_buffer, ptcon->NAME);
|
||||||
|
blank_space = strchr(vec_name_buffer, ' ');
|
||||||
|
if (blank_space != NULL)
|
||||||
|
{
|
||||||
|
*right = atoi(blank_space);
|
||||||
|
*left = *right;
|
||||||
|
*blank_space = '\0';
|
||||||
|
|
||||||
|
while(END != 1)
|
||||||
|
{
|
||||||
|
if(ptcon->NEXT != NULL)
|
||||||
|
{
|
||||||
|
blank_space = strchr(ptcon->NEXT->NAME, ' ');
|
||||||
|
if(blank_space != NULL)
|
||||||
|
{
|
||||||
|
*blank_space = '\0';
|
||||||
|
if(!strcmp(vec_name_buffer, ptcon->NEXT->NAME))
|
||||||
|
{
|
||||||
|
*right = atoi(blank_space + 1);
|
||||||
|
ptcon = ptcon->NEXT;
|
||||||
|
}
|
||||||
|
else END = 1;
|
||||||
|
*blank_space = ' ';
|
||||||
|
}
|
||||||
|
else END = 1;
|
||||||
|
}
|
||||||
|
else END = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*name = vec_name_buffer;
|
||||||
|
|
||||||
|
#ifdef mark_in_out
|
||||||
|
printf("exiting vlg_busname %s\n", *name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return(ptcon->NEXT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* function vlogsavelofig *
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
void vlogsavelofig(ptfig)
|
||||||
|
lofig_list *ptfig;
|
||||||
|
{
|
||||||
|
loins_list *ptins = NULL;
|
||||||
|
locon_list *ptcon = NULL;
|
||||||
|
locon_list *tmp_ptcon = NULL;
|
||||||
|
locon_list *ptscan = NULL;
|
||||||
|
losig_list *ptsig = NULL;
|
||||||
|
FILE *ptfile;
|
||||||
|
time_t clock;
|
||||||
|
int flag, left, right, i, first;
|
||||||
|
char *name;
|
||||||
|
char *sig_name;
|
||||||
|
char direc_flag;
|
||||||
|
chain_list *sig_list = NULL;
|
||||||
|
|
||||||
|
#ifdef mark_in_out
|
||||||
|
printf("entering vlogsavelofig\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((ptfile = mbkfopen(ptfig->NAME, OUT_LO, WRITE_TEXT)) == NULL)
|
||||||
|
{
|
||||||
|
(void)fprintf(stderr, "*** mbk error ***\n");
|
||||||
|
(void)fprintf(stderr, "cannot open file %s.%s\n", ptfig->NAME, OUT_LO);
|
||||||
|
EXIT(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
time (&clock);
|
||||||
|
(void) fprintf (ptfile,"// Verilog structural description generated from `%s`\n", ptfig->NAME);
|
||||||
|
(void) fprintf (ptfile,"// Date : %s\n\n", ctime(&clock));
|
||||||
|
|
||||||
|
/*********************
|
||||||
|
* Module declaration *
|
||||||
|
*********************/
|
||||||
|
(void) fprintf (ptfile,"// Module Declaration.\n\n");
|
||||||
|
(void) fprintf (ptfile,"module %s (\n", vlg_name(ptfig->NAME));
|
||||||
|
|
||||||
|
if (ptfig->LOCON != NULL) {
|
||||||
|
ptfig->LOCON = (struct locon *) reverse ((chain_list *)ptfig->LOCON);
|
||||||
|
/*list inputs without indices first*/
|
||||||
|
ptcon = ptfig->LOCON;
|
||||||
|
flag = 0;
|
||||||
|
while (ptcon != NULL)
|
||||||
|
{
|
||||||
|
if (ptcon->DIRECTION == 'I')
|
||||||
|
{
|
||||||
|
ptcon = vlg_busname(ptcon,&left,&right,&name);
|
||||||
|
/*
|
||||||
|
printf("list input %s\n", name);
|
||||||
|
*/
|
||||||
|
if (flag == 4)
|
||||||
|
{
|
||||||
|
(void)fprintf(ptfile, ",\n");
|
||||||
|
flag = 0;
|
||||||
|
}
|
||||||
|
if (flag != 0)
|
||||||
|
(void)fprintf(ptfile, ", ");
|
||||||
|
(void)fprintf(ptfile, "%s", vlg_name(name));
|
||||||
|
++flag;
|
||||||
|
}
|
||||||
|
else ptcon = ptcon->NEXT;
|
||||||
|
}
|
||||||
|
/*then list I/Os*/
|
||||||
|
ptcon = ptfig->LOCON;
|
||||||
|
while (ptcon != NULL)
|
||||||
|
{
|
||||||
|
direc_flag = ptcon->DIRECTION;
|
||||||
|
if ((direc_flag != 'I') && (direc_flag != 'O') && (direc_flag != 'B'))
|
||||||
|
{
|
||||||
|
ptcon = vlg_busname(ptcon,&left,&right,&name);
|
||||||
|
/*
|
||||||
|
printf("list input-output %s %c\n", name, direc_flag);
|
||||||
|
*/
|
||||||
|
if (flag == 4)
|
||||||
|
{
|
||||||
|
(void)fprintf(ptfile, ",\n");
|
||||||
|
flag = 0;
|
||||||
|
}
|
||||||
|
if (flag != 0)
|
||||||
|
(void)fprintf(ptfile, ", ");
|
||||||
|
(void)fprintf(ptfile, "%s", vlg_name(name));
|
||||||
|
++flag;
|
||||||
|
}
|
||||||
|
else ptcon = ptcon->NEXT;
|
||||||
|
}
|
||||||
|
/*then list outputs*/
|
||||||
|
ptcon = ptfig->LOCON;
|
||||||
|
while (ptcon != NULL)
|
||||||
|
{
|
||||||
|
direc_flag = ptcon->DIRECTION;
|
||||||
|
if ((direc_flag == 'O') || (direc_flag == 'B'))
|
||||||
|
{
|
||||||
|
ptcon = vlg_busname(ptcon,&left,&right,&name);
|
||||||
|
/*
|
||||||
|
printf("list output %s\n", name);
|
||||||
|
*/
|
||||||
|
if (flag == 4)
|
||||||
|
{
|
||||||
|
(void)fprintf(ptfile, ",\n");
|
||||||
|
flag = 0;
|
||||||
|
}
|
||||||
|
if (flag != 0)
|
||||||
|
(void)fprintf(ptfile, ", ");
|
||||||
|
(void)fprintf(ptfile, "%s", vlg_name(name));
|
||||||
|
++flag;
|
||||||
|
}
|
||||||
|
else ptcon = ptcon->NEXT;
|
||||||
|
}
|
||||||
|
(void) fprintf(ptfile, ");\n\n\n");
|
||||||
|
|
||||||
|
(void) fprintf (ptfile,"// Declaration of external signals.\n\n");
|
||||||
|
/*now list inputs and outputs with indices; bidirs are both listed as
|
||||||
|
inputs and outputs*/
|
||||||
|
ptcon = ptfig->LOCON;
|
||||||
|
while (ptcon != NULL)
|
||||||
|
{
|
||||||
|
direc_flag = ptcon->DIRECTION;
|
||||||
|
ptcon = vlg_busname(ptcon, &left, &right, &name);
|
||||||
|
if ((direc_flag != 'O') && (direc_flag != 'B'))
|
||||||
|
{
|
||||||
|
if (left != -1)
|
||||||
|
(void)fprintf(ptfile, "input [%d:%d] %s;\n", left, right, vlg_name(name));
|
||||||
|
else
|
||||||
|
(void)fprintf(ptfile, "input %s;\n", vlg_name(name));
|
||||||
|
}
|
||||||
|
if (direc_flag != 'I')
|
||||||
|
{
|
||||||
|
if (left != -1)
|
||||||
|
(void)fprintf(ptfile, "output [%d:%d] %s;\n", left, right, vlg_name(name));
|
||||||
|
else
|
||||||
|
(void)fprintf(ptfile, "output %s;\n", vlg_name(name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(void) fprintf(ptfile, "\n\n");
|
||||||
|
|
||||||
|
ptfig->LOCON = (struct locon *) reverse ((chain_list *)ptfig->LOCON);
|
||||||
|
|
||||||
|
/***********************************************************
|
||||||
|
* End of module declarations, now declare internal signals *
|
||||||
|
***********************************************************/
|
||||||
|
|
||||||
|
(void) fprintf(ptfile, "// Declaration of internal signals.\n\n");
|
||||||
|
ptsig = ptfig->LOSIG;
|
||||||
|
while(ptsig != NULL)
|
||||||
|
{
|
||||||
|
if (ptsig->TYPE == 'I')
|
||||||
|
{
|
||||||
|
(void) fprintf (ptfile, "wire %s;\n", vlg_name(getsigname(ptsig)));
|
||||||
|
}
|
||||||
|
ptsig = ptsig->NEXT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************
|
||||||
|
* End of signal declarations, now comes the real netlist *
|
||||||
|
*********************************************************/
|
||||||
|
|
||||||
|
(void) fprintf(ptfile, "\n\n// Declaration of instances.\n\n");
|
||||||
|
ptfig->LOINS = (struct loins *) reverse ((chain_list *)ptfig->LOINS);
|
||||||
|
for (ptins = ptfig->LOINS; ptins; ptins = ptins->NEXT)
|
||||||
|
{
|
||||||
|
/* name the module name and the instance name */
|
||||||
|
(void) fprintf (ptfile, "%s ", vlg_name(ptins->FIGNAME));
|
||||||
|
(void) fprintf (ptfile, "i_%s (\n ", vlg_name(ptins->INSNAME));
|
||||||
|
ptcon = ptins->LOCON;
|
||||||
|
while(ptcon != NULL)
|
||||||
|
{
|
||||||
|
tmp_ptcon = vlg_busname(ptcon, &left, &right, &name);
|
||||||
|
(void) fprintf (ptfile, ".%s(",vlg_name(name));
|
||||||
|
if(left != -1)
|
||||||
|
{
|
||||||
|
/* The connected signals are bused */
|
||||||
|
for(i = abs(left - right); i >= 0; i--)
|
||||||
|
{
|
||||||
|
ptsig = ptcon->SIG;
|
||||||
|
if (ptsig->TYPE == 'I')
|
||||||
|
{
|
||||||
|
/* The signal is internal */
|
||||||
|
sig_name = namealloc(mvl_vhdlname(getsigname(ptsig)));
|
||||||
|
sig_list = addchain(sig_list,(char *)sig_name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The signal is external */
|
||||||
|
for (ptscan = ptfig->LOCON ; ptscan ; ptscan = ptscan->NEXT)
|
||||||
|
{
|
||||||
|
if (ptscan->SIG == ptsig)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (ptscan == NULL)
|
||||||
|
{
|
||||||
|
(void) printf("\n*** mbk error *** no external connector \n");
|
||||||
|
(void) printf(" driving verilog file %s\n", ptfig->NAME);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sig_name = namealloc(vlg_name(ptscan->NAME));
|
||||||
|
sig_list = addchain(sig_list,(char *)sig_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(i > 0)
|
||||||
|
ptcon = ptcon->NEXT;
|
||||||
|
}
|
||||||
|
first = 1;
|
||||||
|
while(sig_list != NULL)
|
||||||
|
{
|
||||||
|
if(first!=1)
|
||||||
|
{
|
||||||
|
(void)fprintf(ptfile,"& %s",(char *)(sig_list->DATA));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(void)fprintf(ptfile,"%s",(char *)(sig_list->DATA));
|
||||||
|
first = 0;
|
||||||
|
}
|
||||||
|
sig_list = sig_list->NEXT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The connected signals is simple */
|
||||||
|
ptsig = ptcon->SIG;
|
||||||
|
if (ptsig->TYPE == 'I')
|
||||||
|
{
|
||||||
|
(void) fprintf(ptfile, "%s", vlg_name (getsigname(ptsig)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (ptscan = ptfig->LOCON ; ptscan ; ptscan = ptscan->NEXT)
|
||||||
|
{
|
||||||
|
if (ptscan->SIG == ptsig) break;
|
||||||
|
}
|
||||||
|
if (ptscan == NULL)
|
||||||
|
{
|
||||||
|
(void) printf("\n*** mbk error *** no external connector \n");
|
||||||
|
(void) printf(" driving verilog file %s\n", ptfig->NAME);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(void) fprintf(ptfile, "%s", vlg_name(ptscan->NAME));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ptcon->NEXT != NULL)
|
||||||
|
(void) fprintf (ptfile, "),");
|
||||||
|
ptcon = ptcon->NEXT;
|
||||||
|
}
|
||||||
|
(void) fprintf(ptfile, "));\n");
|
||||||
|
}
|
||||||
|
ptfig->LOINS = (struct loins *) reverse ((chain_list *)ptfig->LOINS);
|
||||||
|
(void) fprintf(ptfile, "endmodule\n");
|
||||||
|
(void) fclose (ptfile);
|
||||||
|
}
|
Loading…
Reference in New Issue