pour que loon accepte les registres avec multiples conditions

i.e plusieurs blocks dont des reset asynchrones.
This commit is contained in:
Francois Donnet 2003-10-27 15:27:45 +00:00
parent 5e7e9bfeb7
commit a4bf03dd8f
5 changed files with 34 additions and 6 deletions

View File

@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script.
AC_INIT(src/lon_main.c) AC_INIT(src/lon_main.c)
LOON_MAJOR_VERSION=1 LOON_MAJOR_VERSION=1
LOON_MINOR_VERSION=6 LOON_MINOR_VERSION=7
LOON_VERSION=$LOON_MAJOR_VERSION.$LOON_MINOR_VERSION LOON_VERSION=$LOON_MAJOR_VERSION.$LOON_MINOR_VERSION
AC_SUBST(LOON_MAJOR_VERSION) AC_SUBST(LOON_MAJOR_VERSION)

View File

@ -212,6 +212,7 @@ static void format_subst_befig( befig_list *befig, beaux_list *BeauxSubst )
extern int format_cell(befig_list* befig) extern int format_cell(befig_list* befig)
{ {
beaux_list *beaux; beaux_list *beaux;
biabl_list *biabl;
/*internal signal forbidden*/ /*internal signal forbidden*/
for ( beaux = befig->BEAUX; beaux; beaux = beaux->NEXT ) for ( beaux = befig->BEAUX; beaux; beaux = beaux->NEXT )
@ -223,8 +224,10 @@ extern int format_cell(befig_list* befig)
if (befig->BEREG) { if (befig->BEREG) {
/*only one register*/ /*only one register*/
if (befig->BEREG->NEXT || befig->BEBUS || befig->BEBUX) return 0; if (befig->BEREG->NEXT || befig->BEBUS || befig->BEBUX) return 0;
#if 0 /*to accept multiple condition block*/
/*only one condition*/ /*only one condition*/
if (!befig->BEREG->BIABL || befig->BEREG->BIABL->NEXT) return 0; if (!befig->BEREG->BIABL || befig->BEREG->BIABL->NEXT) return 0;
#endif
/*one ouput*/ /*one ouput*/
if (!befig->BEOUT || befig->BEOUT->NEXT) return 0; if (!befig->BEOUT || befig->BEOUT->NEXT) return 0;
/* forbid logic on output */ /* forbid logic on output */
@ -237,8 +240,9 @@ extern int format_cell(befig_list* befig)
/* output <= not reg; -> move not to register value*/ /* output <= not reg; -> move not to register value*/
freeablexpr(befig->BEOUT->ABL); freeablexpr(befig->BEOUT->ABL);
befig->BEOUT->ABL=createablatom(befig->BEREG->NAME); befig->BEOUT->ABL=createablatom(befig->BEREG->NAME);
befig->BEREG->BIABL->VALABL=simpablexpr( for (biabl=befig->BEREG->BIABL; biabl; biabl=biabl->NEXT) {
createablnotexpr(befig->BEREG->BIABL->VALABL)); biabl->VALABL=simpablexpr(createablnotexpr(biabl->VALABL));
}
} }
} }

View File

@ -148,6 +148,9 @@ extern int pattern_matching(chain_list* expr, chain_list* pattern)
/****************************************************************************/ /****************************************************************************/
extern int compare_befig(befig_list* befig1, befig_list* befig2) extern int compare_befig(befig_list* befig1, befig_list* befig2)
{ {
biabl_list *biabl1;
biabl_list *biabl2;
if (befig1->BEBUS) { if (befig1->BEBUS) {
if (!befig2->BEBUS) return 0; if (!befig2->BEBUS) return 0;
return isablequalexpr(befig1->BEBUS->BIABL->VALABL,befig2->BEBUS->BIABL->VALABL) && isablequalexpr(befig1->BEBUS->BIABL->CNDABL,befig2->BEBUS->BIABL->CNDABL); return isablequalexpr(befig1->BEBUS->BIABL->VALABL,befig2->BEBUS->BIABL->VALABL) && isablequalexpr(befig1->BEBUS->BIABL->CNDABL,befig2->BEBUS->BIABL->CNDABL);
@ -155,8 +158,27 @@ extern int compare_befig(befig_list* befig1, befig_list* befig2)
else if (befig1->BEREG) { else if (befig1->BEREG) {
if (!befig2->BEREG) return 0; if (!befig2->BEREG) return 0;
/*flip-flop or latch*/ /*flip-flop or latch*/
if (getptype(befig1->BEREG->BIABL->USER,ABL_STABLE)!=getptype(befig2->BEREG->BIABL->USER,ABL_STABLE)) return 0; for ( biabl1 = befig1->BEREG->BIABL; biabl1; biabl1 = biabl1->NEXT )
return isablequalexpr(befig1->BEREG->BIABL->VALABL,befig2->BEREG->BIABL->VALABL) && isablequalexpr(befig1->BEREG->BIABL->CNDABL,befig2->BEREG->BIABL->CNDABL); {
for ( biabl2 = befig2->BEREG->BIABL; biabl2; biabl2 = biabl2->NEXT )
{
if ( getptype(biabl1->USER,ABL_STABLE)!=getptype(biabl2->USER,ABL_STABLE) ) continue;
if ( isablequalexpr(biabl1->VALABL,biabl2->VALABL) && isablequalexpr(biabl1->CNDABL,biabl2->CNDABL) ) break;
}
/*equivalence not found*/
if ( !biabl2 ) return 0;
}
for ( biabl2 = befig2->BEREG->BIABL; biabl2; biabl2 = biabl2->NEXT )
{
for ( biabl1 = befig1->BEREG->BIABL; biabl1; biabl1 = biabl1->NEXT )
{
if ( getptype(biabl1->USER,ABL_STABLE)!=getptype(biabl2->USER,ABL_STABLE) ) continue;
if ( isablequalexpr(biabl1->VALABL,biabl2->VALABL) && isablequalexpr(biabl1->CNDABL,biabl2->CNDABL) ) break;
}
/*equivalence not found*/
if ( !biabl1 ) return 0;
}
return 1;
} }
else if (befig1->BEOUT) { else if (befig1->BEOUT) {
if (!befig2->BEOUT) return 0; if (!befig2->BEOUT) return 0;

View File

@ -253,7 +253,7 @@ extern int main (int argc, char* argv[])
bddenv(); /*for vhdlloadbefig() in library reader*/ bddenv(); /*for vhdlloadbefig() in library reader*/
alliancebanner_with_authors("LooN", VERSION " [2002/11/08]", "Local optimization on Nets", alliancebanner_with_authors("LooN", VERSION " [2003/10/27]", "Local optimization on Nets",
"2000", ALLIANCE_VERSION, "François Donnet"); "2000", ALLIANCE_VERSION, "François Donnet");
/*set options*/ /*set options*/

View File

@ -111,12 +111,14 @@ static int loc_format_register(bereg_list* bereg)
exit(1); exit(1);
} }
#if 0 /*to accept multiple condition block*/
/*only one condition authorized*/ /*only one condition authorized*/
if (bereg->BIABL->NEXT) { if (bereg->BIABL->NEXT) {
fprintf(stderr,"BEH: several conditions aren't accepted on register %s\n", fprintf(stderr,"BEH: several conditions aren't accepted on register %s\n",
bereg->NAME); bereg->NAME);
return 0; return 0;
} }
#endif
/*anyway control all condition block*/ /*anyway control all condition block*/
for (biabl=bereg->BIABL; biabl; biabl=biabl->NEXT) { for (biabl=bereg->BIABL; biabl; biabl=biabl->NEXT) {