73static inline int Gli_ManCiNum(
Gli_Man_t *
p ) {
return Vec_IntSize(
p->vCis); }
74static inline int Gli_ManCoNum(
Gli_Man_t *
p ) {
return Vec_IntSize(
p->vCos); }
75static inline int Gli_ManPiNum(
Gli_Man_t *
p ) {
return Vec_IntSize(
p->vCis) -
p->nRegs; }
76static inline int Gli_ManPoNum(
Gli_Man_t *
p ) {
return Vec_IntSize(
p->vCos) -
p->nRegs; }
77static inline int Gli_ManRegNum(
Gli_Man_t *
p ) {
return p->nRegs; }
78static inline int Gli_ManObjNum(
Gli_Man_t *
p ) {
return p->nObjs; }
79static inline int Gli_ManNodeNum(
Gli_Man_t *
p ) {
return p->nObjs - Vec_IntSize(
p->vCis) - Vec_IntSize(
p->vCos); }
82static inline Gli_Obj_t * Gli_ManCi(
Gli_Man_t *
p,
int v ) {
return Gli_ManObj(
p, Vec_IntEntry(
p->vCis,v) ); }
83static inline Gli_Obj_t * Gli_ManCo(
Gli_Man_t *
p,
int v ) {
return Gli_ManObj(
p, Vec_IntEntry(
p->vCos,v) ); }
86static inline Gli_Obj_t * Gli_ManRo(
Gli_Man_t *
p,
int v ) {
assert( v < Gli_ManRegNum(
p) );
return Gli_ManCi(
p, Gli_ManRegNum(
p)+v ); }
87static inline Gli_Obj_t * Gli_ManRi(
Gli_Man_t *
p,
int v ) {
assert( v < Gli_ManRegNum(
p) );
return Gli_ManCo(
p, Gli_ManRegNum(
p)+v ); }
89static inline int Gli_ObjIsTerm(
Gli_Obj_t * pObj ) {
return pObj->fTerm; }
90static inline int Gli_ObjIsCi(
Gli_Obj_t * pObj ) {
return pObj->fTerm && pObj->nFanins == 0; }
91static inline int Gli_ObjIsCo(
Gli_Obj_t * pObj ) {
return pObj->fTerm && pObj->nFanins == 1; }
92static inline int Gli_ObjIsNode(
Gli_Obj_t * pObj ) {
return!pObj->fTerm; }
94static inline int Gli_ObjFaninNum(
Gli_Obj_t * pObj ) {
return pObj->nFanins; }
95static inline int Gli_ObjFanoutNum(
Gli_Obj_t * pObj ) {
return pObj->nFanouts; }
96static inline int Gli_ObjSize(
Gli_Obj_t * pObj ) {
return sizeof(
Gli_Obj_t) / 4 + pObj->nFanins + pObj->nFanouts; }
99static inline Gli_Obj_t * Gli_ObjFanout(
Gli_Obj_t * pObj,
int i ) {
return (
Gli_Obj_t *)(((
int *)pObj) + pObj->Fanios[pObj->nFanins+i]); }
101#define Gli_ManForEachObj( p, pObj, i ) \
102 for ( i = 0; (i < p->nObjData) && (pObj = Gli_ManObj(p,i)); i += Gli_ObjSize(pObj) )
103#define Gli_ManForEachNode( p, pObj, i ) \
104 for ( i = 0; (i < p->nObjData) && (pObj = Gli_ManObj(p,i)); i += Gli_ObjSize(pObj) ) if ( Gli_ObjIsTerm(pObj) ) {} else
106#define Gli_ManForEachEntry( vVec, p, pObj, i ) \
107 for ( i = 0; (i < Vec_IntSize(vVec)) && (pObj = Gli_ManObj(p,Vec_IntEntry(vVec,i))); i++ )
108#define Gli_ManForEachCi( p, pObj, i ) \
109 for ( i = 0; (i < Vec_IntSize(p->vCis)) && (pObj = Gli_ManObj(p,Vec_IntEntry(p->vCis,i))); i++ )
110#define Gli_ManForEachCo( p, pObj, i ) \
111 for ( i = 0; (i < Vec_IntSize(p->vCos)) && (pObj = Gli_ManObj(p,Vec_IntEntry(p->vCos,i))); i++ )
113#define Gli_ManForEachPi( p, pObj, i ) \
114 for ( i = 0; (i < Gli_ManPiNum(p)) && ((pObj) = Gli_ManCi(p, i)); i++ )
115#define Gli_ManForEachPo( p, pObj, i ) \
116 for ( i = 0; (i < Gli_ManPoNum(p)) && ((pObj) = Gli_ManCo(p, i)); i++ )
117#define Gli_ManForEachRo( p, pObj, i ) \
118 for ( i = 0; (i < Gli_ManRegNum(p)) && ((pObj) = Gli_ManCi(p, Gli_ManPiNum(p)+i)); i++ )
119#define Gli_ManForEachRi( p, pObj, i ) \
120 for ( i = 0; (i < Gli_ManRegNum(p)) && ((pObj) = Gli_ManCo(p, Gli_ManPoNum(p)+i)); i++ )
121#define Gli_ManForEachRiRo( p, pObjRi, pObjRo, i ) \
122 for ( i = 0; (i < Gli_ManRegNum(p)) && ((pObjRi) = Gli_ManCo(p, Gli_ManPoNum(p)+i)) && ((pObjRo) = Gli_ManCi(p, Gli_ManPiNum(p)+i)); i++ )
124#define Gli_ObjForEachFanin( pObj, pNext, i ) \
125 for ( i = 0; (i < (int)pObj->nFanins) && (pNext = Gli_ObjFanin(pObj,i)); i++ )
126#define Gli_ObjForEachFanout( pObj, pNext, i ) \
127 for ( i = 0; (i < (int)pObj->nFanouts) && (pNext = Gli_ObjFanout(pObj,i)); i++ )
149 p->vCis = Vec_IntAlloc( 1000 );
150 p->vCos = Vec_IntAlloc( 1000 );
151 p->vCisChanged = Vec_IntAlloc( 1000 );
152 p->vAffected = Vec_IntAlloc( 1000 );
153 p->vFrontier = Vec_IntAlloc( 1000 );
154 p->nObjData = (
sizeof(
Gli_Obj_t) / 4) * nObjs + 2 * nFanioPairs;
155 p->pObjData = (
int *)(
p + 1);
172 Vec_IntFree(
p->vCis );
173 Vec_IntFree(
p->vCos );
174 Vec_IntFree(
p->vCisChanged );
175 Vec_IntFree(
p->vAffected );
176 Vec_IntFree(
p->vFrontier );
198 printf(
"Node %d \n", pObj->Handle );
199 printf(
"Fanins: " );
201 printf(
"%d ", pNext->Handle );
203 printf(
"Fanouts: " );
205 printf(
"%d ", pNext->Handle );
225 assert(
p->iObjData ==
p->nObjData );
228 assert( pObj->iFanin == (
int)pObj->nFanins );
229 assert( pObj->iFanout == (
int)pObj->nFanouts );
248 assert( pObj->iFanin < (
int)pObj->nFanins );
249 assert( pFanin->iFanout < (
int)pFanin->nFanouts );
250 pFanin->Fanios[pFanin->nFanins + pFanin->iFanout++] =
251 pObj->Fanios[pObj->iFanin++] = pObj->Handle - pFanin->Handle;
268 pObj = Gli_ManObj(
p,
p->iObjData );
269 pObj->Handle =
p->iObjData;
270 pObj->nFanins = nFanins;
271 pObj->nFanouts = nFanouts;
272 p->iObjData += Gli_ObjSize( pObj );
293 Vec_IntPush(
p->vCis, pObj->Handle );
313 pFanin = Gli_ManObj(
p, iFanin );
315 pObj->fPhase = pObj->fPhase2 = pFanin->fPhase;
316 Vec_IntPush(
p->vCos, pObj->Handle );
331static inline int Gli_NodeComputeValue(
Gli_Obj_t * pNode )
334 for ( i = 0; i < (int)pNode->nFanins; i++ )
335 Phase |= (Gli_ObjFanin(pNode, i)->fPhase << i);
336 return Abc_InfoHasBit( (
unsigned *)pNode->pTruth, Phase );
350static inline int Gli_NodeComputeValue2(
Gli_Obj_t * pNode )
353 for ( i = 0; i < (int)pNode->nFanins; i++ )
354 Phase |= (Gli_ObjFanin(pNode, i)->fPhase2 << i);
355 return Abc_InfoHasBit( (
unsigned *)pNode->pTruth, Phase );
373 assert( Vec_IntSize(vFanins) <= 16 );
377 pObj->pTruth = pGateTruth;
378 pObj->fPhase = pObj->fPhase2 = Gli_NodeComputeValue( pObj );
395 return Gli_ManObj(
p, iNode )->nSwitches;
411 return Gli_ManObj(
p, iNode )->nGlitches;
429 float Multi = 1.0 / (1 << 16);
431 assert( 0.0 < PiTransProb && PiTransProb < 1.0 );
432 Vec_IntClear(
p->vCisChanged );
436 Vec_IntPush(
p->vCisChanged, pObj->Handle );
459 Vec_IntClear(
p->vCisChanged );
461 if ( (
p->pSimInfoPrev[i] ^ pObj->uSimInfo) & (1 << iBit) )
463 Vec_IntPush(
p->vCisChanged, pObj->Handle );
488 if ( ((
int)pThis->fPhase) == Gli_NodeComputeValue(pThis) )
513 Vec_IntClear(
p->vAffected );
515 Vec_IntPush(
p->vAffected, Handle );
517 while ( Vec_IntSize(
p->vAffected) > 0 )
520 Vec_IntClear(
p->vFrontier );
525 if ( Gli_ObjIsCo(pFanout) )
527 if ( pFanout->fMark )
530 Vec_IntPush(
p->vFrontier, pFanout->Handle );
534 Vec_IntClear(
p->vAffected );
538 if ( ((
int)pThis->fPhase2) == Gli_NodeComputeValue2(pThis) )
542 Vec_IntPush(
p->vAffected, pThis->Handle );
564 assert( pObj->fPhase == pObj->fPhase2 );
565 assert( pObj->nGlitches >= pObj->nSwitches );
582 unsigned pSimInfos[6], Result = 0;
583 int nFanins = Gli_ObjFaninNum(pNode);
588 pSimInfos[i] = pFanin->uSimInfo;
589 for ( i = 0; i < 32; i++ )
592 for ( k = 0; k < nFanins; k++ )
593 if ( (pSimInfos[k] >> i) & 1 )
595 if ( Abc_InfoHasBit( (
unsigned *)pNode->pTruth, Phase ) )
612static inline unsigned Gli_ManUpdateRandomInput(
unsigned uInfo,
float PiTransProb )
614 float Multi = 1.0 / (1 << 16);
616 if ( PiTransProb == 0.5 )
618 for ( i = 0; i < 32; i++ )
641 pObj->uSimInfo = Gli_ManUpdateRandomInput( pObj->uSimInfo, 0.5 );
644 for ( f = 0; f < nPref; f++ )
650 pObj->uSimInfo = Gli_ObjFanin(pObj, 0)->uSimInfo;
653 pObj->uSimInfo = Gli_ManUpdateRandomInput( pObj->uSimInfo, 0.5 );
655 pObjRo->uSimInfo = pObjRi->uSimInfo;
658 if (
p->pSimInfoPrev == NULL )
659 p->pSimInfoPrev =
ABC_ALLOC(
unsigned, Gli_ManCiNum(
p) );
661 p->pSimInfoPrev[i] = pObj->uSimInfo;
680 pObj->fPhase = pObj->fPhase2 = ((
p->pSimInfoPrev[i] >> iBit) & 1);
682 pObj->fPhase = pObj->fPhase2 = Gli_NodeComputeValue( pObj );
699 float Multi = 1.0 / (1 << 16);
701 assert( 0.0 < PiTransProb && PiTransProb < 1.0 );
704 pObj->fPhase = pObj->fPhase2 = Gli_ObjFanin(pObj, 0)->fPhase;
706 Vec_IntClear(
p->vCisChanged );
710 Vec_IntPush(
p->vCisChanged, pObj->Handle );
718 if ( pObjRi->fPhase != pObj->fPhase )
720 Vec_IntPush(
p->vCisChanged, pObj->Handle );
748 for ( i = 0; i < nPatterns; i++ )
758 int nIters = Abc_BitWordNum(nPatterns);
760 for ( i = 0; i < 32; i++ )
763 for ( k = 0; k < nIters; k++ )
774 printf(
"Simulated %d patterns. Input transition probability %.2f. ", nPatterns, PiTransProb );
776 ABC_PRT(
"Time", Abc_Clock() - clk );
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(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 Gli_ManSetPiRandom(Gli_Man_t *p, float PiTransProb)
void Gli_ManGlitching(Gli_Man_t *p)
void Gli_ManSetPiRandomSeq(Gli_Man_t *p, float PiTransProb)
struct Gli_Man_t_ Gli_Man_t
void Gli_ManVerify(Gli_Man_t *p)
int Gli_ObjNumGlitches(Gli_Man_t *p, int iNode)
int Gli_ManCreateNode(Gli_Man_t *p, Vec_Int_t *vFanins, int nFanouts, word *pGateTruth)
void Gli_ManSetDataSaved(Gli_Man_t *p, int iBit)
#define Gli_ManForEachPi(p, pObj, i)
#define Gli_ManForEachRo(p, pObj, i)
#define Gli_ObjForEachFanout(pObj, pNext, i)
unsigned Gli_ManSimulateSeqNode(Gli_Man_t *p, Gli_Obj_t *pNode)
typedefABC_NAMESPACE_IMPL_START struct Gli_Obj_t_ Gli_Obj_t
DECLARATIONS ///.
void Gli_ObjAddFanin(Gli_Obj_t *pObj, Gli_Obj_t *pFanin)
void Gli_ManFinalize(Gli_Man_t *p)
Gli_Man_t * Gli_ManAlloc(int nObjs, int nRegs, int nFanioPairs)
FUNCTION DEFINITIONS ///.
#define Gli_ManForEachCo(p, pObj, i)
#define Gli_ManForEachCi(p, pObj, i)
void Gli_ManSimulateSeqPref(Gli_Man_t *p, int nPref)
#define Gli_ManForEachObj(p, pObj, i)
int Gli_ManCreateCo(Gli_Man_t *p, int iFanin)
#define Gli_ManForEachEntry(vVec, p, pObj, i)
#define Gli_ManForEachRi(p, pObj, i)
int Gli_ManCreateCi(Gli_Man_t *p, int nFanouts)
void Gli_ManSetPiFromSaved(Gli_Man_t *p, int iBit)
#define Gli_ObjForEachFanin(pObj, pNext, i)
void Gli_ManStop(Gli_Man_t *p)
#define Gli_ManForEachRiRo(p, pObjRi, pObjRo, i)
void Gli_ManSwitchesAndGlitches(Gli_Man_t *p, int nPatterns, float PiTransProb, int fVerbose)
#define Gli_ManForEachNode(p, pObj, i)
void Gli_ManSwitching(Gli_Man_t *p)
int Gli_ObjNumSwitches(Gli_Man_t *p, int iNode)
void Gli_ManPrintObjects(Gli_Man_t *p)
Gli_Obj_t * Gli_ObjAlloc(Gli_Man_t *p, int nFanins, int nFanouts)
unsigned Gia_ManRandom(int fReset)
FUNCTION DEFINITIONS ///.
unsigned __int64 word
DECLARATIONS ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.