mirror of https://github.com/YosysHQ/abc.git
344 lines
8.9 KiB
C
344 lines
8.9 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [covMinUtil.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [Mapping into network of SOPs/ESOPs.]
|
|
|
|
Synopsis [Utilities.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - June 20, 2005.]
|
|
|
|
Revision [$Id: covMinUtil.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "covInt.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Min_CubeCreate( Vec_Str_t * vCover, Min_Cube_t * pCube, char Type )
|
|
{
|
|
int i;
|
|
assert( (int)pCube->nLits == Min_CubeCountLits(pCube) );
|
|
for ( i = 0; i < (int)pCube->nVars; i++ )
|
|
if ( Min_CubeHasBit(pCube, i*2) )
|
|
{
|
|
if ( Min_CubeHasBit(pCube, i*2+1) )
|
|
// fprintf( pFile, "-" );
|
|
Vec_StrPush( vCover, '-' );
|
|
else
|
|
// fprintf( pFile, "0" );
|
|
Vec_StrPush( vCover, '0' );
|
|
}
|
|
else
|
|
{
|
|
if ( Min_CubeHasBit(pCube, i*2+1) )
|
|
// fprintf( pFile, "1" );
|
|
Vec_StrPush( vCover, '1' );
|
|
else
|
|
// fprintf( pFile, "?" );
|
|
Vec_StrPush( vCover, '?' );
|
|
}
|
|
// fprintf( pFile, " 1\n" );
|
|
Vec_StrPush( vCover, ' ' );
|
|
Vec_StrPush( vCover, Type );
|
|
Vec_StrPush( vCover, '\n' );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Min_CoverCreate( Vec_Str_t * vCover, Min_Cube_t * pCover, char Type )
|
|
{
|
|
Min_Cube_t * pCube;
|
|
assert( pCover != NULL );
|
|
Vec_StrClear( vCover );
|
|
Min_CoverForEachCube( pCover, pCube )
|
|
Min_CubeCreate( vCover, pCube, Type );
|
|
Vec_StrPush( vCover, 0 );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Min_CubeWrite( FILE * pFile, Min_Cube_t * pCube )
|
|
{
|
|
int i;
|
|
assert( (int)pCube->nLits == Min_CubeCountLits(pCube) );
|
|
for ( i = 0; i < (int)pCube->nVars; i++ )
|
|
if ( Min_CubeHasBit(pCube, i*2) )
|
|
{
|
|
if ( Min_CubeHasBit(pCube, i*2+1) )
|
|
fprintf( pFile, "-" );
|
|
else
|
|
fprintf( pFile, "0" );
|
|
}
|
|
else
|
|
{
|
|
if ( Min_CubeHasBit(pCube, i*2+1) )
|
|
fprintf( pFile, "1" );
|
|
else
|
|
fprintf( pFile, "?" );
|
|
}
|
|
fprintf( pFile, " 1\n" );
|
|
// fprintf( pFile, " %d\n", pCube->nLits );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Min_CoverWrite( FILE * pFile, Min_Cube_t * pCover )
|
|
{
|
|
Min_Cube_t * pCube;
|
|
Min_CoverForEachCube( pCover, pCube )
|
|
Min_CubeWrite( pFile, pCube );
|
|
printf( "\n" );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Min_CoverWriteStore( FILE * pFile, Min_Man_t * p )
|
|
{
|
|
Min_Cube_t * pCube;
|
|
int i;
|
|
for ( i = 0; i <= p->nVars; i++ )
|
|
{
|
|
Min_CoverForEachCube( p->ppStore[i], pCube )
|
|
{
|
|
printf( "%2d : ", i );
|
|
if ( pCube == p->pBubble )
|
|
{
|
|
printf( "Bubble\n" );
|
|
continue;
|
|
}
|
|
Min_CubeWrite( pFile, pCube );
|
|
}
|
|
}
|
|
printf( "\n" );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Min_CoverWriteFile( Min_Cube_t * pCover, char * pName, int fEsop )
|
|
{
|
|
char Buffer[1000];
|
|
Min_Cube_t * pCube;
|
|
FILE * pFile;
|
|
int i;
|
|
sprintf( Buffer, "%s.%s", pName, fEsop? "esop" : "pla" );
|
|
for ( i = strlen(Buffer) - 1; i >= 0; i-- )
|
|
if ( Buffer[i] == '<' || Buffer[i] == '>' )
|
|
Buffer[i] = '_';
|
|
pFile = fopen( Buffer, "w" );
|
|
fprintf( pFile, "# %s cover for output %s generated by ABC on %s\n", fEsop? "ESOP":"SOP", pName, Extra_TimeStamp() );
|
|
fprintf( pFile, ".i %d\n", pCover? pCover->nVars : 0 );
|
|
fprintf( pFile, ".o %d\n", 1 );
|
|
fprintf( pFile, ".p %d\n", Min_CoverCountCubes(pCover) );
|
|
if ( fEsop ) fprintf( pFile, ".type esop\n" );
|
|
Min_CoverForEachCube( pCover, pCube )
|
|
Min_CubeWrite( pFile, pCube );
|
|
fprintf( pFile, ".e\n" );
|
|
fclose( pFile );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Min_CoverCheck( Min_Man_t * p )
|
|
{
|
|
Min_Cube_t * pCube;
|
|
int i;
|
|
for ( i = 0; i <= p->nVars; i++ )
|
|
Min_CoverForEachCube( p->ppStore[i], pCube )
|
|
assert( i == (int)pCube->nLits );
|
|
}
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Min_CubeCheck( Min_Cube_t * pCube )
|
|
{
|
|
int i;
|
|
for ( i = 0; i < (int)pCube->nVars; i++ )
|
|
if ( Min_CubeGetVar( pCube, i ) == 0 )
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Converts the cover from the sorted structure.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Min_Cube_t * Min_CoverCollect( Min_Man_t * p, int nSuppSize )
|
|
{
|
|
Min_Cube_t * pCov = NULL, ** ppTail = &pCov;
|
|
Min_Cube_t * pCube, * pCube2;
|
|
int i;
|
|
for ( i = 0; i <= nSuppSize; i++ )
|
|
{
|
|
Min_CoverForEachCubeSafe( p->ppStore[i], pCube, pCube2 )
|
|
{
|
|
assert( i == (int)pCube->nLits );
|
|
*ppTail = pCube;
|
|
ppTail = &pCube->pNext;
|
|
assert( pCube->uData[0] ); // not a bubble
|
|
}
|
|
}
|
|
*ppTail = NULL;
|
|
return pCov;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Sorts the cover in the increasing number of literals.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Min_CoverExpand( Min_Man_t * p, Min_Cube_t * pCover )
|
|
{
|
|
Min_Cube_t * pCube, * pCube2;
|
|
Min_ManClean( p, p->nVars );
|
|
Min_CoverForEachCubeSafe( pCover, pCube, pCube2 )
|
|
{
|
|
pCube->pNext = p->ppStore[pCube->nLits];
|
|
p->ppStore[pCube->nLits] = pCube;
|
|
p->nCubes++;
|
|
}
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Sorts the cover in the increasing number of literals.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Min_CoverSuppVarNum( Min_Man_t * p, Min_Cube_t * pCover )
|
|
{
|
|
Min_Cube_t * pCube;
|
|
int i, Counter;
|
|
if ( pCover == NULL )
|
|
return 0;
|
|
// clean the cube
|
|
for ( i = 0; i < (int)pCover->nWords; i++ )
|
|
p->pTemp->uData[i] = ~((unsigned)0);
|
|
// add the bit data
|
|
Min_CoverForEachCube( pCover, pCube )
|
|
for ( i = 0; i < (int)pCover->nWords; i++ )
|
|
p->pTemp->uData[i] &= pCube->uData[i];
|
|
// count the vars
|
|
Counter = 0;
|
|
for ( i = 0; i < (int)pCover->nVars; i++ )
|
|
Counter += ( Min_CubeGetVar(p->pTemp, i) != 3 );
|
|
return Counter;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|