ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
abcMv.c
Go to the documentation of this file.
1
20
21#include "base/abc/abc.h"
22
23#ifdef ABC_USE_CUDD
24#include "bdd/extrab/extraBdd.h"
25#endif
26
28
29
33
34#ifdef ABC_USE_CUDD
35
36typedef struct Mv_Man_t_ Mv_Man_t;
37struct Mv_Man_t_
38{
39 int nInputs; // the number of 4-valued input variables
40 int nFuncs; // the number of 4-valued functions
41 DdManager * dd; // representation of functions
42 DdNode * bValues[15][4]; // representation of i-sets
43 DdNode * bValueDcs[15][4]; // representation of i-sets don't-cares
44 DdNode * bFuncs[15]; // representation of functions
45};
46
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 );
52
56
68void Abc_MvExperiment()
69{
70 Mv_Man_t * p;
71 // get the functions
72 p = ABC_ALLOC( Mv_Man_t, 1 );
73 memset( p, 0, sizeof(Mv_Man_t) );
74 p->dd = Cudd_Init( 32, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
75 p->nFuncs = 15;
76 p->nInputs = 9;
77 Abc_MvRead( p );
78 // process the functions
79 Abc_MvPrintStats( p );
80// Cudd_ReduceHeap( p->dd, CUDD_REORDER_SYMM_SIFT, 1 );
81// Abc_MvPrintStats( p );
82 // try detecting support reducing bound set
83 Abc_MvDecompose( p );
84
85 // remove the manager
86 Abc_MvDeref( p );
87 Extra_StopManager( p->dd );
88 ABC_FREE( p );
89}
90
102void Abc_MvPrintStats( Mv_Man_t * p )
103{
104 int i, v;
105 for ( i = 0; i < 15; i++ )
106 {
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]) );
111 printf( "\n" );
112 }
113}
114
126DdNode * Abc_MvReadCube( DdManager * dd, char * pLine, int nVars )
127{
128 DdNode * bCube, * bVar, * bTemp;
129 int i;
130 bCube = Cudd_ReadOne(dd); Cudd_Ref( bCube );
131 for ( i = 0; i < nVars; i++ )
132 {
133 if ( pLine[i] == '-' )
134 continue;
135 else if ( pLine[i] == '0' ) // 0
136 bVar = Cudd_Not( Cudd_bddIthVar(dd, 29-i) );
137 else if ( pLine[i] == '1' ) // 1
138 bVar = Cudd_bddIthVar(dd, 29-i);
139 else assert(0);
140 bCube = Cudd_bddAnd( dd, bTemp = bCube, bVar ); Cudd_Ref( bCube );
141 Cudd_RecursiveDeref( dd, bTemp );
142 }
143 Cudd_Deref( bCube );
144 return bCube;
145}
146
158void Abc_MvRead( Mv_Man_t * p )
159{
160 FILE * pFile;
161 char Buffer[1000], * pLine;
162 DdNode * bCube, * bTemp, * bProd, * bVar0, * bVar1, * bCubeSum;
163 int i, v;
164
165 // start the cube
166 bCubeSum = Cudd_ReadLogicZero(p->dd); Cudd_Ref( bCubeSum );
167
168 // start the values
169 for ( i = 0; i < 15; i++ )
170 for ( v = 0; v < 4; v++ )
171 {
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] );
174 }
175
176 // read the file
177 pFile = fopen( "input.pla", "r" );
178 while ( fgets( Buffer, 1000, pFile ) )
179 {
180 if ( Buffer[0] == '#' )
181 continue;
182 if ( Buffer[0] == '.' )
183 {
184 if ( Buffer[1] == 'e' )
185 break;
186 continue;
187 }
188
189 // get the cube
190 bCube = Abc_MvReadCube( p->dd, Buffer, 18 ); Cudd_Ref( bCube );
191
192 // add it to the values of the output functions
193 pLine = Buffer + 19;
194 for ( i = 0; i < 15; i++ )
195 {
196 if ( pLine[2*i] == '-' && pLine[2*i+1] == '-' )
197 {
198 for ( v = 0; v < 4; v++ )
199 {
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 );
202 }
203 continue;
204 }
205 else if ( pLine[2*i] == '0' && pLine[2*i+1] == '0' ) // 0
206 v = 0;
207 else if ( pLine[2*i] == '1' && pLine[2*i+1] == '0' ) // 1
208 v = 1;
209 else if ( pLine[2*i] == '0' && pLine[2*i+1] == '1' ) // 2
210 v = 2;
211 else if ( pLine[2*i] == '1' && pLine[2*i+1] == '1' ) // 3
212 v = 3;
213 else assert( 0 );
214 // add the value
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 );
217 }
218
219 // add the cube
220 bCubeSum = Cudd_bddOr( p->dd, bTemp = bCubeSum, bCube ); Cudd_Ref( bCubeSum );
221 Cudd_RecursiveDeref( p->dd, bTemp );
222 Cudd_RecursiveDeref( p->dd, bCube );
223 }
224
225 // add the complement of the domain to all values
226 for ( i = 0; i < 15; i++ )
227 for ( v = 0; v < 4; v++ )
228 {
229 if ( p->bValues[i][v] == Cudd_Not(Cudd_ReadOne(p->dd)) )
230 continue;
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 );
235 }
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 );
238
239 // create each output function
240 for ( i = 0; i < 15; i++ )
241 {
242 p->bFuncs[i] = Cudd_ReadLogicZero(p->dd); Cudd_Ref( p->bFuncs[i] );
243 for ( v = 0; v < 4; v++ )
244 {
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 );
250 // add the value
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 );
254 }
255 }
256}
257
269void Abc_MvDeref( Mv_Man_t * p )
270{
271 int i, v;
272 for ( i = 0; i < 15; i++ )
273 for ( v = 0; v < 4; v++ )
274 {
275 Cudd_RecursiveDeref( p->dd, p->bValues[i][v] );
276 Cudd_RecursiveDeref( p->dd, p->bValueDcs[i][v] );
277 }
278 for ( i = 0; i < 15; i++ )
279 Cudd_RecursiveDeref( p->dd, p->bFuncs[i] );
280}
281
282
283
295void Abc_MvDecompose( Mv_Man_t * p )
296{
297 DdNode * bCofs[16], * bVarCube1, * bVarCube2, * bVarCube, * bCube, * bVar0, * bVar1;//, * bRes;
298 int k, i1, i2, v1, v2;//, c1, c2, Counter;
299
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 );
303
304 for ( k = 0; k < p->nFuncs; k++ )
305 {
306 printf( "FUNCTION %d\n", k );
307 for ( i1 = 0; i1 < p->nFuncs; i1++ )
308 for ( i2 = i1+1; i2 < p->nFuncs; i2++ )
309 {
310 Vec_Ptr_t * vCofs;
311
312 for ( v1 = 0; v1 < 4; v1++ )
313 {
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++ )
318 {
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 );
326 }
327 Cudd_RecursiveDeref( p->dd, bVarCube1 );
328 }
329/*
330 // check the compatibility of cofactors
331 Counter = 0;
332 for ( c1 = 0; c1 < 16; c1++ )
333 {
334 for ( c2 = 0; c2 <= c1; c2++ )
335 printf( " " );
336 for ( c2 = c1+1; c2 < 16; c2++ )
337 {
338 bRes = Cudd_bddAndAbstract( p->dd, bCofs[c1], bCofs[c2], bCube ); Cudd_Ref( bRes );
339 if ( bRes == Cudd_ReadOne(p->dd) )
340 {
341 printf( "+" );
342 Counter++;
343 }
344 else
345 {
346 printf( " " );
347 }
348 Cudd_RecursiveDeref( p->dd, bRes );
349 }
350 printf( "\n" );
351 }
352*/
353
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 );
360
361 // free the cofactors
362 for ( v1 = 0; v1 < 4; v1++ )
363 for ( v2 = 0; v2 < 4; v2++ )
364 Cudd_RecursiveDeref( p->dd, bCofs[v1 * 4 + v2] );
365
366 printf( "\n" );
367// printf( "%2d, %2d : %3d\n", i1, i2, Counter );
368 }
369 }
370
371 Cudd_RecursiveDeref( p->dd, bCube );
372}
373#endif
374
378
379
381
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Cube * p
Definition exorList.c:222
void Extra_StopManager(DdManager *dd)
#define assert(ex)
Definition util_old.h:213
char * memset()
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42