33#define TRUTH_UNUSED 0x1234567812345678
77 Vec_Ptr_t * vFunc = Vec_PtrAlloc( Vec_WecSize(vLits) );
79 Vec_Wrd_t * vTemp = Vec_WrdStart( Gia_ManObjNum(
p) );
81 int i, j, k, Entry, Entry2, nOvers = 0, nErrors = 0;
84 Vec_Wrd_t * vTruths = Vec_WrdAlloc( Vec_IntSize(vLevel) );
88 if ( Vec_IntSize(vSupp) > 6 )
94 vSupp->nSize = Abc_Tt6MinBase( &Truth, vSupp->pArray, vSupp->nSize );
95 if ( Vec_IntSize(vSupp) > 5 )
101 Vec_WrdPush( vTruths, Truth );
103 Vec_PtrPush( vFunc, vTruths );
106 printf(
"Detected %d oversize support nodes.\n", nOvers );
107 Vec_IntFree( vSupp );
108 Vec_WrdFree( vTemp );
116 word Truth = Vec_WrdEntry( vTruths, k );
117 word Truth2 = Vec_WrdEntry( vTruths, j );
118 if ( Entry == Entry2 )
122 printf(
"Rank %d: Lit %d and %d do not pass verification.\n", i, k, j );
124 if ( Entry == Abc_LitNot(Entry2) )
128 printf(
"Rank %d: Lit %d and %d do not pass verification.\n", i, k, j );
133 printf(
"Total errors in equivalence classes = %d.\n", nErrors );
153 Gia_ManConst0(pAdd)->Value = 0;
160 pObj->
Value = Gia_ManAppendCi(pBase);
165 assert( Gia_ManCiNum(pBase) == Gia_ManCiNum(pAdd) );
167 pObj->
Value = Gia_Obj2Lit( pBase, Gia_ManCi(pBase, i) );
178 if ( Gia_ObjRefNumId(pBase, Id) == 0 )
179 Gia_ManAppendCo( pBase, Abc_Var2Lit(Id,0) );
184 Vec_Int_t * vMapNew = Vec_IntStartFull( Gia_ManObjNum(pAdd) );
186 Vec_IntWriteEntry( vMapNew, 0, 0 );
189 int iObjBase = Abc_Lit2Var(pObj->
Value);
190 Gia_Obj_t * pObjBase = Gia_ManObj( pBase, iObjBase );
191 int iObjRepr = Abc_Lit2Var(pObjBase->
Value);
192 Vec_IntWriteEntry( vMapNew, i, Abc_Var2Lit(iObjRepr, Gia_ObjPhase(pObj)) );
209 printf(
"Finished computing equivalent nodes. " );
210 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
215 for ( i = 0; i < nSize-1; i++ )
218 for ( j = i+1; j < nSize; j++ )
219 if ( Abc_Lit2LitL(pCostLits, pArray[j]) > Abc_Lit2LitL(pCostLits, pArray[best_i]) )
221 ABC_SWAP(
int, pArray[i], pArray[best_i] );
230 printf(
"Leaf literals and their classes:\n" );
233 if ( Vec_IntSize(vLevel) == 0 )
235 printf(
"Rank %2d : %2d ", i, Vec_IntSize(vLevel) );
237 printf(
"%s%d(%d) ", Abc_LitIsCompl(Entry) ?
"-":
"+", Abc_Lit2Var(Entry), Abc_Lit2LitL(pCostLits, Entry) );
242 vSupp = Vec_IntAlloc( 100 );
243 vTemp = Vec_WrdStart( Gia_ManObjNum(
p) );
248 if ( Vec_IntSize(vLevel) == 0 )
261 printf(
"Rank = %4d : ", i );
262 printf(
"Obj = %4d ", Abc_Lit2Var(Entry) );
263 if ( Vec_IntSize(vSupp) > 6 )
265 printf(
"Supp = %d.\n", Vec_IntSize(vSupp) );
268 vSupp->nSize = Abc_Tt6MinBase( &Truth, vSupp->pArray, vSupp->nSize );
269 if ( Vec_IntSize(vSupp) > 5 )
271 printf(
"Supp = %d.\n", Vec_IntSize(vSupp) );
275 if ( Vec_IntSize(vSupp) == 4 ) printf(
" " );
276 if ( Vec_IntSize(vSupp) == 3 ) printf(
" " );
277 if ( Vec_IntSize(vSupp) <= 2 ) printf(
" " );
279 Vec_IntPrint( vSupp );
283 Vec_IntFree( vSupp );
284 Vec_WrdFree( vTemp );
288 Vec_Wec_t * vRes = Vec_WecStart( Vec_WecSize(vLits) );
292 Vec_WecPush( vRes, i, Abc_Lit2LitL(Vec_IntArray(vMap), iLit) );
302 if ( i+Shift < 0 || i+Shift >= Vec_WecSize(vLits2) )
304 vLevel2 = Vec_WecEntry( vLits2, i+Shift );
305 nCommon += Vec_IntTwoFindCommonReverse( vLevel1, vLevel2, vRes );
313 for ( i = Vec_IntSize(vClasses)-1; i >= 0; i-- )
314 if ( Vec_IntEntry(vClasses,i) >= Class )
316 Vec_IntInsert( vLits, i+1, Lit );
317 Vec_IntInsert( vClasses, i+1, Class );
322 int i, k, Prev, This, Entry, Counter = 0;
325 if ( i == Vec_WecSize(vLits) - 1 )
327 vLevel2 = Vec_WecEntry(vClasses, i);
328 assert( Vec_IntSize(vLevel1) == Vec_IntSize(vLevel2) );
338 Entry = Vec_IntEntry( vLevel1, k );
340 Vec_IntDrop( vLevel1, k );
341 Vec_IntDrop( vLevel2, k-- );
343 Vec_IntDrop( vLevel1, k );
344 Vec_IntDrop( vLevel2, k-- );
346 Vec_IntInsertOrder( Vec_WecEntry(vLits, i+1), Vec_WecEntry(vClasses, i+1), Entry, This );
348 assert( Vec_IntSize(vLevel1) == Vec_IntSize(vLevel2) );
349 assert( Vec_IntSize(Vec_WecEntry(vLits, i+1)) == Vec_IntSize(Vec_WecEntry(vClasses, i+1)) );
353 printf(
"Moved %d pairs of PPs to normalize the matrix.\n", Counter );
363 if ( nCommonPlus >= nCommonMinus && nCommonPlus > nCommon )
365 Vec_WecInsertLevel( vLits0, 0 );
366 Vec_WecInsertLevel( vRoots0, 0 );
367 Vec_WecInsertLevel( vRes0, 0 );
368 printf(
"Shifted one level up.\n" );
370 else if ( nCommonMinus > nCommonPlus && nCommonMinus > nCommon )
372 Vec_WecInsertLevel( vLits1, 0 );
373 Vec_WecInsertLevel( vRoots1, 0 );
374 Vec_WecInsertLevel( vRes1, 0 );
375 printf(
"Shifted one level down.\n" );
391 Vec_WecFree( vRes0 );
392 Vec_WecFree( vRes1 );
404 Acec_MatchCheckShift( pBox0->pGia, pBox1->pGia, pBox0->vLeafLits, pBox1->vLeafLits, vMap0, vMap1, pBox0->vRootLits, pBox1->vRootLits );
414 assert( pBox0->vShared == NULL );
415 assert( pBox1->vShared == NULL );
416 pBox0->vShared = Vec_WecStart( Vec_WecSize(pBox0->vLeafLits) );
417 pBox1->vShared = Vec_WecStart( Vec_WecSize(pBox1->vLeafLits) );
418 pBox0->vUnique = Vec_WecStart( Vec_WecSize(pBox0->vLeafLits) );
419 pBox1->vUnique = Vec_WecStart( Vec_WecSize(pBox1->vLeafLits) );
420 nSize = Abc_MinInt( Vec_WecSize(pBox0->vLeafLits), Vec_WecSize(pBox1->vLeafLits) );
422 Vec_IntAppend( Vec_WecEntry(pBox0->vUnique, i), vLevel );
424 Vec_IntAppend( Vec_WecEntry(pBox1->vUnique, i), vLevel );
425 for ( i = 0; i < nSize; i++ )
427 Vec_Int_t * vShared0 = Vec_WecEntry( pBox0->vShared, i );
428 Vec_Int_t * vShared1 = Vec_WecEntry( pBox1->vShared, i );
429 Vec_Int_t * vUnique0 = Vec_WecEntry( pBox0->vUnique, i );
430 Vec_Int_t * vUnique1 = Vec_WecEntry( pBox1->vUnique, i );
432 Vec_Int_t * vLevel0 = Vec_WecEntry( pBox0->vLeafLits, i );
433 Vec_Int_t * vLevel1 = Vec_WecEntry( pBox1->vLeafLits, i );
434 int * pBeg0 = Vec_IntArray(vLevel0);
435 int * pBeg1 = Vec_IntArray(vLevel1);
436 int * pEnd0 = Vec_IntLimit(vLevel0);
437 int * pEnd1 = Vec_IntLimit(vLevel1);
438 while ( pBeg0 < pEnd0 && pBeg1 < pEnd1 )
440 int Entry0 = Abc_Lit2LitL( Vec_IntArray(vMap0), *pBeg0 );
441 int Entry1 = Abc_Lit2LitL( Vec_IntArray(vMap1), *pBeg1 );
442 assert( *pBeg0 && *pBeg1 );
443 if ( Entry0 == Entry1 )
445 Vec_IntPush( vShared0, *pBeg0++ );
446 Vec_IntPush( vShared1, *pBeg1++ );
448 else if ( Entry0 > Entry1 )
449 Vec_IntPush( vUnique0, *pBeg0++ );
451 Vec_IntPush( vUnique1, *pBeg1++ );
453 while ( pBeg0 < pEnd0 )
454 Vec_IntPush( vUnique0, *pBeg0++ );
455 while ( pBeg1 < pEnd1 )
456 Vec_IntPush( vUnique1, *pBeg1++ );
457 assert( Vec_IntSize(vShared0) == Vec_IntSize(vShared1) );
458 assert( Vec_IntSize(vShared0) + Vec_IntSize(vUnique0) == Vec_IntSize(vLevel0) );
459 assert( Vec_IntSize(vShared1) + Vec_IntSize(vUnique1) == Vec_IntSize(vLevel1) );
461 nTotal = Vec_WecSizeSize(pBox0->vShared);
462 printf(
"Box0: Matched %d entries out of %d.\n",
nTotal, Vec_WecSizeSize(pBox0->vLeafLits) );
463 printf(
"Box1: Matched %d entries out of %d.\n",
nTotal, Vec_WecSizeSize(pBox1->vLeafLits) );
472 Vec_IntFree( vMap0 );
473 Vec_IntFree( vMap1 );
493 Gia_Man_t * pGia0n = pGia0, * pGia1n = pGia1;
503 if ( pBox0 == NULL || pBox1 == NULL )
504 printf(
"Cannot find arithmetic boxes in both LHS and RHS. Trying regular CEC.\n" );
506 printf(
"Cannot match arithmetic boxes in LHS and RHS. Trying regular CEC.\n" );
511 printf(
"Matching of adder trees in LHS and RHS succeeded. " );
512 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
514 Gia_ManPatchCoDriver( pGia0n, Gia_ManCoNum(pGia0n)-1, 0 );
515 Gia_ManPatchCoDriver( pGia1n, Gia_ManCoNum(pGia1n)-1, 0 );
517 Gia_ManPatchCoDriver( pGia0n, Gia_ManCoNum(pGia0n)-2, 0 );
518 Gia_ManPatchCoDriver( pGia1n, Gia_ManCoNum(pGia1n)-2, 0 );
522 pCecPars->
nBTLimit = pPars->nBTLimit;
529 Abc_Print( 0,
"The verification miter is written into file \"%s\".\n",
"acec_miter.aig" );
537 printf(
"Miter computation has failed.\n" );
538 if ( pGia0n != pGia0 )
540 if ( pGia1n != pGia1 )
#define ABC_SWAP(Type, a, b)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Vec_Int_t * Acec_CountRemap(Gia_Man_t *pAdd, Gia_Man_t *pBase)
void Vec_IntInsertOrder(Vec_Int_t *vLits, Vec_Int_t *vClasses, int Lit, int Class)
void Acec_ManCecSetDefaultParams(Acec_ParCec_t *p)
FUNCTION DEFINITIONS ///.
void Acec_CommonFinish(Gia_Man_t *pBase)
void Acec_MatchCheckShift(Gia_Man_t *pGia0, Gia_Man_t *pGia1, Vec_Wec_t *vLits0, Vec_Wec_t *vLits1, Vec_Int_t *vMap0, Vec_Int_t *vMap1, Vec_Wec_t *vRoots0, Vec_Wec_t *vRoots1)
void Acec_MatchPrintEquivLits(Gia_Man_t *p, Vec_Wec_t *vLits, int *pCostLits, int fVerbose)
Gia_Man_t * Acec_CommonStart(Gia_Man_t *pBase, Gia_Man_t *pAdd)
int Acec_MatchCountCommon(Vec_Wec_t *vLits1, Vec_Wec_t *vLits2, int Shift)
void Acec_MoveDuplicates(Vec_Wec_t *vLits, Vec_Wec_t *vClasses)
int Acec_Solve(Gia_Man_t *pGia0, Gia_Man_t *pGia1, Acec_ParCec_t *pPars)
Vec_Wec_t * Acec_MatchCopy(Vec_Wec_t *vLits, Vec_Int_t *vMap)
void Acec_VerifyClasses(Gia_Man_t *p, Vec_Wec_t *vLits, Vec_Wec_t *vReprs)
void Acec_MatchBoxesSort(int *pArray, int nSize, int *pCostLits)
int Acec_MatchBoxes(Acec_Box_t *pBox0, Acec_Box_t *pBox1)
#define TRUTH_UNUSED
DECLARATIONS ///.
void Acec_ComputeEquivClasses(Gia_Man_t *pOne, Gia_Man_t *pTwo, Vec_Int_t **pvMap1, Vec_Int_t **pvMap2)
Gia_Man_t * Acec_InsertBox(Acec_Box_t *pBox, int fAll)
typedefABC_NAMESPACE_HEADER_START struct Acec_Box_t_ Acec_Box_t
INCLUDES ///.
Acec_Box_t * Acec_ProduceBox(Gia_Man_t *p, int fVerbose)
void Acec_BoxFreeP(Acec_Box_t **ppBox)
typedefABC_NAMESPACE_HEADER_START struct Acec_ParCec_t_ Acec_ParCec_t
INCLUDES ///.
int nTotal
DECLARATIONS ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Cec_ManCecSetDefaultParams(Cec_ParCec_t *p)
struct Cec_ParCec_t_ Cec_ParCec_t
int Cec_ManVerify(Gia_Man_t *p, Cec_ParCec_t *pPars)
MACRO DEFINITIONS ///.
void Extra_PrintHex(FILE *pFile, unsigned *pTruth, int nVars)
void Gia_ManStop(Gia_Man_t *p)
#define Gia_ManForEachAnd(p, pObj, i)
#define Gia_ManForEachCand(p, pObj, i)
void Gia_ManHashAlloc(Gia_Man_t *p)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
struct Gia_Obj_t_ Gia_Obj_t
void Gia_ManFillValue(Gia_Man_t *p)
struct Gia_Man_t_ Gia_Man_t
Gia_Man_t * Gia_ManComputeGiaEquivs(Gia_Man_t *pGia, int nConfs, int fVerbose)
void Gia_ManCreateRefs(Gia_Man_t *p)
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
word Gia_ObjComputeTruth6Cis(Gia_Man_t *p, int iLit, Vec_Int_t *vSupp, Vec_Wrd_t *vTemp)
Gia_Man_t * Gia_ManMiter(Gia_Man_t *pAig0, Gia_Man_t *pAig1, int nInsDup, int fDualOut, int fSeq, int fImplic, int fVerbose)
#define Gia_ManForEachCi(p, pObj, i)
void Gia_ManSetPhase(Gia_Man_t *p)
#define Gia_ManForEachAndId(p, i)
void Gia_AigerWrite(Gia_Man_t *p, char *pFileName, int fWriteSymbols, int fCompact, int fWriteNewLine)
unsigned __int64 word
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
#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 ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
#define Vec_WecForEachLevelStart(vGlob, vVec, i, LevelStart)
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.