/**CFile**************************************************************** FileName [ifSat.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [FPGA mapping based on priority cuts.] Synopsis [SAT-based evaluation.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - November 21, 2006.] Revision [$Id: ifSat.c,v 1.00 2006/11/21 00:00:00 alanmi Exp $] ***********************************************************************/ #include "if.h" #include "sat/bsat/satSolver.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Builds SAT instance for the given structure.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void * If_ManSatBuildXY( int nLutSize ) { int nMintsL = (1 << nLutSize); int nMintsF = (1 << (2 * nLutSize - 1)); int nVars = 2 * nMintsL + nMintsF; int iVarP0 = 0; // LUT0 parameters (total nMintsL) int iVarP1 = nMintsL; // LUT1 parameters (total nMintsL) int m,iVarM = 2 * nMintsL; // MUX vars (total nMintsF) sat_solver * p = sat_solver_new(); sat_solver_setnvars( p, nVars ); for ( m = 0; m < nMintsF; m++ ) sat_solver_add_mux( p, iVarP0 + m % nMintsL, iVarP1 + 2 * (m / nMintsL) + 1, iVarP1 + 2 * (m / nMintsL), iVarM + m ); return p; } void * If_ManSatBuildXYZ( int nLutSize ) { int nMintsL = (1 << nLutSize); int nMintsF = (1 << (3 * nLutSize - 2)); int nVars = 3 * nMintsL + nMintsF; int iVarP0 = 0; // LUT0 parameters (total nMintsL) int iVarP1 = nMintsL; // LUT1 parameters (total nMintsL) int iVarP2 = 2 * nMintsL; // LUT2 parameters (total nMintsL) int m,iVarM = 3 * nMintsL; // MUX vars (total nMintsF) sat_solver * p = sat_solver_new(); sat_solver_setnvars( p, nVars ); for ( m = 0; m < nMintsF; m++ ) sat_solver_add_mux41( p, iVarP0 + m % nMintsL, iVarP1 + (m >> nLutSize) % nMintsL, iVarP2 + 4 * (m >> (2 * nLutSize)) + 0, iVarP2 + 4 * (m >> (2 * nLutSize)) + 1, iVarP2 + 4 * (m >> (2 * nLutSize)) + 2, iVarP2 + 4 * (m >> (2 * nLutSize)) + 3, iVarM + m ); return p; } void If_ManSatUnbuild( void * p ) { if ( p ) sat_solver_delete( (sat_solver *)p ); } /**Function************************************************************* Synopsis [Verification for 6-input function.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static word If_ManSat6ComposeLut4( int t, word f[4], int k ) { int m, v, nMints = (1 << k); word c, r = 0; assert( k <= 4 ); for ( m = 0; m < nMints; m++ ) { if ( !((t >> m) & 1) ) continue; c = ~(word)0; for ( v = 0; v < k; v++ ) c &= ((m >> v) & 1) ? f[v] : ~f[v]; r |= c; } return r; } word If_ManSat6Truth( word uBound, word uFree, int * pBSet, int nBSet, int * pSSet, int nSSet, int * pFSet, int nFSet ) { word r, q, f[4]; int i, k = 0; // bound set vars for ( i = 0; i < nSSet; i++ ) f[k++] = s_Truths6[pSSet[i]]; for ( i = 0; i < nBSet; i++ ) f[k++] = s_Truths6[pBSet[i]]; q = If_ManSat6ComposeLut4( (int)(uBound & 0xffff), f, k ); // free set vars k = 0; f[k++] = q; for ( i = 0; i < nSSet; i++ ) f[k++] = s_Truths6[pSSet[i]]; for ( i = 0; i < nFSet; i++ ) f[k++] = s_Truths6[pFSet[i]]; r = If_ManSat6ComposeLut4( (int)(uFree & 0xffff), f, k ); return r; } /**Function************************************************************* Synopsis [Returns config string for the given truth table.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int If_ManSatCheckXY( void * pSat, int nLutSize, word * pTruth, int nVars, unsigned uSet, word * pTBound, word * pTFree, Vec_Int_t * vLits ) { sat_solver * p = (sat_solver *)pSat; int iBSet, nBSet = 0, pBSet[IF_MAX_FUNC_LUTSIZE]; int iSSet, nSSet = 0, pSSet[IF_MAX_FUNC_LUTSIZE]; int iFSet, nFSet = 0, pFSet[IF_MAX_FUNC_LUTSIZE]; int nMintsL = (1 << nLutSize); int nMintsF = (1 << (2 * nLutSize - 1)); int v, Value, m, mNew, nMintsFNew, nMintsLNew; word Res; // collect variable sets Dau_DecSortSet( uSet, nVars, &nBSet, &nSSet, &nFSet ); assert( nBSet + nSSet + nFSet == nVars ); // check variable bounds assert( nSSet + nBSet <= nLutSize ); assert( nLutSize + nSSet + nFSet <= 2*nLutSize - 1 ); nMintsFNew = (1 << (nLutSize + nSSet + nFSet)); // remap minterms Vec_IntFill( vLits, nMintsF, -1 ); for ( m = 0; m < (1 << nVars); m++ ) { mNew = iBSet = iSSet = iFSet = 0; for ( v = 0; v < nVars; v++ ) { Value = ((uSet >> (v << 1)) & 3); if ( Value == 0 ) // FS { if ( ((m >> v) & 1) ) mNew |= 1 << (nLutSize + nSSet + iFSet), pFSet[iFSet] = v; iFSet++; } else if ( Value == 1 ) // BS { if ( ((m >> v) & 1) ) mNew |= 1 << (nSSet + iBSet), pBSet[iBSet] = v; iBSet++; } else if ( Value == 3 ) // SS { if ( ((m >> v) & 1) ) { mNew |= 1 << iSSet; mNew |= 1 << (nLutSize + iSSet); pSSet[iSSet] = v; } iSSet++; } else assert( Value == 0 ); } assert( iBSet == nBSet && iFSet == nFSet ); assert( Vec_IntEntry(vLits, mNew) == -1 ); Vec_IntWriteEntry( vLits, mNew, Abc_TtGetBit(pTruth, m) ); } // find assumptions v = 0; Vec_IntForEachEntry( vLits, Value, m ) { // printf( "%d", (Value >= 0) ? Value : 2 ); if ( Value >= 0 ) Vec_IntWriteEntry( vLits, v++, Abc_Var2Lit(2 * nMintsL + m, !Value) ); } Vec_IntShrink( vLits, v ); // printf( " %d\n", Vec_IntSize(vLits) ); // run SAT solver Value = sat_solver_solve( p, Vec_IntArray(vLits), Vec_IntArray(vLits) + Vec_IntSize(vLits), 0, 0, 0, 0 ); if ( Value != l_True ) return 0; if ( pTBound && pTFree ) { // collect config assert( nSSet + nBSet <= nLutSize ); *pTBound = 0; nMintsLNew = (1 << (nSSet + nBSet)); for ( m = 0; m < nMintsLNew; m++ ) if ( sat_solver_var_value(p, m) ) Abc_TtSetBit( pTBound, m ); *pTBound = Abc_Tt6Stretch( *pTBound, nSSet + nBSet ); // collect configs assert( nSSet + nFSet + 1 <= nLutSize ); *pTFree = 0; nMintsLNew = (1 << (1 + nSSet + nFSet)); for ( m = 0; m < nMintsLNew; m++ ) if ( sat_solver_var_value(p, nMintsL+m) ) Abc_TtSetBit( pTFree, m ); *pTFree = Abc_Tt6Stretch( *pTFree, 1 + nSSet + nFSet ); if ( nVars != 6 || nLutSize != 4 ) return 1; // verify the result Res = If_ManSat6Truth( *pTBound, *pTFree, pBSet, nBSet, pSSet, nSSet, pFSet, nFSet ); if ( pTruth[0] != Res ) { Dau_DsdPrintFromTruth( pTruth, nVars ); Dau_DsdPrintFromTruth( &Res, nVars ); Dau_DsdPrintFromTruth( pTBound, nSSet+nBSet ); Dau_DsdPrintFromTruth( pTFree, nSSet+nFSet+1 ); printf( "Verification failed!\n" ); } } return 1; } /**Function************************************************************* Synopsis [Returns config string for the given truth table.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ unsigned If_ManSatCheckXYall_int( void * pSat, int nLutSize, word * pTruth, int nVars, Vec_Int_t * vLits ) { unsigned uSet = 0; int nTotal = 2 * nLutSize - 1; int nShared = nTotal - nVars; int i[6], s[4]; assert( nLutSize >= 2 && nLutSize <= 6 ); assert( nLutSize < nVars && nVars <= nTotal ); assert( nShared >= 0 && nShared < nLutSize - 1 ); if ( nLutSize == 2 ) { assert( nShared == 0 ); for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])); if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet, NULL, NULL, vLits) ) return uSet; } } else if ( nLutSize == 3 ) { for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])); if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet, NULL, NULL, vLits) ) return uSet; } if ( nShared < 1 ) return 0; for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])); for ( s[0] = 0; s[0] < nLutSize; s[0]++ ) if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])), NULL, NULL, vLits) ) return uSet | (3 << (2*i[s[0]])); } } else if ( nLutSize == 4 ) { for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])); if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet, NULL, NULL, vLits) ) return uSet; } if ( nShared < 1 ) return 0; for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])); for ( s[0] = 0; s[0] < nLutSize; s[0]++ ) if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])), NULL, NULL, vLits) ) return uSet | (3 << (2*i[s[0]])); } if ( nShared < 2 ) return 0; for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])); { for ( s[0] = 0; s[0] < nLutSize; s[0]++ ) for ( s[1] = s[0]+1; s[1] < nLutSize; s[1]++ ) if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])), NULL, NULL, vLits) ) return uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])); } } } else if ( nLutSize == 5 ) { for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ ) for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])); if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet, NULL, NULL, vLits) ) return uSet; } if ( nShared < 1 ) return 0; for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ ) for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])); for ( s[0] = 0; s[0] < nLutSize; s[0]++ ) if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])), NULL, NULL, vLits) ) return uSet | (3 << (2*i[s[0]])); } if ( nShared < 2 ) return 0; for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ ) for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])); for ( s[0] = 0; s[0] < nLutSize; s[0]++ ) for ( s[1] = s[0]+1; s[1] < nLutSize; s[1]++ ) if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])), NULL, NULL, vLits) ) return uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])); } if ( nShared < 3 ) return 0; for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ ) for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])); for ( s[0] = 0; s[0] < nLutSize; s[0]++ ) for ( s[1] = s[0]+1; s[1] < nLutSize; s[1]++ ) for ( s[2] = s[1]+1; s[2] < nLutSize; s[2]++ ) if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])) | (3 << (2*i[s[2]])), NULL, NULL, vLits) ) return uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])) | (3 << (2*i[s[2]])); } } else if ( nLutSize == 6 ) { for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ ) for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ ) for ( i[5] = i[4]+1; i[5] < nVars; i[5]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])) | (1 << (2*i[5])); if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet, NULL, NULL, vLits) ) return uSet; } if ( nShared < 1 ) return 0; for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ ) for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ ) for ( i[5] = i[4]+1; i[5] < nVars; i[5]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])) | (1 << (2*i[5])); for ( s[0] = 0; s[0] < nLutSize; s[0]++ ) if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])), NULL, NULL, vLits) ) return uSet | (3 << (2*i[s[0]])); } if ( nShared < 2 ) return 0; for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ ) for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ ) for ( i[5] = i[4]+1; i[5] < nVars; i[5]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])) | (1 << (2*i[5])); for ( s[0] = 0; s[0] < nLutSize; s[0]++ ) for ( s[1] = s[0]+1; s[1] < nLutSize; s[1]++ ) if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])), NULL, NULL, vLits) ) return uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])); } if ( nShared < 3 ) return 0; for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ ) for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ ) for ( i[5] = i[4]+1; i[5] < nVars; i[5]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])) | (1 << (2*i[5])); for ( s[0] = 0; s[0] < nLutSize; s[0]++ ) for ( s[1] = s[0]+1; s[1] < nLutSize; s[1]++ ) for ( s[2] = s[1]+1; s[2] < nLutSize; s[2]++ ) if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])) | (3 << (2*i[s[2]])), NULL, NULL, vLits) ) return uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])) | (3 << (2*i[s[2]])); } if ( nShared < 4 ) return 0; for ( i[0] = 0; i[0] < nVars; i[0]++ ) for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ ) for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ ) for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ ) for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ ) for ( i[5] = i[4]+1; i[5] < nVars; i[5]++ ) { uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])) | (1 << (2*i[5])); for ( s[0] = 0; s[0] < nLutSize; s[0]++ ) for ( s[1] = s[0]+1; s[1] < nLutSize; s[1]++ ) for ( s[2] = s[1]+1; s[2] < nLutSize; s[2]++ ) for ( s[3] = s[1]+1; s[3] < nLutSize; s[3]++ ) if ( If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])) | (3 << (2*i[s[2]])) | (3 << (2*i[s[3]])), NULL, NULL, vLits) ) return uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])) | (3 << (2*i[s[2]])) | (3 << (2*i[s[3]])); } } return 0; } unsigned If_ManSatCheckXYall( void * pSat, int nLutSize, word * pTruth, int nVars, Vec_Int_t * vLits ) { unsigned uSet = If_ManSatCheckXYall_int( pSat, nLutSize, pTruth, nVars, vLits ); // Dau_DecPrintSet( uSet, nVars, 1 ); return uSet; } /**Function************************************************************* Synopsis [Test procedure.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void If_ManSatTest2() { int nVars = 6; int nLutSize = 4; sat_solver * p = (sat_solver *)If_ManSatBuildXY( nLutSize ); // char * pDsd = "(abcdefg)"; // char * pDsd = "([a!bc]d!e)"; char * pDsd = "0123456789ABCDEF{abcdef}"; word * pTruth = Dau_DsdToTruth( pDsd, nVars ); word uBound, uFree; Vec_Int_t * vLits = Vec_IntAlloc( 100 ); // unsigned uSet = (1 << 0) | (1 << 2) | (1 << 4) | (1 << 6); // unsigned uSet = (3 << 0) | (1 << 2) | (1 << 8) | (1 << 4); unsigned uSet = (1 << 0) | (3 << 2) | (1 << 4) | (1 << 6); int RetValue = If_ManSatCheckXY( p, nLutSize, pTruth, nVars, uSet, &uBound, &uFree, vLits ); assert( RetValue ); // Abc_TtPrintBinary( pTruth, nVars ); // Abc_TtPrintBinary( &uBound, nLutSize ); // Abc_TtPrintBinary( &uFree, nLutSize ); Dau_DsdPrintFromTruth( pTruth, nVars ); Dau_DsdPrintFromTruth( &uBound, nLutSize ); Dau_DsdPrintFromTruth( &uFree, nLutSize ); sat_solver_delete(p); Vec_IntFree( vLits ); } void If_ManSatTest3() { int nVars = 6; int nLutSize = 4; sat_solver * p = (sat_solver *)If_ManSatBuildXY( nLutSize ); // char * pDsd = "(abcdefg)"; // char * pDsd = "([a!bc]d!e)"; char * pDsd = "0123456789ABCDEF{abcdef}"; word * pTruth = Dau_DsdToTruth( pDsd, nVars ); Vec_Int_t * vLits = Vec_IntAlloc( 100 ); // unsigned uSet = (1 << 0) | (1 << 2) | (1 << 4) | (1 << 6); // unsigned uSet = (3 << 0) | (1 << 2) | (1 << 8) | (1 << 4); unsigned uSet = (1 << 0) | (3 << 2) | (1 << 4) | (1 << 6); uSet = If_ManSatCheckXYall( p, nLutSize, pTruth, nVars, vLits ); Dau_DecPrintSet( uSet, nVars, 1 ); sat_solver_delete(p); Vec_IntFree( vLits ); } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END