| /**CFile**************************************************************** |
| |
| FileName [dauEnum.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [DAG-aware unmapping.] |
| |
| Synopsis [Enumeration of decompositions.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 20, 2005.] |
| |
| Revision [$Id: dauEnum.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "dauInt.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| char * Dau_EnumLift( char * pName, int Shift ) |
| { |
| static char pBuffer[64]; |
| char * pTemp; |
| for ( pTemp = pBuffer; *pName; pTemp++, pName++ ) |
| *pTemp = (*pName >= 'a' && *pName <= 'z') ? *pName + Shift : *pName; |
| *pTemp = 0; |
| return pBuffer; |
| } |
| char * Dau_EnumLift2( char * pName, int Shift ) |
| { |
| static char pBuffer[64]; |
| char * pTemp; |
| for ( pTemp = pBuffer; *pName; pTemp++, pName++ ) |
| *pTemp = (*pName >= 'a' && *pName <= 'z') ? *pName + Shift : *pName; |
| *pTemp = 0; |
| return pBuffer; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Dau_EnumCombineTwo( Vec_Ptr_t * vOne, int fStar, int fXor, char * pName1, char * pName2, int Shift2, int fCompl1, int fCompl2 ) |
| { |
| static char pBuffer[256]; |
| pName2 = Dau_EnumLift( pName2, Shift2 ); |
| sprintf( pBuffer, "%s%c%s%s%s%s%c", |
| fStar?"*":"", |
| fXor?'[':'(', |
| fCompl1?"!":"", pName1[0] == '*' ? pName1 + 1 : pName1, |
| fCompl2?"!":"", pName2[0] == '*' ? pName2 + 1 : pName2, |
| fXor?']':')' ); |
| // printf( "%s ", pBuffer ); |
| Vec_PtrPush( vOne, Abc_UtilStrsav(pBuffer) ); |
| } |
| void Dau_EnumCombineThree( Vec_Ptr_t * vOne, int fStar, char * pNameC, char * pName1, char * pName2, int Shift1, int Shift2, int fComplC, int fCompl1, int fCompl2 ) |
| { |
| static char pBuffer[256]; |
| pName1 = Dau_EnumLift( pName1, Shift1 ); |
| pName2 = Dau_EnumLift2( pName2, Shift2 ); |
| sprintf( pBuffer, "%s%c%s%s%s%s%s%s%c", |
| fStar?"*":"", |
| '<', |
| fComplC?"!":"", pNameC[0] == '*' ? pNameC + 1 : pNameC, |
| fCompl1?"!":"", pName1[0] == '*' ? pName1 + 1 : pName1, |
| fCompl2?"!":"", pName2[0] == '*' ? pName2 + 1 : pName2, |
| '>' ); |
| // printf( "%s ", pBuffer ); |
| Vec_PtrPush( vOne, Abc_UtilStrsav(pBuffer) ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Dau_EnumTestDump( Vec_Ptr_t * vSets, char * pFileName ) |
| { |
| FILE * pFile; |
| Vec_Ptr_t * vOne; |
| char * pName; |
| int v, k; |
| pFile = fopen( pFileName, "wb" ); |
| if ( pFile == NULL ) |
| return; |
| Vec_PtrForEachEntry( Vec_Ptr_t *, vSets, vOne, v ) |
| { |
| fprintf( pFile, "VARIABLE NUMBER %d:\n", v ); |
| Vec_PtrForEachEntry( char *, vOne, pName, k ) |
| fprintf( pFile, "%s\n", pName ); |
| } |
| fclose( pFile ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Dau_EnumTest() |
| { |
| int v, k, nVarMax = 10; |
| Vec_Ptr_t * vSets; |
| Vec_Ptr_t * vOne; |
| char * pName; |
| // 0 vars |
| vSets = Vec_PtrAlloc( 16 ); |
| Vec_PtrPush( vSets, Vec_PtrAlloc(0) ); |
| // 1 vars |
| vOne = Vec_PtrAlloc( 1 ); |
| Vec_PtrPush( vOne, Abc_UtilStrsav("*a") ); |
| Vec_PtrPush( vSets, vOne ); |
| // 2+ vars |
| for ( v = 2; v <= nVarMax; v++ ) |
| { |
| Vec_Ptr_t * vSetI, * vSetJ, * vSetK; |
| char * pNameI, * pNameJ, * pNameK; |
| int i, j, k, i1, j1, k1; |
| vOne = Vec_PtrAlloc( 100 ); |
| for ( i = 1; i < v; i++ ) |
| for ( j = i; j < v; j++ ) |
| { |
| if ( i + j != v ) |
| continue; |
| vSetI = (Vec_Ptr_t *)Vec_PtrEntry( vSets, i ); |
| vSetJ = (Vec_Ptr_t *)Vec_PtrEntry( vSets, j ); |
| Vec_PtrForEachEntry( char *, vSetI, pNameI, i1 ) |
| Vec_PtrForEachEntry( char *, vSetJ, pNameJ, j1 ) |
| { |
| // AND(a,b) |
| Dau_EnumCombineTwo( vOne, 0, 0, pNameI, pNameJ, i, 0, 0 ); |
| // AND(!a,b) |
| if ( pNameI[0] != '*' ) |
| Dau_EnumCombineTwo( vOne, 0, 0, pNameI, pNameJ, i, 1, 0 ); |
| // AND(a,!b) |
| if ( pNameJ[0] != '*' && !(i == j && i1 == j1) ) |
| Dau_EnumCombineTwo( vOne, 0, 0, pNameI, pNameJ, i, 0, 1 ); |
| // AND(!a,!b) |
| if ( pNameI[0] != '*' && pNameJ[0] != '*' ) |
| Dau_EnumCombineTwo( vOne, 0, 0, pNameI, pNameJ, i, 1, 1 ); |
| // XOR(a,b) |
| Dau_EnumCombineTwo( vOne, pNameI[0] == '*' || pNameJ[0] == '*', 1, pNameI, pNameJ, i, 0, 0 ); |
| } |
| } |
| for ( k = 1; k < v; k++ ) |
| for ( i = 1; i < v; i++ ) |
| for ( j = i; j < v; j++ ) |
| { |
| if ( k + i + j != v ) |
| continue; |
| vSetK = (Vec_Ptr_t *)Vec_PtrEntry( vSets, k ); |
| vSetI = (Vec_Ptr_t *)Vec_PtrEntry( vSets, i ); |
| vSetJ = (Vec_Ptr_t *)Vec_PtrEntry( vSets, j ); |
| Vec_PtrForEachEntry( char *, vSetK, pNameK, k1 ) |
| Vec_PtrForEachEntry( char *, vSetI, pNameI, i1 ) |
| Vec_PtrForEachEntry( char *, vSetJ, pNameJ, j1 ) |
| { |
| int fStar = pNameI[0] == '*' && pNameJ[0] == '*'; |
| |
| // MUX(c,a,b) |
| Dau_EnumCombineThree( vOne, fStar, pNameK, pNameI, pNameJ, k, k+i, 0, 0, 0 ); |
| // MUX(c,!a,b) |
| if ( pNameI[0] != '*' ) |
| Dau_EnumCombineThree( vOne, fStar, pNameK, pNameI, pNameJ, k, k+i, 0, 1, 0 ); |
| // MUX(c,a,!b) |
| if ( pNameJ[0] != '*' && !(i == j && i1 == j1) ) |
| Dau_EnumCombineThree( vOne, fStar, pNameK, pNameI, pNameJ, k, k+i, 0, 0, 1 ); |
| |
| if ( pNameK[0] != '*' && !(i == j && i1 == j1) ) |
| { |
| // MUX(!c,a,b) |
| Dau_EnumCombineThree( vOne, fStar, pNameK, pNameI, pNameJ, k, k+i, 1, 0, 0 ); |
| // MUX(!c,!a,b) |
| if ( pNameI[0] != '*' ) |
| Dau_EnumCombineThree( vOne, fStar, pNameK, pNameI, pNameJ, k, k+i, 1, 1, 0 ); |
| // MUX(!c,a,!b) |
| if ( pNameJ[0] != '*' ) |
| Dau_EnumCombineThree( vOne, fStar, pNameK, pNameI, pNameJ, k, k+i, 1, 0, 1 ); |
| } |
| } |
| } |
| Vec_PtrPush( vSets, vOne ); |
| } |
| Dau_EnumTestDump( vSets, "_npn/npn/dsd10.txt" ); |
| |
| Vec_PtrForEachEntry( Vec_Ptr_t *, vSets, vOne, v ) |
| { |
| printf( "VARIABLE NUMBER %d:\n", v ); |
| Vec_PtrForEachEntry( char *, vOne, pName, k ) |
| printf( "%s\n", pName ); |
| if ( v == 4 ) |
| break; |
| } |
| Vec_PtrForEachEntry( Vec_Ptr_t *, vSets, vOne, v ) |
| { |
| printf( "%d=%d ", v, Vec_PtrSize(vOne) ); |
| Vec_PtrFreeFree( vOne ); |
| } |
| Vec_PtrFree( vSets ); |
| printf( "\n" ); |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |