| /**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 |
| |