/**Function************************************************************* Synopsis [Checks existence of weak OR-bidecomposition.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Bdc_DecomposeWeakOr( Bdc_Man_t * p, Bdc_Isf_t * pIsf, Bdc_Isf_t * pIsfL, Bdc_Isf_t * pIsfR ) { int v, VarCost, VarBest, Cost, VarCostBest = 0; for ( v = 0; v < p->nVars; v++ ) { Kit_TruthExistNew( p->puTemp1, pIsf->puOff, p->nVars, v ); // if ( (Q & !bdd_exist( R, VarSetXa )) != bddfalse ) // Exist = Cudd_bddExistAbstract( dd, pF->R, Var ); Cudd_Ref( Exist ); // if ( Cudd_bddIteConstant( dd, pF->Q, Cudd_Not(Exist), b0 ) != b0 ) if ( !Kit_TruthIsImply( pIsf->puOn, p->puTemp1, p->nVars ) ) { // measure the cost of this variable // VarCost = bdd_satcountset( bdd_forall( Q, VarSetXa ), VarCube ); // Univ = Cudd_bddUnivAbstract( dd, pF->Q, Var ); Cudd_Ref( Univ ); // VarCost = Kit_TruthCountOnes( Univ, p->nVars ); // Cudd_RecursiveDeref( dd, Univ ); Kit_TruthForallNew( p->puTemp2, pIsf->puOn, p->nVars, v ); VarCost = Kit_TruthCountOnes( p->puTemp2, p->nVars ); if ( VarCost == 0 ) VarCost = 1; if ( VarCostBest < VarCost ) { VarCostBest = VarCost; VarBest = v; } } } // derive the components for weak-bi-decomposition if the variable is found if ( VarCostBest ) { // funQLeftRes = Q & bdd_exist( R, setRightORweak ); // Temp = Cudd_bddExistAbstract( dd, pF->R, VarBest ); Cudd_Ref( Temp ); // pL->Q = Cudd_bddAnd( dd, pF->Q, Temp ); Cudd_Ref( pL->Q ); // Cudd_RecursiveDeref( dd, Temp ); Kit_TruthExistNew( p->puTemp1, pIsf->puOff, p->nVars, VarBest ); Kit_TruthAnd( pIsfL->puOn, pIsf->puOn, p->puTemp1, p->nVars ); // pL->R = pF->R; Cudd_Ref( pL->R ); // pL->V = VarBest; Cudd_Ref( pL->V ); Kit_TruthCopy( pIsfL->puOff, pIsf->puOff, p->nVars ); pIsfL->Var = VarBest; // assert( pL->Q != b0 ); // assert( pL->R != b0 ); // assert( Cudd_bddIteConstant( dd, pL->Q, pL->R, b0 ) == b0 ); // express cost in percents of the covered boolean space Cost = VarCostBest * BDC_SCALE / (1<<p->nVars); if ( Cost == 0 ) Cost = 1; return Cost; } return 0; }
/**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Abc_NtkPrintMeasures( unsigned * pTruth, int nVars ) { unsigned uCofs[10][32]; int i, k, nOnes; // total pairs nOnes = Kit_TruthCountOnes( uCofs[0], nVars ); printf( "Total = %d.\n", nOnes * ((1 << nVars) - nOnes) ); // print measures for individual variables for ( i = 0; i < nVars; i++ ) { Kit_TruthUniqueNew( uCofs[0], pTruth, nVars, i ); nOnes = Kit_TruthCountOnes( uCofs[0], nVars ); printf( "%7d ", nOnes ); } printf( "\n" ); // consider pairs for ( i = 0; i < nVars; i++ ) for ( k = 0; k < nVars; k++ ) { if ( i == k ) { printf( " " ); continue; } Kit_TruthCofactor0New( uCofs[0], pTruth, nVars, i ); Kit_TruthCofactor1New( uCofs[1], pTruth, nVars, i ); Kit_TruthCofactor0New( uCofs[2], uCofs[0], nVars, k ); // 00 Kit_TruthCofactor1New( uCofs[3], uCofs[0], nVars, k ); // 01 Kit_TruthCofactor0New( uCofs[4], uCofs[1], nVars, k ); // 10 Kit_TruthCofactor1New( uCofs[5], uCofs[1], nVars, k ); // 11 Kit_TruthAndPhase( uCofs[6], uCofs[2], uCofs[5], nVars, 0, 1 ); // 00 & 11' Kit_TruthAndPhase( uCofs[7], uCofs[2], uCofs[5], nVars, 1, 0 ); // 00' & 11 Kit_TruthAndPhase( uCofs[8], uCofs[3], uCofs[4], nVars, 0, 1 ); // 01 & 10' Kit_TruthAndPhase( uCofs[9], uCofs[3], uCofs[4], nVars, 1, 0 ); // 01' & 10 nOnes = Kit_TruthCountOnes( uCofs[6], nVars ) + Kit_TruthCountOnes( uCofs[7], nVars ) + Kit_TruthCountOnes( uCofs[8], nVars ) + Kit_TruthCountOnes( uCofs[9], nVars ); printf( "%7d ", nOnes ); if ( k == nVars - 1 ) printf( "\n" ); } printf( "\n" ); }
ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Abc_NtkPrintMeasures( unsigned * pTruth, int nVars ) { unsigned uCofs[10][32]; int i, k, nOnes; // total pairs nOnes = Kit_TruthCountOnes( uCofs[0], nVars ); printf( "Total = %d.\n", nOnes * ((1 << nVars) - nOnes) ); // print measures for individual variables for ( i = 0; i < nVars; i++ ) { Kit_TruthUniqueNew( uCofs[0], pTruth, nVars, i ); nOnes = Kit_TruthCountOnes( uCofs[0], nVars ); printf( "%7d ", nOnes ); } printf( "\n" ); // consider pairs for ( i = 0; i < nVars; i++ ) for ( k = 0; k < nVars; k++ ) { if ( i == k ) { printf( " " ); continue; } Kit_TruthCofactor0New( uCofs[0], pTruth, nVars, i ); Kit_TruthCofactor1New( uCofs[1], pTruth, nVars, i ); Kit_TruthCofactor0New( uCofs[2], uCofs[0], nVars, k ); // 00 Kit_TruthCofactor1New( uCofs[3], uCofs[0], nVars, k ); // 01 Kit_TruthCofactor0New( uCofs[4], uCofs[1], nVars, k ); // 10 Kit_TruthCofactor1New( uCofs[5], uCofs[1], nVars, k ); // 11 Kit_TruthAndPhase( uCofs[6], uCofs[2], uCofs[5], nVars, 0, 1 ); // 00 & 11' Kit_TruthAndPhase( uCofs[7], uCofs[2], uCofs[5], nVars, 1, 0 ); // 00' & 11 Kit_TruthAndPhase( uCofs[8], uCofs[3], uCofs[4], nVars, 0, 1 ); // 01 & 10' Kit_TruthAndPhase( uCofs[9], uCofs[3], uCofs[4], nVars, 1, 0 ); // 01' & 10 nOnes = Kit_TruthCountOnes( uCofs[6], nVars ) + Kit_TruthCountOnes( uCofs[7], nVars ) + Kit_TruthCountOnes( uCofs[8], nVars ) + Kit_TruthCountOnes( uCofs[9], nVars ); printf( "%7d ", nOnes ); if ( k == nVars - 1 ) printf( "\n" ); } printf( "\n" ); }