summaryrefslogtreecommitdiffstats
path: root/src/aig/gia
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2012-12-09 10:05:34 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2012-12-09 10:05:34 -0800
commit8a08453af2304b95e7efba07ef8c3e3a63364592 (patch)
tree1e8580b7e9dc44deecc62bfa2ae4a7a08749ae6f /src/aig/gia
parentb65ae7349af7de36390ec916701b997cac2a00ed (diff)
downloadabc-8a08453af2304b95e7efba07ef8c3e3a63364592.tar.gz
abc-8a08453af2304b95e7efba07ef8c3e3a63364592.tar.bz2
abc-8a08453af2304b95e7efba07ef8c3e3a63364592.zip
Corner-case bug fix in &rpm.
Diffstat (limited to 'src/aig/gia')
-rw-r--r--src/aig/gia/giaTruth.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/aig/gia/giaTruth.c b/src/aig/gia/giaTruth.c
index 172fe2f1..a77267af 100644
--- a/src/aig/gia/giaTruth.c
+++ b/src/aig/gia/giaTruth.c
@@ -245,18 +245,21 @@ void Gia_ObjComputeTruthTableTest( Gia_Man_t * p )
SeeAlso []
***********************************************************************/
-void Gia_ObjCollectInternalCut_rec( Gia_Man_t * p, Gia_Obj_t * pObj )
+int Gia_ObjCollectInternalCut_rec( Gia_Man_t * p, Gia_Obj_t * pObj )
{
if ( pObj->fMark0 )
- return;
- pObj->fMark0 = 1;
+ return 0;
assert( Gia_ObjIsAnd(pObj) );
- Gia_ObjCollectInternalCut_rec( p, Gia_ObjFanin0(pObj) );
- Gia_ObjCollectInternalCut_rec( p, Gia_ObjFanin1(pObj) );
+ if ( Gia_ObjCollectInternalCut_rec( p, Gia_ObjFanin0(pObj) ) )
+ return 1;
+ if ( Gia_ObjCollectInternalCut_rec( p, Gia_ObjFanin1(pObj) ) )
+ return 1;
+ pObj->fMark0 = 1;
Gia_ObjSetNum( p, pObj, Vec_IntSize(p->vTtNodes) );
Vec_IntPush( p->vTtNodes, Gia_ObjId(p, pObj) );
+ return (Vec_IntSize(p->vTtNodes) >= 254);
}
-void Gia_ObjCollectInternalCut( Gia_Man_t * p, Gia_Obj_t * pRoot, Vec_Int_t * vLeaves )
+int Gia_ObjCollectInternalCut( Gia_Man_t * p, Gia_Obj_t * pRoot, Vec_Int_t * vLeaves )
{
Gia_Obj_t * pObj;
int i;
@@ -270,8 +273,7 @@ void Gia_ObjCollectInternalCut( Gia_Man_t * p, Gia_Obj_t * pRoot, Vec_Int_t * vL
}
assert( pRoot->fMark0 == 0 ); // the root cannot be one of the leaves
Vec_IntClear( p->vTtNodes );
- Gia_ObjCollectInternalCut_rec( p, pRoot );
- assert( Vec_IntSize(p->vTtNodes) < 254 );
+ return Gia_ObjCollectInternalCut_rec( p, pRoot );
}
/**Function*************************************************************
@@ -324,8 +326,21 @@ word * Gia_ObjComputeTruthTableCut( Gia_Man_t * p, Gia_Obj_t * pRoot, Vec_Int_t
assert( p->vTtMemory != NULL );
assert( Vec_IntSize(vLeaves) <= p->nTtVars );
// collect internal nodes
- Gia_ObjCollectInternalCut( p, pRoot, vLeaves );
+ if ( Gia_ObjCollectInternalCut( p, pRoot, vLeaves ) )
+ {
+ // unmark nodes makred by Gia_ObjCollectInternal()
+ Gia_ManForEachObjVec( p->vTtNodes, p, pTemp, i )
+ pTemp->fMark0 = 0;
+ // unmark leaves marked by Gia_ObjCollectInternal()
+ Gia_ManForEachObjVec( vLeaves, p, pTemp, i )
+ {
+ assert( pTemp->fMark0 == 1 );
+ pTemp->fMark0 = 0;
+ }
+ return NULL;
+ }
// compute the truth table for internal nodes
+ assert( Vec_IntSize(p->vTtNodes) < 254 );
Gia_ManForEachObjVec( p->vTtNodes, p, pTemp, i )
{
pTemp->fMark0 = 0; // unmark nodes marked by Gia_ObjCollectInternal()