text: /**CFile****************************************************************
  
    FileName    [retCore.c]
  
    SystemName  [ABC: Logic synthesis and verification system.]
  
    PackageName [Retiming package.]
  
    Synopsis    [The core retiming procedures.]
  
    Author      [Alan Mishchenko]
    
    Affiliation [UC Berkeley]
  
    Date        [Ver. 1.0. Started - Oct 31, 2006.]
  
    Revision    [$Id: retCore.c,v 1.00 2006/10/31 00:00:00 alanmi Exp $]
  
  ***********************************************************************/
  
  #include "retInt.h"
  
  ABC_NAMESPACE_IMPL_START
  
  
  ////////////////////////////////////////////////////////////////////////
  ///                        DECLARATIONS                              ///
  ////////////////////////////////////////////////////////////////////////
  
  abctime timeRetime = 0;
  
  ////////////////////////////////////////////////////////////////////////
  ///                     FUNCTION DEFINITIONS                         ///
  ////////////////////////////////////////////////////////////////////////
  
  /**Function*************************************************************
  
    Synopsis    [Implementation of retiming.]
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  int Abc_NtkRetime( Abc_Ntk_t * pNtk, int Mode, int nDelayLim, int fForwardOnly, int fBackwardOnly, int fOneStep, int fUseOldNames, int fVerbose )
  {
      int nLatches = Abc_NtkLatchNum(pNtk);
      int nLevels  = Abc_NtkLevel(pNtk);
      int RetValue = 0;
      abctime clkTotal = Abc_Clock();
      int nNodesOld, nLatchesOld;
      assert( Mode > 0 && Mode < 7 );
      assert( !fForwardOnly || !fBackwardOnly );
  
      // cleanup the network
      nNodesOld   = Abc_NtkNodeNum(pNtk);
      nLatchesOld = Abc_NtkLatchNum(pNtk);
      Abc_NtkCleanupSeq(pNtk, 0, 0, 0);
      if ( nNodesOld > Abc_NtkNodeNum(pNtk) || nLatchesOld > Abc_NtkLatchNum(pNtk) )
          printf( "Cleanup before retiming removed %d dangling nodes and %d dangling latches.\n",
              nNodesOld - Abc_NtkNodeNum(pNtk), nLatchesOld - Abc_NtkLatchNum(pNtk) );
  
      // perform retiming
      switch ( Mode )
      {
      case 1: // forward 
          RetValue = Abc_NtkRetimeIncremental( pNtk, nDelayLim, 1, 0, 0, fUseOldNames, fVerbose );
          break;
      case 2: // backward 
          RetValue = Abc_NtkRetimeIncremental( pNtk, nDelayLim, 0, 0, 0, fUseOldNames, fVerbose );
          break;
      case 3: // min-area 
          RetValue = Abc_NtkRetimeMinArea( pNtk, fForwardOnly, fBackwardOnly, fUseOldNames, fVerbose );
          break;
      case 4: // min-delay
          if ( !fBackwardOnly )
              RetValue += Abc_NtkRetimeIncremental( pNtk, nDelayLim, 1, 1, fOneStep, fUseOldNames, fVerbose );
          if ( !fForwardOnly )
              RetValue += Abc_NtkRetimeIncremental( pNtk, nDelayLim, 0, 1, fOneStep, fUseOldNames, fVerbose );
          break;
      case 5: // min-area + min-delay
          RetValue  = Abc_NtkRetimeMinArea( pNtk, fForwardOnly, fBackwardOnly, fUseOldNames, fVerbose );
          if ( !fBackwardOnly )
              RetValue += Abc_NtkRetimeIncremental( pNtk, nDelayLim, 1, 1, 0, fUseOldNames, fVerbose );
          if ( !fForwardOnly )
              RetValue += Abc_NtkRetimeIncremental( pNtk, nDelayLim, 0, 1, 0, fUseOldNames, fVerbose );
          break;
      case 6: // Pan's algorithm
          RetValue = Abc_NtkRetimeLValue( pNtk, 500, fVerbose );
          break;
      default:
          printf( "Unknown retiming option.\n" );
          break;
      }
      if ( fVerbose )
      {
          printf( "Reduction in area = %3d. Reduction in delay = %3d. ", 
              nLatches - Abc_NtkLatchNum(pNtk), nLevels - Abc_NtkLevel(pNtk) );
          ABC_PRT( "Total runtime", Abc_Clock() - clkTotal );
      }
      timeRetime = Abc_Clock() - clkTotal;
      return RetValue;
  }
  
  /**Function*************************************************************
  
    Synopsis    [Used for automated debugging.]
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  int Abc_NtkRetimeDebug( Abc_Ntk_t * pNtk )
  {
      extern int Abc_NtkSecFraig( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, int nFrames, int fVerbose );
      Abc_Ntk_t * pNtkRet;
      assert( Abc_NtkIsLogic(pNtk) );
      Abc_NtkToSop( pNtk, -1, ABC_INFINITY );
  //    if ( !Abc_NtkCheck( pNtk ) )
  //        fprintf( stdout, "Abc_NtkRetimeDebug(): Network check has failed.\n" );
  //    Io_WriteBlifLogic( pNtk, "debug_temp.blif", 1 );
      pNtkRet = Abc_NtkDup( pNtk );
      Abc_NtkRetime( pNtkRet, 3, 0, 0, 1, 0, 1, 0 ); // debugging backward flow
      return !Abc_NtkSecFraig( pNtk, pNtkRet, 10000, 3, 0 );
  }
  
  ////////////////////////////////////////////////////////////////////////
  ///                       END OF FILE                                ///
  ////////////////////////////////////////////////////////////////////////
  
  
  ABC_NAMESPACE_IMPL_END
  
  