69 Vec_Int_t * vMapEntries, * vFlopCosts, * vFlopAddCosts, * vFfsToAddBest;
70 int i, k, f, Entry, iBit, * pPerm;
71 assert( Aig_ManRegNum(pAig) == Vec_IntSize(vFlopClasses) );
72 assert( Vec_IntSize(vAbsFfsToAdd) > nFfsToSelect );
74 vMapEntries = Vec_IntAlloc( Vec_IntSize(vFlopClasses) );
77 Vec_IntPush( vMapEntries, i );
79 assert( Saig_ManPiNum(pAig) + Vec_IntSize(vMapEntries) == pAbsCex->nPis );
80 vFlopCosts = Vec_IntStart( Vec_IntSize(vMapEntries) );
83 Aig_ManConst1(pAig)->fMarkB = 1;
86 for ( f = 0; f < pAbsCex->iFrame; f++ )
89 iBit = pAbsCex->nRegs + f * pAbsCex->nPis + Saig_ManPiNum(pAig);
91 Saig_ManLo(pAig, Entry)->fMarkB = Abc_InfoHasBit(pAbsCex->pData, iBit + k);
94 pObj->
fMarkB = (Aig_ObjFanin0(pObj)->fMarkB ^ Aig_ObjFaninC0(pObj)) &
95 (Aig_ObjFanin1(pObj)->fMarkB ^ Aig_ObjFaninC1(pObj));
97 pObj->
fMarkB = Aig_ObjFanin0(pObj)->fMarkB ^ Aig_ObjFaninC0(pObj);
102 iBit = pAbsCex->nRegs + (f + 1) * pAbsCex->nPis + Saig_ManPiNum(pAig);
104 if ( Saig_ManLi(pAig, Entry)->fMarkB != (
unsigned)Abc_InfoHasBit(pAbsCex->pData, iBit + k) )
105 Vec_IntAddToEntry( vFlopCosts, k, 1 );
111 vFlopAddCosts = Vec_IntAlloc( Vec_IntSize(vAbsFfsToAdd) );
113 Vec_IntPush( vFlopAddCosts, -Vec_IntEntry(vFlopCosts, Entry) );
115 pPerm =
Abc_MergeSortCost( Vec_IntArray(vFlopAddCosts), Vec_IntSize(vFlopAddCosts) );
117 vFfsToAddBest = Vec_IntAlloc( nFfsToSelect );
118 for ( i = 0; i < nFfsToSelect; i++ )
121 Vec_IntPush( vFfsToAddBest, Vec_IntEntry(vAbsFfsToAdd, pPerm[i]) );
126 Vec_IntFree( vMapEntries );
127 Vec_IntFree( vFlopCosts );
128 Vec_IntFree( vFlopAddCosts );
131 return vFfsToAddBest;
152 assert( pAig->nConstrs == 0 );
154 pAigNew =
Aig_ManStart( Aig_ManNodeNum(pAig) + Vec_VecSizeSize(vReg2Value) );
155 pAigNew->pName = Abc_UtilStrsav( pAig->pName );
157 Aig_ManConst1(pAig)->pData = Aig_ManConst1( pAigNew );
163 pObj->
pData =
Aig_And( pAigNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
167 pMiter = Aig_ManConst1( pAigNew );
170 pObj = Saig_ManLi( pAig, Abc_Lit2Var(Lit) );
171 pMiter =
Aig_And( pAigNew, pMiter, Aig_NotCond(Aig_ObjChild0Copy(pObj), Abc_LitIsCompl(Lit)) );
199 vOriginal = Vec_IntAlloc( Saig_ManPiNum(
p->pAig) );
200 vVisited = Vec_IntStart( Saig_ManPiNum(
p->pAig) );
203 int iInput = Vec_IntEntry(
p->vMapPiF2A, 2*Entry );
204 assert( iInput >=
p->nInputs && iInput < Aig_ManCiNum(
p->pAig) );
205 if ( Vec_IntEntry(vVisited, iInput) == 0 )
206 Vec_IntPush( vOriginal, iInput -
p->nInputs );
207 Vec_IntAddToEntry( vVisited, iInput, 1 );
209 Vec_IntFree( vVisited );
227 int i, Entry, iInput, iFrame;
229 memset( pCare->pData, 0,
sizeof(
unsigned) * Abc_BitWordNum(pCare->nBits) );
232 assert( Entry >= 0 && Entry < Aig_ManCiNum(
p->pFrames) );
233 iInput = Vec_IntEntry(
p->vMapPiF2A, 2*Entry );
234 iFrame = Vec_IntEntry(
p->vMapPiF2A, 2*Entry+1 );
235 Abc_InfoSetBit( pCare->pData, pCare->nRegs + pCare->nPis * iFrame + iInput );
263 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
265 Aig_ObjSetTravIdCurrent(
p, pObj);
266 if ( Aig_ObjIsConst1(pObj) )
268 if ( Aig_ObjIsCi(pObj) )
270 Vec_IntPush( vReasons, Aig_ObjCioId(pObj) );
273 assert( Aig_ObjIsNode(pObj) );
281 int fPhase0 = Aig_ObjFaninC0(pObj) ^ Aig_ObjFanin0(pObj)->fPhase;
282 int fPhase1 = Aig_ObjFaninC1(pObj) ^ Aig_ObjFanin1(pObj)->fPhase;
283 assert( !fPhase0 || !fPhase1 );
284 if ( !fPhase0 && fPhase1 )
286 else if ( fPhase0 && !fPhase1 )
290 int iPrio0 = Vec_IntEntry( vPrios, Aig_ObjFaninId0(pObj) );
291 int iPrio1 = Vec_IntEntry( vPrios, Aig_ObjFaninId1(pObj) );
292 if ( iPrio0 <= iPrio1 )
318 vPrios = Vec_IntStartFull( Aig_ManObjNumMax(
p->pFrames) );
319 Aig_ManConst1(
p->pFrames)->fPhase = 1;
322 int iInput = Vec_IntEntry(
p->vMapPiF2A, 2*i );
323 int iFrame = Vec_IntEntry(
p->vMapPiF2A, 2*i+1 );
324 pObj->
fPhase = Abc_InfoHasBit(
p->pCex->pData,
p->pCex->nRegs +
p->pCex->nPis * iFrame + iInput );
325 Vec_IntWriteEntry( vPrios, Aig_ObjId(pObj), i );
331 int fPhase0 = Aig_ObjFaninC0(pObj) ^ Aig_ObjFanin0(pObj)->fPhase;
332 int fPhase1 = Aig_ObjFaninC1(pObj) ^ Aig_ObjFanin1(pObj)->fPhase;
333 int iPrio0 = Vec_IntEntry( vPrios, Aig_ObjFaninId0(pObj) );
334 int iPrio1 = Vec_IntEntry( vPrios, Aig_ObjFaninId1(pObj) );
335 pObj->
fPhase = fPhase0 && fPhase1;
336 if ( fPhase0 && fPhase1 )
337 Vec_IntWriteEntry( vPrios, Aig_ObjId(pObj), Abc_MaxInt(iPrio0, iPrio1) );
338 else if ( !fPhase0 && fPhase1 )
339 Vec_IntWriteEntry( vPrios, Aig_ObjId(pObj), iPrio0 );
340 else if ( fPhase0 && !fPhase1 )
341 Vec_IntWriteEntry( vPrios, Aig_ObjId(pObj), iPrio1 );
343 Vec_IntWriteEntry( vPrios, Aig_ObjId(pObj), Abc_MinInt(iPrio0, iPrio1) );
346 pObj = Aig_ManCo(
p->pFrames, 0 );
347 pObj->
fPhase = Aig_ObjFaninC0(pObj) ^ Aig_ObjFanin0(pObj)->fPhase;
351 vReasons = Vec_IntAlloc( 100 );
354 Vec_IntFree( vPrios );
373 if ( Aig_ObjIsTravIdCurrent(pAig, pObj) )
375 Aig_ObjSetTravIdCurrent(pAig, pObj);
376 if ( Aig_ObjIsCo(pObj) )
378 else if ( Aig_ObjIsNode(pObj) )
383 if ( vRoots && Saig_ObjIsLo( pAig, pObj ) )
384 Vec_IntPush( vRoots, Aig_ObjId( Saig_ObjLoToLi(pAig, pObj) ) );
385 Vec_IntPush( vObjs, Aig_ObjId(pObj) );
408 assert( Saig_ManPiNum(pAig) == pCex->nPis );
410 assert( pCex->iPo >= 0 && pCex->iPo < Saig_ManPoNum(pAig) );
413 *pvMapPiF2A = Vec_IntAlloc( 1000 );
416 vFrameCos = Vec_VecStart( pCex->iFrame+1 );
417 vFrameObjs = Vec_VecStart( pCex->iFrame+1 );
419 pObj = Aig_ManCo( pAig, pCex->iPo );
420 Vec_VecPushInt( vFrameCos, pCex->iFrame, Aig_ObjId(pObj) );
421 for ( f = pCex->iFrame; f >= 0; f-- )
425 vRoots = Vec_VecEntryInt( vFrameCos, f );
428 Vec_VecEntryInt(vFrameObjs, f),
429 (
Vec_Int_t *)(f ? Vec_VecEntry(vFrameCos, f-1) : NULL) );
434 pFrames->pName = Abc_UtilStrsav( pAig->pName );
435 pFrames->pSpec = Abc_UtilStrsav( pAig->pSpec );
437 if ( Saig_ManRegNum(pAig) == pCex->nRegs )
440 pObj->
pData = Aig_NotCond( Aig_ManConst1(pFrames), !Abc_InfoHasBit(pCex->pData, i) );
445 pObj->
pData = Aig_NotCond( Aig_ManConst1(pFrames), 1 );
448 for ( f = 0; f <= pCex->iFrame; f++ )
451 vObjs = Vec_VecEntryInt( vFrameObjs, f );
454 if ( Aig_ObjIsNode(pObj) )
455 pObj->
pData =
Aig_And( pFrames, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
456 else if ( Aig_ObjIsCo(pObj) )
457 pObj->
pData = Aig_ObjChild0Copy(pObj);
458 else if ( Aig_ObjIsConst1(pObj) )
459 pObj->
pData = Aig_ManConst1(pFrames);
460 else if ( Saig_ObjIsPi(pAig, pObj) )
462 if ( Aig_ObjCioId(pObj) < nInputs )
464 int iBit = pCex->nRegs + f * pCex->nPis + Aig_ObjCioId(pObj);
465 pObj->
pData = Aig_NotCond( Aig_ManConst1(pFrames), !Abc_InfoHasBit(pCex->pData, iBit) );
470 Vec_IntPush( *pvMapPiF2A, Aig_ObjCioId(pObj) );
471 Vec_IntPush( *pvMapPiF2A, f );
475 if ( f == pCex->iFrame )
478 vRoots = Vec_VecEntryInt( vFrameCos, f );
481 Saig_ObjLiToLo( pAig, pObj )->pData = pObj->
pData;
484 Vec_VecPushInt( *pvReg2Frame, f, Aig_ObjId(pObj) );
485 Vec_VecPushInt( *pvReg2Frame, f, Aig_ObjToLit((
Aig_Obj_t *)pObj->
pData) );
490 pObj = Aig_ManCo( pAig, pCex->iPo );
494 Vec_VecFree( vFrameCos );
495 Vec_VecFree( vFrameObjs );
519 p->nInputs = nInputs;
520 p->fVerbose = fVerbose;
537 Vec_VecFreeP( &
p->vReg2Frame );
538 Vec_VecFreeP( &
p->vReg2Value );
540 Vec_IntFreeP( &
p->vMapPiF2A );
560 int f, k, ObjId, Lit;
566 pObjFrame = Aig_ManObj(
p->pFrames, Abc_Lit2Var(Lit) );
567 if ( pObjFrame == NULL || (!Aig_ObjIsConst1(pObjFrame) && !Aig_ObjIsTravIdCurrent(
p->pFrames, pObjFrame)) )
569 pObjLi = Aig_ManObj(
p->pAig, ObjId );
570 assert( Saig_ObjIsLi(
p->pAig, pObjLi) );
571 Vec_VecPushInt(
p->vReg2Value, f, Abc_Var2Lit( Aig_ObjCioId(pObjLi) - Saig_ManPoNum(
p->pAig), Abc_LitIsCompl(Lit) ^ !pObjFrame->
fPhase ) );
577 vLevel2 = Vec_VecEntryInt(
p->vReg2Value, k );
578 printf(
"Level = %4d StateBits = %4d (%6.2f %%) CareBits = %4d (%6.2f %%)\n", k,
579 Vec_IntSize(vLevel)/2, 100.0 * (Vec_IntSize(vLevel)/2) / Aig_ManRegNum(
p->pAig),
580 Vec_IntSize(vLevel2), 100.0 * Vec_IntSize(vLevel2) / Aig_ManRegNum(
p->pAig) );
596static inline int Saig_ObjCexMinGet0Fanin0(
Aig_Obj_t * pObj ) {
return (Saig_ObjCexMinGet1(Aig_ObjFanin0(pObj)) && Aig_ObjFaninC0(pObj)) || (Saig_ObjCexMinGet0(Aig_ObjFanin0(pObj)) && !Aig_ObjFaninC0(pObj)); }
597static inline int Saig_ObjCexMinGet1Fanin0(
Aig_Obj_t * pObj ) {
return (Saig_ObjCexMinGet0(Aig_ObjFanin0(pObj)) && Aig_ObjFaninC0(pObj)) || (Saig_ObjCexMinGet1(Aig_ObjFanin0(pObj)) && !Aig_ObjFaninC0(pObj)); }
599static inline int Saig_ObjCexMinGet0Fanin1(
Aig_Obj_t * pObj ) {
return (Saig_ObjCexMinGet1(Aig_ObjFanin1(pObj)) && Aig_ObjFaninC1(pObj)) || (Saig_ObjCexMinGet0(Aig_ObjFanin1(pObj)) && !Aig_ObjFaninC1(pObj)); }
600static inline int Saig_ObjCexMinGet1Fanin1(
Aig_Obj_t * pObj ) {
return (Saig_ObjCexMinGet0(Aig_ObjFanin1(pObj)) && Aig_ObjFaninC1(pObj)) || (Saig_ObjCexMinGet1(Aig_ObjFanin1(pObj)) && !Aig_ObjFaninC1(pObj)); }
602static inline void Saig_ObjCexMinSim(
Aig_Obj_t * pObj )
604 if ( Aig_ObjIsAnd(pObj) )
606 if ( Saig_ObjCexMinGet0Fanin0(pObj) || Saig_ObjCexMinGet0Fanin1(pObj) )
607 Saig_ObjCexMinSet0( pObj );
608 else if ( Saig_ObjCexMinGet1Fanin0(pObj) && Saig_ObjCexMinGet1Fanin1(pObj) )
609 Saig_ObjCexMinSet1( pObj );
611 Saig_ObjCexMinSetX( pObj );
613 else if ( Aig_ObjIsCo(pObj) )
615 if ( Saig_ObjCexMinGet0Fanin0(pObj) )
616 Saig_ObjCexMinSet0( pObj );
617 else if ( Saig_ObjCexMinGet1Fanin0(pObj) )
618 Saig_ObjCexMinSet1( pObj );
620 Saig_ObjCexMinSetX( pObj );
625static inline void Saig_ObjCexMinPrint(
Aig_Obj_t * pObj )
627 if ( Saig_ObjCexMinGet0(pObj) )
629 else if ( Saig_ObjCexMinGet1(pObj) )
631 else if ( Saig_ObjCexMinGetX(pObj) )
651 assert( pCex->iFrame == pCare->iFrame );
652 assert( pCex->nBits == pCare->nBits );
653 assert( pCex->iPo < Saig_ManPoNum(pAig) );
654 Saig_ObjCexMinSet1( Aig_ManConst1(pAig) );
658 assert( !Abc_InfoHasBit(pCex->pData, iBit) );
659 assert( !Abc_InfoHasBit(pCare->pData, iBit) );
661 Saig_ObjCexMinSet0( pObj );
666 for ( f = 0; f <= pCex->iFrame; f++ )
671 if ( Abc_InfoHasBit(pCare->pData, iBit++) )
673 if ( Abc_InfoHasBit(pCex->pData, iBit-1) )
674 Saig_ObjCexMinSet1( pObj );
676 Saig_ObjCexMinSet0( pObj );
679 Saig_ObjCexMinSetX( pObj );
683 Saig_ObjCexMinSim( pObj );
686 Saig_ObjCexMinSim( pObj );
701 assert( iBit == pCex->nBits );
702 return Saig_ObjCexMinGet1( Aig_ManCo( pAig, pCex->iPo ) );
742 printf(
"Frame PIs = %4d (essential = %4d) AIG PIs = %4d (essential = %4d) ",
743 Aig_ManCiNum(
p->pFrames), Vec_IntSize(vReasons),
744 Saig_ManPiNum(
p->pAig) -
p->nInputs, Vec_IntSize(vRes) );
746ABC_PRT(
"Time", Abc_Clock() - clk );
750 Vec_IntFree( vReasons );
790 if ( Saig_ManPiNum(pAig) != pCex->nPis )
792 printf(
"Saig_ManCbaFilterInputs(): The PI count of AIG (%d) does not match that of cex (%d).\n",
793 Aig_ManCiNum(pAig), pCex->nPis );
804 printf(
"Frame PIs = %4d (essential = %4d) AIG PIs = %4d (essential = %4d) ",
805 Aig_ManCiNum(
p->pFrames), Vec_IntSize(vReasons),
806 Saig_ManPiNum(
p->pAig) -
p->nInputs, Vec_IntSize(vRes) );
807ABC_PRT(
"Time", Abc_Clock() - clk );
810 Vec_IntFree( vReasons );
838 if ( RetValue == -1 )
840 printf(
"Resource limit is reached during BMC.\n" );
841 assert( pAbs->pSeqModel == NULL );
842 return Vec_IntAlloc( 0 );
844 if ( pAbs->pSeqModel == NULL )
846 printf(
"BMC did not detect a CEX with the given depth.\n" );
847 return Vec_IntAlloc( 0 );
853 if ( Vec_IntSize(vAbsFfsToAdd) == 0 )
855 Vec_IntFree( vAbsFfsToAdd );
860 printf(
"Adding %d registers to the abstraction (total = %d). ",
861 Vec_IntSize(vAbsFfsToAdd), Aig_ManRegNum(pAbs)+Vec_IntSize(vAbsFfsToAdd) );
862 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
int * Abc_MergeSortCost(int *pCosts, int nSize)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Saig_ManCbaUnrollCollect_rec(Aig_Man_t *pAig, Aig_Obj_t *pObj, Vec_Int_t *vObjs, Vec_Int_t *vRoots)
Aig_Man_t * Saig_ManCbaUnrollWithCex(Aig_Man_t *pAig, Abc_Cex_t *pCex, int nInputs, Vec_Int_t **pvMapPiF2A, Vec_Vec_t **pvReg2Frame)
Vec_Int_t * Saig_ManCbaReason2Inputs(Saig_ManCba_t *p, Vec_Int_t *vReasons)
Vec_Int_t * Saig_ManCbaPerform(Aig_Man_t *pAbs, int nInputs, Saig_ParBmc_t *pPars)
void Saig_ManCbaStop(Saig_ManCba_t *p)
Abc_Cex_t * Saig_ManCbaReason2Cex(Saig_ManCba_t *p, Vec_Int_t *vReasons)
Aig_Man_t * Saig_ManDupWithCubes(Aig_Man_t *pAig, Vec_Vec_t *vReg2Value)
Saig_ManCba_t * Saig_ManCbaStart(Aig_Man_t *pAig, Abc_Cex_t *pCex, int nInputs, int fVerbose)
int Saig_ManCexVerifyUsingTernary(Aig_Man_t *pAig, Abc_Cex_t *pCex, Abc_Cex_t *pCare)
void Saig_ManCbaFindReason_rec(Aig_Man_t *p, Aig_Obj_t *pObj, Vec_Int_t *vPrios, Vec_Int_t *vReasons)
void Saig_ManCbaShrink(Saig_ManCba_t *p)
Vec_Int_t * Saig_ManCbaFindReason(Saig_ManCba_t *p)
typedefABC_NAMESPACE_IMPL_START struct Saig_ManCba_t_ Saig_ManCba_t
DECLARATIONS ///.
Abc_Cex_t * Saig_ManCbaFindCexCareBits(Aig_Man_t *pAig, Abc_Cex_t *pCex, int nInputs, int fVerbose)
Vec_Int_t * Saig_ManCbaFilterInputs(Aig_Man_t *pAig, int iFirstFlopPi, Abc_Cex_t *pCex, int fVerbose)
Vec_Int_t * Saig_ManCbaFilterFlops(Aig_Man_t *pAig, Abc_Cex_t *pAbsCex, Vec_Int_t *vFlopClasses, Vec_Int_t *vAbsFfsToAdd, int nFfsToSelect)
FUNCTION DEFINITIONS ///.
void Aig_ManCleanMarkB(Aig_Man_t *p)
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
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)
void Aig_ManStopP(Aig_Man_t **p)
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)
void Aig_ManCleanMarkAB(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 ///.
int Saig_ManBmcScalable(Aig_Man_t *pAig, Saig_ParBmc_t *pPars)
struct Saig_ParBmc_t_ Saig_ParBmc_t
#define Saig_ManForEachLiLo(p, pObjLi, pObjLo, i)
#define Saig_ManForEachLi(p, pObj, i)
#define Saig_ManForEachLo(p, pObj, i)
#define Saig_ManForEachPi(p, pObj, i)
Abc_Cex_t * Abc_CexDup(Abc_Cex_t *p, int nRegsNew)
void Abc_CexPrintStats(Abc_Cex_t *p)
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
#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 ///.