| /**CFile**************************************************************** |
| |
| FileName [giaProp.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [Scalable AIG package.] |
| |
| Synopsis [Constraint propagation on the AIG.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 20, 2005.] |
| |
| Revision [$Id: giaProp.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "gia.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| #define GIA_SAT_SHIFT 12 |
| #define GIA_ROOT_MASK |
| #define GIA_PATH00_MASK |
| #define GIA_PATH10_MASK |
| #define GIA_PATH20_MASK |
| #define GIA_PATH30_MASK |
| #define GIA_PATH00_MASK |
| #define GIA_PATH10_MASK |
| #define GIA_PATH20_MASK |
| #define GIA_PATH30_MASK |
| |
| static inline int Gia_SatObjIsRoot( Gia_Obj_t * p ) { return 0; } |
| static inline int Gia_SatObjXorRoot( Gia_Obj_t * p ) { return 0; } |
| |
| |
| static inline int Gia_SatObjIsAssigned( Gia_Obj_t * p ) { return 0; } |
| static inline int Gia_SatObjIsHeld( Gia_Obj_t * p ) { return 0; } |
| static inline int Gia_SatObjValue( Gia_Obj_t * p ) { return 0; } |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Checks if the give cut is satisfied.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Gia_SatPathCheckCutSat_rec( Gia_Obj_t * p, int fCompl ) |
| { |
| if ( Gia_SatObjIsRoot(p) ) |
| return Gia_ObjIsAssigned(p) && Gia_SatObjValue(p) == fCompl; |
| if ( Gia_SatObjPath0(p) && !Gia_SatPathCheckCutSat_rec( Gia_ObjFanin0(p), fCompl ^ Gia_ObjFaninC0(p) ) ) |
| return 0; |
| if ( Gia_SatObjPath1(p) && !Gia_SatPathCheckCutSat_rec( Gia_ObjFanin1(p), fCompl ^ Gia_ObjFaninC1(p) ) ) |
| return 0; |
| return 1; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Checks if the give cut is satisfied.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Gia_SatPathCheckCutSat( Gia_Obj_t * p ) |
| { |
| int RetValue; |
| assert( Gia_SatObjIsRoot(p) ); |
| Gia_SatObjXorRoot(p); |
| RetValue = Gia_SatPathCheckCutSat_rec( p ); |
| Gia_SatObjXorRoot(p); |
| return RetValue; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Unbinds literals on the path.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Gia_SatPathUnbind_rec( Gia_Obj_t * p ) |
| { |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Creates a feasible path from the node to a terminal.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Gia_SatPathStart_rec( Gia_Obj_t * p, int fDiffs, int fCompl ) |
| { |
| if ( Gia_SatObjIsRoot(p) ) |
| return fDiffs && (!Gia_ObjIsAssigned(p) || Gia_SatObjValue(p) != fCompl); |
| if ( fCompl == 0 ) |
| { |
| if ( Gia_SatPathStart_rec( Gia_ObjFanin0(p), fDiffs + !Gia_SatObjPath0(p), fCompl ^ Gia_ObjFaninC0(p) ) && |
| Gia_SatPathStart_rec( Gia_ObjFanin1(p), fDiffs + !Gia_SatObjPath1(p), fCompl ^ Gia_ObjFaninC1(p) ) ) |
| return Gia_ObjSetDraftPath0(p) + Gia_ObjSetDraftPath1(p); |
| } |
| else |
| { |
| if ( Gia_SatPathStart_rec( Gia_ObjFanin0(p), fDiffs + !Gia_SatObjPath0(p), fCompl ^ Gia_ObjFaninC0(p) ) ) |
| { |
| Gia_ObjUnsetDraftPath1(p); |
| return Gia_ObjSetDraftPath0(p); |
| } |
| if ( Gia_SatPathStart_rec( Gia_ObjFanin1(p), fDiffs + !Gia_SatObjPath1(p), fCompl ^ Gia_ObjFaninC1(p) ) ) |
| { |
| Gia_ObjUnsetDraftPath0(p); |
| return Gia_ObjSetDraftPath1(p); |
| } |
| } |
| return 0; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Creates a feasible path from the node to a terminal.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Gia_SatPathStart( Gia_Obj_t * p ) |
| { |
| int RetValue; |
| assert( Gia_SatObjIsRoot(p) ); |
| Gia_SatObjXorRoot(p); |
| RetValue = Gia_SatPathStart_rec( p, 0, 0 ); |
| Gia_SatObjXorRoot(p); |
| return RetValue; |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |