mirror of https://github.com/YosysHQ/abc.git
278 lines
7.2 KiB
C
278 lines
7.2 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [esopUtil.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [Cover manipulation package.]
|
|
|
|
Synopsis [Utilities.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - June 20, 2005.]
|
|
|
|
Revision [$Id: esopUtil.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "esop.h"
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Esop_CubeWrite( FILE * pFile, Esop_Cube_t * pCube )
|
|
{
|
|
int i;
|
|
assert( (int)pCube->nLits == Esop_CubeCountLits(pCube) );
|
|
for ( i = 0; i < (int)pCube->nVars; i++ )
|
|
if ( Esop_CubeHasBit(pCube, i*2) )
|
|
{
|
|
if ( Esop_CubeHasBit(pCube, i*2+1) )
|
|
fprintf( pFile, "-" );
|
|
else
|
|
fprintf( pFile, "0" );
|
|
}
|
|
else
|
|
{
|
|
if ( Esop_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 Esop_CoverWrite( FILE * pFile, Esop_Cube_t * pCover )
|
|
{
|
|
Esop_Cube_t * pCube;
|
|
Esop_CoverForEachCube( pCover, pCube )
|
|
Esop_CubeWrite( pFile, pCube );
|
|
printf( "\n" );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Esop_CoverWriteStore( FILE * pFile, Esop_Man_t * p )
|
|
{
|
|
Esop_Cube_t * pCube;
|
|
int i;
|
|
for ( i = 0; i <= p->nVars; i++ )
|
|
{
|
|
Esop_CoverForEachCube( p->ppStore[i], pCube )
|
|
{
|
|
printf( "%2d : ", i );
|
|
if ( pCube == p->pBubble )
|
|
{
|
|
printf( "Bubble\n" );
|
|
continue;
|
|
}
|
|
Esop_CubeWrite( pFile, pCube );
|
|
}
|
|
}
|
|
printf( "\n" );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Esop_CoverWriteFile( Esop_Cube_t * pCover, char * pName, int fEsop )
|
|
{
|
|
char Buffer[1000];
|
|
Esop_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\n", fEsop? "ESOP":"SOP", pName );
|
|
fprintf( pFile, ".i %d\n", pCover? pCover->nVars : 0 );
|
|
fprintf( pFile, ".o %d\n", 1 );
|
|
fprintf( pFile, ".p %d\n", Esop_CoverCountCubes(pCover) );
|
|
if ( fEsop ) fprintf( pFile, ".type esop\n" );
|
|
Esop_CoverForEachCube( pCover, pCube )
|
|
Esop_CubeWrite( pFile, pCube );
|
|
fprintf( pFile, ".e\n" );
|
|
fclose( pFile );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Esop_CoverCheck( Esop_Man_t * p )
|
|
{
|
|
Esop_Cube_t * pCube;
|
|
int i;
|
|
for ( i = 0; i <= p->nVars; i++ )
|
|
Esop_CoverForEachCube( p->ppStore[i], pCube )
|
|
assert( i == (int)pCube->nLits );
|
|
}
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Esop_CubeCheck( Esop_Cube_t * pCube )
|
|
{
|
|
int i;
|
|
for ( i = 0; i < (int)pCube->nVars; i++ )
|
|
if ( Esop_CubeGetVar( pCube, i ) == 0 )
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Converts the cover from the sorted structure.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Esop_Cube_t * Esop_CoverCollect( Esop_Man_t * p, int nSuppSize )
|
|
{
|
|
Esop_Cube_t * pCov = NULL, ** ppTail = &pCov;
|
|
Esop_Cube_t * pCube, * pCube2;
|
|
int i;
|
|
for ( i = 0; i <= nSuppSize; i++ )
|
|
{
|
|
Esop_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 Esop_CoverExpand( Esop_Man_t * p, Esop_Cube_t * pCover )
|
|
{
|
|
Esop_Cube_t * pCube, * pCube2;
|
|
Esop_ManClean( p, p->nVars );
|
|
Esop_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 Esop_CoverSuppVarNum( Esop_Man_t * p, Esop_Cube_t * pCover )
|
|
{
|
|
Esop_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
|
|
Esop_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 += ( Esop_CubeGetVar(p->pTemp, i) != 3 );
|
|
return Counter;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|