30static int Abc_NtkRetimeOneWay(
Abc_Ntk_t * pNtk,
int fForward,
int fVerbose );
52 int nLatches = Abc_NtkLatchNum(pNtk);
53 int nIdMaxStart = Abc_NtkObjNumMax(pNtk);
56 if ( Abc_NtkNodeNum(pNtk) == 0 )
77 Abc_NtkRetimeOneWay( pNtk, fForward, fVerbose );
93 fprintf( stdout,
"Abc_NtkRetimeForward(): Network check has failed.\n" );
95 return nLatches - Abc_NtkLatchNum(pNtk);
112 Abc_Obj_t * pLatch, * pLatchIn, * pLatchOut, * pFanin;
113 int i, nOffSet = Abc_NtkBoxNum(pNtk) - Abc_NtkLatchNum(pNtk);
119 st__insert( tLatches, (
char *)(ABC_PTRUINT_T)pLatch, (
char *)(ABC_PTRUINT_T)(i-nOffSet) );
121 pLatchIn = Abc_ObjFanin0(pLatch);
122 pFanin = Abc_ObjFanin0(pLatchIn);
126 pLatchOut = Abc_ObjFanout0(pLatch);
127 pFanin = Abc_ObjFanin0(pLatchOut);
128 if ( Abc_ObjFanoutNum(pLatchOut) > 0 )
148 Vec_Ptr_t * vCisOld, * vCosOld, * vBoxesOld, * vCisNew, * vCosNew, * vBoxesNew;
149 Abc_Obj_t * pObj, * pLatch, * pLatchIn, * pLatchOut;
152 vCisOld = pNtk->
vCis; pNtk->
vCis = NULL; vCisNew = Vec_PtrAlloc( 100 );
153 vCosOld = pNtk->
vCos; pNtk->
vCos = NULL; vCosNew = Vec_PtrAlloc( 100 );
154 vBoxesOld = pNtk->
vBoxes; pNtk->
vBoxes = NULL; vBoxesNew = Vec_PtrAlloc( 100 );
157 Vec_PtrPush( vCisNew, pObj );
159 Vec_PtrPush( vCosNew, pObj );
161 Vec_PtrPush( vBoxesNew, pObj );
165 if ( !Abc_ObjIsLatch(pLatch) )
167 if ( Abc_ObjId(pLatch) >= (
unsigned)nIdMaxStart )
170 pLatchIn = Abc_NtkCreateBi(pNtk);
171 pLatchOut = Abc_NtkCreateBo(pNtk);
190 printf(
"Abc_NtkRetimeFinalizeLatches(): Internal error.\n" );
193 assert( pLatch == Vec_PtrEntry(vBoxesOld, Vec_PtrSize(vBoxesOld) -
st__count(tLatches) + Index) );
195 pLatchIn = (
Abc_Obj_t *)Vec_PtrEntry( vCosOld, Vec_PtrSize(vCosOld) -
st__count(tLatches) + Index );
196 pLatchOut = (
Abc_Obj_t *)Vec_PtrEntry( vCisOld, Vec_PtrSize(vCisOld) -
st__count(tLatches) + Index );
201 if ( Abc_ObjFanoutNum(pLatch) > 0 )
205 Vec_PtrPush( vCisNew, pLatchOut );
206 Vec_PtrPush( vCosNew, pLatchIn );
207 Vec_PtrPush( vBoxesNew, pLatch );
211 if ( !Abc_ObjIsPi(pObj) && Abc_ObjFaninNum(pObj) == 0 && Abc_ObjFanoutNum(pObj) == 0 )
214 if ( !Abc_ObjIsPo(pObj) && Abc_ObjFaninNum(pObj) == 0 && Abc_ObjFanoutNum(pObj) == 0 )
217 pNtk->
vCis = vCisNew; Vec_PtrFree( vCisOld );
218 pNtk->
vCos = vCosNew; Vec_PtrFree( vCosOld );
219 pNtk->
vBoxes = vBoxesNew; Vec_PtrFree( vBoxesOld );
234int Abc_NtkRetimeOneWay(
Abc_Ntk_t * pNtk,
int fForward,
int fVerbose )
239 int i, fChanges, nTotalMoves = 0, nTotalMovesLimit = 10000;
254 if ( !Abc_ObjIsNode(pObj) )
261 if ( nTotalMoves >= nTotalMovesLimit )
263 printf(
"Stopped after %d latch moves.\n", nTotalMoves );
268 }
while ( fChanges && nTotalMoves < nTotalMovesLimit );
276 Vec_IntFree( vValues );
297 assert( Abc_ObjIsNode(pObj) );
301 if ( !Abc_ObjIsLatch(pNext) )
307 if ( !Abc_ObjIsLatch(pNext) )
330 vNodes = Vec_PtrAlloc( 10 );
341 assert( Abc_ObjIsLatch(pNext) );
343 if ( Abc_ObjFanoutNum(pNext) == 0 )
347 pNext = Abc_NtkCreateLatch(pObj->
pNtk);
348 if ( Abc_ObjFanoutNum(pObj) > 0 )
360 pNtkNew = Abc_ObjFanout0(pObj)->
pCopy->pNtk;
373 assert( Abc_ObjIsLatch(pNext) );
380 pLatch = Abc_NtkCreateLatch(pObj->
pNtk);
392 Vec_PtrFree( vNodes );
409 int i, nLatches = 0, Init = -1;
412 if ( !Abc_ObjIsLatch(pFanout) )
416 Init = (int)(ABC_PTRUINT_T)pObj->
pData;
419 else if ( Init == (
int)(ABC_PTRUINT_T)pObj->
pData )
439 Abc_Obj_t * pFanin, * pLatchTop, * pLatchCur;
441 vNodes = Vec_PtrAlloc( 10 );
450 if ( Abc_ObjIsLatch(pLatchTop) )
452 assert( pLatchTop && Abc_ObjIsLatch(pLatchTop) );
457 if ( !Abc_ObjIsLatch(pLatchCur) )
459 if ( pLatchCur == pLatchTop )
471 Vec_PtrFree( vNodes );
struct Abc_Obj_t_ Abc_Obj_t
ABC_DLL void Abc_ObjAddFanin(Abc_Obj_t *pObj, Abc_Obj_t *pFanin)
ABC_DLL void Abc_NtkDeleteObj(Abc_Obj_t *pObj)
ABC_DLL Abc_Obj_t * Abc_NtkDupObj(Abc_Ntk_t *pNtkNew, Abc_Obj_t *pObj, int fCopyName)
ABC_DLL Abc_Obj_t * Abc_NtkCreateNodeBuf(Abc_Ntk_t *pNtk, Abc_Obj_t *pFanin)
#define Abc_NtkForEachLatch(pNtk, pObj, i)
ABC_DLL int Abc_NtkCheck(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
#define Abc_NtkForEachObj(pNtk, pObj, i)
ITERATORS ///.
#define Abc_ObjForEachFanin(pObj, pFanin, i)
#define Abc_ObjForEachFanout(pObj, pFanout, i)
ABC_DLL char * Abc_ObjName(Abc_Obj_t *pNode)
DECLARATIONS ///.
ABC_DLL void Abc_NodeCollectFanouts(Abc_Obj_t *pNode, Vec_Ptr_t *vNodes)
struct Abc_Ntk_t_ Abc_Ntk_t
ABC_DLL char * Abc_ObjAssignName(Abc_Obj_t *pObj, char *pName, char *pSuffix)
ABC_DLL void Abc_ObjTransferFanout(Abc_Obj_t *pObjOld, Abc_Obj_t *pObjNew)
ABC_DLL int Abc_NtkLevel(Abc_Ntk_t *pNtk)
ABC_DLL void Abc_ObjDeleteFanin(Abc_Obj_t *pObj, Abc_Obj_t *pFanin)
ABC_DLL void Abc_NodeCollectFanins(Abc_Obj_t *pNode, Vec_Ptr_t *vNodes)
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
ABC_DLL void Abc_ObjPatchFanin(Abc_Obj_t *pObj, Abc_Obj_t *pFaninOld, Abc_Obj_t *pFaninNew)
ABC_DLL void Abc_NtkOrderCisCos(Abc_Ntk_t *pNtk)
ABC_DLL Abc_Ntk_t * Abc_NtkDup(Abc_Ntk_t *pNtk)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
int Abc_NtkRetimeMinDelay(Abc_Ntk_t *pNtk, Abc_Ntk_t *pNtkCopy, int nDelayLim, int nIterLimit, int fForward, int fVerbose)
FUNCTION DEFINITIONS ///.
void Abc_NtkRetimeNode(Abc_Obj_t *pObj, int fForward, int fInitial)
void Abc_NtkRetimeShareLatches(Abc_Ntk_t *pNtk, int fInitial)
int Abc_NtkRetimeFinalizeLatches(Abc_Ntk_t *pNtk, st__table *tLatches, int nIdMaxStart, int fUseOldNames)
st__table * Abc_NtkRetimePrepareLatches(Abc_Ntk_t *pNtk)
int Abc_NtkRetimeCheckCompatibleLatchFanouts(Abc_Obj_t *pObj)
int Abc_NtkRetimeIncremental(Abc_Ntk_t *pNtk, int nDelayLim, int fForward, int fMinDelay, int fOneStep, int fUseOldNames, int fVerbose)
FUNCTION DEFINITIONS ///.
int Abc_NtkRetimeNodeIsEnabled(Abc_Obj_t *pObj, int fForward)
Abc_Ntk_t * Abc_NtkRetimeBackwardInitialStart(Abc_Ntk_t *pNtk)
void Abc_NtkRetimeTranferToCopy(Abc_Ntk_t *pNtk)
Vec_Int_t * Abc_NtkRetimeCollectLatchValues(Abc_Ntk_t *pNtk)
void Abc_NtkRetimeBackwardInitialFinish(Abc_Ntk_t *pNtk, Abc_Ntk_t *pNtkNew, Vec_Int_t *vValuesOld, int fVerbose)
void Abc_NtkRetimeTranferFromCopy(Abc_Ntk_t *pNtk)
int Abc_ObjSopSimulate(Abc_Obj_t *pObj)
int st__lookup_int(st__table *table, char *key, int *value)
int st__ptrhash(const char *, int)
int st__ptrcmp(const char *, const char *)
st__table * st__init_table(st__compare_func_type compare, st__hash_func_type hash)
int st__insert(st__table *table, const char *key, char *value)
void st__free_table(st__table *table)
#define Vec_PtrForEachEntryStop(Type, vVec, pEntry, i, Stop)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.