36static inline unsigned Saig_SynchNot(
unsigned w )
38 return w^((~(w&(w>>1)))&0x55555555);
40static inline unsigned Saig_SynchAnd(
unsigned u,
unsigned w )
42 return (u&w)|((((u&(u>>1)&w&~(w>>1))|(w&(w>>1)&u&~(u>>1)))&0x55555555)<<1);
44static inline unsigned Saig_SynchRandomBinary()
48static inline unsigned Saig_SynchRandomTernary()
51 return w^((~w)&(w>>1)&0x55555555);
53static inline unsigned Saig_SynchTernary(
int v )
55 assert( v == 0 || v == 1 || v == 3 );
56 return v? ((v==1)? 0x55555555 : 0xffffffff) : 0;
80 pObj = Aig_ManConst1( pAig );
81 pSim = (
unsigned *)Vec_PtrEntry( vSimInfo, pObj->
Id );
82 for ( w = 0; w <
nWords; w++ )
104 pSim = (
unsigned *)Vec_PtrEntry( vSimInfo, pObj->
Id );
105 for ( w = 0; w <
nWords; w++ )
106 pSim[w] = 0xffffffff;
128 pSim = (
unsigned *)Vec_PtrEntry( vSimInfo, pObj->
Id );
129 for ( w = 0; w <
nWords; w++ )
130 pSim[w] = Saig_SynchTernary( pObj->
fMarkA );
152 pSim = (
unsigned *)Vec_PtrEntry( vSimInfo, pObj->
Id );
153 for ( w = 0; w <
nWords; w++ )
154 pSim[w] = Saig_SynchRandomBinary();
176 pSim = (
unsigned *)Vec_PtrEntry( vSimInfo, pObj->
Id );
177 for ( w = 0; w <
nWords; w++ )
178 pSim[w] = Saig_SynchTernary( pValues[i] );
196 unsigned * pSim0, * pSim1, * pSim;
201 pSim = (
unsigned *)Vec_PtrEntry( vSimInfo, pObj->
Id );
202 pSim0 = (
unsigned *)Vec_PtrEntry( vSimInfo, Aig_ObjFaninId0(pObj) );
203 pSim1 = (
unsigned *)Vec_PtrEntry( vSimInfo, Aig_ObjFaninId1(pObj) );
204 if ( Aig_ObjFaninC0(pObj) && Aig_ObjFaninC1(pObj) )
206 for ( w = 0; w <
nWords; w++ )
207 pSim[w] = Saig_SynchAnd( Saig_SynchNot(pSim0[w]), Saig_SynchNot(pSim1[w]) );
209 else if ( !Aig_ObjFaninC0(pObj) && Aig_ObjFaninC1(pObj) )
211 for ( w = 0; w <
nWords; w++ )
212 pSim[w] = Saig_SynchAnd( pSim0[w], Saig_SynchNot(pSim1[w]) );
214 else if ( Aig_ObjFaninC0(pObj) && !Aig_ObjFaninC1(pObj) )
216 for ( w = 0; w <
nWords; w++ )
217 pSim[w] = Saig_SynchAnd( Saig_SynchNot(pSim0[w]), pSim1[w] );
221 for ( w = 0; w <
nWords; w++ )
222 pSim[w] = Saig_SynchAnd( pSim0[w], pSim1[w] );
228 pSim = (
unsigned *)Vec_PtrEntry( vSimInfo, pObj->
Id );
229 pSim0 = (
unsigned *)Vec_PtrEntry( vSimInfo, Aig_ObjFaninId0(pObj) );
230 if ( Aig_ObjFaninC0(pObj) )
232 for ( w = 0; w <
nWords; w++ )
233 pSim[w] = Saig_SynchNot( pSim0[w] );
237 for ( w = 0; w <
nWords; w++ )
257 unsigned * pSim0, * pSim1;
261 pSim0 = (
unsigned *)Vec_PtrEntry( vSimInfo, pObjLi->
Id );
262 pSim1 = (
unsigned *)Vec_PtrEntry( vSimInfo, pObjLo->
Id );
263 for ( w = 0; w <
nWords; w++ )
283 int * pCounters, i, w, b;
284 int iPatBest, iTernMin;
289 pSim = (
unsigned *)Vec_PtrEntry( vSimInfo, pObj->
Id );
290 for ( w = 0; w <
nWords; w++ )
291 for ( b = 0; b < 16; b++ )
292 if ( ((pSim[w] >> (b << 1)) & 3) == 3 )
293 pCounters[16 * w + b]++;
297 iTernMin = 1 + Saig_ManRegNum(pAig);
298 for ( b = 0; b < 16 *
nWords; b++ )
299 if ( iTernMin > pCounters[b] )
301 iTernMin = pCounters[b];
326 int Counter, Value, i, w;
330 pSim = (
unsigned *)Vec_PtrEntry( vSimInfo, pObj->
Id );
331 Value = (pSim[iPat>>4] >> ((iPat&0xf) << 1)) & 3;
332 Vec_StrPush( vSequence, (
char)Value );
339 pSim = (
unsigned *)Vec_PtrEntry( vSimInfo, pObjLi->
Id );
340 Value = (pSim[iPat>>4] >> ((iPat&0xf) << 1)) & 3;
341 Counter += (Value == 3);
343 pSim = (
unsigned *)Vec_PtrEntry( vSimInfo, pObjLo->
Id );
344 for ( w = 0; w <
nWords; w++ )
345 pSim[w] = Saig_SynchTernary( Value );
365 int Counter, nIters, Value, i;
366 assert( Vec_StrSize(vSequence) % Saig_ManPiNum(pAig) == 0 );
367 nIters = Vec_StrSize(vSequence) / Saig_ManPiNum(pAig);
373 for ( i = 0; i < nIters; i++ )
383 pSim = (
unsigned *)Vec_PtrEntry( vSimInfo, pObj->
Id );
386 Counter += (Value == 3);
410 int nTerPrev, nTerCur = 0, nTerCur2;
411 int iPatBest, RetValue, s, t;
412 assert( Saig_ManRegNum(pAig) > 0 );
416 vSequence = Vec_StrAlloc( 20 * Saig_ManRegNum(pAig) );
418 vSimInfo = Vec_PtrAllocSimInfo( Aig_ManObjNumMax(pAig),
nWords );
421 nTerPrev = Saig_ManRegNum(pAig);
423 for ( s = 0; s < nStepsMax && nTerPrev > 0; s++ )
425 for ( t = 0; t < nTriesMax; t++ )
430 if ( nTerCur < nTerPrev )
433 if ( t == nTriesMax )
436 assert( nTerCur == nTerCur2 );
441 printf(
"Count not initialize %d registers.\n", nTerPrev );
442 Vec_PtrFree( vSimInfo );
443 Vec_StrFree( vSequence );
453 Vec_PtrFree( vSimInfo );
474 pNew->pName = Abc_UtilStrsav(
p->pName );
475 Aig_ManConst1(
p)->pData = Aig_ManConst1(pNew);
481 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
487 assert( Aig_ManNodeNum(pNew) == Aig_ManNodeNum(
p) );
513 if ( vSequence == NULL )
514 printf(
"Design 1: Synchronizing sequence is not found. " );
516 printf(
"Design 1: Synchronizing sequence of length %4d is found. ", Vec_StrSize(vSequence) / Saig_ManPiNum(pAig) );
519 ABC_PRT(
"Time", Abc_Clock() - clk );
523 if ( vSequence == NULL )
525 printf(
"Quitting synchronization.\n" );
530 vSimInfo = Vec_PtrAllocSimInfo( Aig_ManObjNumMax(pAig), 1 );
536 Vec_PtrFree( vSimInfo );
537 Vec_StrFree( vSequence );
581 printf(
"Design 1: " );
583 printf(
"Design 2: " );
591 printf(
"Design 1: Synchronizing sequence is not found. " );
593 printf(
"Design 1: Synchronizing sequence of length %4d is found. ", Vec_StrSize(vSeq1) / Saig_ManPiNum(pAig1) );
596 ABC_PRT(
"Time", Abc_Clock() - clk );
605 printf(
"Design 2: Synchronizing sequence is not found. " );
607 printf(
"Design 2: Synchronizing sequence of length %4d is found. ", Vec_StrSize(vSeq2) / Saig_ManPiNum(pAig2) );
610 ABC_PRT(
"Time", Abc_Clock() - clk );
616 if ( vSeq1 == NULL || vSeq2 == NULL )
618 printf(
"Quitting synchronization.\n" );
619 if ( vSeq1 ) Vec_StrFree( vSeq1 );
620 if ( vSeq2 ) Vec_StrFree( vSeq2 );
624 vSimInfo = Vec_PtrAllocSimInfo( Abc_MaxInt( Aig_ManObjNumMax(pAig1), Aig_ManObjNumMax(pAig2) ), 1 );
645 Vec_PtrFree( vSimInfo );
646 Vec_StrFree( vSeq1 );
647 Vec_StrFree( vSeq2 );
653 printf(
"Miter of the synchronized designs is constructed. " );
654 ABC_PRT(
"Time", Abc_Clock() - clk );
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
void Aig_ManCleanMarkA(Aig_Man_t *p)
void Aig_ManStop(Aig_Man_t *p)
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
void Aig_ManPrintStats(Aig_Man_t *p)
#define Aig_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
unsigned Aig_ManRandom(int fReset)
struct Vec_Str_t_ Vec_Str_t
void Saig_SynchInitPisRandom(Aig_Man_t *pAig, Vec_Ptr_t *vSimInfo, int nWords)
Aig_Man_t * Saig_ManDupInitZero(Aig_Man_t *p)
int Saig_SynchSavePattern(Aig_Man_t *pAig, Vec_Ptr_t *vSimInfo, int nWords, int iPat, Vec_Str_t *vSequence)
Aig_Man_t * Saig_SynchSequenceApply(Aig_Man_t *pAig, int nWords, int fVerbose)
void Saig_SynchTernaryTransferState(Aig_Man_t *pAig, Vec_Ptr_t *vSimInfo, int nWords)
int Saig_SynchCountX(Aig_Man_t *pAig, Vec_Ptr_t *vSimInfo, int nWords, int *piPat)
Aig_Man_t * Saig_Synchronize(Aig_Man_t *pAig1, Aig_Man_t *pAig2, int nWords, int fVerbose)
void Saig_SynchInitPisGiven(Aig_Man_t *pAig, Vec_Ptr_t *vSimInfo, int nWords, char *pValues)
void Saig_SynchTernarySimulate(Aig_Man_t *pAig, Vec_Ptr_t *vSimInfo, int nWords)
void Saig_SynchInitRegsBinary(Aig_Man_t *pAig, Vec_Ptr_t *vSimInfo, int nWords)
void Saig_SynchSetConstant1(Aig_Man_t *pAig, Vec_Ptr_t *vSimInfo, int nWords)
FUNCTION DEFINITIONS ///.
int Saig_SynchSequenceRun(Aig_Man_t *pAig, Vec_Ptr_t *vSimInfo, Vec_Str_t *vSequence, int fTernary)
void Saig_SynchInitRegsTernary(Aig_Man_t *pAig, Vec_Ptr_t *vSimInfo, int nWords)
Vec_Str_t * Saig_SynchSequence(Aig_Man_t *pAig, int nWords)
#define Saig_ManForEachLiLo(p, pObjLi, pObjLo, i)
#define Saig_ManForEachLi(p, pObj, i)
#define Saig_ManForEachPo(p, pObj, i)
#define Saig_ManForEachLo(p, pObj, i)
#define Saig_ManForEachPi(p, pObj, i)
Aig_Man_t * Saig_ManCreateMiter(Aig_Man_t *p1, Aig_Man_t *p2, int Oper)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.