22#include "aig/ssw/ssw.h"
46static inline void Fsim_ManSimInfoRandom(
Fsim_Man_t *
p,
unsigned * pInfo )
49 for ( w =
p->nWords-1; w >= 0; w-- )
64static inline void Fsim_ManSimInfoZero(
Fsim_Man_t *
p,
unsigned * pInfo )
67 for ( w =
p->nWords-1; w >= 0; w-- )
82static inline int Fsim_ManSimInfoIsZero(
Fsim_Man_t *
p,
unsigned * pInfo )
85 for ( w =
p->nWords-1; w >= 0; w-- )
87 return 32*(w-1) + Aig_WordFindFirstBit( pInfo[w] );
102static inline void Fsim_ManSimInfoOne(
Fsim_Man_t *
p,
unsigned * pInfo )
105 for ( w =
p->nWords-1; w >= 0; w-- )
120static inline void Fsim_ManSimInfoCopy(
Fsim_Man_t *
p,
unsigned * pInfo,
unsigned * pInfo0 )
123 for ( w =
p->nWords-1; w >= 0; w-- )
124 pInfo[w] = pInfo0[w];
138static inline void Fsim_ManSimulateCi(
Fsim_Man_t *
p,
int iNode,
int iCi )
140 unsigned * pInfo = Fsim_SimData(
p, iNode %
p->nFront );
141 unsigned * pInfo0 = Fsim_SimDataCi(
p, iCi );
143 for ( w =
p->nWords-1; w >= 0; w-- )
144 pInfo[w] = pInfo0[w];
158static inline void Fsim_ManSimulateCo(
Fsim_Man_t *
p,
int iCo,
int iFan0 )
160 unsigned * pInfo = Fsim_SimDataCo(
p, iCo );
161 unsigned * pInfo0 = Fsim_SimData(
p, Fsim_Lit2Var(iFan0) %
p->nFront );
163 if ( Fsim_LitIsCompl(iFan0) )
164 for ( w =
p->nWords-1; w >= 0; w-- )
165 pInfo[w] = ~pInfo0[w];
167 for ( w =
p->nWords-1; w >= 0; w-- )
168 pInfo[w] = pInfo0[w];
182static inline void Fsim_ManSimulateNode(
Fsim_Man_t *
p,
int iNode,
int iFan0,
int iFan1 )
184 unsigned * pInfo = Fsim_SimData(
p, iNode %
p->nFront );
185 unsigned * pInfo0 = Fsim_SimData(
p, Fsim_Lit2Var(iFan0) %
p->nFront );
186 unsigned * pInfo1 = Fsim_SimData(
p, Fsim_Lit2Var(iFan1) %
p->nFront );
188 if ( Fsim_LitIsCompl(iFan0) && Fsim_LitIsCompl(iFan1) )
189 for ( w =
p->nWords-1; w >= 0; w-- )
190 pInfo[w] = ~(pInfo0[w] | pInfo1[w]);
191 else if ( Fsim_LitIsCompl(iFan0) && !Fsim_LitIsCompl(iFan1) )
192 for ( w =
p->nWords-1; w >= 0; w-- )
193 pInfo[w] = ~pInfo0[w] & pInfo1[w];
194 else if ( !Fsim_LitIsCompl(iFan0) && Fsim_LitIsCompl(iFan1) )
195 for ( w =
p->nWords-1; w >= 0; w-- )
196 pInfo[w] = pInfo0[w] & ~pInfo1[w];
198 for ( w =
p->nWords-1; w >= 0; w-- )
199 pInfo[w] = pInfo0[w] & pInfo1[w];
213static inline void Fsim_ManSimInfoInit(
Fsim_Man_t *
p )
218 if ( iPioNum < p->nPis )
219 Fsim_ManSimInfoRandom(
p, Fsim_SimDataCi(
p, i) );
221 Fsim_ManSimInfoZero(
p, Fsim_SimDataCi(
p, i) );
236static inline void Fsim_ManSimInfoTransfer(
Fsim_Man_t *
p )
241 if ( iPioNum < p->nPis )
242 Fsim_ManSimInfoRandom(
p, Fsim_SimDataCi(
p, i) );
244 Fsim_ManSimInfoCopy(
p, Fsim_SimDataCi(
p, i), Fsim_SimDataCo(
p,
p->nPos+iPioNum-
p->nPis) );
259static inline int Fsim_ManRestoreNum(
Fsim_Man_t *
p )
262 for ( i = 0; (ch = *
p->pDataCur++) & 0x80; i++ )
263 x |= (ch & 0x7f) << (7 * i);
264 assert(
p->pDataCur -
p->pDataAig <
p->nDataAig );
265 return x | (ch << (7 * i));
281 int iValue = Fsim_ManRestoreNum(
p );
282 if ( (iValue & 3) == 3 )
284 pObj->iNode = (iValue >> 2) +
p->iNodePrev;
285 pObj->iFan0 = (pObj->iNode << 1) - Fsim_ManRestoreNum(
p );
286 pObj->iFan1 = pObj->iFan0 - Fsim_ManRestoreNum(
p );
287 p->iNodePrev = pObj->iNode;
289 else if ( (iValue & 3) == 1 )
291 pObj->iNode = (iValue >> 2) +
p->iNodePrev;
294 p->iNodePrev = pObj->iNode;
299 pObj->iFan0 = ((
p->iNodePrev << 1) | 1) - (iValue >> 1);
316static inline void Fsim_ManSimulateRound2(
Fsim_Man_t *
p )
319 int i, iCis = 0, iCos = 0;
320 if ( Aig_ObjRefs(Aig_ManConst1(
p->pAig)) )
321 Fsim_ManSimInfoOne(
p, Fsim_SimData(
p, 1) );
324 if ( pObj->iFan0 == 0 )
325 Fsim_ManSimulateCi(
p, pObj->iNode, iCis++ );
326 else if ( pObj->iFan1 == 0 )
327 Fsim_ManSimulateCo(
p, iCos++, pObj->iFan0 );
329 Fsim_ManSimulateNode(
p, pObj->iNode, pObj->iFan0, pObj->iFan1 );
346static inline void Fsim_ManSimulateRound(
Fsim_Man_t *
p )
349 int iCis = 0, iCos = 0;
350 if (
p->pDataAig2 == NULL )
352 Fsim_ManSimulateRound2(
p );
355 if ( Aig_ObjRefs(Aig_ManConst1(
p->pAig)) )
356 Fsim_ManSimInfoOne(
p, Fsim_SimData(
p, 1) );
357 pCur =
p->pDataAig2 + 6;
358 pEnd =
p->pDataAig2 + 3 *
p->nObjs;
359 while ( pCur < pEnd )
362 Fsim_ManSimulateCi(
p, pCur[0], iCis++ );
363 else if ( pCur[2] == 0 )
364 Fsim_ManSimulateCo(
p, iCos++, pCur[1] );
366 Fsim_ManSimulateNode(
p, pCur[0], pCur[1], pCur[2] );
388 clock_t clk = clock();
406static inline int Fsim_ManCheckPos(
Fsim_Man_t *
p,
int * piPo,
int * piPat )
409 for ( i = 0; i <
p->nPos; i++ )
411 iPat = Fsim_ManSimInfoIsZero(
p, Fsim_SimDataCo(
p, i) );
437 int f, i, w, iPioId, Counter;
438 p =
Abc_CexAlloc( Aig_ManRegNum(pAig), Saig_ManPiNum(pAig), iFrame+1 );
445 for ( f = 0; f <= iFrame; f++, Counter +=
p->nPis )
446 for ( i = 0; i < Aig_ManPiNum(pAig); i++ )
448 iPioId = Vec_IntEntry( vCis2Ids, i );
449 if ( iPioId >=
p->nPis )
451 for ( w =
nWords-1; w >= 0; w-- )
453 if ( Aig_InfoHasBit( pData, iPat ) )
454 Aig_InfoSetBit(
p->pData, Counter + iPioId );
476 clock_t clk, clkTotal = clock(), clk2, clk2Total = 0;
477 assert( Aig_ManRegNum(pAig) > 0 );
481 if ( Status.nSat > 0 )
483 printf(
"Miter is trivially satisfiable (output %d).\n", Status.iOut );
486 if ( Status.nUndec == 0 )
488 printf(
"Miter is trivially unsatisfiable.\n" );
498 printf(
"Obj = %8d (%8d). Cut = %6d. Front = %6d. FrtMem = %7.2f MB. ",
499 p->nObjs,
p->nCis +
p->nNodes,
p->nCrossCutMax,
p->nFront,
500 4.0*
p->nWords*(
p->nFront)/(1<<20) );
501 ABC_PRT(
"Time", clock() - clk );
508 printf(
"Max ID = %8d. Log max ID = %2d. AigMem = %7.2f MB (%5.2f byte/obj). ",
509 p->iNumber, Aig_Base2Log(
p->iNumber),
510 1.0*(
p->pDataCur-
p->pDataAig)/(1<<20),
511 1.0*(
p->pDataCur-
p->pDataAig)/
p->nObjs );
512 ABC_PRT(
"Time", clock() - clk );
517 p->pDataSim =
ABC_ALLOC(
unsigned,
p->nWords *
p->nFront );
518 p->pDataSimCis =
ABC_ALLOC(
unsigned,
p->nWords *
p->nCis );
519 p->pDataSimCos =
ABC_ALLOC(
unsigned,
p->nWords *
p->nCos );
520 Fsim_ManSimInfoInit(
p );
521 for ( i = 0; i < pPars->
nIters; i++ )
523 Fsim_ManSimulateRound(
p );
526 printf(
"Frame %4d out of %4d and timeout %3d sec. ", i+1, pPars->
nIters, pPars->
TimeLimit );
527 printf(
"Time = %7.2f sec\r", (1.0*clock()-clkTotal)/CLOCKS_PER_SEC );
529 if ( pPars->
fCheckMiter && Fsim_ManCheckPos(
p, &iOut, &iPat ) )
531 assert( pAig->pSeqModel == NULL );
534 printf(
"Miter is satisfiable after simulation (output %d).\n", iOut );
537 if ( (clock() - clkTotal)/CLOCKS_PER_SEC >= pPars->
TimeLimit )
540 if ( i < pPars->nIters - 1 )
541 Fsim_ManSimInfoTransfer(
p );
542 clk2Total += clock() - clk2;
544 if ( pAig->pSeqModel == NULL )
545 printf(
"No bug detected after %d frames with time limit %d seconds.\n", i+1, pPars->
TimeLimit );
548 printf(
"Maxcut = %8d. AigMem = %7.2f MB. SimMem = %7.2f MB. ",
550 p->pDataAig2? 12.0*
p->nObjs/(1<<20) : 1.0*(
p->pDataCur-
p->pDataAig)/(1<<20),
551 4.0*
p->nWords*(
p->nFront+
p->nCis+
p->nCos)/(1<<20) );
552 ABC_PRT(
"Sim time", clock() - clkTotal );
559 return pAig->pSeqModel != NULL;
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
unsigned Aig_ManRandom(int fReset)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Fsim_ManFront(Fsim_Man_t *p, int fCompressAig)
FUNCTION DECLARATIONS ///.
#define Fsim_ManForEachObj(p, pObj, i)
void Fsim_ManDelete(Fsim_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Fsim_Obj_t_ Fsim_Obj_t
INCLUDES ///.
Fsim_Man_t * Fsim_ManCreate(Aig_Man_t *pAig)
int Fsim_ManSimulate(Aig_Man_t *pAig, Fsim_ParSim_t *pPars)
Abc_Cex_t * Fsim_ManGenerateCounter(Aig_Man_t *pAig, int iFrame, int iOut, int nWords, int iPat, Vec_Int_t *vCis2Ids)
void Fsim_ManSimulateRoundTest(Fsim_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Fsim_Man_t_ Fsim_Man_t
INCLUDES ///.
struct Fsim_ParSim_t_ Fsim_ParSim_t
Sec_MtrStatus_t Sec_MiterStatus(Aig_Man_t *p)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Sec_MtrStatus_t_ Sec_MtrStatus_t
INCLUDES ///.
ABC_NAMESPACE_IMPL_START Abc_Cex_t * Abc_CexAlloc(int nRegs, int nRealPis, int nFrames)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.