36typedef struct Mv_Man_t_ Mv_Man_t;
42 DdNode * bValues[15][4];
43 DdNode * bValueDcs[15][4];
47static void Abc_MvDecompose( Mv_Man_t *
p );
48static void Abc_MvPrintStats( Mv_Man_t *
p );
49static void Abc_MvRead( Mv_Man_t *
p );
50static void Abc_MvDeref( Mv_Man_t *
p );
51static DdNode * Abc_MvReadCube( DdManager * dd,
char * pLine,
int nVars );
68void Abc_MvExperiment()
73 memset(
p, 0,
sizeof(Mv_Man_t) );
74 p->dd = Cudd_Init( 32, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
79 Abc_MvPrintStats(
p );
102void Abc_MvPrintStats( Mv_Man_t *
p )
105 for ( i = 0; i < 15; i++ )
107 printf(
"%2d : ", i );
108 printf(
"%3d (%2d) ", Cudd_DagSize(
p->bFuncs[i])-1, Cudd_SupportSize(
p->dd,
p->bFuncs[i]) );
109 for ( v = 0; v < 4; v++ )
110 printf(
"%d = %3d (%2d) ", v, Cudd_DagSize(
p->bValues[i][v])-1, Cudd_SupportSize(
p->dd,
p->bValues[i][v]) );
126DdNode * Abc_MvReadCube( DdManager * dd,
char * pLine,
int nVars )
128 DdNode * bCube, * bVar, * bTemp;
130 bCube = Cudd_ReadOne(dd); Cudd_Ref( bCube );
131 for ( i = 0; i < nVars; i++ )
133 if ( pLine[i] ==
'-' )
135 else if ( pLine[i] ==
'0' )
136 bVar = Cudd_Not( Cudd_bddIthVar(dd, 29-i) );
137 else if ( pLine[i] ==
'1' )
138 bVar = Cudd_bddIthVar(dd, 29-i);
140 bCube = Cudd_bddAnd( dd, bTemp = bCube, bVar ); Cudd_Ref( bCube );
141 Cudd_RecursiveDeref( dd, bTemp );
158void Abc_MvRead( Mv_Man_t *
p )
161 char Buffer[1000], * pLine;
162 DdNode * bCube, * bTemp, * bProd, * bVar0, * bVar1, * bCubeSum;
166 bCubeSum = Cudd_ReadLogicZero(
p->dd); Cudd_Ref( bCubeSum );
169 for ( i = 0; i < 15; i++ )
170 for ( v = 0; v < 4; v++ )
172 p->bValues[i][v] = Cudd_ReadLogicZero(
p->dd); Cudd_Ref(
p->bValues[i][v] );
173 p->bValueDcs[i][v] = Cudd_ReadLogicZero(
p->dd); Cudd_Ref(
p->bValueDcs[i][v] );
177 pFile = fopen(
"input.pla",
"r" );
178 while ( fgets( Buffer, 1000, pFile ) )
180 if ( Buffer[0] ==
'#' )
182 if ( Buffer[0] ==
'.' )
184 if ( Buffer[1] ==
'e' )
190 bCube = Abc_MvReadCube(
p->dd, Buffer, 18 ); Cudd_Ref( bCube );
194 for ( i = 0; i < 15; i++ )
196 if ( pLine[2*i] ==
'-' && pLine[2*i+1] ==
'-' )
198 for ( v = 0; v < 4; v++ )
200 p->bValueDcs[i][v] = Cudd_bddOr(
p->dd, bTemp =
p->bValueDcs[i][v], bCube ); Cudd_Ref(
p->bValueDcs[i][v] );
201 Cudd_RecursiveDeref(
p->dd, bTemp );
205 else if ( pLine[2*i] ==
'0' && pLine[2*i+1] ==
'0' )
207 else if ( pLine[2*i] ==
'1' && pLine[2*i+1] ==
'0' )
209 else if ( pLine[2*i] ==
'0' && pLine[2*i+1] ==
'1' )
211 else if ( pLine[2*i] ==
'1' && pLine[2*i+1] ==
'1' )
215 p->bValues[i][v] = Cudd_bddOr(
p->dd, bTemp =
p->bValues[i][v], bCube ); Cudd_Ref(
p->bValues[i][v] );
216 Cudd_RecursiveDeref(
p->dd, bTemp );
220 bCubeSum = Cudd_bddOr(
p->dd, bTemp = bCubeSum, bCube ); Cudd_Ref( bCubeSum );
221 Cudd_RecursiveDeref(
p->dd, bTemp );
222 Cudd_RecursiveDeref(
p->dd, bCube );
226 for ( i = 0; i < 15; i++ )
227 for ( v = 0; v < 4; v++ )
229 if (
p->bValues[i][v] == Cudd_Not(Cudd_ReadOne(
p->dd)) )
231 p->bValues[i][v] = Cudd_bddOr(
p->dd, bTemp =
p->bValues[i][v],
p->bValueDcs[i][v] ); Cudd_Ref(
p->bValues[i][v] );
232 Cudd_RecursiveDeref(
p->dd, bTemp );
233 p->bValues[i][v] = Cudd_bddOr(
p->dd, bTemp =
p->bValues[i][v], Cudd_Not(bCubeSum) ); Cudd_Ref(
p->bValues[i][v] );
234 Cudd_RecursiveDeref(
p->dd, bTemp );
236 printf(
"Domain = %5.2f %%.\n", 100.0*Cudd_CountMinterm(
p->dd, bCubeSum, 32)/Cudd_CountMinterm(
p->dd, Cudd_ReadOne(
p->dd), 32) );
237 Cudd_RecursiveDeref(
p->dd, bCubeSum );
240 for ( i = 0; i < 15; i++ )
242 p->bFuncs[i] = Cudd_ReadLogicZero(
p->dd); Cudd_Ref(
p->bFuncs[i] );
243 for ( v = 0; v < 4; v++ )
245 bVar0 = Cudd_NotCond( Cudd_bddIthVar(
p->dd, 30), ((v & 1) == 0) );
246 bVar1 = Cudd_NotCond( Cudd_bddIthVar(
p->dd, 31), ((v & 2) == 0) );
247 bCube = Cudd_bddAnd(
p->dd, bVar0, bVar1 ); Cudd_Ref( bCube );
248 bProd = Cudd_bddAnd(
p->dd,
p->bValues[i][v], bCube ); Cudd_Ref( bProd );
249 Cudd_RecursiveDeref(
p->dd, bCube );
251 p->bFuncs[i] = Cudd_bddOr(
p->dd, bTemp =
p->bFuncs[i], bProd ); Cudd_Ref(
p->bFuncs[i] );
252 Cudd_RecursiveDeref(
p->dd, bTemp );
253 Cudd_RecursiveDeref(
p->dd, bProd );
269void Abc_MvDeref( Mv_Man_t *
p )
272 for ( i = 0; i < 15; i++ )
273 for ( v = 0; v < 4; v++ )
275 Cudd_RecursiveDeref(
p->dd,
p->bValues[i][v] );
276 Cudd_RecursiveDeref(
p->dd,
p->bValueDcs[i][v] );
278 for ( i = 0; i < 15; i++ )
279 Cudd_RecursiveDeref(
p->dd,
p->bFuncs[i] );
295void Abc_MvDecompose( Mv_Man_t *
p )
297 DdNode * bCofs[16], * bVarCube1, * bVarCube2, * bVarCube, * bCube, * bVar0, * bVar1;
298 int k, i1, i2, v1, v2;
300 bVar0 = Cudd_bddIthVar(
p->dd, 30);
301 bVar1 = Cudd_bddIthVar(
p->dd, 31);
302 bCube = Cudd_bddAnd(
p->dd, bVar0, bVar1 ); Cudd_Ref( bCube );
304 for ( k = 0; k <
p->nFuncs; k++ )
306 printf(
"FUNCTION %d\n", k );
307 for ( i1 = 0; i1 <
p->nFuncs; i1++ )
308 for ( i2 = i1+1; i2 <
p->nFuncs; i2++ )
312 for ( v1 = 0; v1 < 4; v1++ )
314 bVar0 = Cudd_NotCond( Cudd_bddIthVar(
p->dd, 29-2*i1 ), ((v1 & 1) == 0) );
315 bVar1 = Cudd_NotCond( Cudd_bddIthVar(
p->dd, 29-2*i1-1), ((v1 & 2) == 0) );
316 bVarCube1 = Cudd_bddAnd(
p->dd, bVar0, bVar1 ); Cudd_Ref( bVarCube1 );
317 for ( v2 = 0; v2 < 4; v2++ )
319 bVar0 = Cudd_NotCond( Cudd_bddIthVar(
p->dd, 29-2*i2 ), ((v2 & 1) == 0) );
320 bVar1 = Cudd_NotCond( Cudd_bddIthVar(
p->dd, 29-2*i2-1), ((v2 & 2) == 0) );
321 bVarCube2 = Cudd_bddAnd(
p->dd, bVar0, bVar1 ); Cudd_Ref( bVarCube2 );
322 bVarCube = Cudd_bddAnd(
p->dd, bVarCube1, bVarCube2 ); Cudd_Ref( bVarCube );
323 bCofs[v1 * 4 + v2] = Cudd_Cofactor(
p->dd,
p->bFuncs[k], bVarCube ); Cudd_Ref( bCofs[v1 * 4 + v2] );
324 Cudd_RecursiveDeref(
p->dd, bVarCube );
325 Cudd_RecursiveDeref(
p->dd, bVarCube2 );
327 Cudd_RecursiveDeref(
p->dd, bVarCube1 );
354 vCofs = Vec_PtrAlloc( 16 );
355 for ( v1 = 0; v1 < 4; v1++ )
356 for ( v2 = 0; v2 < 4; v2++ )
357 Vec_PtrPushUnique( vCofs, bCofs[v1 * 4 + v2] );
358 printf(
"%d ", Vec_PtrSize(vCofs) );
359 Vec_PtrFree( vCofs );
362 for ( v1 = 0; v1 < 4; v1++ )
363 for ( v2 = 0; v2 < 4; v2++ )
364 Cudd_RecursiveDeref(
p->dd, bCofs[v1 * 4 + v2] );
371 Cudd_RecursiveDeref(
p->dd, bCube );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.