1 /**CFile**********************************************************************
7 Synopsis [A simple test function for Dddmp package]
9 Description [This program constitutes a simple test program
10 for the dddmp library (version 2.0).
11 A simple interactive command selection allow the users to perform the
12 main operation on BDDs, ADDs, and CNF, such as loading and storing.
13 It can work also as a BDD calculators.
16 Author [Gianpiero Cabodi and Stefano Quer]
19 Copyright (c) 2004 by Politecnico di Torino.
20 All Rights Reserved. This software is for educational purposes only.
21 Permission is given to academic institutions to use, copy, and modify
22 this software and its documentation provided that this introductory
23 message is not removed, that this software and its documentation is
24 used for the institutions' internal research and educational purposes,
25 and that no monies are exchanged. No guarantee is expressed or implied
26 by the distribution of this code.
27 Send bug-reports and/or questions to:
28 {gianpiero.cabodi,stefano.quer}@polito.it.
31 ******************************************************************************/
37 /*---------------------------------------------------------------------------*/
38 /* Constant declarations */
39 /*---------------------------------------------------------------------------*/
41 #define DDDMPTEST_MAX_FILENAME_LENGTH 256
42 #define DDDMPTEST_MAX_STRING_LENGTH 80
43 #define DDDMPTEST_MAX_OPERAND 20
44 #define DDDMPTEST_MAX_VARIABLE 50
45 #define DDDMP_MAX_BDDARRAY_LEN 1000
47 /**Enum************************************************************************
49 Synopsis [Message type for output messages]
51 Description [Type supported by the output function to print-out
55 ******************************************************************************/
59 DDDMP_MESSAGE_MANAGER_VAR
,
61 DDDMP_MESSAGE_BDD_ARRAY
,
62 DDDMP_MESSAGE_SOURCE1
,
63 DDDMP_MESSAGE_SOURCE2
,
64 DDDMP_MESSAGE_DESTINATION
,
68 DDDMP_MESSAGE_EDGE_MAX
,
69 DDDMP_MESSAGE_LENGHT_MAX
,
70 DDDMP_MESSAGE_REORDERING
,
78 #if !defined(RAND_MAX) && defined(sun) && defined(sparc)
79 #define RAND_MAX 2147483647
82 /*---------------------------------------------------------------------------*/
83 /* Stucture declarations */
84 /*---------------------------------------------------------------------------*/
86 typedef struct dddmpVarInfo
{
91 int nDdVars
; /* Local Manager Number of Variables */
92 char **rootNames
; /* Root Names */
95 * Header File Information
98 Dddmp_DecompType ddType
;
100 int nVars
; /* File Manager Number of Variables */
101 int nSuppVars
; /* File Structure Number of Variables */
103 int varNamesFlagUpdate
; /* 0 to NOT Update */
105 char **orderedVarNames
;
107 int varIdsFlagUpdate
; /* 0 to NOT Update */
108 int *varIds
; /* File ids - nSuppVars size */
109 int *varIdsAll
; /* ALL ids - nVars size */
111 int varComposeIdsFlagUpdate
; /* 0 to NOT Update */
112 int *varComposeIds
; /* File permids - nSuppVars size */
113 int *varComposeIdsAll
; /* ALL permids - nVars size */
115 int varAuxIdsFlagUpdate
; /* 0 to NOT Update */
116 int *varAuxIds
; /* File auxids - nSuppVars size */
117 int *varAuxIdsAll
; /* ALL auxids - nVars size */
122 /*---------------------------------------------------------------------------*/
123 /* Type declarations */
124 /*---------------------------------------------------------------------------*/
126 /*---------------------------------------------------------------------------*/
127 /* Variable declarations */
128 /*---------------------------------------------------------------------------*/
130 Dddmp_RootMatchType rootmatchmode
;
131 Dddmp_VarMatchType varmatchmode
;
132 Dddmp_VarInfoType varoutinfo
;
133 char varname
[DDDMPTEST_MAX_STRING_LENGTH
];
135 /*---------------------------------------------------------------------------*/
136 /* Macro declarations */
137 /*---------------------------------------------------------------------------*/
139 /**AutomaticStart*************************************************************/
141 /*---------------------------------------------------------------------------*/
142 /* Static function prototypes */
143 /*---------------------------------------------------------------------------*/
145 static DdManager
*ManagerInit (dddmpVarInfo_t
*varInfo
);
146 static void ManagerQuit (DdManager
**ddMgr
, dddmpVarInfo_t
*varInfo
);
147 static int OneCreate(DdManager
*ddMgr
, DdNode
**operandBdd
);
148 static int BddZeroCreate(DdManager
*ddMgr
, DdNode
**operandBdd
);
149 static int LeafCreate(DdManager
*ddMgr
, DdNode
**operandBdd
);
150 static int BddCreate(DdManager
*ddMgr
, DdNode
**operandBdd
);
151 static int A2B(void);
152 static int B2A(void);
153 static int HeaderLoadBdd(dddmpVarInfo_t
*varInfo
);
154 static int HeaderLoadCnf(dddmpVarInfo_t
*varInfo
);
155 static int HeaderWrite(dddmpVarInfo_t
*varInfo
);
156 static int Help(void);
157 static int OrderNamesLoad(dddmpVarInfo_t
*varInfo
);
158 static int IntArrayLoad(dddmpVarInfo_t
*varInfo
, const char *mode
);
159 static int BddLoad(DdManager
*ddMgr
, DdNode
**operandBdd
, dddmpVarInfo_t
*varInfo
);
160 static int BddArrayLoad(DdManager
*ddMgr
, DdNode
***operandBddArray
, int *operandBddArraySize
, dddmpVarInfo_t
*varInfo
);
161 static int AddLoad(DdManager
*ddMgr
, DdNode
**operandBdd
, dddmpVarInfo_t
*varInfo
);
162 static int AddArrayLoad(DdManager
*ddMgr
, DdNode
***operandBddArray
, int *operandBddArraySize
, dddmpVarInfo_t
*varInfo
);
163 static int BddLoadCnf(DdManager
*ddMgr
, DdNode
**operandBdd
, dddmpVarInfo_t
*varInfo
);
164 static int BddArrayLoadCnf(DdManager
*ddMgr
, DdNode
***operandBddArray
, int *operandBddArraySize
, dddmpVarInfo_t
*varInfo
);
165 static int Operation(DdManager
*ddMgr
, DdNode
**operandBdd
);
166 static int BddStore(DdManager
*ddMgr
, DdNode
**operandBdd
, dddmpVarInfo_t
*varInfo
);
167 static int BddArrayStore(DdManager
*ddMgr
, DdNode
***operandBddArray
, int *operandBddArraySize
, dddmpVarInfo_t
*varInfo
);
168 static int AddStore(DdManager
*ddMgr
, DdNode
**operandBdd
, dddmpVarInfo_t
*varInfo
);
169 static int AddArrayStore(DdManager
*ddMgr
, DdNode
***operandBddArray
, int *operandBddArraySize
, dddmpVarInfo_t
*varInfo
);
170 static int BddStoreCnf(DdManager
*ddMgr
, DdNode
**operandBdd
, dddmpVarInfo_t
*varInfo
);
171 static int BddArrayStoreCnf(DdManager
*ddMgr
, DdNode
***operandBddArray
, int *operandBddArraySize
, dddmpVarInfo_t
*varInfo
);
172 static int DynamicReordering(DdManager
*ddMgr
);
173 static int SetLoadMatchmode();
174 static int CompleteInfoStruct(Dddmp_DecompType ddType
, int nVars
, int nSuppVars
, char **suppVarNames
, char **orderedVarNames
, int *varIds
, int *varComposeIds
, int *varAuxIds
, int nRoots
, dddmpVarInfo_t
*varInfo
);
175 static void ReadInt(Dddmp_MessageType message
, int *i
);
176 static void ReadString(Dddmp_MessageType message
, char string
[]);
178 /**AutomaticEnd***************************************************************/
186 DdManager
*ddMgr
= NULL
;
187 DdNode
**operandBdd
= NULL
;
188 DdNode
***operandBddArray
= NULL
;
189 int *operandBddArraySize
= NULL
;
191 dddmpVarInfo_t varInfo
;
194 /*--------------------- Echo command line and arguments -------------------*/
196 fprintf (stdout
, "#");
197 for (i
=0; i
<argc
; i
++) {
198 fprintf (stdout
, "%s Version 2.0.2 (use command help)", argv
[i
]);
200 fprintf (stdout
, "\n");
205 /*-------------------------- Init Array of BDDs ---------------------------*/
207 rootmatchmode
= DDDMP_ROOT_MATCHLIST
;
209 varmatchmode
= DDDMP_VAR_MATCHIDS
;
211 varmatchmode
= DDDMP_VAR_MATCHNAMES
;
213 varoutinfo
= DDDMP_VARIDS
;
215 row
= DDDMP_ALLOC (char, DDDMPTEST_MAX_STRING_LENGTH
);
216 Dddmp_CheckAndReturn (row
==NULL
, "Allocation error.");
218 operandBdd
= DDDMP_ALLOC (DdNode
*, DDDMPTEST_MAX_OPERAND
);
219 Dddmp_CheckAndReturn (operandBdd
==NULL
, "Allocation error.");
221 operandBddArray
= DDDMP_ALLOC (DdNode
**, DDDMPTEST_MAX_OPERAND
);
222 Dddmp_CheckAndReturn (operandBddArray
==NULL
, "Allocation error.");
224 operandBddArraySize
= DDDMP_ALLOC (int, DDDMPTEST_MAX_OPERAND
);
225 Dddmp_CheckAndReturn (operandBddArraySize
==NULL
, "Allocation error.");
227 for (i
=0; i
<DDDMPTEST_MAX_OPERAND
; i
++) {
228 operandBdd
[i
] = NULL
;
229 operandBddArray
[i
] = NULL
;
230 operandBddArraySize
[i
] = 0;
233 /*--------------------- Manage command line parameters --------------------*/
236 ReadString (DDDMP_MESSAGE_PROMPT
, row
);
240 if (strncmp (row
, "help", 4)==0) {
242 } else if (strncmp (row
, "mi", 2)==0) {
243 ddMgr
= ManagerInit (&varInfo
);
244 } else if (strncmp (row
, "mq", 2)==0) {
245 ManagerQuit (&ddMgr
, &varInfo
);
246 } else if (strncmp (row
, "onl", 3)==0) {
247 OrderNamesLoad (&varInfo
);
248 } else if (strncmp (row
, "oil", 3)==0) {
249 IntArrayLoad (&varInfo
, "oil");
250 } else if (strncmp (row
, "cil", 3)==0) {
251 IntArrayLoad (&varInfo
, "cil");
252 } else if (strncmp (row
, "slm", 3)==0) {
254 } else if (strncmp (row
, "op", 2)==0) {
255 Operation (ddMgr
, operandBdd
);
256 } else if (strncmp (row
, "oc", 2)==0) {
257 OneCreate (ddMgr
, operandBdd
);
258 } else if (strncmp (row
, "zc", 2)==0) {
259 BddZeroCreate (ddMgr
, operandBdd
);
260 } else if (strncmp (row
, "lc", 2)==0) {
261 LeafCreate (ddMgr
, operandBdd
);
262 } else if (strncmp (row
, "bc", 2)==0) {
263 BddCreate (ddMgr
, operandBdd
);
264 } else if (strncmp (row
, "a2b", 3)==0) {
266 } else if (strncmp (row
, "b2a", 3)==0) {
268 } else if (strncmp (row
, "hlb", 3)==0) {
269 HeaderLoadBdd (&varInfo
);
270 } else if (strncmp (row
, "hlc", 3)==0) {
271 HeaderLoadCnf (&varInfo
);
272 } else if (strncmp (row
, "bl", 3)==0) {
273 BddLoad (ddMgr
, operandBdd
, &varInfo
);
274 } else if (strncmp (row
, "bal", 3)==0) {
275 BddArrayLoad (ddMgr
, operandBddArray
, operandBddArraySize
, &varInfo
);
276 } else if (strncmp (row
, "al", 2)==0) {
277 AddLoad (ddMgr
, operandBdd
, &varInfo
);
278 } else if (strncmp (row
, "aal", 3)==0) {
279 AddArrayLoad (ddMgr
, operandBddArray
, operandBddArraySize
, &varInfo
);
280 } else if (strncmp (row
, "cl", 2)==0) {
281 BddLoadCnf (ddMgr
, operandBdd
, &varInfo
);
282 } else if (strncmp (row
, "cal", 3)==0) {
283 BddArrayLoadCnf (ddMgr
, operandBddArray
, operandBddArraySize
, &varInfo
);
284 } else if (strncmp (row
, "hw", 2)==0) {
285 HeaderWrite (&varInfo
);
286 } else if (strncmp (row
, "bs", 2)==0) {
287 BddStore (ddMgr
, operandBdd
, &varInfo
);
288 } else if (strncmp (row
, "bas", 3)==0) {
289 BddArrayStore (ddMgr
, operandBddArray
, operandBddArraySize
, &varInfo
);
290 } else if (strncmp (row
, "as", 2)==0) {
291 AddStore (ddMgr
, operandBdd
, &varInfo
);
292 } else if (strncmp (row
, "aas", 2)==0) {
293 AddArrayStore (ddMgr
, operandBddArray
, operandBddArraySize
, &varInfo
);
294 } else if (strncmp (row
, "cs", 2)==0) {
295 BddStoreCnf (ddMgr
, operandBdd
, &varInfo
);
296 } else if (strncmp (row
, "cas", 2)==0) {
297 BddArrayStoreCnf (ddMgr
, operandBddArray
, operandBddArraySize
, &varInfo
);
298 } else if (strncmp (row
, "dr", 2)==0) {
299 DynamicReordering (ddMgr
);
300 } else if (strncmp (row
, "quit", 4)==0) {
303 fprintf (stderr
, "Command not found: %s\n", row
);
307 /*-------------------------------- Free Memory ----------------------------*/
309 ManagerQuit (&ddMgr
, &varInfo
);
312 DDDMP_FREE (operandBdd
);
313 for (i
=0; i
<DDDMPTEST_MAX_OPERAND
; i
++) {
314 if (operandBddArray
[i
] != NULL
) {
315 DDDMP_FREE (operandBddArray
[i
]);
318 DDDMP_FREE (operandBddArray
);
319 DDDMP_FREE (operandBddArraySize
);
321 fprintf (stdout
, "End of test.\n");
323 return (DDDMP_SUCCESS
);
326 /*---------------------------------------------------------------------------*/
327 /* Definition of internal functions */
328 /*---------------------------------------------------------------------------*/
330 /*---------------------------------------------------------------------------*/
331 /* Definition of static functions */
332 /*---------------------------------------------------------------------------*/
334 /**Function********************************************************************
336 Synopsis [Create a CUDD Manager with nVars variables.]
338 Description [Create a CUDD Manager with nVars variables.]
344 ******************************************************************************/
348 dddmpVarInfo_t
*varInfo
351 DdManager
*ddMgr
= NULL
;
354 ReadInt (DDDMP_MESSAGE_MANAGER_VAR
, &nVars
);
356 /*----------------------- Init Var Information Structure ------------------*/
358 varInfo
->nDdVars
= nVars
;
360 varInfo
->rootNames
= NULL
;
361 varInfo
->ddType
= DDDMP_NONE
;
362 varInfo
->nVars
= (-1);
363 varInfo
->nSuppVars
= (-1);
364 varInfo
->varNamesFlagUpdate
= 1;
365 varInfo
->suppVarNames
= NULL
;
366 varInfo
->orderedVarNames
= NULL
;
367 varInfo
->varIdsFlagUpdate
= 1;
368 varInfo
->varIds
= NULL
;
369 varInfo
->varIdsAll
= NULL
;
370 varInfo
->varComposeIdsFlagUpdate
= 1;
371 varInfo
->varComposeIds
= NULL
;
372 varInfo
->varComposeIdsAll
= NULL
;
373 varInfo
->varAuxIdsFlagUpdate
= 1;
374 varInfo
->varAuxIds
= NULL
;
375 varInfo
->varAuxIdsAll
= NULL
;
376 varInfo
->nRoots
= (-1);
378 /*------------------------------ Init DD Manager --------------------------*/
380 ddMgr
= Cudd_Init (nVars
, 0, CUDD_UNIQUE_SLOTS
,
381 CUDD_CACHE_SLOTS
, 0);
383 Dddmp_CheckAndReturn (ddMgr
==NULL
, "DdManager NOT inizializated.");
388 /**Function********************************************************************
390 Synopsis [Quit a CUDD Manager.]
392 Description [Quit a CUDD Manager.]
398 ******************************************************************************/
402 DdManager
**ddMgrPtr
/* IN: CUDD Manager */,
403 dddmpVarInfo_t
*varInfo
/* IN: Internal Manager */
406 if (*ddMgrPtr
== NULL
) {
410 fprintf (stdout
, "Quitting CUDD Manager.\n");
411 Cudd_Quit (*ddMgrPtr
);
414 DddmpStrArrayFree (varInfo
->rootNames
, varInfo
->nRoots
);
415 DddmpStrArrayFree (varInfo
->suppVarNames
, varInfo
->nSuppVars
);
416 DddmpStrArrayFree (varInfo
->orderedVarNames
, varInfo
->nVars
);
417 DDDMP_FREE (varInfo
->varIds
);
418 DDDMP_FREE (varInfo
->varIdsAll
);
419 DDDMP_FREE (varInfo
->varComposeIds
);
420 DDDMP_FREE (varInfo
->varComposeIdsAll
);
421 DDDMP_FREE (varInfo
->varAuxIds
);
422 DDDMP_FREE (varInfo
->varAuxIdsAll
);
424 varInfo
->nDdVars
= (-1);
425 varInfo
->rootNames
= NULL
;
426 varInfo
->ddType
= DDDMP_NONE
;
427 varInfo
->nVars
= (-1);
428 varInfo
->nSuppVars
= (-1);
429 varInfo
->varNamesFlagUpdate
= 1;
430 varInfo
->suppVarNames
= NULL
;
431 varInfo
->orderedVarNames
= NULL
;
432 varInfo
->varIdsFlagUpdate
= 1;
433 varInfo
->varIds
= NULL
;
434 varInfo
->varIdsAll
= NULL
;
435 varInfo
->varComposeIdsFlagUpdate
= 1;
436 varInfo
->varComposeIds
= NULL
;
437 varInfo
->varComposeIdsAll
= NULL
;
438 varInfo
->varAuxIdsFlagUpdate
= 1;
439 varInfo
->varAuxIds
= NULL
;
440 varInfo
->varAuxIdsAll
= NULL
;
441 varInfo
->nRoots
= (-1);
446 /**Function********************************************************************
448 Synopsis [Create a One-BDD Leaf.]
450 Description [Create a One-BDD Leaf.]
456 ******************************************************************************/
460 DdManager
*ddMgr
/* IN: CUDD Manager */,
461 DdNode
**operandBdd
/* In/OUT: Array of operand */
466 /*------------------------ Read Operation Operands ------------------------*/
468 ReadInt (DDDMP_MESSAGE_BDD
, &i
);
470 operandBdd
[i
] = Cudd_ReadOne (ddMgr
);
472 return (DDDMP_SUCCESS
);
475 /**Function********************************************************************
477 Synopsis [Create a Zero-BDD Leaf.]
479 Description [Create a Zero-BDD Leaf.]
485 ******************************************************************************/
489 DdManager
*ddMgr
/* IN: CUDD Manager */,
490 DdNode
**operandBdd
/* IN/OUT: array of operand */
496 /*------------------------ Read Operation Operands ------------------------*/
498 ReadInt (DDDMP_MESSAGE_BDD
, &i
);
500 one
= Cudd_ReadOne(ddMgr
);
501 operandBdd
[i
] = Cudd_Not(one
);
503 return (DDDMP_SUCCESS
);
506 /**Function********************************************************************
508 Synopsis [Create a One-Node BDD.]
510 Description [Create a One-Node BDD.]
516 ******************************************************************************/
520 DdManager
*ddMgr
/* IN: CUDD Manager */,
521 DdNode
**operandBdd
/* IN/OUT: Array of operandBdd */
527 /*------------------------ Read Operation Operands ------------------------*/
529 ReadInt (DDDMP_MESSAGE_BDD
, &i
);
530 ReadInt (DDDMP_MESSAGE_INDEX
, &j
);
532 f
= Cudd_bddIthVar (ddMgr
, j
);
536 return (DDDMP_SUCCESS
);
539 /**Function********************************************************************
541 Synopsis [Create a BDD.]
543 Description [Create a BDD: Variable index and number of cubes selection.]
549 ******************************************************************************/
553 DdManager
*ddMgr
/* IN: CUDD Manager */,
554 DdNode
**operandBdd
/* array of operandBdd */
557 DdNode
**vet
, *f
, *g
, *h
;
558 int nb
, nv
, vi0
, vi1
, nc
, i
, j
;
559 char row
[DDDMPTEST_MAX_FILENAME_LENGTH
];
561 /*------------------------ Read Operation Operands ------------------------*/
563 ReadInt (DDDMP_MESSAGE_BDD
, &nb
);
565 fprintf (stdout
, "Variables Index [n-m] (m-n = number of variables): ");
566 fgets (row
, DDDMPTEST_MAX_STRING_LENGTH
, stdin
);
567 sscanf (row
, "%d-%d", &vi0
, &vi1
);
570 ReadInt (DDDMP_MESSAGE_CUBE
, &nc
);
573 vet
= DDDMP_ALLOC (DdNode
*, nv
);
574 for (i
=0; i
<nv
; i
++) {
575 vet
[i
] = Cudd_bddIthVar (ddMgr
, vi0
+i
);
578 /* Cubes and BDD creation */
579 f
= Cudd_Not (Cudd_ReadOne (ddMgr
));
582 g
= Cudd_ReadOne (ddMgr
);
585 if ( ((float) rand())/((float) RAND_MAX
) > 0.5 ) {
586 h
= Cudd_bddAnd (ddMgr
, g
, vet
[j
]);
588 h
= Cudd_bddAnd (ddMgr
, g
, Cudd_Not (vet
[j
]));
591 Cudd_RecursiveDeref (ddMgr
, g
);
594 h
= Cudd_bddOr (ddMgr
, f
, g
);
596 Cudd_RecursiveDeref (ddMgr
, f
);
597 Cudd_RecursiveDeref (ddMgr
, g
);
603 return (DDDMP_SUCCESS
);
606 /**Function********************************************************************
608 Synopsis [Transform a BDD from the ASCII to the Binary format].]
610 Description [Input and Output file selection.]
616 ******************************************************************************/
623 fprintf (stderr
, "Not yet Implemented!!!\n");
625 return (DDDMP_FAILURE
);
628 /**Function********************************************************************
630 Synopsis [Transform a BDD from the Binary to the ASCII format].]
632 Description [Input and Output file selection.]
638 ******************************************************************************/
645 fprintf (stderr
, "Not yet Implemented!!!\n");
647 return (DDDMP_FAILURE
);
650 /**Function********************************************************************
652 Synopsis [Read the Header of a file containing a BDD.]
654 Description [File name Selection.]
660 ******************************************************************************/
664 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
667 Dddmp_DecompType ddType
;
668 int retValue
, nRoots
, nVars
, nSuppVars
;
669 int *tmpVarIds
= NULL
;
670 int *tmpVarAuxIds
= NULL
;
671 int *tmpVarComposeIds
= NULL
;
672 char **tmpOrderedVarNames
= NULL
;
673 char **tmpSuppVarNames
= NULL
;
674 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
676 /*------------------------ Read Operation Operands ------------------------*/
678 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
680 retValue
= Dddmp_cuddHeaderLoad (&ddType
, &nVars
, &nSuppVars
,
681 &tmpSuppVarNames
, &tmpOrderedVarNames
, &tmpVarIds
, &tmpVarComposeIds
,
682 &tmpVarAuxIds
, &nRoots
, fileName
, NULL
);
684 if (retValue
== DDDMP_FAILURE
) {
685 return (DDDMP_FAILURE
);
688 /*---------------------------- Tail Operations ----------------------------*/
690 CompleteInfoStruct (ddType
, nVars
, nSuppVars
,
691 tmpSuppVarNames
, tmpOrderedVarNames
, tmpVarIds
, tmpVarComposeIds
,
692 tmpVarAuxIds
, nRoots
, varInfo
);
694 return (DDDMP_SUCCESS
);
697 /**Function********************************************************************
699 Synopsis [Read the Header of a file containing a CNF formula.]
701 Description [File name Selection.]
707 ******************************************************************************/
711 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
714 int retValue
, nRoots
, nVars
, nSuppVars
;
715 int *tmpVarIds
= NULL
;
716 int *tmpVarComposeIds
= NULL
;
717 int *tmpVarAuxIds
= NULL
;
718 char **tmpOrderedVarNames
= NULL
;
719 char **tmpSuppVarNames
= NULL
;
720 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
722 /*------------------------ Read Operation Operands ------------------------*/
724 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
726 retValue
= Dddmp_cuddHeaderLoadCnf (&nVars
, &nSuppVars
,
727 &tmpSuppVarNames
, &tmpOrderedVarNames
, &tmpVarIds
, &tmpVarComposeIds
,
728 &tmpVarAuxIds
, &nRoots
, fileName
, NULL
);
730 if (retValue
== DDDMP_FAILURE
) {
731 return (DDDMP_FAILURE
);
734 /*---------------------------- Tail Operations ----------------------------*/
736 CompleteInfoStruct (DDDMP_CNF
, nVars
, nSuppVars
,
737 tmpSuppVarNames
, tmpOrderedVarNames
, tmpVarIds
, tmpVarComposeIds
,
738 tmpVarAuxIds
, nRoots
, varInfo
);
740 return (DDDMP_SUCCESS
);
743 /**Function********************************************************************
745 Synopsis [Read the Header of a filke containing a BDD.]
747 Description [File name Selection.]
753 ******************************************************************************/
757 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
762 switch (varInfo
->ddType
) {
764 fprintf (stdout
, "DD TYPE: DDDMP_BDD\n");
767 fprintf (stdout
, "DD TYPE: DDDMP_ADD\n");
770 fprintf (stdout
, "DD TYPE: DDDMP_CNF\n");
773 fprintf (stdout
, "DD TYPE: NONE - Error\n");
777 fprintf (stdout
, "Number of variables: %d\n", varInfo
->nVars
);
778 fprintf (stdout
, "Number of support variables: %d\n", varInfo
->nSuppVars
);
780 if (varInfo
->suppVarNames
!= NULL
) {
781 fprintf (stdout
, "suppVarNames: ");
782 for (i
=0; i
<varInfo
->nSuppVars
; i
++) {
783 if (varInfo
->suppVarNames
[i
] != NULL
) {
784 fprintf (stdout
, "%s ", varInfo
->suppVarNames
[i
]);
787 fprintf (stdout
, "\n");
790 if (varInfo
->orderedVarNames
!= NULL
) {
791 fprintf (stdout
, "orderedVarNames: ");
792 for (i
=0; i
<varInfo
->nVars
; i
++) {
793 if (varInfo
->orderedVarNames
[i
] != NULL
) {
794 fprintf (stdout
, "%s ", varInfo
->orderedVarNames
[i
]);
797 fprintf (stdout
, "\n");
800 if (varInfo
->varIds
!= NULL
) {
801 fprintf (stdout
, "varIds: ");
802 for (i
=0; i
<varInfo
->nSuppVars
; i
++) {
803 fprintf (stdout
, "%d ", varInfo
->varIds
[i
]);
805 fprintf (stdout
, "\n");
808 if (varInfo
->varIdsAll
!= NULL
) {
809 fprintf (stdout
, "varIds for ALL Manager Variables: ");
810 for (i
=0; i
<varInfo
->nVars
; i
++) {
811 fprintf (stdout
, "%d ", varInfo
->varIdsAll
[i
]);
813 fprintf (stdout
, "\n");
816 if (varInfo
->varComposeIds
!= NULL
) {
817 fprintf (stdout
, "varComposeIds: ");
818 for (i
=0; i
<varInfo
->nSuppVars
; i
++) {
819 fprintf (stdout
, "%d ", varInfo
->varComposeIds
[i
]);
821 fprintf (stdout
, "\n");
824 if (varInfo
->varComposeIdsAll
!= NULL
) {
825 fprintf (stdout
, "varComposeIds for ALL Manager Variables: ");
826 for (i
=0; i
<varInfo
->nVars
; i
++) {
827 fprintf (stdout
, "%d ", varInfo
->varComposeIdsAll
[i
]);
829 fprintf (stdout
, "\n");
832 if (varInfo
->varAuxIds
!= NULL
) {
833 fprintf (stdout
, "varAuxIds: ");
834 for (i
=0; i
<varInfo
->nSuppVars
; i
++) {
835 fprintf (stdout
, "%d ", varInfo
->varAuxIds
[i
]);
837 fprintf (stdout
, "\n");
840 if (varInfo
->varAuxIdsAll
!= NULL
) {
841 fprintf (stdout
, "varAuxIds for ALL Manager Variables: ");
842 for (i
=0; i
<varInfo
->nVars
; i
++) {
843 fprintf (stdout
, "%d ", varInfo
->varAuxIdsAll
[i
]);
845 fprintf (stdout
, "\n");
848 fprintf (stdout
, "Number of roots: %d\n", varInfo
->nRoots
);
852 return (DDDMP_SUCCESS
);
855 /**Function********************************************************************
857 Synopsis [Print the Help messages.]
859 Description [Print the Help messages.]
865 ******************************************************************************/
872 fprintf (stdout
, "Commands:\n");
873 fprintf (stdout
, "MAIN\n");
875 fprintf (stdout
, "\thelp : Print this set of messages.\n");
876 fprintf (stdout
, "\tquit : Quit the test program.\n");
878 fprintf (stdout
, "MANAGER OPERATIONs\n");
881 "\thmi : Manager Init (To do BEFORE any BDD/ADD operation).\n");
882 fprintf (stdout
, "\thmq : Manager Quit.\n");
884 fprintf (stdout
, "LOAD\n");
886 fprintf (stdout
, "\thlb : Load the header from a BDD/ADD file.\n");
887 fprintf (stdout
, "\thlc : Load the header from a CNF file.\n");
888 fprintf (stdout
, "\tbl : Load a BDD from a file.\n");
889 fprintf (stdout
, "\tbal : Load an Array-BDD from a file.\n");
890 fprintf (stdout
, "\tal : Load an ADD from a file.\n");
891 fprintf (stdout
, "\taal : Load an Array-ADD from a file.\n");
892 fprintf (stdout
, "\tcl : Load a CNF Formula from a file.\n");
893 fprintf (stdout
, "\tcal : Load an Array of CNF Formulas from a file.\n");
895 fprintf (stdout
, "STORE\n");
898 "\thw : (Header) Write variable information on stdout.\n");
899 fprintf (stdout
, "\tbs : Store a BDD into a file.\n");
900 fprintf (stdout
, "\tbas : Store an Array-BDD from a file.\n");
901 fprintf (stdout
, "\tas : Store an ADD into a file.\n");
902 fprintf (stdout
, "\taas : Store an Array-ADD into a file.\n");
903 fprintf (stdout
, "\tcs : Store BDD as a CNF formula.\n");
904 fprintf (stdout
, "\tcas : Store and Array of BDDs as a CNF formula.\n");
906 fprintf (stdout
, "MISC\n");
908 fprintf (stdout
, "\tdr : Activate Dynamic Reordering.\n");
909 fprintf (stdout
, "\tonl : Load the order from a file (varNames).\n");
910 fprintf (stdout
, "\toil : Load the order from a file (varAuxIds).\n");
911 fprintf (stdout
, "\tcil : Load compose IDs from a file.\n");
912 fprintf (stdout
, "\tslm : Set Load matchmode for variables.\n");
914 "\top : Operation (or, and, xor, not, =) between BDDs.\n");
915 fprintf (stdout
, "\toc : Create a terminal-one BDD.\n");
916 fprintf (stdout
, "\tzc : Create a terminal-zero BDD.\n");
917 fprintf (stdout
, "\tlc : Create a single variable BDD (1 node).\n");
918 fprintf (stdout
, "\tbc : Create a random BDD.\n");
920 fprintf (stdout
, "NOT YET IMPLEMENTED\n");
923 "\ta2b : Convert a file from the ASCII format to the binary one.\n");
925 "\tb2a : Convert a file from the binary format to the ASCII one.\n");
927 fprintf (stdout
, "HINT\n");
930 " Command 'mi' has to be the first instruction to build:\n");
931 fprintf (stdout
, " a) The CUDD manager.\n");
933 " b) The internal manager (containing name and variable IDs).\n");
935 " After that load an header file with 'hlb' or 'hlc' to have proper\n");
937 " names and ids for each subsequent load/store operation.\n");
939 return (DDDMP_SUCCESS
);
942 /**Function********************************************************************
944 Synopsis [Load the BDD order from a file (varNames).]
946 Description [Load the BDD order from a file (varNames).
947 Force the orderedVarNames field of the varInfo structure,
948 i.e., the local manager, to be stucked to this array of values.
955 ******************************************************************************/
959 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
964 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
965 char tmpBuf
[DDDMPTEST_MAX_STRING_LENGTH
];
966 char tmpName
[DDDMPTEST_MAX_STRING_LENGTH
];
967 char **tmpOrderedVarNames
= NULL
;
969 /*------------------------- Red New Var Names Array ----------------------*/
971 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
973 fp
= fopen (fileName
, "r");
974 Dddmp_CheckAndReturn (fp
==NULL
, "Cannot open file.");
976 varoutinfo
= DDDMP_VARNAMES
;
977 tmpOrderedVarNames
= DDDMP_ALLOC (char *, varInfo
->nDdVars
);
980 while (fgets (tmpBuf
, DDDMPTEST_MAX_STRING_LENGTH
, fp
)!=NULL
) {
981 if (tmpBuf
[0]=='#') {
985 if (i
>=varInfo
->nDdVars
) {
987 "Number of variables in files higher than DD manager vars (%d)\n",
989 fprintf (stdout
, "Exceeding variables ignored\n");
991 "You might increase the DDDMPTEST_MAX_VARIABLE constant\n");
995 sscanf (tmpBuf
, "%s", tmpName
);
996 tmpOrderedVarNames
[i
] = DDDMP_ALLOC (char, (strlen (tmpName
) + 1));
997 if (tmpOrderedVarNames
[i
]==NULL
) {
998 fprintf (stdout
, "Error allocating memory\n");
1000 strcpy (tmpOrderedVarNames
[i
], tmpName
);
1005 for ( ;i
<varInfo
->nDdVars
; i
++) {
1006 tmpOrderedVarNames
[i
] = NULL
;
1011 /*----------------------- Free and Set Var Names Array --------------------*/
1013 DddmpStrArrayFree (varInfo
->orderedVarNames
, varInfo
->nVars
);
1014 varInfo
->orderedVarNames
= tmpOrderedVarNames
;
1015 varInfo
->nVars
= varInfo
->nDdVars
;
1017 /* DO NOT ALLOW FURTHER UPDATES */
1018 varInfo
->varNamesFlagUpdate
= 0;
1020 return (DDDMP_SUCCESS
);
1023 /**Function********************************************************************
1025 Synopsis [Load the BDD order from a file (varauxids).]
1027 Description [Load the BDD order from a file (varauxids).
1029 varAuxIds and varAuxIdsAll
1031 varComposeIds and varComposeIdsAll
1032 fields of the varInfo structure, i.e., the local manager, to be
1033 stucked to this array of values.
1040 ******************************************************************************/
1044 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */,
1050 int *tmpArray1
= NULL
;
1051 int *tmpArray2
= NULL
;
1052 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1053 char buf
[DDDMPTEST_MAX_STRING_LENGTH
];
1055 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
1057 fp
= fopen(fileName
, "r");
1058 Dddmp_CheckAndReturn (fp
==NULL
, "Cannot open file.");
1060 tmpArray1
= DDDMP_ALLOC (int, varInfo
->nDdVars
);
1061 tmpArray2
= DDDMP_ALLOC (int, varInfo
->nDdVars
);
1062 Dddmp_CheckAndReturn (tmpArray1
==NULL
, "Error allocating memory.");
1063 Dddmp_CheckAndReturn (tmpArray2
==NULL
, "Error allocating memory.");
1066 while (fgets(buf
, DDDMPTEST_MAX_STRING_LENGTH
, fp
)!=NULL
) {
1070 if (i
>=varInfo
->nDdVars
) {
1072 "Number of variables in files higher than DD manager vars (%d)\n",
1074 fprintf (stdout
, "Exceeding variables ignored.\n");
1075 fprintf (stdout
, "(Increase the DDDMPTEST_MAX_VARIABLE constant.)\n");
1078 sscanf(buf
, "%d", &tmpArray1
[i
]);
1079 sscanf(buf
, "%d", &tmpArray2
[i
++]);
1082 for (;i
<varInfo
->nDdVars
;i
++) {
1089 if (strcmp (mode
, "oil") == 0) {
1090 varInfo
->varAuxIds
= tmpArray1
;
1091 varInfo
->varAuxIdsAll
= tmpArray2
;
1093 /* DO NOT ALLOW FURTHER UPDATES */
1094 varInfo
->varAuxIdsFlagUpdate
= 0;
1096 if (strcmp (mode
, "cil") == 0) {
1097 varInfo
->varComposeIds
= tmpArray1
;
1098 varInfo
->varComposeIdsAll
= tmpArray2
;
1100 /* DO NOT ALLOW FURTHER UPDATES */
1101 varInfo
->varComposeIdsFlagUpdate
= 0;
1105 varInfo
->nVars
= varInfo
->nDdVars
;
1106 varInfo
->nSuppVars
= varInfo
->nDdVars
;
1108 return (DDDMP_SUCCESS
);
1111 /**Function********************************************************************
1113 Synopsis [Load a BDD from a file.]
1115 Description [Load a BDD from a file.]
1121 ******************************************************************************/
1125 DdManager
*ddMgr
/* IN: CUDD Manager */,
1126 DdNode
**operandBdd
/* IN: Operand BDD */,
1127 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
1132 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1134 /*------------------------ Read Operation Operands ------------------------*/
1136 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
1137 ReadInt (DDDMP_MESSAGE_BDD
, &i
);
1139 /*-------------------------------- Load BDD -------------------------------*/
1141 fprintf (stdout
, "Loading %s ...\n", fileName
);
1143 f
= Dddmp_cuddBddLoad (ddMgr
, varmatchmode
, varInfo
->orderedVarNames
,
1144 varInfo
->varIdsAll
, varInfo
->varComposeIdsAll
, DDDMP_MODE_DEFAULT
,
1148 fprintf (stderr
, "Dddmp Test Error : %s is not loaded from file\n",
1154 /*---------------------------- Tail Operations ----------------------------*/
1156 return (DDDMP_SUCCESS
);
1159 /**Function********************************************************************
1161 Synopsis [Load an array of BDDs from a file.]
1163 Description [Load an array of BDDs from a file.]
1169 ******************************************************************************/
1173 DdManager
*ddMgr
/* IN: CUDD Manager */,
1174 DdNode
***operandBddArray
/* IN: Array of operand BDD */,
1175 int *operandBddArraySize
/* IN: Number of ADD in the Array */,
1176 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
1179 DdNode
**bddArray
= NULL
;
1181 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1183 /*------------------------ Read Operation Operands ------------------------*/
1185 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
1186 ReadInt (DDDMP_MESSAGE_BDD_ARRAY
, &i
);
1188 /*---------------------------- Load BDDs ----------------------------------*/
1190 nRoots
= Dddmp_cuddBddArrayLoad (ddMgr
, rootmatchmode
,
1191 varInfo
->rootNames
, varmatchmode
,
1192 varInfo
->orderedVarNames
, varInfo
->varIdsAll
, varInfo
->varComposeIdsAll
,
1193 DDDMP_MODE_DEFAULT
, fileName
, NULL
, &bddArray
);
1195 Dddmp_CheckAndReturn (nRoots
>DDDMP_MAX_BDDARRAY_LEN
,
1196 "DDDMP_MAX_BDDARRAY_LEN exceeded by BDD array len (increase it).");
1199 return (DDDMP_FAILURE
);
1202 varInfo
->nRoots
= nRoots
;
1203 operandBddArray
[i
] = DDDMP_ALLOC (DdNode
*, nRoots
);
1204 Dddmp_CheckAndReturn (operandBddArray
[i
]==NULL
, "Allocation error.");
1206 for (j
=0; j
<nRoots
; j
++) {
1207 operandBddArray
[i
][j
] = bddArray
[j
];
1209 operandBddArraySize
[i
] = nRoots
;
1211 /*---------------------------- Tail Operations ----------------------------*/
1214 DDDMP_FREE (bddArray
);
1216 return (DDDMP_SUCCESS
);
1219 /**Function********************************************************************
1221 Synopsis [Load an ADD from a file.]
1223 Description [Load an ADD from a file.]
1229 ******************************************************************************/
1233 DdManager
*ddMgr
/* IN: CUDD Manager */,
1234 DdNode
**operandBdd
/* IN: Operand BDD */,
1235 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
1240 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1242 /*------------------------ Read Operation Operands ------------------------*/
1244 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
1245 ReadInt (DDDMP_MESSAGE_BDD
, &i
);
1247 /*-------------------------------- Load ADD -------------------------------*/
1249 fprintf (stdout
, "Loading %s ...\n", fileName
);
1251 f
= Dddmp_cuddAddLoad (ddMgr
, varmatchmode
, varInfo
->orderedVarNames
,
1252 varInfo
->varIdsAll
, varInfo
->varComposeIdsAll
, DDDMP_MODE_DEFAULT
,
1256 fprintf (stderr
, "Dddmp Test Error : %s is not loaded from file\n",
1262 /*---------------------------- Tail Operations ----------------------------*/
1264 fprintf (stdout
, "Load:\n");
1265 Cudd_PrintMinterm (ddMgr
, f
);
1267 return (DDDMP_SUCCESS
);
1270 /**Function********************************************************************
1272 Synopsis [Load an array of ADDs from a file.]
1274 Description [Load an array of ADDs from a file.]
1280 ******************************************************************************/
1284 DdManager
*ddMgr
/* IN: CUDD Manager */,
1285 DdNode
***operandBddArray
/* IN: Array of operand BDD */,
1286 int *operandBddArraySize
/* IN: Number of ADD in the Array */,
1287 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
1290 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1292 DdNode
**bddArray
= NULL
;
1294 /*------------------------ Read Operation Operands ------------------------*/
1296 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
1297 ReadInt (DDDMP_MESSAGE_BDD_ARRAY
, &i
);
1299 /*------------------------------- Load ADDs -------------------------------*/
1301 nRoots
= Dddmp_cuddAddArrayLoad (ddMgr
, rootmatchmode
,
1302 varInfo
->rootNames
, varmatchmode
,
1303 varInfo
->orderedVarNames
, varInfo
->varIdsAll
, varInfo
->varComposeIdsAll
,
1304 DDDMP_MODE_DEFAULT
, fileName
, NULL
, &bddArray
);
1306 Dddmp_CheckAndReturn (nRoots
>DDDMP_MAX_BDDARRAY_LEN
,
1307 "DDDMP_MAX_BDDARRAY_LEN exceeded by BDD array len (increase it).");
1310 return (DDDMP_FAILURE
);
1313 varInfo
->nRoots
= nRoots
;
1314 operandBddArray
[i
] = DDDMP_ALLOC (DdNode
*, nRoots
);
1315 Dddmp_CheckAndReturn (operandBddArray
[i
]==NULL
, "Allocation error.");
1317 for (j
=0; j
<nRoots
; j
++) {
1318 operandBddArray
[i
][j
] = bddArray
[j
];
1320 operandBddArraySize
[i
] = nRoots
;
1322 /*---------------------------- Tail Operations ----------------------------*/
1325 DDDMP_FREE (bddArray
);
1327 return (DDDMP_SUCCESS
);
1330 /**Function********************************************************************
1332 Synopsis [Load a CNF formula from a file, and create a BDD.]
1334 Description [Load a CNF formula from a file, and create a BDD.]
1340 ******************************************************************************/
1344 DdManager
*ddMgr
/* IN: CUDD Manager */,
1345 DdNode
**operandBdd
/* IN: Operand BDD */,
1346 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
1349 DdNode
**rootsPtr
= NULL
;
1350 Dddmp_DecompCnfLoadType loadingMode
= DDDMP_CNF_MODE_CONJ_QUANT
;
1351 int i
, retValue
, nRoots
;
1352 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1354 /*------------------------ Read Operation Operands ------------------------*/
1356 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
1357 ReadInt (DDDMP_MESSAGE_BDD
, &i
);
1359 /*------------------------------- Load BDDs -------------------------------*/
1361 fprintf (stdout
, "Loading %s ...\n", fileName
);
1363 retValue
= Dddmp_cuddBddLoadCnf (ddMgr
, varmatchmode
,
1364 varInfo
->orderedVarNames
, varInfo
->varAuxIdsAll
, varInfo
->varComposeIdsAll
,
1365 loadingMode
, fileName
, NULL
, &rootsPtr
, &nRoots
);
1367 Dddmp_CheckAndGotoLabel (retValue
==DDDMP_FAILURE
,
1368 "Dddmp Test: Load From File Error.\n", failure
);
1370 operandBdd
[i
] = rootsPtr
[0];
1372 /*---------------------------- Tail Operations ----------------------------*/
1375 DDDMP_FREE (rootsPtr
);
1377 return (DDDMP_SUCCESS
);
1380 return(DDDMP_FAILURE
);
1383 /**Function********************************************************************
1385 Synopsis [Load a CNF formula from a file, and create an array of
1389 Description [Load a CNF formula from a file, and create an array of
1397 ******************************************************************************/
1401 DdManager
*ddMgr
/* IN: CUDD Manager */,
1402 DdNode
***operandBddArray
/* IN: Array of operand BDD */,
1403 int *operandBddArraySize
/* IN: Number of ADD in the Array */,
1404 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
1407 DdNode
**rootsPtr
= NULL
;
1408 Dddmp_DecompCnfLoadType loadingMode
= DDDMP_CNF_MODE_CONJ_QUANT
;
1409 int i
, j
, nRoots
, retValue
;
1410 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1412 /*------------------------ Read Operation Operands ------------------------*/
1414 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
1415 ReadInt (DDDMP_MESSAGE_BDD_ARRAY
, &i
);
1417 /*--------------------------- Loading BDDs --------------------------------*/
1419 retValue
= Dddmp_cuddBddArrayLoadCnf (ddMgr
, rootmatchmode
,
1420 varInfo
->rootNames
, varmatchmode
,
1421 varInfo
->orderedVarNames
, varInfo
->varIdsAll
, varInfo
->varComposeIdsAll
,
1422 loadingMode
, fileName
, NULL
, &rootsPtr
, &nRoots
);
1424 Dddmp_CheckAndReturn (nRoots
>DDDMP_MAX_BDDARRAY_LEN
,
1425 "DDDMP_MAX_BDDARRAY_LEN exceeded by BDD array len (increase it).");
1428 return (DDDMP_FAILURE
);
1431 varInfo
->nRoots
= nRoots
;
1432 operandBddArray
[i
] = DDDMP_ALLOC (DdNode
*, nRoots
);
1433 Dddmp_CheckAndReturn (operandBddArray
[i
]==NULL
, "Allocation error.");
1435 for (j
=0; j
<nRoots
; j
++) {
1436 operandBddArray
[i
][j
] = rootsPtr
[j
];
1438 operandBddArraySize
[i
] = nRoots
;
1440 /*---------------------------- Tail Operations ----------------------------*/
1443 DDDMP_FREE (rootsPtr
);
1445 return (DDDMP_SUCCESS
);
1448 /**Function********************************************************************
1450 Synopsis [Perform an Operation among BDDs.]
1452 Description [Perform an Operation among BDDs.]
1458 ******************************************************************************/
1462 DdManager
*ddMgr
/* IN: CUDD Manager */,
1463 DdNode
**operandBdd
/* IN: Array of operandBdd */
1467 char buf
[DDDMPTEST_MAX_STRING_LENGTH
];
1470 /*------------------------ Read Operation Operands ------------------------*/
1472 ReadString (DDDMP_MESSAGE_OP
, buf
);
1473 ReadInt (DDDMP_MESSAGE_SOURCE1
, &i
);
1477 /*-------------------------- Compute Operation ----------------------------*/
1479 if ((strcmp(buf
, "or")==0)|| (strcmp(buf
, "OR")==0)) {
1480 ReadInt (DDDMP_MESSAGE_SOURCE2
, &i
);
1482 h
= Cudd_bddOr(ddMgr
, f
, g
);
1483 Cudd_RecursiveDeref(ddMgr
, f
);
1485 Cudd_RecursiveDeref(ddMgr
, g
);
1486 } else if ((strcmp(buf
, "and")==0) || (strcmp(buf
, "AND")==0)) {
1487 ReadInt (DDDMP_MESSAGE_SOURCE2
, &i
);
1489 h
= Cudd_bddAnd(ddMgr
, f
, g
);
1491 Cudd_RecursiveDeref(ddMgr
, f
);
1492 Cudd_RecursiveDeref(ddMgr
, g
);
1493 } else if ((strcmp(buf
, "xor")==0) || (strcmp(buf
, "XOR")==0)) {
1494 ReadInt (DDDMP_MESSAGE_SOURCE2
, &i
);
1496 h
= Cudd_bddXor(ddMgr
, f
, g
);
1498 Cudd_RecursiveDeref(ddMgr
, f
);
1499 Cudd_RecursiveDeref(ddMgr
, g
);
1500 } else if (strcmp(buf
, "!")==0) {
1503 Cudd_RecursiveDeref(ddMgr
, f
);
1504 } else if ((strcmp(buf
, "buf")==0)|| (strcmp(buf
, "BUF")==0)) {
1507 fprintf (stderr
, "Dddmp Test Error : Operation %s unknown\n", buf
);
1511 ReadInt (DDDMP_MESSAGE_DESTINATION
, &i
);
1515 return (DDDMP_SUCCESS
);
1518 /**Function********************************************************************
1520 Synopsis [Store a BDD in a file.]
1522 Description [Store a BDD in a file.]
1528 ******************************************************************************/
1532 DdManager
*ddMgr
/* IN: CUDD Manager */,
1533 DdNode
**operandBdd
/* IN: Operand BDD */,
1534 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
1539 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1541 /*------------------------ Read Operation Operands ------------------------*/
1543 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
1544 ReadInt (DDDMP_MESSAGE_BDD
, &i
);
1546 fprintf (stdout
, "Storing %s ...\n", fileName
);
1550 /*----------------------------- Store BDDs -------------------------------*/
1552 retValue
= Dddmp_cuddBddStore(ddMgr
, NULL
, f
, varInfo
->orderedVarNames
,
1553 varInfo
->varAuxIdsAll
, DDDMP_MODE_TEXT
, varoutinfo
, fileName
, NULL
);
1555 Dddmp_CheckAndGotoLabel (retValue
!=DDDMP_SUCCESS
, "BDD NOT stored.",
1558 return (DDDMP_SUCCESS
);
1561 return(DDDMP_FAILURE
);
1564 /**Function********************************************************************
1566 Synopsis [Store an Array of BDD in a file.]
1568 Description [Store an Array of BDD in a file.]
1574 ******************************************************************************/
1578 DdManager
*ddMgr
/* IN: CUDD Manager */,
1579 DdNode
***operandBddArray
/* IN: Array of operand BDD */,
1580 int *operandBddArraySize
/* IN: Number of ADD in the Array */,
1581 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
1584 int i
, retValue
, nRoots
;
1585 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1587 /*------------------------ Read Operation Operands ------------------------*/
1589 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
1590 ReadInt (DDDMP_MESSAGE_BDD_ARRAY
, &i
);
1592 nRoots
= operandBddArraySize
[i
];
1594 /*----------------------------- Store BDDs -------------------------------*/
1596 fprintf (stdout
, "Storing Array of BDDs in file %s ...\n", fileName
);
1599 retValue
= Dddmp_cuddBddArrayStore (ddMgr
, NULL
, nRoots
, operandBddArray
[i
],
1600 NULL
, varInfo
->orderedVarNames
, varInfo
->varAuxIdsAll
, DDDMP_MODE_TEXT
,
1601 DDDMP_VARIDS
, fileName
, NULL
);
1603 Dddmp_CheckAndGotoLabel (retValue
!=DDDMP_SUCCESS
, "BDD NOT stored.",
1605 fprintf (stdout
, "done.\n");
1607 return (DDDMP_SUCCESS
);
1610 return(DDDMP_FAILURE
);
1613 /**Function********************************************************************
1615 Synopsis [Store an ADD in a file.]
1617 Description [Store an ADD in a file.]
1623 ******************************************************************************/
1627 DdManager
*ddMgr
/* IN: CUDD Manager */,
1628 DdNode
**operandBdd
/* IN: operand Bdd */,
1629 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
1634 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1636 /*------------------------ Read Operation Operands ------------------------*/
1638 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
1639 ReadInt (DDDMP_MESSAGE_BDD
, &i
);
1641 fprintf (stdout
, "Storing %s ...\n", fileName
);
1646 /* StQ Patch - CREATE temporary ADD to Store */
1647 f
= Cudd_addResidue (ddMgr
, 4, 3, 1, 1);
1648 fprintf (stderr
, "Store:\n");
1649 Cudd_PrintMinterm (ddMgr
, f
);
1650 /* end ... StQ Patch */
1653 retValue
= Dddmp_cuddAddStore (ddMgr
, NULL
, f
, varInfo
->orderedVarNames
,
1654 varInfo
->varAuxIdsAll
, DDDMP_MODE_TEXT
, varoutinfo
, fileName
, NULL
);
1656 Dddmp_CheckAndReturn (retValue
!=DDDMP_SUCCESS
, "BDD NOT stored.");
1658 return (DDDMP_SUCCESS
);
1661 /**Function********************************************************************
1663 Synopsis [Store a BDD in a file.]
1665 Description [Store a BDD in a file.]
1671 ******************************************************************************/
1675 DdManager
*ddMgr
/* IN: CUDD Manager */,
1676 DdNode
***operandBddArray
/* IN: Array of operand ADD */,
1677 int *operandBddArraySize
/* IN: Number of ADD in the Array */,
1678 dddmpVarInfo_t
*varInfo
1681 int i
, retValue
, nRoots
;
1682 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1684 /*------------------------ Read Operation Operands ------------------------*/
1686 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
1687 ReadInt (DDDMP_MESSAGE_BDD_ARRAY
, &i
);
1689 nRoots
= operandBddArraySize
[i
];
1691 fprintf (stdout
, "Storing Array of BDDs in file %s ...\n", fileName
);
1694 retValue
= Dddmp_cuddAddArrayStore (ddMgr
, NULL
, nRoots
, operandBddArray
[i
],
1695 NULL
, varInfo
->orderedVarNames
, varInfo
->varAuxIdsAll
, DDDMP_MODE_TEXT
,
1696 DDDMP_VARIDS
, fileName
, NULL
);
1698 Dddmp_CheckAndReturn (retValue
!=DDDMP_SUCCESS
, "BDD NOT stored.");
1700 fprintf (stdout
, "done.\n");
1701 return (DDDMP_SUCCESS
);
1704 /**Function********************************************************************
1706 Synopsis [Store a BDD as CNF format in a file.]
1708 Description [Store a BDD as CNF format in a file.]
1714 ******************************************************************************/
1718 DdManager
*ddMgr
/* IN: CUDD Manager */,
1719 DdNode
**operandBdd
/* IN: Array of operand ADD */,
1720 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
1724 Dddmp_DecompCnfStoreType storingMode
= DDDMP_CNF_MODE_BEST
;
1726 int i
, nVars
, retValue
, idInitial
, varNewN
, clauseNewN
;
1727 int edgeInTh
= (-1);
1728 int pathLengthTh
= (-1);
1729 int *tmpBddIds
= NULL
;
1730 int *tmpCnfIds
= NULL
;
1731 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1732 char row
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1734 /*------------------------ Read Operation Operands ------------------------*/
1736 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
1737 ReadInt (DDDMP_MESSAGE_BDD
, &i
);
1738 ReadString (DDDMP_MESSAGE_FORMAT
, row
);
1742 storingMode
= DDDMP_CNF_MODE_NODE
;
1745 storingMode
= DDDMP_CNF_MODE_MAXTERM
;
1748 storingMode
= DDDMP_CNF_MODE_BEST
;
1749 ReadInt (DDDMP_MESSAGE_EDGE_MAX
, &edgeInTh
);
1750 ReadInt (DDDMP_MESSAGE_LENGHT_MAX
, &pathLengthTh
);
1753 ReadInt (DDDMP_MESSAGE_I_ID
, &idInitial
);
1755 fprintf (stdout
, "Storing %s ...\n", fileName
);
1760 nVars
= varInfo
->nDdVars
;
1762 /*------------ From BDD and CNF ids to Proper Array of ids ----------------*/
1764 tmpBddIds
= DDDMP_ALLOC (int, nVars
);
1765 Dddmp_CheckAndGotoLabel (tmpBddIds
==NULL
, "Error allocating memory.",
1767 tmpCnfIds
= DDDMP_ALLOC (int, nVars
);
1768 Dddmp_CheckAndGotoLabel (tmpBddIds
==NULL
, "Error allocating memory.",
1771 for (i
=0; i
<nVars
; i
++) {
1776 retValue
= Dddmp_cuddBddStoreCnf (ddMgr
, f
, storingMode
, noHeader
,
1777 varInfo
->orderedVarNames
, tmpBddIds
, NULL
, tmpCnfIds
, idInitial
,
1778 edgeInTh
, pathLengthTh
, fileName
, NULL
, &clauseNewN
, &varNewN
);
1780 Dddmp_CheckAndGotoLabel (retValue
!=DDDMP_SUCCESS
, "BDD NOT stored.",
1783 fprintf (stdout
, "Number of Clauses Stored = %d\n", clauseNewN
);
1784 fprintf (stdout
, "Number of New Variable Created Storing = %d\n",
1788 DDDMP_FREE (tmpBddIds
);
1789 DDDMP_FREE (tmpCnfIds
);
1791 return (DDDMP_SUCCESS
);
1794 DDDMP_FREE (tmpBddIds
);
1795 DDDMP_FREE (tmpCnfIds
);
1797 return(DDDMP_FAILURE
);
1800 /**Function********************************************************************
1802 Synopsis [Store a BDD as CNF format in a file.]
1804 Description [Store a BDD as CNF format in a file.]
1810 ******************************************************************************/
1814 DdManager
*ddMgr
/* IN: CUDD Manager */,
1815 DdNode
***operandBddArray
/* IN: Array of operand ADD */,
1816 int *operandBddArraySize
/* IN: Number of ADD in the Array */,
1817 dddmpVarInfo_t
*varInfo
/* IN/OUT: Variable Information */
1820 Dddmp_DecompCnfStoreType storingMode
= DDDMP_CNF_MODE_BEST
;
1822 int i
, nVars
, bddN
, retValue
, idInitial
, varNewN
, clauseNewN
;
1823 int edgeInTh
= (-1);
1824 int pathLengthTh
= (-1);
1825 int *tmpBddIds
= NULL
;
1826 int *tmpCnfIds
= NULL
;
1827 char fileName
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1828 char row
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1830 /*------------------------ Read Operation Operands ------------------------*/
1832 ReadString (DDDMP_MESSAGE_FILE
, fileName
);
1833 ReadInt (DDDMP_MESSAGE_BDD_ARRAY
, &bddN
);
1834 ReadString (DDDMP_MESSAGE_FORMAT
, row
);
1837 storingMode
= DDDMP_CNF_MODE_NODE
;
1840 storingMode
= DDDMP_CNF_MODE_MAXTERM
;
1843 storingMode
= DDDMP_CNF_MODE_BEST
;
1844 ReadInt (DDDMP_MESSAGE_EDGE_MAX
, &edgeInTh
);
1845 ReadInt (DDDMP_MESSAGE_LENGHT_MAX
, &pathLengthTh
);
1848 ReadInt (DDDMP_MESSAGE_I_ID
, &idInitial
);
1850 nVars
= varInfo
->nDdVars
;
1852 /*------------ From BDD and CNF ids to Proper Array of ids ----------------*/
1854 tmpBddIds
= DDDMP_ALLOC (int, nVars
);
1855 Dddmp_CheckAndReturn (tmpBddIds
==NULL
, "Allocation error.");
1856 tmpCnfIds
= DDDMP_ALLOC (int, nVars
);
1857 Dddmp_CheckAndReturn (tmpCnfIds
==NULL
, "Allocation error.");
1859 for (i
=0; i
<nVars
; i
++) {
1861 tmpCnfIds
[i
] = i
*10+1;
1864 fprintf (stdout
, "Storing %s ...\n", fileName
);
1867 retValue
= Dddmp_cuddBddArrayStoreCnf (ddMgr
, operandBddArray
[bddN
],
1868 operandBddArraySize
[bddN
], storingMode
, noHeader
, varInfo
->orderedVarNames
,
1869 tmpBddIds
, NULL
, tmpCnfIds
, idInitial
, edgeInTh
, pathLengthTh
, fileName
,
1870 NULL
, &varNewN
, &clauseNewN
);
1872 Dddmp_CheckAndGotoLabel (retValue
!=DDDMP_SUCCESS
, "BDD NOT stored.",
1875 fprintf (stdout
, "Number of Clauses Stored = %d\n", clauseNewN
);
1876 fprintf (stdout
, "Number of New Variable Created Storing = %d\n",
1880 DDDMP_FREE (tmpBddIds
);
1881 DDDMP_FREE (tmpCnfIds
);
1883 return (DDDMP_SUCCESS
);
1886 DDDMP_FREE (tmpBddIds
);
1887 DDDMP_FREE (tmpCnfIds
);
1889 return(DDDMP_FAILURE
);
1892 /**Function********************************************************************
1894 Synopsis [Dynamic Reordering BDDs.]
1896 Description [Dynamic Reordering BDDs using one of the allowed CUDD
1903 ******************************************************************************/
1907 DdManager
*ddMgr
/* IN: CUDD Manager */
1910 Cudd_ReorderingType approach
= CUDD_REORDER_SIFT
;
1913 /*------------------------ Read Operation Operands ------------------------*/
1915 ReadInt (DDDMP_MESSAGE_REORDERING
, &method
);
1916 approach
= (Cudd_ReorderingType
) method
;
1918 Cudd_ReduceHeap (ddMgr
, approach
, 5);
1920 return (DDDMP_SUCCESS
);
1923 /**Function********************************************************************
1925 Synopsis [Selects variable matching mode.]
1927 Description [Selects variable matching mode.]
1933 ******************************************************************************/
1940 char row
[DDDMPTEST_MAX_FILENAME_LENGTH
];
1942 fprintf (stdout
, "Variable matchmode:\n");
1943 fprintf (stdout
, "Match IDs (1)\n");
1944 fprintf (stdout
, "Match permIDs (2)\n");
1945 fprintf (stdout
, "Match names (must have been loaded) (3)\n");
1946 fprintf (stdout
, "Match auxids (must have been loaded) (4)\n");
1947 fprintf (stdout
, "Match composeids (must have been loaded) (5)\n");
1948 fprintf (stdout
, "Your choice: ");
1951 fgets (row
, DDDMPTEST_MAX_STRING_LENGTH
, stdin
);
1952 sscanf (row
, "%d", &sel
);
1956 varmatchmode
= DDDMP_VAR_MATCHIDS
;
1959 varmatchmode
= DDDMP_VAR_MATCHPERMIDS
;
1962 varmatchmode
= DDDMP_VAR_MATCHNAMES
;
1965 varmatchmode
= DDDMP_VAR_MATCHAUXIDS
;
1968 varmatchmode
= DDDMP_VAR_COMPOSEIDS
;
1971 fprintf (stderr
, "Wrong choice!\n");
1975 return (DDDMP_SUCCESS
);
1978 /**Function********************************************************************
1980 Synopsis [Complete the internal manager structure for subsequent
1981 BDD/ADD/CNF operations.
1984 Description [Complete the internal manager structure for subsequent
1985 BDD/ADD/CNF operations.
1986 The phylosophy is simple: to have proper names and ids it is necessary
1987 to load an header before each actual load/store operation.
1988 An header load should initialize variable names, variable ids,
1989 variable compose ids, and variable auxiliary ids for all variables
1991 This information has to be extended for all variables in the
1992 *current* CUDD manager (before any store operation).
1993 CompleteInfoStruct does this job.
1994 Arrays varIds, varComposeIds, and varAuxIds contain information for
1995 all the variable in the BDD/ADD/CNF while arrays varIdsAll,
1996 varComposeIdsAll, and varAuxIdsAll contain information for *all*
1997 variable in the current CUDD manager.
2005 ******************************************************************************/
2008 CompleteInfoStruct (
2009 Dddmp_DecompType ddType
/* IN: selects the proper decomp type */,
2010 int nVars
/* IN: number of DD variables */,
2011 int nSuppVars
/* IN: number of support variables */,
2012 char **suppVarNames
/* IN: array of support variable names */,
2013 char **orderedVarNames
/* IN: array of variable names */,
2014 int *varIds
/* IN: array of variable ids */,
2015 int *varComposeIds
/* IN: array of permids ids */,
2016 int *varAuxIds
/* IN: array of variable aux ids */,
2017 int nRoots
/* IN: number of root in the file */,
2018 dddmpVarInfo_t
*varInfo
/* IN: Variable Information */
2022 char tmpString
[DDDMPTEST_MAX_STRING_LENGTH
];
2024 /*------------------------- Updates Variable Names ------------------------*/
2026 DddmpStrArrayFree (varInfo
->suppVarNames
, varInfo
->nSuppVars
);
2027 varInfo
->suppVarNames
= suppVarNames
;
2029 if (varInfo
->varNamesFlagUpdate
== 1) {
2031 DddmpStrArrayFree (varInfo
->orderedVarNames
, varInfo
->nVars
);
2033 if (orderedVarNames
!= NULL
) {
2034 varInfo
->orderedVarNames
= orderedVarNames
;
2036 varInfo
->orderedVarNames
= DDDMP_ALLOC (char *, nVars
);
2037 Dddmp_CheckAndReturn (varInfo
->orderedVarNames
==NULL
,
2038 "Allocation error.");
2040 for (i
=0; i
<nVars
; i
++) {
2041 varInfo
->orderedVarNames
[i
] = NULL
;
2044 if (varInfo
->suppVarNames
!= NULL
) {
2045 for (i
=0; i
<nSuppVars
; i
++) {
2046 varInfo
->orderedVarNames
[i
] = DDDMP_ALLOC (char,
2047 (strlen (varInfo
->suppVarNames
[i
]) + 1));
2048 strcpy (varInfo
->orderedVarNames
[i
], varInfo
->suppVarNames
[i
]);
2052 for (i
=0; i
<nVars
; i
++) {
2053 if (varInfo
->orderedVarNames
[i
] == NULL
) {
2054 sprintf (tmpString
, "DUMMY%d", i
);
2055 varInfo
->orderedVarNames
[i
] = DDDMP_ALLOC (char,
2056 (strlen (tmpString
) + 1));
2057 strcpy (varInfo
->orderedVarNames
[i
], tmpString
);
2063 /*------------------------------ Updates IDs ------------------------------*/
2065 DDDMP_FREE (varInfo
->varIds
);
2066 varInfo
->varIds
= varIds
;
2068 if (varInfo
->varIdsFlagUpdate
== 1) {
2070 /* Free Previously Allocated Memory */
2071 DDDMP_FREE (varInfo
->varIdsAll
);
2073 /* Allocate New Memory and Check */
2074 varInfo
->varIdsAll
= DDDMP_ALLOC (int, nVars
);
2075 Dddmp_CheckAndReturn (varInfo
->varIdsAll
==NULL
, "Allocation error.");
2077 /* Set New Values */
2078 for (i
=0; i
<nVars
; i
++) {
2079 varInfo
->varIdsAll
[i
] = (-1);
2082 if (varInfo
->varIds
!= NULL
) {
2083 for (i
=0; i
<nSuppVars
; i
++) {
2084 varInfo
->varIdsAll
[varInfo
->varIds
[i
]] = varInfo
->varIds
[i
];
2090 /*-------------------------- Updates Compose IDs --------------------------*/
2092 DDDMP_FREE (varInfo
->varComposeIds
);
2093 varInfo
->varComposeIds
= varComposeIds
;
2095 if (varInfo
->varComposeIdsFlagUpdate
== 1) {
2097 /* Free Previously Allocated Memory */
2098 DDDMP_FREE (varInfo
->varComposeIdsAll
);
2100 /* Allocate New Memory and Check */
2101 varInfo
->varComposeIdsAll
= DDDMP_ALLOC (int, nVars
);
2102 Dddmp_CheckAndReturn (varInfo
->varComposeIdsAll
==NULL
,
2103 "Allocation error.");
2105 /* Set New Values */
2106 for (i
=0; i
<nVars
; i
++) {
2107 varInfo
->varComposeIdsAll
[i
] = (-1);
2110 if (varInfo
->varComposeIds
!= NULL
) {
2111 for (i
=0; i
<nSuppVars
; i
++) {
2112 varInfo
->varComposeIdsAll
[varInfo
->varIds
[i
]] =
2113 varInfo
->varComposeIds
[i
];
2118 /*------------------------- Updates Auxiliary IDs -------------------------*/
2120 DDDMP_FREE (varInfo
->varAuxIds
);
2121 varInfo
->varAuxIds
= varAuxIds
;
2123 if (varInfo
->varAuxIdsFlagUpdate
== 1) {
2125 /* Free Previously Allocated Memory */
2126 DDDMP_FREE (varInfo
->varAuxIdsAll
);
2128 /* Allocate New Memory and Check */
2129 varInfo
->varAuxIdsAll
= DDDMP_ALLOC (int, nVars
);
2130 Dddmp_CheckAndReturn (varInfo
->varAuxIdsAll
==NULL
, "Allocation error.");
2132 /* Set New Values */
2133 for (i
=0; i
<nVars
; i
++) {
2134 varInfo
->varAuxIdsAll
[i
] = (-1);
2137 if (varInfo
->varAuxIds
!= NULL
) {
2138 for (i
=0; i
<nSuppVars
; i
++) {
2139 varInfo
->varAuxIdsAll
[varInfo
->varIds
[i
]] = varInfo
->varAuxIds
[i
];
2144 /*----------------------------- Updates Sizes -----------------------------*/
2146 varInfo
->ddType
= ddType
;
2147 varInfo
->nVars
= nVars
;
2148 varInfo
->nSuppVars
= nSuppVars
;
2149 Dddmp_CheckAndReturn (varInfo
->nDdVars
<varInfo
->nVars
,
2150 "Local Manager with Not Enough Variables.");
2151 varInfo
->nRoots
= nRoots
;
2153 return (DDDMP_SUCCESS
);
2156 /**Function********************************************************************
2158 Synopsis [Reads an integer value from standard input.]
2160 Description [Reads an integer value from standard input.]
2166 ******************************************************************************/
2170 Dddmp_MessageType message
,
2174 char row
[DDDMPTEST_MAX_FILENAME_LENGTH
];
2177 case DDDMP_MESSAGE_MANAGER_VAR
:
2178 fprintf (stdout
, "Number of Variables: ");
2180 case DDDMP_MESSAGE_BDD
:
2181 fprintf (stdout
, "Which BDDs [0..%d]: ",
2182 DDDMPTEST_MAX_OPERAND
-1);
2184 case DDDMP_MESSAGE_BDD_ARRAY
:
2185 fprintf (stdout
, "Which Array of BDDs [0..%d]: ",
2186 DDDMPTEST_MAX_OPERAND
-1);
2188 case DDDMP_MESSAGE_CUBE
:
2189 fprintf (stdout
, "How many cubes [1..]: ");
2191 case DDDMP_MESSAGE_INDEX
:
2192 fprintf (stdout
, "Index: ");
2194 case DDDMP_MESSAGE_SOURCE1
:
2195 fprintf (stdout
, "Source1 [0..%d]: ", DDDMPTEST_MAX_OPERAND
-1);
2197 case DDDMP_MESSAGE_SOURCE2
:
2198 fprintf (stdout
, "Source2 [0..%d]: ", DDDMPTEST_MAX_OPERAND
-1);
2200 case DDDMP_MESSAGE_DESTINATION
:
2201 fprintf (stdout
, "Destination [0..%d]: ", DDDMPTEST_MAX_OPERAND
-1);
2203 case DDDMP_MESSAGE_I_ID
:
2204 fprintf (stdout
, "Initial ID : ");
2206 case DDDMP_MESSAGE_EDGE_MAX
:
2208 "Max Number of Edges (Insert cut-point from there on) : ");
2210 case DDDMP_MESSAGE_LENGHT_MAX
:
2212 "Max BDD-Path Length (Insert cut-point from there on) : ");
2214 case DDDMP_MESSAGE_REORDERING
:
2215 fprintf (stdout
, "Reordering Approach (1..17): ");
2218 fprintf (stdout
, "Input Generic Integer: ");
2223 fgets (row
, DDDMPTEST_MAX_STRING_LENGTH
, stdin
);
2224 sscanf (row
, "%d", i
);
2231 /**Function********************************************************************
2233 Synopsis [Reads a string from standard input.]
2235 Description [Reads a string from standard input.]
2241 ******************************************************************************/
2245 Dddmp_MessageType message
,
2249 char localString
[DDDMPTEST_MAX_STRING_LENGTH
];
2252 case DDDMP_MESSAGE_PROMPT
:
2253 fprintf (stdout
, "TestDddmp> ");
2255 case DDDMP_MESSAGE_FILE
:
2256 fprintf (stdout
, "File : ");
2258 case DDDMP_MESSAGE_OP
:
2259 fprintf (stdout
, "Operation [or,and,xor,!,buf(=)] : ");
2261 case DDDMP_MESSAGE_FORMAT
:
2262 fprintf (stdout
, "Format (Node=N, Maxterm=M, Best=B) : ");
2265 fprintf (stdout
, "Input Generic String : ");
2270 fgets (localString
, DDDMPTEST_MAX_STRING_LENGTH
, stdin
);
2271 sscanf (localString
, "%s", string
);