#include "mvc.h"
ABC_NAMESPACE_IMPL_START
Mvc_Cube_t * Mvc_CubeAlloc( Mvc_Cover_t * pCover )
{
Mvc_Cube_t * pCube;
assert( pCover->nWords >= 0 );
#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
if ( pCover->nWords == 0 )
pCube->iLast = pCover->nWords;
else
pCube->iLast = pCover->nWords - 1;
pCube->nUnused = pCover->nUnused;
return pCube;
}
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;
}
void Mvc_CubeFree( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube )
{
if ( pCube == NULL )
return;
assert( pCube->iLast == 0 || ((int)pCube->iLast) == pCover->nWords - 1 );
assert( ((int)pCube->nUnused) == pCover->nUnused );
#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
}
void Mvc_CubeBitRemoveDcs( Mvc_Cube_t * pCube )
{
unsigned Mask;
int i;
for ( i = Mvc_CubeReadLast(pCube); i >= 0; i-- )
{
Mask = (pCube->pData[i] ^ (pCube->pData[i] >> 1)) & BITS_DISJOINT;
Mask |= (Mask << 1);
pCube->pData[i] &= Mask;
}
}
ABC_NAMESPACE_IMPL_END