⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fxuint.h

📁 主要进行大规模的电路综合
💻 H
📖 第 1 页 / 共 2 页
字号:
	int              HNum;        // the heap number of this divisor	int              Weight;      // the weight of this divisor	Fxu_Var *        pVar1;       // the first variable of the single-cube divisor	Fxu_Var *        pVar2;       // the second variable of the single-cube divisor	Fxu_Single *     pPrev;       // the previous divisor in the list	Fxu_Single *     pNext;       // the next divisor in the list};///////////////////////////////////////////////////////////////////////////                       MACRO DEFITIONS                            ///////////////////////////////////////////////////////////////////////////// minimum/maximum#define Fxu_Min( a, b ) ( ((a)<(b))? (a):(b) )#define Fxu_Max( a, b ) ( ((a)>(b))? (a):(b) )// selection of the minimum/maximum cube in the pair#define Fxu_PairMinCube( pPair )    (((pPair)->iCube1 < (pPair)->iCube2)? (pPair)->pCube1: (pPair)->pCube2)#define Fxu_PairMaxCube( pPair )    (((pPair)->iCube1 > (pPair)->iCube2)? (pPair)->pCube1: (pPair)->pCube2)#define Fxu_PairMinCubeInt( pPair ) (((pPair)->iCube1 < (pPair)->iCube2)? (pPair)->iCube1: (pPair)->iCube2)#define Fxu_PairMaxCubeInt( pPair ) (((pPair)->iCube1 > (pPair)->iCube2)? (pPair)->iCube1: (pPair)->iCube2)// iterators#define Fxu_MatrixForEachCube( Matrix, Cube )\	for ( Cube = (Matrix)->lCubes.pHead;\          Cube;\		  Cube = Cube->pNext )#define Fxu_MatrixForEachCubeSafe( Matrix, Cube, Cube2 )\	for ( Cube = (Matrix)->lCubes.pHead, Cube2 = (Cube? Cube->pNext: NULL);\          Cube;\		  Cube = Cube2, Cube2 = (Cube? Cube->pNext: NULL) )#define Fxu_MatrixForEachVariable( Matrix, Var )\	for ( Var = (Matrix)->lVars.pHead;\          Var;\		  Var = Var->pNext )#define Fxu_MatrixForEachVariableSafe( Matrix, Var, Var2 )\	for ( Var = (Matrix)->lVars.pHead, Var2 = (Var? Var->pNext: NULL);\          Var;\		  Var = Var2, Var2 = (Var? Var->pNext: NULL) )#define Fxu_MatrixForEachSingle( Matrix, Single )\	for ( Single = (Matrix)->lSingles.pHead;\          Single;\		  Single = Single->pNext )#define Fxu_MatrixForEachSingleSafe( Matrix, Single, Single2 )\	for ( Single = (Matrix)->lSingles.pHead, Single2 = (Single? Single->pNext: NULL);\          Single;\		  Single = Single2, Single2 = (Single? Single->pNext: NULL) )#define Fxu_TableForEachDouble( Matrix, Key, Div )\	for ( Div = (Matrix)->pTable[Key].pHead;\          Div;\		  Div = Div->pNext )#define Fxu_TableForEachDoubleSafe( Matrix, Key, Div, Div2 )\	for ( Div = (Matrix)->pTable[Key].pHead, Div2 = (Div? Div->pNext: NULL);\          Div;\		  Div = Div2, Div2 = (Div? Div->pNext: NULL) )#define Fxu_MatrixForEachDouble( Matrix, Div, Index )\    for ( Index = 0; Index < (Matrix)->nTableSize; Index++ )\        Fxu_TableForEachDouble( Matrix, Index, Div )#define Fxu_MatrixForEachDoubleSafe( Matrix, Div, Div2, Index )\    for ( Index = 0; Index < (Matrix)->nTableSize; Index++ )\        Fxu_TableForEachDoubleSafe( Matrix, Index, Div, Div2 )#define Fxu_CubeForEachLiteral( Cube, Lit )\	for ( Lit = (Cube)->lLits.pHead;\          Lit;\		  Lit = Lit->pHNext )#define Fxu_CubeForEachLiteralSafe( Cube, Lit, Lit2 )\	for ( Lit = (Cube)->lLits.pHead, Lit2 = (Lit? Lit->pHNext: NULL);\          Lit;\		  Lit = Lit2, Lit2 = (Lit? Lit->pHNext: NULL) )#define Fxu_VarForEachLiteral( Var, Lit )\	for ( Lit = (Var)->lLits.pHead;\          Lit;\		  Lit = Lit->pVNext )#define Fxu_CubeForEachDivisor( Cube, Div )\	for ( Div = (Cube)->lDivs.pHead;\          Div;\		  Div = Div->pCNext )#define Fxu_DoubleForEachPair( Div, Pair )\	for ( Pair = (Div)->lPairs.pHead;\          Pair;\		  Pair = Pair->pDNext )#define Fxu_DoubleForEachPairSafe( Div, Pair, Pair2 )\	for ( Pair = (Div)->lPairs.pHead, Pair2 = (Pair? Pair->pDNext: NULL);\          Pair;\		  Pair = Pair2, Pair2 = (Pair? Pair->pDNext: NULL) )// iterator through the cube pairs belonging to the given cube #define Fxu_CubeForEachPair( pCube, pPair, i )\  for ( i = 0;\        i < pCube->pVar->nCubes &&\        (((unsigned)(pPair = pCube->pVar->ppPairs[pCube->iCube][i])) >= 0);\		i++ )\	    if ( pPair )// iterator through all the items in the heap#define Fxu_HeapDoubleForEachItem( Heap, Div )\	for ( Heap->i = 1;\		  Heap->i <= Heap->nItems && (Div = Heap->pTree[Heap->i]);\		  Heap->i++ )#define Fxu_HeapSingleForEachItem( Heap, Single )\	for ( Heap->i = 1;\		  Heap->i <= Heap->nItems && (Single = Heap->pTree[Heap->i]);\		  Heap->i++ )// starting the rings#define Fxu_MatrixRingCubesStart( Matrix )    (((Matrix)->ppTailCubes = &((Matrix)->pOrderCubes)), ((Matrix)->pOrderCubes = NULL))#define Fxu_MatrixRingVarsStart(  Matrix )    (((Matrix)->ppTailVars  = &((Matrix)->pOrderVars)),  ((Matrix)->pOrderVars  = NULL))// stopping the rings#define Fxu_MatrixRingCubesStop(  Matrix )#define Fxu_MatrixRingVarsStop(   Matrix )// resetting the rings#define Fxu_MatrixRingCubesReset( Matrix )    (((Matrix)->pOrderCubes = NULL), ((Matrix)->ppTailCubes = NULL))#define Fxu_MatrixRingVarsReset(  Matrix )    (((Matrix)->pOrderVars  = NULL), ((Matrix)->ppTailVars  = NULL))// adding to the rings#define Fxu_MatrixRingCubesAdd( Matrix, Cube) ((*((Matrix)->ppTailCubes) = Cube), ((Matrix)->ppTailCubes = &(Cube)->pOrder), ((Cube)->pOrder = (Fxu_Cube *)1))#define Fxu_MatrixRingVarsAdd(  Matrix, Var ) ((*((Matrix)->ppTailVars ) = Var ), ((Matrix)->ppTailVars  = &(Var)->pOrder ), ((Var)->pOrder  = (Fxu_Var *)1))// iterating through the rings#define Fxu_MatrixForEachCubeInRing( Matrix, Cube )\    if ( (Matrix)->pOrderCubes )\	for ( Cube = (Matrix)->pOrderCubes;\          Cube != (Fxu_Cube *)1;\		  Cube = Cube->pOrder )#define Fxu_MatrixForEachCubeInRingSafe( Matrix, Cube, Cube2 )\    if ( (Matrix)->pOrderCubes )\	for ( Cube = (Matrix)->pOrderCubes, Cube2 = ((Cube != (Fxu_Cube *)1)? Cube->pOrder: (Fxu_Cube *)1);\          Cube != (Fxu_Cube *)1;\		  Cube = Cube2, Cube2 = ((Cube != (Fxu_Cube *)1)? Cube->pOrder: (Fxu_Cube *)1) )#define Fxu_MatrixForEachVarInRing( Matrix, Var )\    if ( (Matrix)->pOrderVars )\	for ( Var = (Matrix)->pOrderVars;\          Var != (Fxu_Var *)1;\		  Var = Var->pOrder )#define Fxu_MatrixForEachVarInRingSafe( Matrix, Var, Var2 )\    if ( (Matrix)->pOrderVars )\	for ( Var = (Matrix)->pOrderVars, Var2 = ((Var != (Fxu_Var *)1)? Var->pOrder: (Fxu_Var *)1);\          Var != (Fxu_Var *)1;\		  Var = Var2, Var2 = ((Var != (Fxu_Var *)1)? Var->pOrder: (Fxu_Var *)1) )// the procedures are related to the above macrosextern void Fxu_MatrixRingCubesUnmark( Fxu_Matrix * p );extern void Fxu_MatrixRingVarsUnmark( Fxu_Matrix * p );// macros working with memory// MEM_ALLOC: allocate the given number (Size) of items of type (Type)// MEM_FREE:  deallocate the pointer (Pointer) to the given number (Size) of items of type (Type)#ifdef USE_SYSTEM_MEMORY_MANAGEMENT#define MEM_ALLOC_FXU( Manager, Type, Size )          ((Type *)malloc( (Size) * sizeof(Type) ))#define MEM_FREE_FXU( Manager, Type, Size, Pointer )  if ( Pointer ) { free(Pointer); Pointer = NULL; }#else#define MEM_ALLOC_FXU( Manager, Type, Size )\        ((Type *)Fxu_MemFetch( Manager, (Size) * sizeof(Type) ))#define MEM_FREE_FXU( Manager, Type, Size, Pointer )\         if ( Pointer ) { Fxu_MemRecycle( Manager, (char *)(Pointer), (Size) * sizeof(Type) ); Pointer = NULL; }#endif///////////////////////////////////////////////////////////////////////////                     FUNCTION DEFITIONS                           ////////////////////////////////////////////////////////////////////////////*===== fxu.c ====================================================*/extern char *       Fxu_MemFetch( Fxu_Matrix * p, int nBytes );extern void         Fxu_MemRecycle( Fxu_Matrix * p, char * pItem, int nBytes );/*===== fxuCreate.c ====================================================*//*===== fxuReduce.c ====================================================*//*===== fxuPrint.c ====================================================*/extern void         Fxu_MatrixPrint( FILE * pFile, Fxu_Matrix * p );extern void         Fxu_MatrixPrintDivisorProfile( FILE * pFile, Fxu_Matrix * p );/*===== fxuSelect.c ====================================================*/extern int          Fxu_Select( Fxu_Matrix * p, Fxu_Single ** ppSingle, Fxu_Double ** ppDouble );extern int          Fxu_SelectSCD( Fxu_Matrix * p, int Weight, Fxu_Var ** ppVar1, Fxu_Var ** ppVar2 );/*===== fxuUpdate.c ====================================================*/extern void         Fxu_Update( Fxu_Matrix * p, Fxu_Single * pSingle, Fxu_Double * pDouble );extern void         Fxu_UpdateDouble( Fxu_Matrix * p );extern void         Fxu_UpdateSingle( Fxu_Matrix * p );/*===== fxuPair.c ====================================================*/extern void         Fxu_PairCanonicize( Fxu_Cube ** ppCube1, Fxu_Cube ** ppCube2 );extern unsigned     Fxu_PairHashKeyArray( Fxu_Matrix * p, int piVarsC1[], int piVarsC2[], int nVarsC1, int nVarsC2 );extern unsigned     Fxu_PairHashKey( Fxu_Matrix * p, Fxu_Cube * pCube1, Fxu_Cube * pCube2, int * pnBase, int * pnLits1, int * pnLits2 );extern unsigned     Fxu_PairHashKeyMv( Fxu_Matrix * p, Fxu_Cube * pCube1, Fxu_Cube * pCube2, int * pnBase, int * pnLits1, int * pnLits2 );extern int          Fxu_PairCompare( Fxu_Pair * pPair1, Fxu_Pair * pPair2 );extern void         Fxu_PairAllocStorage( Fxu_Var * pVar, int nCubes );extern void         Fxu_PairFreeStorage( Fxu_Var * pVar );extern void         Fxu_PairClearStorage( Fxu_Cube * pCube );extern Fxu_Pair *   Fxu_PairAlloc( Fxu_Matrix * p, Fxu_Cube * pCube1, Fxu_Cube * pCube2 );extern void         Fxu_PairAdd( Fxu_Pair * pPair );/*===== fxuSingle.c ====================================================*/extern void         Fxu_MatrixComputeSingles( Fxu_Matrix * p );extern void         Fxu_MatrixComputeSinglesOne( Fxu_Matrix * p, Fxu_Var * pVar );extern int          Fxu_SingleCountCoincidence( Fxu_Matrix * p, Fxu_Var * pVar1, Fxu_Var * pVar2 );/*===== fxuMatrix.c ====================================================*/// matrixextern Fxu_Matrix * Fxu_MatrixAllocate();extern void         Fxu_MatrixDelete( Fxu_Matrix * p );// double-cube divisorextern void         Fxu_MatrixAddDivisor( Fxu_Matrix * p, Fxu_Cube * pCube1, Fxu_Cube * pCube2 );extern void         Fxu_MatrixDelDivisor( Fxu_Matrix * p, Fxu_Double * pDiv );// single-cube divisorextern void          Fxu_MatrixAddSingle( Fxu_Matrix * p, Fxu_Var * pVar1, Fxu_Var * pVar2, int Weight );// variableextern Fxu_Var *    Fxu_MatrixAddVar( Fxu_Matrix * p );// cubeextern Fxu_Cube *   Fxu_MatrixAddCube( Fxu_Matrix * p, Fxu_Var * pVar, int iCube );// literalextern void         Fxu_MatrixAddLiteral( Fxu_Matrix * p, Fxu_Cube * pCube, Fxu_Var * pVar );extern void         Fxu_MatrixDelLiteral( Fxu_Matrix * p, Fxu_Lit * pLit );/*===== fxuList.c ====================================================*/// matrix -> variable extern void         Fxu_ListMatrixAddVariable( Fxu_Matrix * p, Fxu_Var * pVar );extern void         Fxu_ListMatrixDelVariable( Fxu_Matrix * p, Fxu_Var * pVar );// matrix -> cubeextern void         Fxu_ListMatrixAddCube( Fxu_Matrix * p, Fxu_Cube * pCube );extern void         Fxu_ListMatrixDelCube( Fxu_Matrix * p, Fxu_Cube * pCube );// matrix -> singleextern void         Fxu_ListMatrixAddSingle( Fxu_Matrix * p, Fxu_Single * pSingle );extern void         Fxu_ListMatrixDelSingle( Fxu_Matrix * p, Fxu_Single * pSingle );// table -> divisorextern void         Fxu_ListTableAddDivisor( Fxu_Matrix * p, Fxu_Double * pDiv );extern void         Fxu_ListTableDelDivisor( Fxu_Matrix * p, Fxu_Double * pDiv );// cube -> literal extern void         Fxu_ListCubeAddLiteral( Fxu_Cube * pCube, Fxu_Lit * pLit );extern void         Fxu_ListCubeDelLiteral( Fxu_Cube * pCube, Fxu_Lit * pLit );// var -> literalextern void         Fxu_ListVarAddLiteral( Fxu_Var * pVar, Fxu_Lit * pLit );extern void         Fxu_ListVarDelLiteral( Fxu_Var * pVar, Fxu_Lit * pLit );// divisor -> pairextern void         Fxu_ListDoubleAddPairLast( Fxu_Double * pDiv, Fxu_Pair * pLink );extern void         Fxu_ListDoubleAddPairFirst( Fxu_Double * pDiv, Fxu_Pair * pLink );extern void         Fxu_ListDoubleAddPairMiddle( Fxu_Double * pDiv, Fxu_Pair * pSpot, Fxu_Pair * pLink );extern void         Fxu_ListDoubleDelPair( Fxu_Double * pDiv, Fxu_Pair * pPair );/*===== fxuHeapDouble.c ====================================================*/extern Fxu_HeapDouble * Fxu_HeapDoubleStart();extern void         Fxu_HeapDoubleStop( Fxu_HeapDouble * p );extern void         Fxu_HeapDoublePrint( FILE * pFile, Fxu_HeapDouble * p );extern void         Fxu_HeapDoubleCheck( Fxu_HeapDouble * p );extern void         Fxu_HeapDoubleCheckOne( Fxu_HeapDouble * p, Fxu_Double * pDiv );extern void         Fxu_HeapDoubleInsert( Fxu_HeapDouble * p, Fxu_Double * pDiv );  extern void         Fxu_HeapDoubleUpdate( Fxu_HeapDouble * p, Fxu_Double * pDiv );  extern void         Fxu_HeapDoubleDelete( Fxu_HeapDouble * p, Fxu_Double * pDiv );  extern int          Fxu_HeapDoubleReadMaxWeight( Fxu_HeapDouble * p );  extern Fxu_Double * Fxu_HeapDoubleReadMax( Fxu_HeapDouble * p );  extern Fxu_Double * Fxu_HeapDoubleGetMax( Fxu_HeapDouble * p );  /*===== fxuHeapSingle.c ====================================================*/extern Fxu_HeapSingle * Fxu_HeapSingleStart();extern void         Fxu_HeapSingleStop( Fxu_HeapSingle * p );extern void         Fxu_HeapSinglePrint( FILE * pFile, Fxu_HeapSingle * p );extern void         Fxu_HeapSingleCheck( Fxu_HeapSingle * p );extern void         Fxu_HeapSingleCheckOne( Fxu_HeapSingle * p, Fxu_Single * pSingle );extern void         Fxu_HeapSingleInsert( Fxu_HeapSingle * p, Fxu_Single * pSingle );  extern void         Fxu_HeapSingleUpdate( Fxu_HeapSingle * p, Fxu_Single * pSingle );  extern void         Fxu_HeapSingleDelete( Fxu_HeapSingle * p, Fxu_Single * pSingle );  extern int          Fxu_HeapSingleReadMaxWeight( Fxu_HeapSingle * p );  extern Fxu_Single * Fxu_HeapSingleReadMax( Fxu_HeapSingle * p );extern Fxu_Single * Fxu_HeapSingleGetMax( Fxu_HeapSingle * p );  ///////////////////////////////////////////////////////////////////////////                         END OF FILE                              ///////////////////////////////////////////////////////////////////////////#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -