/**CFile**************************************************************** FileName [mvcCover.c] PackageName [MVSIS 2.0: Multi-valued logic synthesis system.] Synopsis [Basic procedures to manipulate unate cube covers.] Author [MVSIS Group] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - February 1, 2003.] Revision [$Id: mvcCover.c,v 1.5 2003/04/09 18:02:05 alanmi Exp $] ***********************************************************************/ #include "mvc.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Mvc_Cover_t * Mvc_CoverAlloc( Mvc_Manager_t * pMem, int nBits ) { Mvc_Cover_t * p; int nBitsInUnsigned; nBitsInUnsigned = 8 * sizeof(Mvc_CubeWord_t); #ifdef USE_SYSTEM_MEMORY_MANAGEMENT p = (Mvc_Cover_t *)ABC_ALLOC( char, sizeof(Mvc_Cover_t) ); #else p = (Mvc_Cover_t *)Extra_MmFixedEntryFetch( pMem->pManC ); #endif p->pMem = pMem; p->nBits = nBits; p->nWords = nBits / nBitsInUnsigned + (int)(nBits % nBitsInUnsigned > 0); p->nUnused = p->nWords * nBitsInUnsigned - p->nBits; p->lCubes.nItems = 0; p->lCubes.pHead = NULL; p->lCubes.pTail = NULL; p->nCubesAlloc = 0; p->pCubes = NULL; p->pMask = NULL; p->pLits = NULL; return p; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Mvc_Cover_t * Mvc_CoverClone( Mvc_Cover_t * p ) { Mvc_Cover_t * pCover; #ifdef USE_SYSTEM_MEMORY_MANAGEMENT pCover = (Mvc_Cover_t *)ABC_ALLOC( char, sizeof(Mvc_Cover_t) ); #else pCover = (Mvc_Cover_t *)Extra_MmFixedEntryFetch( p->pMem->pManC ); #endif pCover->pMem = p->pMem; pCover->nBits = p->nBits; pCover->nWords = p->nWords; pCover->nUnused = p->nUnused; pCover->lCubes.nItems = 0; pCover->lCubes.pHead = NULL; pCover->lCubes.pTail = NULL; pCover->nCubesAlloc = 0; pCover->pCubes = NULL; pCover->pMask = NULL; pCover->pLits = NULL; return pCover; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Mvc_Cover_t * Mvc_CoverDup( Mvc_Cover_t * p ) { Mvc_Cover_t * pCover; Mvc_Cube_t * pCube, * pCubeCopy; // clone the cover pCover = Mvc_CoverClone( p ); // copy the cube list Mvc_CoverForEachCube( p, pCube ) { pCubeCopy = Mvc_CubeDup( p, pCube ); Mvc_CoverAddCubeTail( pCover, pCubeCopy ); } return pCover; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverFree( Mvc_Cover_t * p ) { Mvc_Cube_t * pCube, * pCube2; // recycle cube list Mvc_CoverForEachCubeSafe( p, pCube, pCube2 ) Mvc_CubeFree( p, pCube ); // recycle other pointers Mvc_CubeFree( p, p->pMask ); MEM_FREE( p->pMem, Mvc_Cube_t *, p->nCubesAlloc, p->pCubes ); MEM_FREE( p->pMem, int, p->nBits, p->pLits ); #ifdef USE_SYSTEM_MEMORY_MANAGEMENT ABC_FREE( p ); #else Extra_MmFixedEntryRecycle( p->pMem->pManC, (char *)p ); #endif } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverAllocateMask( Mvc_Cover_t * pCover ) { if ( pCover->pMask == NULL ) pCover->pMask = Mvc_CubeAlloc( pCover ); } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverAllocateArrayLits( Mvc_Cover_t * pCover ) { if ( pCover->pLits == NULL ) pCover->pLits = MEM_ALLOC( pCover->pMem, int, pCover->nBits ); } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverAllocateArrayCubes( Mvc_Cover_t * pCover ) { if ( pCover->nCubesAlloc < pCover->lCubes.nItems ) { if ( pCover->nCubesAlloc > 0 ) MEM_FREE( pCover->pMem, Mvc_Cube_t *, pCover->nCubesAlloc, pCover->pCubes ); pCover->nCubesAlloc = pCover->lCubes.nItems; pCover->pCubes = MEM_ALLOC( pCover->pMem, Mvc_Cube_t *, pCover->nCubesAlloc ); } } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverDeallocateMask( Mvc_Cover_t * pCover ) { Mvc_CubeFree( pCover, pCover->pMask ); pCover->pMask = NULL; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverDeallocateArrayLits( Mvc_Cover_t * pCover ) { if ( pCover->pLits ) { MEM_FREE( pCover->pMem, int, pCover->nBits, pCover->pLits ); pCover->pLits = NULL; } } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END