00001 
00021 #include "abc.h"
00022 #include "main.h"
00023 #include "mio.h"
00024 
00028 
00029 struct Abc_ManTime_t_
00030 {
00031     Abc_Time_t     tArrDef;
00032     Abc_Time_t     tReqDef;
00033     Vec_Ptr_t  *   vArrs;
00034     Vec_Ptr_t  *   vReqs;
00035 };
00036 
00037 
00038 static Abc_ManTime_t *     Abc_ManTimeStart();
00039 static void                Abc_ManTimeExpand( Abc_ManTime_t * p, int nSize, int fProgressive );
00040 void                       Abc_NtkTimePrepare( Abc_Ntk_t * pNtk );
00041 
00042 void                       Abc_NodeDelayTraceArrival( Abc_Obj_t * pNode );
00043 
00044 
00045 static inline Abc_Time_t * Abc_NodeArrival( Abc_Obj_t * pNode )  {  return pNode->pNtk->pManTime->vArrs->pArray[pNode->Id];  }
00046 static inline Abc_Time_t * Abc_NodeRequired( Abc_Obj_t * pNode ) {  return pNode->pNtk->pManTime->vReqs->pArray[pNode->Id];  }
00047 
00051 
00063 Abc_Time_t * Abc_NodeReadArrival( Abc_Obj_t * pNode )
00064 {
00065     assert( pNode->pNtk->pManTime );
00066     return Abc_NodeArrival(pNode);
00067 }
00068 
00080 Abc_Time_t * Abc_NodeReadRequired( Abc_Obj_t * pNode )
00081 {
00082     assert( pNode->pNtk->pManTime );
00083     return Abc_NodeRequired(pNode);
00084 }
00085 
00097 Abc_Time_t * Abc_NtkReadDefaultArrival( Abc_Ntk_t * pNtk )
00098 {
00099     assert( pNtk->pManTime );
00100     return &pNtk->pManTime->tArrDef;
00101 }
00102 
00114 Abc_Time_t * Abc_NtkReadDefaultRequired( Abc_Ntk_t * pNtk )
00115 {
00116     assert( pNtk->pManTime );
00117     return &pNtk->pManTime->tReqDef;
00118 }
00119 
00131 void Abc_NtkTimeSetDefaultArrival( Abc_Ntk_t * pNtk, float Rise, float Fall )
00132 {
00133     if ( Rise == 0.0 && Fall == 0.0 )
00134         return;
00135     if ( pNtk->pManTime == NULL )
00136         pNtk->pManTime = Abc_ManTimeStart();
00137     pNtk->pManTime->tArrDef.Rise  = Rise;
00138     pNtk->pManTime->tArrDef.Fall  = Fall;
00139     pNtk->pManTime->tArrDef.Worst = ABC_MAX( Rise, Fall );
00140 }
00141 
00153 void Abc_NtkTimeSetDefaultRequired( Abc_Ntk_t * pNtk, float Rise, float Fall )
00154 {
00155     if ( Rise == 0.0 && Fall == 0.0 )
00156         return;
00157     if ( pNtk->pManTime == NULL )
00158         pNtk->pManTime = Abc_ManTimeStart();
00159     pNtk->pManTime->tReqDef.Rise  = Rise;
00160     pNtk->pManTime->tReqDef.Rise  = Fall;
00161     pNtk->pManTime->tReqDef.Worst = ABC_MAX( Rise, Fall );
00162 }
00163 
00175 void Abc_NtkTimeSetArrival( Abc_Ntk_t * pNtk, int ObjId, float Rise, float Fall )
00176 {
00177     Vec_Ptr_t * vTimes;
00178     Abc_Time_t * pTime;
00179     if ( pNtk->pManTime == NULL )
00180         pNtk->pManTime = Abc_ManTimeStart();
00181     if ( pNtk->pManTime->tArrDef.Rise == Rise && pNtk->pManTime->tArrDef.Fall == Fall )
00182         return;
00183     Abc_ManTimeExpand( pNtk->pManTime, ObjId + 1, 1 );
00184     
00185     vTimes = pNtk->pManTime->vArrs;
00186     pTime = vTimes->pArray[ObjId];
00187     pTime->Rise  = Rise;
00188     pTime->Fall  = Rise;
00189     pTime->Worst = ABC_MAX( Rise, Fall );
00190 }
00191 
00203 void Abc_NtkTimeSetRequired( Abc_Ntk_t * pNtk, int ObjId, float Rise, float Fall )
00204 {
00205     Vec_Ptr_t * vTimes;
00206     Abc_Time_t * pTime;
00207     if ( pNtk->pManTime == NULL )
00208         pNtk->pManTime = Abc_ManTimeStart();
00209     if ( pNtk->pManTime->tReqDef.Rise == Rise && pNtk->pManTime->tReqDef.Fall == Fall )
00210         return;
00211     Abc_ManTimeExpand( pNtk->pManTime, ObjId + 1, 1 );
00212     
00213     vTimes = pNtk->pManTime->vReqs;
00214     pTime = vTimes->pArray[ObjId];
00215     pTime->Rise  = Rise;
00216     pTime->Fall  = Rise;
00217     pTime->Worst = ABC_MAX( Rise, Fall );
00218 }
00219 
00231 void Abc_NtkTimeInitialize( Abc_Ntk_t * pNtk )
00232 {
00233     Abc_Obj_t * pObj;
00234     Abc_Time_t ** ppTimes, * pTime;
00235     int i;
00236     if ( pNtk->pManTime == NULL )
00237         return;
00238     Abc_ManTimeExpand( pNtk->pManTime, Abc_NtkObjNumMax(pNtk), 0 );
00239     
00240     ppTimes = (Abc_Time_t **)pNtk->pManTime->vArrs->pArray;
00241     Abc_NtkForEachPi( pNtk, pObj, i )
00242     {
00243         pTime = ppTimes[pObj->Id];
00244         if ( pTime->Worst != -ABC_INFINITY )
00245             continue;
00246         *pTime = pNtk->pManTime->tArrDef;
00247     }
00248     
00249     ppTimes = (Abc_Time_t **)pNtk->pManTime->vReqs->pArray;
00250     Abc_NtkForEachPo( pNtk, pObj, i )
00251     {
00252         pTime = ppTimes[pObj->Id];
00253         if ( pTime->Worst != -ABC_INFINITY )
00254             continue;
00255         *pTime = pNtk->pManTime->tReqDef;
00256     }
00257     
00258     ppTimes = (Abc_Time_t **)pNtk->pManTime->vArrs->pArray;
00259     Abc_NtkForEachLatchOutput( pNtk, pObj, i )
00260     {
00261         pTime = ppTimes[pObj->Id];
00262         pTime->Fall = pTime->Rise = pTime->Worst = 0.0;
00263     }
00264 }
00265 
00277 void Abc_NtkTimePrepare( Abc_Ntk_t * pNtk )
00278 {
00279     Abc_Obj_t * pObj;
00280     Abc_Time_t ** ppTimes, * pTime;
00281     int i;
00282     
00283     if ( pNtk->pManTime == NULL )
00284     {
00285         pNtk->pManTime = Abc_ManTimeStart();
00286         Abc_NtkTimeInitialize( pNtk );
00287         return;
00288     }
00289     
00290     Abc_ManTimeExpand( pNtk->pManTime, Abc_NtkObjNumMax(pNtk), 0 );
00291     
00292     ppTimes = (Abc_Time_t **)pNtk->pManTime->vArrs->pArray;
00293     Abc_NtkForEachNode( pNtk, pObj, i )
00294     {
00295         pTime = ppTimes[pObj->Id];
00296         pTime->Fall = pTime->Rise = pTime->Worst = -ABC_INFINITY;
00297     }
00298     Abc_NtkForEachPo( pNtk, pObj, i )
00299     {
00300         pTime = ppTimes[pObj->Id];
00301         pTime->Fall = pTime->Rise = pTime->Worst = -ABC_INFINITY;
00302     }
00303     
00304 }
00305 
00306 
00307 
00308 
00320 Abc_ManTime_t * Abc_ManTimeStart()
00321 {
00322     Abc_ManTime_t * p;
00323     p = ALLOC( Abc_ManTime_t, 1 );
00324     memset( p, 0, sizeof(Abc_ManTime_t) );
00325     p->vArrs = Vec_PtrAlloc( 0 );
00326     p->vReqs = Vec_PtrAlloc( 0 );
00327     return p;
00328 }
00329 
00341 void Abc_ManTimeStop( Abc_ManTime_t * p )
00342 {
00343     if ( p->vArrs->nSize > 0 )
00344     {
00345         free( p->vArrs->pArray[0] );
00346         Vec_PtrFree( p->vArrs );
00347     }
00348     if ( p->vReqs->nSize > 0 )
00349     {
00350         free( p->vReqs->pArray[0] );
00351         Vec_PtrFree( p->vReqs );
00352     }
00353     free( p );
00354 }
00355 
00367 void Abc_ManTimeDup( Abc_Ntk_t * pNtkOld, Abc_Ntk_t * pNtkNew )
00368 {
00369     Abc_Obj_t * pObj;
00370     Abc_Time_t ** ppTimesOld, ** ppTimesNew;
00371     int i;
00372     if ( pNtkOld->pManTime == NULL )
00373         return;
00374     assert( Abc_NtkPiNum(pNtkOld) == Abc_NtkPiNum(pNtkNew) );
00375     assert( Abc_NtkPoNum(pNtkOld) == Abc_NtkPoNum(pNtkNew) );
00376     assert( Abc_NtkLatchNum(pNtkOld) == Abc_NtkLatchNum(pNtkNew) );
00377     
00378     pNtkNew->pManTime = Abc_ManTimeStart();
00379     Abc_ManTimeExpand( pNtkNew->pManTime, Abc_NtkObjNumMax(pNtkNew), 0 );
00380     
00381     pNtkNew->pManTime->tArrDef = pNtkOld->pManTime->tArrDef;
00382     pNtkNew->pManTime->tReqDef = pNtkOld->pManTime->tReqDef;
00383     
00384     ppTimesOld = (Abc_Time_t **)pNtkOld->pManTime->vArrs->pArray;
00385     ppTimesNew = (Abc_Time_t **)pNtkNew->pManTime->vArrs->pArray;
00386     Abc_NtkForEachCi( pNtkOld, pObj, i )
00387         *ppTimesNew[ Abc_NtkCi(pNtkNew,i)->Id ] = *ppTimesOld[ pObj->Id ];
00388     
00389     ppTimesOld = (Abc_Time_t **)pNtkOld->pManTime->vReqs->pArray;
00390     ppTimesNew = (Abc_Time_t **)pNtkNew->pManTime->vReqs->pArray;
00391     Abc_NtkForEachCo( pNtkOld, pObj, i )
00392         *ppTimesNew[ Abc_NtkCo(pNtkNew,i)->Id ] = *ppTimesOld[ pObj->Id ];
00393 }
00394 
00406 void Abc_ManTimeExpand( Abc_ManTime_t * p, int nSize, int fProgressive )
00407 {
00408     Vec_Ptr_t * vTimes;
00409     Abc_Time_t * ppTimes, * ppTimesOld, * pTime;
00410     int nSizeOld, nSizeNew, i;
00411 
00412     nSizeOld = p->vArrs->nSize;
00413     if ( nSizeOld >= nSize )
00414         return;
00415     nSizeNew = fProgressive? 2 * nSize : nSize;
00416     if ( nSizeNew < 100 )
00417         nSizeNew = 100;
00418 
00419     vTimes = p->vArrs;
00420     Vec_PtrGrow( vTimes, nSizeNew );
00421     vTimes->nSize = nSizeNew;
00422     ppTimesOld = ( nSizeOld == 0 )? NULL : vTimes->pArray[0];
00423     ppTimes = REALLOC( Abc_Time_t, ppTimesOld, nSizeNew );
00424     for ( i = 0; i < nSizeNew; i++ )
00425         vTimes->pArray[i] = ppTimes + i;
00426     for ( i = nSizeOld; i < nSizeNew; i++ )
00427     {
00428         pTime = vTimes->pArray[i];
00429         pTime->Rise  = -ABC_INFINITY;
00430         pTime->Fall  = -ABC_INFINITY;
00431         pTime->Worst = -ABC_INFINITY;    
00432     }
00433 
00434     vTimes = p->vReqs;
00435     Vec_PtrGrow( vTimes, nSizeNew );
00436     vTimes->nSize = nSizeNew;
00437     ppTimesOld = ( nSizeOld == 0 )? NULL : vTimes->pArray[0];
00438     ppTimes = REALLOC( Abc_Time_t, ppTimesOld, nSizeNew );
00439     for ( i = 0; i < nSizeNew; i++ )
00440         vTimes->pArray[i] = ppTimes + i;
00441     for ( i = nSizeOld; i < nSizeNew; i++ )
00442     {
00443         pTime = vTimes->pArray[i];
00444         pTime->Rise  = -ABC_INFINITY;
00445         pTime->Fall  = -ABC_INFINITY;
00446         pTime->Worst = -ABC_INFINITY;    
00447     }
00448 }
00449 
00450 
00451 
00452 
00453 
00454 
00466 void Abc_NtkSetNodeLevelsArrival( Abc_Ntk_t * pNtkOld )
00467 {
00468     Abc_Obj_t * pNodeOld, * pNodeNew;
00469     float tAndDelay;
00470     int i;
00471     if ( pNtkOld->pManTime == NULL )
00472         return;
00473     if ( Mio_LibraryReadNand2(Abc_FrameReadLibGen()) == NULL )
00474         return;
00475     tAndDelay = Mio_LibraryReadDelayNand2Max(Abc_FrameReadLibGen());
00476     Abc_NtkForEachPi( pNtkOld, pNodeOld, i )
00477     {
00478         pNodeNew = pNodeOld->pCopy;
00479         pNodeNew->Level = (int)(Abc_NodeArrival(pNodeOld)->Worst / tAndDelay);
00480     }
00481 }
00482 
00494 Abc_Time_t * Abc_NtkGetCiArrivalTimes( Abc_Ntk_t * pNtk )
00495 {
00496     Abc_Time_t * p;
00497     Abc_Obj_t * pNode;
00498     int i;
00499     p = ALLOC( Abc_Time_t, Abc_NtkCiNum(pNtk) );
00500     memset( p, 0, sizeof(Abc_Time_t) * Abc_NtkCiNum(pNtk) );
00501     if ( pNtk->pManTime == NULL )
00502         return p;
00503     
00504     Abc_NtkForEachPi( pNtk, pNode, i )
00505         p[i] = *Abc_NodeArrival(pNode);
00506     return p;
00507 }
00508 
00509 
00521 float * Abc_NtkGetCiArrivalFloats( Abc_Ntk_t * pNtk )
00522 {
00523     float * p;
00524     Abc_Obj_t * pNode;
00525     int i;
00526     p = ALLOC( float, Abc_NtkCiNum(pNtk) );
00527     memset( p, 0, sizeof(float) * Abc_NtkCiNum(pNtk) );
00528     if ( pNtk->pManTime == NULL )
00529         return p;
00530     
00531     Abc_NtkForEachPi( pNtk, pNode, i )
00532         p[i] = Abc_NodeArrival(pNode)->Worst;
00533     return p;
00534 }
00535 
00536 
00548 float Abc_NtkDelayTrace( Abc_Ntk_t * pNtk )
00549 {
00550     Abc_Obj_t * pNode, * pDriver;
00551     Vec_Ptr_t * vNodes;
00552     Abc_Time_t * pTime;
00553     float tArrivalMax;
00554     int i;
00555 
00556     assert( Abc_NtkIsMappedLogic(pNtk) );
00557 
00558     Abc_NtkTimePrepare( pNtk );
00559     vNodes = Abc_NtkDfs( pNtk, 1 );
00560     for ( i = 0; i < vNodes->nSize; i++ )
00561         Abc_NodeDelayTraceArrival( vNodes->pArray[i] );
00562     Vec_PtrFree( vNodes );
00563 
00564     
00565     tArrivalMax = -ABC_INFINITY;
00566     Abc_NtkForEachCo( pNtk, pNode, i )
00567     {
00568         pDriver = Abc_ObjFanin0(pNode);
00569         pTime   = Abc_NodeArrival(pDriver);
00570         if ( tArrivalMax < pTime->Worst )
00571             tArrivalMax = pTime->Worst;
00572     }
00573     return tArrivalMax;
00574 }
00575 
00587 void Abc_NodeDelayTraceArrival( Abc_Obj_t * pNode )
00588 {
00589     Abc_Obj_t * pFanin;
00590     Abc_Time_t * pTimeIn, * pTimeOut;
00591     float tDelayBlockRise, tDelayBlockFall;
00592     Mio_PinPhase_t PinPhase;
00593     Mio_Pin_t * pPin;
00594     int i;
00595 
00596     
00597     pTimeOut = Abc_NodeArrival(pNode);
00598     pTimeOut->Rise = pTimeOut->Fall = -ABC_INFINITY; 
00599     
00600     pPin = Mio_GateReadPins(pNode->pData);
00601     Abc_ObjForEachFanin( pNode, pFanin, i )
00602     {
00603         pTimeIn = Abc_NodeArrival(pFanin);
00604         
00605         PinPhase = Mio_PinReadPhase(pPin);
00606         tDelayBlockRise = (float)Mio_PinReadDelayBlockRise( pPin );  
00607         tDelayBlockFall = (float)Mio_PinReadDelayBlockFall( pPin );  
00608         
00609         if ( PinPhase != MIO_PHASE_INV )  
00610         {
00611             if ( pTimeOut->Rise < pTimeIn->Rise + tDelayBlockRise )
00612                 pTimeOut->Rise = pTimeIn->Rise + tDelayBlockRise;
00613             if ( pTimeOut->Fall < pTimeIn->Fall + tDelayBlockFall )
00614                 pTimeOut->Fall = pTimeIn->Fall + tDelayBlockFall;
00615         }
00616         if ( PinPhase != MIO_PHASE_NONINV )  
00617         {
00618             if ( pTimeOut->Rise < pTimeIn->Fall + tDelayBlockRise )
00619                 pTimeOut->Rise = pTimeIn->Fall + tDelayBlockRise;
00620             if ( pTimeOut->Fall < pTimeIn->Rise + tDelayBlockFall )
00621                 pTimeOut->Fall = pTimeIn->Rise + tDelayBlockFall;
00622         }
00623         pPin = Mio_PinReadNext(pPin);
00624     }
00625     pTimeOut->Worst = ABC_MAX( pTimeOut->Rise, pTimeOut->Fall );
00626 }
00627 
00628 
00629 
00630 
00642 int Abc_ObjLevelNew( Abc_Obj_t * pObj )
00643 {
00644     Abc_Obj_t * pFanin;
00645     int i, Level = 0;
00646     Abc_ObjForEachFanin( pObj, pFanin, i )
00647         Level = ABC_MAX( Level, Abc_ObjLevel(pFanin) );
00648     return Level + 1;
00649 }
00650 
00662 int Abc_ObjReverseLevelNew( Abc_Obj_t * pObj )
00663 {
00664     Abc_Obj_t * pFanout;
00665     int i, LevelCur, Level = 0;
00666     Abc_ObjForEachFanout( pObj, pFanout, i )
00667     {
00668         LevelCur = Abc_ObjReverseLevel( pFanout );
00669         Level = ABC_MAX( Level, LevelCur );
00670     }
00671     return Level + 1;
00672 }
00673 
00686 int Abc_ObjRequiredLevel( Abc_Obj_t * pObj )
00687 {
00688     Abc_Ntk_t * pNtk = pObj->pNtk;
00689     assert( pNtk->vLevelsR );
00690     return pNtk->LevelMax + 1 - Abc_ObjReverseLevel(pObj);
00691 }
00692 
00705 int Abc_ObjReverseLevel( Abc_Obj_t * pObj )
00706 {
00707     Abc_Ntk_t * pNtk = pObj->pNtk;
00708     assert( pNtk->vLevelsR );
00709     Vec_IntFillExtra( pNtk->vLevelsR, pObj->Id + 1, 0 );
00710     return Vec_IntEntry(pNtk->vLevelsR, pObj->Id);
00711 }
00712 
00725 void Abc_ObjSetReverseLevel( Abc_Obj_t * pObj, int LevelR )
00726 {
00727     Abc_Ntk_t * pNtk = pObj->pNtk;
00728     assert( pNtk->vLevelsR );
00729     Vec_IntFillExtra( pNtk->vLevelsR, pObj->Id + 1, 0 );
00730     Vec_IntWriteEntry( pNtk->vLevelsR, pObj->Id, LevelR );
00731 }
00732 
00746 void Abc_NtkStartReverseLevels( Abc_Ntk_t * pNtk, int nMaxLevelIncrease )
00747 {
00748     Vec_Ptr_t * vNodes;
00749     Abc_Obj_t * pObj;
00750     int i;
00751     
00752     pNtk->LevelMax = Abc_NtkLevel(pNtk) + nMaxLevelIncrease;
00753     
00754     pNtk->vLevelsR = Vec_IntAlloc( 0 );
00755     Vec_IntFill( pNtk->vLevelsR, 1 + Abc_NtkObjNumMax(pNtk), 0 );
00756     
00757     vNodes = Abc_NtkDfsReverse( pNtk );
00758     Vec_PtrForEachEntry( vNodes, pObj, i )
00759         Abc_ObjSetReverseLevel( pObj, Abc_ObjReverseLevelNew(pObj) );
00760     Vec_PtrFree( vNodes );
00761 }
00762 
00774 void Abc_NtkStopReverseLevels( Abc_Ntk_t * pNtk )
00775 {
00776     assert( pNtk->vLevelsR );
00777     Vec_IntFree( pNtk->vLevelsR );
00778     pNtk->vLevelsR = NULL;
00779     pNtk->LevelMax = 0;
00780 
00781 }
00782 
00794 void Abc_NtkUpdateLevel( Abc_Obj_t * pObjNew, Vec_Vec_t * vLevels )
00795 {
00796     Abc_Obj_t * pFanout, * pTemp;
00797     int LevelOld, Lev, k, m;
00798     
00799     LevelOld = Abc_ObjLevel(pObjNew);
00800     if ( LevelOld == Abc_ObjLevelNew(pObjNew) )
00801         return;
00802     
00803     
00804     
00805     Vec_VecClear( vLevels );
00806     Vec_VecPush( vLevels, LevelOld, pObjNew );
00807     pObjNew->fMarkA = 1;
00808     
00809     Vec_VecForEachEntryStart( vLevels, pTemp, Lev, k, LevelOld )
00810     {
00811         pTemp->fMarkA = 0;
00812         assert( Abc_ObjLevel(pTemp) == Lev );
00813         Abc_ObjSetLevel( pTemp, Abc_ObjLevelNew(pTemp) );
00814         
00815         if ( Abc_ObjLevel(pTemp) == Lev )
00816             continue;
00817         
00818         Abc_ObjForEachFanout( pTemp, pFanout, m )
00819         {
00820             if ( !Abc_ObjIsCo(pFanout) && !pFanout->fMarkA )
00821             {
00822                 assert( Abc_ObjLevel(pFanout) >= Lev );
00823                 Vec_VecPush( vLevels, Abc_ObjLevel(pFanout), pFanout );
00824                 pFanout->fMarkA = 1;
00825             }
00826         }
00827     }
00828 }
00829 
00841 void Abc_NtkUpdateReverseLevel( Abc_Obj_t * pObjNew, Vec_Vec_t * vLevels )
00842 {
00843     Abc_Obj_t * pFanin, * pTemp;
00844     int LevelOld, LevFanin, Lev, k, m;
00845     
00846     LevelOld = Abc_ObjReverseLevel(pObjNew);
00847     if ( LevelOld == Abc_ObjReverseLevelNew(pObjNew) )
00848         return;
00849     
00850     
00851     
00852     Vec_VecClear( vLevels );
00853     Vec_VecPush( vLevels, LevelOld, pObjNew );
00854     pObjNew->fMarkA = 1;
00855     
00856     Vec_VecForEachEntryStart( vLevels, pTemp, Lev, k, LevelOld )
00857     {
00858         pTemp->fMarkA = 0;
00859         LevelOld = Abc_ObjReverseLevel(pTemp); 
00860         assert( LevelOld == Lev );
00861         Abc_ObjSetReverseLevel( pTemp, Abc_ObjReverseLevelNew(pTemp) );
00862         
00863         if ( Abc_ObjReverseLevel(pTemp) == Lev )
00864             continue;
00865         
00866         Abc_ObjForEachFanin( pTemp, pFanin, m )
00867         {
00868             if ( !Abc_ObjIsCi(pFanin) && !pFanin->fMarkA )
00869             {
00870                 LevFanin = Abc_ObjReverseLevel( pFanin );
00871                 assert( LevFanin >= Lev );
00872                 Vec_VecPush( vLevels, LevFanin, pFanin );
00873                 pFanin->fMarkA = 1;
00874             }
00875         }
00876     }
00877 }
00878 
00890 void Abc_NtkUpdate( Abc_Obj_t * pObj, Abc_Obj_t * pObjNew, Vec_Vec_t * vLevels )
00891 {
00892     
00893     pObjNew->Level = pObj->Level;
00894     Abc_ObjReplace( pObj, pObjNew );
00895     
00896     Abc_NtkUpdateLevel( pObjNew, vLevels );
00897     Abc_ObjSetReverseLevel( pObjNew, 0 );
00898     Abc_NtkUpdateReverseLevel( pObjNew, vLevels );
00899 }
00900 
00904 
00905