summaryrefslogtreecommitdiffstats
path: root/src/opt/res/resUpdate.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/opt/res/resUpdate.c')
-rw-r--r--src/opt/res/resUpdate.c59
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;
}
////////////////////////////////////////////////////////////////////////