summaryrefslogtreecommitdiffstats
path: root/src/aig/gia/giaUtil.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2014-07-01 13:05:09 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2014-07-01 13:05:09 -0700
commitafcec52a498d62587c99287f02f93f69d650dbb2 (patch)
treed81aca1b2c4bc1ab0e4377a3dd1d923a342710e8 /src/aig/gia/giaUtil.c
parent6bc381baa3d1b5c2e9024185018aed5736376808 (diff)
downloadabc-afcec52a498d62587c99287f02f93f69d650dbb2.tar.gz
abc-afcec52a498d62587c99287f02f93f69d650dbb2.tar.bz2
abc-afcec52a498d62587c99287f02f93f69d650dbb2.zip
Improvements to representation of choices.
Diffstat (limited to 'src/aig/gia/giaUtil.c')
-rw-r--r--src/aig/gia/giaUtil.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/aig/gia/giaUtil.c b/src/aig/gia/giaUtil.c
index e16ee44f..2febad3b 100644
--- a/src/aig/gia/giaUtil.c
+++ b/src/aig/gia/giaUtil.c
@@ -343,12 +343,22 @@ void Gia_ManFillValue( Gia_Man_t * p )
SeeAlso []
***********************************************************************/
-void Gia_ObjSetPhase( Gia_Obj_t * pObj )
+void Gia_ObjSetPhase( Gia_Man_t * p, Gia_Obj_t * pObj )
{
- assert( !Gia_ObjIsXor(pObj) );
if ( Gia_ObjIsAnd(pObj) )
- pObj->fPhase = (Gia_ObjPhase(Gia_ObjFanin0(pObj)) ^ Gia_ObjFaninC0(pObj)) &
- (Gia_ObjPhase(Gia_ObjFanin1(pObj)) ^ Gia_ObjFaninC1(pObj));
+ {
+ int fPhase0 = Gia_ObjPhase(Gia_ObjFanin0(pObj)) ^ Gia_ObjFaninC0(pObj);
+ int fPhase1 = Gia_ObjPhase(Gia_ObjFanin1(pObj)) ^ Gia_ObjFaninC1(pObj);
+ if ( Gia_ObjIsMux(p, pObj) )
+ {
+ int fPhase2 = Gia_ObjPhase(Gia_ObjFanin2(p, pObj)) ^ Gia_ObjFaninC2(p, pObj);
+ pObj->fPhase = (fPhase2 & fPhase1) | (!fPhase2 & fPhase0);
+ }
+ else if ( Gia_ObjIsXor(pObj) )
+ pObj->fPhase = fPhase0 ^ fPhase1;
+ else
+ pObj->fPhase = fPhase0 & fPhase1;
+ }
else if ( Gia_ObjIsCo(pObj) )
pObj->fPhase = (Gia_ObjPhase(Gia_ObjFanin0(pObj)) ^ Gia_ObjFaninC0(pObj));
else
@@ -371,7 +381,7 @@ void Gia_ManSetPhase( Gia_Man_t * p )
Gia_Obj_t * pObj;
int i;
Gia_ManForEachObj( p, pObj, i )
- Gia_ObjSetPhase( pObj );
+ Gia_ObjSetPhase( p, pObj );
}
void Gia_ManSetPhasePattern( Gia_Man_t * p, Vec_Int_t * vCiValues )
{
@@ -382,7 +392,7 @@ void Gia_ManSetPhasePattern( Gia_Man_t * p, Vec_Int_t * vCiValues )
if ( Gia_ObjIsCi(pObj) )
pObj->fPhase = Vec_IntEntry( vCiValues, Gia_ObjCioId(pObj) );
else
- Gia_ObjSetPhase( pObj );
+ Gia_ObjSetPhase( p, pObj );
}
/**Function*************************************************************
@@ -404,7 +414,7 @@ void Gia_ManSetPhase1( Gia_Man_t * p )
pObj->fPhase = 1;
Gia_ManForEachObj( p, pObj, i )
if ( !Gia_ObjIsCi(pObj) )
- Gia_ObjSetPhase( pObj );
+ Gia_ObjSetPhase( p, pObj );
}
/**Function*************************************************************