entree de flatbeh....
ne compile pas encore car attente de l'install dans alliance 5.0 de abv...
This commit is contained in:
parent
ea4f18199c
commit
1538088ed6
|
@ -0,0 +1,3 @@
|
||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
SUBDIRS = doc src
|
|
@ -0,0 +1,33 @@
|
||||||
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
AC_INIT(src/main.c)
|
||||||
|
|
||||||
|
FLATBEH_MAJOR_VERSION=1
|
||||||
|
FLATBEH_MINOR_VERSION=1
|
||||||
|
FLATBEH_VERSION=$FLATBEH_MAJOR_VERSION.$FLATBEH_MINOR_VERSION
|
||||||
|
|
||||||
|
AC_SUBST(FLATBEH_MAJOR_VERSION)
|
||||||
|
AC_SUBST(FLATBEH_MINOR_VERSION)
|
||||||
|
AC_SUBST(FLATBEH_VERSION)
|
||||||
|
|
||||||
|
# For automake.
|
||||||
|
VERSION=$FLATBEH_VERSION
|
||||||
|
PACKAGE=flatbeh
|
||||||
|
|
||||||
|
dnl Initialize automake stuff
|
||||||
|
AM_INIT_AUTOMAKE($PACKAGE, $VERSION)
|
||||||
|
|
||||||
|
dnl Checks for programs.
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_PROG_MAKE_SET
|
||||||
|
|
||||||
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
AC_C_CONST
|
||||||
|
|
||||||
|
dnl For alliance path lib and includes
|
||||||
|
AM_ALLIANCE
|
||||||
|
|
||||||
|
AC_OUTPUT([
|
||||||
|
Makefile
|
||||||
|
doc/Makefile
|
||||||
|
src/Makefile
|
||||||
|
])
|
|
@ -0,0 +1,4 @@
|
||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
man_MANS = flatbeh.1
|
||||||
|
EXTRA_DIST = $(man_MANS)
|
|
@ -0,0 +1,64 @@
|
||||||
|
.\" @(#)abstract.1 1.0 15 mars 1995 UPMC; DICTUS Nathalie
|
||||||
|
.TH ABSTRACT 1 "15 mars 1995" "Release 1.0" "ALLIANCE USER COMMANDS"
|
||||||
|
|
||||||
|
.SH NAME
|
||||||
|
.PP
|
||||||
|
\fBabstract\fP \- Synthetizes a behavioral description from a structural description
|
||||||
|
|
||||||
|
.SH ORIGIN
|
||||||
|
This software belongs to the
|
||||||
|
.B ALLIANCE
|
||||||
|
CAD system from the
|
||||||
|
.br
|
||||||
|
CAO-VLSI team at MASI laboratory, University P. et M. Curie
|
||||||
|
.br
|
||||||
|
4, place Jussieu ; 75252 PARIS Cedex 05 ; FRANCE
|
||||||
|
.br
|
||||||
|
Fax: (33-1) 44.27.62.86 ; E-mail: cao-vlsi@masi.ibp.fr
|
||||||
|
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.PP
|
||||||
|
abstract \fIroot_structural_file\fP \fI[behavioral_file]\fP
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.PP
|
||||||
|
\fBabstract\fP synthetizes a VHDL behavioral data-flow description from a multilevel structural description. It flattens the structural description (it can be
|
||||||
|
a hierarchy of macro block) until the cells which have a behavioral
|
||||||
|
description. The output is a VHDL data-flow description.
|
||||||
|
|
||||||
|
.SH PARAMETERS
|
||||||
|
.PP
|
||||||
|
\fBroot_structural_file\fP is the filename of the root of the structural
|
||||||
|
description file.
|
||||||
|
|
||||||
|
\fBbehavioral_file\fP is the optional filename of the generated behavioral description file.
|
||||||
|
|
||||||
|
.SH ENVIRONMENT VARIABLES
|
||||||
|
.TP 20
|
||||||
|
\fIMBK_WORK_LIB\fP
|
||||||
|
Path of the directory that contains the structural description and where is generated the behavioral description.
|
||||||
|
.TP 20
|
||||||
|
\fIMBK_CATA_LIB\fP
|
||||||
|
List of directories containing leaf cell descriptions.
|
||||||
|
The default path is the current directory (see mbk(1)).
|
||||||
|
.TP 20
|
||||||
|
\fIMBK_CATAL_NAME\fP
|
||||||
|
Indicates the file where the behavioral description files are given. This serves
|
||||||
|
to abstract to stop the flatten of the structural root circuit (see mbk(1)).
|
||||||
|
.TP 20
|
||||||
|
\fIMBK_IN_LO\fP
|
||||||
|
file extension for structural entity (see mbk(1)).
|
||||||
|
|
||||||
|
.SH EXAMPLES
|
||||||
|
.PP
|
||||||
|
abstract adder32
|
||||||
|
.PP
|
||||||
|
abstract adder32 add32
|
||||||
|
|
||||||
|
.SH SEE ALSO
|
||||||
|
.PP
|
||||||
|
vhdl(5), mbk(1), MBK_WORK_LIB(8), MBK_CATA_LIB(8), MBK_CATAL_NAME(8), MBK_IN_LO(8).
|
||||||
|
|
||||||
|
.SH BUGS
|
||||||
|
.PP
|
||||||
|
Please e-mail to \fIcao-vlsi@masi.ibp.fr\fP for bug report and suggestions.
|
|
@ -0,0 +1,61 @@
|
||||||
|
.\" @(#)flatbeh.1 1.0 29 january 1993 UPMC; VUONG Huu Nghia
|
||||||
|
.TH FLATBEH 1 "29 january 1993" "Release 1.0" "ALLIANCE USER COMMANDS"
|
||||||
|
|
||||||
|
.SH NAME
|
||||||
|
.PP
|
||||||
|
\fBflatbeh\fP \- Synthetize a behavioral description from a structural description
|
||||||
|
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.PP
|
||||||
|
flatbeh \fIroot_structural_file\fP [ \fIoutput_file\fP ]
|
||||||
|
|
||||||
|
.SH ORIGIN
|
||||||
|
This software belongs to the
|
||||||
|
.B ALLIANCE
|
||||||
|
CAD system from the
|
||||||
|
.br
|
||||||
|
CAO-VLSI team at MASI laboratory, University P. et M. Curie
|
||||||
|
.br
|
||||||
|
4, place Jussieu ; 75252 PARIS Cedex 05 ; FRANCE
|
||||||
|
.br
|
||||||
|
Fax: (33-1) 44.27.62.86 ; E-mail: cao-vlsi@masi.ibp.fr
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.PP
|
||||||
|
\fBflatbeh\fP synthetize a VHDL behavioral data-flow description from a
|
||||||
|
structural description. It flattens the structural description (it can be
|
||||||
|
a hierarchy of macro block) until the cells which have a behavioral
|
||||||
|
description. Then it raise all the equations and create a behavioral
|
||||||
|
description of the root file.
|
||||||
|
|
||||||
|
.SH PARAMETERS
|
||||||
|
.PP
|
||||||
|
\fBroot_structural_file\fP is the filename of the root of the structural
|
||||||
|
description file.
|
||||||
|
|
||||||
|
\fBoutput_file\fP is the destination filename for behavioural description.
|
||||||
|
|
||||||
|
.SH ENVIRONMENT VARIABLES
|
||||||
|
.TP 20
|
||||||
|
\fIMBK_CATA_LIB\fP
|
||||||
|
list of directories containing descriptions.
|
||||||
|
The default path is the current directory (see mbk(1)).
|
||||||
|
.TP 20
|
||||||
|
\fIMBK_CATAL_NAME\fP
|
||||||
|
Indicates the file where the behavioral description files are given. This serves
|
||||||
|
to flatbeh to stop the flatten of the structural root circuit.(see mbk(1))
|
||||||
|
.TP 20
|
||||||
|
\fIMBK_IN_LO\fP
|
||||||
|
file extension for structural entity. (see mbk(1))
|
||||||
|
|
||||||
|
.SH EXAMPLE
|
||||||
|
.PP
|
||||||
|
flatbeh adder_32
|
||||||
|
|
||||||
|
.SH SEE ALSO
|
||||||
|
.PP
|
||||||
|
vhdl(5), mbk(1).
|
||||||
|
|
||||||
|
.SH BUGS
|
||||||
|
.PP
|
||||||
|
Please e-mail to \fIcao-vlsi@masi.ibp.fr\fP for bug report and suggestions.
|
|
@ -0,0 +1,9 @@
|
||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
bin_PROGRAMS = flatbeh
|
||||||
|
|
||||||
|
flatbeh_LDADD = @LIBS@ \
|
||||||
|
-lAbv -lAbe -lAbt -lMlu -lMcl -lMal -lMsl -lMhl -lMel -lMvl -lMgl -lRcn -lMlo -lBdd -lAbl -lAut -lMut
|
||||||
|
|
||||||
|
flatbeh_SOURCES = abstract.c abstract.h utils.c utils.h main.c
|
||||||
|
|
|
@ -0,0 +1,719 @@
|
||||||
|
/*
|
||||||
|
* 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 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <mut.h>
|
||||||
|
#include <mlo.h>
|
||||||
|
#include <mlu.h>
|
||||||
|
#include <abl.h>
|
||||||
|
#include <abe.h>
|
||||||
|
#include <abv.h>
|
||||||
|
#include <aut.h>
|
||||||
|
#include "abstract.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
create : Regenere un ABL en substituant les variables formelles
|
||||||
|
par les signaux de la lofig
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
parametres : en ABL, un modele d'instance et une table de hasch.
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
return : un ABL.
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
chain_list *create(expr, model, tableTH)
|
||||||
|
chain_list *expr;
|
||||||
|
loins_list *model;
|
||||||
|
authtable* tableTH;
|
||||||
|
{
|
||||||
|
chain_list *ret;
|
||||||
|
locon_list *con;
|
||||||
|
|
||||||
|
if (ABL_ATOM(expr))
|
||||||
|
{
|
||||||
|
if (ABL_ATOM_VALUE(expr) == namealloc("'1'"))
|
||||||
|
return createablatom("'1'");
|
||||||
|
|
||||||
|
if (ABL_ATOM_VALUE(expr) == namealloc("'0'"))
|
||||||
|
return createablatom("'0'");
|
||||||
|
|
||||||
|
for(con = model->LOCON; (con && (ABL_ATOM_VALUE(expr) != con->NAME));
|
||||||
|
con = con->NEXT);
|
||||||
|
if (con)
|
||||||
|
{
|
||||||
|
/* variable de expr est un connecteur de l'interface */
|
||||||
|
chain_list *lstCon;
|
||||||
|
chain_list *retour = (chain_list *)NULL;
|
||||||
|
ptype_list *liste = getptype(con->SIG->USER, (long)LOFIGCHAIN);
|
||||||
|
|
||||||
|
if (!liste)
|
||||||
|
{
|
||||||
|
printf("ERROR : No lofigchain for %s of %s\n", con->NAME, model->FIGNAME);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(((chain_list *)liste->DATA)->NEXT))
|
||||||
|
{
|
||||||
|
printf("ERROR : Nothing connected to %s (Index %ld-TYPE %c) of %s\n\n",
|
||||||
|
con->NAME, con->SIG->INDEX, con->SIG->TYPE, model->INSNAME);
|
||||||
|
printf("Please verify your CATAL file !\n\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (con->SIG->TYPE == EXTERNAL)
|
||||||
|
{
|
||||||
|
for(lstCon = (chain_list *)liste->DATA; lstCon; lstCon = lstCon->NEXT)
|
||||||
|
{
|
||||||
|
locon_list *conAux = (locon_list *)lstCon->DATA;
|
||||||
|
|
||||||
|
if (conAux->ROOT != (void *)model)
|
||||||
|
{
|
||||||
|
if ((conAux->TYPE == EXTERNAL) && (conAux->DIRECTION == IN || conAux->DIRECTION == INOUT))
|
||||||
|
retour = createablatom(conAux->NAME);
|
||||||
|
else
|
||||||
|
if ((conAux->TYPE == INTERNAL) &&
|
||||||
|
((conAux->DIRECTION == OUT) ||
|
||||||
|
(conAux->DIRECTION == INOUT) ||
|
||||||
|
(conAux->DIRECTION == TRISTATE) ||
|
||||||
|
(conAux->DIRECTION == TRANSCV)))
|
||||||
|
{
|
||||||
|
char * nameAtom = mbkalloc(strlen(getsigname(con->SIG)) + 4);
|
||||||
|
sprintf(nameAtom, "%s", getsigname(con->SIG));
|
||||||
|
retour = createablatom(nameAtom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(lstCon = (chain_list *)liste->DATA; lstCon; lstCon = lstCon->NEXT)
|
||||||
|
{
|
||||||
|
locon_list *conAux = (locon_list *)lstCon->DATA;
|
||||||
|
/*printf(" %s %c\n",conAux->NAME,conAux->DIRECTION);*/
|
||||||
|
|
||||||
|
if (conAux->ROOT != (void *)model)
|
||||||
|
{
|
||||||
|
if ((conAux->DIRECTION == OUT) ||
|
||||||
|
(conAux->DIRECTION == INOUT) ||
|
||||||
|
(conAux->DIRECTION == TRISTATE) ||
|
||||||
|
(conAux->DIRECTION == TRANSCV))
|
||||||
|
{
|
||||||
|
char * nameAtom = mbkalloc(strlen(getsigname(con->SIG)) + 4);
|
||||||
|
|
||||||
|
sprintf(nameAtom, "%s", getsigname(con->SIG));
|
||||||
|
retour = createablatom(nameAtom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((conAux->DIRECTION == INOUT) || (conAux->DIRECTION == OUT))
|
||||||
|
{
|
||||||
|
char * nameAtom = mbkalloc(strlen(getsigname(con->SIG)) + 4);
|
||||||
|
sprintf(nameAtom, "%s", getsigname(con->SIG));
|
||||||
|
retour = createablatom(nameAtom);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!retour)
|
||||||
|
{
|
||||||
|
printf("ERROR : nothing for connector %s of %s [%s]\n",
|
||||||
|
con->NAME, model->INSNAME, model->FIGNAME);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
return retour;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* ce n'est pas un connecteur de l'interface */
|
||||||
|
authelem *val;
|
||||||
|
|
||||||
|
if ((val = searchauthelem(tableTH, ABL_ATOM_VALUE(expr))) != NULL)
|
||||||
|
return createablatom((char *)val->VALUE);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *auxName = (char *)mbkalloc(strlen(model->INSNAME) +
|
||||||
|
strlen(ABL_ATOM_VALUE(expr)) + 2);
|
||||||
|
sprintf(auxName, "%s_%s", model->INSNAME, ABL_ATOM_VALUE(expr));
|
||||||
|
|
||||||
|
/*printf("WARNING : %s not foundn\n", ABL_ATOM_VALUE(expr));*/
|
||||||
|
addauthelem(tableTH, ABL_ATOM_VALUE(expr), (long) auxName);
|
||||||
|
return createablatom(auxName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
chain_list *arg;
|
||||||
|
|
||||||
|
ret = createabloper(ABL_OPER(expr));
|
||||||
|
for(arg = ABL_CDR(expr); arg; arg = ABL_CDR(arg))
|
||||||
|
addablqexpr(ret, create(ABL_CAR(arg), model, tableTH));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
searchMod :
|
||||||
|
-------------------------------------------------------
|
||||||
|
parametres : une lofig.
|
||||||
|
-------------------------------------------------------
|
||||||
|
return : une befig.
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
befig_list *searchMod(liste, name)
|
||||||
|
befig_list *liste;
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
befig_list *l;
|
||||||
|
|
||||||
|
for(l = liste; l; l = l->NEXT)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
printf("\tModel %s\n", l->NAME);
|
||||||
|
*/
|
||||||
|
if (l->NAME == name)
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
return (befig_list *)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
addConDirLof : MAJ direction des connecteurs externes (fct de no_system.c)
|
||||||
|
certains connecteurs deviennent des inout apres mise a plat
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
retour : lofig physiquement modifiee
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
void addConDirLof(lofig)
|
||||||
|
lofig_list *lofig;
|
||||||
|
{
|
||||||
|
locon_list *connect;
|
||||||
|
|
||||||
|
for(connect = lofig->LOCON; connect; connect = connect->NEXT)
|
||||||
|
{
|
||||||
|
chain_list *l;
|
||||||
|
ptype_list *liste = getptype(connect->SIG->USER, (long)LOFIGCHAIN);
|
||||||
|
char dir = ((locon_list *)(((chain_list *)(liste->DATA))->DATA))->DIRECTION;
|
||||||
|
|
||||||
|
for (l = (chain_list *)(liste->DATA); l; l = l->NEXT)
|
||||||
|
if (((locon_list *)(l->DATA))->TYPE != EXTERNAL &&
|
||||||
|
dir != INOUT && ((locon_list*)(l->DATA))->DIRECTION != dir)
|
||||||
|
dir = INOUT;
|
||||||
|
connect->DIRECTION = dir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
RestoreDir : met a jour les directions de connecteurs
|
||||||
|
-------------------------------------------------------
|
||||||
|
parametres : une loins.
|
||||||
|
-------------------------------------------------------
|
||||||
|
return :
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void RestoreDir(ptr_loins, ptr_befig)
|
||||||
|
loins_list *ptr_loins;
|
||||||
|
befig_list *ptr_befig;
|
||||||
|
{
|
||||||
|
struct bepor *ptr_bepor;
|
||||||
|
struct locon *ptr_locon;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (ptr_locon = ptr_loins->LOCON; ptr_locon; ptr_locon = ptr_locon->NEXT)
|
||||||
|
{
|
||||||
|
for (ptr_bepor = ptr_befig->BEPOR; ptr_bepor; ptr_bepor = ptr_bepor->NEXT)
|
||||||
|
{
|
||||||
|
if (ptr_locon->NAME == ptr_bepor->NAME)
|
||||||
|
{
|
||||||
|
switch(ptr_bepor->DIRECTION)
|
||||||
|
{
|
||||||
|
case 'I': ptr_locon->DIRECTION = IN ;break;
|
||||||
|
case 'O': ptr_locon->DIRECTION = OUT ;break;
|
||||||
|
case 'B': ptr_locon->DIRECTION = INOUT;break;
|
||||||
|
case 'Z': ptr_locon->DIRECTION = TRISTATE;break;
|
||||||
|
case 'T': ptr_locon->DIRECTION = TRANSCV;break;
|
||||||
|
default:;
|
||||||
|
}
|
||||||
|
/*printf(" Loins %s Locon %s Direction %c\n",ptr_loins->INSNAME,ptr_locon->NAME, ptr_locon->DIRECTION);*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
laxExtract : retourne une befig a partir d'une lofig et d'une bibliotheque
|
||||||
|
-------------------------------------------------------
|
||||||
|
parametres : une lofig.
|
||||||
|
-------------------------------------------------------
|
||||||
|
return : une befig.
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
befig_list *laxExtract(lofig, trace)
|
||||||
|
lofig_list *lofig;
|
||||||
|
int trace;
|
||||||
|
{
|
||||||
|
befig_list *befig;
|
||||||
|
befig_list *ptbefig = NULL;
|
||||||
|
locon_list *con;
|
||||||
|
loins_list *inst;
|
||||||
|
chain_list *mod;
|
||||||
|
int cptLabel = 0;
|
||||||
|
authelem* ret;
|
||||||
|
authtable* busTH = createauthtable(100);
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------- compilation des modeles --------------------------------*/
|
||||||
|
|
||||||
|
for(mod = lofig->MODELCHAIN; mod; mod = mod->NEXT)
|
||||||
|
{
|
||||||
|
ptbefig = (befig_list *)vhdlloadbefig(ptbefig, (char *)mod->DATA, 0);
|
||||||
|
printf(" loading %s \n",ptbefig->NAME);
|
||||||
|
/*beh_depend(ptbefig);*/
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for(inst = lofig->LOINS; inst; inst = inst->NEXT)
|
||||||
|
{
|
||||||
|
befig_list *modBefig = searchMod(ptbefig, inst->FIGNAME);
|
||||||
|
RestoreDir(inst,modBefig);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*ret = restorealldir(lofig);
|
||||||
|
|
||||||
|
if (!ret) exit(1);
|
||||||
|
printf("restore dir OK \n");*/
|
||||||
|
|
||||||
|
/*--------------- mise a jour des directions des conecteurs externes -----*/
|
||||||
|
|
||||||
|
addConDirLof(lofig);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*-------------- creation de la befig resultat --------------------------*/
|
||||||
|
|
||||||
|
befig = beh_addbefig(NULL, lofig->NAME);
|
||||||
|
|
||||||
|
/* mise a jour des BEPOR, BERIN, BEOUT */
|
||||||
|
for(con = lofig->LOCON; con; con = con->NEXT)
|
||||||
|
{
|
||||||
|
if ((isvdd(con->NAME)) || (isvss(con->NAME)))
|
||||||
|
befig->BEPOR = beh_addbepor(befig->BEPOR, con->NAME, 'I', 'B');
|
||||||
|
else
|
||||||
|
if ((con->DIRECTION == TRISTATE) || (con->DIRECTION == TRANSCV))
|
||||||
|
/* en fait il faut recuperer le type du modele ... */
|
||||||
|
befig->BEPOR = beh_addbepor(befig->BEPOR, con->NAME,
|
||||||
|
con->DIRECTION, 'M');
|
||||||
|
else
|
||||||
|
befig->BEPOR = beh_addbepor(befig->BEPOR, con->NAME, con->DIRECTION, 'B');
|
||||||
|
|
||||||
|
if (trace)
|
||||||
|
printf(" POR %s (DIR = %c, TYPE = %c)\n", con->NAME, con->DIRECTION,
|
||||||
|
con->TYPE);
|
||||||
|
|
||||||
|
if ((con->DIRECTION == IN) || (con->DIRECTION == INOUT))
|
||||||
|
befig->BERIN = beh_addberin(befig->BERIN, con->NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* respect de l'ordre de l'interface */
|
||||||
|
befig->BEPOR = (bepor_list *)reverse((chain_list*)befig->BEPOR);
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------ parcours des instances de la lofig ----------------------*/
|
||||||
|
|
||||||
|
for(inst = lofig->LOINS; inst; inst = inst->NEXT)
|
||||||
|
{
|
||||||
|
befig_list *modBefig = searchMod(ptbefig, inst->FIGNAME);
|
||||||
|
int nbSorties = 0;
|
||||||
|
|
||||||
|
for(con = inst->LOCON; con; con = con->NEXT)
|
||||||
|
if ((con->DIRECTION == OUT) || (con->DIRECTION == INOUT) ||
|
||||||
|
(con->DIRECTION == TRANSCV) || (con->DIRECTION == TRISTATE))
|
||||||
|
nbSorties++;
|
||||||
|
|
||||||
|
if (trace)
|
||||||
|
printf("-- Inst %s [%s]\n", inst->INSNAME, inst->FIGNAME);
|
||||||
|
|
||||||
|
if (modBefig)
|
||||||
|
{
|
||||||
|
authtable* intTH = createauthtable(10); /* TH des signaux internes */
|
||||||
|
beaux_list *aux;
|
||||||
|
bereg_list *reg;
|
||||||
|
bebus_list *bus;
|
||||||
|
bebux_list *bux;
|
||||||
|
beout_list *sortie;
|
||||||
|
|
||||||
|
/* Gestion des auxiliaires */
|
||||||
|
for(aux = modBefig->BEAUX; aux; aux = aux->NEXT)
|
||||||
|
{
|
||||||
|
chain_list *newExpr;
|
||||||
|
char *auxName = (char *)mbkalloc(strlen(inst->INSNAME) +
|
||||||
|
strlen(aux->NAME) + 2);
|
||||||
|
|
||||||
|
sprintf(auxName, "%s_%s", inst->INSNAME, aux->NAME);
|
||||||
|
if (searchauthelem(intTH, aux->NAME) == NULL)
|
||||||
|
addauthelem(intTH, aux->NAME, (long)auxName);
|
||||||
|
|
||||||
|
newExpr = create(aux->ABL, inst, intTH);
|
||||||
|
|
||||||
|
if (trace)
|
||||||
|
{
|
||||||
|
printf(" AUX %s (%s)\n", aux->NAME, auxName);
|
||||||
|
printf(" ");
|
||||||
|
viewablexpr(aux->ABL,ABL_VIEW_INFIX);
|
||||||
|
printf(" ");
|
||||||
|
viewablexpr(newExpr,ABL_VIEW_INFIX);
|
||||||
|
}
|
||||||
|
|
||||||
|
befig->BEAUX = beh_addbeaux(befig->BEAUX, auxName,
|
||||||
|
newExpr, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------- Gestion des registres ----------------------*/
|
||||||
|
|
||||||
|
for(reg = modBefig->BEREG; reg; reg = reg->NEXT)
|
||||||
|
{
|
||||||
|
biabl_list *bi;
|
||||||
|
biabl_list *newBi = (biabl_list *)NULL;
|
||||||
|
char *regName=NULL;
|
||||||
|
|
||||||
|
/*if register of standard cell*/
|
||||||
|
if (!modBefig->BEBUS && !modBefig->BEBUX && !modBefig->BEREG->NEXT && modBefig->BEOUT && !modBefig->BEOUT->NEXT && ABL_ATOM(modBefig->BEOUT->ABL) && ABL_ATOM_VALUE(modBefig->BEOUT->ABL)==reg->NAME) {
|
||||||
|
for(con = inst->LOCON; con; con = con->NEXT)
|
||||||
|
if (modBefig->BEOUT->NAME==con->NAME) break;
|
||||||
|
if (!con) {
|
||||||
|
fprintf(stderr,"locon %s not found\n",modBefig->BEOUT->NAME);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
regName = getsigname(con->SIG);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
regName = mbkalloc(strlen(inst->INSNAME) +
|
||||||
|
strlen(reg->NAME) + 2);
|
||||||
|
/* registre tres interne */
|
||||||
|
sprintf(regName, "%s_%s", inst->INSNAME, reg->NAME);
|
||||||
|
} /*end of loop*/
|
||||||
|
|
||||||
|
if (trace)
|
||||||
|
printf(" BEREG %s (%s)\n", reg->NAME, regName);
|
||||||
|
|
||||||
|
for(bi = reg->BIABL; bi; bi = bi->NEXT)
|
||||||
|
{
|
||||||
|
chain_list *newVal;
|
||||||
|
chain_list *newCnd;
|
||||||
|
char *labelName = (char *)mbkalloc(12);
|
||||||
|
|
||||||
|
addauthelem(intTH, reg->NAME, (long)regName);
|
||||||
|
newVal = create(bi->VALABL, inst, intTH);
|
||||||
|
newCnd = create(bi->CNDABL, inst, intTH);
|
||||||
|
|
||||||
|
if (trace)
|
||||||
|
{
|
||||||
|
printf(" VAL");
|
||||||
|
viewablexpr(bi->VALABL,ABL_VIEW_INFIX);
|
||||||
|
printf(" ");
|
||||||
|
viewablexpr(newVal,ABL_VIEW_INFIX);
|
||||||
|
printf(" CMD");
|
||||||
|
viewablexpr(bi->CNDABL,ABL_VIEW_INFIX);
|
||||||
|
printf(" ");
|
||||||
|
viewablexpr(newCnd,ABL_VIEW_INFIX);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(labelName, "label_%d", cptLabel++);
|
||||||
|
newBi = beh_addbiabl(newBi, labelName, newCnd, newVal);
|
||||||
|
}
|
||||||
|
befig->BEREG = beh_addbereg(befig->BEREG, regName, newBi, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Gestion des bus externes */
|
||||||
|
for(bus = modBefig->BEBUS; bus; bus = bus->NEXT)
|
||||||
|
{
|
||||||
|
char *busName=NULL;
|
||||||
|
biabl_list *bi;
|
||||||
|
biabl_list *newBi = (biabl_list *)NULL;
|
||||||
|
char *labelName = (char *)mbkalloc(12);
|
||||||
|
|
||||||
|
if (trace)
|
||||||
|
printf(" BUS %s\n", bus->NAME);
|
||||||
|
|
||||||
|
for(bi = bus->BIABL; bi; bi = bi->NEXT)
|
||||||
|
{
|
||||||
|
chain_list *newVal;
|
||||||
|
chain_list *newCnd;
|
||||||
|
|
||||||
|
newVal = create(bi->VALABL, inst, intTH);
|
||||||
|
newCnd = create(bi->CNDABL, inst, intTH);
|
||||||
|
|
||||||
|
if (trace)
|
||||||
|
{
|
||||||
|
printf(" VAL");
|
||||||
|
viewablexpr(bi->VALABL,ABL_VIEW_INFIX);
|
||||||
|
printf(" ");
|
||||||
|
viewablexpr(newVal,ABL_VIEW_INFIX);
|
||||||
|
printf(" CMD");
|
||||||
|
viewablexpr(bi->CNDABL,ABL_VIEW_INFIX);
|
||||||
|
printf(" ");
|
||||||
|
viewablexpr(newCnd,ABL_VIEW_INFIX);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(labelName, "label_%d", cptLabel++);
|
||||||
|
newBi = beh_addbiabl(newBi, labelName, newCnd, newVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(con = inst->LOCON; con; con = con->NEXT)
|
||||||
|
if (con->NAME == bus->NAME)
|
||||||
|
{
|
||||||
|
int cptInt = 0;
|
||||||
|
|
||||||
|
if (con->SIG->TYPE == EXTERNAL)
|
||||||
|
{
|
||||||
|
/* on a reellement un bus externe */
|
||||||
|
chain_list *lstCon;
|
||||||
|
ptype_list *liste = getptype(con->SIG->USER,
|
||||||
|
(long)LOFIGCHAIN);
|
||||||
|
|
||||||
|
if (liste)
|
||||||
|
{
|
||||||
|
for(lstCon = (chain_list *)liste->DATA;
|
||||||
|
lstCon; lstCon = lstCon->NEXT)
|
||||||
|
{
|
||||||
|
locon_list *conAux = (locon_list *)lstCon->DATA;
|
||||||
|
|
||||||
|
if (conAux->ROOT != (void *)inst)
|
||||||
|
{
|
||||||
|
if ((conAux->TYPE != EXTERNAL) &&
|
||||||
|
(conAux->DIRECTION == IN))
|
||||||
|
cptInt++;
|
||||||
|
if (conAux->TYPE == EXTERNAL)
|
||||||
|
busName = conAux->NAME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ret = searchauthelem(busTH, busName)) == NULL)
|
||||||
|
{
|
||||||
|
if (cptInt == 0)
|
||||||
|
befig->BEBUS = beh_addbebus(befig->BEBUS, busName,
|
||||||
|
newBi, NULL, bus->TYPE);
|
||||||
|
else
|
||||||
|
befig->BEBUS = beh_addbebus(befig->BEBUS, busName,
|
||||||
|
newBi, NULL, bus->TYPE);
|
||||||
|
addauthelem(busTH, busName,(long) befig->BEBUS);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* le bus existe deja :
|
||||||
|
on accroche le nouveau biabl */
|
||||||
|
biabl_list *n;
|
||||||
|
|
||||||
|
for(n = newBi; n && n->NEXT; n = n->NEXT)
|
||||||
|
;
|
||||||
|
n->NEXT = ((bebus_list *)ret->VALUE)->BIABL;
|
||||||
|
((bebus_list *)ret->VALUE)->BIABL = newBi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("ERROR : No LOFIGCHAIN for %s [%s] (%s)\n",
|
||||||
|
inst->INSNAME, inst->FIGNAME,
|
||||||
|
getsigname(con->SIG));
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* signal interne dans la lofig = bus interne*/
|
||||||
|
busName = (char *)mbkalloc(strlen(getsigname(con->SIG)) + 4);
|
||||||
|
|
||||||
|
sprintf(busName, "%s", getsigname(con->SIG));
|
||||||
|
busName = namealloc(busName);
|
||||||
|
if ((ret = searchauthelem(busTH, busName)) == NULL)
|
||||||
|
{
|
||||||
|
befig->BEBUX = beh_addbebux(befig->BEBUX, busName, newBi,
|
||||||
|
NULL, bus->TYPE);
|
||||||
|
addauthelem(busTH, busName, (long)befig->BEBUX);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* le bux existe deja :
|
||||||
|
on accroche le nouveau biabl */
|
||||||
|
biabl_list *n;
|
||||||
|
|
||||||
|
for(n = newBi; n && n->NEXT; n = n->NEXT)
|
||||||
|
;
|
||||||
|
n->NEXT = ((bebux_list *)ret->VALUE)->BIABL;
|
||||||
|
((bebux_list *)ret->VALUE)->BIABL = newBi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addauthelem(intTH, bus->NAME, (long)busName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Gestion des bus internes */
|
||||||
|
for(bux = modBefig->BEBUX; bux; bux = bux->NEXT)
|
||||||
|
{
|
||||||
|
biabl_list *bi;
|
||||||
|
biabl_list *newBi = (biabl_list *)NULL;
|
||||||
|
char *buxName = (char *)mbkalloc(strlen(inst->INSNAME) +
|
||||||
|
strlen(bux->NAME) + 2);
|
||||||
|
|
||||||
|
sprintf(buxName, "%s_%s", inst->INSNAME, bux->NAME);
|
||||||
|
|
||||||
|
if (trace)
|
||||||
|
printf(" BUX %s\n", bux->NAME);
|
||||||
|
|
||||||
|
for(bi = bux->BIABL; bi; bi = bi->NEXT)
|
||||||
|
{
|
||||||
|
chain_list *newVal;
|
||||||
|
chain_list *newCnd;
|
||||||
|
char *labelName = (char *)mbkalloc(12);
|
||||||
|
|
||||||
|
addauthelem(intTH, bux->NAME, (long)buxName);
|
||||||
|
newVal = create(bi->VALABL, inst, intTH);
|
||||||
|
newCnd = create(bi->CNDABL, inst, intTH);
|
||||||
|
|
||||||
|
if (trace)
|
||||||
|
{
|
||||||
|
printf(" VAL");
|
||||||
|
viewablexpr(bi->VALABL,ABL_VIEW_INFIX);
|
||||||
|
printf(" ");
|
||||||
|
viewablexpr(newVal,ABL_VIEW_INFIX);
|
||||||
|
printf(" CMD");
|
||||||
|
viewablexpr(bi->CNDABL,ABL_VIEW_INFIX);
|
||||||
|
printf(" ");
|
||||||
|
viewablexpr(newCnd,ABL_VIEW_INFIX);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(labelName,"label_%d", cptLabel++);
|
||||||
|
newBi = beh_addbiabl(newBi, labelName, newCnd, newVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ret = searchauthelem(busTH, buxName)) == NULL)
|
||||||
|
{
|
||||||
|
befig->BEBUX = beh_addbebux(befig->BEBUX, buxName, newBi,
|
||||||
|
NULL, bux->TYPE);
|
||||||
|
addauthelem(busTH, buxName, (long)befig->BEBUX);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* le bux existe deja :
|
||||||
|
on accroche le nouveau biabl */
|
||||||
|
biabl_list *n;
|
||||||
|
|
||||||
|
for(n = newBi; n && n->NEXT; n = n->NEXT)
|
||||||
|
;
|
||||||
|
n->NEXT = ((bebux_list *)ret->VALUE)->BIABL;
|
||||||
|
((bebux_list *)ret->VALUE)->BIABL = newBi;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Gestion des sorties */
|
||||||
|
for(sortie = modBefig->BEOUT; sortie; sortie = sortie->NEXT)
|
||||||
|
{
|
||||||
|
/*absorb beout for register of standard cell*/
|
||||||
|
if (!modBefig->BEBUS && !modBefig->BEBUX && modBefig->BEREG && !modBefig->BEREG->NEXT && modBefig->BEOUT && !modBefig->BEOUT->NEXT && ABL_ATOM(modBefig->BEOUT->ABL) && ABL_ATOM_VALUE(modBefig->BEOUT->ABL)==modBefig->BEREG->NAME) continue;
|
||||||
|
|
||||||
|
for(con = inst->LOCON; con; con = con->NEXT)
|
||||||
|
if (sortie->NAME == con->NAME)
|
||||||
|
{
|
||||||
|
chain_list *newExpr;
|
||||||
|
char *nameAux = (char *)mbkalloc(strlen(getsigname(con->SIG)) + 4);
|
||||||
|
|
||||||
|
sprintf(nameAux, "%s", getsigname(con->SIG));
|
||||||
|
newExpr = create(sortie->ABL, inst, intTH);
|
||||||
|
|
||||||
|
if (trace)
|
||||||
|
{
|
||||||
|
printf(" OUT %s\n", sortie->NAME);
|
||||||
|
printf(" ");
|
||||||
|
viewablexpr(sortie->ABL,ABL_VIEW_INFIX);
|
||||||
|
printf(" ");
|
||||||
|
viewablexpr(newExpr,ABL_VIEW_INFIX);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (con->SIG->TYPE == INTERNAL)
|
||||||
|
{
|
||||||
|
befig->BEAUX = beh_addbeaux(befig->BEAUX,
|
||||||
|
nameAux,
|
||||||
|
newExpr, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* signal interne dans la lofig */
|
||||||
|
chain_list *lstCon;
|
||||||
|
int cptInt = 0;
|
||||||
|
char *outName=NULL;
|
||||||
|
ptype_list *liste = getptype(con->SIG->USER,
|
||||||
|
(long)LOFIGCHAIN);
|
||||||
|
|
||||||
|
if (liste)
|
||||||
|
{
|
||||||
|
for(lstCon = (chain_list *)liste->DATA;
|
||||||
|
lstCon; lstCon = lstCon->NEXT)
|
||||||
|
{
|
||||||
|
locon_list *conAux = (locon_list *)lstCon->DATA;
|
||||||
|
|
||||||
|
if (conAux->ROOT != (void *)inst)
|
||||||
|
{
|
||||||
|
if ((conAux->TYPE != EXTERNAL) &&
|
||||||
|
(conAux->DIRECTION == IN))
|
||||||
|
cptInt++;
|
||||||
|
if (conAux->TYPE == EXTERNAL)
|
||||||
|
outName = conAux->NAME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cptInt == 0)
|
||||||
|
/* sortie directe */
|
||||||
|
befig->BEOUT = beh_addbeout(befig->BEOUT, outName,
|
||||||
|
newExpr, NULL);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* cas de la sortie reinjectee */
|
||||||
|
befig->BEAUX = beh_addbeaux(befig->BEAUX, nameAux,
|
||||||
|
newExpr, NULL);
|
||||||
|
befig->BEOUT = beh_addbeout(befig->BEOUT, outName,
|
||||||
|
createablatom(nameAux), NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("ERROR : No LOFIGCHAIN for %s [%s] (%s)\n",
|
||||||
|
inst->INSNAME, inst->FIGNAME,
|
||||||
|
getsigname(con->SIG));
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
destroyauthtable(intTH);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Error : le model %s n'existe pas !\n", inst->FIGNAME);
|
||||||
|
return (befig_list *)NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* nettoyage de la bibliotheque : quand ca voudra bien marcher */
|
||||||
|
/*
|
||||||
|
beh_frebefig(ptbefig);
|
||||||
|
*/
|
||||||
|
|
||||||
|
destroyauthtable(busTH);
|
||||||
|
return(befig);
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* 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 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern chain_list *create();
|
||||||
|
extern befig_list *searchMod();
|
||||||
|
extern befig_list *laxExtract();
|
|
@ -0,0 +1,147 @@
|
||||||
|
/*
|
||||||
|
* 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 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* Chaine de CAO & VLSI Alliance */
|
||||||
|
/* */
|
||||||
|
/* Produit : Extracteur de vue comportementale */
|
||||||
|
/* Fichier : main.c */
|
||||||
|
/* */
|
||||||
|
/* (c) copyright 1991 Laboratoire MASI equipe CAO & VLSI */
|
||||||
|
/* Tous droits reserves */
|
||||||
|
/* Support : e-mail cao-vlsi@masi.ibp.fr */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/****************************************************************************/
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <mut.h>
|
||||||
|
#include <mlo.h>
|
||||||
|
#include <mlu.h>
|
||||||
|
#include <abl.h>
|
||||||
|
#include <abe.h>
|
||||||
|
#include <abv.h>
|
||||||
|
#include <aut.h>
|
||||||
|
#include <bdd.h>
|
||||||
|
#include "utils.h"
|
||||||
|
#include "abstract.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ********* MAIN ********* */
|
||||||
|
extern int main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
{
|
||||||
|
befig_list *befig;
|
||||||
|
lofig_list *lofig;
|
||||||
|
int trace = 0;
|
||||||
|
char *outputFile;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
alliancebanner_with_authors("FlatBeh", VERSION " [2000/11/01]", "a netlist abstractor", "1993",
|
||||||
|
"5.0", "François DONNET, Huu Nghia VUONG");
|
||||||
|
|
||||||
|
if ((argc < 2) || (argc > 3))
|
||||||
|
{
|
||||||
|
printf("\nflatbeh %s\n", VERSION);
|
||||||
|
printf("\nUsage\t: flatbeh input_file [output_file]\n\n");
|
||||||
|
printf("\t input_file = circuit at gate level\n");
|
||||||
|
printf("\t output_file = circuit at logic level (default name = input_file + abs)\n\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*init*/
|
||||||
|
mbkenv(); /*mbk*/
|
||||||
|
ablenv(); /*abl*/
|
||||||
|
autenv(); /*hash table*/
|
||||||
|
bddenv(); /*for vhdlloadbefig() */
|
||||||
|
|
||||||
|
if (mbkgetenv("MBK_TRACE"))
|
||||||
|
trace = atoi(mbkgetenv("MBK_TRACE"));
|
||||||
|
|
||||||
|
if (argc == 2)
|
||||||
|
{
|
||||||
|
outputFile = mbkalloc(strlen(argv[1]) + 4);
|
||||||
|
|
||||||
|
sprintf(outputFile, "%sabs", argv[1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
outputFile = argv[2];
|
||||||
|
|
||||||
|
|
||||||
|
printf(" ========================= Environnement =========================\n");
|
||||||
|
printf(" MBK_WORK_LIB = %s\n", WORK_LIB);
|
||||||
|
printf(" MBK_CATA_LIB = %s\n", mbkgetenv("MBK_CATA_LIB"));
|
||||||
|
printf(" MBK_CATAL_NAME = %s\n", mbkgetenv("MBK_CATAL_NAME"));
|
||||||
|
if (trace > 0)
|
||||||
|
printf(" MBK_TRACE = %d\n", trace);
|
||||||
|
printf(" ============================== Files ==============================\n");
|
||||||
|
printf(" Netlist file = %s.%s\n", argv[1], IN_LO);
|
||||||
|
printf(" Output file = %s.vbe\n", outputFile);
|
||||||
|
printf(" ===================================================================\n");
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
/* mise a plat de la figure */
|
||||||
|
lofig = getlofig(argv[1], 'A');
|
||||||
|
fprintf (stdout,"Loading '%s/%s.%s'\n", WORK_LIB, lofig->NAME, IN_LO);
|
||||||
|
/*------------------ mise a plat de la figure -------------------- */
|
||||||
|
|
||||||
|
printf("flattening figure %s \n",lofig->NAME);
|
||||||
|
|
||||||
|
rflattenlofig(lofig, YES, YES);
|
||||||
|
|
||||||
|
if ((!(lofig->LOINS)) || (lofig->LOTRS))
|
||||||
|
{
|
||||||
|
printf("ERROR : Transistor level description in %s : verify your CATAL file !\n",
|
||||||
|
lofig->NAME);
|
||||||
|
#ifdef LAX
|
||||||
|
LXU_Error("Transistor level description : verify your CATAL file !");
|
||||||
|
#endif
|
||||||
|
exit(0);;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------ chainage de la figure -------------------------*/
|
||||||
|
|
||||||
|
lofigchain(lofig);
|
||||||
|
befig = laxExtract(lofig, trace);
|
||||||
|
fprintf(stdout,"Restoring array's orders \n");
|
||||||
|
RestoreIndexes(befig);
|
||||||
|
if (!befig)
|
||||||
|
{
|
||||||
|
fprintf(stderr,"Some error has occurred\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
befig->NAME = outputFile;
|
||||||
|
|
||||||
|
/* if (trace) displayBehMap(befig, 1); */
|
||||||
|
|
||||||
|
vhdlsavebefig(befig, 1);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,467 @@
|
||||||
|
/*
|
||||||
|
* 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 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <mut.h>
|
||||||
|
#include <mlo.h>
|
||||||
|
#include <abl.h>
|
||||||
|
#include <abe.h>
|
||||||
|
#include <aut.h>
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
long max_index;
|
||||||
|
|
||||||
|
char *itostr(str,nbr)
|
||||||
|
char *str;
|
||||||
|
int nbr;
|
||||||
|
{
|
||||||
|
char *s = (char *)mbkalloc(strlen(str)+5);
|
||||||
|
strcpy(s,str);
|
||||||
|
strcat(s,"%d");
|
||||||
|
sprintf(s,s,nbr);
|
||||||
|
return ((char *)s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Usage(nom)
|
||||||
|
char *nom;
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("Usage : %s <input_file> [-b -P] [-a <output_file>] \n",nom);
|
||||||
|
printf(" [-R <ratio value>] [-S <SEED value>]\n");
|
||||||
|
printf(" [-N <number of parts>] \n");
|
||||||
|
printf("\n");
|
||||||
|
printf("-b Loading Behavioral description .\n");
|
||||||
|
printf("-a makes the abstraction of the structural desription.\n");
|
||||||
|
printf("-p perform partitionning.\n");
|
||||||
|
printf("-S SEED value .\n");
|
||||||
|
printf("-R Partitionning ratio.\n");
|
||||||
|
printf("-N number of parts (0->2, 1->4, 2->8, 3->16, 4->32 )\n");
|
||||||
|
printf("\n");
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *busname(name)
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
char *tmp_name;
|
||||||
|
char *s, *t;
|
||||||
|
|
||||||
|
|
||||||
|
if (!name) {
|
||||||
|
printf("error in procedure busname\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
tmp_name = (char *)mbkalloc(strlen(name)+1);
|
||||||
|
s = name;
|
||||||
|
t = tmp_name;
|
||||||
|
while((*s != ' ') && (*s != '\0'))
|
||||||
|
{
|
||||||
|
*t++ = *s++;
|
||||||
|
}
|
||||||
|
*t = '\0';
|
||||||
|
return (tmp_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *Changename(sufix,name)
|
||||||
|
char *sufix,*name;
|
||||||
|
{
|
||||||
|
char *tmp_name ;
|
||||||
|
char *s, *s1, *t;
|
||||||
|
if (!name) {
|
||||||
|
printf("error in procedure busname\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp_name = (char *)mbkalloc(strlen(name)+strlen(sufix)+1);
|
||||||
|
s = name;
|
||||||
|
s1 = sufix;
|
||||||
|
t = tmp_name;
|
||||||
|
while((*s != ' ') && (*s != '\0'))
|
||||||
|
{
|
||||||
|
*t++ = *s++;
|
||||||
|
}
|
||||||
|
while(*s1 != '\0')
|
||||||
|
{
|
||||||
|
*t++ = *s1++;
|
||||||
|
}
|
||||||
|
while(*s != '\0')
|
||||||
|
{
|
||||||
|
*t++ = *s++;
|
||||||
|
}
|
||||||
|
*t = '\0';
|
||||||
|
return (tmp_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
int busindex(name)
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
char *tmp_index;
|
||||||
|
char *s, *t;
|
||||||
|
char blank_found = 0;
|
||||||
|
int ind;
|
||||||
|
|
||||||
|
tmp_index=(char *)mbkalloc(strlen(name)+1);
|
||||||
|
|
||||||
|
if (!name) {
|
||||||
|
printf("error in procedure busname\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
t = tmp_index;
|
||||||
|
s = name;
|
||||||
|
while (*s != '\0')
|
||||||
|
{
|
||||||
|
if (*s == ' ') {s++;blank_found =1;break;}
|
||||||
|
else ++s;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (blank_found)
|
||||||
|
while (*s !='\0') { *t++=*s++;}
|
||||||
|
|
||||||
|
*t = '\0';
|
||||||
|
sscanf(tmp_index,"%d",&ind);
|
||||||
|
|
||||||
|
return(ind);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *RemoveIndex(name)
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
char *new_name;
|
||||||
|
char *s, *t;
|
||||||
|
|
||||||
|
new_name=(char *)mbkalloc(strlen(name)+1);
|
||||||
|
|
||||||
|
if (!name) {
|
||||||
|
printf("error in procedure busname\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
t = new_name;
|
||||||
|
s = name;
|
||||||
|
while (*s != '\0')
|
||||||
|
{
|
||||||
|
if (*s == ' ') {*t++='_';s++;}
|
||||||
|
else *t++ = *s++;
|
||||||
|
}
|
||||||
|
|
||||||
|
*t = '\0';
|
||||||
|
return(namealloc(new_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------
|
||||||
|
|
||||||
|
Useful function to display locon and loins lists
|
||||||
|
|
||||||
|
------------------------------------------------------*/
|
||||||
|
void display_locon_list(p)
|
||||||
|
chain_list *p;
|
||||||
|
{
|
||||||
|
chain_list *ptr;
|
||||||
|
for(ptr = p ; ptr!=NULL ; ptr = ptr->NEXT)
|
||||||
|
{
|
||||||
|
printf(" %s\n",((locon_list *)(ptr->DATA))->NAME);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void display_loins_list(p)
|
||||||
|
chain_list *p;
|
||||||
|
{
|
||||||
|
chain_list *ptr;
|
||||||
|
for(ptr = p ; ptr!=NULL ;ptr = ptr->NEXT)
|
||||||
|
{
|
||||||
|
printf(" %s\n",((loins_list *)(ptr->DATA))->INSNAME);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*void display_lists()
|
||||||
|
{
|
||||||
|
printf(" Liste des connecteurs en entree\n");
|
||||||
|
display_locon_list(in_ptr);
|
||||||
|
|
||||||
|
printf("Liste des connecteurs en sortie \n");
|
||||||
|
display_locon_list(out_ptr);
|
||||||
|
|
||||||
|
printf("Liste des points memoire de la netliste\n");
|
||||||
|
display_loins_list(mem_ptr);
|
||||||
|
|
||||||
|
printf("Liste des points memoire du chemin de test\n");
|
||||||
|
display_loins_list(scan_ptr);
|
||||||
|
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/***********************************************************************************/
|
||||||
|
|
||||||
|
/* This function Gets the pointer to the LOCON connector in the instance pointed by ptri */
|
||||||
|
/***********************************************************************************/
|
||||||
|
|
||||||
|
locon_list *get_con(ptri,connector)
|
||||||
|
loins_list *ptri;
|
||||||
|
char *connector;
|
||||||
|
{
|
||||||
|
locon_list *ptr1;
|
||||||
|
|
||||||
|
for ( ptr1 = ptri->LOCON ; ptr1 != NULL ; ptr1 = ptr1->NEXT)
|
||||||
|
{
|
||||||
|
if ( ptr1->NAME == namealloc(connector)) return ptr1;
|
||||||
|
}
|
||||||
|
printf("no connector %s in model %s \n",connector,ptri->FIGNAME);
|
||||||
|
exit(1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* changes the old SIG->TYPE to INTERNAL, appends bist_ to SIGNAMECHAIN and sets SIG to a new signal pointer */
|
||||||
|
/* */
|
||||||
|
/*******************************************************************************************************************/
|
||||||
|
|
||||||
|
void update_con(ptrc,new_ptr_sig)
|
||||||
|
locon_list *ptrc;
|
||||||
|
losig_list *new_ptr_sig;
|
||||||
|
{
|
||||||
|
chain_list *name_list=ptrc->SIG->NAMECHAIN;
|
||||||
|
|
||||||
|
char *st = (char *)mbkalloc(strlen((char *)name_list->DATA) + strlen("_bist")+1) ;
|
||||||
|
|
||||||
|
sprintf(st,"bist_%s",(char *)name_list->DATA);
|
||||||
|
|
||||||
|
ptrc->SIG->TYPE = INTERNAL ; /* update signals TYPE */
|
||||||
|
|
||||||
|
name_list = delchain(name_list,name_list);
|
||||||
|
|
||||||
|
ptrc->SIG->NAMECHAIN = addchain(name_list,(void *)namealloc(st));/* update signals name */
|
||||||
|
|
||||||
|
ptrc->SIG = new_ptr_sig;/* set SIG connectors field to a new signal */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* search of the maximum signals INDEX */
|
||||||
|
/* */
|
||||||
|
/*******************************************************************************************************************/
|
||||||
|
|
||||||
|
long get_max_index(ptfig)
|
||||||
|
lofig_list *ptfig;
|
||||||
|
{
|
||||||
|
losig_list *pts;
|
||||||
|
long i = 0;
|
||||||
|
|
||||||
|
for(pts = ptfig->LOSIG ; pts ; pts = pts->NEXT)
|
||||||
|
{
|
||||||
|
if ((pts->INDEX) > i)
|
||||||
|
{
|
||||||
|
i = pts->INDEX;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return(i);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* gets a new number of signal INDEX */
|
||||||
|
/* */
|
||||||
|
/*******************************************************************************************************************/
|
||||||
|
|
||||||
|
long get_index()
|
||||||
|
{
|
||||||
|
max_index = max_index +1;
|
||||||
|
/* printf("index \n",max_index);*/
|
||||||
|
return(max_index-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
restore_Indexes : reconstitue les signaux busses sur une befig
|
||||||
|
-----------------------------------------------------------------
|
||||||
|
parametres : une befig .
|
||||||
|
-----------------------------------------------------------------
|
||||||
|
return : .
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
void RestoreIndexes(ptr_befig)
|
||||||
|
befig_list *ptr_befig;
|
||||||
|
{
|
||||||
|
struct bepor *ptr_bepor;
|
||||||
|
struct bepor *ptr_bepor1;
|
||||||
|
struct bepor *save_bepor;
|
||||||
|
struct bepor *new_bepor = NULL;
|
||||||
|
|
||||||
|
struct beaux *ptr_beaux;
|
||||||
|
struct beaux *ptr_beaux1;
|
||||||
|
struct beaux *save_beaux;
|
||||||
|
struct beaux *new_beaux = NULL;
|
||||||
|
|
||||||
|
struct bereg *ptr_bereg;
|
||||||
|
struct bereg *ptr_bereg1;
|
||||||
|
struct bereg *save_bereg;
|
||||||
|
struct bereg *new_bereg = NULL;
|
||||||
|
|
||||||
|
void *sort[512] ;
|
||||||
|
char *prefix;
|
||||||
|
authtable * porTH, *regTH, *auxTH, *buxTH;
|
||||||
|
|
||||||
|
int index, i, permut=0;
|
||||||
|
|
||||||
|
|
||||||
|
porTH = createauthtable(100);
|
||||||
|
regTH = createauthtable(100);
|
||||||
|
auxTH = createauthtable(100);
|
||||||
|
buxTH = createauthtable(100);
|
||||||
|
/* restore indexes for bepor */
|
||||||
|
for (ptr_bepor = ptr_befig->BEPOR; ptr_bepor; ptr_bepor = ptr_bepor->NEXT)
|
||||||
|
{
|
||||||
|
index = 0;
|
||||||
|
prefix = namealloc(busname(ptr_bepor->NAME));
|
||||||
|
if (searchauthelem(porTH,prefix) == NULL)
|
||||||
|
{
|
||||||
|
addauthelem(porTH, prefix,1);
|
||||||
|
sort[index++] = ptr_bepor;
|
||||||
|
for (ptr_bepor1 = ptr_bepor->NEXT; ptr_bepor1; ptr_bepor1 = ptr_bepor1->NEXT)
|
||||||
|
{
|
||||||
|
if (strcmp(busname(ptr_bepor1->NAME),prefix) == 0 )
|
||||||
|
sort[index++] = ptr_bepor1;
|
||||||
|
}
|
||||||
|
/* sort the connectors */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
permut =0;
|
||||||
|
for (i=0; i<index-1; i++)
|
||||||
|
{
|
||||||
|
if (busindex(((bepor_list *)sort[i])->NAME) > busindex(((bepor_list *)sort[i+1])->NAME))
|
||||||
|
{
|
||||||
|
save_bepor = sort[i];
|
||||||
|
sort[i] = sort[i+1];
|
||||||
|
sort[i+1] = save_bepor;
|
||||||
|
permut =1;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (permut);
|
||||||
|
|
||||||
|
}
|
||||||
|
for (i =index-1 ; i>=0 ;i--)
|
||||||
|
{
|
||||||
|
new_bepor = beh_addbepor(new_bepor,((bepor_list *)sort[i])->NAME,((bepor_list *)sort[i])->DIRECTION,((bepor_list *)sort[i])->TYPE);
|
||||||
|
/*printf("------>%s\n",sort[i]->NAME);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/* sorting internal simple signals */
|
||||||
|
for (ptr_beaux = ptr_befig->BEAUX; ptr_beaux; ptr_beaux = ptr_beaux->NEXT)
|
||||||
|
{
|
||||||
|
index = 0;
|
||||||
|
prefix = namealloc(busname(ptr_beaux->NAME));
|
||||||
|
if (searchauthelem(auxTH,prefix) == NULL)
|
||||||
|
{
|
||||||
|
addauthelem(auxTH, prefix,1);
|
||||||
|
sort[index++] = ptr_beaux;
|
||||||
|
for (ptr_beaux1 = ptr_beaux->NEXT; ptr_beaux1; ptr_beaux1 = ptr_beaux1->NEXT)
|
||||||
|
{
|
||||||
|
if (strcmp(busname(ptr_beaux1->NAME),prefix) == 0 )
|
||||||
|
sort[index++] = ptr_beaux1;
|
||||||
|
}
|
||||||
|
/* sort the connectors */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
permut =0;
|
||||||
|
for (i=0; i<index-1; i++)
|
||||||
|
{
|
||||||
|
if (busindex(((beaux_list *)sort[i])->NAME) > busindex(((beaux_list *)sort[i+1])->NAME))
|
||||||
|
{
|
||||||
|
save_beaux = sort[i];
|
||||||
|
sort[i] = sort[i+1];
|
||||||
|
sort[i+1] = save_beaux;
|
||||||
|
permut =1;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (permut);
|
||||||
|
|
||||||
|
}
|
||||||
|
for (i =index-1 ; i>=0 ;i--)
|
||||||
|
{
|
||||||
|
new_beaux = beh_addbeaux(new_beaux,((beaux_list *)sort[i])->NAME,((beaux_list *)sort[i])->ABL);
|
||||||
|
/*printf("------>%s\n",sort[i]->NAME);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/* sorting internal registers */
|
||||||
|
for (ptr_bereg = ptr_befig->BEREG; ptr_bereg; ptr_bereg = ptr_bereg->NEXT)
|
||||||
|
{
|
||||||
|
index = 0;
|
||||||
|
prefix = namealloc(busname(ptr_bereg->NAME));
|
||||||
|
if (searchauthelem(regTH,prefix) == NULL)
|
||||||
|
{
|
||||||
|
addauthelem(regTH, prefix,1);
|
||||||
|
sort[index++] = ptr_bereg;
|
||||||
|
for (ptr_bereg1 = ptr_bereg->NEXT; ptr_bereg1; ptr_bereg1 = ptr_bereg1->NEXT)
|
||||||
|
{
|
||||||
|
if (strcmp(busname(ptr_bereg1->NAME),prefix) == 0 )
|
||||||
|
sort[index++] = ptr_bereg1;
|
||||||
|
}
|
||||||
|
/* sort the connectors */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
permut =0;
|
||||||
|
for (i=0; i<index-1; i++)
|
||||||
|
{
|
||||||
|
if (busindex(((bereg_list *)sort[i])->NAME) > busindex(((bereg_list *)sort[i+1])->NAME))
|
||||||
|
{
|
||||||
|
save_bereg = sort[i];
|
||||||
|
sort[i] = sort[i+1];
|
||||||
|
sort[i+1] = save_bereg;
|
||||||
|
permut =1;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (permut);
|
||||||
|
|
||||||
|
}
|
||||||
|
for (i =index-1 ; i>=0 ;i--)
|
||||||
|
{
|
||||||
|
new_bereg = beh_addbereg(new_bereg,((bereg_list *)sort[i])->NAME,((bereg_list *)sort[i])->BIABL);
|
||||||
|
/*printf("------>%s\n",sort[i]->NAME);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
destroyauthtable(porTH);
|
||||||
|
destroyauthtable(regTH);
|
||||||
|
destroyauthtable(auxTH);
|
||||||
|
destroyauthtable(buxTH);
|
||||||
|
|
||||||
|
ptr_befig->BEPOR = new_bepor;
|
||||||
|
ptr_befig->BEREG = new_bereg;
|
||||||
|
ptr_befig->BEAUX = new_beaux;
|
||||||
|
|
||||||
|
/*return(ptr_befig);*/
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* 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 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
extern char *itostr();
|
||||||
|
extern void Usage();
|
||||||
|
extern char *busname();
|
||||||
|
extern int busindex();
|
||||||
|
extern long get_index();
|
||||||
|
extern char *RemoveIndex();
|
||||||
|
extern void RestoreIndexes();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*extern void display_locon_list();
|
||||||
|
extern void display_loins_list();
|
||||||
|
extern void display_lists();
|
||||||
|
extern locon_list *get_con();
|
||||||
|
extern long get_max_index();*/
|
||||||
|
|
Loading…
Reference in New Issue