56 p->vPis = Vec_PtrAlloc( 100 );
57 p->vPos = Vec_PtrAlloc( 100 );
58 p->vBufs = Vec_PtrAlloc( 100 );
59 p->vObjs = Vec_PtrAlloc( 100 );
63 p->pConst1 = Ivy_ManFetchMemory(
p );
64 p->pConst1->fPhase = 1;
65 Vec_PtrPush(
p->vObjs,
p->pConst1 );
68 p->nTableSize = 10007;
70 memset(
p->pTable, 0,
sizeof(
int) *
p->nTableSize );
93 Ivy_ManConst1(
p)->pEquiv = Ivy_ManConst1(pNew);
121 Ivy_ManConst1(
p)->pEquiv = Ivy_ManConst1(pNew);
129 if ( Ivy_ObjIsBuf(pObj) )
130 pObj->
pEquiv = Ivy_ObjChild0Equiv(pObj);
132 pObj->
pEquiv =
Ivy_And( pNew, Ivy_ObjChild0Equiv(pObj), Ivy_ObjChild1Equiv(pObj) );
139 assert( !Ivy_ObjFaninC0(pObj) );
145 Vec_PtrShrink( pNew->vPis, Ivy_ManPiNum(
p) );
147 pNew->nObjs[
IVY_PI] -= Ivy_ManLatchNum(
p);
150 Vec_IntFree( vNodes );
151 Vec_IntFree( vLatches );
153 assert( Ivy_ManNodeNum(
p) == Ivy_ManNodeNum(pNew) );
154 assert( Ivy_ManLatchNum(
p) == Ivy_ManLatchNum(pNew) );
157 printf(
"Ivy_ManMakeSeq(): The check has failed.\n" );
177 int i, f, nPis, nPos, nIdMax;
178 assert( Ivy_ManLatchNum(pMan) == 0 );
181 nPis = Ivy_ManPiNum(pMan) - nLatches;
182 nPos = Ivy_ManPoNum(pMan) - nLatches;
183 nIdMax = Ivy_ManObjIdMax(pMan);
187 for ( i = 0; i < nLatches; i++ )
188 Ivy_ManPo(pMan, nPos+i)->pEquiv = fInit? Ivy_Not(Ivy_ManConst1(pNew)) :
Ivy_ObjCreatePi(pNew);
190 vMapping = Vec_PtrStart( nIdMax * nFrames + 1 );
191 for ( f = 0; f < nFrames; f++ )
194 Ivy_ManConst1(pMan)->pEquiv = Ivy_ManConst1(pNew);
195 for ( i = 0; i < nPis; i++ )
198 for ( i = 0; i < nLatches; i++ )
199 Ivy_ManPi(pMan, nPis+i)->pEquiv = Ivy_ManPo(pMan, nPos+i)->pEquiv;
202 pObj->
pEquiv =
Ivy_And( pNew, Ivy_ObjChild0Equiv(pObj), Ivy_ObjChild1Equiv(pObj) );
204 for ( i = 0; i < nPos; i++ )
205 Ivy_ManPo(pMan, i)->pEquiv =
Ivy_ObjCreatePo( pNew, Ivy_ObjChild0Equiv(Ivy_ManPo(pMan, i)) );
207 for ( i = 0; i < nLatches; i++ )
208 Ivy_ManPo(pMan, nPos+i)->pEquiv = Ivy_ObjChild0Equiv(Ivy_ManPo(pMan, nPos+i));
211 Vec_PtrWriteEntry( vMapping, f * nIdMax + i, pObj->
pEquiv );
215 for ( i = 0; i < nLatches; i++ )
219 *pvMapping = vMapping;
222 printf(
"Ivy_ManFrames(): The check has failed.\n" );
240 if (
p->time1 ) {
ABC_PRT(
"Update lev ",
p->time1 ); }
241 if (
p->time2 ) {
ABC_PRT(
"Update levR ",
p->time2 ); }
245 if (
p->vRequired ) Vec_IntFree(
p->vRequired );
246 if (
p->vPis ) Vec_PtrFree(
p->vPis );
247 if (
p->vPos ) Vec_PtrFree(
p->vPos );
248 if (
p->vBufs ) Vec_PtrFree(
p->vBufs );
249 if (
p->vObjs ) Vec_PtrFree(
p->vObjs );
269 nNodesOld = Ivy_ManNodeNum(
p);
271 if ( Ivy_ObjIsNode(pNode) || Ivy_ObjIsLatch(pNode) || Ivy_ObjIsBuf(pNode) )
272 if ( Ivy_ObjRefs(pNode) == 0 )
275 return nNodesOld - Ivy_ManNodeNum(
p);
291 if ( Ivy_ObjIsMarkA(pObj) )
293 Ivy_ObjSetMarkA(pObj);
317 Ivy_ObjSetMarkA( Ivy_ManConst1(
p) );
319 Ivy_ObjSetMarkA( pObj );
324 vNodes = Vec_PtrAlloc( 100 );
327 if ( Ivy_ObjIsMarkA(pObj) )
328 Ivy_ObjClearMarkA(pObj);
330 Vec_PtrPush( vNodes, pObj );
332 if ( Vec_PtrSize(vNodes) == 0 )
334 Vec_PtrFree( vNodes );
344 assert( Ivy_ObjIsNode(pObj) || Ivy_ObjIsLatch(pObj) || Ivy_ObjIsBuf(pObj) );
345 assert( Ivy_ObjRefs(pObj) == 0 );
347 p->nObjs[pObj->
Type]--;
350 if (
p->fFanout && Ivy_ObjIsBuf(pObj) )
351 Vec_PtrRemove(
p->vBufs, pObj );
353 Vec_PtrWriteEntry(
p->vObjs, pObj->
Id, NULL );
354 Ivy_ManRecycleMemory(
p, pObj );
357 RetValue = Vec_PtrSize(vNodes);
358 Vec_PtrFree( vNodes );
377 if ( !Ivy_ObjIsLatch(pLatch) && !Ivy_ObjIsBuf(pLatch) )
379 if ( pLatch == pLatchRoot )
397 if ( !Ivy_ObjIsLatch(pLatch) )
417 int LimitFactor = 100;
418 int NodeBeg = Ivy_ManNodeNum(
p);
420 for ( nSteps = 0; Vec_PtrSize(
p->vBufs) > 0; nSteps++ )
422 pNode = (
Ivy_Obj_t *)Vec_PtrEntryLast(
p->vBufs);
423 while ( Ivy_ObjIsBuf(pNode) )
428 Vec_PtrPop(
p->vBufs);
434 if ( nSteps > NodeBeg * LimitFactor )
436 printf(
"Structural hashing is not finished after %d forward latch moves.\n", NodeBeg * LimitFactor );
437 printf(
"This circuit cannot be forward-retimed completely. Quitting.\n" );
458 printf(
"PI/PO = %d/%d ", Ivy_ManPiNum(
p), Ivy_ManPoNum(
p) );
459 printf(
"A = %7d. ", Ivy_ManAndNum(
p) );
460 printf(
"L = %5d. ", Ivy_ManLatchNum(
p) );
463 printf(
"MaxID = %7d. ", Ivy_ManObjIdMax(
p) );
489 assert( nLatches < Ivy_ManPiNum(
p) && nLatches < Ivy_ManPoNum(
p) );
490 assert( Ivy_ManPiNum(
p) == Vec_PtrSize(
p->vPis) );
491 assert( Ivy_ManPoNum(
p) == Vec_PtrSize(
p->vPos) );
492 assert( Vec_PtrSize(
p->vBufs ) == 0 );
494 if (
p->fFanout == 0 )
497 for ( i = 0; i < nLatches; i++ )
502 pObj = Ivy_ManPo(
p, Ivy_ManPoNum(
p) - nLatches + i );
503 pLatch =
Ivy_Latch(
p, Ivy_ObjChild0(pObj), Init );
506 Vec_PtrWriteEntry(
p->vObjs, pObj->
Id, NULL );
507 Ivy_ManRecycleMemory(
p, pObj );
509 pObj = Ivy_ManPi(
p, Ivy_ManPiNum(
p) - nLatches + i );
513 Vec_PtrPush(
p->vBufs, pObj );
516 Vec_PtrShrink(
p->vPis, Ivy_ManPiNum(
p) - nLatches );
517 Vec_PtrShrink(
p->vPos, Ivy_ManPoNum(
p) - nLatches );
522 p->nDeleted -= 2 * nLatches;
537 if ( Ivy_ManBufNum(
p) )
538 printf(
"The number of remaining buffers is %d.\n", Ivy_ManBufNum(
p) );
543 printf(
"Ivy_ManMakeSeq(): The check has failed.\n" );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
ABC_NAMESPACE_IMPL_START Ivy_Man_t * Ivy_ManStart()
DECLARATIONS ///.
void Ivy_ManMakeSeq(Ivy_Man_t *p, int nLatches, int *pInits)
int Ivy_ManCleanup(Ivy_Man_t *p)
int Ivy_ManCleanupSeq(Ivy_Man_t *p)
void Ivy_ManStop(Ivy_Man_t *p)
int Ivy_ManLatchIsSelfFeed_rec(Ivy_Obj_t *pLatch, Ivy_Obj_t *pLatchRoot)
void Ivy_ManPrintStats(Ivy_Man_t *p)
int Ivy_ManPropagateBuffers(Ivy_Man_t *p, int fUpdateLevel)
void Ivy_ManCleanupSeq_rec(Ivy_Obj_t *pObj)
int Ivy_ManLatchIsSelfFeed(Ivy_Obj_t *pLatch)
Ivy_Man_t * Ivy_ManStartFrom(Ivy_Man_t *p)
Ivy_Man_t * Ivy_ManFrames(Ivy_Man_t *pMan, int nLatches, int nFrames, int fInit, Vec_Ptr_t **pvMapping)
Ivy_Man_t * Ivy_ManDup(Ivy_Man_t *p)
void Ivy_ManStopMemory(Ivy_Man_t *p)
int Ivy_ManCheck(Ivy_Man_t *p)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Ivy_Man_t_ Ivy_Man_t
INCLUDES ///.
void Ivy_ObjDisconnect(Ivy_Man_t *p, Ivy_Obj_t *pObj)
Ivy_Obj_t * Ivy_Latch(Ivy_Man_t *p, Ivy_Obj_t *pObj, Ivy_Init_t Init)
void Ivy_ManResetLevels(Ivy_Man_t *p)
Vec_Int_t * Ivy_ManDfsSeq(Ivy_Man_t *p, Vec_Int_t **pvLatches)
#define Ivy_ManForEachObj(p, pObj, i)
#define Ivy_ManForEachNode(p, pObj, i)
Ivy_Obj_t * Ivy_ObjCreatePo(Ivy_Man_t *p, Ivy_Obj_t *pDriver)
#define Ivy_ManForEachPo(p, pObj, i)
struct Ivy_Obj_t_ Ivy_Obj_t
#define Ivy_ManForEachNodeVec(p, vIds, pObj, i)
void Ivy_ManStartMemory(Ivy_Man_t *p)
FUNCTION DEFINITIONS ///.
Ivy_Obj_t * Ivy_ObjCreatePi(Ivy_Man_t *p)
DECLARATIONS ///.
#define Ivy_ManForEachPi(p, pObj, i)
ITERATORS ///.
Ivy_Obj_t * Ivy_ObjReadFirstFanout(Ivy_Man_t *p, Ivy_Obj_t *pObj)
void Ivy_NodeFixBufferFanins(Ivy_Man_t *p, Ivy_Obj_t *pNode, int fUpdateLevel)
void Ivy_ManStartFanout(Ivy_Man_t *p)
FUNCTION DEFINITIONS ///.
void Ivy_ObjDelete_rec(Ivy_Man_t *p, Ivy_Obj_t *pObj, int fFreeTop)
void Ivy_ObjConnect(Ivy_Man_t *p, Ivy_Obj_t *pObj, Ivy_Obj_t *pFan0, Ivy_Obj_t *pFan1)
Ivy_Obj_t * Ivy_And(Ivy_Man_t *p, Ivy_Obj_t *p0, Ivy_Obj_t *p1)
int Ivy_ManLevels(Ivy_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.