/**CFile**************************************************************** FileName [cutList.h] SystemName [ABC: Logic synthesis and verification system.] PackageName [Implementation of layered listed list of cuts.] Synopsis [External declarations.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: cutList.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #ifndef ABC__opt__cut__cutList_h #define ABC__opt__cut__cutList_h ABC_NAMESPACE_HEADER_START //////////////////////////////////////////////////////////////////////// /// INCLUDES /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// PARAMETERS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// BASIC TYPES /// //////////////////////////////////////////////////////////////////////// typedef struct Cut_ListStruct_t_ Cut_List_t; struct Cut_ListStruct_t_ { Cut_Cut_t * pHead[CUT_SIZE_MAX+1]; Cut_Cut_t ** ppTail[CUT_SIZE_MAX+1]; }; //////////////////////////////////////////////////////////////////////// /// MACRO DEFINITIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DECLARATIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Start the cut list.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void Cut_ListStart( Cut_List_t * p ) { int i; for ( i = 1; i <= CUT_SIZE_MAX; i++ ) { p->pHead[i] = 0; p->ppTail[i] = &p->pHead[i]; } } /**Function************************************************************* Synopsis [Adds one cut to the cut list.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void Cut_ListAdd( Cut_List_t * p, Cut_Cut_t * pCut ) { assert( pCut->nLeaves > 0 && pCut->nLeaves <= CUT_SIZE_MAX ); *p->ppTail[pCut->nLeaves] = pCut; p->ppTail[pCut->nLeaves] = &pCut->pNext; } /**Function************************************************************* Synopsis [Adds one cut to the cut list while preserving order.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void Cut_ListAdd2( Cut_List_t * p, Cut_Cut_t * pCut ) { extern int Cut_CutCompare( Cut_Cut_t * pCut1, Cut_Cut_t * pCut2 ); Cut_Cut_t * pTemp, ** ppSpot; assert( pCut->nLeaves > 0 && pCut->nLeaves <= CUT_SIZE_MAX ); if ( p->pHead[pCut->nLeaves] != NULL ) { ppSpot = &p->pHead[pCut->nLeaves]; for ( pTemp = p->pHead[pCut->nLeaves]; pTemp; pTemp = pTemp->pNext ) { if ( Cut_CutCompare(pCut, pTemp) < 0 ) { *ppSpot = pCut; pCut->pNext = pTemp; return; } else ppSpot = &pTemp->pNext; } } *p->ppTail[pCut->nLeaves] = pCut; p->ppTail[pCut->nLeaves] = &pCut->pNext; } /**Function************************************************************* Synopsis [Derive the super list from the linked list of cuts.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void Cut_ListDerive( Cut_List_t * p, Cut_Cut_t * pList ) { Cut_Cut_t * pPrev; int nLeaves; Cut_ListStart( p ); while ( pList != NULL ) { nLeaves = pList->nLeaves; p->pHead[nLeaves] = pList; for ( pPrev = pList, pList = pList->pNext; pList; pPrev = pList, pList = pList->pNext ) if ( nLeaves < (int)pList->nLeaves ) break; p->ppTail[nLeaves] = &pPrev->pNext; pPrev->pNext = NULL; } } /**Function************************************************************* Synopsis [Adds the second list to the first list.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void Cut_ListAddList( Cut_List_t * pOld, Cut_List_t * pNew ) { int i; for ( i = 1; i <= CUT_SIZE_MAX; i++ ) { if ( pNew->pHead[i] == NULL ) continue; *pOld->ppTail[i] = pNew->pHead[i]; pOld->ppTail[i] = pNew->ppTail[i]; } } /**Function************************************************************* Synopsis [Returns the cut list linked into one sequence of cuts.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline Cut_Cut_t * Cut_ListFinish( Cut_List_t * p ) { Cut_Cut_t * pHead = NULL, ** ppTail = &pHead; int i; for ( i = 1; i <= CUT_SIZE_MAX; i++ ) { if ( p->pHead[i] == NULL ) continue; *ppTail = p->pHead[i]; ppTail = p->ppTail[i]; } *ppTail = NULL; return pHead; } ABC_NAMESPACE_HEADER_END #endif //////////////////////////////////////////////////////////////////////// /// END OF FILE /// ////////////////////////////////////////////////////////////////////////