41static inline int Kit_Mux2Int(
Kit_Mux_t m ) {
union {
Kit_Mux_t x;
int y; } v; v.x = m;
return v.y; }
42static inline Kit_Mux_t Kit_Int2Mux(
int m ) {
union {
Kit_Mux_t x;
int y; } v; v.y = m;
return v.x; }
61 static unsigned uVars[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 };
63 unsigned uCof0, uCof1;
71 if ( uTruth == uVars[0] )
72 return dd->vars[nVarsAll-1];
73 if ( uTruth == ~uVars[0] )
79 uCof0 = uTruth & ~uVars[nVars-1];
80 uCof1 = uTruth & uVars[nVars-1];
81 uCof0 |= uCof0 << (1<<(nVars-1));
82 uCof1 |= uCof1 >> (1<<(nVars-1));
85 if ( uCof0 == ~uCof1 )
112 unsigned * pTruth0, * pTruth1;
115 if ( Kit_TruthIsConst0(pTruth, nVars) )
117 if ( Kit_TruthIsConst1(pTruth, nVars) )
121 pTruth1 = pTruth + Kit_TruthWordNum(nVars-1);
122 if ( Kit_TruthIsEqual( pTruth0, pTruth1, nVars - 1 ) )
124 if ( Kit_TruthIsOpposite( pTruth0, pTruth1, nVars - 1 ) )
173 if ( nNodes >= (1<<12) )
176 assert( nNodes < dd->nNodesLimit );
177 Vec_IntClear( vNodes );
178 Vec_IntPush( vNodes, 0 );
179 dd->ppNodes[0]->s = 0;
180 for ( i = 1; i < nNodes; i++ )
182 dd->ppNodes[i]->s = i;
183 Mux.v = dd->ppNodes[i]->v;
184 Mux.t = dd->ppNodes[i]->t->s;
189 Vec_IntPush( vNodes, Kit_Mux2Int(Mux) );
191 assert( Vec_IntSize(vNodes) == nNodes );
193 for ( i = 0; i < nNodes; i++ )
194 dd->ppNodes[i]->s = dd->nSignCur;
214 Vec_IntClear( vNodes );
231 unsigned * pThis, * pFan0, * pFan1;
234 assert( Vec_IntSize(vNodes) <= Vec_PtrSize(vStore) );
235 pThis = (
unsigned *)Vec_PtrEntry( vStore, 0 );
236 Kit_TruthFill( pThis, nVars );
239 Mux = Kit_Int2Mux(Entry);
240 assert( (
int)Mux.e < i && (
int)Mux.t < i && (
int)Mux.v < nVars );
241 pFan0 = (
unsigned *)Vec_PtrEntry( vStore, Mux.e );
242 pFan1 = (
unsigned *)Vec_PtrEntry( vStore, Mux.t );
243 pThis = (
unsigned *)Vec_PtrEntry( vStore, i );
248 Kit_TruthNot( pThis, pThis, nVars );
267 unsigned * pThis, * pFan0, * pFan1;
269 int i, Entry, RetValue;
276 printf(
"Kit_TruthCompose(): Internal failure!!!\n" );
282 assert( Vec_IntSize(vNodes) <= Vec_PtrSize(vStore) );
283 pThis = (
unsigned *)Vec_PtrEntry( vStore, 0 );
284 Kit_TruthFill( pThis, nVarsAll );
287 Mux = Kit_Int2Mux(Entry);
288 pFan0 = (
unsigned *)Vec_PtrEntry( vStore, Mux.e );
289 pFan1 = (
unsigned *)Vec_PtrEntry( vStore, Mux.t );
290 pThis = (
unsigned *)Vec_PtrEntry( vStore, i );
291 Kit_TruthMuxPhase( pThis, pFan0, pFan1, pInputs[nVars-1-Mux.v], nVarsAll, Mux.c );
295 Kit_TruthNot( pThis, pThis, nVarsAll );
313 unsigned * puSuppAll;
314 unsigned * pThis = NULL;
315 unsigned * pFan0, * pFan1;
316 int i, v,
Var, Entry, nSupps;
320 if ( Vec_IntSize( vMemory ) < nSupps * Vec_IntSize(vBddDir) )
321 Vec_IntGrow( vMemory, nSupps * Vec_IntSize(vBddDir) );
322 puSuppAll = (
unsigned *)Vec_IntArray( vMemory );
324 memset( puSuppAll, 0,
sizeof(
unsigned) * nSupps );
328 Mux = Kit_Int2Mux(Entry);
329 Var = nVars - 1 - Mux.v;
330 pFan0 = puSuppAll + nSupps * Mux.e;
331 pFan1 = puSuppAll + nSupps * Mux.t;
332 pThis = puSuppAll + nSupps * i;
333 for ( v = 0; v < nSupps; v++ )
334 pThis[v] = pFan0[v] | pFan1[v] | (1<<
Var);
337 pThis[2*
Var + 0] = pFan0[2*
Var + 0];
338 pThis[2*
Var + 1] = pFan1[2*
Var + 0];
341 memcpy( puSupps, pThis,
sizeof(
unsigned) * nSupps );
345 if ( Vec_IntSize( vMemory ) < nSupps * Vec_IntSize(vBddInv) )
346 Vec_IntGrow( vMemory, nSupps * Vec_IntSize(vBddInv) );
347 puSuppAll = (
unsigned *)Vec_IntArray( vMemory );
349 memset( puSuppAll, 0,
sizeof(
unsigned) * nSupps );
353 Mux = Kit_Int2Mux(Entry);
356 pFan0 = puSuppAll + nSupps * Mux.e;
357 pFan1 = puSuppAll + nSupps * Mux.t;
358 pThis = puSuppAll + nSupps * i;
359 for ( v = 0; v < nSupps; v++ )
360 pThis[v] = pFan0[v] | pFan1[v] | (1<<
Var);
363 pThis[2*
Var + 0] = pFan0[2*
Var + 0];
364 pThis[2*
Var + 1] = pFan1[2*
Var + 0];
369 puSupps[
Var] = (puSupps[
Var] & Kit_BitMask(
Var/2)) | (pThis[
Var] & ~Kit_BitMask(
Var/2));
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
CloudNode * Cloud_MakeNode(CloudManager *dd, CloudVar v, CloudNode *t, CloudNode *e)
void Cloud_Restart(CloudManager *dd)
int Cloud_DagCollect(CloudManager *dd, CloudNode *n)
int Cloud_DagSize(CloudManager *dd, CloudNode *n)
typedefABC_NAMESPACE_HEADER_START struct cloudManager CloudManager
struct cloudNode CloudNode
#define Cloud_IsComplement(p)
typedefABC_NAMESPACE_IMPL_START struct Kit_Mux_t_ Kit_Mux_t
DECLARATIONS ///.
int Kit_CreateCloud(CloudManager *dd, CloudNode *pFunc, Vec_Int_t *vNodes)
int Kit_CreateCloudFromTruth(CloudManager *dd, unsigned *pTruth, int nVars, Vec_Int_t *vNodes)
void Kit_TruthCofSupports(Vec_Int_t *vBddDir, Vec_Int_t *vBddInv, int nVars, Vec_Int_t *vMemory, unsigned *puSupps)
unsigned * Kit_TruthCompose(CloudManager *dd, unsigned *pTruth, int nVars, unsigned **pInputs, int nVarsAll, Vec_Ptr_t *vStore, Vec_Int_t *vNodes)
CloudNode * Kit_TruthToCloud5_rec(CloudManager *dd, unsigned uTruth, int nVars, int nVarsAll)
FUNCTION DEFINITIONS ///.
unsigned * Kit_CloudToTruth(Vec_Int_t *vNodes, int nVars, Vec_Ptr_t *vStore, int fInv)
CloudNode * Kit_TruthToCloud(CloudManager *dd, unsigned *pTruth, int nVars)
FUNCTION DECLARATIONS ///.
CloudNode * Kit_TruthToCloud_rec(CloudManager *dd, unsigned *pTruth, int nVars, int nVarsAll)
void Kit_TruthMuxVarPhase(unsigned *pOut, unsigned *pCof0, unsigned *pCof1, int nVars, int iVar, int fCompl0)
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.