diff options
Diffstat (limited to 'src/base/abci/abcLutmin.c')
-rw-r--r-- | src/base/abci/abcLutmin.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/base/abci/abcLutmin.c b/src/base/abci/abcLutmin.c index c539b53e..6d62f330 100644 --- a/src/base/abci/abcLutmin.c +++ b/src/base/abci/abcLutmin.c @@ -40,6 +40,76 @@ ABC_NAMESPACE_IMPL_START /**Function************************************************************* + Synopsis [Check if a LUT can absort a fanin.] + + Description [The fanins are (c, d0, d1).] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Abc_ObjCheckAbsorb( Abc_Obj_t * pObj, Abc_Obj_t * pPivot, int nLutSize, Vec_Ptr_t * vFanins ) +{ + Abc_Obj_t * pFanin; + int i; + assert( Abc_ObjIsNode(pObj) && Abc_ObjIsNode(pPivot) ); + // add fanins of the node + Vec_PtrClear( vFanins ); + Abc_ObjForEachFanin( pObj, pFanin, i ) + if ( pFanin != pPivot ) + Vec_PtrPush( vFanins, pFanin ); + // add fanins of the fanin + Abc_ObjForEachFanin( pPivot, pFanin, i ) + { + Vec_PtrPushUnique( vFanins, pFanin ); + if ( Vec_PtrSize(vFanins) > nLutSize ) + return 0; + } + return 1; +} + +/**Function************************************************************* + + Synopsis [Check how many times a LUT can absorb a fanin.] + + Description [The fanins are (c, d0, d1).] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Abc_NtkCheckAbsorb( Abc_Ntk_t * pNtk, int nLutSize ) +{ + Vec_Int_t * vCounts; + Vec_Ptr_t * vFanins; + Abc_Obj_t * pObj, * pFanin; + int i, k, Counter = 0, Counter2 = 0, clk = clock(); + vCounts = Vec_IntStart( Abc_NtkObjNumMax(pNtk) ); + vFanins = Vec_PtrAlloc( 100 ); + Abc_NtkForEachNode( pNtk, pObj, i ) + Abc_ObjForEachFanin( pObj, pFanin, k ) + if ( Abc_ObjIsNode(pFanin) && Abc_ObjCheckAbsorb( pObj, pFanin, nLutSize, vFanins ) ) + { + Vec_IntAddToEntry( vCounts, Abc_ObjId(pFanin), 1 ); + Counter++; + } + Vec_PtrFree( vFanins ); + Abc_NtkForEachNode( pNtk, pObj, i ) + if ( Vec_IntEntry(vCounts, Abc_ObjId(pObj)) == Abc_ObjFanoutNum(pObj) ) + { +// printf( "%d ", Abc_ObjId(pObj) ); + Counter2++; + } + printf( "Absorted = %6d. (%6.2f %%) Fully = %6d. (%6.2f %%) ", + Counter, 100.0 * Counter / Abc_NtkNodeNum(pNtk), + Counter2, 100.0 * Counter2 / Abc_NtkNodeNum(pNtk) ); + Abc_PrintTime( 1, "Time", clock() - clk ); +} + +/**Function************************************************************* + Synopsis [Implements 2:1 MUX using one 3-LUT.] Description [The fanins are (c, d0, d1).] |