50 Vec_IntClear( vRoots );
51 if ( vLeaves == NULL )
53 pObj = Aig_ManCo( pAig, pCex->iPo );
54 Vec_IntPush( vRoots, Aig_ObjId(pObj) );
58 if ( Saig_ObjIsLo(pAig, pObj) )
59 Vec_IntPush( vRoots, Aig_ObjId( Saig_ObjLoToLi(pAig, pObj) ) );
75 if ( Aig_ObjIsTravIdCurrent(pAig, pObj) )
77 Aig_ObjSetTravIdCurrent(pAig, pObj);
78 if ( Aig_ObjIsCo(pObj) )
80 else if ( Aig_ObjIsNode(pObj) )
85 else if ( Aig_ObjIsCi(pObj) )
86 Vec_IntPush( vFrameCisOne, Aig_ObjId(pObj) );
107 vRoots = Vec_IntAlloc( 1000 );
108 vFrameCis = Vec_VecStart( pCex->iFrame+1 );
109 for ( f = pCex->iFrame; f >= 0; f-- )
112 vLeaves = (f == pCex->iFrame) ? NULL : Vec_VecEntryInt(vFrameCis, f+1);
119 Vec_IntFree( vRoots );
138 if ( Aig_ObjIsTravIdCurrent(pAig, pObj) )
140 Aig_ObjSetTravIdCurrent(pAig, pObj);
141 if ( Aig_ObjIsCo(pObj) )
144 assert( Aig_ObjFanin0(pObj)->iData >= 0 );
145 pObj->
iData = Aig_ObjFanin0(pObj)->iData ^ Aig_ObjFaninC0(pObj);
147 else if ( Aig_ObjIsNode(pObj) )
149 int fPhase0, fPhase1, iPrio0, iPrio1;
152 assert( Aig_ObjFanin0(pObj)->iData >= 0 );
153 assert( Aig_ObjFanin1(pObj)->iData >= 0 );
154 fPhase0 = Abc_LitIsCompl( Aig_ObjFanin0(pObj)->iData ) ^ Aig_ObjFaninC0(pObj);
155 fPhase1 = Abc_LitIsCompl( Aig_ObjFanin1(pObj)->iData ) ^ Aig_ObjFaninC1(pObj);
156 iPrio0 = Abc_Lit2Var( Aig_ObjFanin0(pObj)->iData );
157 iPrio1 = Abc_Lit2Var( Aig_ObjFanin1(pObj)->iData );
158 if ( fPhase0 && fPhase1 )
159 pObj->
iData = Abc_Var2Lit( Abc_MinInt(iPrio0, iPrio1), 1 );
160 else if ( !fPhase0 && fPhase1 )
161 pObj->
iData = Abc_Var2Lit( iPrio0, 0 );
162 else if ( fPhase0 && !fPhase1 )
163 pObj->
iData = Abc_Var2Lit( iPrio1, 0 );
165 pObj->
iData = Abc_Var2Lit( Abc_MaxInt(iPrio0, iPrio1), 0 );
184 Aig_ManConst1(pAig)->fPhase = 1;
186 pObj->
fPhase = Abc_InfoHasBit(pCex->pData, pCex->nRegs + f * pCex->nPis + i);
195 pObj->
fPhase = Saig_ObjLoToLi(pAig, pObj)->fPhase;
198 pObj->
fPhase = (Aig_ObjFaninC0(pObj) ^ Aig_ObjFanin0(pObj)->fPhase) &
199 (Aig_ObjFaninC1(pObj) ^ Aig_ObjFanin1(pObj)->fPhase);
201 pObj->
fPhase = (Aig_ObjFaninC0(pObj) ^ Aig_ObjFanin0(pObj)->fPhase);
217 Vec_Int_t * vFramePPsOne, * vFrameCisOne, * vLeaves;
221 vFrameCisOne = Vec_VecEntryInt( vFrameCis, f );
222 vFramePPsOne = Vec_VecEntryInt( vFramePPs, f );
225 pObj->
iData = Vec_IntEntry( vFramePPsOne, i );
232 vLeaves = (f == pCex->iFrame) ? NULL : Vec_VecEntryInt(vFrameCis, f+1);
258 Vec_Int_t * vRoots, * vFramePPsOne, * vFrameCisOne;
260 int i, f, nPrioOffset;
267 vFramePPs = Vec_VecStart( pCex->iFrame+1 );
268 nPrioOffset = (pCex->iFrame + 1) * pCex->nPis;
269 Aig_ManConst1(pAig)->iData = Abc_Var2Lit( nPrioOffset + pCex->nRegs, 1 );
270 vRoots = Vec_IntAlloc( 1000 );
271 for ( f = 0; f <= pCex->iFrame; f++ )
275 vFrameCisOne = Vec_VecEntryInt( vFrameCis, f );
276 vFramePPsOne = Vec_VecEntryInt( vFramePPs, f );
277 assert( Vec_IntSize(vFramePPsOne) == 0 );
280 assert( Aig_ObjIsCi(pObj) );
281 if ( Saig_ObjIsPi(pAig, pObj) )
282 Vec_IntPush( vFramePPsOne, Abc_Var2Lit( (f+1) * pCex->nPis - nPiCount++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + f * pCex->nPis + Aig_ObjCioId(pObj)) ) );
284 Vec_IntPush( vFramePPsOne, Abc_Var2Lit( nPrioOffset + Saig_ObjRegId(pAig, pObj), 0 ) );
286 Vec_IntPush( vFramePPsOne, Saig_ObjLoToLi(pAig, pObj)->iData );
291 Vec_IntFree( vRoots );
293 pObj = Aig_ManCo( pAig, pCex->iPo );
312 Vec_Int_t * vRoots, * vFramePPsOne, * vFrameCisOne;
314 int i, f, nPrioOffset;
321 vFramePPs = Vec_VecStart( pCex->iFrame+1 );
322 nPrioOffset = pCex->nRegs;
323 Aig_ManConst1(pAig)->iData = Abc_Var2Lit( nPrioOffset + (pCex->iFrame + 1) * pCex->nPis, 1 );
324 vRoots = Vec_IntAlloc( 1000 );
325 for ( f = 0; f <= pCex->iFrame; f++ )
329 vFrameCisOne = Vec_VecEntryInt( vFrameCis, f );
330 vFramePPsOne = Vec_VecEntryInt( vFramePPs, f );
331 assert( Vec_IntSize(vFramePPsOne) == 0 );
334 assert( Aig_ObjIsCi(pObj) );
335 if ( Saig_ObjIsPi(pAig, pObj) )
336 Vec_IntPush( vFramePPsOne, Abc_Var2Lit( nPrioOffset + (f+1) * pCex->nPis - 1 - nPiCount++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + f * pCex->nPis + Aig_ObjCioId(pObj)) ) );
338 Vec_IntPush( vFramePPsOne, Abc_Var2Lit( Saig_ObjRegId(pAig, pObj), 0 ) );
340 Vec_IntPush( vFramePPsOne, Saig_ObjLoToLi(pAig, pObj)->iData );
345 Vec_IntFree( vRoots );
347 pObj = Aig_ManCo( pAig, pCex->iPo );
366 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
368 Aig_ObjSetTravIdCurrent(
p, pObj);
369 if ( Aig_ObjIsCi(pObj) )
371 if ( fPiReason && Saig_ObjIsPi(
p, pObj) )
372 Vec_IntPush( vReason, Abc_Var2Lit( Aig_ObjCioId(pObj), !Abc_LitIsCompl(pObj->
iData) ) );
373 else if ( !fPiReason && Saig_ObjIsLo(
p, pObj) )
374 Vec_IntPush( vReason, Abc_Var2Lit( Saig_ObjRegId(
p, pObj), !Abc_LitIsCompl(pObj->
iData) ) );
377 if ( Aig_ObjIsCo(pObj) )
382 if ( Aig_ObjIsConst1(pObj) )
384 assert( Aig_ObjIsNode(pObj) );
385 if ( Abc_LitIsCompl(pObj->
iData) )
387 int fPhase0 = Abc_LitIsCompl( Aig_ObjFanin0(pObj)->iData ) ^ Aig_ObjFaninC0(pObj);
388 int fPhase1 = Abc_LitIsCompl( Aig_ObjFanin1(pObj)->iData ) ^ Aig_ObjFaninC1(pObj);
389 assert( fPhase0 && fPhase1 );
395 int fPhase0 = Abc_LitIsCompl( Aig_ObjFanin0(pObj)->iData ) ^ Aig_ObjFaninC0(pObj);
396 int fPhase1 = Abc_LitIsCompl( Aig_ObjFanin1(pObj)->iData ) ^ Aig_ObjFaninC1(pObj);
397 assert( !fPhase0 || !fPhase1 );
398 if ( !fPhase0 && fPhase1 )
400 else if ( fPhase0 && !fPhase1 )
404 int iPrio0 = Abc_Lit2Var( Aig_ObjFanin0(pObj)->iData );
405 int iPrio1 = Abc_Lit2Var( Aig_ObjFanin1(pObj)->iData );
406 if ( iPrio0 >= iPrio1 )
433 vFrameReas = Vec_VecStart( pCex->iFrame+1 );
434 vRoots = Vec_IntAlloc( 1000 );
435 for ( f = pCex->iFrame; f >= 0; f-- )
440 vLeaves = (f == pCex->iFrame) ? NULL : Vec_VecEntryInt(vFrameCis, f+1);
449 Vec_IntFree( vRoots );
466 Vec_Vec_t * vFrameCis, * vFramePPs, * vFrameReas;
468 assert( pCex->nPis == Saig_ManPiNum(pAig) );
469 assert( pCex->nRegs == Saig_ManRegNum(pAig) );
470 assert( pCex->iPo >= 0 && pCex->iPo < Saig_ManPoNum(pAig) );
477 Vec_VecFree( vFramePPs );
478 Vec_VecFree( vFrameCis );
500 assert( pAig->nConstrs == 0 );
502 pAigNew =
Aig_ManStart( Aig_ManNodeNum(pAig) + Vec_VecSizeSize(vReg2Value) + Vec_VecSize(vReg2Value) );
503 pAigNew->pName = Abc_UtilStrsav( pAig->pName );
505 Aig_ManConst1(pAig)->pData = Aig_ManConst1( pAigNew );
511 pObj->
pData =
Aig_And( pAigNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
517 pMiter = Aig_ManConst1( pAigNew );
520 assert( Lit >= 0 && Lit < 2 * Aig_ManRegNum(pAig) );
521 pObj = Saig_ManLi( pAig, Abc_Lit2Var(Lit) );
522 pMiter =
Aig_And( pAigNew, pMiter, Aig_NotCond(Aig_ObjChild0Copy(pObj), Abc_LitIsCompl(Lit)) );
555 printf(
"Reason size = %d. Ave = %d.\n", Vec_VecSizeSize(vFrameReas), Vec_VecSizeSize(vFrameReas)/(pCex->iFrame + 1) );
560 char * pFileName =
"aigcube.aig";
564 printf(
"Intermediate AIG is written into file \"%s\".\n", pFileName );
568 Vec_VecFree( vFrameReas );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
#define Aig_ManForEachObj(p, pObj, i)
void Aig_ManStop(Aig_Man_t *p)
void Aig_ManIncrementTravId(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
#define Aig_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
#define Aig_ManForEachCo(p, pObj, i)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachObjVec(vIds, p, pObj, i)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Vec_Vec_t * Saig_ManCexMinCollectPhasePriority_(Aig_Man_t *pAig, Abc_Cex_t *pCex, Vec_Vec_t *vFrameCis)
void Saig_ManCexMinCollectFrameTerms_rec(Aig_Man_t *pAig, Aig_Obj_t *pObj, Vec_Int_t *vFrameCisOne)
Vec_Vec_t * Saig_ManCexMinCollectFrameTerms(Aig_Man_t *pAig, Abc_Cex_t *pCex)
Abc_Cex_t * Saig_ManCexMinPerform(Aig_Man_t *pAig, Abc_Cex_t *pCex)
Aig_Man_t * Saig_ManCexMinDupWithCubes(Aig_Man_t *pAig, Vec_Vec_t *vReg2Value)
Vec_Vec_t * Saig_ManCexMinCollectPhasePriority(Aig_Man_t *pAig, Abc_Cex_t *pCex, Vec_Vec_t *vFrameCis)
Vec_Vec_t * Saig_ManCexMinComputeReason(Aig_Man_t *pAig, Abc_Cex_t *pCex, int fPiReason)
void Saig_ManCexMinDerivePhasePriority_rec(Aig_Man_t *pAig, Aig_Obj_t *pObj)
Vec_Vec_t * Saig_ManCexMinCollectReason(Aig_Man_t *pAig, Abc_Cex_t *pCex, Vec_Vec_t *vFrameCis, Vec_Vec_t *vFramePPs, int fPiReason)
ABC_NAMESPACE_IMPL_START void Saig_ManCexMinGetCos(Aig_Man_t *pAig, Abc_Cex_t *pCex, Vec_Int_t *vLeaves, Vec_Int_t *vRoots)
DECLARATIONS ///.
void Saig_ManCexMinCollectReason_rec(Aig_Man_t *p, Aig_Obj_t *pObj, Vec_Int_t *vReason, int fPiReason)
void Saig_ManCexMinVerifyPhase(Aig_Man_t *pAig, Abc_Cex_t *pCex, int f)
void Saig_ManCexMinDerivePhasePriority(Aig_Man_t *pAig, Abc_Cex_t *pCex, Vec_Vec_t *vFrameCis, Vec_Vec_t *vFramePPs, int f, Vec_Int_t *vRoots)
void Ioa_WriteAiger(Aig_Man_t *pMan, char *pFileName, int fWriteSymbols, int fCompact)
#define Saig_ManForEachLi(p, pObj, i)
#define Saig_ManForEachLo(p, pObj, i)
#define Saig_ManForEachPi(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_VecForEachLevelInt(vGlob, vVec, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.