58static inline unsigned * Gia_SwiData(
Gia_ManSwi_t *
p,
int i ) {
return p->pDataSim + i *
p->nWords; }
59static inline unsigned * Gia_SwiDataCi(
Gia_ManSwi_t *
p,
int i ) {
return p->pDataSimCis + i *
p->nWords; }
60static inline unsigned * Gia_SwiDataCo(
Gia_ManSwi_t *
p,
int i ) {
return p->pDataSimCos + i *
p->nWords; }
107 p->nWords = pPars->nWords;
108 p->pDataSim =
ABC_ALLOC(
unsigned,
p->nWords *
p->pAig->nFront );
109 p->pDataSimCis =
ABC_ALLOC(
unsigned,
p->nWords * Gia_ManCiNum(
p->pAig) );
110 p->pDataSimCos =
ABC_ALLOC(
unsigned,
p->nWords * Gia_ManCoNum(
p->pAig) );
111 p->pData1 =
ABC_CALLOC(
int, Gia_ManObjNum(pAig) );
147static inline void Gia_ManSwiSimInfoRandom(
Gia_ManSwi_t *
p,
unsigned * pInfo,
int nProbNum )
151 if ( nProbNum == -1 )
155 for ( w =
p->nWords-1; w >= 0; w-- )
158 else if ( nProbNum > 0 )
161 for ( i = 0; i < nProbNum; i++ )
163 for ( w =
p->nWords-1; w >= 0; w-- )
166 else if ( nProbNum == 0 )
168 for ( w =
p->nWords-1; w >= 0; w-- )
186static inline void Gia_ManSwiSimInfoRandomShift(
Gia_ManSwi_t *
p,
unsigned * pInfo,
int nProbNum )
190 if ( nProbNum == -1 )
195 else if ( nProbNum >= 0 )
198 for ( i = 0; i < nProbNum; i++ )
203 for ( w =
p->nWords-1; w >= 0; w-- )
204 pInfo[w] = (pInfo[w] << 16) | ((pInfo[w] ^ Mask) & 0xffff);
218static inline void Gia_ManSwiSimInfoZero(
Gia_ManSwi_t *
p,
unsigned * pInfo )
221 for ( w =
p->nWords-1; w >= 0; w-- )
236static inline void Gia_ManSwiSimInfoOne(
Gia_ManSwi_t *
p,
unsigned * pInfo )
239 for ( w =
p->nWords-1; w >= 0; w-- )
254static inline void Gia_ManSwiSimInfoCopy(
Gia_ManSwi_t *
p,
unsigned * pInfo,
unsigned * pInfo0 )
257 for ( w =
p->nWords-1; w >= 0; w-- )
258 pInfo[w] = pInfo0[w];
272static inline void Gia_ManSwiSimInfoCopyShift(
Gia_ManSwi_t *
p,
unsigned * pInfo,
unsigned * pInfo0 )
275 for ( w =
p->nWords-1; w >= 0; w-- )
276 pInfo[w] = (pInfo[w] << 16) | (pInfo0[w] & 0xffff);
292 unsigned * pInfo = Gia_SwiData(
p, Gia_ObjValue(pObj) );
293 unsigned * pInfo0 = Gia_SwiDataCi(
p, iCi );
295 for ( w =
p->nWords-1; w >= 0; w-- )
296 pInfo[w] = pInfo0[w];
312 unsigned * pInfo = Gia_SwiDataCo(
p, iCo );
313 unsigned * pInfo0 = Gia_SwiData(
p, Gia_ObjDiff0(pObj) );
315 if ( Gia_ObjFaninC0(pObj) )
316 for ( w =
p->nWords-1; w >= 0; w-- )
317 pInfo[w] = ~pInfo0[w];
319 for ( w =
p->nWords-1; w >= 0; w-- )
320 pInfo[w] = pInfo0[w];
336 unsigned * pInfo = Gia_SwiData(
p, Gia_ObjValue(pObj) );
337 unsigned * pInfo0 = Gia_SwiData(
p, Gia_ObjDiff0(pObj) );
338 unsigned * pInfo1 = Gia_SwiData(
p, Gia_ObjDiff1(pObj) );
340 if ( Gia_ObjFaninC0(pObj) )
342 if ( Gia_ObjFaninC1(pObj) )
343 for ( w =
p->nWords-1; w >= 0; w-- )
344 pInfo[w] = ~(pInfo0[w] | pInfo1[w]);
346 for ( w =
p->nWords-1; w >= 0; w-- )
347 pInfo[w] = ~pInfo0[w] & pInfo1[w];
351 if ( Gia_ObjFaninC1(pObj) )
352 for ( w =
p->nWords-1; w >= 0; w-- )
353 pInfo[w] = pInfo0[w] & ~pInfo1[w];
355 for ( w =
p->nWords-1; w >= 0; w-- )
356 pInfo[w] = pInfo0[w] & pInfo1[w];
374 for ( ; i < Gia_ManPiNum(
p->pAig); i++ )
375 Gia_ManSwiSimInfoRandom(
p, Gia_SwiDataCi(
p, i), 0 );
376 for ( ; i < Gia_ManCiNum(
p->pAig); i++ )
377 Gia_ManSwiSimInfoZero(
p, Gia_SwiDataCi(
p, i) );
391static inline void Gia_ManSwiSimInfoTransfer(
Gia_ManSwi_t *
p,
int nProbNum )
393 int i = 0, nShift = Gia_ManPoNum(
p->pAig)-Gia_ManPiNum(
p->pAig);
394 for ( ; i < Gia_ManPiNum(
p->pAig); i++ )
395 Gia_ManSwiSimInfoRandom(
p, Gia_SwiDataCi(
p, i), nProbNum );
396 for ( ; i < Gia_ManCiNum(
p->pAig); i++ )
397 Gia_ManSwiSimInfoCopy(
p, Gia_SwiDataCi(
p, i), Gia_SwiDataCo(
p, nShift+i) );
411static inline void Gia_ManSwiSimInfoTransferShift(
Gia_ManSwi_t *
p,
int nProbNum )
413 int i = 0, nShift = Gia_ManPoNum(
p->pAig)-Gia_ManPiNum(
p->pAig);
414 for ( ; i < Gia_ManPiNum(
p->pAig); i++ )
415 Gia_ManSwiSimInfoRandomShift(
p, Gia_SwiDataCi(
p, i), nProbNum );
416 for ( ; i < Gia_ManCiNum(
p->pAig); i++ )
417 Gia_ManSwiSimInfoCopyShift(
p, Gia_SwiDataCi(
p, i), Gia_SwiDataCo(
p, nShift+i) );
431static inline int Gia_ManSwiSimInfoCountOnes(
Gia_ManSwi_t *
p,
int iPlace )
435 pInfo = Gia_SwiData(
p, iPlace );
436 for ( w =
p->nWords-1; w >= 0; w-- )
437 Counter += Gia_WordCountOnes( pInfo[w] );
452static inline int Gia_ManSwiSimInfoCountTrans(
Gia_ManSwi_t *
p,
int iPlace )
456 pInfo = Gia_SwiData(
p, iPlace );
457 for ( w =
p->nWords-1; w >= 0; w-- )
458 Counter += 2*Gia_WordCountOnes( (pInfo[w] ^ (pInfo[w] >> 16)) & 0xffff );
473static inline void Gia_ManSwiSimulateRound(
Gia_ManSwi_t *
p,
int fCount )
478 assert( Gia_ManConst0(
p->pAig)->Value == 0 );
479 Gia_ManSwiSimInfoZero(
p, Gia_SwiData(
p, 0) );
482 if ( Gia_ObjIsAndOrConst0(pObj) )
484 assert( Gia_ObjValue(pObj) <
p->pAig->nFront );
485 Gia_ManSwiSimulateNode(
p, pObj );
487 else if ( Gia_ObjIsCo(pObj) )
491 Gia_ManSwiSimulateCo(
p, Gia_ObjCioId(pObj), pObj );
495 assert( Gia_ObjValue(pObj) <
p->pAig->nFront );
497 Gia_ManSwiSimulateCi(
p, pObj, Gia_ObjCioId(pObj) );
499 if ( fCount && !Gia_ObjIsCo(pObj) )
501 if (
p->pPars->fProbTrans )
502 p->pData1[i] += Gia_ManSwiSimInfoCountTrans(
p, Gia_ObjValue(pObj) );
504 p->pData1[i] += Gia_ManSwiSimInfoCountOnes(
p, Gia_ObjValue(pObj) );
524 int nTotal = 32 * nSimWords;
541 int nTotal = 32 * nSimWords;
542 return (
float)nOnes /
nTotal;
563 abctime clk, clkTotal = Abc_Clock();
564 if ( pPars->fProbOne && pPars->fProbTrans )
565 printf(
"Conflict of options: Can either compute probability of 1, or probability of switching by observing transitions.\n" );
569 if ( pPars->fVerbose )
571 printf(
"Obj = %8d (%8d). F = %6d. ",
572 pAig->
nObjs, Gia_ManCiNum(pAig) + Gia_ManAndNum(pAig),
p->pAig->nFront );
573 printf(
"AIG = %7.2f MB. F-mem = %7.2f MB. Other = %7.2f MB. ",
574 12.0*Gia_ManObjNum(
p->pAig)/(1<<20),
575 4.0*
p->nWords*
p->pAig->nFront/(1<<20),
576 4.0*
p->nWords*(Gia_ManCiNum(
p->pAig) + Gia_ManCoNum(
p->pAig))/(1<<20) );
577 ABC_PRT(
"Time", Abc_Clock() - clk );
581 Gia_ManSwiSimInfoInit(
p );
582 for ( i = 0; i < pPars->nIters; i++ )
584 Gia_ManSwiSimulateRound(
p, i >= pPars->nPref );
585 if ( i == pPars->nIters - 1 )
587 if ( pPars->fProbTrans )
588 Gia_ManSwiSimInfoTransferShift(
p, pPars->nRandPiFactor );
590 Gia_ManSwiSimInfoTransfer(
p, pPars->nRandPiFactor );
592 if ( pPars->fVerbose )
594 printf(
"Simulated %d frames with %d words. ", pPars->nIters, pPars->nWords );
595 ABC_PRT(
"Simulation time", Abc_Clock() - clkTotal );
598 vSwitching = Vec_IntStart( Gia_ManObjNum(pAig) );
599 pSwitching = (
float *)vSwitching->pArray;
600 if ( pPars->fProbOne )
606 if ( Gia_ObjFaninC0(pObj) )
607 pSwitching[Gia_ObjId(pAig,pObj)] = (float)1.0-pSwitching[Gia_ObjId(pAig,Gia_ObjFanin0(pObj))];
609 pSwitching[Gia_ObjId(pAig,pObj)] = pSwitching[Gia_ObjId(pAig,Gia_ObjFanin0(pObj))];
612 else if ( pPars->fProbTrans )
664 pPars->nIters = nFrames;
667 pPars->nPref = nPref;
673 pPars->fProbTrans = 0;
679 pPars->fProbTrans = 1;
689 pPars->nRandPiFactor = nRandPiFactor;
691 pPars->nIters = nFrames;
694 pPars->nPref = nPref;
700 pPars->fProbTrans = 0;
706 pPars->fProbTrans = 1;
722 vResult = Vec_IntStart( Aig_ManObjNumMax(pAig) );
727 Vec_IntWriteEntry( vResult, i, Vec_IntEntry(vSwitching, Abc_Lit2Var(pObj->
iData)) );
730 Vec_IntFree( vSwitching );
749 float SwitchTotal = 0.0;
755 SwitchTotal += (float)Gia_ObjRefNum(
p, pObj) *
p->pSwitching[i] / 255;
811 float * pSwi = (
float *)Vec_IntArray(vSwitching), SwiTotal = 0;
814 if ( Gia_ManHasMapping(
p) )
818 SwiTotal += pSwi[iFan];
823 SwiTotal += pSwi[Gia_ObjFaninId0(pObj, i)] + pSwi[Gia_ObjFaninId1(pObj, i)];
829 printf(
"Switch %6.2f ", pSwi[i] );
833 Vec_IntFree( vSwitching );
852 assert( Gia_ManObjNum(pDfs) == Gia_ManObjNum(
p) );
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define Aig_ManForEachObj(p, pObj, i)
struct Aig_Obj_t_ Aig_Obj_t
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int nTotal
DECLARATIONS ///.
ABC_DLL char * Abc_FrameReadFlag(char *pFlag)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Gia_Man_t * Gia_ManFromAigSwitch(Aig_Man_t *p)
float Gia_ManSwiComputeProbOne(int nOnes, int nSimWords)
void Gia_ManSetDefaultParamsSwi(Gia_ParSwi_t *p)
FUNCTION DEFINITIONS ///.
float Gia_ManSwiComputeSwitching(int nOnes, int nSimWords)
float Gia_ManComputeSwitching(Gia_Man_t *p, int nFrames, int nPref, int fProbOne)
Vec_Int_t * Saig_ManComputeSwitchProbs(Aig_Man_t *pAig, int nFrames, int nPref, int fProbOne)
void Gia_ManSwiDelete(Gia_ManSwi_t *p)
Vec_Int_t * Gia_ManSwiSimulate(Gia_Man_t *pAig, Gia_ParSwi_t *pPars)
typedefABC_NAMESPACE_IMPL_START struct Gia_ParSwi_t_ Gia_ParSwi_t
DECLARATIONS ///.
struct Gia_ManSwi_t_ Gia_ManSwi_t
Vec_Flt_t * Gia_ManPrintOutputProb(Gia_Man_t *p)
Gia_ManSwi_t * Gia_ManSwiCreate(Gia_Man_t *pAig, Gia_ParSwi_t *pPars)
float Gia_ManEvaluateSwitching(Gia_Man_t *p)
Vec_Int_t * Gia_ManComputeSwitchProbs(Gia_Man_t *pGia, int nFrames, int nPref, int fProbOne)
Vec_Int_t * Gia_ManComputeSwitchProbs2(Gia_Man_t *pGia, int nFrames, int nPref, int fProbOne, int nRandPiFactor)
void Gia_ManStop(Gia_Man_t *p)
Gia_Man_t * Gia_ManDup(Gia_Man_t *p)
#define Gia_ManForEachAnd(p, pObj, i)
#define Gia_ManForEachLut(p, i)
struct Gia_Obj_t_ Gia_Obj_t
#define Gia_LutForEachFanin(p, i, iFan, k)
void Gia_ObjPrint(Gia_Man_t *p, Gia_Obj_t *pObj)
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachObj1(p, pObj, i)
#define GIA_NONE
INCLUDES ///.
Gia_Man_t * Gia_ManFront(Gia_Man_t *p)
void Gia_ManCreateRefs(Gia_Man_t *p)
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
#define Gia_ManForEachCo(p, pObj, i)
unsigned Gia_ManRandom(int fReset)
FUNCTION DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Flt_t_ Vec_Flt_t
INCLUDES ///.