From 5872794507b8f0c631282bbfdc2f13c82426ef45 Mon Sep 17 00:00:00 2001 From: Francois Donnet Date: Mon, 8 Dec 2003 14:36:19 +0000 Subject: [PATCH] le reset asynchrone, eviter de tomber dans une boucle pseudo-combinatoire. --- alliance/src/loon/src/lon_lib_permute.c | 14 +++-- alliance/src/loon/src/lon_signal_critical.c | 57 ++++++++++++++++++--- alliance/src/loon/src/lon_signal_netlist.c | 42 ++++++++++----- 3 files changed, 89 insertions(+), 24 deletions(-) diff --git a/alliance/src/loon/src/lon_lib_permute.c b/alliance/src/loon/src/lon_lib_permute.c index bf11e3ce..96a94de8 100644 --- a/alliance/src/loon/src/lon_lib_permute.c +++ b/alliance/src/loon/src/lon_lib_permute.c @@ -299,12 +299,18 @@ extern chain_list* permutations(befig_list* befig) /*build group of variables which can be permuted*/ if (befig->BEBUS) { - groupchain=permute_variable(NULL,befig->BEBUS->BIABL->CNDABL); - groupchain=permute_variable(groupchain,befig->BEBUS->BIABL->VALABL); + for (biabl = befig->BEBUS->BIABL; biabl; biabl = biabl->NEXT ) + { + groupchain=permute_variable(groupchain,biabl->CNDABL); + groupchain=permute_variable(groupchain,biabl->VALABL); + } } else if (befig->BEREG) { - groupchain=permute_variable(NULL,befig->BEREG->BIABL->CNDABL); - groupchain=permute_variable(groupchain,befig->BEREG->BIABL->VALABL); + for (biabl = befig->BEREG->BIABL; biabl; biabl = biabl->NEXT ) + { + groupchain=permute_variable(groupchain,biabl->CNDABL); + groupchain=permute_variable(groupchain,biabl->VALABL); + } } else if (befig->BEOUT) { groupchain=permute_variable(NULL,befig->BEOUT->ABL); diff --git a/alliance/src/loon/src/lon_signal_critical.c b/alliance/src/loon/src/lon_signal_critical.c index a7a5c554..b0a77a85 100644 --- a/alliance/src/loon/src/lon_signal_critical.c +++ b/alliance/src/loon/src/lon_signal_critical.c @@ -41,6 +41,14 @@ #include "lon_signal_critical.h" +/***************************************************************************/ +/* Global Variables */ +/***************************************************************************/ + +static authtable *ControlLoop; + + + /***************************************************************************/ /*return the signal with the highest delay */ @@ -107,6 +115,7 @@ static ptype_list* search_long_path(losig_list* losig, int ck_include) ptype_list* ptype, *ret; double max_delay=-1, delay; cell_list* cell; + biabl_list* biabl; if (!losig) { fprintf(stderr,"search_long_path: NULL pointer\n"); @@ -117,8 +126,20 @@ static ptype_list* search_long_path(losig_list* losig, int ck_include) fprintf(stderr,"search_long_path: no losig name\n"); exit(1); } + signame=(char*) losig->NAMECHAIN->DATA; + + /*control combinational loop, not to recurse infinitively*/ + if ( searchauthelem( ControlLoop, (char*) losig ) ) + { + fprintf(stderr,"Warning: combinational loop on signal %s\n", signame ); + return ret; + } + + addauthelem( ControlLoop, (char*) losig, 1 ); + + /*search drivers*/ ptype=getptype(losig->USER,LOFIGCHAIN); if (!ptype || !ptype->DATA) { @@ -158,12 +179,16 @@ static ptype_list* search_long_path(losig_list* losig, int ck_include) } befig=cell->BEFIG; if (befig->BEREG) { - ptype=getptype(befig->BEREG->BIABL->USER,ABL_STABLE); - if (ptype) { - /*do not include clock in path*/ - if (!ck_include) return ret; - reg=1; - ck=ptype->DATA; + for ( biabl = cell->BEFIG->BEREG->BIABL; biabl; biabl = biabl->NEXT ) + { + ptype=getptype(biabl->USER,ABL_STABLE); + if (ptype) { + /*do not include clock in path*/ + if (!ck_include) return ret; + reg=1; + ck=ptype->DATA; + break; + } } } @@ -210,11 +235,19 @@ static ptype_list* search_long_path(losig_list* losig, int ck_include) extern ptype_list* critical_path(lofig_list* lofig) { losig_list* losig; + ptype_list* ret; losig=critical_output(lofig); /*lofig is empty*/ if (!losig) return NULL; - return (ptype_list*) reverse( (chain_list*) search_long_path(losig,1)); + + ControlLoop = createauthtable( 100 ); + + ret = (ptype_list*) reverse( (chain_list*) search_long_path(losig,1)); + + destroyauthtable( ControlLoop ); + + return ret; } @@ -225,11 +258,19 @@ extern ptype_list* critical_path(lofig_list* lofig) extern ptype_list* critical_path_without_clock(lofig_list* lofig) { losig_list* losig; + ptype_list* ret; losig=critical_output(lofig); /*lofig is empty*/ if (!losig) return NULL; - return (ptype_list*) reverse( (chain_list*) search_long_path(losig,0)); + + ControlLoop = createauthtable( 100 ); + + ret = (ptype_list*) reverse( (chain_list*) search_long_path(losig,0)); + + destroyauthtable( ControlLoop ); + + return ret; } diff --git a/alliance/src/loon/src/lon_signal_netlist.c b/alliance/src/loon/src/lon_signal_netlist.c index f0c4cb7c..c2ac6323 100644 --- a/alliance/src/loon/src/lon_signal_netlist.c +++ b/alliance/src/loon/src/lon_signal_netlist.c @@ -104,6 +104,7 @@ extern double loins_max_T(loins_list* loins) port_list* port; locon_list* locon; char* input; + biabl_list* biabl; if (!loins) { fprintf(stderr,"loins_max_T: NULL pointer\n"); @@ -120,10 +121,15 @@ extern double loins_max_T(loins_list* loins) /*is-it a flip-flop?*/ if (cell->BEFIG->BEREG) { - ptype=getptype(cell->BEFIG->BEREG->BIABL->USER,ABL_STABLE); - if (ptype) { - flip_flop=1; - ck=(char*) ptype->DATA; + for ( biabl = cell->BEFIG->BEREG->BIABL; biabl; biabl = biabl->NEXT ) + { + ptype=getptype(biabl->USER,ABL_STABLE); + if (ptype) + { + flip_flop=1; + ck=(char*) ptype->DATA; + break; + } } } @@ -179,6 +185,7 @@ extern double loins_max_RC(loins_list* loins, char* output) port_list* port; locon_list* locon; char* input; + biabl_list* biabl; if (!loins || !output) { fprintf(stderr,"loins_max_RC: NULL pointer\n"); @@ -195,10 +202,15 @@ extern double loins_max_RC(loins_list* loins, char* output) /*is-it a flip-flop?*/ if (cell->BEFIG->BEREG) { - ptype=getptype(cell->BEFIG->BEREG->BIABL->USER,ABL_STABLE); - if (ptype) { - flip_flop=1; - ck=(char*) ptype->DATA; + for ( biabl = cell->BEFIG->BEREG->BIABL; biabl; biabl = biabl->NEXT ) + { + ptype=getptype(biabl->USER,ABL_STABLE); + if (ptype) + { + flip_flop=1; + ck=(char*) ptype->DATA; + break; + } } } @@ -254,6 +266,7 @@ extern double loins_delay(loins_list* loins, char* output) port_list* port; locon_list* locon; char* input; + biabl_list* biabl; if (!loins || !output) { fprintf(stderr,"loins_delay: NULL pointer\n"); @@ -270,10 +283,15 @@ extern double loins_delay(loins_list* loins, char* output) /*is-it a flip-flop?*/ if (cell->BEFIG->BEREG) { - ptype=getptype(cell->BEFIG->BEREG->BIABL->USER,ABL_STABLE); - if (ptype) { - flip_flop=1; - ck=(char*) ptype->DATA; + for ( biabl = cell->BEFIG->BEREG->BIABL; biabl; biabl = biabl->NEXT ) + { + ptype=getptype(biabl->USER,ABL_STABLE); + if (ptype) + { + flip_flop=1; + ck=(char*) ptype->DATA; + break; + } } }