mirror of https://github.com/YosysHQ/abc.git
Fix a bug in comb loop detection.
This commit is contained in:
parent
94a2cffefe
commit
978b5db039
|
|
@ -1327,19 +1327,22 @@ usage:
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int Abc_CommandRetime( Abc_Frame_t * pAbc, int argc, char ** argv )
|
int Abc_CommandRetime( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
{
|
{
|
||||||
extern void Wln_NtkRetimeTest( char * pFileName, int fSkipSimple, int fVerbose );
|
extern void Wln_NtkRetimeTest( char * pFileName, int fSkipSimple, int fDump, int fVerbose );
|
||||||
FILE * pFile;
|
FILE * pFile;
|
||||||
char * pFileName = NULL;
|
char * pFileName = NULL;
|
||||||
int fSkipSimple = 0;
|
int fSkipSimple = 0;
|
||||||
int c, fVerbose = 0;
|
int c, fDump = 0, fVerbose = 0;
|
||||||
Extra_UtilGetoptReset();
|
Extra_UtilGetoptReset();
|
||||||
while ( ( c = Extra_UtilGetopt( argc, argv, "svh" ) ) != EOF )
|
while ( ( c = Extra_UtilGetopt( argc, argv, "sdvh" ) ) != EOF )
|
||||||
{
|
{
|
||||||
switch ( c )
|
switch ( c )
|
||||||
{
|
{
|
||||||
case 's':
|
case 's':
|
||||||
fSkipSimple ^= 1;
|
fSkipSimple ^= 1;
|
||||||
break;
|
break;
|
||||||
|
case 'd':
|
||||||
|
fDump ^= 1;
|
||||||
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
fVerbose ^= 1;
|
fVerbose ^= 1;
|
||||||
break;
|
break;
|
||||||
|
|
@ -1352,7 +1355,7 @@ int Abc_CommandRetime( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
if ( pAbc->pNdr )
|
if ( pAbc->pNdr )
|
||||||
{
|
{
|
||||||
Vec_Int_t * vMoves;
|
Vec_Int_t * vMoves;
|
||||||
Wln_Ntk_t * pNtk = Wln_NtkFromNdr( pAbc->pNdr );
|
Wln_Ntk_t * pNtk = Wln_NtkFromNdr( pAbc->pNdr, fDump );
|
||||||
Wln_NtkRetimeCreateDelayInfo( pNtk );
|
Wln_NtkRetimeCreateDelayInfo( pNtk );
|
||||||
if ( pNtk == NULL )
|
if ( pNtk == NULL )
|
||||||
{
|
{
|
||||||
|
|
@ -1382,12 +1385,13 @@ int Abc_CommandRetime( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
fclose( pFile );
|
fclose( pFile );
|
||||||
Wln_NtkRetimeTest( pFileName, fSkipSimple, fVerbose );
|
Wln_NtkRetimeTest( pFileName, fSkipSimple, fDump, fVerbose );
|
||||||
return 0;
|
return 0;
|
||||||
usage:
|
usage:
|
||||||
Abc_Print( -2, "usage: %%retime [-svh]\n" );
|
Abc_Print( -2, "usage: %%retime [-sdvh]\n" );
|
||||||
Abc_Print( -2, "\t performs retiming for the NDR design\n" );
|
Abc_Print( -2, "\t performs retiming for the NDR design\n" );
|
||||||
Abc_Print( -2, "\t-s : toggle printing simple nodes [default = %s]\n", !fSkipSimple? "yes": "no" );
|
Abc_Print( -2, "\t-s : toggle printing simple nodes [default = %s]\n", !fSkipSimple? "yes": "no" );
|
||||||
|
Abc_Print( -2, "\t-d : toggle dumping the network in Verilog [default = %s]\n", fDump? "yes": "no" );
|
||||||
Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" );
|
Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" );
|
||||||
Abc_Print( -2, "\t-h : print the command usage\n");
|
Abc_Print( -2, "\t-h : print the command usage\n");
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
||||||
|
|
@ -218,7 +218,7 @@ static inline int Wln_ObjRiToRo( Wln_Ntk_t * p, int i )
|
||||||
/*=== wlcNdr.c ========================================================*/
|
/*=== wlcNdr.c ========================================================*/
|
||||||
extern Wln_Ntk_t * Wln_ReadNdr( char * pFileName );
|
extern Wln_Ntk_t * Wln_ReadNdr( char * pFileName );
|
||||||
extern void Wln_WriteNdr( Wln_Ntk_t * pNtk, 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 );
|
extern void * Wln_NtkToNdr( Wln_Ntk_t * pNtk );
|
||||||
/*=== wlcNtk.c ========================================================*/
|
/*=== wlcNtk.c ========================================================*/
|
||||||
extern Wln_Ntk_t * Wln_NtkAlloc( char * pName, int nObjsMax );
|
extern Wln_Ntk_t * Wln_NtkAlloc( char * pName, int nObjsMax );
|
||||||
|
|
|
||||||
|
|
@ -179,7 +179,7 @@ void Wln_NtkCheckIntegrity( void * pData )
|
||||||
}
|
}
|
||||||
Vec_IntFree( vMap );
|
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;
|
Ndr_Data_t * p = (Ndr_Data_t *)pData;
|
||||||
Vec_Int_t * vName2Obj, * vFanins = Vec_IntAlloc( 100 );
|
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 )
|
Wln_Ntk_t * Wln_ReadNdr( char * pFileName )
|
||||||
{
|
{
|
||||||
void * pData = Ndr_Read( 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;
|
if ( pNtk ) return NULL;
|
||||||
//char * ppNames[10] = { NULL, "a", "b", "c", "d", "e", "f", "g", "h", "i" };
|
//char * ppNames[10] = { NULL, "a", "b", "c", "d", "e", "f", "g", "h", "i" };
|
||||||
//Ndr_WriteVerilog( NULL, pData, ppNames );
|
//Ndr_WriteVerilog( NULL, pData, ppNames );
|
||||||
|
|
@ -314,17 +314,17 @@ void Wln_ReadNdrTest()
|
||||||
Wln_NtkStaticFanoutTest( pNtk );
|
Wln_NtkStaticFanoutTest( pNtk );
|
||||||
Wln_NtkFree( 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;
|
Vec_Int_t * vMoves;
|
||||||
void * pData = Ndr_Read( pFileName );
|
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 )
|
if ( pNtk == NULL )
|
||||||
{
|
{
|
||||||
printf( "Retiming network is not available.\n" );
|
printf( "Retiming network is not available.\n" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Ndr_Delete( pData );
|
|
||||||
Wln_NtkRetimeCreateDelayInfo( pNtk );
|
Wln_NtkRetimeCreateDelayInfo( pNtk );
|
||||||
vMoves = Wln_NtkRetime( pNtk, fSkipSimple, fVerbose );
|
vMoves = Wln_NtkRetime( pNtk, fSkipSimple, fVerbose );
|
||||||
//Vec_IntPrint( vMoves );
|
//Vec_IntPrint( vMoves );
|
||||||
|
|
|
||||||
|
|
@ -207,7 +207,7 @@ int Wln_NtkIsAcyclic( Wln_Ntk_t * p )
|
||||||
continue;
|
continue;
|
||||||
// stop as soon as the first loop is detected
|
// stop as soon as the first loop is detected
|
||||||
fprintf( stdout, "Primary output %16s (ID %6d)\n", Wln_ObjName(p, iObj), iObj );
|
fprintf( stdout, "Primary output %16s (ID %6d)\n", Wln_ObjName(p, iObj), iObj );
|
||||||
break;
|
goto finish;
|
||||||
}
|
}
|
||||||
Wln_NtkForEachFf( p, iObj, i )
|
Wln_NtkForEachFf( p, iObj, i )
|
||||||
{
|
{
|
||||||
|
|
@ -216,7 +216,7 @@ int Wln_NtkIsAcyclic( Wln_Ntk_t * p )
|
||||||
continue;
|
continue;
|
||||||
// stop as soon as the first loop is detected
|
// stop as soon as the first loop is detected
|
||||||
fprintf( stdout, "Flip-flop %16s (ID %6d)\n", Wln_ObjName(p, iObj), iObj );
|
fprintf( stdout, "Flip-flop %16s (ID %6d)\n", Wln_ObjName(p, iObj), iObj );
|
||||||
break;
|
goto finish;
|
||||||
}
|
}
|
||||||
Wln_NtkForEachObj( p, iObj )
|
Wln_NtkForEachObj( p, iObj )
|
||||||
nUnvisited += !Wln_ObjIsTravIdPrevious(p, iObj) && !Wln_ObjIsCi(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",
|
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_NtkObjNum(p), nUnvisited, 100.0*nUnvisited/Wln_NtkObjNum(p) );
|
||||||
Wln_NtkForEachObj( p, iObj )
|
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++;
|
nSinks++;
|
||||||
if ( nSinks )
|
if ( nSinks )
|
||||||
{
|
{
|
||||||
int nPrinted = 0;
|
int nPrinted = 0;
|
||||||
printf( "These unconnected objects feed into %d sink objects without fanout:\n", nSinks );
|
printf( "These unconnected objects feed into %d sink objects without fanout:\n", nSinks );
|
||||||
Wln_NtkForEachObj( p, iObj )
|
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",
|
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) );
|
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;
|
continue;
|
||||||
// stop as soon as the first loop is detected
|
// stop as soon as the first loop is detected
|
||||||
fprintf( stdout, "Unconnected object %s\n", Wln_ObjName(p, iObj) );
|
fprintf( stdout, "Unconnected object %s\n", Wln_ObjName(p, iObj) );
|
||||||
break;
|
goto finish;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
finish:
|
||||||
return fAcyclic;
|
return fAcyclic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue