diff options
Diffstat (limited to 'src/opt/res/resUpdate.c')
-rw-r--r-- | src/opt/res/resUpdate.c | 59 |
1 files changed, 57 insertions, 2 deletions
diff --git a/src/opt/res/resUpdate.c b/src/opt/res/resUpdate.c index cb76e01a..f79176bc 100644 --- a/src/opt/res/resUpdate.c +++ b/src/opt/res/resUpdate.c @@ -25,13 +25,63 @@ /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// +static int Res_UpdateNetworkLevelNew( Abc_Obj_t * pObj ); + //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* - Synopsis [] + Synopsis [Incrementally updates level of the nodes.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Res_UpdateNetwork( Abc_Obj_t * pObj, Vec_Ptr_t * vFanins, Hop_Obj_t * pFunc, Vec_Vec_t * vLevels ) +{ + Abc_Obj_t * pObjNew, * pFanin, * pFanout, * pTemp; + int i, k, m; + // create the new node + pObjNew = Abc_NtkCreateNode( pObj->pNtk ); + pObjNew->pData = pFunc; + Vec_PtrForEachEntry( vFanins, pFanin, i ) + Abc_ObjAddFanin( pObjNew, pFanin ); + // replace the old node by the new node + pObjNew->Level = pObj->Level; + Abc_ObjReplace( pObj, pObjNew ); + // check if level has changed + if ( (int)pObjNew->Level == Res_UpdateNetworkLevelNew(pObjNew) ) + return; + // start the data structure for level update + Vec_VecClear( vLevels ); + Vec_VecPush( vLevels, pObjNew->Level, pObjNew ); + pObjNew->fMarkA = 1; + // recursively update level + Vec_VecForEachEntryStart( vLevels, pTemp, i, k, pObjNew->Level ) + { + pTemp->fMarkA = 0; + pTemp->Level = Res_UpdateNetworkLevelNew( pTemp ); + // if the level did not change, to need to check the fanout levels + if ( (int)pTemp->Level == i ) + continue; + // schedule fanout for level update + Abc_ObjForEachFanout( pTemp, pFanout, m ) + if ( !Abc_ObjIsCo(pFanout) && !pFanout->fMarkA ) + { + Vec_VecPush( vLevels, pFanout->Level, pFanout ); + pFanout->fMarkA = 1; + } + } +} + +/**Function************************************************************* + + Synopsis [Computes the level of the node using its fanin levels.] Description [] @@ -40,8 +90,13 @@ SeeAlso [] ***********************************************************************/ -void Res_UpdateNetwork( Abc_Obj_t * pObj, Vec_Ptr_t * vFanins, Hop_Obj_t * pFunc ) +int Res_UpdateNetworkLevelNew( Abc_Obj_t * pObj ) { + Abc_Obj_t * pFanin; + int i, Level = 0; + Abc_ObjForEachFanin( pObj, pFanin, i ) + Level = ABC_MAX( Level, (int)pFanin->Level ); + return Level + 1; } //////////////////////////////////////////////////////////////////////// |