text: /**CFile****************************************************************
  
    FileName    [mvcCube.c]
  
    PackageName [MVSIS 2.0: Multi-valued logic synthesis system.]
  
    Synopsis    [Manipulating unate cubes.]
  
    Author      [MVSIS Group]
    
    Affiliation [UC Berkeley]
  
    Date        [Ver. 1.0. Started - February 1, 2003.]
  
    Revision    [$Id: mvcCube.c,v 1.4 2003/04/03 06:31:49 alanmi Exp $]
  
  ***********************************************************************/
  
  #include "mvc.h"
  
  ABC_NAMESPACE_IMPL_START
  
  
  ////////////////////////////////////////////////////////////////////////
  ///                        DECLARATIONS                              ///
  ////////////////////////////////////////////////////////////////////////
  
  ////////////////////////////////////////////////////////////////////////
  ///                     FUNCTION DEFINITIONS                         ///
  ////////////////////////////////////////////////////////////////////////
  
  /**Function*************************************************************
  
    Synopsis    []
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  Mvc_Cube_t * Mvc_CubeAlloc( Mvc_Cover_t * pCover )
  {
      Mvc_Cube_t * pCube;
  
      assert( pCover->nWords >= 0 );
      // allocate the cube
  #ifdef USE_SYSTEM_MEMORY_MANAGEMENT
      if ( pCover->nWords == 0 )
          pCube = (Mvc_Cube_t *)ABC_ALLOC( char, sizeof(Mvc_Cube_t) );
      else
          pCube = (Mvc_Cube_t *)ABC_ALLOC( char,  sizeof(Mvc_Cube_t) + sizeof(Mvc_CubeWord_t) * (pCover->nWords - 1) );
  #else
      switch( pCover->nWords )
      {
      case 0:
      case 1:
          pCube = (Mvc_Cube_t *)Extra_MmFixedEntryFetch( pCover->pMem->pMan1 );
          break;
      case 2:
          pCube = (Mvc_Cube_t *)Extra_MmFixedEntryFetch( pCover->pMem->pMan2 );
          break;
      case 3:
      case 4:
          pCube = (Mvc_Cube_t *)Extra_MmFixedEntryFetch( pCover->pMem->pMan4 );
          break;
      default:
          pCube = (Mvc_Cube_t *)ABC_ALLOC( char, sizeof(Mvc_Cube_t) + sizeof(Mvc_CubeWord_t) * (pCover->nWords - 1) );
          break;
      }
  #endif
      // set the parameters charactering this cube
      if ( pCover->nWords == 0 )
          pCube->iLast   = pCover->nWords;
      else
          pCube->iLast   = pCover->nWords - 1;
      pCube->nUnused = pCover->nUnused;
      return pCube;
  }
  
  
  /**Function*************************************************************
  
    Synopsis    []
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  Mvc_Cube_t * Mvc_CubeDup( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube )
  {
      Mvc_Cube_t * pCubeCopy;
      pCubeCopy = Mvc_CubeAlloc( pCover );
      Mvc_CubeBitCopy( pCubeCopy, pCube );
      return pCubeCopy;
  }
  
  
  /**Function*************************************************************
  
    Synopsis    []
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  void Mvc_CubeFree( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube )
  {
      if ( pCube == NULL )
          return;
  
      // verify the parameters charactering this cube
      assert( pCube->iLast == 0 || ((int)pCube->iLast) == pCover->nWords - 1 );
      assert( ((int)pCube->nUnused) == pCover->nUnused );
  
      // deallocate the cube
  #ifdef USE_SYSTEM_MEMORY_MANAGEMENT
      ABC_FREE( pCube );
  #else
      switch( pCover->nWords )
      {
      case 0:
      case 1:
          Extra_MmFixedEntryRecycle( pCover->pMem->pMan1, (char *)pCube );
          break;
      case 2:
          Extra_MmFixedEntryRecycle( pCover->pMem->pMan2, (char *)pCube );
          break;
      case 3:
      case 4:
          Extra_MmFixedEntryRecycle( pCover->pMem->pMan4, (char *)pCube );
          break;
      default:
          ABC_FREE( pCube );
          break;
      }
  #endif
  }
  
  
  /**Function*************************************************************
  
    Synopsis    [Removes the don't-care variable from the cube.]
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  void Mvc_CubeBitRemoveDcs( Mvc_Cube_t * pCube )
  {
      unsigned Mask;
      int i;
      for ( i = Mvc_CubeReadLast(pCube); i >= 0; i-- )
      {
          // detect those variables that are different (not DCs)
          Mask = (pCube->pData[i] ^ (pCube->pData[i] >> 1)) & BITS_DISJOINT; 
          // create the mask of all that are different
          Mask |= (Mask << 1);
          // remove other bits from the set
          pCube->pData[i] &= Mask;
      }
  }
  
  ////////////////////////////////////////////////////////////////////////
  ///                       END OF FILE                                ///
  ////////////////////////////////////////////////////////////////////////
  
  
  ABC_NAMESPACE_IMPL_END
  
  