31static int bit_count[256] = {
32 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
33 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
34 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
35 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
36 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
37 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
38 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
39 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8
62 vInfo = Vec_PtrAlloc( nSize );
66 memset( vInfo->pArray[0], 0,
sizeof(
unsigned) * nSize *
nWords );
67 for ( i = 1; i < nSize; i++ )
68 vInfo->pArray[i] = ((
unsigned *)vInfo->pArray[i-1]) +
nWords;
104 for ( w = 0; w <
nWords; w++ )
105 pInfo1[w] |= pInfo2[w];
124 for ( w = 0; w <
nWords; w++ )
125 if ( (uMask = (pInfo2[w] ^ pInfo1[w])) )
126 for ( b = 0; b < 32; b++ )
127 if ( uMask & (1 << b) )
128 Vec_IntPush( vDiffs, 32*w + b );
147 for ( w = 0; w <
nWords; w++ )
148 if ( (uMask = (pInfo2[w] & ~pInfo1[w])) )
149 for ( b = 0; b < 32; b++ )
150 if ( uMask & (1 << b) )
151 Vec_IntPush( vDiffs, 32*w + b );
167 unsigned * pSimInfo1, * pSimInfo2;
169 pSimInfo1 = (
unsigned *)
p->vSim0->pArray[pNode->
Id];
170 pSimInfo2 = (
unsigned *)
p->vSim1->pArray[pNode->
Id];
171 for ( k = 0; k <
p->nSimWords; k++ )
172 pSimInfo2[k] = ~pSimInfo1[k];
188 unsigned * pSimInfo1, * pSimInfo2;
190 pSimInfo1 = (
unsigned *)
p->vSim0->pArray[pNode->
Id];
191 pSimInfo2 = (
unsigned *)
p->vSim1->pArray[pNode->
Id];
192 for ( k = 0; k <
p->nSimWords; k++ )
193 if ( pSimInfo2[k] != pSimInfo1[k] )
234 unsigned * pSimmNode, * pSimmNode1, * pSimmNode2;
235 int k, fComp1, fComp2;
237 if ( Abc_ObjIsNode(pNode) )
240 pSimmNode = (
unsigned *)
p->vSim1->pArray[ pNode->
Id ];
242 pSimmNode = (
unsigned *)
p->vSim0->pArray[ pNode->
Id ];
245 pSimmNode1 = (
unsigned *)
p->vSim1->pArray[ Abc_ObjFaninId0(pNode) ];
247 pSimmNode1 = (
unsigned *)
p->vSim0->pArray[ Abc_ObjFaninId0(pNode) ];
250 pSimmNode2 = (
unsigned *)
p->vSim1->pArray[ Abc_ObjFaninId1(pNode) ];
252 pSimmNode2 = (
unsigned *)
p->vSim0->pArray[ Abc_ObjFaninId1(pNode) ];
254 fComp1 = Abc_ObjFaninC0(pNode);
255 fComp2 = Abc_ObjFaninC1(pNode);
256 if ( fComp1 && fComp2 )
257 for ( k = 0; k <
p->nSimWords; k++ )
258 pSimmNode[k] = ~pSimmNode1[k] & ~pSimmNode2[k];
259 else if ( fComp1 && !fComp2 )
260 for ( k = 0; k <
p->nSimWords; k++ )
261 pSimmNode[k] = ~pSimmNode1[k] & pSimmNode2[k];
262 else if ( !fComp1 && fComp2 )
263 for ( k = 0; k <
p->nSimWords; k++ )
264 pSimmNode[k] = pSimmNode1[k] & ~pSimmNode2[k];
266 for ( k = 0; k <
p->nSimWords; k++ )
267 pSimmNode[k] = pSimmNode1[k] & pSimmNode2[k];
271 assert( Abc_ObjFaninNum(pNode) == 1 );
273 pSimmNode = (
unsigned *)
p->vSim1->pArray[ pNode->
Id ];
275 pSimmNode = (
unsigned *)
p->vSim0->pArray[ pNode->
Id ];
278 pSimmNode1 = (
unsigned *)
p->vSim1->pArray[ Abc_ObjFaninId0(pNode) ];
280 pSimmNode1 = (
unsigned *)
p->vSim0->pArray[ Abc_ObjFaninId0(pNode) ];
282 fComp1 = Abc_ObjFaninC0(pNode);
284 for ( k = 0; k <
p->nSimWords; k++ )
285 pSimmNode[k] = ~pSimmNode1[k];
287 for ( k = 0; k <
p->nSimWords; k++ )
288 pSimmNode[k] = pSimmNode1[k];
305 unsigned * pSimmNode, * pSimmNode1, * pSimmNode2;
306 int k, fComp1, fComp2;
308 assert( Abc_ObjIsNode(pNode) );
309 pSimmNode = (
unsigned *)Vec_PtrEntry(vSimInfo, pNode->
Id);
310 pSimmNode1 = (
unsigned *)Vec_PtrEntry(vSimInfo, Abc_ObjFaninId0(pNode));
311 pSimmNode2 = (
unsigned *)Vec_PtrEntry(vSimInfo, Abc_ObjFaninId1(pNode));
312 pSimmNode += nOffset;
313 pSimmNode1 += nOffset;
314 pSimmNode2 += nOffset;
315 fComp1 = Abc_ObjFaninC0(pNode);
316 fComp2 = Abc_ObjFaninC1(pNode);
317 if ( fComp1 && fComp2 )
318 for ( k = 0; k < nSimWords; k++ )
319 pSimmNode[k] = ~pSimmNode1[k] & ~pSimmNode2[k];
320 else if ( fComp1 && !fComp2 )
321 for ( k = 0; k < nSimWords; k++ )
322 pSimmNode[k] = ~pSimmNode1[k] & pSimmNode2[k];
323 else if ( !fComp1 && fComp2 )
324 for ( k = 0; k < nSimWords; k++ )
325 pSimmNode[k] = pSimmNode1[k] & ~pSimmNode2[k];
327 for ( k = 0; k < nSimWords; k++ )
328 pSimmNode[k] = pSimmNode1[k] & pSimmNode2[k];
344 unsigned * pSimmNode, * pSimmNode1;
347 assert( Abc_ObjIsCo(pNode) );
348 pSimmNode = (
unsigned *)Vec_PtrEntry(vSimInfo, pNode->
Id);
349 pSimmNode1 = (
unsigned *)Vec_PtrEntry(vSimInfo, Abc_ObjFaninId0(pNode));
350 pSimmNode += nOffset + (fShift > 0)*nSimWords;
351 pSimmNode1 += nOffset;
352 fComp1 = Abc_ObjFaninC0(pNode);
354 for ( k = 0; k < nSimWords; k++ )
355 pSimmNode[k] = ~pSimmNode1[k];
357 for ( k = 0; k < nSimWords; k++ )
358 pSimmNode[k] = pSimmNode1[k];
405 unsigned char * pBytes;
406 int nOnes, nBytes, i;
407 pBytes = (
unsigned char *)pSimInfo;
408 nBytes = 4 * nSimWords;
410 for ( i = 0; i < nBytes; i++ )
411 nOnes += bit_count[ pBytes[i] ];
431 vCounters = Vec_IntStart( Vec_PtrSize(vInfo) );
451 for ( k = 0; k < nSimWords; k++ )
469 for ( k = 0; k < nSimWords; k++ )
470 pPatRand[k] = ~pPatRand[k];
487 for ( k = 0; k < nSimWords; k++ )
507 for ( k = 0; k < nSimWords; k++ )
508 if ( pPats1[k] != pPats2[k] )
527 for ( k = 0; k < nSimWords; k++ )
528 if ( pPats1[k] & ~pPats2[k] )
547 for ( k = 0; k < nSimWords; k++ )
548 if ( ~pPats1[k] & ~pPats2[k] )
567 int Counter, nOnes, nPairs, i;
572 nPairs = nOnes * (nOnes - 1) / 2;
573 Vec_IntWriteEntry( vCounters, i, nPairs );
592 int i, k, Index1, Index2;
616 int i, k, Index1, Index2;
620 printf(
"(%d,%d) ", i, k );
640 for ( i = 0; i <
p->nOutputs; i++ )
642 printf(
"Output %2d :", i );
646p->timeCount += Abc_Clock() - clk;
662 int nPairsTotal, nPairsSym, nPairsNonSym, i;
666 p->nPairsNonSymm = 0;
667 for ( i = 0; i <
p->nOutputs; i++ )
669 nPairsTotal = Vec_IntEntry(
p->vPairsTotal, i);
670 nPairsSym = Vec_IntEntry(
p->vPairsSym, i);
671 nPairsNonSym = Vec_IntEntry(
p->vPairsNonSym,i);
672 assert( nPairsTotal >= nPairsSym + nPairsNonSym );
673 if ( nPairsTotal == nPairsSym + nPairsNonSym )
675 p->nPairsSymm += nPairsSym;
676 p->nPairsNonSymm += nPairsNonSym;
681 assert( nPairsTotal >= nPairsSym + nPairsNonSym );
682 Vec_IntWriteEntry(
p->vPairsSym, i, nPairsSym );
683 Vec_IntWriteEntry(
p->vPairsNonSym, i, nPairsNonSym );
684 p->nPairsSymm += nPairsSym;
685 p->nPairsNonSymm += nPairsNonSym;
689 p->nPairsRem =
p->nPairsTotal-
p->nPairsSymm-
p->nPairsNonSymm;
690p->timeCount += Abc_Clock() - clk;
707 for ( i = 0; i <
p->nOutputs; i++ )
struct Abc_Obj_t_ Abc_Obj_t
#define Abc_NtkForEachCo(pNtk, pCo, i)
#define Abc_NtkForEachCi(pNtk, pCi, i)
#define Abc_NtkForEachNode(pNtk, pNode, i)
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Sim_UtilInfoFree(Vec_Ptr_t *p)
void Sim_UtilSetRandom(unsigned *pPatRand, int nSimWords)
int Sim_UtilInfoCompare(Sim_Man_t *p, Abc_Obj_t *pNode)
int Sim_UtilCountPairsOnePrint(Extra_BitMat_t *pMat, Vec_Int_t *vSupport)
int Sim_UtilInfoIsImp(unsigned *pPats1, unsigned *pPats2, int nSimWords)
Vec_Ptr_t * Sim_UtilInfoAlloc(int nSize, int nWords, int fClean)
FUNCTION DEFINITIONS ///.
void Sim_UtilSimulate(Sim_Man_t *p, int fType)
int Sim_UtilInfoIsClause(unsigned *pPats1, unsigned *pPats2, int nSimWords)
void Sim_UtilSimulateNodeOne(Abc_Obj_t *pNode, Vec_Ptr_t *vSimInfo, int nSimWords, int nOffset)
void Sim_UtilSetCompl(unsigned *pPatRand, int nSimWords)
void Sim_UtilInfoDetectNews(unsigned *pInfo1, unsigned *pInfo2, int nWords, Vec_Int_t *vDiffs)
int Sim_UtilCountOnes(unsigned *pSimInfo, int nSimWords)
int Sim_UtilMatrsAreDisjoint(Sym_Man_t *p)
void Sim_UtilInfoFlip(Sim_Man_t *p, Abc_Obj_t *pNode)
void Sim_UtilTransferNodeOne(Abc_Obj_t *pNode, Vec_Ptr_t *vSimInfo, int nSimWords, int nOffset, int fShift)
int Sim_UtilCountSuppSizes(Sim_Man_t *p, int fStruct)
void Sim_UtilSetConst(unsigned *pPatRand, int nSimWords, int fConst1)
Vec_Int_t * Sim_UtilCountOnesArray(Vec_Ptr_t *vInfo, int nSimWords)
void Sim_UtilInfoAdd(unsigned *pInfo1, unsigned *pInfo2, int nWords)
void Sim_UtilSimulateNode(Sim_Man_t *p, Abc_Obj_t *pNode, int fType, int fType1, int fType2)
void Sim_UtilCountPairsAllPrint(Sym_Man_t *p)
void Sim_UtilInfoDetectDiffs(unsigned *pInfo1, unsigned *pInfo2, int nWords, Vec_Int_t *vDiffs)
int Sim_UtilCountPairsOne(Extra_BitMat_t *pMat, Vec_Int_t *vSupport)
int Sim_UtilCountAllPairs(Vec_Ptr_t *vSuppFun, int nSimWords, Vec_Int_t *vCounters)
int Sim_UtilInfoIsEqual(unsigned *pPats1, unsigned *pPats2, int nSimWords)
void Sim_UtilCountPairsAll(Sym_Man_t *p)
struct Sim_Man_t_ Sim_Man_t
#define Sim_SuppFunHasVar(vSupps, Output, v)
#define SIM_RANDOM_UNSIGNED
#define Sim_SuppStrHasVar(vSupps, pNode, v)
typedefABC_NAMESPACE_HEADER_START struct Sym_Man_t_ Sym_Man_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 ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.