summaryrefslogtreecommitdiffstats
path: root/src/base/wln
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2020-04-22 16:49:21 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2020-04-22 16:49:21 -0700
commit978b5db0397ae062cf4a4818eb2e76b9804bdce3 (patch)
tree99d390cf28760af8abb3b9d6ad4064a9dc5ec332 /src/base/wln
parent94a2cffefe47754fb9ec6679999841cab629d50b (diff)
downloadabc-978b5db0397ae062cf4a4818eb2e76b9804bdce3.tar.gz
abc-978b5db0397ae062cf4a4818eb2e76b9804bdce3.tar.bz2
abc-978b5db0397ae062cf4a4818eb2e76b9804bdce3.zip
Fix a bug in comb loop detection.
Diffstat (limited to 'src/base/wln')
-rw-r--r--src/base/wln/wln.h2
-rw-r--r--src/base/wln/wlnNdr.c10
-rw-r--r--src/base/wln/wlnNtk.c11
3 files changed, 12 insertions, 11 deletions
diff --git a/src/base/wln/wln.h b/src/base/wln/wln.h
index 22247893..510d74c1 100644
--- a/src/base/wln/wln.h
+++ b/src/base/wln/wln.h
@@ -218,7 +218,7 @@ static inline int Wln_ObjRiToRo( Wln_Ntk_t * p, int i )
/*=== wlcNdr.c ========================================================*/
extern Wln_Ntk_t * Wln_ReadNdr( char * pFileName );
extern void Wln_WriteNdr( Wln_Ntk_t * pNtk, char * pFileName );
-extern Wln_Ntk_t * Wln_NtkFromNdr( void * pData );
+extern Wln_Ntk_t * Wln_NtkFromNdr( void * pData, int fDump );
extern void * Wln_NtkToNdr( Wln_Ntk_t * pNtk );
/*=== wlcNtk.c ========================================================*/
extern Wln_Ntk_t * Wln_NtkAlloc( char * pName, int nObjsMax );
diff --git a/src/base/wln/wlnNdr.c b/src/base/wln/wlnNdr.c
index e9e0bf83..eb685463 100644
--- a/src/base/wln/wlnNdr.c
+++ b/src/base/wln/wlnNdr.c
@@ -179,7 +179,7 @@ void Wln_NtkCheckIntegrity( void * pData )
}
Vec_IntFree( vMap );
}
-Wln_Ntk_t * Wln_NtkFromNdr( void * pData )
+Wln_Ntk_t * Wln_NtkFromNdr( void * pData, int fDump )
{
Ndr_Data_t * p = (Ndr_Data_t *)pData;
Vec_Int_t * vName2Obj, * vFanins = Vec_IntAlloc( 100 );
@@ -298,7 +298,7 @@ Wln_Ntk_t * Wln_NtkFromNdr( void * pData )
Wln_Ntk_t * Wln_ReadNdr( char * pFileName )
{
void * pData = Ndr_Read( pFileName );
- Wln_Ntk_t * pNtk = pData ? Wln_NtkFromNdr( pData ) : NULL;
+ Wln_Ntk_t * pNtk = pData ? Wln_NtkFromNdr( pData, 0 ) : NULL;
if ( pNtk ) return NULL;
//char * ppNames[10] = { NULL, "a", "b", "c", "d", "e", "f", "g", "h", "i" };
//Ndr_WriteVerilog( NULL, pData, ppNames );
@@ -314,17 +314,17 @@ void Wln_ReadNdrTest()
Wln_NtkStaticFanoutTest( pNtk );
Wln_NtkFree( pNtk );
}
-void Wln_NtkRetimeTest( char * pFileName, int fSkipSimple, int fVerbose )
+void Wln_NtkRetimeTest( char * pFileName, int fSkipSimple, int fDump, int fVerbose )
{
Vec_Int_t * vMoves;
void * pData = Ndr_Read( pFileName );
- Wln_Ntk_t * pNtk = pData ? Wln_NtkFromNdr( pData ) : NULL;
+ Wln_Ntk_t * pNtk = pData ? Wln_NtkFromNdr( pData, fDump ) : NULL;
+ Ndr_Delete( pData );
if ( pNtk == NULL )
{
printf( "Retiming network is not available.\n" );
return;
}
- Ndr_Delete( pData );
Wln_NtkRetimeCreateDelayInfo( pNtk );
vMoves = Wln_NtkRetime( pNtk, fSkipSimple, fVerbose );
//Vec_IntPrint( vMoves );
diff --git a/src/base/wln/wlnNtk.c b/src/base/wln/wlnNtk.c
index 4e338006..5b3acb6f 100644
--- a/src/base/wln/wlnNtk.c
+++ b/src/base/wln/wlnNtk.c
@@ -207,7 +207,7 @@ int Wln_NtkIsAcyclic( Wln_Ntk_t * p )
continue;
// stop as soon as the first loop is detected
fprintf( stdout, "Primary output %16s (ID %6d)\n", Wln_ObjName(p, iObj), iObj );
- break;
+ goto finish;
}
Wln_NtkForEachFf( p, iObj, i )
{
@@ -216,7 +216,7 @@ int Wln_NtkIsAcyclic( Wln_Ntk_t * p )
continue;
// stop as soon as the first loop is detected
fprintf( stdout, "Flip-flop %16s (ID %6d)\n", Wln_ObjName(p, iObj), iObj );
- break;
+ goto finish;
}
Wln_NtkForEachObj( p, iObj )
nUnvisited += !Wln_ObjIsTravIdPrevious(p, iObj) && !Wln_ObjIsCi(p, iObj);
@@ -227,14 +227,14 @@ int Wln_NtkIsAcyclic( Wln_Ntk_t * p )
printf( "The network has %d objects and %d (%6.2f %%) of them are not connected to the outputs.\n",
Wln_NtkObjNum(p), nUnvisited, 100.0*nUnvisited/Wln_NtkObjNum(p) );
Wln_NtkForEachObj( p, iObj )
- if ( !Wln_ObjRefs(p, iObj) && !Wln_ObjIsCi(p, iObj) && !Wln_ObjIsFf(p, iObj) )
+ if ( !Wln_ObjRefs(p, iObj) && !Wln_ObjIsCi(p, iObj) && !Wln_ObjIsCo(p, iObj) && !Wln_ObjIsFf(p, iObj) )
nSinks++;
if ( nSinks )
{
int nPrinted = 0;
printf( "These unconnected objects feed into %d sink objects without fanout:\n", nSinks );
Wln_NtkForEachObj( p, iObj )
- if ( !Wln_ObjRefs(p, iObj) && !Wln_ObjIsCi(p, iObj) && !Wln_ObjIsFf(p, iObj) )
+ if ( !Wln_ObjRefs(p, iObj) && !Wln_ObjIsCi(p, iObj) && !Wln_ObjIsCo(p, iObj) && !Wln_ObjIsFf(p, iObj) )
{
fprintf( stdout, "Node %16s (ID %6d) of type %5s (type ID %2d)\n",
Wln_ObjName(p, iObj), iObj, Abc_OperName(Wln_ObjType(p, iObj)), Wln_ObjType(p, iObj) );
@@ -252,9 +252,10 @@ int Wln_NtkIsAcyclic( Wln_Ntk_t * p )
continue;
// stop as soon as the first loop is detected
fprintf( stdout, "Unconnected object %s\n", Wln_ObjName(p, iObj) );
- break;
+ goto finish;
}
}
+finish:
return fAcyclic;
}