mirror of https://github.com/YosysHQ/abc.git
Improvements to command print_fanio.
This commit is contained in:
parent
35143e830b
commit
fe0487dab6
|
|
@ -820,7 +820,7 @@ extern ABC_DLL float Abc_NtkMfsTotalSwitching( Abc_Ntk_t * pNtk );
|
||||||
extern ABC_DLL void Abc_NtkPrintStats( Abc_Ntk_t * pNtk, int fFactored, int fSaveBest, int fDumpResult, int fUseLutLib, int fPrintMuxes, int fPower, int fGlitch, int fSkipBuf, int fPrintMem );
|
extern ABC_DLL void Abc_NtkPrintStats( Abc_Ntk_t * pNtk, int fFactored, int fSaveBest, int fDumpResult, int fUseLutLib, int fPrintMuxes, int fPower, int fGlitch, int fSkipBuf, int fPrintMem );
|
||||||
extern ABC_DLL void Abc_NtkPrintIo( FILE * pFile, Abc_Ntk_t * pNtk, int fPrintFlops );
|
extern ABC_DLL void Abc_NtkPrintIo( FILE * pFile, Abc_Ntk_t * pNtk, int fPrintFlops );
|
||||||
extern ABC_DLL void Abc_NtkPrintLatch( FILE * pFile, Abc_Ntk_t * pNtk );
|
extern ABC_DLL void Abc_NtkPrintLatch( FILE * pFile, Abc_Ntk_t * pNtk );
|
||||||
extern ABC_DLL void Abc_NtkPrintFanio( FILE * pFile, Abc_Ntk_t * pNtk, int fUsePis );
|
extern ABC_DLL void Abc_NtkPrintFanio( FILE * pFile, Abc_Ntk_t * pNtk, int fUseFanio, int fUsePio, int fUseSupp, int fUseCone );
|
||||||
extern ABC_DLL void Abc_NtkPrintFanioNew( FILE * pFile, Abc_Ntk_t * pNtk, int fMffc );
|
extern ABC_DLL void Abc_NtkPrintFanioNew( FILE * pFile, Abc_Ntk_t * pNtk, int fMffc );
|
||||||
extern ABC_DLL void Abc_NodePrintFanio( FILE * pFile, Abc_Obj_t * pNode );
|
extern ABC_DLL void Abc_NodePrintFanio( FILE * pFile, Abc_Obj_t * pNode );
|
||||||
extern ABC_DLL void Abc_NtkPrintFactor( FILE * pFile, Abc_Ntk_t * pNtk, int fUseRealNames );
|
extern ABC_DLL void Abc_NtkPrintFactor( FILE * pFile, Abc_Ntk_t * pNtk, int fUseRealNames );
|
||||||
|
|
|
||||||
|
|
@ -1517,16 +1517,28 @@ int Abc_CommandPrintFanio( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
{
|
{
|
||||||
Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
|
Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
|
||||||
int c;
|
int c;
|
||||||
int fUsePis = 0;
|
int fUseFanio = 0;
|
||||||
|
int fUsePio = 0;
|
||||||
|
int fUseSupp = 0;
|
||||||
|
int fUseCone = 0;
|
||||||
int fMffc = 0;
|
int fMffc = 0;
|
||||||
int fVerbose = 0;
|
int fVerbose = 0;
|
||||||
Extra_UtilGetoptReset();
|
Extra_UtilGetoptReset();
|
||||||
while ( ( c = Extra_UtilGetopt( argc, argv, "imvh" ) ) != EOF )
|
while ( ( c = Extra_UtilGetopt( argc, argv, "fiscmvh" ) ) != EOF )
|
||||||
{
|
{
|
||||||
switch ( c )
|
switch ( c )
|
||||||
{
|
{
|
||||||
|
case 'f':
|
||||||
|
fUseFanio ^= 1;
|
||||||
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
fUsePis ^= 1;
|
fUsePio ^= 1;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
fUseSupp ^= 1;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
fUseCone ^= 1;
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
fMffc ^= 1;
|
fMffc ^= 1;
|
||||||
|
|
@ -1546,16 +1558,24 @@ int Abc_CommandPrintFanio( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
// print the nodes
|
// print the nodes
|
||||||
if ( fVerbose )
|
if ( fMffc || !fVerbose )
|
||||||
Abc_NtkPrintFanio( stdout, pNtk, fUsePis );
|
|
||||||
else
|
|
||||||
Abc_NtkPrintFanioNew( stdout, pNtk, fMffc );
|
Abc_NtkPrintFanioNew( stdout, pNtk, fMffc );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( fUseFanio + fUsePio + fUseSupp + fUseCone == 1 )
|
||||||
|
Abc_NtkPrintFanio( stdout, pNtk, fUseFanio, fUsePio, fUseSupp, fUseCone );
|
||||||
|
else
|
||||||
|
printf( "Exactly one of the switches \"-f\", \"-i\", \"-s\", \"-c\" should be enabled.\n" );
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
usage:
|
usage:
|
||||||
Abc_Print( -2, "usage: print_fanio [-imvh]\n" );
|
Abc_Print( -2, "usage: print_fanio [-fiscmvh]\n" );
|
||||||
Abc_Print( -2, "\t prints the statistics about fanins/fanouts of all nodes\n" );
|
Abc_Print( -2, "\t prints the statistics about different objects in the network\n" );
|
||||||
Abc_Print( -2, "\t-i : toggles considering fanouts of primary inputs only [default = %s]\n", fUsePis? "yes": "no" );
|
Abc_Print( -2, "\t-f : toggles considering fanins/outputs of all nodes [default = %s]\n", fUseFanio? "yes": "no" );
|
||||||
|
Abc_Print( -2, "\t-i : toggles considering fanins/outputs of CI/CO [default = %s]\n", fUsePio? "yes": "no" );
|
||||||
|
Abc_Print( -2, "\t-s : toggles considering input/output supports of CI/CO [default = %s]\n", fUseSupp? "yes": "no" );
|
||||||
|
Abc_Print( -2, "\t-c : toggles considering input/output cones of CI/CO [default = %s]\n", fUseCone? "yes": "no" );
|
||||||
Abc_Print( -2, "\t-m : toggles printing MFFC sizes instead of fanouts [default = %s]\n", fMffc? "yes": "no" );
|
Abc_Print( -2, "\t-m : toggles printing MFFC sizes instead of fanouts [default = %s]\n", fMffc? "yes": "no" );
|
||||||
Abc_Print( -2, "\t-v : toggles verbose way of printing the stats [default = %s]\n", fVerbose? "yes": "no" );
|
Abc_Print( -2, "\t-v : toggles verbose way of printing the stats [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");
|
||||||
|
|
|
||||||
|
|
@ -579,73 +579,306 @@ void Abc_NtkPrintLatch( FILE * pFile, Abc_Ntk_t * pNtk )
|
||||||
SeeAlso []
|
SeeAlso []
|
||||||
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
void Abc_NtkPrintFanio( FILE * pFile, Abc_Ntk_t * pNtk, int fUsePis )
|
void Abc_NtkFaninFanoutCounters( Abc_Ntk_t * pNtk, Vec_Int_t * vFan, Vec_Int_t * vFon, Vec_Int_t * vFanR, Vec_Int_t * vFonR )
|
||||||
{
|
{
|
||||||
Abc_Obj_t * pNode;
|
Abc_Obj_t * pNode;
|
||||||
int i, k, nFanins, nFanouts;
|
int i, nFanins, nFanouts;
|
||||||
Vec_Int_t * vFanins, * vFanouts;
|
int nFaninsMax = 0, nFanoutsMax = 0;
|
||||||
int nOldSize, nNewSize;
|
Abc_NtkForEachObj( pNtk, pNode, i )
|
||||||
|
|
||||||
vFanins = Vec_IntAlloc( 0 );
|
|
||||||
vFanouts = Vec_IntAlloc( 0 );
|
|
||||||
Vec_IntFill( vFanins, 100, 0 );
|
|
||||||
Vec_IntFill( vFanouts, 100, 0 );
|
|
||||||
Abc_NtkForEachNode( pNtk, pNode, i )
|
|
||||||
{
|
{
|
||||||
nFanins = Abc_ObjFaninNum(pNode);
|
nFaninsMax = Abc_MaxInt( nFaninsMax, Abc_ObjFaninNum(pNode) );
|
||||||
if ( Abc_NtkIsNetlist(pNtk) )
|
nFanoutsMax = Abc_MaxInt( nFanoutsMax, Abc_ObjFanoutNum(pNode) );
|
||||||
nFanouts = Abc_ObjFanoutNum( Abc_ObjFanout0(pNode) );
|
|
||||||
else
|
|
||||||
nFanouts = Abc_ObjFanoutNum(pNode);
|
|
||||||
// nFanouts = Abc_NodeMffcSize(pNode);
|
|
||||||
if ( nFanins > vFanins->nSize || nFanouts > vFanouts->nSize )
|
|
||||||
{
|
|
||||||
nOldSize = vFanins->nSize;
|
|
||||||
nNewSize = Abc_MaxInt(nFanins, nFanouts) + 10;
|
|
||||||
Vec_IntGrow( vFanins, nNewSize );
|
|
||||||
Vec_IntGrow( vFanouts, nNewSize );
|
|
||||||
for ( k = nOldSize; k < nNewSize; k++ )
|
|
||||||
{
|
|
||||||
Vec_IntPush( vFanins, 0 );
|
|
||||||
Vec_IntPush( vFanouts, 0 );
|
|
||||||
}
|
}
|
||||||
}
|
Vec_IntFill( vFan, nFaninsMax + 1, 0 );
|
||||||
vFanins->pArray[nFanins]++;
|
Vec_IntFill( vFon, nFanoutsMax + 1, 0 );
|
||||||
vFanouts->pArray[nFanouts]++;
|
Vec_IntFill( vFanR, nFaninsMax + 1, 0 );
|
||||||
}
|
Vec_IntFill( vFonR, nFanoutsMax + 1, 0 );
|
||||||
if ( fUsePis )
|
Abc_NtkForEachObjReverse( pNtk, pNode, i )
|
||||||
{
|
{
|
||||||
Vec_IntFill( vFanouts, Vec_IntSize(vFanouts), 0 );
|
nFanins = Abc_ObjFaninNum( pNode );
|
||||||
|
nFanouts = Abc_ObjFanoutNum( pNode );
|
||||||
|
Vec_IntAddToEntry( vFan, nFanins, 1 );
|
||||||
|
Vec_IntAddToEntry( vFon, nFanouts, 1 );
|
||||||
|
Vec_IntWriteEntry( vFanR, nFanins, i );
|
||||||
|
Vec_IntWriteEntry( vFonR, nFanouts, i );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Abc_NtkInputOutputCounters( Abc_Ntk_t * pNtk, Vec_Int_t * vFan, Vec_Int_t * vFon, Vec_Int_t * vFanR, Vec_Int_t * vFonR )
|
||||||
|
{
|
||||||
|
Abc_Obj_t * pNode;
|
||||||
|
int i, nFanins, nFanouts;
|
||||||
|
int nFaninsMax = 0, nFanoutsMax = 0;
|
||||||
|
Abc_NtkForEachCi( pNtk, pNode, i )
|
||||||
|
nFanoutsMax = Abc_MaxInt( nFanoutsMax, Abc_ObjFanoutNum(pNode) );
|
||||||
|
Abc_NtkForEachCo( pNtk, pNode, i )
|
||||||
|
nFaninsMax = Abc_MaxInt( nFaninsMax, Abc_ObjFaninNum(Abc_ObjFanin0(pNode)) );
|
||||||
|
Vec_IntFill( vFan, nFaninsMax + 1, 0 );
|
||||||
|
Vec_IntFill( vFon, nFanoutsMax + 1, 0 );
|
||||||
|
Vec_IntFill( vFanR, nFaninsMax + 1, 0 );
|
||||||
|
Vec_IntFill( vFonR, nFanoutsMax + 1, 0 );
|
||||||
Abc_NtkForEachCi( pNtk, pNode, i )
|
Abc_NtkForEachCi( pNtk, pNode, i )
|
||||||
{
|
{
|
||||||
if ( Abc_NtkIsNetlist(pNtk) )
|
nFanouts = Abc_ObjFanoutNum( pNode );
|
||||||
nFanouts = Abc_ObjFanoutNum( Abc_ObjFanout0(pNode) );
|
Vec_IntAddToEntry( vFon, nFanouts, 1 );
|
||||||
else
|
Vec_IntWriteEntry( vFonR, nFanouts, Abc_ObjId(pNode) );
|
||||||
nFanouts = Abc_ObjFanoutNum(pNode);
|
|
||||||
vFanouts->pArray[nFanouts]++;
|
|
||||||
}
|
}
|
||||||
}
|
Abc_NtkForEachCo( pNtk, pNode, i )
|
||||||
fprintf( pFile, "The distribution of fanins and fanouts in the network:\n" );
|
|
||||||
fprintf( pFile, " Number Nodes with fanin Nodes with fanout\n" );
|
|
||||||
for ( k = 0; k < vFanins->nSize; k++ )
|
|
||||||
{
|
{
|
||||||
if ( vFanins->pArray[k] == 0 && vFanouts->pArray[k] == 0 )
|
nFanins = Abc_ObjFaninNum( Abc_ObjFanin0(pNode) );
|
||||||
|
Vec_IntAddToEntry( vFan, nFanins, 1 );
|
||||||
|
Vec_IntWriteEntry( vFanR, nFanins, Abc_ObjId(pNode) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Vec_Int_t * Abc_NtkCollectCoSupps( Abc_Ntk_t * pNtk, int fVerbose )
|
||||||
|
{
|
||||||
|
abctime clk = Abc_Clock();
|
||||||
|
Abc_Obj_t * pNode; int i, k;
|
||||||
|
Vec_Ptr_t * vNodes = Abc_NtkDfs( pNtk, 0 );
|
||||||
|
Vec_Int_t * vFanin, * vFanout, * vTemp = Vec_IntAlloc( 0 );
|
||||||
|
Vec_Int_t * vSuppsCo = Vec_IntAlloc( Abc_NtkCoNum(pNtk) );
|
||||||
|
Vec_Wec_t * vSupps = Vec_WecStart( Abc_NtkObjNumMax(pNtk) );
|
||||||
|
Abc_NtkForEachCi( pNtk, pNode, i )
|
||||||
|
Vec_IntPush( Vec_WecEntry(vSupps, Abc_ObjId(pNode)), i );
|
||||||
|
Vec_PtrForEachEntry( Abc_Obj_t *, vNodes, pNode, i )
|
||||||
|
{
|
||||||
|
vFanout = Vec_WecEntry(vSupps, Abc_ObjId(pNode));
|
||||||
|
for ( k = 0; k < Abc_ObjFaninNum(pNode); k++ )
|
||||||
|
{
|
||||||
|
vFanin = Vec_WecEntry(vSupps, Abc_ObjFaninId(pNode, k));
|
||||||
|
Vec_IntTwoMerge2( vFanout, vFanin, vTemp );
|
||||||
|
ABC_SWAP( Vec_Int_t, *vFanout, *vTemp );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Abc_NtkForEachCo( pNtk, pNode, i )
|
||||||
|
Vec_IntPush( vSuppsCo, Vec_IntSize(Vec_WecEntry(vSupps, Abc_ObjFaninId0(pNode))) );
|
||||||
|
Vec_WecFree( vSupps );
|
||||||
|
Vec_PtrFree( vNodes );
|
||||||
|
Vec_IntFree( vTemp );
|
||||||
|
if ( fVerbose )
|
||||||
|
Abc_PrintTime( 1, "Input support computation", Abc_Clock() - clk );
|
||||||
|
//Vec_IntPrint( vSuppsCo );
|
||||||
|
return vSuppsCo;
|
||||||
|
}
|
||||||
|
Vec_Int_t * Abc_NtkCollectCiSupps( Abc_Ntk_t * pNtk, int fVerbose )
|
||||||
|
{
|
||||||
|
abctime clk = Abc_Clock();
|
||||||
|
Abc_Obj_t * pNode; int i, k;
|
||||||
|
Vec_Ptr_t * vNodes = Abc_NtkDfs( pNtk, 0 );
|
||||||
|
Vec_Int_t * vFanin, * vFanout, * vTemp = Vec_IntAlloc( 0 );
|
||||||
|
Vec_Int_t * vSuppsCi = Vec_IntAlloc( Abc_NtkCiNum(pNtk) );
|
||||||
|
Vec_Wec_t * vSupps = Vec_WecStart( Abc_NtkObjNumMax(pNtk) );
|
||||||
|
Abc_NtkForEachCo( pNtk, pNode, i )
|
||||||
|
{
|
||||||
|
vFanout = Vec_WecEntry(vSupps, Abc_ObjId(pNode));
|
||||||
|
vFanin = Vec_WecEntry(vSupps, Abc_ObjFaninId0(pNode));
|
||||||
|
Vec_IntPush( vFanout, i );
|
||||||
|
Vec_IntTwoMerge2( vFanin, vFanout, vTemp );
|
||||||
|
ABC_SWAP( Vec_Int_t, *vFanin, *vTemp );
|
||||||
|
}
|
||||||
|
Vec_PtrForEachEntryReverse( Abc_Obj_t *, vNodes, pNode, i )
|
||||||
|
{
|
||||||
|
vFanout = Vec_WecEntry(vSupps, Abc_ObjId(pNode));
|
||||||
|
for ( k = 0; k < Abc_ObjFaninNum(pNode); k++ )
|
||||||
|
{
|
||||||
|
vFanin = Vec_WecEntry(vSupps, Abc_ObjFaninId(pNode, k));
|
||||||
|
Vec_IntTwoMerge2( vFanin, vFanout, vTemp );
|
||||||
|
ABC_SWAP( Vec_Int_t, *vFanin, *vTemp );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Abc_NtkForEachCi( pNtk, pNode, i )
|
||||||
|
Vec_IntPush( vSuppsCi, Vec_IntSize(Vec_WecEntry(vSupps, Abc_ObjId(pNode))) );
|
||||||
|
Vec_WecFree( vSupps );
|
||||||
|
Vec_PtrFree( vNodes );
|
||||||
|
Vec_IntFree( vTemp );
|
||||||
|
if ( fVerbose )
|
||||||
|
Abc_PrintTime( 1, "Output support computation", Abc_Clock() - clk );
|
||||||
|
//Vec_IntPrint( vSuppsCi );
|
||||||
|
return vSuppsCi;
|
||||||
|
}
|
||||||
|
void Abc_NtkInOutSupportCounters( Abc_Ntk_t * pNtk, Vec_Int_t * vFan, Vec_Int_t * vFon, Vec_Int_t * vFanR, Vec_Int_t * vFonR )
|
||||||
|
{
|
||||||
|
Abc_Obj_t * pNode;
|
||||||
|
Vec_Int_t * vSuppsCo = Abc_NtkCollectCoSupps( pNtk, 1 );
|
||||||
|
Vec_Int_t * vSuppsCi = Abc_NtkCollectCiSupps( pNtk, 1 );
|
||||||
|
int i, nFanins, nFanouts;
|
||||||
|
int nFaninsMax = Vec_IntFindMax( vSuppsCo );
|
||||||
|
int nFanoutsMax = Vec_IntFindMax( vSuppsCi );
|
||||||
|
Vec_IntFill( vFan, nFaninsMax + 1, 0 );
|
||||||
|
Vec_IntFill( vFon, nFanoutsMax + 1, 0 );
|
||||||
|
Vec_IntFill( vFanR, nFaninsMax + 1, 0 );
|
||||||
|
Vec_IntFill( vFonR, nFanoutsMax + 1, 0 );
|
||||||
|
Abc_NtkForEachCo( pNtk, pNode, i )
|
||||||
|
{
|
||||||
|
nFanins = Vec_IntEntry( vSuppsCo, i );
|
||||||
|
Vec_IntAddToEntry( vFan, nFanins, 1 );
|
||||||
|
Vec_IntWriteEntry( vFanR, nFanins, Abc_ObjId(pNode) );
|
||||||
|
}
|
||||||
|
Abc_NtkForEachCi( pNtk, pNode, i )
|
||||||
|
{
|
||||||
|
nFanouts = Vec_IntEntry( vSuppsCi, i );
|
||||||
|
Vec_IntAddToEntry( vFon, nFanouts, 1 );
|
||||||
|
Vec_IntWriteEntry( vFonR, nFanouts, Abc_ObjId(pNode) );
|
||||||
|
}
|
||||||
|
Vec_IntFree( vSuppsCo );
|
||||||
|
Vec_IntFree( vSuppsCi );
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec_Int_t * Abc_NtkCollectCoCones( Abc_Ntk_t * pNtk, int fVerbose )
|
||||||
|
{
|
||||||
|
abctime clk = Abc_Clock();
|
||||||
|
Abc_Obj_t * pNode; int i, k;
|
||||||
|
Vec_Ptr_t * vNodes = Abc_NtkDfs( pNtk, 0 );
|
||||||
|
Vec_Int_t * vFanin, * vFanout, * vTemp = Vec_IntAlloc( 0 );
|
||||||
|
Vec_Int_t * vSuppsCo = Vec_IntAlloc( Abc_NtkCoNum(pNtk) );
|
||||||
|
Vec_Wec_t * vSupps = Vec_WecStart( Abc_NtkObjNumMax(pNtk) );
|
||||||
|
Vec_PtrForEachEntry( Abc_Obj_t *, vNodes, pNode, i )
|
||||||
|
{
|
||||||
|
vFanout = Vec_WecEntry(vSupps, Abc_ObjId(pNode));
|
||||||
|
for ( k = 0; k < Abc_ObjFaninNum(pNode); k++ )
|
||||||
|
{
|
||||||
|
vFanin = Vec_WecEntry(vSupps, Abc_ObjFaninId(pNode, k));
|
||||||
|
Vec_IntTwoMerge2( vFanout, vFanin, vTemp );
|
||||||
|
ABC_SWAP( Vec_Int_t, *vFanout, *vTemp );
|
||||||
|
}
|
||||||
|
Vec_IntPush( vFanout, i );
|
||||||
|
}
|
||||||
|
Abc_NtkForEachCo( pNtk, pNode, i )
|
||||||
|
Vec_IntPush( vSuppsCo, Vec_IntSize(Vec_WecEntry(vSupps, Abc_ObjFaninId0(pNode))) );
|
||||||
|
Vec_WecFree( vSupps );
|
||||||
|
Vec_PtrFree( vNodes );
|
||||||
|
Vec_IntFree( vTemp );
|
||||||
|
if ( fVerbose )
|
||||||
|
Abc_PrintTime( 1, "Input cone computation", Abc_Clock() - clk );
|
||||||
|
//Vec_IntPrint( vSuppsCo );
|
||||||
|
return vSuppsCo;
|
||||||
|
}
|
||||||
|
Vec_Int_t * Abc_NtkCollectCiCones( Abc_Ntk_t * pNtk, int fVerbose )
|
||||||
|
{
|
||||||
|
abctime clk = Abc_Clock();
|
||||||
|
Abc_Obj_t * pNode; int i, k;
|
||||||
|
Vec_Ptr_t * vNodes = Abc_NtkDfs( pNtk, 0 );
|
||||||
|
Vec_Int_t * vFanin, * vFanout, * vTemp = Vec_IntAlloc( 0 );
|
||||||
|
Vec_Int_t * vSuppsCi = Vec_IntAlloc( Abc_NtkCiNum(pNtk) );
|
||||||
|
Vec_Wec_t * vSupps = Vec_WecStart( Abc_NtkObjNumMax(pNtk) );
|
||||||
|
Vec_PtrForEachEntryReverse( Abc_Obj_t *, vNodes, pNode, i )
|
||||||
|
{
|
||||||
|
vFanout = Vec_WecEntry(vSupps, Abc_ObjId(pNode));
|
||||||
|
Vec_IntPush( vFanout, i );
|
||||||
|
for ( k = 0; k < Abc_ObjFaninNum(pNode); k++ )
|
||||||
|
{
|
||||||
|
vFanin = Vec_WecEntry(vSupps, Abc_ObjFaninId(pNode, k));
|
||||||
|
Vec_IntTwoMerge2( vFanin, vFanout, vTemp );
|
||||||
|
ABC_SWAP( Vec_Int_t, *vFanin, *vTemp );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Abc_NtkForEachCi( pNtk, pNode, i )
|
||||||
|
Vec_IntPush( vSuppsCi, Vec_IntSize(Vec_WecEntry(vSupps, Abc_ObjId(pNode))) );
|
||||||
|
Vec_WecFree( vSupps );
|
||||||
|
Vec_PtrFree( vNodes );
|
||||||
|
Vec_IntFree( vTemp );
|
||||||
|
if ( fVerbose )
|
||||||
|
Abc_PrintTime( 1, "Output cone computation", Abc_Clock() - clk );
|
||||||
|
//Vec_IntPrint( vSuppsCi );
|
||||||
|
return vSuppsCi;
|
||||||
|
}
|
||||||
|
void Abc_NtkInOutConeCounters( Abc_Ntk_t * pNtk, Vec_Int_t * vFan, Vec_Int_t * vFon, Vec_Int_t * vFanR, Vec_Int_t * vFonR )
|
||||||
|
{
|
||||||
|
Abc_Obj_t * pNode;
|
||||||
|
Vec_Int_t * vSuppsCo = Abc_NtkCollectCoCones( pNtk, 1 );
|
||||||
|
Vec_Int_t * vSuppsCi = Abc_NtkCollectCiCones( pNtk, 1 );
|
||||||
|
int i, nFanins, nFanouts;
|
||||||
|
int nFaninsMax = Vec_IntFindMax( vSuppsCo );
|
||||||
|
int nFanoutsMax = Vec_IntFindMax( vSuppsCi );
|
||||||
|
Vec_IntFill( vFan, nFaninsMax + 1, 0 );
|
||||||
|
Vec_IntFill( vFon, nFanoutsMax + 1, 0 );
|
||||||
|
Vec_IntFill( vFanR, nFaninsMax + 1, 0 );
|
||||||
|
Vec_IntFill( vFonR, nFanoutsMax + 1, 0 );
|
||||||
|
Abc_NtkForEachCo( pNtk, pNode, i )
|
||||||
|
{
|
||||||
|
nFanins = Vec_IntEntry( vSuppsCo, i );
|
||||||
|
Vec_IntAddToEntry( vFan, nFanins, 1 );
|
||||||
|
Vec_IntWriteEntry( vFanR, nFanins, Abc_ObjId(pNode) );
|
||||||
|
}
|
||||||
|
Abc_NtkForEachCi( pNtk, pNode, i )
|
||||||
|
{
|
||||||
|
nFanouts = Vec_IntEntry( vSuppsCi, i );
|
||||||
|
Vec_IntAddToEntry( vFon, nFanouts, 1 );
|
||||||
|
Vec_IntWriteEntry( vFonR, nFanouts, Abc_ObjId(pNode) );
|
||||||
|
}
|
||||||
|
Vec_IntFree( vSuppsCo );
|
||||||
|
Vec_IntFree( vSuppsCi );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Abc_NtkPrintDistribInternal( FILE * pFile, Abc_Ntk_t * pNtk, char * pFanins, char * pFanouts, char * pNode, char * pFanin, char * pFanout,
|
||||||
|
Vec_Int_t * vFan, Vec_Int_t * vFon, Vec_Int_t * vFanR, Vec_Int_t * vFonR )
|
||||||
|
{
|
||||||
|
int k, nSizeMax = Abc_MaxInt( Vec_IntSize(vFan), Vec_IntSize(vFon) );
|
||||||
|
fprintf( pFile, "The distribution of %s and %s in the network:\n", pFanins, pFanouts );
|
||||||
|
fprintf( pFile, " Number %s with %s %s with %s Repr1 Repr2\n", pNode, pFanin, pNode, pFanout );
|
||||||
|
for ( k = 0; k < nSizeMax; k++ )
|
||||||
|
{
|
||||||
|
int EntryFan = k < Vec_IntSize(vFan) ? Vec_IntEntry(vFan, k) : 0;
|
||||||
|
int EntryFon = k < Vec_IntSize(vFon) ? Vec_IntEntry(vFon, k) : 0;
|
||||||
|
if ( EntryFan == 0 && EntryFon == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
fprintf( pFile, "%5d : ", k );
|
fprintf( pFile, "%5d : ", k );
|
||||||
if ( vFanins->pArray[k] == 0 )
|
if ( EntryFan == 0 )
|
||||||
fprintf( pFile, " " );
|
fprintf( pFile, " " );
|
||||||
else
|
else
|
||||||
fprintf( pFile, "%12d ", vFanins->pArray[k] );
|
fprintf( pFile, "%12d ", EntryFan );
|
||||||
fprintf( pFile, " " );
|
fprintf( pFile, " " );
|
||||||
if ( vFanouts->pArray[k] == 0 )
|
if ( EntryFon == 0 )
|
||||||
fprintf( pFile, " " );
|
fprintf( pFile, " " );
|
||||||
else
|
else
|
||||||
fprintf( pFile, "%12d ", vFanouts->pArray[k] );
|
fprintf( pFile, "%12d ", EntryFon );
|
||||||
|
|
||||||
|
fprintf( pFile, " " );
|
||||||
|
if ( EntryFan == 0 )
|
||||||
|
fprintf( pFile, " " );
|
||||||
|
else
|
||||||
|
fprintf( pFile, "%12s ", Abc_ObjName(Abc_NtkObj(pNtk, Vec_IntEntry(vFanR, k))) );
|
||||||
|
fprintf( pFile, " " );
|
||||||
|
if ( EntryFon == 0 )
|
||||||
|
fprintf( pFile, " " );
|
||||||
|
else
|
||||||
|
fprintf( pFile, "%12s ", Abc_ObjName(Abc_NtkObj(pNtk, Vec_IntEntry(vFonR, k))) );
|
||||||
fprintf( pFile, "\n" );
|
fprintf( pFile, "\n" );
|
||||||
}
|
}
|
||||||
Vec_IntFree( vFanins );
|
|
||||||
Vec_IntFree( vFanouts );
|
|
||||||
}
|
}
|
||||||
|
void Abc_NtkPrintFanio( FILE * pFile, Abc_Ntk_t * pNtk, int fUseFanio, int fUsePio, int fUseSupp, int fUseCone )
|
||||||
|
{
|
||||||
|
Vec_Int_t * vFan = Vec_IntAlloc( 0 );
|
||||||
|
Vec_Int_t * vFon = Vec_IntAlloc( 0 );
|
||||||
|
Vec_Int_t * vFanR = Vec_IntAlloc( 0 );
|
||||||
|
Vec_Int_t * vFonR = Vec_IntAlloc( 0 );
|
||||||
|
assert( fUseFanio + fUsePio + fUseSupp + fUseCone == 1 );
|
||||||
|
if ( fUseFanio )
|
||||||
|
{
|
||||||
|
Abc_NtkFaninFanoutCounters( pNtk, vFan, vFon, vFanR, vFonR );
|
||||||
|
Abc_NtkPrintDistribInternal( pFile, pNtk, "fanins", "fanouts", "Nodes", "fanin", "fanout", vFan, vFon, vFanR, vFonR );
|
||||||
|
}
|
||||||
|
else if ( fUsePio )
|
||||||
|
{
|
||||||
|
Abc_NtkInputOutputCounters( pNtk, vFan, vFon, vFanR, vFonR );
|
||||||
|
Abc_NtkPrintDistribInternal( pFile, pNtk, "fanins", "fanouts", "I/O", "fanin", "fanout", vFan, vFon, vFanR, vFonR );
|
||||||
|
}
|
||||||
|
else if ( fUseSupp )
|
||||||
|
{
|
||||||
|
Abc_NtkInOutSupportCounters( pNtk, vFan, vFon, vFanR, vFonR );
|
||||||
|
Abc_NtkPrintDistribInternal( pFile, pNtk, "input supports", "output supports", "I/O", "in-supp", "out-supp", vFan, vFon, vFanR, vFonR );
|
||||||
|
}
|
||||||
|
else if ( fUseCone )
|
||||||
|
{
|
||||||
|
Abc_NtkInOutConeCounters( pNtk, vFan, vFon, vFanR, vFonR );
|
||||||
|
Abc_NtkPrintDistribInternal( pFile, pNtk, "input cones", "output cones", "I/O", "in-cone", "out-cone", vFan, vFon, vFanR, vFonR );
|
||||||
|
}
|
||||||
|
Vec_IntFree( vFan );
|
||||||
|
Vec_IntFree( vFon );
|
||||||
|
Vec_IntFree( vFanR );
|
||||||
|
Vec_IntFree( vFonR );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**Function*************************************************************
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue