49 pCut = If_ObjCutBest(pIfObj);
50 if ( If_CutDataInt(pCut) )
52 Vec_PtrPush( vVisited, pCut );
54 If_CutSetDataInt( pCut, ~0 );
56 if ( If_ObjIsCi(pIfObj) )
70 Vec_PtrClear( pIfMan->
vTemp );
73 If_CutSetDataInt( pCut, 0 );
76 pCut = If_ObjCutBest(pIfObj);
78 printf(
"%d ", pLeaf->
Id );
98 int i, iFunc0, iFunc1;
100 pCut = If_ObjCutBest(pIfObj);
102 if ( If_CutDataInt(pCut) )
103 return If_CutDataInt(pCut);
105 Vec_PtrPush( vVisited, pCut );
107 If_CutSetDataInt( pCut, ~0 );
109 if ( If_ObjIsCi(pIfObj) )
110 return If_CutDataInt(pCut);
112 for ( i = 0, pTemp = pIfObj; pTemp; pTemp = pTemp->
pEquiv, i++ )
121 Vec_IntPush( vShape, pIfObj->
Id );
122 Vec_IntPush( vShape, pTemp->
Id );
123 If_CutSetDataInt( pCut, 1 );
126 return If_CutDataInt(pCut);
134 pCut = If_ObjCutBest(pIfObj);
139 assert( If_CutDataInt( If_ObjCutBest(pLeaf) ) == 0 );
140 If_CutSetDataInt( If_ObjCutBest(pLeaf), 1 );
143 Vec_IntClear( vShape );
144 Vec_PtrClear( pIfMan->
vTemp );
148 Abc_Print( -1,
"If_ManNodeShapeMap(): Computing local AIG has failed.\n" );
153 If_CutSetDataInt( If_ObjCutBest(pLeaf), 0 );
155 If_CutSetDataInt( pCut, 0 );
171static inline int If_WordCountOnes(
unsigned uWord )
173 uWord = (uWord & 0x55555555) + ((uWord>>1) & 0x55555555);
174 uWord = (uWord & 0x33333333) + ((uWord>>2) & 0x33333333);
175 uWord = (uWord & 0x0F0F0F0F) + ((uWord>>4) & 0x0F0F0F0F);
176 uWord = (uWord & 0x00FF00FF) + ((uWord>>8) & 0x00FF00FF);
177 return (uWord & 0x0000FFFF) + (uWord>>16);
182 If_Obj_t * pTemp, * pTempBest = NULL;
183 int i, iFunc, iFunc0, iFunc1, iBest = 0;
185 pCut = If_ObjCutBest(pIfObj);
187 if ( If_CutDataInt(pCut) )
188 return If_CutDataInt(pCut);
190 Vec_PtrPush( vVisited, pCut );
192 If_CutSetDataInt( pCut, ~0 );
194 if ( If_ObjIsCi(pIfObj) )
195 return If_CutDataInt(pCut);
197 for ( i = 0, pTemp = pIfObj; pTemp; pTemp = pTemp->
pEquiv, i++ )
205 iFunc = iFunc0 | iFunc1;
215 Vec_IntPush( vShape, pIfObj->
Id );
216 Vec_IntPush( vShape, pTempBest->
Id );
217 If_CutSetDataInt( pCut, iBest );
219 return If_CutDataInt(pCut);
227 pCut = If_ObjCutBest(pIfObj);
231 If_CutSetDataInt( If_ObjCutBest(pLeaf), (1 << i) );
233 Vec_IntClear( vShape );
234 Vec_PtrClear( pIfMan->
vTemp );
238 Abc_Print( -1,
"If_ManNodeShapeMap2(): Computing local AIG has failed.\n" );
243 If_CutSetDataInt( If_ObjCutBest(pLeaf), 0 );
245 If_CutSetDataInt( pCut, 0 );
270 pCut = If_ObjCutBest(pIfObj);
272 if ( If_CutDataInt(pCut) )
273 return If_CutDataInt(pCut);
275 Vec_PtrPush( vVisited, pCut );
277 If_CutSetDataInt( pCut, ~0 );
279 if ( If_ObjIsCi(pIfObj) )
280 return If_CutDataInt(pCut);
282 for ( pTemp = pIfObj; pTemp; pTemp = pTemp->
pEquiv )
291 If_CutSetDataInt( pCut, 1 );
292 Vec_PtrPush( vCone, pTemp );
293 if ( fRootAdded == 0 && pTemp == pIfObj )
296 if ( fNodeAdded && !fRootAdded )
297 Vec_PtrPush( vCone, pIfObj );
298 return If_CutDataInt(pCut);
308 assert( If_CutDataInt( If_ObjCutBest(pLeaf) ) == 0 );
309 If_CutSetDataInt( If_ObjCutBest(pLeaf), 1 );
312 vCone = Vec_PtrAlloc( 100 );
313 Vec_PtrClear( pIfMan->
vTemp );
318 If_CutSetDataInt( If_ObjCutBest(pLeaf), 0 );
320 If_CutSetDataInt( pCut, 0 );
337 int * pVars = Vec_IntArray(vVars);
338 int nVars = Vec_IntSize(vVars);
339 int i, k, Lits[2], Value;
340 assert( Vec_IntSize(vVars) < Vec_IntCap(vVars) );
342 for ( i = 0; i < nVars; i++ )
343 pVars[i] = Abc_Var2Lit( pVars[i], 0 );
344 pVars[i] = Abc_Var2Lit( iVar, 1 );
349 for ( i = 0; i < nVars; i++ )
350 pVars[i] = Abc_Lit2Var( pVars[i] );
352 Lits[0] = Abc_Var2Lit( iVar, 0 );
353 for ( i = 0; i < nVars; i++ )
355 Lits[1] = Abc_Var2Lit( pVars[i], 1 );
360 for ( i = 0; i < nVars; i++ )
361 for ( k = i+1; k < nVars; k++ )
363 Lits[0] = Abc_Var2Lit( pVars[i], 1 );
364 Lits[1] = Abc_Var2Lit( pVars[k], 1 );
369static inline int If_ObjSatVar(
If_Obj_t * pIfObj ) {
return If_CutDataInt(If_ObjCutBest(pIfObj)); }
370static inline void If_ObjSetSatVar(
If_Obj_t * pIfObj,
int v ) { If_CutSetDataInt( If_ObjCutBest(pIfObj), v ); }
387 assert( sat_solver_var_value(pSat, If_ObjSatVar(pIfObj)) == 1 );
391 for ( pTemp = pIfObj; pTemp; pTemp = pTemp->
pEquiv )
392 if ( sat_solver_var_value(pSat, If_ObjSatVar(pTemp)+1) == 1 )
397 Vec_IntPush( vShape, pIfObj->
Id );
398 Vec_IntPush( vShape, pTemp->
Id );
422 pCut = If_ObjCutBest(pIfObj);
433 assert( If_ObjSatVar(pObj) == 0 );
434 If_ObjSetSatVar( pObj, 2*(i+1) );
438 assert( If_ObjSatVar(pObj) == 0 );
439 If_ObjSetSatVar( pObj, 2*(i+1+pCut->
nLeaves) );
447 vFanins = Vec_IntAlloc( 100 );
450 assert( If_ObjIsAnd(pObj) );
451 Vec_IntClear( vFanins );
452 for ( pTemp = pObj; pTemp; pTemp = pTemp->
pEquiv )
453 if ( If_ObjSatVar(pTemp) )
454 Vec_IntPush( vFanins, If_ObjSatVar(pTemp)+1 );
455 assert( Vec_IntSize(vFanins) > 0 );
456 sat_solver_add_choice( pSat, If_ObjSatVar(pObj), vFanins );
457 assert( If_ObjSatVar(pObj) > 0 );
459 if ( If_ObjSatVar(pObj->
pFanin0) > 0 && If_ObjSatVar(pObj->
pFanin1) > 0 )
462 Lits[0] = Abc_Var2Lit( If_ObjSatVar(pObj)+1, 1 );
463 Lits[1] = Abc_Var2Lit( If_ObjSatVar(pObj->
pFanin0), 0 );
467 Lits[0] = Abc_Var2Lit( If_ObjSatVar(pObj)+1, 1 );
468 Lits[1] = Abc_Var2Lit( If_ObjSatVar(pObj->
pFanin1), 0 );
473 Vec_IntFree( vFanins );
476 pCut = If_ObjCutBest(pIfObj);
479 Lit = Abc_Var2Lit( If_ObjSatVar(pObj), 0 );
484 Lit = Abc_Var2Lit( If_ObjSatVar(pIfObj), 0 );
500 Vec_IntClear( vShape );
508 If_ObjSetSatVar( pObj, 0 );
513 If_ObjSetSatVar( pObj, 0 );
516 Vec_PtrFree( vCone );
536 int i, Entry1, Entry2, RetValue = 1;
538 pCut = If_ObjCutBest(pIfObj);
544 pLeaf = If_ManObj(pIfMan, Entry2);
550 if ( pLeaf->
fMark == 0 )
557 pLeaf = If_ManObj(pIfMan, Entry2);
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define sat_solver_addclause
void If_ObjConePrint(If_Man_t *pIfMan, If_Obj_t *pIfObj)
Vec_Ptr_t * If_ManConeCollect(If_Man_t *pIfMan, If_Obj_t *pIfObj, If_Cut_t *pCut)
int If_ManNodeShapeMap2_rec(If_Man_t *pIfMan, If_Obj_t *pIfObj, Vec_Ptr_t *vVisited, Vec_Int_t *vShape)
int If_ManNodeShapeMap2(If_Man_t *pIfMan, If_Obj_t *pIfObj, Vec_Int_t *vShape)
int If_ManNodeShapeSat(If_Man_t *pIfMan, If_Obj_t *pIfObj, Vec_Int_t *vShape)
int If_ManNodeShape(If_Man_t *pIfMan, If_Obj_t *pIfObj, Vec_Int_t *vShape, int fExact)
int If_ManNodeShapeMap_rec(If_Man_t *pIfMan, If_Obj_t *pIfObj, Vec_Ptr_t *vVisited, Vec_Int_t *vShape)
int If_ManNodeShapeMap(If_Man_t *pIfMan, If_Obj_t *pIfObj, Vec_Int_t *vShape)
int If_ManConeCollect_rec(If_Man_t *pIfMan, If_Obj_t *pIfObj, Vec_Ptr_t *vVisited, Vec_Ptr_t *vCone)
void If_ManNodeShape2_rec(sat_solver *pSat, If_Man_t *pIfMan, If_Obj_t *pIfObj, Vec_Int_t *vShape)
ABC_NAMESPACE_IMPL_START void If_ObjConePrint_rec(If_Man_t *pIfMan, If_Obj_t *pIfObj, Vec_Ptr_t *vVisited)
DECLARATIONS ///.
int If_ManCheckShape(If_Man_t *pIfMan, If_Obj_t *pIfObj, Vec_Int_t *vShape)
struct If_Cut_t_ If_Cut_t
#define If_CutForEachLeaf(p, pCut, pLeaf, i)
struct If_Man_t_ If_Man_t
BASIC TYPES ///.
struct If_Obj_t_ If_Obj_t
sat_solver * sat_solver_new(void)
void sat_solver_setnvars(sat_solver *s, int n)
void sat_solver_delete(sat_solver *s)
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.