49 if (
p->pPars->fVerbose )
55 for ( v = 0; v <
p->nVars; v++ )
57 if ( (pIsf->
uSupp & (1 << v)) == 0 )
61 if ( !Kit_TruthIsDisjoint(
p->puTemp1,
p->puTemp2,
p->nVars ) )
66 Kit_TruthCopy( pIsf->
puOn,
p->puTemp1,
p->nVars );
67 Kit_TruthCopy( pIsf->
puOff,
p->puTemp2,
p->nVars );
70 pIsf->
uSupp &= ~(1 << v);
72 if (
p->pPars->fVerbose )
73 p->timeSupps += Abc_Clock() - clk;
91 if (
p->pPars->fVerbose )
95 for ( v = 0; v <
p->nVars; v++ )
106 pIsf->
uSupp |= (1 << v);
108 if (
p->pPars->fVerbose )
109 p->timeSupps += Abc_Clock() - clk;
125 unsigned * puTruth =
p->puTemp1;
127 if ( Bdc_IsComplement(pFunc0) )
128 Kit_TruthNot( puTruth, Bdc_Regular(pFunc0)->puFunc,
p->nVars );
130 Kit_TruthCopy( puTruth, pFunc0->puFunc,
p->nVars );
145 Kit_TruthSharp( pIsfR->
puOn, pIsf->
puOn, puTruth,
p->nVars );
150 return Kit_TruthIsConst0(pIsfR->
puOn,
p->nVars);
165 Kit_TruthAnd( pIsfR->
puOff, pIsf->
puOff, puTruth,
p->nVars );
169 assert( !Kit_TruthIsConst0(pIsfR->
puOn,
p->nVars) );
170 return Kit_TruthIsConst0(pIsfR->
puOff,
p->nVars);
186static inline int Bdc_DecomposeGetCost(
Bdc_Man_t *
p,
int nLeftVars,
int nRightVars )
191 if ( nLeftVars >= nRightVars )
192 return BDC_SCALE * (
p->nVars * nRightVars + nLeftVars);
194 return BDC_SCALE * (
p->nVars * nLeftVars + nRightVars);
211 int v, nVars, Beg, End;
218 for ( v = 0; v <
p->nVars; v++ )
219 if ( pIsf->
uSupp & (1 << v) )
223 for ( Beg = 0; Beg < nVars; Beg++ )
226 for ( End = nVars - 1; End > Beg; End-- )
229 if ( Kit_TruthIsDisjoint3(pIsf->
puOn,
p->puTemp1,
p->puTemp2,
p->nVars) )
231 pIsfL->
uUniq = (1 << pVars[Beg]);
232 pIsfR->
uUniq = (1 << pVars[End]);
255 int Cost, VarCostBest = 0;
257 for ( v = 0; v <
p->nVars; v++ )
259 if ( (pIsf->
uSupp & (1 << v)) == 0 )
266 if ( !Kit_TruthIsImply( pIsf->
puOn,
p->puTemp1,
p->nVars ) )
275 VarCost = Kit_TruthCountOnes(
p->puTemp2,
p->nVars );
278 if ( VarCostBest < VarCost )
280 VarCostBest = VarCost;
295 Kit_TruthAnd( pIsfL->
puOn, pIsf->
puOn,
p->puTemp1,
p->nVars );
299 Kit_TruthCopy( pIsfL->
puOff, pIsf->
puOff,
p->nVars );
300 pIsfL->
uUniq = (1 << VarBest);
309 Cost = VarCostBest *
BDC_SCALE / (1<<
p->nVars);
330 unsigned uSupportRem;
331 int v, nLeftVars = 1, nRightVars = 1;
333 Bdc_IsfStart(
p, pIsfL );
334 Bdc_IsfStart(
p, pIsfR );
345 uSupportRem = pIsf->
uSupp & ~pIsfL->uUniq & ~pIsfR->uUniq;
346 for ( v = 0; v <
p->nVars; v++ )
348 if ( (uSupportRem & (1 << v)) == 0 )
353 if ( nLeftVars < nRightVars )
357 if ( Kit_TruthIsDisjoint3(pIsf->
puOn,
p->puTemp3,
p->puTemp2,
p->nVars) )
360 pIsfL->
uUniq |= (1 << v);
362 Kit_TruthCopy(
p->puTemp1,
p->puTemp3,
p->nVars );
365 else if ( Kit_TruthIsDisjoint3(pIsf->
puOn,
p->puTemp4,
p->puTemp1,
p->nVars) )
368 pIsfR->
uUniq |= (1 << v);
370 Kit_TruthCopy(
p->puTemp2,
p->puTemp4,
p->nVars );
376 if ( Kit_TruthIsDisjoint3(pIsf->
puOn,
p->puTemp4,
p->puTemp1,
p->nVars) )
379 pIsfR->
uUniq |= (1 << v);
381 Kit_TruthCopy(
p->puTemp2,
p->puTemp4,
p->nVars );
384 else if ( Kit_TruthIsDisjoint3(pIsf->
puOn,
p->puTemp3,
p->puTemp2,
p->nVars) )
387 pIsfL->
uUniq |= (1 << v);
389 Kit_TruthCopy(
p->puTemp1,
p->puTemp3,
p->nVars );
403 Kit_TruthAnd( pIsfL->
puOn, pIsf->
puOn,
p->puTemp1,
p->nVars );
405 Kit_TruthCopy( pIsfL->
puOff,
p->puTemp2,
p->nVars );
410 assert( !Kit_TruthIsConst0(pIsfL->
puOn,
p->nVars) );
420 Kit_TruthAnd( pIsfR->
puOn, pIsf->
puOn,
p->puTemp2,
p->nVars );
422 Kit_TruthCopy( pIsfR->
puOff,
p->puTemp1,
p->nVars );
424 assert( !Kit_TruthIsConst0(pIsfR->
puOn,
p->nVars) );
430 return Bdc_DecomposeGetCost(
p, nLeftVars, nRightVars );
446 int WeightOr, WeightAnd, WeightOrL, WeightOrR, WeightAndL, WeightAndR;
448 Bdc_IsfClean(
p->pIsfOL );
449 Bdc_IsfClean(
p->pIsfOR );
450 Bdc_IsfClean(
p->pIsfAL );
451 Bdc_IsfClean(
p->pIsfAR );
460 Bdc_IsfNot(
p->pIsfAL );
461 Bdc_IsfNot(
p->pIsfAR );
464 if ( WeightOr == 0 && WeightAnd == 0 )
466 Bdc_IsfCopy( pIsfL,
p->pIsfOL );
467 Bdc_IsfCopy( pIsfR,
p->pIsfOR );
471 assert( WeightOr || WeightAnd );
472 WeightOrL = WeightOrR = 0;
475 if (
p->pIsfOL->uUniq )
480 if (
p->pIsfOR->uUniq )
486 WeightAndL = WeightAndR = 0;
489 if (
p->pIsfAL->uUniq )
494 if (
p->pIsfAR->uUniq )
502 if ( WeightOrL + WeightOrR > WeightAndL + WeightAndR )
506 Bdc_IsfCopy( pIsfL,
p->pIsfOL );
507 Bdc_IsfCopy( pIsfR,
p->pIsfOR );
510 if ( WeightOrL + WeightOrR < WeightAndL + WeightAndR )
514 Bdc_IsfCopy( pIsfL,
p->pIsfAL );
515 Bdc_IsfCopy( pIsfR,
p->pIsfAR );
520 if ( WeightOr > WeightAnd )
525 Bdc_IsfCopy( pIsfL,
p->pIsfOL );
526 Bdc_IsfCopy( pIsfR,
p->pIsfOR );
532 Bdc_IsfCopy( pIsfL,
p->pIsfAL );
533 Bdc_IsfCopy( pIsfR,
p->pIsfAR );
550 int Var, VarMin, nSuppMin, nSuppCur;
551 unsigned uSupp0, uSupp1;
553 if (
p->pPars->fVerbose )
559 if ( (pIsf->
uSupp & (1 <<
Var)) == 0 )
567 nSuppCur = Kit_WordCountOnes(uSupp0) + Kit_WordCountOnes(uSupp1);
568 if ( nSuppMin > nSuppCur )
584 if (
p->pPars->fVerbose )
585 p->timeMuxes += Abc_Clock() - clk;
602 unsigned * puTruth =
p->puTemp1;
603 if ( Bdc_IsComplement(pFunc) )
604 Kit_TruthNot( puTruth, Bdc_Regular(pFunc)->puFunc,
p->nVars );
606 Kit_TruthCopy( puTruth, pFunc->puFunc,
p->nVars );
624 pFunc = Bdc_FunNew(
p );
628 pFunc->pFan0 = pFunc0;
629 pFunc->pFan1 = pFunc1;
630 pFunc->puFunc = (
unsigned *)Vec_IntFetch(
p->vMemory,
p->nWords);
632 if ( Bdc_IsComplement(pFunc0) )
633 Kit_TruthNot(
p->puTemp1, Bdc_Regular(pFunc0)->puFunc,
p->nVars );
635 Kit_TruthCopy(
p->puTemp1, pFunc0->puFunc,
p->nVars );
637 if ( Bdc_IsComplement(pFunc1) )
638 Kit_TruthNot(
p->puTemp2, Bdc_Regular(pFunc1)->puFunc,
p->nVars );
640 Kit_TruthCopy(
p->puTemp2, pFunc1->puFunc,
p->nVars );
644 Kit_TruthAnd( pFunc->puFunc,
p->puTemp1,
p->puTemp2,
p->nVars );
648 Kit_TruthOr( pFunc->puFunc,
p->puTemp1,
p->puTemp2,
p->nVars );
651 pFunc->pFan0 = Bdc_Not(pFunc->pFan0);
652 pFunc->pFan1 = Bdc_Not(pFunc->pFan1);
653 Kit_TruthNot( pFunc->puFunc, pFunc->puFunc,
p->nVars );
654 pFunc = Bdc_Not(pFunc);
659 Bdc_Regular(pFunc)->uSupp =
Kit_TruthSupport( Bdc_Regular(pFunc)->puFunc,
p->nVars );
692 if (
p->pPars->fVerbose )
695 if (
p->pPars->fVerbose )
696 p->timeCache += Abc_Clock() - clk;
700 if (
p->pPars->fVerbose )
703 if (
p->pPars->fVerbose )
704 p->timeCheck += Abc_Clock() - clk;
707 if (
p->pPars->fVerbose )
710 if (
p->pPars->fVerbose )
711 p->timeMuxes += Abc_Clock() - clk;
715 if ( pFunc0 == NULL || pFunc1 == NULL )
717 pFunc = Bdc_FunWithId(
p, iVar + 1 );
720 if ( pFunc0 == NULL || pFunc1 == NULL )
727 if ( pFunc0 == NULL )
737 if ( pFunc1 == NULL )
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int Bdc_ManNodeVerify(Bdc_Man_t *p, Bdc_Isf_t *pIsf, Bdc_Fun_t *pFunc)
int Bdc_DecomposeFindInitialVarSet(Bdc_Man_t *p, Bdc_Isf_t *pIsf, Bdc_Isf_t *pIsfL, Bdc_Isf_t *pIsfR)
int Bdc_DecomposeUpdateRight(Bdc_Man_t *p, Bdc_Isf_t *pIsf, Bdc_Isf_t *pIsfL, Bdc_Isf_t *pIsfR, Bdc_Fun_t *pFunc0, Bdc_Type_t Type)
Bdc_Fun_t * Bdc_ManDecompose_rec(Bdc_Man_t *p, Bdc_Isf_t *pIsf)
MACRO DEFINITIONS ///.
int Bdc_DecomposeStepMux(Bdc_Man_t *p, Bdc_Isf_t *pIsf, Bdc_Isf_t *pIsfL, Bdc_Isf_t *pIsfR)
Bdc_Fun_t * Bdc_ManCreateGate(Bdc_Man_t *p, Bdc_Fun_t *pFunc0, Bdc_Fun_t *pFunc1, Bdc_Type_t Type)
ABC_NAMESPACE_IMPL_START void Bdc_SuppMinimize2(Bdc_Man_t *p, Bdc_Isf_t *pIsf)
DECLARATIONS ///.
void Bdc_SuppMinimize(Bdc_Man_t *p, Bdc_Isf_t *pIsf)
int Bdc_DecomposeOr(Bdc_Man_t *p, Bdc_Isf_t *pIsf, Bdc_Isf_t *pIsfL, Bdc_Isf_t *pIsfR)
Bdc_Type_t Bdc_DecomposeStep(Bdc_Man_t *p, Bdc_Isf_t *pIsf, Bdc_Isf_t *pIsfL, Bdc_Isf_t *pIsfR)
int Bdc_DecomposeWeakOr(Bdc_Man_t *p, Bdc_Isf_t *pIsf, Bdc_Isf_t *pIsfL, Bdc_Isf_t *pIsfR)
void Bdc_TableAdd(Bdc_Man_t *p, Bdc_Fun_t *pFunc)
int Bdc_TableCheckContainment(Bdc_Man_t *p, Bdc_Isf_t *pIsf, unsigned *puTruth)
DECLARATIONS ///.
struct Bdc_Isf_t_ Bdc_Isf_t
Bdc_Type_t
BASIC TYPES ///.
#define BDC_SCALE
INCLUDES ///.
Bdc_Fun_t * Bdc_TableLookup(Bdc_Man_t *p, Bdc_Isf_t *pIsf)
typedefABC_NAMESPACE_HEADER_START struct Bdc_Fun_t_ Bdc_Fun_t
INCLUDES ///.
struct Bdc_Man_t_ Bdc_Man_t
unsigned Kit_TruthSupport(unsigned *pTruth, int nVars)
void Kit_TruthCofactor1New(unsigned *pOut, unsigned *pIn, int nVars, int iVar)
void Kit_TruthCofactor0New(unsigned *pOut, unsigned *pIn, int nVars, int iVar)
void Kit_TruthForallNew(unsigned *pRes, unsigned *pTruth, int nVars, int iVar)
int Kit_TruthVarIsVacuous(unsigned *pOnset, unsigned *pOffset, int nVars, int iVar)
int Kit_TruthVarInSupport(unsigned *pTruth, int nVars, int iVar)
void Kit_TruthExistSet(unsigned *pRes, unsigned *pTruth, int nVars, unsigned uMask)
void Kit_TruthExist(unsigned *pTruth, int nVars, int iVar)
void Kit_TruthExistNew(unsigned *pRes, unsigned *pTruth, int nVars, int iVar)