summaryrefslogtreecommitdiffstats
path: root/src/map/if/ifUtil.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2012-10-25 22:10:24 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2012-10-25 22:10:24 -0700
commit37107a3b18475c037518d72c38113345a11bc34f (patch)
tree943b69b069141bc7c7301c102fdfbef5860abfbc /src/map/if/ifUtil.c
parentfac397662118bcd6682da06e0ed87ff5963f625d (diff)
downloadabc-37107a3b18475c037518d72c38113345a11bc34f.tar.gz
abc-37107a3b18475c037518d72c38113345a11bc34f.tar.bz2
abc-37107a3b18475c037518d72c38113345a11bc34f.zip
Added new API to traverse the cut in the mapper.
Diffstat (limited to 'src/map/if/ifUtil.c')
-rw-r--r--src/map/if/ifUtil.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/map/if/ifUtil.c b/src/map/if/ifUtil.c
index 4d904613..33d984c3 100644
--- a/src/map/if/ifUtil.c
+++ b/src/map/if/ifUtil.c
@@ -769,6 +769,57 @@ int If_ManCountSpecialPos( If_Man_t * p )
}
+/**Function*************************************************************
+
+ Synopsis [Traverse the cut and counts its volume.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+static void If_CutTraverse_rec( If_Obj_t * pNode, Vec_Ptr_t * vNodes )
+{
+ if ( pNode->fMark )
+ return;
+ pNode->fMark = 1;
+// assert( !If_ObjIsCi(pNode) ); // does not hold with cut minimization
+ if ( If_ObjIsAnd(pNode) )
+ If_CutTraverse_rec( If_ObjFanin0(pNode), vNodes );
+ if ( If_ObjIsAnd(pNode) )
+ If_CutTraverse_rec( If_ObjFanin1(pNode), vNodes );
+ Vec_PtrPush( vNodes, pNode );
+}
+void If_CutTraverse( If_Man_t * p, If_Obj_t * pRoot, If_Cut_t * pCut, Vec_Ptr_t * vNodes )
+{
+ If_Obj_t * pLeaf;
+ int i;
+ // collect the internal nodes of the cut
+ Vec_PtrClear( vNodes );
+ If_CutForEachLeaf( p, pCut, pLeaf, i )
+ {
+ Vec_PtrPush( vNodes, pLeaf );
+ assert( pLeaf->fMark == 0 );
+ pLeaf->fMark = 1;
+ }
+ // collect other nodes
+ If_CutTraverse_rec( pRoot, vNodes );
+ // clean the mark
+ Vec_PtrForEachEntry( If_Obj_t *, vNodes, pLeaf, i )
+ pLeaf->fMark = 0;
+}
+void If_CutTraverseTest( If_Man_t * p, If_Obj_t * pRoot, If_Cut_t * pCut )
+{
+ Vec_Ptr_t * vNodes;
+ vNodes = Vec_PtrAlloc( 1000 );
+ If_CutTraverse( p, pRoot, pCut, vNodes );
+//if ( Vec_PtrSize(vNodes) > 30 )
+//printf( "%d ", Vec_PtrSize(vNodes) );
+ Vec_PtrFree( vNodes );
+}
+
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////