blob: 3da27134e49c4e8b520e8788c6fa5a65ae1ca009 [file] [log] [blame]
/**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 ///
////////////////////////////////////////////////////////////////////////