mirror of https://github.com/YosysHQ/abc.git
181 lines
4.7 KiB
C
181 lines
4.7 KiB
C
/**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
|
|
|