예제 #1
0
/**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" );
}
예제 #3
0
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" );
}