| /**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 |
| |