54 int nWords = Abc_BitWordNum( nRegs + nRealPis * nFrames );
58 pCex->nPis = nRealPis;
59 pCex->nBits = nRegs + nRealPis * nFrames;
65 int nWords = Abc_BitWordNum( nRegs + nRealPis * nFrames );
69 pCex->nPis = nRealPis;
70 pCex->nBits = nRegs + nRealPis * nFrames;
90 iPo = iFrameOut % nTruePos;
91 iFrame = iFrameOut / nTruePos;
95 pCex->iFrame = iFrame;
116 pCex->iFrame = iFrame;
117 if ( pArray == NULL )
121 for ( i = nRegs; i < pCex->nBits; i++ )
122 if ( pArray[i-nRegs] )
123 Abc_InfoSetBit( pCex->pData, i );
127 for ( i = 0; i < pCex->nBits; i++ )
129 Abc_InfoSetBit( pCex->pData, i );
151 if ( nRegsNew == -1 )
155 pCex->iFrame =
p->iFrame;
156 for ( i =
p->nRegs; i < p->nBits; i++ )
157 if ( Abc_InfoHasBit(
p->pData, i) )
158 Abc_InfoSetBit( pCex->pData, pCex->nRegs + i -
p->nRegs );
180 for ( i = 0; i < nPis; i++ )
182 pCex->pData[i>>5] |= (1<<(i & 31));
204 { printf(
"Starting frame is less than 0.\n" );
return NULL; }
206 { printf(
"Stopping frame is less than 0.\n" );
return NULL; }
207 if ( iFrBeg > pCex->iFrame )
208 { printf(
"Starting frame is more than the last frame of CEX (%d).\n", pCex->iFrame );
return NULL; }
209 if ( iFrEnd > pCex->iFrame )
210 { printf(
"Stopping frame is more than the last frame of CEX (%d).\n", pCex->iFrame );
return NULL; }
211 if ( iFrBeg > iFrEnd )
212 { printf(
"Starting frame (%d) should be less than stopping frame (%d).\n", iFrBeg, iFrEnd );
return NULL; }
213 assert( iFrBeg >= 0 && iFrBeg <= pCex->iFrame );
214 assert( iFrEnd >= 0 && iFrEnd <= pCex->iFrame );
215 assert( iFrBeg <= iFrEnd );
217 assert( pCex->nPis == pPart->nPis );
218 assert( iFrEnd - iFrBeg + pPart->iPo >= pPart->iFrame );
220 nFramesGain = iFrEnd - iFrBeg + pPart->iPo - pPart->iFrame;
221 pNew =
Abc_CexAlloc( pCex->nRegs, pCex->nPis, pCex->iFrame + 1 - nFramesGain );
222 pNew->iPo = pCex->iPo;
223 pNew->iFrame = pCex->iFrame - nFramesGain;
225 for ( iBit = 0; iBit < pCex->nRegs; iBit++ )
226 if ( Abc_InfoHasBit(pCex->pData, iBit) )
227 Abc_InfoSetBit( pNew->pData, iBit );
228 for ( f = 0; f < iFrBeg; f++ )
229 for ( i = 0; i < pCex->nPis; i++, iBit++ )
230 if ( Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i) )
231 Abc_InfoSetBit( pNew->pData, iBit );
232 for ( f = 0; f < pPart->iFrame; f++ )
233 for ( i = 0; i < pCex->nPis; i++, iBit++ )
234 if ( Abc_InfoHasBit(pPart->pData, pPart->nRegs + pCex->nPis * f + i) )
235 Abc_InfoSetBit( pNew->pData, iBit );
236 for ( f = iFrEnd; f <= pCex->iFrame; f++ )
237 for ( i = 0; i < pCex->nPis; i++, iBit++ )
238 if ( Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i) )
239 Abc_InfoSetBit( pNew->pData, iBit );
240 assert( iBit == pNew->nBits );
261 printf(
"The counter example is NULL.\n" );
266 printf(
"The counter example is present but not available (pointer has value \"1\").\n" );
269 for ( k = 0; k <
p->nBits; k++ )
270 Counter += Abc_InfoHasBit(
p->pData, k);
271 printf(
"CEX: Po =%4d Frame =%4d FF = %d PI = %d Bit =%8d 1s =%8d (%5.2f %%)\n",
272 p->iPo,
p->iFrame,
p->nRegs,
p->nPis,
p->nBits,
273 Counter, 100.0 * Counter / (
p->nBits -
p->nRegs) );
277 int k, Counter = 0, CounterPi = 0, CounterPpi = 0;
280 printf(
"The counter example is NULL.\n" );
285 printf(
"The counter example is present but not available (pointer has value \"1\").\n" );
288 assert( nRealPis <= p->nPis );
289 for ( k = 0; k <
p->nBits; k++ )
291 Counter += Abc_InfoHasBit(
p->pData, k);
292 if ( nRealPis ==
p->nPis )
294 if ( (k -
p->nRegs) %
p->nPis < nRealPis )
295 CounterPi += Abc_InfoHasBit(
p->pData, k);
297 CounterPpi += Abc_InfoHasBit(
p->pData, k);
299 printf(
"CEX: Po =%4d Fr =%4d FF = %d PI = %d Bit =%7d 1 =%8d (%5.2f %%)",
300 p->iPo,
p->iFrame,
p->nRegs,
p->nPis,
p->nBits,
301 Counter, 100.0 * Counter / ((
p->iFrame + 1) *
p->nPis ) );
302 if ( nRealPis < p->nPis )
304 printf(
" 1pi =%8d (%5.2f %%) 1ppi =%8d (%5.2f %%)",
305 CounterPi, 100.0 * CounterPi / ((
p->iFrame + 1) * nRealPis ),
306 CounterPpi, 100.0 * CounterPpi / ((
p->iFrame + 1) * (
p->nPis - nRealPis)) );
327 printf(
"The counter example is NULL.\n" );
332 printf(
"The counter example is present but not available (pointer has value \"1\").\n" );
336 printf(
"State : " );
337 for ( k = 0; k <
p->nRegs; k++ )
338 printf(
"%d", Abc_InfoHasBit(
p->pData, k) );
340 for ( f = 0; f <=
p->iFrame; f++ )
342 printf(
"Frame %3d : ", f );
343 for ( i = 0; i <
p->nPis; i++ )
344 printf(
"%d", Abc_InfoHasBit(
p->pData, k++) );
404 int nFrames =
p->nPis / nPisOld;
405 int nPosNew = nPosOld * nFrames;
406 assert(
p->nPis % nPisOld == 0 );
409 pCex->nPis = nPisOld;
411 pCex->iFrame = (
p->iFrame + 1) * nFrames - 1;
412 pCex->nBits =
p->nBits;
430 int i, k, iBit = nRegsOld, nFrames =
p->nPis / nPisOld - 1;
432 assert(
p->nPis % nPisOld == 0 );
433 pCex =
Abc_CexAlloc( nRegsOld, nPisOld, nFrames +
p->iFrame + 1 );
435 pCex->iFrame = nFrames +
p->iFrame;
436 for ( i = 0; i < nFrames; i++ )
437 for ( k = 0; k < nPisOld; k++, iBit++ )
438 if ( Abc_InfoHasBit(
p->pData,
p->nRegs + (i+1)*nPisOld + k) )
439 Abc_InfoSetBit( pCex->pData, iBit );
440 for ( i = 0; i <=
p->iFrame; i++ )
441 for ( k = 0; k < nPisOld; k++, iBit++ )
442 if ( Abc_InfoHasBit(
p->pData,
p->nRegs + i*
p->nPis + k) )
443 Abc_InfoSetBit( pCex->pData, iBit );
444 assert( iBit == pCex->nBits );
462 int nFlops =
strlen(pInit);
463 int i, f, iBit, iAddPi = 0, nAddPis = 0;
465 for ( i = 0; i < nFlops; i++ )
466 nAddPis += (
int)(pInit[i] ==
'x' || pInit[i] ==
'X');
470 pCex->iFrame =
p->iFrame;
471 for ( iBit = 0; iBit < nFlops; iBit++ )
473 if ( pInit[iBit] ==
'1' || ((pInit[iBit] ==
'x' || pInit[iBit] ==
'X') && Abc_InfoHasBit(
p->pData,
p->nRegs +
p->nPis - nAddPis + iAddPi)) )
474 Abc_InfoSetBit( pCex->pData, iBit );
475 iAddPi += (int)(pInit[iBit] ==
'x' || pInit[iBit] ==
'X');
477 assert( iAddPi == nAddPis );
479 for ( f = 0; f <=
p->iFrame; f++ )
480 for ( i = 0; i < pCex->nPis; i++, iBit++ )
481 if ( Abc_InfoHasBit(
p->pData,
p->nRegs +
p->nPis * f + i) )
482 Abc_InfoSetBit( pCex->pData, iBit );
483 assert( iBit == pCex->nBits );
502 assert( Vec_IntSize(vMapOld2New) ==
p->nPis );
505 pCex->iFrame =
p->iFrame;
506 for ( i =
p->nRegs; i < p->nBits; i++ )
507 if ( Abc_InfoHasBit(
p->pData, i) )
509 iNew =
p->nRegs +
p->nPis * ((i -
p->nRegs) /
p->nPis) + Vec_IntEntry( vMapOld2New, (i -
p->nRegs) %
p->nPis );
510 Abc_InfoSetBit( pCex->pData, iNew );
531 assert( Vec_IntSize(vPermOld) ==
p->nPis );
532 assert( Vec_IntSize(vPermNew) ==
p->nPis );
533 vPerm = Vec_IntStartFull(
p->nPis );
535 Vec_IntWriteEntry( vPerm, eOld, eNew );
537 Vec_IntFree( vPerm );
552static inline int Abc_CexOnes32(
unsigned i )
554 i = i - ((i >> 1) & 0x55555555);
555 i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
556 i = ((i + (i >> 4)) & 0x0F0F0F0F);
557 return (i*(0x01010101))>>24;
561 int nWords = Abc_BitWordNum(
p->nBits );
563 for ( i = 0; i <
nWords; i++ )
564 Count += Abc_CexOnes32(
p->pData[i] );
#define ABC_ALLOC(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 Abc_CexPrintStatsInputs(Abc_Cex_t *p, int nRealPis)
void Abc_CexFreeP(Abc_Cex_t **p)
Abc_Cex_t * Abc_CexCreate(int nRegs, int nPis, int *pArray, int iFrame, int iPo, int fSkipRegs)
Abc_Cex_t * Abc_CexTransformTempor(Abc_Cex_t *p, int nPisOld, int nPosOld, int nRegsOld)
Abc_Cex_t * Abc_CexDup(Abc_Cex_t *p, int nRegsNew)
Abc_Cex_t * Abc_CexMakeTriv(int nRegs, int nTruePis, int nTruePos, int iFrameOut)
Abc_Cex_t * Abc_CexTransformUndc(Abc_Cex_t *p, char *pInit)
Abc_Cex_t * Abc_CexTransformPhase(Abc_Cex_t *p, int nPisOld, int nPosOld, int nRegsOld)
void Abc_CexPrint(Abc_Cex_t *p)
Abc_Cex_t * Abc_CexAllocFull(int nRegs, int nRealPis, int nFrames)
void Abc_CexFree(Abc_Cex_t *p)
Abc_Cex_t * Abc_CexPermute(Abc_Cex_t *p, Vec_Int_t *vMapOld2New)
Abc_Cex_t * Abc_CexMerge(Abc_Cex_t *pCex, Abc_Cex_t *pPart, int iFrBeg, int iFrEnd)
Abc_Cex_t * Abc_CexDeriveFromCombModel(int *pModel, int nPis, int nRegs, int iPo)
int Abc_CexCountOnes(Abc_Cex_t *p)
Abc_Cex_t * Abc_CexPermuteTwo(Abc_Cex_t *p, Vec_Int_t *vPermOld, Vec_Int_t *vPermNew)
void Abc_CexPrintStats(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_IntForEachEntryTwo(vVec1, vVec2, Entry1, Entry2, i)