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