83 DdNode * bFunc0, * bFunc1, * bFunc;
int Id, nOuts = 0;
84 Vec_Ptr_t * vFuncs = Vec_PtrStart( Mini_AigNodeNum(
p) );
85 Vec_PtrWriteEntry( vFuncs, 0, Cudd_ReadLogicZero(dd) ), Cudd_Ref(Cudd_ReadLogicZero(dd));
87 Vec_PtrWriteEntry( vFuncs, Id, Cudd_bddIthVar(dd,Id-1) ), Cudd_Ref(Cudd_bddIthVar(dd,Id-1));
89 bFunc0 = Cudd_NotCond( (DdNode *)Vec_PtrEntry(vFuncs, Mini_AigLit2Var(Mini_AigNodeFanin0(
p, Id))), Mini_AigLitIsCompl(Mini_AigNodeFanin0(
p, Id)) );
90 bFunc1 = Cudd_NotCond( (DdNode *)Vec_PtrEntry(vFuncs, Mini_AigLit2Var(Mini_AigNodeFanin1(
p, Id))), Mini_AigLitIsCompl(Mini_AigNodeFanin1(
p, Id)) );
91 bFunc = Cudd_bddAndLimit( dd, bFunc0, bFunc1, nBddLimit );
98 Vec_PtrWriteEntry( vFuncs, Id, bFunc );
101 bFunc0 = Cudd_NotCond( (DdNode *)Vec_PtrEntry(vFuncs, Mini_AigLit2Var(Mini_AigNodeFanin0(
p, Id))), Mini_AigLitIsCompl(Mini_AigNodeFanin0(
p, Id)) );
102 Vec_PtrWriteEntry( vFuncs, Id, bFunc0 ); Cudd_Ref( bFunc0 );
105 bFunc = (DdNode *)Vec_PtrEntry(vFuncs, Id);
106 Cudd_RecursiveDeref( dd, bFunc );
107 Vec_PtrWriteEntry( vFuncs, Id, NULL );
110 Vec_PtrWriteEntry( vFuncs, nOuts++, Vec_PtrEntry(vFuncs, Id) );
111 Vec_PtrShrink( vFuncs, nOuts );
128 Vec_Ptr_t * vRes = Vec_PtrAlloc( 1 << nVars );
129 Vec_Ptr_t * vRes2 = Vec_PtrAlloc( 1 << nVars );
130 Vec_PtrPush( vRes, bFunc );
131 int v, Level = Cudd_ReadPerm( dd, Cudd_NodeReadIndex(bFunc) );
132 for ( v = 0; v < dd->size; v++ )
133 printf(
"%2d : perm = %d invperm = %d\n", v, dd->perm[v], dd->invperm[v] );
134 for ( v = 0; v < nVars; v++ )
136 int i, LevelCur = Level + v;
137 Vec_PtrClear( vRes2 );
140 int LevelTemp = Cudd_ReadPerm( dd, Cudd_NodeReadIndex(bTemp) );
141 if ( LevelTemp == LevelCur ) {
142 Vec_PtrPush( vRes2, Cudd_NotCond(Cudd_E(bTemp), Cudd_IsComplement(bTemp)) );
143 Vec_PtrPush( vRes2, Cudd_NotCond(Cudd_T(bTemp), Cudd_IsComplement(bTemp)) );
145 else if ( LevelTemp > LevelCur ) {
146 Vec_PtrPush( vRes2, bTemp );
147 Vec_PtrPush( vRes2, bTemp );
156 Vec_PtrFree( vRes2 );
157 assert( Vec_PtrSize(vRes) == (1 << nVars) );
162 assert( Vec_PtrSize(vFuncs) <= 256 );
163 char * pRes =
ABC_CALLOC(
char, Vec_PtrSize(vFuncs)+1 );
164 void * pTemp, * pStore[256] = {Vec_PtrEntry(vFuncs, 0)};
165 int i, k, nStore = 1; pRes[0] =
'a';
167 for ( k = 0; k < nStore; k++ )
168 if ( pStore[k] == pTemp )
171 pStore[nStore++] = pTemp;
172 pRes[i] =
'a' + (char)k;
192 for ( i = 0; i < 256; i++ ) {
193 int nOnes = __builtin_popcount(i);
194 char * pTemp = pRes + 256*i;
195 for ( k = 0; k < 256; k++ ) {
196 int iMask = 0, Counts[2] = {nOnes, 0};
197 for ( b = 0; b < 8; Counts[(i >> b++)&1]++ )
199 iMask |= 1 << Counts[(i >> b)&1];
200 pTemp[iMask] = (char)k;
201 assert( Counts[1] == nOnes );
204 for ( i = 0; i < 16; i++, printf(
"\n") )
205 for ( printf(
"%x : ", i), k = 0; k < 16; k++ )
206 printf(
"%x=%x ", k, (
int)pRes[i*256+k] );
231 if ( nDiffs == 0 || iStart == nVars )
233 int v, m, nMints = 1 << nVars;
234 for ( v = iStart; v < nVars; v++ ) {
235 int MaskThis = Mask & ~(1 << v);
236 int nStep = 1 << (nMaskVars - 1);
238 for ( m = 0; m < nMints; m += nStep ) {
239 int MyuCur =
Abc_NtkDecPatCount( m, nStep, 1 << nDiffs, pDecPat, pPermInfo+256*MaskThis );
240 MyuMax = Abc_MaxInt( MyuMax, MyuCur );
242 if ( MyuMax > (1 << nDiffs) )
244 if ( MyuMax <= (1 << nRails) )
254 int BoundSet = ~(~0 << nVars);
255 int Myu =
Abc_NtkDecPatCount( 0, 1 << nVars, 256, pDecPat, pPermInfo + 256*BoundSet );
256 int Log2 = Abc_Base2Log( Myu );
257 if ( Log2 <= nRails )
312 char ** ppNamesCi = (
char **)Vec_PtrArray( vNamesCi );
313 char ** ppNamesCo = (
char **)Vec_PtrArray( vNamesCo );
314 Dsd_TreePrint( stdout, pManDsd, ppNamesCi, ppNamesCo, 0, -1, 0 );
315 Vec_PtrFreeFree( vNamesCi );
316 Vec_PtrFreeFree( vNamesCo );
322 DdManager * dd = Cudd_Init( Mini_AigPiNum(
p), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
323 if ( fReorder ) Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT );
325 if ( fReorder ) Cudd_AutodynDisable( dd );
326 if ( vFuncs == NULL ) {
330 DdNode * bNode = (DdNode *)Vec_PtrEntry(vFuncs, 0);
word * Abc_LutCascade(Mini_Aig_t *p, int nLutSize, int nStages, int nRails, int nIters, int fVerbose)
void Dsd_TreePrint(FILE *pFile, Dsd_Manager_t *dMan, char *pInputNames[], char *pOutputNames[], int fShortNames, int Output, int OffSet)