41static inline unsigned * Gia_Sim2Data(
Gia_Sim2_t *
p,
int i ) {
return p->pDataSim + i *
p->nWords; }
62 Vec_IntFreeP( &
p->vClassOld );
63 Vec_IntFreeP( &
p->vClassNew );
88 p->pDataSim =
ABC_ALLOC(
unsigned,
p->nWords * Gia_ManObjNum(
p->pAig) );
91 Abc_Print( 1,
"Simulator could not allocate %.2f GB for simulation info.\n",
92 4.0 *
p->nWords * Gia_ManObjNum(
p->pAig) / (1<<30) );
96 p->vClassOld = Vec_IntAlloc( 100 );
97 p->vClassNew = Vec_IntAlloc( 100 );
99 Abc_Print( 1,
"Memory: AIG = %7.2f MB. SimInfo = %7.2f MB.\n",
100 12.0*Gia_ManObjNum(
p->pAig)/(1<<20), 4.0*
p->nWords*Gia_ManObjNum(
p->pAig)/(1<<20) );
119static inline void Gia_Sim2InfoRandom(
Gia_Sim2_t *
p,
unsigned * pInfo )
122 for ( w =
p->nWords-1; w >= 0; w-- )
137static inline void Gia_Sim2InfoZero(
Gia_Sim2_t *
p,
unsigned * pInfo )
140 for ( w =
p->nWords-1; w >= 0; w-- )
155static inline void Gia_Sim2InfoOne(
Gia_Sim2_t *
p,
unsigned * pInfo )
158 for ( w =
p->nWords-1; w >= 0; w-- )
173static inline void Gia_Sim2InfoCopy(
Gia_Sim2_t *
p,
unsigned * pInfo,
unsigned * pInfo0 )
176 for ( w =
p->nWords-1; w >= 0; w-- )
177 pInfo[w] = pInfo0[w];
193 unsigned * pInfo = Gia_Sim2Data(
p, Gia_ObjValue(pObj) );
194 unsigned * pInfo0 = Gia_Sim2Data(
p, Gia_ObjFaninId0(pObj, Gia_ObjValue(pObj)) );
196 if ( Gia_ObjFaninC0(pObj) )
197 for ( w =
p->nWords-1; w >= 0; w-- )
198 pInfo[w] = ~pInfo0[w];
200 for ( w =
p->nWords-1; w >= 0; w-- )
201 pInfo[w] = pInfo0[w];
217 unsigned * pInfo = Gia_Sim2Data(
p, Gia_ObjValue(pObj) );
218 unsigned * pInfo0 = Gia_Sim2Data(
p, Gia_ObjFaninId0(pObj, Gia_ObjValue(pObj)) );
219 unsigned * pInfo1 = Gia_Sim2Data(
p, Gia_ObjFaninId1(pObj, Gia_ObjValue(pObj)) );
221 if ( Gia_ObjFaninC0(pObj) )
223 if ( Gia_ObjFaninC1(pObj) )
224 for ( w =
p->nWords-1; w >= 0; w-- )
225 pInfo[w] = ~(pInfo0[w] | pInfo1[w]);
227 for ( w =
p->nWords-1; w >= 0; w-- )
228 pInfo[w] = ~pInfo0[w] & pInfo1[w];
232 if ( Gia_ObjFaninC1(pObj) )
233 for ( w =
p->nWords-1; w >= 0; w-- )
234 pInfo[w] = pInfo0[w] & ~pInfo1[w];
236 for ( w =
p->nWords-1; w >= 0; w-- )
237 pInfo[w] = pInfo0[w] & pInfo1[w];
252static inline void Gia_Sim2InfoTransfer(
Gia_Sim2_t *
p )
255 unsigned * pInfo0, * pInfo1;
259 pInfo0 = Gia_Sim2Data(
p, Gia_ObjValue(pObjRo) );
260 pInfo1 = Gia_Sim2Data(
p, Gia_ObjValue(pObjRi) );
261 Gia_Sim2InfoCopy(
p, pInfo0, pInfo1 );
276static inline void Gia_Sim2SimulateRound(
Gia_Sim2_t *
p )
280 pObj = Gia_ManConst0(
p->pAig);
281 assert( Gia_ObjValue(pObj) == 0 );
282 Gia_Sim2InfoZero(
p, Gia_Sim2Data(
p, Gia_ObjValue(pObj)) );
284 Gia_Sim2InfoRandom(
p, Gia_Sim2Data(
p, Gia_ObjValue(pObj)) );
287 assert( Gia_ObjValue(pObj) == i );
288 Gia_Sim2SimulateNode(
p, pObj );
291 Gia_Sim2SimulateCo(
p, pObj );
312 for ( w = 0; w <
nWords; w++ )
313 if ( p0[w] != p1[w] )
319 for ( w = 0; w <
nWords; w++ )
320 if ( p0[w] != ~p1[w] )
342 for ( w = 0; w <
nWords; w++ )
349 for ( w = 0; w <
nWords; w++ )
369 int Repr =
GIA_VOID, EntPrev = -1, Ent, i;
370 assert( Vec_IntSize(vClass) > 0 );
382 Gia_ObjSetRepr(
p, Ent, Repr );
383 Gia_ObjSetNext(
p, EntPrev, Ent );
387 Gia_ObjSetNext(
p, EntPrev, 0 );
404 unsigned * pSim0, * pSim1;
406 Vec_IntClear(
p->vClassOld );
407 Vec_IntClear(
p->vClassNew );
408 Vec_IntPush(
p->vClassOld, i );
409 pObj0 = Gia_ManObj(
p->pAig, i );
410 pSim0 = Gia_Sim2Data(
p, i );
413 pObj1 = Gia_ManObj(
p->pAig, Ent );
414 pSim1 = Gia_Sim2Data(
p, Ent );
416 Vec_IntPush(
p->vClassOld, Ent );
418 Vec_IntPush(
p->vClassNew, Ent );
420 if ( Vec_IntSize(
p->vClassNew ) == 0 )
424 if ( Vec_IntSize(
p->vClassNew) > 1 )
442 static int s_Primes[16] = {
443 1291, 1699, 1999, 2357, 2953, 3313, 3907, 4177,
444 4831, 5147, 5647, 6343, 6899, 7103, 7873, 8147 };
448 for ( i = 0; i <
nWords; i++ )
449 uHash ^= ~pSim[i] * s_Primes[i & 0xf];
451 for ( i = 0; i <
nWords; i++ )
452 uHash ^= pSim[i] * s_Primes[i & 0xf];
453 return (
int)(uHash % nTableSize);
471 int * pTable, nTableSize, i, k, Key;
472 if ( Vec_IntSize(vRefined) == 0 )
474 nTableSize = Abc_PrimeCudd( 1000 + Vec_IntSize(vRefined) / 3 );
478 pSim = Gia_Sim2Data(
p, i );
480 if ( pTable[Key] == 0 )
482 assert( Gia_ObjRepr(
p->pAig, i) == 0 );
483 assert( Gia_ObjNext(
p->pAig, i) == 0 );
488 Gia_ObjSetNext(
p->pAig, pTable[Key], i );
489 Gia_ObjSetRepr(
p->pAig, i, Gia_ObjRepr(
p->pAig, pTable[Key]) );
490 if ( Gia_ObjRepr(
p->pAig, i) ==
GIA_VOID )
491 Gia_ObjSetRepr(
p->pAig, i, pTable[Key] );
492 assert( Gia_ObjRepr(
p->pAig, i) > 0 );
523 vRefined = Vec_IntAlloc( 100 );
526 if ( !Gia_ObjIsConst(
p->pAig, i) )
528 pSim = Gia_Sim2Data(
p, i );
532 Vec_IntPush( vRefined, i );
537 Vec_IntFree( vRefined );
556static inline int Gia_Sim2InfoIsZero(
Gia_Sim2_t *
p,
unsigned * pInfo )
559 for ( w = 0; w <
p->nWords; w++ )
561 return 32*w + Gia_WordFindFirstBit( pInfo[w] );
576static inline int Gia_Sim2CheckPos(
Gia_Sim2_t *
p,
int * piPo,
int * piPat )
582 iPat = Gia_Sim2InfoIsZero(
p, Gia_Sim2Data(
p, Gia_ObjValue(pObj) ) );
608 int f, i, w, Counter;
609 p =
Abc_CexAlloc( Gia_ManRegNum(pAig), Gia_ManPiNum(pAig), iFrame+1 );
615 for ( f = 0; f <= iFrame; f++, Counter +=
p->nPis )
616 for ( i = 0; i < Gia_ManPiNum(pAig); i++ )
618 for ( w =
nWords-1; w >= 0; w-- )
620 if ( Abc_InfoHasBit( pData, iPat ) )
621 Abc_InfoSetBit(
p->pData, Counter + i );
642 abctime clkTotal = Abc_Clock();
643 int i, RetValue = 0, iOut, iPat;
650 Gia_Sim2InfoZero(
p, Gia_Sim2Data(
p, Gia_ObjValue(pObj)) );
651 for ( i = 0; i < pPars->
nIters; i++ )
653 Gia_Sim2SimulateRound(
p );
656 Abc_Print( 1,
"Frame %4d out of %4d and timeout %3d sec. ", i+1, pPars->
nIters, pPars->
TimeLimit );
659 Abc_Print( 1,
"Time = %7.2f sec\r", (1.0*Abc_Clock()-clkTotal)/CLOCKS_PER_SEC );
661 if ( pPars->
fCheckMiter && Gia_Sim2CheckPos(
p, &iOut, &iPat ) )
666 Abc_Print( 1,
"Output %d of miter \"%s\" was asserted in frame %d. ", iOut, pAig->
pName, i );
670 Abc_Print( 1,
"\nGenerated counter-example is INVALID. " );
685 if ( Abc_Clock() > nTimeToStop )
690 if ( i < pPars->nIters - 1 )
691 Gia_Sim2InfoTransfer(
p );
695 Abc_Print( 1,
"No bug detected after simulating %d frames with %d words. ", i, pPars->
nWords );
696 Abc_PrintTime( 1,
"Time", Abc_Clock() - clkTotal );
#define ABC_ALLOC(type, num)
#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 Gia_Sim2Delete(Gia_Sim2_t *p)
FUNCTION DEFINITIONS ///.
int Gia_Sim2CompareEqual(unsigned *p0, unsigned *p1, int nWords, int fCompl)
void Gia_ManResetRandom(Gia_ParSim_t *pPars)
int Gia_Sim2CompareZero(unsigned *p0, int nWords, int fCompl)
Gia_Sim2_t * Gia_Sim2Create(Gia_Man_t *pAig, Gia_ParSim_t *pPars)
void Gia_Sim2ProcessRefined(Gia_Sim2_t *p, Vec_Int_t *vRefined)
Abc_Cex_t * Gia_Sim2GenerateCounter(Gia_Man_t *pAig, int iFrame, int iOut, int nWords, int iPat)
void Gia_Sim2ClassCreate(Gia_Man_t *p, Vec_Int_t *vClass)
typedefABC_NAMESPACE_IMPL_START struct Gia_Sim2_t_ Gia_Sim2_t
DECLARATIONS ///.
int Gia_Sim2HashKey(unsigned *pSim, int nWords, int nTableSize)
int Gia_Sim2ClassRefineOne(Gia_Sim2_t *p, int i)
void Gia_Sim2InfoRefineEquivs(Gia_Sim2_t *p)
int Gia_ManSimSimulateEquiv(Gia_Man_t *pAig, Gia_ParSim_t *pPars)
#define Gia_ManForEachRo(p, pObj, i)
#define Gia_ManForEachPo(p, pObj, i)
int Gia_ManEquivCountLitsAll(Gia_Man_t *p)
#define Gia_ManForEachAnd(p, pObj, i)
#define Gia_ClassForEachObj1(p, i, iObj)
#define Gia_ManForEachPi(p, pObj, i)
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachObj1(p, pObj, i)
#define Gia_ManForEachClass(p, i)
int Gia_ManVerifyCex(Gia_Man_t *pAig, Abc_Cex_t *p, int fDualOut)
DECLARATIONS ///.
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachRiRo(p, pObjRi, pObjRo, i)
void Gia_ManSetPhase(Gia_Man_t *p)
struct Gia_ParSim_t_ Gia_ParSim_t
unsigned Gia_ManRandom(int fReset)
FUNCTION DEFINITIONS ///.
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_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.