69#define Ssw_ManForEachClass( p, ppClass, i ) \
70 for ( i = 0; i < Aig_ManObjNumMax(p->pAig); i++ ) \
71 if ( ((ppClass) = p->pId2Class[i]) == NULL ) {} else
73#define Ssw_ClassForEachNode( p, pRepr, pNode, i ) \
74 for ( i = 0; i < p->pClassSizes[pRepr->Id]; i++ ) \
75 if ( ((pNode) = p->pId2Class[pRepr->Id][i]) == NULL ) {} else
94 assert(
p->pId2Class[pRepr->
Id] == NULL );
95 assert( pClass[0] == pRepr );
96 p->pId2Class[pRepr->
Id] = pClass;
99 p->pClassSizes[pRepr->
Id] = nSize;
101 p->nLits += nSize - 1;
120 p->pId2Class[pRepr->
Id] = NULL;
121 nSize =
p->pClassSizes[pRepr->
Id];
124 p->nLits -= nSize - 1;
125 p->pClassSizes[pRepr->
Id] = 0;
147 p->pClassSizes =
ABC_CALLOC(
int, Aig_ManObjNumMax(pAig) );
148 p->vClassOld = Vec_PtrAlloc( 100 );
149 p->vClassNew = Vec_PtrAlloc( 100 );
150 p->vRefined = Vec_PtrAlloc( 1000 );
151 if ( pAig->pReprs == NULL )
168 unsigned (*pFuncNodeHash)(
void *,
Aig_Obj_t *),
169 int (*pFuncNodeIsConst)(
void *,
Aig_Obj_t *),
172 p->pManData = pManData;
173 p->pFuncNodeHash = pFuncNodeHash;
174 p->pFuncNodeIsConst = pFuncNodeIsConst;
175 p->pFuncNodesAreEqual = pFuncNodesAreEqual;
191 if (
p->vClassNew ) Vec_PtrFree(
p->vClassNew );
192 if (
p->vClassOld ) Vec_PtrFree(
p->vClassOld );
193 Vec_PtrFree(
p->vRefined );
245 Vec_PtrClear(
p->vRefined );
309 if (
p->pId2Class[pRepr->
Id] == NULL )
311 assert(
p->pId2Class[pRepr->
Id] != NULL );
313 *pnSize =
p->pClassSizes[pRepr->
Id];
314 return p->pId2Class[pRepr->
Id];
331 Vec_PtrClear( vClass );
332 if (
p->pId2Class[pRepr->
Id] == NULL )
335 for ( i = 1; i <
p->pClassSizes[pRepr->
Id]; i++ )
336 Vec_PtrPush( vClass,
p->pId2Class[pRepr->
Id][i] );
353 int i, k, nLits, nClasses, nCands1;
354 nClasses = nLits = 0;
358 assert(
p->pClassSizes[ppClass[0]->
Id] >= 2 );
362 assert( Aig_ObjRepr(
p->pAig, pObj) == NULL );
365 assert( Aig_ObjRepr(
p->pAig, pObj) == ppClass[0] );
375 nCands1 += Ssw_ObjIsConst1Cand(
p->pAig, pObj );
377 assert(
p->nCands1 == nCands1 );
378 assert(
p->nClasses == nClasses );
396 Abc_Print( 1,
"{ " );
398 Abc_Print( 1,
"%d(%d,%d,%d) ", pObj->
Id, pObj->
Level,
400 Abc_Print( 1,
"}\n" );
419 Abc_Print( 1,
"Equiv classes: Const1 = %5d. Class = %5d. Lit = %5d.\n",
420 p->nCands1,
p->nClasses,
p->nCands1+
p->nLits );
423 Abc_Print( 1,
"Constants { " );
425 if ( Ssw_ObjIsConst1Cand(
p->pAig, pObj ) )
426 Abc_Print( 1,
"%d(%d,%d,%d) ", pObj->
Id, pObj->
Level,
428 Abc_Print( 1,
"}\n" );
431 Abc_Print( 1,
"%3d (%3d) : ", i,
p->pClassSizes[i] );
434 Abc_Print( 1,
"\n" );
452 assert(
p->pId2Class[pObj->
Id] == NULL );
453 pRepr = Aig_ObjRepr(
p->pAig, pObj );
456 if ( Ssw_ObjIsConst1Cand(
p->pAig, pObj ) )
458 assert(
p->pClassSizes[pRepr->
Id] == 0 );
459 assert(
p->pId2Class[pRepr->
Id] == NULL );
460 Aig_ObjSetRepr(
p->pAig, pObj, NULL );
465 Aig_ObjSetRepr(
p->pAig, pObj, NULL );
466 assert(
p->pId2Class[pRepr->
Id][0] == pRepr );
467 assert(
p->pClassSizes[pRepr->
Id] >= 2 );
468 if (
p->pClassSizes[pRepr->
Id] == 2 )
470 p->pId2Class[pRepr->
Id] = NULL;
472 p->pClassSizes[pRepr->
Id] = 0;
481 p->pId2Class[pRepr->
Id][k++] = pTemp;
482 assert( k + 1 ==
p->pClassSizes[pRepr->
Id] );
484 p->pClassSizes[pRepr->
Id]--;
503 Aig_Obj_t ** ppTable, ** ppNexts, ** ppClassNew;
505 int i, k, nTableSize, nNodes, iEntry, nEntries, nEntries2;
508 nTableSize = Abc_PrimeCudd( Vec_PtrSize(vCands)/2 );
518 Aig_ObjSetRepr(
p->pAig, pObj, NULL );
520 if (
p->pFuncNodeIsConst(
p->pManData, pObj ) )
522 Ssw_ObjSetConst1Cand(
p->pAig, pObj );
529 iEntry =
p->pFuncNodeHash(
p->pManData, pObj ) % nTableSize;
531 if ( ppTable[iEntry] == NULL )
533 ppTable[iEntry] = pObj;
538 pRepr = ppTable[iEntry];
539 Aig_ObjSetRepr(
p->pAig, pObj, pRepr );
541 if ( Ssw_ObjNext( ppNexts, pRepr ) == NULL )
543 p->pClassSizes[pRepr->
Id]++;
547 Ssw_ObjSetNext( ppNexts, pObj, Ssw_ObjNext( ppNexts, pRepr ) );
548 Ssw_ObjSetNext( ppNexts, pRepr, pObj );
549 p->pClassSizes[pRepr->
Id]++;
558 nNodes =
p->pClassSizes[pObj->
Id];
564 ppClassNew =
p->pMemClassesFree + nEntries2;
565 ppClassNew[0] = pObj;
566 for ( pTemp = Ssw_ObjNext(ppNexts, pObj), k = 1; pTemp;
567 pTemp = Ssw_ObjNext(ppNexts, pTemp), k++ )
569 ppClassNew[nNodes-k] = pTemp;
572 p->pClassSizes[pObj->
Id] = 0;
573 Ssw_ObjAddClass(
p, pObj, ppClassNew, nNodes );
577 p->pMemClassesFree += nEntries2;
578 assert( nEntries == nEntries2 );
606 int nFrames = Abc_MaxInt( nFramesK, 4 );
618 p->fConstCorr = fConstCorr;
625 Abc_Print( 1,
"Allocated %.2f MB to store simulation information.\n",
626 1.0*(
sizeof(
unsigned) * Aig_ManObjNumMax(pAig) * nFrames *
nWords)/(1<<20) );
627 Abc_Print( 1,
"Initial simulation of %d frames with %d words. ", nFrames,
nWords );
628 ABC_PRT(
"Time", Abc_Clock() - clk );
636 vCands = Vec_PtrAlloc( 1000 );
641 if ( !Saig_ObjIsLo(
p->pAig, pObj) )
646 if ( !Aig_ObjIsNode(pObj) && !Aig_ObjIsCi(pObj) )
649 if ( nMaxLevs && (
int)pObj->
Level > nMaxLevs )
652 Vec_PtrPush( vCands, pObj );
658 Vec_PtrClear( vCands );
662 if ( Aig_ObjIsCand(Aig_ObjFanin0(pObj)) )
663 Aig_ObjFanin0(pObj)->fMarkB = 1;
666 Vec_PtrPush( vCands, pObj );
673 p->pMemClassesFree =
p->pMemClasses;
679 Abc_Print( 1,
"Collecting candidate equivalence classes. " );
680ABC_PRT(
"Time", Abc_Clock() - clk );
685 for ( i = 1; i < nIters; i++ )
688 Vec_PtrClear( vCands );
690 if ( Ssw_ObjIsConst1Cand(
p->pAig, pObj ) )
691 Vec_PtrPush( vCands, pObj );
692 assert( Vec_PtrSize(vCands) ==
p->nCands1 );
701 Vec_PtrFree( vCands );
704 Abc_Print( 1,
"Simulation of %d frames with %d words (%2d rounds). ",
706 ABC_PRT(
"Time", Abc_Clock() - clk );
737 if ( !Saig_ObjIsLo(pAig, pObj) )
742 if ( !Aig_ObjIsNode(pObj) && !Saig_ObjIsLo(pAig, pObj) )
745 if ( nMaxLevs && (
int)pObj->
Level > nMaxLevs )
748 Ssw_ObjSetConst1Cand( pAig, pObj );
772 int * pClassSizes, nEntries, i;
781 if ( Ssw_ObjIsConst1Cand(pAig, pObj) )
786 if ( (pRepr = Aig_ObjRepr(pAig, pObj)) )
788 if (
p->pClassSizes[pRepr->
Id]++ == 0 )
789 p->pClassSizes[pRepr->
Id]++;
795 pClassSizes =
ABC_CALLOC(
int, Aig_ManObjNumMax(pAig) );
798 if (
p->pClassSizes[i] )
800 p->pId2Class[i] =
p->pMemClasses + nEntries;
801 nEntries +=
p->pClassSizes[i];
802 p->pId2Class[i][pClassSizes[i]++] = pObj;
806 if ( Ssw_ObjIsConst1Cand(pAig, pObj) )
808 if ( (pRepr = Aig_ObjRepr(pAig, pObj)) )
809 p->pId2Class[pRepr->
Id][pClassSizes[pRepr->
Id]++] = pObj;
811 p->pMemClassesFree =
p->pMemClasses + nEntries;
812 p->nLits = nEntries -
p->nClasses;
813 assert(
memcmp(pClassSizes,
p->pClassSizes,
sizeof(
int)*Aig_ManObjNumMax(pAig)) == 0 );
842 Ssw_ObjSetConst1Cand( pAig, Aig_ObjFanin0(pObj) );
867 int i, k, nTotalObjs, nEntries, Entry;
872 for ( i = 0; i < Aig_ManObjNumMax(pAig); i++ )
873 nTotalObjs += pvClasses[i] ? Vec_IntSize(pvClasses[i]) : 0;
880 assert( (i == 0) == (Entry == 0) );
883 pObj = Aig_ManObj( pAig, Entry );
884 Ssw_ObjSetConst1Cand( pAig, pObj );
889 for ( i = 1; i < Aig_ManObjNumMax(pAig); i++ )
891 if ( pvClasses[i] == NULL )
894 ppClassNew =
p->pMemClasses + nEntries;
895 nEntries += Vec_IntSize( pvClasses[i] );
897 pPrev = pRepr = Aig_ManObj( pAig, Vec_IntEntry(pvClasses[i],0) );
898 ppClassNew[0] = pRepr;
901 pObj = Aig_ManObj( pAig, Entry );
904 ppClassNew[k] = pObj;
905 Aig_ObjSetRepr( pAig, pObj, pRepr );
908 Ssw_ObjAddClass(
p, pRepr, ppClassNew, Vec_IntSize(pvClasses[i]) );
911 p->pMemClassesFree =
p->pMemClasses + nEntries;
939 for ( i = 0; i < Vec_IntSize(vPairs); i += 2 )
941 pRepr = Aig_ManObj( pMiter, Vec_IntEntry(vPairs, i) );
942 pObj = Aig_ManObj( pMiter, Vec_IntEntry(vPairs, i+1) );
943 assert( Aig_ObjId(pRepr) < Aig_ObjId(pObj) );
944 Aig_ObjSetRepr( pMiter, pObj, pRepr );
946 ppClassNew =
p->pMemClasses + i;
947 ppClassNew[0] = pRepr;
948 ppClassNew[1] = pObj;
950 Ssw_ObjAddClass(
p, pRepr, ppClassNew, 2 );
953 p->pMemClassesFree = NULL;
977 Vec_PtrClear(
p->vClassOld );
978 Vec_PtrClear(
p->vClassNew );
980 if (
p->pFuncNodesAreEqual(
p->pManData, pReprOld, pObj) )
981 Vec_PtrPush(
p->vClassOld, pObj );
983 Vec_PtrPush(
p->vClassNew, pObj );
985 if ( Vec_PtrSize(
p->vClassNew) == 0 )
992 pReprNew = (
Aig_Obj_t *)Vec_PtrEntry(
p->vClassNew, 0 );
993 assert( Vec_PtrSize(
p->vClassOld) > 0 );
994 assert( Vec_PtrSize(
p->vClassNew) > 0 );
997 pClassOld = Ssw_ObjRemoveClass(
p, pReprOld );
1000 pClassOld[i] = pObj;
1001 Aig_ObjSetRepr(
p->pAig, pObj, i? pReprOld : NULL );
1004 pClassNew = pClassOld + i;
1007 pClassNew[i] = pObj;
1008 Aig_ObjSetRepr(
p->pAig, pObj, i? pReprNew : NULL );
1012 if ( Vec_PtrSize(
p->vClassOld) > 1 )
1013 Ssw_ObjAddClass(
p, pReprOld, pClassOld, Vec_PtrSize(
p->vClassOld) );
1014 if ( Vec_PtrSize(
p->vClassNew) > 1 )
1015 Ssw_ObjAddClass(
p, pReprNew, pClassNew, Vec_PtrSize(
p->vClassNew) );
1018 if ( fRecursive && Vec_PtrSize(
p->vClassNew) > 1 )
1076 Aig_Obj_t * pObj, * pReprNew, ** ppClassNew;
1078 if ( Vec_PtrSize(vRoots) == 0 )
1081 Vec_PtrClear(
p->vClassNew );
1083 if ( !
p->pFuncNodeIsConst(
p->pManData, pObj ) )
1084 Vec_PtrPush(
p->vClassNew, pObj );
1086 if ( Vec_PtrSize(
p->vClassNew) == 0 )
1088 p->nCands1 -= Vec_PtrSize(
p->vClassNew);
1089 pReprNew = (
Aig_Obj_t *)Vec_PtrEntry(
p->vClassNew, 0 );
1090 Aig_ObjSetRepr(
p->pAig, pReprNew, NULL );
1091 if ( Vec_PtrSize(
p->vClassNew) == 1 )
1094 ppClassNew =
p->pMemClassesFree;
1095 p->pMemClassesFree += Vec_PtrSize(
p->vClassNew);
1098 ppClassNew[i] = pObj;
1099 Aig_ObjSetRepr(
p->pAig, pObj, i? pReprNew : NULL );
1101 Ssw_ObjAddClass(
p, pReprNew, ppClassNew, Vec_PtrSize(
p->vClassNew) );
1121 Aig_Obj_t * pObj, * pReprNew, ** ppClassNew;
1124 Vec_PtrClear(
p->vClassNew );
1125 for ( i = 0; i < Vec_PtrSize(
p->pAig->vObjs); i++ )
1126 if (
p->pAig->pReprs[i] == Aig_ManConst1(
p->pAig) )
1128 pObj = Aig_ManObj(
p->pAig, i );
1129 if ( !
p->pFuncNodeIsConst(
p->pManData, pObj ) )
1131 Vec_PtrPush(
p->vClassNew, pObj );
1136 if ( Vec_PtrSize(
p->vClassNew) == 0 )
1138 if (
p->fConstCorr )
1141 Aig_ObjSetRepr(
p->pAig, pObj, NULL );
1144 p->nCands1 -= Vec_PtrSize(
p->vClassNew);
1145 pReprNew = (
Aig_Obj_t *)Vec_PtrEntry(
p->vClassNew, 0 );
1146 Aig_ObjSetRepr(
p->pAig, pReprNew, NULL );
1147 if ( Vec_PtrSize(
p->vClassNew) == 1 )
1150 ppClassNew =
p->pMemClassesFree;
1151 p->pMemClassesFree += Vec_PtrSize(
p->vClassNew);
1154 ppClassNew[i] = pObj;
1155 Aig_ObjSetRepr(
p->pAig, pObj, i? pReprNew : NULL );
1157 Ssw_ObjAddClass(
p, pReprNew, ppClassNew, Vec_PtrSize(
p->vClassNew) );
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#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)
int Aig_SupportSize(Aig_Man_t *p, Aig_Obj_t *pObj)
struct Aig_Obj_t_ Aig_Obj_t
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_NodeMffcSupp(Aig_Man_t *p, Aig_Obj_t *pNode, int LevelMin, Vec_Ptr_t *vSupp)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define Saig_ManForEachPo(p, pObj, i)
#define Ssw_ManForEachClass(p, ppClass, i)
Aig_Obj_t ** Ssw_ClassesReadClass(Ssw_Cla_t *p, Aig_Obj_t *pRepr, int *pnSize)
Ssw_Cla_t * Ssw_ClassesPrepareFromReprs(Aig_Man_t *pAig)
int Ssw_ClassesPrepareRehash(Ssw_Cla_t *p, Vec_Ptr_t *vCands, int fConstCorr)
int Ssw_ClassesRefineConst1Group(Ssw_Cla_t *p, Vec_Ptr_t *vRoots, int fRecursive)
Ssw_Cla_t * Ssw_ClassesPreparePairsSimple(Aig_Man_t *pMiter, Vec_Int_t *vPairs)
Aig_Man_t * Ssw_ClassesReadAig(Ssw_Cla_t *p)
int Ssw_ClassesCand1Num(Ssw_Cla_t *p)
void Ssw_ClassesCheck(Ssw_Cla_t *p)
Ssw_Cla_t * Ssw_ClassesPreparePairs(Aig_Man_t *pAig, Vec_Int_t **pvClasses)
int Ssw_ClassesLitNum(Ssw_Cla_t *p)
void Ssw_ClassesClearRefined(Ssw_Cla_t *p)
Ssw_Cla_t * Ssw_ClassesPrepareSimple(Aig_Man_t *pAig, int fLatchCorr, int nMaxLevs)
int Ssw_ClassesRefineGroup(Ssw_Cla_t *p, Vec_Ptr_t *vReprs, int fRecursive)
int Ssw_ClassesRefineConst1(Ssw_Cla_t *p, int fRecursive)
void Ssw_ClassesCollectClass(Ssw_Cla_t *p, Aig_Obj_t *pRepr, Vec_Ptr_t *vClass)
Vec_Ptr_t * Ssw_ClassesGetRefined(Ssw_Cla_t *p)
int Ssw_ClassesClassNum(Ssw_Cla_t *p)
void Ssw_ClassesPrint(Ssw_Cla_t *p, int fVeryVerbose)
#define Ssw_ClassForEachNode(p, pRepr, pNode, i)
void Ssw_ClassesPrintOne(Ssw_Cla_t *p, Aig_Obj_t *pRepr)
Ssw_Cla_t * Ssw_ClassesStart(Aig_Man_t *pAig)
void Ssw_ClassesRemoveNode(Ssw_Cla_t *p, Aig_Obj_t *pObj)
Ssw_Cla_t * Ssw_ClassesPrepare(Aig_Man_t *pAig, int nFramesK, int fLatchCorr, int fConstCorr, int fOutputCorr, int nMaxLevs, int fVerbose)
void Ssw_ClassesSetData(Ssw_Cla_t *p, void *pManData, unsigned(*pFuncNodeHash)(void *, Aig_Obj_t *), int(*pFuncNodeIsConst)(void *, Aig_Obj_t *), int(*pFuncNodesAreEqual)(void *, Aig_Obj_t *, Aig_Obj_t *))
int Ssw_ClassesRefineOneClass(Ssw_Cla_t *p, Aig_Obj_t *pReprOld, int fRecursive)
void Ssw_ClassesStop(Ssw_Cla_t *p)
Ssw_Cla_t * Ssw_ClassesPrepareTargets(Aig_Man_t *pAig)
int Ssw_ClassesRefine(Ssw_Cla_t *p, int fRecursive)
struct Ssw_Cla_t_ Ssw_Cla_t
void Ssw_SmlResimulateSeq(Ssw_Sml_t *p)
unsigned Ssw_SmlObjHashWord(Ssw_Sml_t *p, Aig_Obj_t *pObj)
FUNCTION DEFINITIONS ///.
int Ssw_SmlObjIsConstWord(Ssw_Sml_t *p, Aig_Obj_t *pObj)
struct Ssw_Sml_t_ Ssw_Sml_t
int Ssw_SmlObjsAreEqualWord(Ssw_Sml_t *p, Aig_Obj_t *pObj0, Aig_Obj_t *pObj1)
Ssw_Sml_t * Ssw_SmlSimulateSeq(Aig_Man_t *pAig, int nPref, int nFrames, int nWords)
void Ssw_SmlStop(Ssw_Sml_t *p)
Aig_Obj_t ** pMemClassesFree
int(* pFuncNodeIsConst)(void *, Aig_Obj_t *)
int(* pFuncNodesAreEqual)(void *, Aig_Obj_t *, Aig_Obj_t *)
unsigned(* pFuncNodeHash)(void *, Aig_Obj_t *)
#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 ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.