68 p->vClasses = Vec_PtrAlloc( 100 );
69 p->vClasses1 = Vec_PtrAlloc( 100 );
70 p->vClassesTemp = Vec_PtrAlloc( 100 );
71 p->vClassOld = Vec_PtrAlloc( 100 );
72 p->vClassNew = Vec_PtrAlloc( 100 );
94 if (
p->vClassesTemp ) Vec_PtrFree(
p->vClassesTemp );
95 if (
p->vClassNew ) Vec_PtrFree(
p->vClassNew );
96 if (
p->vClassOld ) Vec_PtrFree(
p->vClassOld );
97 if (
p->vClasses1 ) Vec_PtrFree(
p->vClasses1 );
98 if (
p->vClasses ) Vec_PtrFree(
p->vClasses );
99 if (
p->vImps ) Vec_IntFree(
p->vImps );
120 if ( Vec_PtrSize(
p->vClasses1) == 0 && Vec_PtrSize(
p->vClasses) == 0 )
124 if (
p->pAig->pReprs[i] != NULL )
125 printf(
"Classes are not cleared!\n" );
126 assert(
p->pAig->pReprs[i] == NULL );
131 p->pAig->pReprs[pObj->
Id] = NULL;
149 for ( i = 0; (pTemp = pClass[i]); i++ );
167 int i, nNodes, nLits = 0;
168 nLits = Vec_PtrSize(
p->vClasses1 );
192 int i, nNodes, nPairs = 0;
197 nPairs += nNodes * (nNodes - 1) / 2;
217 for ( i = 1; (pTemp = pClass[i]); i++ )
218 assert( Fra_ClassObjRepr(pTemp) == pClass[0] );
220 for ( i = 0; (pTemp = pClass[i]); i++ )
242 printf(
"Const = %5d. Class = %5d. Lit = %5d. ",
244 if (
p->vImps && Vec_IntSize(
p->vImps) > 0 )
245 printf(
"Imp = %5d. ", Vec_IntSize(
p->vImps) );
251 assert( Fra_ClassObjRepr(pObj) == Aig_ManConst1(
p->pAig) );
252 printf(
"Constants { " );
280 int i, k, nTableSize, nEntries, nNodes, iEntry;
283 nTableSize = Abc_PrimeCudd( Aig_ManObjNumMax(
p->pAig) );
289 Vec_PtrClear(
p->vClasses1 );
294 if ( !Aig_ObjIsCi(pObj) )
299 if ( !Aig_ObjIsNode(pObj) && !Aig_ObjIsCi(pObj) )
302 if ( nMaxLevs && (
int)pObj->
Level > nMaxLevs )
306 iEntry =
p->pFuncNodeHash( pObj, nTableSize );
308 if (
p->pFuncNodeIsConst( pObj ) )
310 Vec_PtrPush(
p->vClasses1, pObj );
311 Fra_ClassObjSetRepr( pObj, Aig_ManConst1(
p->pAig) );
315 if ( ppTable[iEntry] == NULL )
317 ppTable[iEntry] = pObj;
318 Fra_ObjSetNext( ppNexts, pObj, pObj );
322 Fra_ObjSetNext( ppNexts, pObj, Fra_ObjNext(ppNexts,ppTable[iEntry]) );
323 Fra_ObjSetNext( ppNexts, ppTable[iEntry], pObj );
330 for ( i = 0; i < nTableSize; i++ )
331 if ( ppTable[i] && ppTable[i] != Fra_ObjNext(ppNexts, ppTable[i]) )
333 for ( pTemp = Fra_ObjNext(ppNexts, ppTable[i]), k = 1;
335 pTemp = Fra_ObjNext(ppNexts, pTemp), k++ );
339 assert( ppTable[i]->fMarkA == 0 );
345 p->pMemClassesFree =
p->pMemClasses + 2*nEntries;
348 Vec_PtrClear(
p->vClasses );
352 if ( !Aig_ObjIsNode(pObj) && !Aig_ObjIsCi(pObj) )
359 Vec_PtrPush(
p->vClasses,
p->pMemClasses + 2*nEntries );
361 for ( pTemp = Fra_ObjNext(ppNexts, pObj), k = 1;
363 pTemp = Fra_ObjNext(ppNexts, pTemp), k++ );
367 p->pMemClasses[2*nEntries] = pObj;
368 for ( pTemp = Fra_ObjNext(ppNexts, pObj), k = 1;
370 pTemp = Fra_ObjNext(ppNexts, pTemp), k++ )
372 p->pMemClasses[2*nEntries+nNodes-k] = pTemp;
373 Fra_ClassObjSetRepr( pTemp, pObj );
376 p->pMemClasses[2*nEntries + nNodes] = NULL;
402 assert( ppClass[0] != NULL && ppClass[1] != NULL );
405 for ( ppThis = ppClass + 1; (pObj = *ppThis); ppThis++ )
406 if ( !
p->pFuncNodesAreEqual(ppClass[0], pObj) )
411 Vec_PtrClear(
p->vClassOld );
412 Vec_PtrClear(
p->vClassNew );
413 Vec_PtrPush(
p->vClassOld, ppClass[0] );
414 for ( ppThis = ppClass + 1; (pObj = *ppThis); ppThis++ )
415 if (
p->pFuncNodesAreEqual(ppClass[0], pObj) )
416 Vec_PtrPush(
p->vClassOld, pObj );
418 Vec_PtrPush(
p->vClassNew, pObj );
432 ppClass[Vec_PtrSize(
p->vClassOld)+i] = NULL;
433 Fra_ClassObjSetRepr( pObj, i? ppClass[0] : NULL );
435 ppClass += 2*Vec_PtrSize(
p->vClassOld);
440 ppClass[Vec_PtrSize(
p->vClassNew)+i] = NULL;
441 Fra_ClassObjSetRepr( pObj, i? ppClass[0] : NULL );
461 pClass = (
Aig_Obj_t **)Vec_PtrEntryLast( vClasses );
465 if ( pClass[1] == NULL )
466 Vec_PtrPop( vClasses );
468 if ( pClass2[1] == NULL )
474 assert( pClass2[0] != NULL );
475 Vec_PtrPush( vClasses, pClass2 );
500 Vec_PtrClear(
p->vClassesTemp );
504 assert( pClass[0] != NULL );
505 Vec_PtrPush(
p->vClassesTemp, pClass );
510 vTemp =
p->vClassesTemp;
511 p->vClassesTemp =
p->vClasses;
530 int i, k, nRefis = 1;
532 if ( Vec_PtrSize(
p->vClasses1) == 0 )
535 assert( Vec_PtrEntry(
p->vClasses1,0) != Aig_ManConst1(
p->pAig) );
538 Vec_PtrClear(
p->vClassNew );
541 if (
p->pFuncNodeIsConst( pObj ) )
542 Vec_PtrWriteEntry(
p->vClasses1, k++, pObj );
544 Vec_PtrPush(
p->vClassNew, pObj );
546 Vec_PtrShrink(
p->vClasses1, k );
547 if ( Vec_PtrSize(
p->vClassNew) == 0 )
555 if ( Vec_PtrSize(
p->vClassNew) == 1 )
557 Fra_ClassObjSetRepr( (
Aig_Obj_t *)Vec_PtrEntry(
p->vClassNew,0), NULL );
561 ppClass =
p->pMemClassesFree;
562 p->pMemClassesFree += 2 * Vec_PtrSize(
p->vClassNew);
566 ppClass[Vec_PtrSize(
p->vClassNew)+i] = NULL;
567 Fra_ClassObjSetRepr( pObj, i? ppClass[0] : NULL );
569 assert( ppClass[0] != NULL );
570 Vec_PtrPush(
p->vClasses, ppClass );
572 if ( fRefineNewClass )
594 pClass =
p->pMemClasses;
596 pClass[0] = Aig_ManObj(
p->pAig, Id1 );
597 pClass[1] = Aig_ManObj(
p->pAig, Id2 );
600 Fra_ClassObjSetRepr( pClass[1], pClass[0] );
601 Vec_PtrPush(
p->vClasses, pClass );
619 Vec_PtrClear(
p->pCla->vClasses1 );
622 Vec_PtrPush(
p->pCla->vClasses1, pObj );
623 Fra_ClassObjSetRepr( pObj, Aig_ManConst1(
p->pManAig) );
626 p->pCla->pMemClasses =
ABC_ALLOC(
Aig_Obj_t *, 2*(nEntries + Vec_PtrSize(
p->pCla->vClasses1)) );
627 p->pCla->pMemClassesFree =
p->pCla->pMemClasses + 2*nEntries;
646 int * pWeights, WeightMax = 0, i, k, c;
650 pWeights =
ABC_ALLOC(
int, Aig_ManObjNumMax(
p->pAig) );
651 memset( pWeights, 0,
sizeof(
int) * Aig_ManObjNumMax(
p->pAig) );
654 pRepr = Fra_ClassObjRepr( pObj );
658 WeightMax = Abc_MaxInt( WeightMax, pWeights[i] );
661 printf(
"Before: Const = %6d. Class = %6d. ", Vec_PtrSize(
p->vClasses1), Vec_PtrSize(
p->vClasses) );
666 if ( pWeights[pObj->
Id] >= WeightMax/Ratio )
667 Vec_PtrWriteEntry(
p->vClasses1, k++, pObj );
669 Fra_ClassObjSetRepr( pObj, NULL );
671 Vec_PtrShrink(
p->vClasses1, k );
676 for ( c = 1; ppClass[c]; c++ )
678 if ( pWeights[ppClass[c]->Id] >= WeightMax/Ratio )
679 ppClass[k++] = ppClass[c];
681 Fra_ClassObjSetRepr( ppClass[c], NULL );
688 if ( ppClass[1] != NULL )
689 Vec_PtrWriteEntry(
p->vClasses, k++, ppClass );
690 Vec_PtrShrink(
p->vClasses, k );
691 printf(
"After: Const = %6d. Class = %6d. \n", Vec_PtrSize(
p->vClasses1), Vec_PtrSize(
p->vClasses) );
709 int i, c, cMinSupp, nSuppSizeMin, nSuppSizeCur;
717 for ( c = 0; pClass[c]; c++ )
721 if ( nSuppSizeMin > nSuppSizeCur ||
722 (nSuppSizeMin == nSuppSizeCur && pNodeMin->
Level > pClass[c]->
Level) )
724 nSuppSizeMin = nSuppSizeCur;
725 pNodeMin = pClass[c];
733 pClass[cMinSupp] = pClass[0];
734 pClass[0] = pNodeMin;
736 for ( c = 0; pClass[c]; c++ )
737 Fra_ClassObjSetRepr( pClass[c], c? pClass[0] : NULL );
746static inline Aig_Obj_t * Fra_ObjChild0Equ(
Aig_Obj_t ** ppEquivs,
Aig_Obj_t * pObj ) {
return Aig_NotCond(Fra_ObjEqu(ppEquivs,Aig_ObjFanin0(pObj)), Aig_ObjFaninC0(pObj)); }
747static inline Aig_Obj_t * Fra_ObjChild1Equ(
Aig_Obj_t ** ppEquivs,
Aig_Obj_t * pObj ) {
return Aig_NotCond(Fra_ObjEqu(ppEquivs,Aig_ObjFanin1(pObj)), Aig_ObjFaninC1(pObj)); }
762 Aig_Obj_t * pObjNew, * pObjRepr, * pObjReprNew, * pMiter;
764 if ( (pObjRepr = Fra_ClassObjRepr(pObj)) == NULL )
768 pObjNew = Fra_ObjEqu( ppEquivs, pObj );
770 pObjReprNew = Fra_ObjEqu( ppEquivs, pObjRepr );
772 if ( Aig_Regular(pObjNew) == Aig_Regular(pObjReprNew) )
779 pMiter =
Aig_Exor( pManFraig, Aig_Regular(pObjNew), Aig_Regular(pObjReprNew) );
780 pMiter = Aig_NotCond( pMiter, Aig_Regular(pMiter)->fPhase ^ Aig_IsComplement(pMiter) );
781 pMiter = Aig_Not( pMiter );
801 int i, k, f, nFramesAll = nFramesK + 1;
802 assert( Aig_ManRegNum(
p->pAig) > 0 );
803 assert( Aig_ManRegNum(
p->pAig) < Aig_ManCiNum(
p->pAig) );
806 pManFraig =
Aig_ManStart( Aig_ManObjNumMax(
p->pAig) * nFramesAll );
807 pManFraig->pName = Abc_UtilStrsav(
p->pAig->pName );
808 pManFraig->pSpec = Abc_UtilStrsav(
p->pAig->pSpec );
811 Fra_ObjSetEqu( ppEquivs, Aig_ManConst1(
p->pAig), Aig_ManConst1(pManFraig) );
817 for ( f = 0; f < nFramesAll; f++ )
824 Fra_ClassesDeriveNode( pManFraig, pObj, ppEquivs );
828 pObjNew =
Aig_And( pManFraig, Fra_ObjChild0Equ(ppEquivs, pObj), Fra_ObjChild1Equ(ppEquivs, pObj) );
829 Fra_ObjSetEqu( ppEquivs, pObj, pObjNew );
830 Fra_ClassesDeriveNode( pManFraig, pObj, ppEquivs );
832 if ( f == nFramesAll - 1 )
834 if ( f == nFramesAll - 2 )
835 pManFraig->nAsserts = Aig_ManCoNum(pManFraig);
839 pLatches[k++] = Fra_ObjChild0Equ( ppEquivs, pObj );
843 Fra_ObjSetEqu( ppEquivs, pObj, pLatches[k++] );
848 assert( Aig_ManCoNum(pManFraig) % nFramesAll == 0 );
849printf(
"Assert miters = %6d. Output miters = %6d.\n",
850 pManFraig->nAsserts, Aig_ManCoNum(pManFraig) - pManFraig->nAsserts );
#define ABC_FALLOC(type, num)
#define ABC_ALLOC(type, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManReprStart(Aig_Man_t *p, int nIdMax)
DECLARATIONS ///.
#define Aig_ManForEachObj(p, pObj, i)
#define Aig_ManForEachLiSeq(p, pObj, i)
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
int Aig_SupportSize(Aig_Man_t *p, Aig_Obj_t *pObj)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Obj_t * Aig_Exor(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
#define Aig_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
#define Aig_ManForEachPiSeq(p, pObj, i)
SEQUENTIAL ITERATORS ///.
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachLoSeq(p, pObj, i)
int Fra_ClassesRefine1(Fra_Cla_t *p, int fRefineNewClass, int *pSkipped)
void Fra_ClassesCopyReprs(Fra_Cla_t *p, Vec_Ptr_t *vFailed)
Fra_Cla_t * Fra_ClassesStart(Aig_Man_t *pAig)
FUNCTION DEFINITIONS ///.
Aig_Man_t * Fra_ClassesDeriveAig(Fra_Cla_t *p, int nFramesK)
void Fra_ClassesTest(Fra_Cla_t *p, int Id1, int Id2)
void Fra_ClassesStop(Fra_Cla_t *p)
void Fra_ClassesPrepare(Fra_Cla_t *p, int fLatchCorr, int nMaxLevs)
void Fra_PrintClass(Fra_Cla_t *p, Aig_Obj_t **pClass)
int Fra_ClassesRefine(Fra_Cla_t *p)
int Fra_ClassesCountLits(Fra_Cla_t *p)
void Fra_ClassesPostprocess(Fra_Cla_t *p)
void Fra_ClassesLatchCorr(Fra_Man_t *p)
Aig_Obj_t ** Fra_RefineClassOne(Fra_Cla_t *p, Aig_Obj_t **ppClass)
void Fra_ClassesSelectRepr(Fra_Cla_t *p)
int Fra_RefineClassLastIter(Fra_Cla_t *p, Vec_Ptr_t *vClasses)
int Fra_ClassesCountPairs(Fra_Cla_t *p)
void Fra_ClassesPrint(Fra_Cla_t *p, int fVeryVerbose)
int Fra_ClassCount(Aig_Obj_t **pClass)
int Fra_SmlNodeIsConst(Aig_Obj_t *pObj)
void Fra_SmlStop(Fra_Sml_t *p)
struct Fra_Man_t_ Fra_Man_t
int Fra_SmlNodeNotEquWeight(Fra_Sml_t *p, int Left, int Right)
int Fra_ClassesCountLits(Fra_Cla_t *p)
struct Fra_Sml_t_ Fra_Sml_t
Fra_Sml_t * Fra_SmlSimulateComb(Aig_Man_t *pAig, int nWords, int fCheckMiter)
int Fra_SmlNodesAreEqual(Aig_Obj_t *pObj0, Aig_Obj_t *pObj1)
int Fra_SmlNodeHash(Aig_Obj_t *pObj, int nTableSize)
DECLARATIONS ///.
struct Fra_Cla_t_ Fra_Cla_t
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.