53 p->nPats =
p->nWords * 8 *
sizeof(unsigned);
54 p->nWordsIn =
p->nPats;
55 p->nBytesIn =
p->nPats *
sizeof(unsigned);
56 p->nPatsIn =
p->nPats * 8 *
sizeof(unsigned);
57 p->nWordsOut =
p->nPats *
p->nWords;
58 p->nPatsOut =
p->nPats *
p->nPats;
60 p->vPats = Vec_PtrAllocSimInfo( 1024,
p->nWordsIn );
61 p->vPats0 = Vec_PtrAllocSimInfo( 128,
p->nWords );
62 p->vPats1 = Vec_PtrAllocSimInfo( 128,
p->nWords );
63 p->vOuts = Vec_PtrAllocSimInfo( 128,
p->nWordsOut );
65 p->vCands = Vec_VecStart( 16 );
84 assert( Abc_NtkIsStrash(pAig) );
86 p->nTruePis = nTruePis;
87 if ( Vec_PtrSize(
p->vPats) < Abc_NtkObjNumMax(pAig)+1 )
89 Vec_PtrFree(
p->vPats );
90 p->vPats = Vec_PtrAllocSimInfo( Abc_NtkObjNumMax(pAig)+1,
p->nWordsIn );
92 if ( Vec_PtrSize(
p->vPats0) < nTruePis )
94 Vec_PtrFree(
p->vPats0 );
95 p->vPats0 = Vec_PtrAllocSimInfo( nTruePis,
p->nWords );
97 if ( Vec_PtrSize(
p->vPats1) < nTruePis )
99 Vec_PtrFree(
p->vPats1 );
100 p->vPats1 = Vec_PtrAllocSimInfo( nTruePis,
p->nWords );
102 if ( Vec_PtrSize(
p->vOuts) < Abc_NtkPoNum(pAig) )
104 Vec_PtrFree(
p->vOuts );
105 p->vOuts = Vec_PtrAllocSimInfo( Abc_NtkPoNum(pAig),
p->nWordsOut );
108 Abc_InfoClear( (
unsigned *)Vec_PtrEntry(
p->vPats0,0),
p->nWords * nTruePis );
109 Abc_InfoClear( (
unsigned *)Vec_PtrEntry(
p->vPats1,0),
p->nWords * nTruePis );
129 Vec_PtrFree(
p->vPats );
130 Vec_PtrFree(
p->vPats0 );
131 Vec_PtrFree(
p->vPats1 );
132 Vec_PtrFree(
p->vOuts );
133 Vec_VecFree(
p->vCands );
152 for ( i =
nWords - 1; i >= 0; i-- )
155 p[i] = (Num & 1)? 0xff : 0;
156 p[i] = (
p[i] << 8) | ((Num & 2)? 0xff : 0);
157 p[i] = (
p[i] << 8) | ((Num & 4)? 0xff : 0);
158 p[i] = (
p[i] << 8) | ((Num & 8)? 0xff : 0);
181 pInfo = (
unsigned *)Vec_PtrEntry(
p->vPats, pObj->
Id );
182 if ( i < p->nTruePis )
185 Abc_InfoRandom( pInfo,
p->nWordsIn );
216 unsigned char * pInfo;
217 int i, k, z, s, nPats;
220 assert(
p->nBytesIn % 32 == 0 );
221 nPats =
p->nBytesIn/8;
224 if ( i ==
p->nTruePis )
232 for ( z = 0; z < 2; z++ )
237 if ( i ==
p->nTruePis )
239 pInfo = (
unsigned char *)Vec_PtrEntry(
p->vPats, pObj->
Id );
240 pInfo[nPats] = z ? 0xff : 0;
242 if ( ++nPats ==
p->nBytesIn )
245 for ( k = 0; k <
p->nTruePis; k++ )
249 if ( i ==
p->nTruePis )
251 pInfo = (
unsigned char *)Vec_PtrEntry(
p->vPats, pObj->
Id );
252 pInfo[nPats] = ((i == k) ^ z) ? 0xff : 0;
254 if ( ++nPats ==
p->nBytesIn )
261 if (
p->nPats0 <
p->nPats1 )
263 nPatsSource[0] =
p->nPats0;
264 vPatsSource[0] =
p->vPats0;
265 nPatsSource[1] =
p->nPats1;
266 vPatsSource[1] =
p->vPats1;
270 nPatsSource[0] =
p->nPats1;
271 vPatsSource[0] =
p->vPats1;
272 nPatsSource[1] =
p->nPats0;
273 vPatsSource[1] =
p->vPats0;
275 for ( z = 0; z < 2; z++ )
277 for ( s = nPatsSource[z] - 1; s >= 0; s-- )
282 for ( k = 0; k <
p->nTruePis; k++ )
286 if ( i ==
p->nTruePis )
288 pInfo = (
unsigned char *)Vec_PtrEntry(
p->vPats, pObj->
Id );
289 if ( (i == k) ^ Abc_InfoHasBit( (
unsigned *)Vec_PtrEntry(vPatsSource[z], i), s ) )
304 if ( ++nPats ==
p->nBytesIn )
310 for ( z = nPats; z <
p->nBytesIn; z++ )
314 if ( i ==
p->nTruePis )
316 pInfo = (
unsigned char *)Vec_PtrEntry(
p->vPats, pObj->
Id );
317 memset( pInfo + nPats, 0, (
size_t)(
p->nBytesIn - nPats) );
347 unsigned * pInfo, * pInfo2;
351 if ( i ==
p->nTruePis )
353 pInfo = (
unsigned *)Vec_PtrEntry(
p->vPats, pObj->
Id );
354 pInfo2 = (
unsigned *)Vec_PtrEntry( vInfo, i );
355 for ( w = 0; w <
p->nWords; w++ )
356 pInfo[w] = pInfo2[w];
373 unsigned * pInfo, * pInfo1, * pInfo2;
374 int k, fComp1, fComp2;
376 assert( Abc_ObjIsNode(pNode) );
377 pInfo = (
unsigned *)Vec_PtrEntry(vSimInfo, pNode->
Id);
378 pInfo1 = (
unsigned *)Vec_PtrEntry(vSimInfo, Abc_ObjFaninId0(pNode));
379 pInfo2 = (
unsigned *)Vec_PtrEntry(vSimInfo, Abc_ObjFaninId1(pNode));
380 fComp1 = Abc_ObjFaninC0(pNode);
381 fComp2 = Abc_ObjFaninC1(pNode);
382 if ( fComp1 && fComp2 )
383 for ( k = 0; k < nSimWords; k++ )
384 pInfo[k] = ~pInfo1[k] & ~pInfo2[k];
385 else if ( fComp1 && !fComp2 )
386 for ( k = 0; k < nSimWords; k++ )
387 pInfo[k] = ~pInfo1[k] & pInfo2[k];
388 else if ( !fComp1 && fComp2 )
389 for ( k = 0; k < nSimWords; k++ )
390 pInfo[k] = pInfo1[k] & ~pInfo2[k];
392 for ( k = 0; k < nSimWords; k++ )
393 pInfo[k] = pInfo1[k] & pInfo2[k];
409 unsigned * pInfo, * pInfo1;
412 assert( Abc_ObjIsCo(pNode) );
413 pInfo = (
unsigned *)Vec_PtrEntry(vSimInfo, pNode->
Id);
414 pInfo1 = (
unsigned *)Vec_PtrEntry(vSimInfo, Abc_ObjFaninId0(pNode));
415 fComp1 = Abc_ObjFaninC0(pNode);
417 for ( k = 0; k < nSimWords; k++ )
418 pInfo[k] = ~pInfo1[k];
420 for ( k = 0; k < nSimWords; k++ )
421 pInfo[k] = pInfo1[k];
439 Abc_InfoFill( (
unsigned *)Vec_PtrEntry(
p->vPats,0),
nWords );
462 assert( nPats > 0 && nPats <
nWords * 8 * (
int)
sizeof(
unsigned) );
464 if ( nPats < 8 *
sizeof(
unsigned) )
468 pInfo[0] |= ((~0) << nPats);
469 nPats = 8 *
sizeof(unsigned);
472 iWords = nPats / (8 *
sizeof(unsigned));
475 for ( w = iWords; w <
nWords; w++ )
493 unsigned * pInfo, * pInfo2;
498 pInfo = (
unsigned *)Vec_PtrEntry(
p->vPats, pObj->
Id );
499 pInfo2 = (
unsigned *)Vec_PtrEntry(
p->vOuts, i );
500 for ( j = 0; j <
p->nPats; j++ )
501 for ( w = 0; w <
p->nWords; w++ )
502 *pInfo2++ = pInfo[w];
519 unsigned * pInfo, * pInfo2;
524 pInfo = (
unsigned *)Vec_PtrEntry(
p->vPats, pObj->
Id );
525 pInfo2 = (
unsigned *)Vec_PtrEntry(
p->vOuts, i );
526 for ( j = 0; j <
p->nPats; j++, pInfo2 +=
p->nWords )
527 if ( Abc_InfoHasBit( pInfo, j ) )
528 for ( w = 0; w <
p->nWords; w++ )
529 pInfo2[w] = ~pInfo2[w];
551 pInfo2 = (
unsigned *)Vec_PtrEntry(
p->vOuts, i );
571 pInfo = (
unsigned *)Vec_PtrEntry(
p->vPats, Abc_NtkPo(
p->pAig, 1)->Id );
589 unsigned char * pInfoCare, * pInfoNode;
591 pInfoCare = (
unsigned char *)Vec_PtrEntry(
p->vPats, Abc_NtkPo(
p->pAig, 0)->Id );
592 pInfoNode = (
unsigned char *)Vec_PtrEntry(
p->vPats, Abc_NtkPo(
p->pAig, 1)->Id );
593 for ( i = 0; i <
p->nBytesIn; i++ )
597 else if ( !pInfoNode[i] )
607 printf(
"Dc = %7.2f %% ", 100.0*(*pnDcs) /
nTotal );
608 printf(
"On = %7.2f %% ", 100.0*(*pnOnes) /
nTotal );
609 printf(
"Off = %7.2f %% ", 100.0*(*pnZeros)/
nTotal );
627 unsigned char * pInfoCare, * pInfoNode, * pInfo;
629 pInfoCare = (
unsigned char *)Vec_PtrEntry(
p->vPats, Abc_NtkPo(
p->pAig, 0)->Id );
630 pInfoNode = (
unsigned char *)Vec_PtrEntry(
p->vPats, Abc_NtkPo(
p->pAig, 1)->Id );
631 for ( i = 0; i <
p->nBytesIn; i++ )
637 assert( pInfoNode[i] == 0 || pInfoNode[i] == 0xff );
640 if (
p->nPats0 >=
p->nPats )
644 if ( j ==
p->nTruePis )
646 pInfo = (
unsigned char *)Vec_PtrEntry(
p->vPats, pObj->
Id );
647 assert( pInfo[i] == 0 || pInfo[i] == 0xff );
649 Abc_InfoSetBit( (
unsigned *)Vec_PtrEntry(
p->vPats0, j),
p->nPats0 );
655 if (
p->nPats1 >=
p->nPats )
659 if ( j ==
p->nTruePis )
661 pInfo = (
unsigned char *)Vec_PtrEntry(
p->vPats, pObj->
Id );
662 assert( pInfo[i] == 0 || pInfo[i] == 0xff );
664 Abc_InfoSetBit( (
unsigned *)Vec_PtrEntry(
p->vPats1, j),
p->nPats1 );
668 if (
p->nPats0 >=
p->nPats &&
p->nPats1 >=
p->nPats )
674 printf(
"On = %3d ",
p->nPats1 );
675 printf(
"Off = %3d ",
p->nPats0 );
694 unsigned * pInfo, * pInfo2;
698 if ( i ==
p->nTruePis )
702 pInfo2 = (
unsigned *)Vec_PtrEntry(
p->vPats1, i );
703 value = Abc_InfoHasBit( pInfo2,
p->nPats1 - 1 );
707 pInfo2 = (
unsigned *)Vec_PtrEntry(
p->vPats0, i );
708 value = Abc_InfoHasBit( pInfo2,
p->nPats0 - 1 );
710 pInfo = (
unsigned *)Vec_PtrEntry(
p->vPats, pObj->
Id );
711 pInfo[0] =
value ? ~0 : 0;
714 pObj = Abc_NtkPo(
p->pAig, 1 );
715 pInfo = (
unsigned *)Vec_PtrEntry(
p->vPats, pObj->
Id );
716 assert( pInfo[0] == 0 || pInfo[0] == ~0 );
733 int i, nOnes = 0, nZeros = 0, nDcs = 0;
748 return p->fConst0 ||
p->fConst1;
755 return p->fConst0 ||
p->fConst1;
760 for ( i = 0; i < 2; i++ )
762 if (
p->nPats0 >
p->nPats*7/8 &&
p->nPats1 >
p->nPats*7/8 )
770 if (
p->nPats0 <
p->nPats )
772 if (
p->nPats1 <
p->nPats )
struct Abc_Obj_t_ Abc_Obj_t
#define Abc_AigForEachAnd(pNtk, pNode, i)
#define Abc_NtkForEachPo(pNtk, pPo, i)
struct Abc_Ntk_t_ Abc_Ntk_t
#define Abc_NtkForEachPi(pNtk, pPi, i)
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int nTotal
DECLARATIONS ///.
ABC_NAMESPACE_IMPL_START typedef signed char value
void Extra_PrintBinary(FILE *pFile, unsigned Sign[], int nBits)
struct Res_Sim_t_ Res_Sim_t
int Res_SatSimulate(Res_Sim_t *p, int nPats, int fOnSet)
void Res_SimFree(Res_Sim_t *p)
void Res_SimSetGiven(Res_Sim_t *p, Vec_Ptr_t *vInfo)
void Res_SimPadSimInfo(Vec_Ptr_t *vPats, int nPats, int nWords)
int Res_SimPrepare(Res_Sim_t *p, Abc_Ntk_t *pAig, int nTruePis, int fVerbose)
ABC_NAMESPACE_IMPL_START Res_Sim_t * Res_SimAlloc(int nWords)
DECLARATIONS ///.
void Res_SimPrintNodePatterns(Res_Sim_t *p, Abc_Ntk_t *pAig)
void Res_SimTransferOne(Abc_Obj_t *pNode, Vec_Ptr_t *vSimInfo, int nSimWords)
void Res_SimPerformRound(Res_Sim_t *p, int nWords)
void Res_SimSetDerivedBytes(Res_Sim_t *p, int fUseWalk)
void Res_SimAdjust(Res_Sim_t *p, Abc_Ntk_t *pAig, int nTruePis)
void Res_SimCollectPatterns(Res_Sim_t *p, int fVerbose)
void Res_SimDeriveInfoComplement(Res_Sim_t *p)
void Res_SimPerformOne(Abc_Obj_t *pNode, Vec_Ptr_t *vSimInfo, int nSimWords)
void Res_SimSetRandomBytes(Res_Sim_t *p)
void Abc_InfoRandomBytes(unsigned *p, int nWords)
void Res_SimPrintOutPatterns(Res_Sim_t *p, Abc_Ntk_t *pAig)
void Res_SimCountResults(Res_Sim_t *p, int *pnDcs, int *pnOnes, int *pnZeros, int fVerbose)
int Res_SimVerifyValue(Res_Sim_t *p, int fOnSet)
void Res_SimDeriveInfoReplicate(Res_Sim_t *p)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.