88 assert( Aig_ManCiNum(p1) == Aig_ManCiNum(p2) );
89 assert( Aig_ManCoNum(p1) == Aig_ManCoNum(p2) );
90 pNew =
Aig_ManStart( Aig_ManObjNumMax(p1) + Aig_ManObjNumMax(p2) );
92 Aig_ManConst1(p1)->pData = Aig_ManConst1(pNew);
96 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
98 Aig_ManConst1(p2)->pData = Aig_ManConst1(pNew);
100 pObj->
pData = Aig_ManCi( pNew, i );
102 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
104 for ( i = 0; i < Aig_ManCoNum(p1); i++ )
151 Aig_Obj_t * pObjMan, * pObjMiter, * pObjRepr;
153 vId2Lit = Vec_IntAlloc( 0 );
154 Vec_IntFill( vId2Lit, Abc_NtkObjNumMax(pNtk), -1 );
158 if ( (pAnd = Abc_ObjRegular(pObj->
pCopy)) && Abc_ObjType(pAnd) !=
ABC_OBJ_NONE &&
163 pObjRepr = Aig_ObjRepr( pMiter, pObjMiter );
164 pObjRepr = pObjRepr? pObjRepr : pObjMiter;
166 Vec_IntWriteEntry( vId2Lit, i, Aig_ObjId(pObjRepr) );
187 ClassNumber = Vec_IntEntry( vClass2Num, Class );
188 assert( ClassNumber != 0 );
189 if ( ClassNumber > 0 )
190 return (
Vec_Int_t *)Vec_PtrEntry( vRes, ClassNumber );
192 Vec_IntWriteEntry( vClass2Num, Class, Vec_PtrSize(vRes) );
193 Vec_PtrPush( vRes, Vec_IntAlloc(4) );
194 return (
Vec_Int_t *)Vec_PtrEntryLast( vRes );
212 return (ObjId << 2) | (Abc_NtkObj(pNtk,ObjId)->fPhase << 1) | iNtk;
229 Vec_Int_t * vId2Lit1, * vId2Lit2, * vCounts0, * vCounts1, * vClassC, * vClass2Num;
232 vRes = Vec_PtrAlloc( 1000 );
240 vCounts0 = Vec_IntStart( Aig_ManObjNumMax(pMiter) );
243 Vec_IntAddToEntry( vCounts0, Class, 1 );
244 vCounts1 = Vec_IntStart( Aig_ManObjNumMax(pMiter) );
247 Vec_IntAddToEntry( vCounts1, Class, 1 );
249 vClassC = Vec_IntAlloc( 100 );
256 Vec_PtrPush( vRes, vClassC );
258 vClass2Num = Vec_IntAlloc( 0 );
259 Vec_IntFill( vClass2Num, Aig_ManObjNumMax(pMiter), -1 );
262 if ( Class > 0 && Vec_IntEntry(vCounts0, Class) && Vec_IntEntry(vCounts1, Class) )
265 if ( Class > 0 && Vec_IntEntry(vCounts0, Class) && Vec_IntEntry(vCounts1, Class) )
268 Vec_IntFree( vClass2Num );
269 Vec_IntFree( vCounts0 );
270 Vec_IntFree( vCounts1 );
271 Vec_IntFree( vId2Lit1 );
272 Vec_IntFree( vId2Lit2 );
297 pMiter->pReprs[k] = Aig_ManObj( pMiter, i );
323 assert( !Abc_NtkIsStrash(pNtk1) );
324 assert( !Abc_NtkIsStrash(pNtk2) );
334 pPars->nBTLimit = nConflictLimit;
335 pPars->fVerbose = fVerbose;
366 printf(
"Class %5d : ", i );
367 printf(
"Num =%5d ", Vec_IntSize(vClass) );
392 int NegAll[2] = {0}, PosAll[2] = {0}, PairsAll = 0, PairsOne = 0;
422 PairsAll += Abc_MinInt(Neg[0] +
Pos[0], Neg[1] +
Pos[1]);
423 PairsOne += Abc_MinInt(Neg[0], Neg[1]) + Abc_MinInt(
Pos[0],
Pos[1]);
425 printf(
"Total number of equiv classes = %7d.\n", Vec_PtrSize(vRes) );
426 printf(
"Participating nodes from both networks = %7d.\n", NegAll[0]+PosAll[0]+NegAll[1]+PosAll[1] );
427 printf(
"Participating nodes from the first network = %7d. (%7.2f %% of nodes)\n", NegAll[0]+PosAll[0], 100.0*(NegAll[0]+PosAll[0])/(nNodes0+1) );
428 printf(
"Participating nodes from the second network = %7d. (%7.2f %% of nodes)\n", NegAll[1]+PosAll[1], 100.0*(NegAll[1]+PosAll[1])/(nNodes1+1) );
429 printf(
"Node pairs (any polarity) = %7d. (%7.2f %% of names can be moved)\n", PairsAll, 100.0*PairsAll/(nNodes0+1) );
430 printf(
"Node pairs (same polarity) = %7d. (%7.2f %% of names can be moved)\n", PairsOne, 100.0*PairsOne/(nNodes0+1) );
431 ABC_PRT(
"Total runtime", Time );
449 int i, k, fComp0, fComp1, Entry;
450 int CounterInv = 0, Counter = 0;
454 pObj0 = pObj1 = NULL;
469 if ( pObj0 == NULL || pObj1 == NULL )
480 if ( fComp0 ^ fComp1 )
493 printf(
"Total number of names assigned = %5d. (Dir = %5d. Compl = %5d.)\n",
494 Counter + CounterInv, Counter, CounterInv );
int Abc_ObjDressMakeId(Abc_Ntk_t *pNtk, int ObjId, int iNtk)
int Abc_ObjEquivId2NtkId(int EquivId)
ABC_NAMESPACE_IMPL_START int Abc_ObjEquivId2ObjId(int EquivId)
Vec_Ptr_t * Abc_NtkDressComputeEquivs(Abc_Ntk_t *pNtk1, Abc_Ntk_t *pNtk2, int nConflictLimit, int fVerbose)
Aig_Man_t * Aig_ManCreateDualOutputMiter(Aig_Man_t *p1, Aig_Man_t *p2)
FUNCTION DEFINITIONS ///.
void Abc_NtkDress2(Abc_Ntk_t *pNtk1, Abc_Ntk_t *pNtk2, int nConflictLimit, int fVerbose)
void Dch_ComputeEquivalences(Aig_Man_t *pAig, Dch_Pars_t *pPars)
Aig_Man_t * Abc_NtkToDar(Abc_Ntk_t *pNtk, int fExors, int fRegisters)
DECLARATIONS ///.
Vec_Int_t * Abc_ObjDressClass(Vec_Ptr_t *vRes, Vec_Int_t *vClass2Num, int Class)
void Abc_NtkDress2Transfer(Abc_Ntk_t *pNtk0, Abc_Ntk_t *pNtk1, Vec_Ptr_t *vRes, int fVerbose)
int Abc_ObjEquivId2Polar(int EquivId)
void Abc_NtkDressPrintEquivs(Vec_Ptr_t *vRes)
Vec_Ptr_t * Abc_NtkDressMapIds(Aig_Man_t *pMiter, Abc_Ntk_t *pNtk1, Abc_Ntk_t *pNtk2)
void Abc_NtkDressMapSetPolarity(Abc_Ntk_t *pNtk)
void Dch_ComputeEquivalences2(Aig_Man_t *pMiter, Dch_Pars_t *pPars)
Vec_Int_t * Abc_NtkDressMapClasses(Aig_Man_t *pMiter, Abc_Ntk_t *pNtk)
void Abc_NtkDressPrintStats(Vec_Ptr_t *vRes, int nNodes0, int nNodes1, abctime Time)
struct Abc_Obj_t_ Abc_Obj_t
#define Abc_NtkForEachObj(pNtk, pObj, i)
ITERATORS ///.
struct Abc_Ntk_t_ Abc_Ntk_t
ABC_DLL char * Abc_ObjAssignName(Abc_Obj_t *pObj, char *pName, char *pSuffix)
ABC_DLL Abc_Ntk_t * Abc_NtkStrash(Abc_Ntk_t *pNtk, int fAllNodes, int fCleanup, int fRecord)
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
#define Abc_NtkForEachNode(pNtk, pNode, i)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManStop(Aig_Man_t *p)
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
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)
struct Aig_Obj_t_ Aig_Obj_t
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)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Dch_Pars_t_ Dch_Pars_t
INCLUDES ///.
void Dch_ManSetDefaultParams(Dch_Pars_t *p)
DECLARATIONS ///.
Gia_Man_t * Gia_ManFromAigSimple(Aig_Man_t *p)
void Gia_ManStop(Gia_Man_t *p)
#define Gia_ClassForEachObj1(p, i, iObj)
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachClass(p, i)
char * Nm_ManFindNameById(Nm_Man_t *p, int ObjId)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.
Gia_Man_t * Cec4_ManSimulateTest3(Gia_Man_t *p, int nBTLimit, int fVerbose)