30static inline word Bmc_CexBitMask(
int iBit ) {
assert( iBit < 64 );
return ~(((
word)1) << iBit); }
31static inline void Bmc_CexCopySim(
Vec_Wrd_t * vSims,
int iObjTo,
int iObjFrom ) { Vec_WrdWriteEntry( vSims, iObjTo, iObjFrom ); }
32static inline void Bmc_CexAndSim(
Vec_Wrd_t * vSims,
int iObjTo,
int i,
int j ) { Vec_WrdWriteEntry( vSims, iObjTo, Vec_WrdEntry(vSims, i) & Vec_WrdEntry(vSims, j) ); }
33static inline void Bmc_CexOrSim(
Vec_Wrd_t * vSims,
int iObjTo,
int i,
int j ) { Vec_WrdWriteEntry( vSims, iObjTo, Vec_WrdEntry(vSims, i) | Vec_WrdEntry(vSims, j) ); }
34static inline int Bmc_CexSim(
Vec_Wrd_t * vSims,
int iObj,
int i ) {
return (Vec_WrdEntry(vSims, iObj) >> i) & 1; }
53 int k, Counter = 0, Counter2 = 0;
56 printf(
"The counter example is NULL.\n" );
59 for ( k = 0; k <
p->nBits; k++ )
61 Counter += Abc_InfoHasBit(
p->pData, k);
62 if ( (k -
p->nRegs) %
p->nPis < nInputs )
63 Counter2 += Abc_InfoHasBit(
p->pData, k);
80 int nInputs = Gia_ManPiNum(
p);
81 int nBitsTotal = (pCex->iFrame + 1) * nInputs;
83 int nBitsDC = nBitsTotal - nBitsCare;
85 int nBitsOpt = nBitsCare - nBitsEss;
88 FILE * pTable = fopen(
"cex/stats.txt",
"a+" );
89 fprintf( pTable,
"%s ",
p->pName );
90 fprintf( pTable,
"%d ", nInputs );
91 fprintf( pTable,
"%d ", Gia_ManRegNum(
p) );
92 fprintf( pTable,
"%d ", pCex->iFrame + 1 );
93 fprintf( pTable,
"%d ", nBitsTotal );
94 fprintf( pTable,
"%.2f ", 100.0 * nBitsDC / nBitsTotal );
95 fprintf( pTable,
"%.2f ", 100.0 * nBitsOpt / nBitsTotal );
96 fprintf( pTable,
"%.2f ", 100.0 * nBitsEss / nBitsTotal );
97 fprintf( pTable,
"%.2f ", 100.0 * nBitsMin / nBitsTotal );
98 fprintf( pTable,
"%.2f ", 1.0*clk/(CLOCKS_PER_SEC) );
99 fprintf( pTable,
"\n" );
117 FILE * pTable = fopen(
"cex/aig_stats.txt",
"a+" );
118 fprintf( pTable,
"%s ",
p->pName );
119 fprintf( pTable,
"%d ", Gia_ManPiNum(
p) );
120 fprintf( pTable,
"%d ", Gia_ManAndNum(
p) );
122 fprintf( pTable,
"%.2f ", 1.0*clk/(CLOCKS_PER_SEC) );
123 fprintf( pTable,
"\n" );
143 assert( Gia_ManRegNum(
p) > 0 );
144 pNew =
Gia_ManStart( (pCex->iFrame + 1) * Gia_ManObjNum(
p) );
145 pNew->
pName = Abc_UtilStrsav(
p->pName );
146 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
147 Gia_ManConst0(
p)->Value = 0;
151 for ( i = 0; i <= pCex->iFrame; i++ )
154 pObj->
Value = Gia_ManAppendCi( pNew );
160 pObj->
Value = Gia_ObjFanin0Copy(pObj);
163 pObj = Gia_ManPo(
p, pCex->iPo);
164 Gia_ManAppendCo( pNew, pObj->
Value );
179 printf(
"CE-induced network is written into file \"unroll.aig\".\n" );
180 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
199 int fCompl0, fCompl1;
200 int i, k, iBit = pCex->nRegs;
203 pNew->
pName = Abc_UtilStrsav(
"unate" );
205 Gia_ManConst0(
p)->fMark0 = 0;
206 Gia_ManConst0(
p)->fMark1 = 1;
207 Gia_ManConst0(
p)->Value = ~0;
216 for ( i = 0; i <= pCex->iFrame; i++ )
221 pObj->
fMark0 = Abc_InfoHasBit( pCex->pData, iBit++ );
223 pObj->
Value = Gia_ManAppendCi(pNew);
235 fCompl0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
236 fCompl1 = Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj);
237 pObj->
fMark0 = fCompl0 & fCompl1;
239 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1 & Gia_ObjFanin1(pObj)->fMark1;
240 else if ( !fCompl0 && !fCompl1 )
241 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1 | Gia_ObjFanin1(pObj)->fMark1;
243 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1;
245 pObj->
fMark1 = Gia_ObjFanin1(pObj)->fMark1;
251 pObj->
Value =
Gia_ManHashAnd( pNew, Gia_ObjFanin0(pObj)->Value, Gia_ObjFanin1(pObj)->Value );
252 else if ( !fCompl0 && !fCompl1 )
253 pObj->
Value =
Gia_ManHashOr( pNew, Gia_ObjFanin0(pObj)->Value, Gia_ObjFanin1(pObj)->Value );
255 pObj->
Value = Gia_ObjFanin0(pObj)->Value;
257 pObj->
Value = Gia_ObjFanin1(pObj)->Value;
264 pObj->
fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
265 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1;
266 pObj->
Value = Gia_ObjFanin0(pObj)->Value;
270 assert( iBit == pCex->nBits );
272 pObj = Gia_ManPo(
p, pCex->iPo);
276 Gia_ManAppendCo( pNew, pObj->
Value );
291 printf(
"CE-induced network is written into file \"unate.aig\".\n" );
292 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
309 int i, k, Count, iBit = pCex->nRegs;
314 for ( i = 0; i <= pCex->iFrame; i++ )
317 printf(
"%3d : ", i );
318 for ( k = 0; k < nRealPis; k++ )
320 Count += Abc_InfoHasBit(pCex->pData, iBit);
321 printf(
"%d", Abc_InfoHasBit(pCex->pData, iBit++) );
323 printf(
" %3d ", Count );
325 for ( ; k < pCex->nPis; k++ )
327 Count += Abc_InfoHasBit(pCex->pData, iBit);
328 printf(
"%d", Abc_InfoHasBit(pCex->pData, iBit++) );
330 printf(
" %3d\n", Count );
332 assert( iBit == pCex->nBits );
352 Gia_ObjTerSimSet0( Gia_ManConst0(
p) );
354 Gia_ObjTerSimSet0( pObj );
355 for ( i = 0; i <= pCex->iFrame; i++ )
359 if ( !Abc_InfoHasBit( pCexCare->pData, pCexCare->nRegs + i * pCexCare->nPis + k ) )
360 Gia_ObjTerSimSetX( pObj );
361 else if ( Abc_InfoHasBit( pCex->pData, pCex->nRegs + i * pCex->nPis + k ) )
362 Gia_ObjTerSimSet1( pObj );
364 Gia_ObjTerSimSet0( pObj );
367 Gia_ObjTerSimRo(
p, pObj );
369 Gia_ObjTerSimAnd( pObj );
371 Gia_ObjTerSimCo( pObj );
373 pObj = Gia_ManPo(
p, pCex->iPo );
374 return Gia_ObjTerSimGet1(pObj);
394 Gia_ObjTerSimSet0( Gia_ManConst0(
p) );
396 Gia_ObjTerSimSet0( pObj );
397 for ( i = 0; i <= pCex->iFrame; i++ )
401 if ( !Abc_InfoHasBit( pCexCare->pData, pCexCare->nRegs + i * pCexCare->nPis + k ) )
402 Gia_ObjTerSimSetX( pObj );
403 else if ( Abc_InfoHasBit( pCex->pData, pCex->nRegs + i * pCex->nPis + k ) )
404 Gia_ObjTerSimSet1( pObj );
406 Gia_ObjTerSimSet0( pObj );
409 Gia_ObjTerSimRo(
p, pObj );
411 Gia_ObjTerSimAnd( pObj );
413 Gia_ObjTerSimCo( pObj );
415 for (i = 0; i < Gia_ManPoNum(
p) - Gia_ManConstrNum(
p); i++)
417 pObj = Gia_ManPo(
p, i );
418 if (Gia_ObjTerSimGet1(pObj))
439 int fCompl0, fCompl1;
441 assert( pCex->nRegs > 0 );
444 pNew->iFrame = pCex->iFrame;
445 pNew->iPo = pCex->iPo;
447 pNew2 =
Abc_CexAlloc( 0, Gia_ManCiNum(
p), pCex->iFrame + 1 );
448 pNew2->iFrame = pCex->iFrame;
449 pNew2->iPo = pCex->iPo;
453 Gia_ManConst0(
p)->fMark0 = 0;
454 Gia_ManConst0(
p)->fMark1 = 1;
462 for ( i = 0; i <= pCex->iFrame; i++ )
465 pObj->
fMark0 = Abc_InfoHasBit(pCex->pData, iBit++);
474 Abc_InfoSetBit( pNew->pData, pNew->nPis * i + k );
476 Abc_InfoSetBit( pNew2->pData, pNew2->nPis * i + k );
480 fCompl0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
481 fCompl1 = Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj);
482 pObj->
fMark0 = fCompl0 & fCompl1;
484 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1 & Gia_ObjFanin1(pObj)->fMark1;
485 else if ( !fCompl0 && !fCompl1 )
486 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1 | Gia_ObjFanin1(pObj)->fMark1;
488 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1;
490 pObj->
fMark1 = Gia_ObjFanin1(pObj)->fMark1;
495 pObj->
fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
496 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1;
513 assert( iBit == pCex->nBits );
514 assert( Gia_ManPo(
p, pCex->iPo)->fMark0 == 1 );
516 printf(
"Inner states: " );
518 printf(
"Implications: " );
540 int fCompl0, fCompl1;
541 if ( Gia_ObjIsConst0(pObj) )
546 if ( Gia_ObjIsCi(pObj) )
548 assert( Gia_ObjIsAnd(pObj) );
549 fCompl0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
550 fCompl1 = Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj);
553 assert( fCompl0 == 1 && fCompl1 == 1 );
559 assert( fCompl0 == 0 || fCompl1 == 0 );
568 int fCompl0, fCompl1;
569 if ( Gia_ObjIsConst0(pObj) )
574 if ( Gia_ObjIsCi(pObj) )
576 assert( Gia_ObjIsAnd(pObj) );
577 fCompl0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
578 fCompl1 = Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj);
581 assert( fCompl0 == 1 && fCompl1 == 1 );
587 assert( fCompl0 == 0 || fCompl1 == 0 );
601 int fCompl0, fCompl1;
603 assert( pCexState->nRegs == 0 );
605 pNew =
Abc_CexAlloc( 0, Gia_ManCiNum(
p), pCexState->iFrame + 1 );
606 pNew->iFrame = pCexState->iFrame;
607 pNew->iPo = pCexState->iPo;
611 Gia_ManConst0(
p)->fMark0 = 0;
612 Gia_ManConst0(
p)->fMark1 = 1;
613 for ( i = pCexState->iFrame; i >= 0; i-- )
616 iBit = pCexState->nPis * i;
619 pObj->
fMark0 = Abc_InfoHasBit(pCexState->pData, iBit+k);
622 pObj->
fMark1 |= Abc_InfoHasBit(pCexImpl->pData, iBit+k);
624 pObj->
fMark1 |= Abc_InfoHasBit(pCexEss->pData, iBit+k);
628 fCompl0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
629 fCompl1 = Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj);
630 pObj->
fMark0 = fCompl0 & fCompl1;
632 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1 & Gia_ObjFanin1(pObj)->fMark1;
633 else if ( !fCompl0 && !fCompl1 )
634 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1 | Gia_ObjFanin1(pObj)->fMark1;
636 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1;
638 pObj->
fMark1 = Gia_ObjFanin1(pObj)->fMark1;
642 pObj->
fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
644 if ( i == pCexState->iFrame )
646 assert( Gia_ManPo(
p, pCexState->iPo)->fMark0 == 1 );
655 if ( Abc_InfoHasBit(pNew->pData, pNew->nPis * (i+1) + Gia_ManPiNum(
p) + k) )
668 if ( pCexImpl == NULL || !Abc_InfoHasBit(pCexImpl->pData, pNew->nPis * i + k) )
669 Abc_InfoSetBit(pNew->pData, pNew->nPis * i + k);
673 printf(
"Minimized: " );
675 printf(
"Care bits: " );
695 int i, k, fCompl0, fCompl1;
696 assert( pCexState->nRegs == 0 );
697 assert( iBit < pCexState->nBits );
702 pNew->iFrame = pCexState->iFrame;
703 pNew->iPo = pCexState->iPo;
705 Abc_InfoXorBit( pNew->pData, iBit );
707 Gia_ManConst0(
p)->fMark0 = 0;
708 Gia_ManConst0(
p)->fMark1 = 1;
709 for ( i = iBit / pCexState->nPis; i <= pCexState->iFrame; i++ )
713 pObj->
fMark0 = Abc_InfoHasBit( pCexState->pData, i * pCexState->nPis + k );
714 pObj->
fMark1 = Abc_InfoHasBit( pNew->pData, i * pCexState->nPis + k );
718 fCompl0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
719 fCompl1 = Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj);
720 pObj->
fMark0 = fCompl0 & fCompl1;
722 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1 & Gia_ObjFanin1(pObj)->fMark1;
723 else if ( !fCompl0 && !fCompl1 )
724 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1 | Gia_ObjFanin1(pObj)->fMark1;
726 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1;
728 pObj->
fMark1 = Gia_ObjFanin1(pObj)->fMark1;
733 pObj->
fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
734 pObj->
fMark1 = Gia_ObjFanin0(pObj)->fMark1;
736 if ( i < pCexState->iFrame )
739 int fEqual = (pCexPrev != NULL);
740 int iBitShift = (i + 1) * pCexState->nPis + Gia_ManPiNum(
p);
743 if ( fEqual && pCexPrev && (
int)pObj->
fMark1 != Abc_InfoHasBit(pCexPrev->pData, iBitShift + k) )
748 Abc_InfoXorBit( pNew->pData, iBitShift + k );
751 if ( !fChanges || fEqual )
775 for ( b = 0; b < pCexState->nBits; b++ )
782 if ( Gia_ManPo(
p, pCexState->iPo)->fMark1 )
783 printf(
"Not essential\n" );
785 printf(
"Essential\n" );
804 Abc_Cex_t * pNew, * pTemp, * pPrev = NULL;
805 int b, fEqual = 0, fPrevStatus = 0;
807 assert( pCexState->nBits == pCexCare->nBits );
809 pNew =
Abc_CexAlloc( 0, Gia_ManCiNum(
p), pCexState->iFrame + 1 );
810 pNew->iFrame = pCexState->iFrame;
811 pNew->iPo = pCexState->iPo;
813 for ( b = 0; b < pCexState->nBits; b++ )
816 if ( !Abc_InfoHasBit(pCexCare->pData, b) )
820 if ( b % pCexCare->nPis >= Gia_ManPiNum(
p) )
822 Abc_InfoSetBit( pNew->pData, b );
831 if ( fEqual && fPrevStatus )
832 Abc_InfoSetBit( pNew->pData, b );
840 fPrevStatus = !Gia_ManPo(
p, pCexState->iPo)->fMark1;
841 if ( !Gia_ManPo(
p, pCexState->iPo)->fMark1 )
842 Abc_InfoSetBit( pNew->pData, b );
846 printf(
"Essentials: " );
872 printf(
"Counter-example care-set verification has failed.\n" );
878 printf(
"Counter-example min-set verification has failed.\n" );
888 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
909 int i, k, fCompl0, fCompl1;
915 assert( Vec_IntSize(vPat) == Gia_ManCiNum(
p) );
918 Gia_ManConst0(
p)->fMark0 = 0;
919 Gia_ManConst0(
p)->fMark1 = 0;
922 pObj->
fMark0 = Vec_IntEntry(vPat, k);
927 fCompl0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
928 fCompl1 = Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj);
929 pObj->
fMark0 = fCompl0 & fCompl1;
934 pObj->
fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
935 Gia_ObjFanin0(pObj)->fMark1 = 1;
944 fCompl0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
945 fCompl1 = Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj);
946 assert( fCompl0 == 0 || fCompl1 == 0 );
948 Gia_ObjFanin1(pObj)->fMark1 = 1;
949 else if ( fCompl0 == 0 )
950 Gia_ObjFanin0(pObj)->fMark1 = 1;
955 Gia_ObjFanin0(pObj)->fMark1 = 1;
956 Gia_ObjFanin1(pObj)->fMark1 = 1;
965 Counter /= Vec_WecSize(vPats);
966 printf(
"Stats over %d patterns: Average care-nodes = %d (%6.2f %%)\n", Vec_WecSize(vPats), (
int)Counter, 100.0*(
int)Counter/Gia_ManAndNum(
p) );
971 int Size = 60000 * 28 * 28 + 16;
972 unsigned char * pData = (
unsigned char *)
malloc( Size );
973 FILE * pFile = fopen(
"train-images.idx3-ubyte",
"rb" );
974 int RetValue = fread( pData, 1, Size, pFile );
975 assert( RetValue == Size );
981 Vec_Wec_t * vPats = Vec_WecStart( nPats );
984 for ( i = 0; i < nPats; i++ )
985 for ( x = 0; x < 784; x++ )
986 for ( k = 0; k < 8; k++ )
987 Vec_WecPush( vPats, i, (pL1[16 + i * 784 + x] >> k) & 1 );
995 Vec_WecFree( vPats );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Gia_ManStop(Gia_Man_t *p)
#define Gia_ManForEachRo(p, pObj, i)
#define Gia_ManForEachAnd(p, pObj, i)
#define Gia_ManForEachAndReverse(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 ///.
int Gia_ManHashOr(Gia_Man_t *p, int iLit0, int iLit1)
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
#define Gia_ManForEachRiRo(p, pObjRi, pObjRo, i)
void Gia_ManHashStop(Gia_Man_t *p)
void Gia_ManPrintStats(Gia_Man_t *p, Gps_Par_t *pPars)
void Gia_ManCleanMark01(Gia_Man_t *p)
int Gia_ManLevelNum(Gia_Man_t *p)
#define Gia_ManForEachRi(p, pObj, i)
void Gia_AigerWrite(Gia_Man_t *p, char *pFileName, int fWriteSymbols, int fCompact, int fWriteNewLine)
unsigned __int64 word
DECLARATIONS ///.
void Abc_CexPrintStatsInputs(Abc_Cex_t *p, int nRealPis)
void Abc_CexFreeP(Abc_Cex_t **p)
Abc_Cex_t * Abc_CexAllocFull(int nRegs, int nRealPis, int nFrames)
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 ///.
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.