📄 mvcsort.c
字号:
/**CFile**************************************************************** FileName [mvcSort.c] PackageName [MVSIS 2.0: Multi-valued logic synthesis system.] Synopsis [Sorting cubes in the cover with the mask.] Author [MVSIS Group] Affiliation [uC Berkeley] Date [Ver. 1.0. Started - February 1, 2003.] Revision [$Id: mvcSort.c,v 1.8 2003/05/27 23:15:16 alanmi Exp $]***********************************************************************/#include "mvc.h"/////////////////////////////////////////////////////////////////////////// DECLARATIONS ///////////////////////////////////////////////////////////////////////////Mvc_Cube_t * Mvc_CoverSort_rec( Mvc_Cube_t * pList, int nItems, Mvc_Cube_t * pMask, int (* pCompareFunc)(Mvc_Cube_t *, Mvc_Cube_t *, Mvc_Cube_t *) );Mvc_Cube_t * Mvc_CoverSortMerge( Mvc_Cube_t * pList1, Mvc_Cube_t * pList2, Mvc_Cube_t * pMask, int (* pCompareFunc)(Mvc_Cube_t *, Mvc_Cube_t *, Mvc_Cube_t *) );/////////////////////////////////////////////////////////////////////////// FuNCTION DEFITIONS ////////////////////////////////////////////////////////////////////////////**Function************************************************************* Synopsis [Sorts cubes using the given cost function.] Description [] SideEffects [] SeeAlso []***********************************************************************/void Mvc_CoverSort( Mvc_Cover_t * pCover, Mvc_Cube_t * pMask, int (* pCompareFunc)(Mvc_Cube_t *, Mvc_Cube_t *, Mvc_Cube_t *) ){ Mvc_Cube_t * pHead; int nCubes; // one cube does not need sorting nCubes = Mvc_CoverReadCubeNum(pCover); if ( nCubes <= 1 ) return; // sort the cubes pHead = Mvc_CoverSort_rec( Mvc_CoverReadCubeHead(pCover), nCubes, pMask, pCompareFunc ); // insert the sorted list into the cover Mvc_CoverSetCubeHead( pCover, pHead ); Mvc_CoverSetCubeTail( pCover, Mvc_ListGetTailFromHead(pHead) ); // make sure that the list is sorted in the increasing order assert( pCompareFunc( Mvc_CoverReadCubeHead(pCover), Mvc_CoverReadCubeTail(pCover), pMask ) <= 0 );}/**Function************************************************************* Synopsis [Recursive part of Mvc_CoverSort()] Description [] SideEffects [] SeeAlso []***********************************************************************/Mvc_Cube_t * Mvc_CoverSort_rec( Mvc_Cube_t * pList, int nItems, Mvc_Cube_t * pMask, int (* pCompareFunc)(Mvc_Cube_t *, Mvc_Cube_t *, Mvc_Cube_t *) ){ Mvc_Cube_t * pList1, * pList2; int nItems1, nItems2, i; // trivial case if ( nItems == 1 ) { Mvc_CubeSetNext( pList, NULL ); return pList; } // select the new sizes nItems1 = nItems/2; nItems2 = nItems - nItems1; // set the new beginnings pList1 = pList2 = pList; for ( i = 0; i < nItems1; i++ ) pList2 = Mvc_CubeReadNext( pList2 ); // solve recursively pList1 = Mvc_CoverSort_rec( pList1, nItems1, pMask, pCompareFunc ); pList2 = Mvc_CoverSort_rec( pList2, nItems2, pMask, pCompareFunc ); // merge return Mvc_CoverSortMerge( pList1, pList2, pMask, pCompareFunc );}/**Function************************************************************* Synopsis [Merges two NULL-terminated linked lists.] Description [] SideEffects [] SeeAlso []***********************************************************************/Mvc_Cube_t * Mvc_CoverSortMerge( Mvc_Cube_t * pList1, Mvc_Cube_t * pList2, Mvc_Cube_t * pMask, int (* pCompareFunc)(Mvc_Cube_t *, Mvc_Cube_t *, Mvc_Cube_t *) ){ Mvc_Cube_t * pList = NULL, ** ppTail = &pList; Mvc_Cube_t * pCube; while ( pList1 && pList2 ) { if ( pCompareFunc( pList1, pList2, pMask ) < 0 ) { pCube = pList1; pList1 = Mvc_CubeReadNext(pList1); } else { pCube = pList2; pList2 = Mvc_CubeReadNext(pList2); } *ppTail = pCube; ppTail = Mvc_CubeReadNextP(pCube); } *ppTail = pList1? pList1: pList2; return pList;}/////////////////////////////////////////////////////////////////////////// END OF FILE ///////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -