/**CFile**************************************************************** FileName [nwkMerge.h] SystemName [ABC: Logic synthesis and verification system.] PackageName [Logic network representation.] Synopsis [External declarations.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: nwkMerge.h,v 1.1 2008/05/14 22:13:09 wudenni Exp $] ***********************************************************************/ #ifndef __NWK_MERGE_H__ #define __NWK_MERGE_H__ //////////////////////////////////////////////////////////////////////// /// INCLUDES /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// PARAMETERS /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_HEADER_START #define NWK_MAX_LIST 16 //////////////////////////////////////////////////////////////////////// /// BASIC TYPES /// //////////////////////////////////////////////////////////////////////// // the LUT merging parameters typedef struct Nwk_LMPars_t_ Nwk_LMPars_t; struct Nwk_LMPars_t_ { int nMaxLutSize; // the max LUT size for merging (N=5) int nMaxSuppSize; // the max total support size after merging (S=5) int nMaxDistance; // the max number of nodes separating LUTs int nMaxLevelDiff; // the max difference in levels int nMaxFanout; // the max number of fanouts to traverse int fUseDiffSupp; // enables the use of nodes with different support int fUseTfiTfo; // enables the use of TFO/TFO nodes as candidates int fVeryVerbose; // enables additional verbose output int fVerbose; // enables verbose output }; // edge of the graph typedef struct Nwk_Edg_t_ Nwk_Edg_t; struct Nwk_Edg_t_ { int iNode1; // the first node int iNode2; // the second node Nwk_Edg_t * pNext; // the next edge }; // vertex of the graph typedef struct Nwk_Vrt_t_ Nwk_Vrt_t; struct Nwk_Vrt_t_ { int Id; // the vertex number int iPrev; // the previous vertex in the list int iNext; // the next vertex in the list int nEdges; // the number of edges int pEdges[0]; // the array of edges }; // the connectivity graph typedef struct Nwk_Grf_t_ Nwk_Grf_t; struct Nwk_Grf_t_ { // preliminary graph representation int nObjs; // the number of objects int nVertsMax; // the upper bound on the number of vertices int nEdgeHash; // an approximate number of edges Nwk_Edg_t ** pEdgeHash; // hash table for edges Aig_MmFixed_t * pMemEdges; // memory for edges // graph representation int nEdges; // the number of edges int nVerts; // the number of vertices Nwk_Vrt_t ** pVerts; // the array of vertices Aig_MmFlex_t * pMemVerts; // memory for vertices // intermediate data int pLists1[NWK_MAX_LIST+1]; // lists of nodes with one edge int pLists2[NWK_MAX_LIST+1]; // lists of nodes with more than one edge // the results of matching Vec_Int_t * vPairs; // pairs matched in the graph // object mappings int * pMapLut2Id; // LUT numbers into vertex IDs int * pMapId2Lut; // vertex IDs into LUT numbers // other things int nMemBytes1; // memory usage in bytes int nMemBytes2; // memory usage in bytes }; //////////////////////////////////////////////////////////////////////// /// MACRO DEFINITIONS /// //////////////////////////////////////////////////////////////////////// #define Nwk_GraphForEachEdge( p, pEdge, k ) \ for ( k = 0; k < p->nEdgeHash; k++ ) \ for ( pEdge = p->pEdgeHash[k]; pEdge; pEdge = pEdge->pNext ) #define Nwk_ListForEachVertex( p, List, pVrt ) \ for ( pVrt = List? p->pVerts[List] : NULL; pVrt; \ pVrt = pVrt->iNext? p->pVerts[pVrt->iNext] : NULL ) #define Nwk_VertexForEachAdjacent( p, pVrt, pNext, k ) \ for ( k = 0; (k < pVrt->nEdges) && (((pNext) = p->pVerts[pVrt->pEdges[k]]), 1); k++ ) //////////////////////////////////////////////////////////////////////// /// INLINED FUNCTIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// ITERATORS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DECLARATIONS /// //////////////////////////////////////////////////////////////////////// /*=== nwkMerge.c ==========================================================*/ extern ABC_DLL Nwk_Grf_t * Nwk_ManGraphAlloc( int nVertsMax ); extern ABC_DLL void Nwk_ManGraphFree( Nwk_Grf_t * p ); extern ABC_DLL void Nwk_ManGraphReportMemoryUsage( Nwk_Grf_t * p ); extern ABC_DLL void Nwk_ManGraphHashEdge( Nwk_Grf_t * p, int iLut1, int iLut2 ); extern ABC_DLL void Nwk_ManGraphSolve( Nwk_Grf_t * p ); extern ABC_DLL int Nwk_ManLutMergeGraphTest( char * pFileName ); ABC_NAMESPACE_HEADER_END #endif //////////////////////////////////////////////////////////////////////// /// END OF FILE /// ////////////////////////////////////////////////////////////////////////