45static inline void Cec_ManPatStoreNum(
Cec_ManPat_t *
p,
int Num )
47 unsigned x = (unsigned)Num;
51 Vec_StrPush(
p->vStorage, (
char)((x & 0x7f) | 0x80) );
54 Vec_StrPush(
p->vStorage, (
char)x );
71 for ( i = 0; (ch = Vec_StrEntry(
p->vStorage,
p->iStart++)) & 0x80; i++ )
72 x |= (ch & 0x7f) << (7 * i);
73 return x | (ch << (7 * i));
89 int i, Number, NumberPrev;
90 assert( Vec_IntSize(vPat) > 0 );
91 Cec_ManPatStoreNum(
p, Vec_IntSize(vPat) );
92 NumberPrev = Vec_IntEntry( vPat, 0 );
93 Cec_ManPatStoreNum(
p, NumberPrev );
96 assert( NumberPrev < Number );
97 Cec_ManPatStoreNum(
p, Number - NumberPrev );
116 Vec_IntClear( vPat );
117 Size = Cec_ManPatRestoreNum(
p );
118 Number = Cec_ManPatRestoreNum(
p );
119 Vec_IntPush( vPat, Number );
120 for ( i = 1; i < Size; i++ )
122 Number += Cec_ManPatRestoreNum(
p );
123 Vec_IntPush( vPat, Number );
125 assert( Vec_IntSize(vPat) == Size );
143 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
145 Gia_ObjSetTravIdCurrent(
p, pObj);
146 if ( Gia_ObjIsCi(pObj) )
151 assert( Gia_ObjIsAnd(pObj) );
154 pObj->
fMark1 = (Gia_ObjFanin0(pObj)->fMark1 ^ Gia_ObjFaninC0(pObj)) &
155 (Gia_ObjFanin1(pObj)->fMark1 ^ Gia_ObjFaninC1(pObj));
172 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
174 Gia_ObjSetTravIdCurrent(
p, pObj);
175 if ( Gia_ObjIsCi(pObj) )
177 Vec_IntPush( vPat, Abc_Var2Lit( Gia_ObjCioId(pObj), pObj->
fMark1==0 ) );
180 assert( Gia_ObjIsAnd(pObj) );
188 assert( (Gia_ObjFanin0(pObj)->fMark1 ^ Gia_ObjFaninC0(pObj)) == 0 ||
189 (Gia_ObjFanin1(pObj)->fMark1 ^ Gia_ObjFaninC1(pObj)) == 0 );
190 if ( (Gia_ObjFanin0(pObj)->fMark1 ^ Gia_ObjFaninC0(pObj)) == 0 )
210 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
212 Gia_ObjSetTravIdCurrent(
p, pObj);
213 if ( Gia_ObjIsCi(pObj) )
215 Vec_IntPush( vPat, Abc_Var2Lit( Gia_ObjCioId(pObj), pObj->
fMark1==0 ) );
218 assert( Gia_ObjIsAnd(pObj) );
226 assert( (Gia_ObjFanin0(pObj)->fMark1 ^ Gia_ObjFaninC0(pObj)) == 0 ||
227 (Gia_ObjFanin1(pObj)->fMark1 ^ Gia_ObjFaninC1(pObj)) == 0 );
228 if ( (Gia_ObjFanin1(pObj)->fMark1 ^ Gia_ObjFaninC1(pObj)) == 0 )
248 int Value0, Value1, Value;
249 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
251 Gia_ObjSetTravIdCurrent(
p, pObj);
252 if ( Gia_ObjIsCi(pObj) )
258 assert( Gia_ObjIsAnd(pObj) );
261 Value = Gia_XsimAndCond( Value0, Gia_ObjFaninC0(pObj), Value1, Gia_ObjFaninC1(pObj) );
262 pObj->
fMark0 = (Value & 1);
263 pObj->
fMark1 = ((Value >> 1) & 1);
285 pTemp = Gia_ManCi(
p, Abc_Lit2Var(Value) );
297 Gia_ObjSetTravIdCurrent(
p, pTemp );
300 Value = Gia_XsimNotCond( Value, Gia_ObjFaninC0(pObj) );
302 Abc_Print( 1,
"Cec_ManPatVerifyPattern(): Verification failed.\n" );
319 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
321 Gia_ObjSetTravIdCurrent(
p, pObj);
323 if ( Gia_ObjIsCi(pObj) )
325 assert( Gia_ObjIsAnd(pObj) );
343 assert( Gia_ObjIsCo(pObj) );
363 abctime clkTotal = Abc_Clock();
365 assert( Gia_ObjIsCo(pObj) );
372 assert( (Gia_ObjFanin0(pObj)->fMark1 ^ Gia_ObjFaninC0(pObj)) == 1 );
373 pMan->nPatLits += nPatLits;
374 pMan->nPatLitsAll += nPatLits;
378 Vec_IntClear( pMan->vPattern1 );
382 Vec_IntClear( pMan->vPattern2 );
386 vPat = Vec_IntSize(pMan->vPattern1) < Vec_IntSize(pMan->vPattern2) ? pMan->vPattern1 : pMan->vPattern2;
387 pMan->nPatLitsMin += Vec_IntSize(vPat);
388 pMan->nPatLitsMinAll += Vec_IntSize(vPat);
396 Vec_IntSort( vPat, 0 );
399 Cec_ManPatStore( pMan, vPat );
400 pMan->timeTotal += Abc_Clock() - clkTotal;
405 Vec_IntSort( vPat, 0 );
407 Cec_ManPatStore( pMan, vPat );
423 unsigned * pInfo, * pPres;
425 for ( i = 0; i < nLits; i++ )
427 pInfo = (
unsigned *)Vec_PtrEntry(vInfo, Abc_Lit2Var(pLits[i]));
428 pPres = (
unsigned *)Vec_PtrEntry(vPres, Abc_Lit2Var(pLits[i]));
429 if ( Abc_InfoHasBit( pPres, iBit ) &&
430 Abc_InfoHasBit( pInfo, iBit ) == Abc_LitIsCompl(pLits[i]) )
433 for ( i = 0; i < nLits; i++ )
435 pInfo = (
unsigned *)Vec_PtrEntry(vInfo, Abc_Lit2Var(pLits[i]));
436 pPres = (
unsigned *)Vec_PtrEntry(vPres, Abc_Lit2Var(pLits[i]));
437 Abc_InfoSetBit( pPres, iBit );
438 if ( Abc_InfoHasBit( pInfo, iBit ) == Abc_LitIsCompl(pLits[i]) )
439 Abc_InfoXorBit( pInfo, iBit );
459 int k, kMax = -1, nPatterns = 0;
460 int iStartOld = pMan->iStart;
464 vInfo = Vec_PtrAllocSimInfo( nInputs,
nWords );
466 vPres = Vec_PtrAllocSimInfo( nInputs,
nWords );
467 Vec_PtrCleanSimInfo( vPres, 0,
nWords );
468 while ( pMan->iStart < Vec_StrSize(pMan->vStorage) )
471 Cec_ManPatRestore( pMan, vPat );
472 for ( k = 1; k < nBits; k++, k += ((k % (32 * nWordsInit)) == 0) )
475 kMax = Abc_MaxInt( kMax, k );
478 Vec_PtrReallocSimInfo( vInfo );
480 Vec_PtrReallocSimInfo( vPres );
486 Vec_PtrFree( vPres );
487 pMan->nSeries = Vec_PtrReadWordsSimInfo(vInfo) / nWordsInit;
488 pMan->timePack += Abc_Clock() - clk;
489 pMan->timeTotal += Abc_Clock() - clk;
490 pMan->iStart = iStartOld;
491 if ( pMan->fVerbose )
493 Abc_Print( 1,
"Total = %5d. Max used = %5d. Full = %5d. Series = %d. ",
494 nPatterns, kMax, nWordsInit*32, pMan->nSeries );
495 ABC_PRT(
"Time", Abc_Clock() - clk );
517 int k, nSize, iStart, kMax = 0, nPatterns = 0;
521 assert( nRegs <= nInputs );
522 vPat = Vec_IntAlloc( 100 );
524 vInfo = Vec_PtrAllocSimInfo( nInputs,
nWords );
525 Vec_PtrCleanSimInfo( vInfo, 0,
nWords );
528 vPres = Vec_PtrAllocSimInfo( nInputs,
nWords );
529 Vec_PtrCleanSimInfo( vPres, 0,
nWords );
531 while ( iStart < Vec_IntSize(vCexStore) )
537 nSize = Vec_IntEntry( vCexStore, iStart++ );
541 Vec_IntClear( vPat );
542 for ( k = 0; k < nSize; k++ )
543 Vec_IntPush( vPat, Vec_IntEntry( vCexStore, iStart++ ) );
545 for ( k = 1; k < nBits; k++, k += ((k % (32 * nWordsInit)) == 0) )
553 kMax = Abc_MaxInt( kMax, k );
556 Vec_PtrReallocSimInfo( vInfo );
560 Vec_PtrReallocSimInfo( vPres );
567 Vec_PtrFree( vPres );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Cec_ManPatPrintStats(Cec_ManPat_t *p)
typedefABC_NAMESPACE_HEADER_START struct Cec_ManPat_t_ Cec_ManPat_t
INCLUDES ///.
int Cec_ObjSatVarValue(Cec_ManSat_t *p, Gia_Obj_t *pObj)
FUNCTION DEFINITIONS ///.
struct Cec_ManSat_t_ Cec_ManSat_t
void Cec_ManPatComputePattern1_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vPat)
void Cec_ManPatComputePattern2_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vPat)
void Cec_ManPatCleanMark0(Gia_Man_t *p, Gia_Obj_t *pObj)
void Cec_ManPatSavePatternCSat(Cec_ManPat_t *pMan, Vec_Int_t *vPat)
Vec_Ptr_t * Cec_ManPatCollectPatterns(Cec_ManPat_t *pMan, int nInputs, int nWordsInit)
void Cec_ManPatComputePattern4_rec(Gia_Man_t *p, Gia_Obj_t *pObj)
void Cec_ManPatSavePattern(Cec_ManPat_t *pMan, Cec_ManSat_t *p, Gia_Obj_t *pObj)
void Cec_ManPatVerifyPattern(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vPat)
int Cec_ManPatComputePattern_rec(Cec_ManSat_t *pSat, Gia_Man_t *p, Gia_Obj_t *pObj)
int Cec_ManPatCollectTry(Vec_Ptr_t *vInfo, Vec_Ptr_t *vPres, int iBit, int *pLits, int nLits)
Vec_Ptr_t * Cec_ManPatPackPatterns(Vec_Int_t *vCexStore, int nInputs, int nRegs, int nWordsInit)
int Cec_ManPatComputePattern3_rec(Gia_Man_t *p, Gia_Obj_t *pObj)
void Gia_ManRandomInfo(Vec_Ptr_t *vInfo, int iInputStart, int iWordStart, int iWordStop)
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
void Gia_ManIncrementTravId(Gia_Man_t *p)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.