75 p->nWords = Kit_TruthWordNum( pPars->
nVarsMax );
81 p->vMemory = Vec_IntStart( 8 *
p->nWords *
p->nNodesAlloc );
82 Vec_IntClear(
p->vMemory);
84 p->nTableSize = (1 <<
p->pPars->nVarsMax);
87 p->vSpots = Vec_IntAlloc( 256 );
89 p->vTruths = Vec_PtrAllocTruthTables(
p->pPars->nVarsMax );
91 p->puTemp2 =
p->puTemp1 +
p->nWords;
92 p->puTemp3 =
p->puTemp2 +
p->nWords;
93 p->puTemp4 =
p->puTemp3 +
p->nWords;
95 p->pIsfOL = &
p->IsfOL; Bdc_IsfStart(
p,
p->pIsfOL );
96 p->pIsfOR = &
p->IsfOR; Bdc_IsfStart(
p,
p->pIsfOR );
97 p->pIsfAL = &
p->IsfAL; Bdc_IsfStart(
p,
p->pIsfAL );
98 p->pIsfAR = &
p->IsfAR; Bdc_IsfStart(
p,
p->pIsfAR );
115 if (
p->pPars->fVerbose )
117 printf(
"Bi-decomposition stats: Calls = %d. Nodes = %d. Reuse = %d.\n",
118 p->numCalls,
p->numNodes,
p->numReuse );
119 printf(
"ANDs = %d. ORs = %d. Weak = %d. Muxes = %d. Memory = %.2f K\n",
120 p->numAnds,
p->numOrs,
p->numWeaks,
p->numMuxes, 4.0 * Vec_IntSize(
p->vMemory) / (1<<10) );
127 Vec_IntFree(
p->vMemory );
128 Vec_IntFree(
p->vSpots );
129 Vec_PtrFree(
p->vTruths );
153 Vec_IntClear(
p->vMemory );
156 p->nNodesNew = - 1 -
p->nVars - (vDivs? Vec_PtrSize(vDivs) : 0);
158 pNode = Bdc_FunNew(
p );
160 pNode->puFunc = (
unsigned *)Vec_IntFetch(
p->vMemory,
p->nWords);
161 Kit_TruthFill( pNode->puFunc,
p->nVars );
165 for ( i = 0; i <
p->nVars; i++ )
167 pNode = Bdc_FunNew(
p );
169 pNode->puFunc = (
unsigned *)Vec_PtrEntry(
p->vTruths, i );
170 pNode->uSupp = (1 << i);
177 pNode = Bdc_FunNew(
p );
179 pNode->puFunc = puTruth;
182 if ( i ==
p->nDivsLimit )
203 printf(
" 0 : Const 1\n" );
204 for ( i = 1; i <
p->nNodes; i++ )
206 printf(
" %d : ", i );
207 pNode =
p->pNodes + i;
212 printf(
"%s%d &", Bdc_IsComplement(pNode->pFan0)?
"-":
"", Bdc_FunId(
p,Bdc_Regular(pNode->pFan0)) );
213 printf(
" %s%d ", Bdc_IsComplement(pNode->pFan1)?
"-":
"", Bdc_FunId(
p,Bdc_Regular(pNode->pFan1)) );
218 printf(
"Root = %s%d.\n", Bdc_IsComplement(
p->pRoot)?
"-":
"", Bdc_FunId(
p,Bdc_Regular(
p->pRoot)) );
236 printf(
"%c",
'a' + Bdc_FunId(
p,pNode) - 1 );
242 if ( Bdc_IsComplement(pNode0) )
244 if ( Bdc_IsComplement(pNode0) && Bdc_Regular(pNode0)->Type !=
BDC_TYPE_PI )
247 if ( Bdc_IsComplement(pNode0) && Bdc_Regular(pNode0)->Type !=
BDC_TYPE_PI )
250 if ( Bdc_IsComplement(pNode1) )
252 if ( Bdc_IsComplement(pNode1) && Bdc_Regular(pNode1)->Type !=
BDC_TYPE_PI )
255 if ( Bdc_IsComplement(pNode1) && Bdc_Regular(pNode1)->Type !=
BDC_TYPE_PI )
266 printf(
"Constant %d", !Bdc_IsComplement(
p->pRoot) );
268 printf(
"%s%d", Bdc_IsComplement(
p->pRoot) ?
"!" :
"", Bdc_FunId(
p,pRoot)-1 );
271 if ( Bdc_IsComplement(
p->pRoot) )
274 if ( Bdc_IsComplement(
p->pRoot) )
295 assert( nVars <= p->pPars->nVarsMax );
298 p->nWords = Kit_TruthWordNum( nVars );
299 p->nNodesMax = nNodesMax;
301 if ( puCare && Kit_TruthIsConst0( puCare, nVars ) )
303 p->pRoot = Bdc_Not(
p->pNodes);
307 Bdc_IsfStart(
p, pIsf );
310 Kit_TruthAnd( pIsf->
puOn, puCare, puFunc,
p->nVars );
311 Kit_TruthSharp( pIsf->
puOff, puCare, puFunc,
p->nVars );
315 Kit_TruthCopy( pIsf->
puOn, puFunc,
p->nVars );
316 Kit_TruthNot( pIsf->
puOff, puFunc,
p->nVars );
321 p->timeTotal += Abc_Clock() - clk;
323 p->numNodes +=
p->nNodesNew;
324 if (
p->pRoot == NULL )
327 printf(
"Bdc_ManDecompose(): Internal verification failed.\n" );
345 static int Counter = 0;
346 static int Total = 0;
356 unsigned uFunc = uTruth;
362 printf(
"%5d : Nodes = %5d. Total = %8d.\n", ++Counter, RetValue, Total );
385 Bdc_ManDecompose( pManDec, (
unsigned *)pFunc, (
unsigned *)pCare, nVars, NULL, 1000 );
406 int i, iRoot = Bdc_FunId(
p,Bdc_Regular(
p->pRoot)) - 1;
408 Vec_IntPush( vRes, !Bdc_IsComplement(
p->pRoot) );
409 else if ( iRoot < p->nVars )
410 Vec_IntPush( vRes, 4 + Abc_Var2Lit(iRoot, Bdc_IsComplement(
p->pRoot)) );
413 for ( i =
p->nVars+1; i < p->nNodes; i++ )
416 int iLit0 = Abc_Var2Lit( Bdc_FunId(
p,Bdc_Regular(pNode->pFan0)) - 1, Bdc_IsComplement(pNode->pFan0) );
417 int iLit1 = Abc_Var2Lit( Bdc_FunId(
p,Bdc_Regular(pNode->pFan1)) - 1, Bdc_IsComplement(pNode->pFan1) );
419 iLit0 ^= iLit1, iLit1 ^= iLit0, iLit0 ^= iLit1;
420 Vec_IntPushTwo( vRes, 4 + iLit0, 4 + iLit1 );
422 assert( 2 + iRoot ==
p->nNodes );
423 Vec_IntPush( vRes, 4 + Abc_Var2Lit(iRoot, Bdc_IsComplement(
p->pRoot)) );
434 Bdc_ManDecompose( pManDec, (
unsigned *)pFunc, (
unsigned *)pCare, nVars, NULL, 1000 );
435 if ( pManDec->
pRoot != NULL )
439 vRes = Vec_IntAlloc( 2*nNodes + 1 );
441 assert( Vec_IntSize(vRes) == 2*nNodes + 1 );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Vec_Int_t * Bdc_ManBidecResub(word *pFunc, word *pCare, int nVars)
void Bdc_ManBidecResubInt(Bdc_Man_t *p, Vec_Int_t *vRes)
int Bdc_ManNodeNum(Bdc_Man_t *p)
ABC_NAMESPACE_IMPL_START Bdc_Fun_t * Bdc_ManFunc(Bdc_Man_t *p, int i)
DECLARATIONS ///.
Bdc_Fun_t * Bdc_FuncFanin0(Bdc_Fun_t *p)
void Bdc_FuncSetCopyInt(Bdc_Fun_t *p, int iCopy)
void Bdc_ManDecPrintSimple(Bdc_Man_t *p)
Bdc_Fun_t * Bdc_ManRoot(Bdc_Man_t *p)
void Bdc_ManDecomposeTest(unsigned uTruth, int nVars)
int Bdc_FuncCopyInt(Bdc_Fun_t *p)
void Bdc_FuncSetCopy(Bdc_Fun_t *p, void *pCopy)
int Bdc_ManBidecNodeNum(word *pFunc, word *pCare, int nVars, int fVerbose)
void Bdc_ManDecPrint(Bdc_Man_t *p)
Bdc_Fun_t * Bdc_FuncFanin1(Bdc_Fun_t *p)
void * Bdc_FuncCopy(Bdc_Fun_t *p)
void Bdc_ManFree(Bdc_Man_t *p)
int Bdc_ManAndNum(Bdc_Man_t *p)
int Bdc_ManDecompose(Bdc_Man_t *p, unsigned *puFunc, unsigned *puCare, int nVars, Vec_Ptr_t *vDivs, int nNodesMax)
void Bdc_ManPrepare(Bdc_Man_t *p, Vec_Ptr_t *vDivs)
Bdc_Man_t * Bdc_ManAlloc(Bdc_Par_t *pPars)
MACRO DEFINITIONS ///.
void Bdc_ManDecPrint_rec(Bdc_Man_t *p, Bdc_Fun_t *pNode)
int Bdc_ManNodeVerify(Bdc_Man_t *p, Bdc_Isf_t *pIsf, Bdc_Fun_t *pFunc)
Bdc_Fun_t * Bdc_ManDecompose_rec(Bdc_Man_t *p, Bdc_Isf_t *pIsf)
MACRO DEFINITIONS ///.
void Bdc_SuppMinimize(Bdc_Man_t *p, Bdc_Isf_t *pIsf)
void Bdc_TableAdd(Bdc_Man_t *p, Bdc_Fun_t *pFunc)
void Bdc_TableClear(Bdc_Man_t *p)
struct Bdc_Isf_t_ Bdc_Isf_t
typedefABC_NAMESPACE_HEADER_START struct Bdc_Fun_t_ Bdc_Fun_t
INCLUDES ///.
struct Bdc_Par_t_ Bdc_Par_t
struct Bdc_Man_t_ Bdc_Man_t
unsigned __int64 word
DECLARATIONS ///.
unsigned Kit_TruthSupport(unsigned *pTruth, int nVars)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.