mirror of
https://github.com/YosysHQ/abc.git
synced 2026-09-07 11:11:19 +02:00
368 lines
8.9 KiB
C
368 lines
8.9 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [mvcList.c]
|
|
|
|
PackageName [MVSIS 2.0: Multi-valued logic synthesis system.]
|
|
|
|
Synopsis [Manipulating list of cubes in the cover.]
|
|
|
|
Author [MVSIS Group]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - February 1, 2003.]
|
|
|
|
Revision [$Id: mvcList.c,v 1.4 2003/04/03 06:31:50 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "mvc.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Mvc_ListAddCubeHead_( Mvc_List_t * pList, Mvc_Cube_t * pCube )
|
|
{
|
|
if ( pList->pHead == NULL )
|
|
{
|
|
Mvc_CubeSetNext( pCube, NULL );
|
|
pList->pHead = pCube;
|
|
pList->pTail = pCube;
|
|
}
|
|
else
|
|
{
|
|
Mvc_CubeSetNext( pCube, pList->pHead );
|
|
pList->pHead = pCube;
|
|
}
|
|
pList->nItems++;
|
|
}
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Mvc_ListAddCubeTail_( Mvc_List_t * pList, Mvc_Cube_t * pCube )
|
|
{
|
|
if ( pList->pHead == NULL )
|
|
pList->pHead = pCube;
|
|
else
|
|
Mvc_CubeSetNext( pList->pTail, pCube );
|
|
pList->pTail = pCube;
|
|
Mvc_CubeSetNext( pCube, NULL );
|
|
pList->nItems++;
|
|
}
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Mvc_ListDeleteCube_( Mvc_List_t * pList, Mvc_Cube_t * pPrev, Mvc_Cube_t * pCube )
|
|
{
|
|
if ( pPrev == NULL ) // deleting the head cube
|
|
pList->pHead = Mvc_CubeReadNext(pCube);
|
|
else
|
|
pPrev->pNext = pCube->pNext;
|
|
if ( pList->pTail == pCube ) // deleting the tail cube
|
|
{
|
|
assert( Mvc_CubeReadNext(pCube) == NULL );
|
|
pList->pTail = pPrev;
|
|
}
|
|
pList->nItems--;
|
|
}
|
|
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Mvc_CoverAddCubeHead_( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube )
|
|
{
|
|
Mvc_List_t * pList = &pCover->lCubes;
|
|
if ( pList->pHead == NULL )
|
|
{
|
|
Mvc_CubeSetNext( pCube, NULL );
|
|
pList->pHead = pCube;
|
|
pList->pTail = pCube;
|
|
}
|
|
else
|
|
{
|
|
Mvc_CubeSetNext( pCube, pList->pHead );
|
|
pList->pHead = pCube;
|
|
}
|
|
pList->nItems++;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Mvc_CoverAddCubeTail_( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube )
|
|
{
|
|
Mvc_List_t * pList = &pCover->lCubes;
|
|
|
|
if ( pList->pHead == NULL )
|
|
pList->pHead = pCube;
|
|
else
|
|
Mvc_CubeSetNext( pList->pTail, pCube );
|
|
pList->pTail = pCube;
|
|
Mvc_CubeSetNext( pCube, NULL );
|
|
pList->nItems++;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Mvc_CoverDeleteCube_( Mvc_Cover_t * pCover, Mvc_Cube_t * pPrev, Mvc_Cube_t * pCube )
|
|
{
|
|
Mvc_List_t * pList = &pCover->lCubes;
|
|
|
|
if ( pPrev == NULL ) // deleting the head cube
|
|
pList->pHead = Mvc_CubeReadNext(pCube);
|
|
else
|
|
pPrev->pNext = pCube->pNext;
|
|
if ( pList->pTail == pCube ) // deleting the tail cube
|
|
{
|
|
assert( Mvc_CubeReadNext(pCube) == NULL );
|
|
pList->pTail = pPrev;
|
|
}
|
|
pList->nItems--;
|
|
}
|
|
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Mvc_CoverAddDupCubeHead( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube )
|
|
{
|
|
Mvc_Cube_t * pCubeNew;
|
|
pCubeNew = Mvc_CubeAlloc( pCover );
|
|
Mvc_CubeBitCopy( pCubeNew, pCube );
|
|
Mvc_CoverAddCubeHead( pCover, pCubeNew );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Mvc_CoverAddDupCubeTail( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube )
|
|
{
|
|
Mvc_Cube_t * pCubeNew;
|
|
// copy the cube as part of this cover
|
|
pCubeNew = Mvc_CubeAlloc( pCover );
|
|
Mvc_CubeBitCopy( pCubeNew, pCube );
|
|
// clean the last bits of the new cube
|
|
// pCubeNew->pData[pCubeNew->iLast] &= (BITS_FULL >> pCubeNew->nUnused);
|
|
// add the cube at the end
|
|
Mvc_CoverAddCubeTail( pCover, pCubeNew );
|
|
}
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Mvc_CoverAddLiteralsOfCube( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube )
|
|
{
|
|
// int iBit, Value;
|
|
// assert( pCover->pLits );
|
|
// Mvc_CubeForEachBit( pCover, pCube, iBit, Value )
|
|
// if ( Value )
|
|
// pCover->pLits[iBit] += Value;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Mvc_CoverDeleteLiteralsOfCube( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube )
|
|
{
|
|
// int iBit, Value;
|
|
// assert( pCover->pLits );
|
|
// Mvc_CubeForEachBit( pCover, pCube, iBit, Value )
|
|
// if ( Value )
|
|
// pCover->pLits[iBit] -= Value;
|
|
}
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Transfers the cubes from the list into the array.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Mvc_CoverList2Array( Mvc_Cover_t * pCover )
|
|
{
|
|
Mvc_Cube_t * pCube;
|
|
int Counter;
|
|
// resize storage if necessary
|
|
Mvc_CoverAllocateArrayCubes( pCover );
|
|
// iterate through the cubes
|
|
Counter = 0;
|
|
Mvc_CoverForEachCube( pCover, pCube )
|
|
pCover->pCubes[ Counter++ ] = pCube;
|
|
assert( Counter == Mvc_CoverReadCubeNum(pCover) );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Transfers the cubes from the array into list.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Mvc_CoverArray2List( Mvc_Cover_t * pCover )
|
|
{
|
|
Mvc_Cube_t * pCube;
|
|
int nCubes, i;
|
|
|
|
assert( pCover->pCubes );
|
|
|
|
nCubes = Mvc_CoverReadCubeNum(pCover);
|
|
if ( nCubes == 0 )
|
|
return;
|
|
if ( nCubes == 1 )
|
|
{
|
|
pCube = pCover->pCubes[0];
|
|
pCube->pNext = NULL;
|
|
pCover->lCubes.pHead = pCover->lCubes.pTail = pCube;
|
|
return;
|
|
}
|
|
// set up the first cube
|
|
pCube = pCover->pCubes[0];
|
|
pCover->lCubes.pHead = pCube;
|
|
// set up the last cube
|
|
pCube = pCover->pCubes[nCubes-1];
|
|
pCube->pNext = NULL;
|
|
pCover->lCubes.pTail = pCube;
|
|
|
|
// link all cubes starting from the first one
|
|
for ( i = 0; i < nCubes - 1; i++ )
|
|
pCover->pCubes[i]->pNext = pCover->pCubes[i+1];
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Returns the tail of the linked list given by the head.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Mvc_Cube_t * Mvc_ListGetTailFromHead( Mvc_Cube_t * pHead )
|
|
{
|
|
Mvc_Cube_t * pCube, * pTail;
|
|
for ( pTail = pCube = pHead;
|
|
pCube;
|
|
pTail = pCube, pCube = Mvc_CubeReadNext(pCube) );
|
|
return pTail;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|