summaryrefslogtreecommitdiffstats
path: root/src/base/abci/abcLutmin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/abci/abcLutmin.c')
-rw-r--r--src/base/abci/abcLutmin.c70
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).]