| /**CFile**************************************************************** | |
| FileName [fxuInt.h] | |
| PackageName [MVSIS 2.0: Multi-valued logic synthesis system.] | |
| Synopsis [Internal declarations of fast extract for unate covers.] | |
| Author [MVSIS Group] | |
| Affiliation [UC Berkeley] | |
| Date [Ver. 1.0. Started - February 1, 2003.] | |
| Revision [$Id: fxuInt.h,v 1.3 2003/04/10 05:42:44 donald Exp $] | |
| ***********************************************************************/ | |
| #ifndef ABC__opt__fxu__fxuInt_h | |
| #define ABC__opt__fxu__fxuInt_h | |
| //////////////////////////////////////////////////////////////////////// | |
| /// INCLUDES /// | |
| //////////////////////////////////////////////////////////////////////// | |
| #include "base/abc/abc.h" | |
| ABC_NAMESPACE_HEADER_START | |
| //////////////////////////////////////////////////////////////////////// | |
| /// PARAMETERS /// | |
| //////////////////////////////////////////////////////////////////////// | |
| // uncomment this macro to switch to standard memory management | |
| //#define USE_SYSTEM_MEMORY_MANAGEMENT | |
| //////////////////////////////////////////////////////////////////////// | |
| /// STRUCTURE DEFINITIONS /// | |
| //////////////////////////////////////////////////////////////////////// | |
| /* | |
| Here is an informal description of the FX data structure. | |
| (1) The sparse matrix is filled with literals, associated with | |
| cubes (row) and variables (columns). The matrix contains | |
| all the cubes of all the nodes in the network. | |
| (2) A cube is associated with | |
| (a) its literals in the matrix, | |
| (b) the output variable of the node, to which this cube belongs, | |
| (3) A variable is associated with | |
| (a) its literals in the matrix and | |
| (b) the list of cube pairs in the cover, for which it is the output | |
| (4) A cube pair is associated with two cubes and contains the counters | |
| of literals in the base and in the cubes without the base | |
| (5) A double-cube divisor is associated with list of all cube pairs | |
| that produce it and its current weight (which is updated automatically | |
| each time a new pair is added or an old pair is removed). | |
| (6) A single-cube divisor is associated the pair of variables. | |
| */ | |
| // sparse matrix | |
| typedef struct FxuMatrix Fxu_Matrix; // the sparse matrix | |
| // sparse matrix contents: cubes (rows), vars (columns), literals (entries) | |
| typedef struct FxuCube Fxu_Cube; // one cube in the sparse matrix | |
| typedef struct FxuVar Fxu_Var; // one literal in the sparse matrix | |
| typedef struct FxuLit Fxu_Lit; // one entry in the sparse matrix | |
| // double cube divisors | |
| typedef struct FxuPair Fxu_Pair; // the pair of cubes | |
| typedef struct FxuDouble Fxu_Double; // the double-cube divisor | |
| typedef struct FxuSingle Fxu_Single; // the two-literal single-cube divisor | |
| // various lists | |
| typedef struct FxuListCube Fxu_ListCube; // the list of cubes | |
| typedef struct FxuListVar Fxu_ListVar; // the list of literals | |
| typedef struct FxuListLit Fxu_ListLit; // the list of entries | |
| typedef struct FxuListPair Fxu_ListPair; // the list of pairs | |
| typedef struct FxuListDouble Fxu_ListDouble; // the list of divisors | |
| typedef struct FxuListSingle Fxu_ListSingle; // the list of single-cube divisors | |
| // various heaps | |
| typedef struct FxuHeapDouble Fxu_HeapDouble; // the heap of divisors | |
| typedef struct FxuHeapSingle Fxu_HeapSingle; // the heap of variables | |
| // various lists | |
| // the list of cubes in the sparse matrix | |
| struct FxuListCube | |
| { | |
| Fxu_Cube * pHead; | |
| Fxu_Cube * pTail; | |
| int nItems; | |
| }; | |
| // the list of literals in the sparse matrix | |
| struct FxuListVar | |
| { | |
| Fxu_Var * pHead; | |
| Fxu_Var * pTail; | |
| int nItems; | |
| }; | |
| // the list of entries in the sparse matrix | |
| struct FxuListLit | |
| { | |
| Fxu_Lit * pHead; | |
| Fxu_Lit * pTail; | |
| int nItems; | |
| }; | |
| // the list of cube pair in the sparse matrix | |
| struct FxuListPair | |
| { | |
| Fxu_Pair * pHead; | |
| Fxu_Pair * pTail; | |
| int nItems; | |
| }; | |
| // the list of divisors in the sparse matrix | |
| struct FxuListDouble | |
| { | |
| Fxu_Double * pHead; | |
| Fxu_Double * pTail; | |
| int nItems; | |
| }; | |
| // the list of divisors in the sparse matrix | |
| struct FxuListSingle | |
| { | |
| Fxu_Single * pHead; | |
| Fxu_Single * pTail; | |
| int nItems; | |
| }; | |
| // various heaps | |
| // the heap of double cube divisors by weight | |
| struct FxuHeapDouble | |
| { | |
| Fxu_Double ** pTree; | |
| int nItems; | |
| int nItemsAlloc; | |
| int i; | |
| }; | |
| // the heap of variable by their occurrence in the cubes | |
| struct FxuHeapSingle | |
| { | |
| Fxu_Single ** pTree; | |
| int nItems; | |
| int nItemsAlloc; | |
| int i; | |
| }; | |
| // sparse matrix | |
| struct FxuMatrix // ~ 30 words | |
| { | |
| // the cubes | |
| Fxu_ListCube lCubes; // the double linked list of cubes | |
| // the values (binary literals) | |
| Fxu_ListVar lVars; // the double linked list of variables | |
| Fxu_Var ** ppVars; // the array of variables | |
| // the double cube divisors | |
| Fxu_ListDouble * pTable; // the hash table of divisors | |
| int nTableSize; // the hash table size | |
| int nDivs; // the number of divisors in the table | |
| int nDivsTotal; // the number of divisors in the table | |
| Fxu_HeapDouble * pHeapDouble; // the heap of divisors by weight | |
| // the single cube divisors | |
| Fxu_ListSingle lSingles; // the linked list of single cube divisors | |
| Fxu_HeapSingle * pHeapSingle; // the heap of variables by the number of literals in the matrix | |
| int nWeightLimit;// the limit on weight of single cube divisors collected | |
| int nSingleTotal;// the total number of single cube divisors | |
| // storage for cube pairs | |
| Fxu_Pair *** pppPairs; | |
| Fxu_Pair ** ppPairs; | |
| // temporary storage for cubes | |
| Fxu_Cube * pOrderCubes; | |
| Fxu_Cube ** ppTailCubes; | |
| // temporary storage for variables | |
| Fxu_Var * pOrderVars; | |
| Fxu_Var ** ppTailVars; | |
| // temporary storage for pairs | |
| Vec_Ptr_t * vPairs; | |
| // statistics | |
| int nEntries; // the total number of entries in the sparse matrix | |
| int nDivs1; // the single cube divisors taken | |
| int nDivs2; // the double cube divisors taken | |
| int nDivs3; // the double cube divisors with complement | |
| // memory manager | |
| Extra_MmFixed_t * pMemMan; // the memory manager for all small sized entries | |
| }; | |
| // the cube in the sparse matrix | |
| struct FxuCube // 9 words | |
| { | |
| int iCube; // the number of this cube in the cover | |
| Fxu_Cube * pFirst; // the pointer to the first cube of this cover | |
| Fxu_Var * pVar; // the variable representing the output of the cover | |
| Fxu_ListLit lLits; // the row in the table | |
| Fxu_Cube * pPrev; // the previous cube | |
| Fxu_Cube * pNext; // the next cube | |
| Fxu_Cube * pOrder; // the specialized linked list of cubes | |
| }; | |
| // the variable in the sparse matrix | |
| struct FxuVar // 10 words | |
| { | |
| int iVar; // the number of this variable | |
| int nCubes; // the number of cubes assoc with this var | |
| Fxu_Cube * pFirst; // the first cube assoc with this var | |
| Fxu_Pair *** ppPairs; // the pairs of cubes assoc with this var | |
| Fxu_ListLit lLits; // the column in the table | |
| Fxu_Var * pPrev; // the previous variable | |
| Fxu_Var * pNext; // the next variable | |
| Fxu_Var * pOrder; // the specialized linked list of variables | |
| }; | |
| // the literal entry in the sparse matrix | |
| struct FxuLit // 8 words | |
| { | |
| int iVar; // the number of this variable | |
| int iCube; // the number of this cube | |
| Fxu_Cube * pCube; // the cube of this literal | |
| Fxu_Var * pVar; // the variable of this literal | |
| Fxu_Lit * pHPrev; // prev lit in the cube | |
| Fxu_Lit * pHNext; // next lit in the cube | |
| Fxu_Lit * pVPrev; // prev lit of the var | |
| Fxu_Lit * pVNext; // next lit of the var | |
| }; | |
| // the cube pair | |
| struct FxuPair // 10 words | |
| { | |
| int nLits1; // the number of literals in the two cubes | |
| int nLits2; // the number of literals in the two cubes | |
| int nBase; // the number of literals in the base | |
| Fxu_Double * pDiv; // the divisor of this pair | |
| Fxu_Cube * pCube1; // the first cube of the pair | |
| Fxu_Cube * pCube2; // the second cube of the pair | |
| int iCube1; // the first cube of the pair | |
| int iCube2; // the second cube of the pair | |
| Fxu_Pair * pDPrev; // the previous pair in the divisor | |
| Fxu_Pair * pDNext; // the next pair in the divisor | |
| }; | |
| // the double cube divisor | |
| struct FxuDouble // 10 words | |
| { | |
| int Num; // the unique number of this divisor | |
| int HNum; // the heap number of this divisor | |
| int Weight; // the weight of this divisor | |
| unsigned Key; // the hash key of this divisor | |
| Fxu_ListPair lPairs; // the pairs of cubes, which produce this divisor | |
| Fxu_Double * pPrev; // the previous divisor in the table | |
| Fxu_Double * pNext; // the next divisor in the table | |
| Fxu_Double * pOrder; // the specialized linked list of divisors | |
| }; | |
| // the single cube divisor | |
| struct FxuSingle // 7 words | |
| { | |
| int Num; // the unique number of this divisor | |
| 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 DEFINITIONS /// | |
| //////////////////////////////////////////////////////////////////////// | |
| // 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 && (((pPair) = (pCube)->pVar->ppPairs[(pCube)->iCube][i]), 1);\ | |
| i++ )\ | |
| if ( pPair == NULL ) {} else | |
| // 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 macros | |
| extern 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 *)ABC_ALLOC( char, (Size) * sizeof(Type) )) | |
| #define MEM_FREE_FXU( Manager, Type, Size, Pointer ) if ( Pointer ) { ABC_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 DEFINITIONS /// | |
| //////////////////////////////////////////////////////////////////////// | |
| /*===== 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, int fUse0, int nSingleMax ); | |
| 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 ====================================================*/ | |
| // matrix | |
| extern Fxu_Matrix * Fxu_MatrixAllocate(); | |
| extern void Fxu_MatrixDelete( Fxu_Matrix * p ); | |
| // double-cube divisor | |
| extern void Fxu_MatrixAddDivisor( Fxu_Matrix * p, Fxu_Cube * pCube1, Fxu_Cube * pCube2 ); | |
| extern void Fxu_MatrixDelDivisor( Fxu_Matrix * p, Fxu_Double * pDiv ); | |
| // single-cube divisor | |
| extern void Fxu_MatrixAddSingle( Fxu_Matrix * p, Fxu_Var * pVar1, Fxu_Var * pVar2, int Weight ); | |
| // variable | |
| extern Fxu_Var * Fxu_MatrixAddVar( Fxu_Matrix * p ); | |
| // cube | |
| extern Fxu_Cube * Fxu_MatrixAddCube( Fxu_Matrix * p, Fxu_Var * pVar, int iCube ); | |
| // literal | |
| extern 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 -> cube | |
| extern void Fxu_ListMatrixAddCube( Fxu_Matrix * p, Fxu_Cube * pCube ); | |
| extern void Fxu_ListMatrixDelCube( Fxu_Matrix * p, Fxu_Cube * pCube ); | |
| // matrix -> single | |
| extern void Fxu_ListMatrixAddSingle( Fxu_Matrix * p, Fxu_Single * pSingle ); | |
| extern void Fxu_ListMatrixDelSingle( Fxu_Matrix * p, Fxu_Single * pSingle ); | |
| // table -> divisor | |
| extern 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 -> literal | |
| extern void Fxu_ListVarAddLiteral( Fxu_Var * pVar, Fxu_Lit * pLit ); | |
| extern void Fxu_ListVarDelLiteral( Fxu_Var * pVar, Fxu_Lit * pLit ); | |
| // divisor -> pair | |
| extern 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 ); | |
| ABC_NAMESPACE_HEADER_END | |
| #endif | |
| //////////////////////////////////////////////////////////////////////// | |
| /// END OF FILE /// | |
| //////////////////////////////////////////////////////////////////////// | |