/**CFile**************************************************************** FileName [mvcList.c] PackageName [MVSIS 2.0: Multi-valued logic synthesis system.] Synopsis [Manipulating list of cubes in the cover.] Author [MVSIS Group] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - February 1, 2003.] Revision [$Id: mvcList.c,v 1.4 2003/04/03 06:31:50 alanmi Exp $] ***********************************************************************/ #include "mvc.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_ListAddCubeHead_( Mvc_List_t * pList, Mvc_Cube_t * pCube ) { if ( pList->pHead == NULL ) { Mvc_CubeSetNext( pCube, NULL ); pList->pHead = pCube; pList->pTail = pCube; } else { Mvc_CubeSetNext( pCube, pList->pHead ); pList->pHead = pCube; } pList->nItems++; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_ListAddCubeTail_( Mvc_List_t * pList, Mvc_Cube_t * pCube ) { if ( pList->pHead == NULL ) pList->pHead = pCube; else Mvc_CubeSetNext( pList->pTail, pCube ); pList->pTail = pCube; Mvc_CubeSetNext( pCube, NULL ); pList->nItems++; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_ListDeleteCube_( Mvc_List_t * pList, Mvc_Cube_t * pPrev, Mvc_Cube_t * pCube ) { if ( pPrev == NULL ) // deleting the head cube pList->pHead = Mvc_CubeReadNext(pCube); else pPrev->pNext = pCube->pNext; if ( pList->pTail == pCube ) // deleting the tail cube { assert( Mvc_CubeReadNext(pCube) == NULL ); pList->pTail = pPrev; } pList->nItems--; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverAddCubeHead_( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube ) { Mvc_List_t * pList = &pCover->lCubes; if ( pList->pHead == NULL ) { Mvc_CubeSetNext( pCube, NULL ); pList->pHead = pCube; pList->pTail = pCube; } else { Mvc_CubeSetNext( pCube, pList->pHead ); pList->pHead = pCube; } pList->nItems++; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverAddCubeTail_( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube ) { Mvc_List_t * pList = &pCover->lCubes; if ( pList->pHead == NULL ) pList->pHead = pCube; else Mvc_CubeSetNext( pList->pTail, pCube ); pList->pTail = pCube; Mvc_CubeSetNext( pCube, NULL ); pList->nItems++; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverDeleteCube_( Mvc_Cover_t * pCover, Mvc_Cube_t * pPrev, Mvc_Cube_t * pCube ) { Mvc_List_t * pList = &pCover->lCubes; if ( pPrev == NULL ) // deleting the head cube pList->pHead = Mvc_CubeReadNext(pCube); else pPrev->pNext = pCube->pNext; if ( pList->pTail == pCube ) // deleting the tail cube { assert( Mvc_CubeReadNext(pCube) == NULL ); pList->pTail = pPrev; } pList->nItems--; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverAddDupCubeHead( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube ) { Mvc_Cube_t * pCubeNew; pCubeNew = Mvc_CubeAlloc( pCover ); Mvc_CubeBitCopy( pCubeNew, pCube ); Mvc_CoverAddCubeHead( pCover, pCubeNew ); } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverAddDupCubeTail( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube ) { Mvc_Cube_t * pCubeNew; // copy the cube as part of this cover pCubeNew = Mvc_CubeAlloc( pCover ); Mvc_CubeBitCopy( pCubeNew, pCube ); // clean the last bits of the new cube // pCubeNew->pData[pCubeNew->iLast] &= (BITS_FULL >> pCubeNew->nUnused); // add the cube at the end Mvc_CoverAddCubeTail( pCover, pCubeNew ); } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverAddLiteralsOfCube( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube ) { // int iBit, Value; // assert( pCover->pLits ); // Mvc_CubeForEachBit( pCover, pCube, iBit, Value ) // if ( Value ) // pCover->pLits[iBit] += Value; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverDeleteLiteralsOfCube( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube ) { // int iBit, Value; // assert( pCover->pLits ); // Mvc_CubeForEachBit( pCover, pCube, iBit, Value ) // if ( Value ) // pCover->pLits[iBit] -= Value; } /**Function************************************************************* Synopsis [Transfers the cubes from the list into the array.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverList2Array( Mvc_Cover_t * pCover ) { Mvc_Cube_t * pCube; int Counter; // resize storage if necessary Mvc_CoverAllocateArrayCubes( pCover ); // iterate through the cubes Counter = 0; Mvc_CoverForEachCube( pCover, pCube ) pCover->pCubes[ Counter++ ] = pCube; assert( Counter == Mvc_CoverReadCubeNum(pCover) ); } /**Function************************************************************* Synopsis [Transfers the cubes from the array into list.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Mvc_CoverArray2List( Mvc_Cover_t * pCover ) { Mvc_Cube_t * pCube; int nCubes, i; assert( pCover->pCubes ); nCubes = Mvc_CoverReadCubeNum(pCover); if ( nCubes == 0 ) return; if ( nCubes == 1 ) { pCube = pCover->pCubes[0]; pCube->pNext = NULL; pCover->lCubes.pHead = pCover->lCubes.pTail = pCube; return; } // set up the first cube pCube = pCover->pCubes[0]; pCover->lCubes.pHead = pCube; // set up the last cube pCube = pCover->pCubes[nCubes-1]; pCube->pNext = NULL; pCover->lCubes.pTail = pCube; // link all cubes starting from the first one for ( i = 0; i < nCubes - 1; i++ ) pCover->pCubes[i]->pNext = pCover->pCubes[i+1]; } /**Function************************************************************* Synopsis [Returns the tail of the linked list given by the head.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Mvc_Cube_t * Mvc_ListGetTailFromHead( Mvc_Cube_t * pHead ) { Mvc_Cube_t * pCube, * pTail; for ( pTail = pCube = pHead; pCube; pTail = pCube, pCube = Mvc_CubeReadNext(pCube) ); return pTail; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END