51 int RetValue, i, k, iBit = 0;
54 pObj->
fMark0 = Abc_InfoHasBit(
p->pData, iBit++);
55 for ( i = 0; i <=
p->iFrame; i++ )
58 pObj->
fMark0 = Abc_InfoHasBit(
p->pData, iBit++);
60 pObj->
fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) &
61 (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj));
63 pObj->
fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
73 RetValue = Gia_ManPo(pAig, 2*
p->iPo)->fMark0 ^ Gia_ManPo(pAig, 2*
p->iPo+1)->fMark0;
75 RetValue = Gia_ManPo(pAig,
p->iPo)->fMark0;
94 int RetValue, i, k, iBit = 0;
95 assert( Gia_ManPiNum(pAig) ==
p->nPis );
98 pObj->
fMark0 = Abc_InfoHasBit(
p->pData, iBit++);
100 for ( i = 0; i <=
p->iFrame; i++ )
103 pObj->
fMark0 = Abc_InfoHasBit(
p->pData, iBit++);
105 pObj->
fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) &
106 (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj));
108 pObj->
fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
116 for ( i = nOutputs; i < Gia_ManPoNum(pAig); i++ )
118 if ( Gia_ManPo(pAig, i)->fMark0 )
143 assert( Gia_ManPiNum(pAig) ==
p->nPis );
149 for ( i = 0; i <=
p->iFrame; i++ )
152 pObj->
fMark0 = Abc_InfoHasBit(
p->pData, iBit++);
154 pObj->
fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) &
155 (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj));
157 pObj->
fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
191 int Val0, Val1, nObjs, i, k, iBit = 0;
192 assert( Gia_ManRegNum(pGia) > 0 );
195 pGia->
pData2 =
ABC_CALLOC(
unsigned, Abc_BitWordNum( (pCex->iFrame + 1) * Gia_ManObjNum(pGia) ) );
198 assert( Abc_InfoHasBit(pCex->pData, iBit) == 0 ), iBit++;
200 nObjs = Gia_ManObjNum(pGia);
201 for ( i = 0; i <= pCex->iFrame; i++ )
206 if ( Abc_InfoHasBit(pCex->pData, iBit++) )
207 Abc_InfoSetBit( (
unsigned *)pGia->
pData2, nObjs * i + Gia_ObjId(pGia, pObj) );
211 Val0 = Abc_InfoHasBit( (
unsigned *)pGia->
pData2, nObjs * i + Gia_ObjFaninId0p(pGia, pObj) );
212 Val1 = Abc_InfoHasBit( (
unsigned *)pGia->
pData2, nObjs * i + Gia_ObjFaninId1p(pGia, pObj) );
213 if ( (Val0 ^ Gia_ObjFaninC0(pObj)) & (Val1 ^ Gia_ObjFaninC1(pObj)) )
214 Abc_InfoSetBit( (
unsigned *)pGia->
pData2, nObjs * i + Gia_ObjId(pGia, pObj) );
219 Val0 = Abc_InfoHasBit( (
unsigned *)pGia->
pData2, nObjs * i + Gia_ObjFaninId0p(pGia, pObj) );
220 if ( Val0 ^ Gia_ObjFaninC0(pObj) )
221 Abc_InfoSetBit( (
unsigned *)pGia->
pData2, nObjs * i + Gia_ObjId(pGia, pObj) );
223 if ( i == pCex->iFrame )
227 if ( Abc_InfoHasBit( (
unsigned *)pGia->
pData2, nObjs * i + Gia_ObjId(pGia, pObjRi) ) )
228 Abc_InfoSetBit( (
unsigned *)pGia->
pData2, nObjs * (i+1) + Gia_ObjId(pGia, pObjRo) );
230 assert( iBit == pCex->nBits );
232 assert( Abc_InfoHasBit( (
unsigned *)pGia->
pData2, nObjs * pCex->iFrame + Gia_ObjId(pGia, Gia_ManCo(pGia, pCex->iPo)) ) );
268 assert( Id >= 0 && Id < Gia_ManObjNum(pGia) );
269 return Abc_InfoHasBit( (
unsigned *)pGia->
pData2, Gia_ManObjNum(pGia) * iFrame + Id );
285 Gia_Obj_t * pObj = Gia_ManObj( pGia, Gia_ManObjNum(pGia)/2 );
286 int iFrame = Abc_MaxInt( 0, pCex->iFrame - 1 );
287 printf(
"\nUsing counter-example, which asserts output %d in frame %d.\n", pCex->iPo, pCex->iFrame );
289 printf(
"Value of object %d in frame %d is %d.\n", Gia_ObjId(pGia, pObj), iFrame,
311 assert( pCex->nRegs > 0 );
314 pNew->iFrame = pCex->iFrame;
315 pNew->iPo = pCex->iPo;
317 Gia_ManConst0(
p)->fMark0 = 0;
320 pObjRi->
fMark0 = Abc_InfoHasBit(pCex->pData, iBit++);
321 assert( iBit == pCex->nRegs );
322 for ( i = 0; i <= pCex->iFrame; i++ )
325 pObj->
fMark0 = Abc_InfoHasBit(pCex->pData, iBit++);
330 Abc_InfoSetBit( pNew->pData, pNew->nPis * i + k );
332 pObj->
fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) & (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj));
334 pObj->
fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
336 assert( iBit == pCex->nBits );
337 assert( Gia_ManPo(
p, pCex->iPo)->fMark0 == 1 );
358 assert( pCex->nRegs > 0 );
360 pNew =
Abc_CexAlloc( 0, Gia_ManObjNum(
p), pCex->iFrame + 1 );
361 pNew->iFrame = pCex->iFrame;
362 pNew->iPo = pCex->iPo;
364 Gia_ManConst0(
p)->fMark0 = 0;
367 pObjRi->
fMark0 = Abc_InfoHasBit(pCex->pData, iBit++);
368 assert( iBit == pCex->nRegs );
369 for ( i = 0; i <= pCex->iFrame; i++ )
372 pObj->
fMark0 = Abc_InfoHasBit(pCex->pData, iBit++);
377 Abc_InfoSetBit( pNew->pData, pNew->nPis * i + k );
379 pObj->
fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) & (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj));
381 pObj->
fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
383 assert( iBit == pCex->nBits );
384 assert( Gia_ManPo(
p, pCex->iPo)->fMark0 == 1 );
405 assert( Gia_ManPoNum(
p) == 1 );
407 pFrames->
pName = Abc_UtilStrsav(
p->pName );
408 pFrames->
pSpec = Abc_UtilStrsav(
p->pSpec );
410 Gia_ManConst0(
p)->Value = 0;
411 for ( f = 0; f < nFrames; f++ )
414 pObj->
Value = f ? Gia_ObjRoToRi(
p, pObj )->Value : 0;
416 pObj->
Value = Gia_ManAppendCi( pFrames );
420 pObj->
Value = Gia_ObjFanin0Copy(pObj);
423 Gia_ManAppendCo( pFrames, Gia_ObjFanin0Copy(pObj) );
445 int n, i, iFirstVar, iLit, status, Counter = 0;
449 int nFinal, * pFinal;
456 for ( i = pCexCare->nRegs; i < pCexCare->nBits; i++ )
457 Counter += Abc_InfoHasBit(pCexCare->pData, i);
459 printf(
"Care bits = %d. ", Counter );
460 Abc_PrintTime( 1,
"CEX minimization", Abc_Clock() - clk );
466 iFirstVar = pCnf->
nVars - (pCex->iFrame+1) * pCex->nPis;
468 iLit = Abc_Var2Lit( 1, 1 );
472 vLits = Vec_IntAlloc( 100 );
473 for ( i = pCex->nRegs; i < pCex->nBits; i++ )
474 Vec_IntPush( vLits, Abc_Var2Lit(iFirstVar + i - pCex->nRegs, !Abc_InfoHasBit(pCex->pData, i)) );
475 Abc_PrintTime( 1,
"SAT solver", Abc_Clock() - clk );
477 for ( n = 0; n < 2; n++ )
479 if ( n ) Vec_IntReverseOrder( vLits );
483 status =
sat_solver_solve( pSat, Vec_IntArray(vLits), Vec_IntLimit(vLits), 0, 0, 0, 0 );
484 nFinal = sat_solver_final( pSat, &pFinal );
485 printf(
"Status %d. Selected %d assumptions out of %d. ", status, nFinal, Vec_IntSize(vLits) );
486 Abc_PrintTime( 1,
"Analyze_final", Abc_Clock() - clk );
491 printf(
"Status %d. Selected %d assumptions out of %d. ", status, nFinal, Vec_IntSize(vLits) );
492 Abc_PrintTime( 1,
"LEXUNSAT", Abc_Clock() - clk );
496 Vec_IntFree( vLits );
506 pCexMin =
Abc_CexAlloc( pCex->nRegs, pCex->nPis, pCex->iFrame + 1 );
507 pCexMin->iPo = pCex->iPo;
508 pCexMin->iFrame = pCex->iFrame;
509 for ( i = 0; i < nLits; i++ )
511 int PiNum = Abc_Lit2Var(pLits[i]) - iFirstVar;
512 assert( PiNum >= 0 && PiNum < pCex->nBits - pCex->nRegs );
513 Abc_InfoSetBit( pCexMin->pData, pCexMin->nRegs + PiNum );
520 int n, i, iFirstVar, iLit, status;
524 int nFinal, * pFinal;
532 for ( i = pCexBest->nRegs; i < pCexBest->nBits; i++ )
533 CountBest += Abc_InfoHasBit(pCexBest->pData, i);
536 printf(
"Care bits = %d. ", CountBest );
537 Abc_PrintTime( 1,
"Non-SAT-based CEX minimization", Abc_Clock() - clk );
544 iFirstVar = pCnf->
nVars - (pCex->iFrame+1) * pCex->nPis;
546 iLit = Abc_Var2Lit( 1, 1 );
550 vTemp = Vec_IntAlloc( 100 );
551 for ( i = pCex->nRegs; i < pCex->nBits; i++ )
552 Vec_IntPush( vTemp, Abc_Var2Lit(iFirstVar + i - pCex->nRegs, !Abc_InfoHasBit(pCex->pData, i)) );
554 Abc_PrintTime( 1,
"Constructing SAT solver", Abc_Clock() - clk );
556 for ( n = 0; n < 2; n++ )
558 Vec_IntFreeP( &vLits );
560 vLits = Vec_IntDup( vTemp );
561 if ( n ) Vec_IntReverseOrder( vLits );
565 status =
sat_solver_solve( pSat, Vec_IntArray(vLits), Vec_IntLimit(vLits), 0, 0, 0, 0 );
566 nFinal = sat_solver_final( pSat, &pFinal );
569 printf(
"Status %s Selected %5d assumptions out of %5d. ", status ==
l_False ?
"OK ":
"BUG", nFinal, Vec_IntSize(vLits) );
570 Abc_PrintTime( 1,
"Analyze_final", Abc_Clock() - clk );
572 if ( CountBest > nFinal )
586 printf(
"Status %s Selected %5d assumptions out of %5d. ", status ==
l_False ?
"OK ":
"BUG", nFinal, Vec_IntSize(vLits) );
587 Abc_PrintTime( 1,
"LEXUNSAT ", Abc_Clock() - clk );
589 if ( CountBest > nFinal )
598 printf(
"Final : " );
602 Vec_IntFreeP( &vLits );
603 Vec_IntFreeP( &vTemp );
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Bmc_CexPrint(Abc_Cex_t *pCex, int nRealPis, int fVerbose)
Abc_Cex_t * Bmc_CexCareMinimizeAig(Gia_Man_t *p, int nRealPis, Abc_Cex_t *pCex, int nTryCexes, int fCheck, int fVerbose)
#define sat_solver_addclause
struct Cnf_Dat_t_ Cnf_Dat_t
void Cnf_DataFree(Cnf_Dat_t *p)
int Gia_ManFindFailedPoCex(Gia_Man_t *pAig, Abc_Cex_t *p, int nOutputs)
void Gia_ManMinCex(Gia_Man_t *p, Abc_Cex_t *pCex)
void Gia_ManCounterExampleValueStop(Gia_Man_t *pGia)
int Gia_ManCounterExampleValueLookup(Gia_Man_t *pGia, int Id, int iFrame)
Gia_Man_t * Gia_ManFramesForCexMin(Gia_Man_t *p, int nFrames)
Abc_Cex_t * Gia_ManCexExtendToIncludeAllObjects(Gia_Man_t *p, Abc_Cex_t *pCex)
Abc_Cex_t * Gia_ManCexExtendToIncludeCurrentStates(Gia_Man_t *p, Abc_Cex_t *pCex)
void Gia_ManCounterExampleValueStart(Gia_Man_t *pGia, Abc_Cex_t *pCex)
void Gia_ManCounterExampleValueTest(Gia_Man_t *pGia, Abc_Cex_t *pCex)
Abc_Cex_t * Bmc_CexCareDeriveCex(Abc_Cex_t *pCex, int iFirstVar, int *pLits, int nLits)
ABC_NAMESPACE_IMPL_START int Gia_ManVerifyCex(Gia_Man_t *pAig, Abc_Cex_t *p, int fDualOut)
DECLARATIONS ///.
int Gia_ManSetFailedPoCex(Gia_Man_t *pAig, Abc_Cex_t *p)
Abc_Cex_t * Bmc_CexCareSatBasedMinimizeAig(Gia_Man_t *p, Abc_Cex_t *pCex, int fHighEffort, int fVerbose)
void Gia_ManStop(Gia_Man_t *p)
#define Gia_ManForEachRo(p, pObj, i)
#define Gia_ManForEachPo(p, pObj, i)
#define Gia_ManForEachAnd(p, pObj, i)
void Gia_ManHashAlloc(Gia_Man_t *p)
#define Gia_ManForEachPi(p, pObj, i)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
void Gia_ManCleanMark0(Gia_Man_t *p)
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
#define Gia_ManForEachRiRo(p, pObjRi, pObjRo, i)
#define Gia_ManForEachRi(p, pObj, i)
void * Mf_ManGenerateCnf(Gia_Man_t *pGia, int nLutSize, int fCnfObjIds, int fAddOrCla, int fMapping, int fVerbose)
void * Cnf_DataWriteIntoSolver(Cnf_Dat_t *p, int nFrames, int fInit)
void sat_solver_delete(sat_solver *s)
int sat_solver_minimize_assumptions(sat_solver *s, int *pLits, int nLits, int nConfLimit)
void Abc_CexFree(Abc_Cex_t *p)
ABC_NAMESPACE_IMPL_START Abc_Cex_t * Abc_CexAlloc(int nRegs, int nRealPis, int nFrames)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.