30static inline unsigned * Cec_ObjSim(
Cec_ManSim_t *
p,
int Id ) {
return p->pMems +
p->pSimInfo[Id] + 1; }
31static inline void Cec_ObjSetSim(
Cec_ManSim_t *
p,
int Id,
int n ) {
p->pSimInfo[Id] = n; }
33static inline float Cec_MemUsage(
Cec_ManSim_t *
p ) {
return 1.0*
p->nMemsMax*(
p->pPars->nWords+1)/(1<<20); }
55 for ( w = 0; w <
nWords; w++ )
62 for ( w = 0; w <
nWords; w++ )
83 if ( (p0[0] & 1) == (p1[0] & 1) )
85 for ( w = 0; w <
nWords; w++ )
92 for ( w = 0; w <
nWords; w++ )
93 if ( p0[w] != ~p1[w] )
115 for ( w = 0; w <
nWords; w++ )
117 return 32*w + Gia_WordFindFirstBit( ~
p[w] );
122 for ( w = 0; w <
nWords; w++ )
124 return 32*w + Gia_WordFindFirstBit(
p[w] );
143 if ( (p0[0] & 1) == (p1[0] & 1) )
145 for ( w = 0; w <
nWords; w++ )
146 if ( p0[w] != p1[w] )
147 return 32*w + Gia_WordFindFirstBit( p0[w] ^ p1[w] );
152 for ( w = 0; w <
nWords; w++ )
153 if ( p0[w] != ~p1[w] )
154 return 32*w + Gia_WordFindFirstBit( p0[w] ^ ~p1[w] );
175 for ( w = 0; w <
nWords; w++ )
177 for ( b = 0; b < 32; b++ )
178 if ( ((~
p[w]) >> b ) & 1 )
183 for ( w = 0; w <
nWords; w++ )
185 for ( b = 0; b < 32; b++ )
186 if ( ((
p[w]) >> b ) & 1 )
205 if ( (p0[0] & 1) == (p1[0] & 1) )
207 for ( w = 0; w <
nWords; w++ )
208 if ( p0[w] != p1[w] )
209 for ( b = 0; b < 32; b++ )
210 if ( ((p0[w] ^ p1[w]) >> b ) & 1 )
215 for ( w = 0; w <
nWords; w++ )
216 if ( p0[w] != ~p1[w] )
217 for ( b = 0; b < 32; b++ )
218 if ( ((p0[w] ^ ~p1[w]) >> b ) & 1 )
236 int Repr =
GIA_VOID, EntPrev = -1, Ent, i;
237 assert( Vec_IntSize(vClass) > 0 );
249 Gia_ObjSetRepr(
p, Ent, Repr );
250 Gia_ObjSetNext(
p, EntPrev, Ent );
254 Gia_ObjSetNext(
p, EntPrev, 0 );
268static int s_Count = 0;
272 unsigned * pSim0, * pSim1;
275 Vec_IntClear(
p->vClassOld );
276 Vec_IntClear(
p->vClassNew );
277 Vec_IntPush(
p->vClassOld, i );
278 pSim0 = Cec_ObjSim(
p, i);
281 pSim1 = Cec_ObjSim(
p, Ent);
283 Vec_IntPush(
p->vClassOld, Ent );
286 Vec_IntPush(
p->vClassNew, Ent );
291 if ( Vec_IntSize(
p->vClassNew ) == 0 )
295 if ( Vec_IntSize(
p->vClassNew) > 1 )
305 printf(
"%d ", s_Count );
327 if ( Gia_ObjIsConst(
p->pAig, i) )
332 if ( !Gia_ObjIsClass(
p->pAig, i) )
334 assert( Gia_ObjIsClass(
p->pAig, i) );
335 iRepr = Gia_ObjRepr(
p->pAig, i );
339 Vec_IntClear(
p->vClassOld );
340 Vec_IntClear(
p->vClassNew );
344 Vec_IntPush(
p->vClassNew, Ent );
346 Vec_IntPush(
p->vClassOld, Ent );
348 assert( Vec_IntSize(
p->vClassNew ) == 1 );
351 assert( !Gia_ObjIsClass(
p->pAig, i) );
368 static int s_Primes[16] = {
369 1291, 1699, 1999, 2357, 2953, 3313, 3907, 4177,
370 4831, 5147, 5647, 6343, 6899, 7103, 7873, 8147 };
374 for ( i = 0; i <
nWords; i++ )
375 uHash ^= ~pSim[i] * s_Primes[i & 0xf];
377 for ( i = 0; i <
nWords; i++ )
378 uHash ^= pSim[i] * s_Primes[i & 0xf];
379 return (
int)(uHash % nTableSize);
396 unsigned * pPlace, Ent;
397 pPlace = (
unsigned *)&
p->MemFree;
398 for ( Ent =
p->nMems * (
p->nWords + 1);
399 Ent +
p->nWords + 1 < (
unsigned)
p->nWordsAlloc;
400 Ent +=
p->nWords + 1 )
403 pPlace =
p->pMems + Ent;
406 p->nWordsOld =
p->nWords;
424 if (
p->MemFree == 0 )
426 if (
p->nWordsAlloc == 0 )
429 p->nWordsAlloc = (1<<17);
436 p->pSimInfo[i] =
p->MemFree;
437 pSim =
p->pMems +
p->MemFree;
438 p->MemFree = pSim[0];
439 pSim[0] = Gia_ObjValue( Gia_ManObj(
p->pAig, i) );
441 if (
p->nMemsMax <
p->nMems )
442 p->nMemsMax =
p->nMems;
461 pSim =
p->pMems +
p->pSimInfo[i];
462 if ( --pSim[0] == 0 )
464 pSim[0] =
p->MemFree;
465 p->MemFree =
p->pSimInfo[i];
486 int * pTable, nTableSize, i, k, Key;
487 if ( Vec_IntSize(vRefined) == 0 )
489 nTableSize = Abc_PrimeCudd( 100 + Vec_IntSize(vRefined) / 3 );
493 pSim = Cec_ObjSim(
p, i );
496 if ( pTable[Key] == 0 )
498 assert( Gia_ObjRepr(
p->pAig, i) == 0 );
499 assert( Gia_ObjNext(
p->pAig, i) == 0 );
504 Gia_ObjSetNext(
p->pAig, pTable[Key], i );
505 Gia_ObjSetRepr(
p->pAig, i, Gia_ObjRepr(
p->pAig, pTable[Key]) );
506 if ( Gia_ObjRepr(
p->pAig, i) ==
GIA_VOID )
507 Gia_ObjSetRepr(
p->pAig, i, pTable[Key] );
508 assert( Gia_ObjRepr(
p->pAig, i) > 0 );
514 if ( Gia_ObjIsHead(
p->pAig, i ) )
541 sizeof(
Abc_Cex_t) +
sizeof(
unsigned) * Abc_BitWordNum(Gia_ManCiNum(
p->pAig)) );
542 p->pCexComb->iPo =
p->iOut;
543 p->pCexComb->nPis = Gia_ManCiNum(
p->pAig);
544 p->pCexComb->nBits = Gia_ManCiNum(
p->pAig);
545 for ( i = 0; i < Gia_ManCiNum(
p->pAig); i++ )
547 pInfo = (
unsigned *)Vec_PtrEntry(
p->vCiSimInfo, i );
548 if ( Abc_InfoHasBit( pInfo, iPat ) )
549 Abc_InfoSetBit(
p->pCexComb->pData, i );
567 int i, ScoreBest = 0, iPatBest = 1;
569 for ( i = 0; i < 32 *
p->nWords; i++ )
570 if ( ScoreBest < p->pScores[i] )
572 ScoreBest =
p->pScores[i];
576 if (
p->pBestState->iPo <= ScoreBest )
578 assert(
p->pBestState->nRegs == Gia_ManRegNum(
p->pAig) );
579 for ( i = 0; i < Gia_ManRegNum(
p->pAig); i++ )
581 pInfo = (
unsigned *)Vec_PtrEntry(
p->vCiSimInfo, Gia_ManPiNum(
p->pAig) + i );
582 if ( Abc_InfoHasBit(
p->pBestState->pData, i) != Abc_InfoHasBit(pInfo, iPatBest) )
583 Abc_InfoXorBit(
p->pBestState->pData, i );
585 p->pBestState->iPo = ScoreBest;
602 unsigned * pInfo, * pInfo2;
604 if ( !
p->pPars->fCheckMiter )
606 assert(
p->vCoSimInfo != NULL );
608 if (
p->pPars->fDualOut )
610 assert( (Gia_ManPoNum(
p->pAig) & 1) == 0 );
611 for ( i = 0; i < Gia_ManPoNum(
p->pAig); i++ )
613 pInfo = (
unsigned *)Vec_PtrEntry(
p->vCoSimInfo, i );
614 pInfo2 = (
unsigned *)Vec_PtrEntry(
p->vCoSimInfo, ++i );
622 if (
p->pCexes == NULL )
623 p->pCexes =
ABC_CALLOC(
void *, Gia_ManPoNum(
p->pAig)/2 );
624 if (
p->pCexes[i/2] == NULL )
627 p->pCexes[i/2] = (
void *)1;
634 for ( i = 0; i < Gia_ManPoNum(
p->pAig); i++ )
636 pInfo = (
unsigned *)Vec_PtrEntry(
p->vCoSimInfo, i );
644 if (
p->pCexes == NULL )
645 p->pCexes =
ABC_CALLOC(
void *, Gia_ManPoNum(
p->pAig) );
646 if (
p->pCexes[i] == NULL )
649 p->pCexes[i] = (
void *)1;
654 return p->pCexes != NULL;
671 unsigned * pRes0, * pRes1, * pRes;
672 int i, k, w, Ent, iCiId = 0, iCoId = 0;
674 if (
p->nWordsOld !=
p->nWords )
682 Vec_IntClear(
p->vRefinedC );
683 if ( Gia_ObjValue(Gia_ManConst0(
p->pAig)) )
686 for ( w = 1; w <=
p->nWords; w++ )
691 if ( Gia_ObjIsCi(pObj) )
693 if ( Gia_ObjValue(pObj) == 0 )
701 pRes0 = (
unsigned *)Vec_PtrEntry( vInfoCis, iCiId++ );
702 for ( w = 1; w <=
p->nWords; w++ )
703 pRes[w] = pRes0[w-1];
707 for ( w = 1; w <=
p->nWords; w++ )
711 pRes[1] ^= (pRes[1] & 1);
714 if ( Gia_ObjIsCo(pObj) )
719 pRes = (
unsigned *)Vec_PtrEntry( vInfoCos, iCoId++ );
720 if ( Gia_ObjFaninC0(pObj) )
721 for ( w = 1; w <=
p->nWords; w++ )
722 pRes[w-1] = ~pRes0[w];
724 for ( w = 1; w <=
p->nWords; w++ )
725 pRes[w-1] = pRes0[w];
729 assert( Gia_ObjValue(pObj) );
736 if ( Gia_ObjFaninC0(pObj) )
738 if ( Gia_ObjFaninC1(pObj) )
739 for ( w = 1; w <=
p->nWords; w++ )
740 pRes[w] = ~(pRes0[w] | pRes1[w]);
742 for ( w = 1; w <=
p->nWords; w++ )
743 pRes[w] = ~pRes0[w] & pRes1[w];
747 if ( Gia_ObjFaninC1(pObj) )
748 for ( w = 1; w <=
p->nWords; w++ )
749 pRes[w] = pRes0[w] & ~pRes1[w];
751 for ( w = 1; w <=
p->nWords; w++ )
752 pRes[w] = pRes0[w] & pRes1[w];
760 Vec_IntPush(
p->vRefinedC, i );
765 if ( Gia_ObjIsClass(
p->pAig, i) )
768 if ( Gia_ObjIsTail(
p->pAig, i) )
770 Vec_IntClear(
p->vClassTemp );
772 Vec_IntPush(
p->vClassTemp, Ent );
779 if (
p->pPars->fConstCorr )
786 Vec_IntClear(
p->vRefinedC );
789 if ( Vec_IntSize(
p->vRefinedC) > 0 )
791 assert( vInfoCis == NULL || iCiId == Gia_ManCiNum(
p->pAig) );
792 assert( vInfoCos == NULL || iCoId == Gia_ManCoNum(
p->pAig) );
795 Abc_Print( 1,
"Cec_ManSimSimulateRound(): Memory management error!\n" );
796 if (
p->pPars->fVeryVerbose )
826 unsigned * pRes0, * pRes1;
828 if (
p->pPars->fSeqSimulate && Gia_ManRegNum(
p->pAig) > 0 )
830 assert( vInfoCis && vInfoCos );
831 for ( i = 0; i < Gia_ManPiNum(
p->pAig); i++ )
833 pRes0 = (
unsigned *)Vec_PtrEntry( vInfoCis, i );
834 for ( w = 0; w <
p->nWords; w++ )
837 for ( i = 0; i < Gia_ManRegNum(
p->pAig); i++ )
839 pRes0 = (
unsigned *)Vec_PtrEntry( vInfoCis, Gia_ManPiNum(
p->pAig) + i );
840 pRes1 = (
unsigned *)Vec_PtrEntry( vInfoCos, Gia_ManPoNum(
p->pAig) + i );
841 for ( w = 0; w <
p->nWords; w++ )
847 for ( i = 0; i < Gia_ManCiNum(
p->pAig); i++ )
849 pRes0 = (
unsigned *)Vec_PtrEntry( vInfoCis, i );
850 for ( w = 0; w <
p->nWords; w++ )
871 assert(
p->pAig->pReprs == NULL );
874 p->pAig->pNexts =
ABC_CALLOC(
int, Gia_ManObjNum(
p->pAig) );
878 if (
p->pPars->fLatchCorr )
881 else if ( LevelMax == -1 )
883 Gia_ObjSetRepr(
p->pAig, i, Gia_ObjIsAnd(pObj) ? 0 :
GIA_VOID );
888 Gia_ObjSetRepr(
p->pAig, i, (Gia_ObjIsAnd(pObj) && Gia_ObjLevel(
p->pAig,pObj) <= LevelMax) ? 0 :
GIA_VOID );
889 Vec_IntFreeP( &
p->pAig->vLevels );
892 if (
p->pPars->fSeqSimulate )
895 Gia_ObjSetRepr(
p->pAig, Gia_ObjId(
p->pAig, pObj), 0 );
897 if (
p->pAig->nSimWords )
899 p->nWords = 2*
p->pAig->nSimWords;
900 assert( Vec_WrdSize(
p->pAig->vSimsPi) == Gia_ManCiNum(
p->pAig) *
p->pAig->nSimWords );
902 for ( i = 0; i < Gia_ManCiNum(
p->pAig); i++ )
903 memmove( Vec_PtrEntry(
p->vCiSimInfo, i), Vec_WrdEntryP(
p->pAig->vSimsPi, i*
p->pAig->nSimWords),
sizeof(
word)*
p->pAig->nSimWords );
906 if (
p->pPars->fVerbose )
913 if (
p->pPars->fVerbose )
915 for ( i = 0; i < 4; i++ )
921 p->nWords = 2 *
p->nWords + 1;
923 while (
p->nWords <=
p->pPars->nWords );
943 p->nWords =
p->pPars->nWords;
944 for ( i = 0; i <
p->pPars->nRounds; i++ )
946 if ( (i % (
p->pPars->nRounds / 5)) == 0 &&
p->pPars->fVerbose )
952 if (
p->pPars->fVerbose )
#define ABC_REALLOC(type, obj, 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 ///.
int Cec_ManSimCompareEqual(unsigned *p0, unsigned *p1, int nWords)
int Cec_ManSimCompareConstFirstBit(unsigned *p, int nWords)
int Cec_ManSimClassesPrepare(Cec_ManSim_t *p, int LevelMax)
int Cec_ManSimClassesRefine(Cec_ManSim_t *p)
unsigned * Cec_ManSimSimRef(Cec_ManSim_t *p, int i)
int Cec_ManSimAnalyzeOutputs(Cec_ManSim_t *p)
void Cec_ManSimCompareEqualScore(unsigned *p0, unsigned *p1, int nWords, int *pScores)
void Cec_ManSimCreateInfo(Cec_ManSim_t *p, Vec_Ptr_t *vInfoCis, Vec_Ptr_t *vInfoCos)
int Cec_ManSimClassRefineOne_rec(Cec_ManSim_t *p, int i)
int Cec_ManSimClassRefineOne_(Cec_ManSim_t *p, int i)
int Cec_ManSimSimulateRound(Cec_ManSim_t *p, Vec_Ptr_t *vInfoCis, Vec_Ptr_t *vInfoCos)
int Cec_ManSimClassRemoveOne(Cec_ManSim_t *p, int i)
unsigned * Cec_ManSimSimDeref(Cec_ManSim_t *p, int i)
void Cec_ManSimSavePattern(Cec_ManSim_t *p, int iPat)
int Cec_ManSimHashKey(unsigned *pSim, int nWords, int nTableSize)
int Cec_ManSimClassRefineOne(Cec_ManSim_t *p, int i)
void Cec_ManSimProcessRefined(Cec_ManSim_t *p, Vec_Int_t *vRefined)
void Cec_ManSimClassCreate(Gia_Man_t *p, Vec_Int_t *vClass)
void Cec_ManSimFindBestPattern(Cec_ManSim_t *p)
int Cec_ManSimCompareEqualFirstBit(unsigned *p0, unsigned *p1, int nWords)
void Cec_ManSimCompareConstScore(unsigned *p, int nWords, int *pScores)
void Cec_ManSimMemRelink(Cec_ManSim_t *p)
int Cec_ManSimCompareConst(unsigned *p, int nWords)
FUNCTION DEFINITIONS ///.
struct Cec_ManSim_t_ Cec_ManSim_t
struct Gia_Rpr_t_ Gia_Rpr_t
#define Gia_ManForEachRo(p, pObj, i)
void Gia_ManCreateValueRefs(Gia_Man_t *p)
#define Gia_ClassForEachObj1(p, i, iObj)
struct Gia_Obj_t_ Gia_Obj_t
void Gia_ManEquivPrintClasses(Gia_Man_t *p, int fVerbose, float Mem)
#define Gia_ClassForEachObj(p, i, iObj)
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachObj1(p, pObj, i)
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
int Gia_ManLevelNum(Gia_Man_t *p)
unsigned Gia_ManRandom(int fReset)
FUNCTION DEFINITIONS ///.
unsigned __int64 word
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.