You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							2279 lines
						
					
					
						
							65 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							2279 lines
						
					
					
						
							65 KiB
						
					
					
				| /**CFile********************************************************************** | |
|  | |
|   FileName     [testdddmp.c] | |
|   | |
|   PackageName  [dddmp] | |
|  | |
|   Synopsis     [A simple test function for Dddmp package] | |
|  | |
|   Description  [This program constitutes a simple test program | |
|     for the dddmp library (version 2.0). | |
|     A simple interactive command selection allow the users to perform the | |
|     main operation on BDDs, ADDs, and CNF, such as loading and storing. | |
|     It can work also as a BDD calculators. | |
|     ] | |
|  | |
|   Author       [Gianpiero Cabodi and Stefano Quer] | |
|  | |
|   Copyright    [ | |
|     Copyright (c) 2004 by Politecnico di Torino. | |
|     All Rights Reserved. This software is for educational purposes only. | |
|     Permission is given to academic institutions to use, copy, and modify | |
|     this software and its documentation provided that this introductory | |
|     message is not removed, that this software and its documentation is | |
|     used for the institutions' internal research and educational purposes, | |
|     and that no monies are exchanged. No guarantee is expressed or implied | |
|     by the distribution of this code. | |
|     Send bug-reports and/or questions to: | |
|     {gianpiero.cabodi,stefano.quer}@polito.it. | |
|     ] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| #include <string.h> | |
| #include <stdio.h> | |
| #include "dddmpInt.h" | |
|  | |
| /*---------------------------------------------------------------------------*/ | |
| /* Constant declarations                                                     */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| #define DDDMPTEST_MAX_FILENAME_LENGTH 256 | |
| #define DDDMPTEST_MAX_STRING_LENGTH 80 | |
| #define DDDMPTEST_MAX_OPERAND  20 | |
| #define DDDMPTEST_MAX_VARIABLE 50 | |
| #define DDDMP_MAX_BDDARRAY_LEN 1000 | |
|  | |
| /**Enum************************************************************************ | |
|  | |
|   Synopsis    [Message type for output messages] | |
|  | |
|   Description [Type supported by the output function to print-out | |
|     the proper message. | |
|     ] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| typedef enum { | |
|   /* Int Messages */ | |
|   DDDMP_MESSAGE_MANAGER_VAR, | |
|   DDDMP_MESSAGE_BDD, | |
|   DDDMP_MESSAGE_BDD_ARRAY, | |
|   DDDMP_MESSAGE_SOURCE1, | |
|   DDDMP_MESSAGE_SOURCE2, | |
|   DDDMP_MESSAGE_DESTINATION, | |
|   DDDMP_MESSAGE_CUBE, | |
|   DDDMP_MESSAGE_INDEX, | |
|   DDDMP_MESSAGE_I_ID, | |
|   DDDMP_MESSAGE_EDGE_MAX, | |
|   DDDMP_MESSAGE_LENGHT_MAX, | |
|   DDDMP_MESSAGE_REORDERING, | |
|   /* String Messages */ | |
|   DDDMP_MESSAGE_PROMPT, | |
|   DDDMP_MESSAGE_FILE, | |
|   DDDMP_MESSAGE_OP, | |
|   DDDMP_MESSAGE_FORMAT | |
| } Dddmp_MessageType; | |
| 
 | |
| #if !defined(RAND_MAX) && defined(sun) && defined(sparc) | |
| #define RAND_MAX 2147483647 | |
| #endif | |
|  | |
| /*---------------------------------------------------------------------------*/ | |
| /* Stucture declarations                                                     */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| typedef struct dddmpVarInfo { | |
|   /* | |
|    *  Local Information | |
|    */ | |
| 
 | |
|   int nDdVars;       /* Local Manager Number of Variables */ | |
|   char **rootNames;  /* Root Names */ | |
| 
 | |
|   /* | |
|    *  Header File Information | |
|    */ | |
| 
 | |
|   Dddmp_DecompType ddType; | |
| 
 | |
|   int nVars;      /* File Manager Number of Variables */ | |
|   int nSuppVars;  /* File Structure Number of Variables */ | |
| 
 | |
|   int varNamesFlagUpdate;      /* 0 to NOT Update */ | |
|   char **suppVarNames; | |
|   char **orderedVarNames; | |
| 
 | |
|   int varIdsFlagUpdate;        /* 0 to NOT Update */ | |
|   int *varIds;                 /* File ids - nSuppVars size */ | |
|   int *varIdsAll;              /* ALL ids - nVars size */ | |
| 
 | |
|   int varComposeIdsFlagUpdate; /* 0 to NOT Update */ | |
|   int *varComposeIds;          /* File permids - nSuppVars size */ | |
|   int *varComposeIdsAll;       /* ALL permids - nVars size */ | |
| 
 | |
|   int varAuxIdsFlagUpdate;     /* 0 to NOT Update */ | |
|   int *varAuxIds;              /* File auxids - nSuppVars size */ | |
|   int *varAuxIdsAll;           /* ALL auxids  - nVars size */ | |
| 
 | |
|   int nRoots; | |
| } dddmpVarInfo_t; | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Type declarations                                                         */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Variable declarations                                                     */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| Dddmp_RootMatchType rootmatchmode; | |
| Dddmp_VarMatchType varmatchmode; | |
| Dddmp_VarInfoType varoutinfo; | |
| char varname[DDDMPTEST_MAX_STRING_LENGTH]; | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Macro declarations                                                        */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /**AutomaticStart*************************************************************/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Static function prototypes                                                */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| static DdManager *ManagerInit (dddmpVarInfo_t *varInfo); | |
| static void ManagerQuit (DdManager **ddMgr, dddmpVarInfo_t *varInfo); | |
| static int OneCreate(DdManager *ddMgr, DdNode **operandBdd); | |
| static int BddZeroCreate(DdManager *ddMgr, DdNode **operandBdd); | |
| static int LeafCreate(DdManager *ddMgr, DdNode **operandBdd); | |
| static int BddCreate(DdManager *ddMgr, DdNode **operandBdd); | |
| static int A2B(void); | |
| static int B2A(void); | |
| static int HeaderLoadBdd(dddmpVarInfo_t *varInfo); | |
| static int HeaderLoadCnf(dddmpVarInfo_t *varInfo); | |
| static int HeaderWrite(dddmpVarInfo_t *varInfo); | |
| static int Help(void); | |
| static int OrderNamesLoad(dddmpVarInfo_t *varInfo); | |
| static int IntArrayLoad(dddmpVarInfo_t *varInfo, const char *mode); | |
| static int BddLoad(DdManager *ddMgr, DdNode **operandBdd, dddmpVarInfo_t *varInfo); | |
| static int BddArrayLoad(DdManager *ddMgr, DdNode ***operandBddArray, int *operandBddArraySize, dddmpVarInfo_t *varInfo); | |
| static int AddLoad(DdManager *ddMgr, DdNode **operandBdd, dddmpVarInfo_t *varInfo); | |
| static int AddArrayLoad(DdManager *ddMgr, DdNode ***operandBddArray, int *operandBddArraySize, dddmpVarInfo_t *varInfo); | |
| static int BddLoadCnf(DdManager *ddMgr, DdNode **operandBdd, dddmpVarInfo_t *varInfo); | |
| static int BddArrayLoadCnf(DdManager *ddMgr, DdNode ***operandBddArray, int *operandBddArraySize, dddmpVarInfo_t *varInfo); | |
| static int Operation(DdManager *ddMgr, DdNode **operandBdd); | |
| static int BddStore(DdManager *ddMgr, DdNode **operandBdd, dddmpVarInfo_t *varInfo); | |
| static int BddArrayStore(DdManager *ddMgr, DdNode ***operandBddArray, int *operandBddArraySize, dddmpVarInfo_t *varInfo); | |
| static int AddStore(DdManager *ddMgr, DdNode **operandBdd, dddmpVarInfo_t *varInfo); | |
| static int AddArrayStore(DdManager *ddMgr, DdNode ***operandBddArray, int *operandBddArraySize, dddmpVarInfo_t *varInfo); | |
| static int BddStoreCnf(DdManager *ddMgr, DdNode **operandBdd, dddmpVarInfo_t *varInfo); | |
| static int BddArrayStoreCnf(DdManager *ddMgr, DdNode ***operandBddArray, int *operandBddArraySize, dddmpVarInfo_t *varInfo); | |
| static int DynamicReordering(DdManager *ddMgr); | |
| static int SetLoadMatchmode(); | |
| 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); | |
| static void ReadInt(Dddmp_MessageType message, int *i); | |
| static void ReadString(Dddmp_MessageType message, char string[]); | |
| 
 | |
| /**AutomaticEnd***************************************************************/ | |
| 
 | |
| int | |
| main( | |
|   int argc, | |
|   char **argv | |
|   ) | |
| { | |
|   DdManager *ddMgr = NULL; | |
|   DdNode **operandBdd = NULL; | |
|   DdNode ***operandBddArray = NULL; | |
|   int *operandBddArraySize = NULL; | |
|   char *row = NULL; | |
|   dddmpVarInfo_t varInfo; | |
|   int i; | |
| 
 | |
|   /*--------------------- Echo command line and arguments -------------------*/ | |
| 
 | |
|   fprintf (stdout, "#"); | |
|   for (i=0; i<argc; i++) { | |
|     fprintf (stdout, "%s Version 2.0.2 (use command help)", argv[i]); | |
|   } | |
|   fprintf (stdout, "\n"); | |
|   if (argc>1) { | |
|     Help(); | |
|   } | |
| 
 | |
|   /*-------------------------- Init Array of BDDs ---------------------------*/ | |
| 
 | |
|  rootmatchmode = DDDMP_ROOT_MATCHLIST; | |
| #if 1 | |
|   varmatchmode = DDDMP_VAR_MATCHIDS; | |
| #else | |
|   varmatchmode = DDDMP_VAR_MATCHNAMES; | |
| #endif | |
|   varoutinfo = DDDMP_VARIDS; | |
| 
 | |
|   row = DDDMP_ALLOC (char, DDDMPTEST_MAX_STRING_LENGTH); | |
|   Dddmp_CheckAndReturn (row==NULL, "Allocation error."); | |
| 
 | |
|   operandBdd = DDDMP_ALLOC (DdNode *, DDDMPTEST_MAX_OPERAND); | |
|   Dddmp_CheckAndReturn (operandBdd==NULL, "Allocation error."); | |
| 
 | |
|   operandBddArray = DDDMP_ALLOC (DdNode **, DDDMPTEST_MAX_OPERAND); | |
|   Dddmp_CheckAndReturn (operandBddArray==NULL, "Allocation error."); | |
| 
 | |
|   operandBddArraySize = DDDMP_ALLOC (int, DDDMPTEST_MAX_OPERAND); | |
|   Dddmp_CheckAndReturn (operandBddArraySize==NULL, "Allocation error."); | |
| 
 | |
|   for (i=0; i<DDDMPTEST_MAX_OPERAND; i++) { | |
|     operandBdd[i] = NULL; | |
|     operandBddArray[i] = NULL; | |
|     operandBddArraySize[i] = 0; | |
|   } | |
| 
 | |
|   /*--------------------- Manage command line parameters --------------------*/ | |
| 
 | |
|   while (1) { | |
|     ReadString (DDDMP_MESSAGE_PROMPT, row); | |
|     if (row[0]=='\n') { | |
|       continue; | |
|     } | |
|     if (strncmp (row, "help", 4)==0) { | |
|       Help(); | |
|     } else if (strncmp (row, "mi", 2)==0) { | |
|       ddMgr = ManagerInit (&varInfo); | |
|     } else if (strncmp (row, "mq", 2)==0) { | |
|       ManagerQuit (&ddMgr, &varInfo); | |
|     } else if (strncmp (row, "onl", 3)==0) { | |
|       OrderNamesLoad (&varInfo); | |
|     } else if (strncmp (row, "oil", 3)==0) { | |
|       IntArrayLoad (&varInfo, "oil"); | |
|     } else if (strncmp (row, "cil", 3)==0) { | |
|       IntArrayLoad (&varInfo, "cil"); | |
|     } else if (strncmp (row, "slm", 3)==0) { | |
|       SetLoadMatchmode (); | |
|     } else if (strncmp (row, "op", 2)==0) { | |
|       Operation (ddMgr, operandBdd); | |
|     } else if (strncmp (row, "oc", 2)==0) { | |
|       OneCreate (ddMgr, operandBdd); | |
|     } else if (strncmp (row, "zc", 2)==0) { | |
|       BddZeroCreate (ddMgr, operandBdd); | |
|     } else if (strncmp (row, "lc", 2)==0) { | |
|       LeafCreate (ddMgr, operandBdd); | |
|     } else if (strncmp (row, "bc", 2)==0) { | |
|       BddCreate (ddMgr, operandBdd); | |
|     } else if (strncmp (row, "a2b", 3)==0) { | |
|       A2B (); | |
|     } else if (strncmp (row, "b2a", 3)==0) { | |
|       B2A (); | |
|     } else if (strncmp (row, "hlb", 3)==0) { | |
|       HeaderLoadBdd (&varInfo); | |
|     } else if (strncmp (row, "hlc", 3)==0) { | |
|       HeaderLoadCnf (&varInfo); | |
|     } else if (strncmp (row, "bl", 3)==0) { | |
|       BddLoad (ddMgr, operandBdd, &varInfo); | |
|     } else if (strncmp (row, "bal", 3)==0) { | |
|       BddArrayLoad (ddMgr, operandBddArray, operandBddArraySize, &varInfo); | |
|     } else if (strncmp (row, "al", 2)==0) { | |
|       AddLoad (ddMgr, operandBdd, &varInfo); | |
|     } else if (strncmp (row, "aal", 3)==0) { | |
|       AddArrayLoad (ddMgr, operandBddArray, operandBddArraySize, &varInfo); | |
|     } else if (strncmp (row, "cl", 2)==0) { | |
|       BddLoadCnf (ddMgr, operandBdd, &varInfo); | |
|     } else if (strncmp (row, "cal", 3)==0) { | |
|       BddArrayLoadCnf (ddMgr, operandBddArray, operandBddArraySize, &varInfo); | |
|     } else if (strncmp (row, "hw", 2)==0) { | |
|       HeaderWrite (&varInfo); | |
|     } else if (strncmp (row, "bs", 2)==0) { | |
|       BddStore (ddMgr, operandBdd, &varInfo); | |
|     } else if (strncmp (row, "bas", 3)==0) { | |
|       BddArrayStore (ddMgr, operandBddArray, operandBddArraySize, &varInfo); | |
|     } else if (strncmp (row, "as", 2)==0) { | |
|       AddStore (ddMgr, operandBdd, &varInfo); | |
|     } else if (strncmp (row, "aas", 2)==0) { | |
|       AddArrayStore (ddMgr, operandBddArray, operandBddArraySize, &varInfo); | |
|     } else if (strncmp (row, "cs", 2)==0) { | |
|       BddStoreCnf (ddMgr, operandBdd, &varInfo); | |
|     } else if (strncmp (row, "cas", 2)==0) { | |
|       BddArrayStoreCnf (ddMgr, operandBddArray, operandBddArraySize, &varInfo); | |
|     } else if (strncmp (row, "dr", 2)==0) { | |
|       DynamicReordering (ddMgr); | |
|     } else if (strncmp (row, "quit", 4)==0) { | |
|       break; | |
|     } else { | |
|       fprintf (stderr, "Command not found: %s\n", row); | |
|     } | |
|   } | |
| 
 | |
|   /*-------------------------------- Free Memory ----------------------------*/ | |
| 
 | |
|   ManagerQuit (&ddMgr, &varInfo); | |
| 
 | |
|   DDDMP_FREE (row); | |
|   DDDMP_FREE (operandBdd); | |
|   for (i=0; i<DDDMPTEST_MAX_OPERAND; i++) { | |
|     if (operandBddArray[i] != NULL) { | |
|       DDDMP_FREE (operandBddArray[i]); | |
|     } | |
|   } | |
|   DDDMP_FREE (operandBddArray); | |
|   DDDMP_FREE (operandBddArraySize); | |
| 
 | |
|   fprintf (stdout, "End of test.\n"); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Definition of internal functions                                          */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Definition of static functions                                            */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Create a CUDD Manager with nVars variables.] | |
|    | |
|   Description  [Create a CUDD Manager with nVars variables.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static DdManager * | |
| ManagerInit ( | |
|   dddmpVarInfo_t *varInfo | |
|   ) | |
| { | |
|   DdManager *ddMgr = NULL; | |
|   int nVars; | |
| 
 | |
|   ReadInt (DDDMP_MESSAGE_MANAGER_VAR, &nVars); | |
| 
 | |
|   /*----------------------- Init Var Information Structure ------------------*/ | |
| 
 | |
|   varInfo->nDdVars = nVars; | |
| 
 | |
|   varInfo->rootNames = NULL; | |
|   varInfo->ddType = DDDMP_NONE; | |
|   varInfo->nVars = (-1); | |
|   varInfo->nSuppVars = (-1); | |
|   varInfo->varNamesFlagUpdate = 1; | |
|   varInfo->suppVarNames = NULL; | |
|   varInfo->orderedVarNames = NULL; | |
|   varInfo->varIdsFlagUpdate = 1; | |
|   varInfo->varIds = NULL; | |
|   varInfo->varIdsAll = NULL; | |
|   varInfo->varComposeIdsFlagUpdate = 1; | |
|   varInfo->varComposeIds = NULL; | |
|   varInfo->varComposeIdsAll = NULL; | |
|   varInfo->varAuxIdsFlagUpdate = 1; | |
|   varInfo->varAuxIds = NULL; | |
|   varInfo->varAuxIdsAll = NULL; | |
|   varInfo->nRoots = (-1); | |
| 
 | |
|   /*------------------------------ Init DD Manager --------------------------*/ | |
| 
 | |
|   ddMgr = Cudd_Init (nVars, 0, CUDD_UNIQUE_SLOTS, | |
|     CUDD_CACHE_SLOTS, 0); | |
| 
 | |
|   Dddmp_CheckAndReturn (ddMgr==NULL, "DdManager NOT inizializated."); | |
| 
 | |
|   return (ddMgr); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Quit a CUDD Manager.] | |
|    | |
|   Description  [Quit a CUDD Manager.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static void | |
| ManagerQuit ( | |
|   DdManager **ddMgrPtr      /* IN: CUDD Manager */, | |
|   dddmpVarInfo_t *varInfo   /* IN: Internal Manager */ | |
|   ) | |
| { | |
|   if (*ddMgrPtr == NULL) { | |
|     return; | |
|   } | |
| 
 | |
|   fprintf (stdout, "Quitting CUDD Manager.\n"); | |
|   Cudd_Quit (*ddMgrPtr); | |
|   *ddMgrPtr = NULL; | |
| 
 | |
|   DddmpStrArrayFree (varInfo->rootNames, varInfo->nRoots); | |
|   DddmpStrArrayFree (varInfo->suppVarNames, varInfo->nSuppVars); | |
|   DddmpStrArrayFree (varInfo->orderedVarNames, varInfo->nVars); | |
|   DDDMP_FREE (varInfo->varIds); | |
|   DDDMP_FREE (varInfo->varIdsAll); | |
|   DDDMP_FREE (varInfo->varComposeIds); | |
|   DDDMP_FREE (varInfo->varComposeIdsAll); | |
|   DDDMP_FREE (varInfo->varAuxIds); | |
|   DDDMP_FREE (varInfo->varAuxIdsAll); | |
| 
 | |
|   varInfo->nDdVars = (-1); | |
|   varInfo->rootNames = NULL; | |
|   varInfo->ddType = DDDMP_NONE; | |
|   varInfo->nVars = (-1); | |
|   varInfo->nSuppVars = (-1); | |
|   varInfo->varNamesFlagUpdate = 1; | |
|   varInfo->suppVarNames = NULL; | |
|   varInfo->orderedVarNames = NULL; | |
|   varInfo->varIdsFlagUpdate = 1; | |
|   varInfo->varIds = NULL; | |
|   varInfo->varIdsAll = NULL; | |
|   varInfo->varComposeIdsFlagUpdate = 1; | |
|   varInfo->varComposeIds = NULL; | |
|   varInfo->varComposeIdsAll = NULL; | |
|   varInfo->varAuxIdsFlagUpdate = 1; | |
|   varInfo->varAuxIds = NULL; | |
|   varInfo->varAuxIdsAll = NULL; | |
|   varInfo->nRoots = (-1); | |
| 
 | |
|   return; | |
| } | |
|                                                                         | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Create a One-BDD Leaf.] | |
|    | |
|   Description  [Create a One-BDD Leaf.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| OneCreate( | |
|   DdManager *ddMgr      /* IN: CUDD Manager */, | |
|   DdNode **operandBdd   /* In/OUT: Array of operand */ | |
|   ) | |
| { | |
|   int i; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadInt (DDDMP_MESSAGE_BDD, &i); | |
| 
 | |
|   operandBdd[i] = Cudd_ReadOne (ddMgr); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Create a Zero-BDD Leaf.] | |
|    | |
|   Description  [Create a Zero-BDD Leaf.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| BddZeroCreate( | |
|   DdManager *ddMgr      /* IN: CUDD Manager */, | |
|   DdNode **operandBdd   /* IN/OUT: array of operand */ | |
|   ) | |
| { | |
|   int i; | |
|   DdNode *one = NULL; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadInt (DDDMP_MESSAGE_BDD, &i); | |
| 
 | |
|   one = Cudd_ReadOne(ddMgr); | |
|   operandBdd[i] = Cudd_Not(one); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Create a One-Node BDD.] | |
|    | |
|   Description  [Create a One-Node BDD.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| LeafCreate( | |
|   DdManager *ddMgr      /* IN: CUDD Manager */, | |
|   DdNode **operandBdd   /* IN/OUT: Array of operandBdd */ | |
|   ) | |
| { | |
|   int i, j; | |
|   DdNode *f = NULL; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadInt (DDDMP_MESSAGE_BDD, &i); | |
|   ReadInt (DDDMP_MESSAGE_INDEX, &j); | |
| 
 | |
|   f = Cudd_bddIthVar (ddMgr, j); | |
|   Cudd_Ref(f); | |
|   operandBdd[i] = f; | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|   | |
|   Synopsis     [Create a BDD.] | |
|    | |
|   Description  [Create a BDD: Variable index and number of cubes selection.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| BddCreate ( | |
|   DdManager *ddMgr      /* IN: CUDD Manager */, | |
|   DdNode **operandBdd   /* array of operandBdd */ | |
|   ) | |
| { | |
|   DdNode **vet, *f, *g, *h; | |
|   int nb, nv, vi0, vi1, nc, i, j; | |
|   char row[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadInt (DDDMP_MESSAGE_BDD, &nb); | |
| 
 | |
|   fprintf (stdout, "Variables Index [n-m] (m-n = number of variables): "); | |
|   fgets (row, DDDMPTEST_MAX_STRING_LENGTH, stdin); | |
|   sscanf (row, "%d-%d", &vi0, &vi1); | |
|   nv = vi1-vi0+1; | |
| 
 | |
|   ReadInt (DDDMP_MESSAGE_CUBE, &nc); | |
| 
 | |
|   /* Leaf Creation */ | |
|   vet = DDDMP_ALLOC (DdNode *, nv); | |
|   for (i=0; i<nv; i++) { | |
|      vet[i] = Cudd_bddIthVar (ddMgr, vi0+i); | |
|   } | |
| 
 | |
|   /* Cubes and BDD creation */ | |
|   f = Cudd_Not (Cudd_ReadOne (ddMgr)); | |
|   for (i=0; i<nc; i++) | |
|     { | |
|     g = Cudd_ReadOne (ddMgr); | |
|     for (j=0; j<nv; j++) | |
|       { | |
|       if ( ((float) rand())/((float) RAND_MAX) > 0.5 ) { | |
|         h = Cudd_bddAnd (ddMgr, g, vet[j]); | |
|       } else { | |
|         h = Cudd_bddAnd (ddMgr, g, Cudd_Not (vet[j])); | |
|       } | |
|       Cudd_Ref (h); | |
|       Cudd_RecursiveDeref (ddMgr, g); | |
|       g = h; | |
|       } | |
|     h = Cudd_bddOr (ddMgr, f, g); | |
|     Cudd_Ref (h); | |
|     Cudd_RecursiveDeref (ddMgr, f); | |
|     Cudd_RecursiveDeref (ddMgr, g); | |
|     f = h; | |
|     } | |
|        | |
|   operandBdd[nb] = f; | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Transform a BDD from the ASCII to the Binary format].] | |
|    | |
|   Description  [Input and Output file selection.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| A2B( | |
|   void | |
| ) | |
| { | |
|   fprintf (stderr, "Not yet Implemented!!!\n"); | |
| 
 | |
|   return (DDDMP_FAILURE); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Transform a BDD from the Binary to the ASCII format].] | |
|    | |
|   Description  [Input and Output file selection.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| B2A( | |
|   void | |
| ) | |
| { | |
|   fprintf (stderr, "Not yet Implemented!!!\n"); | |
| 
 | |
|   return (DDDMP_FAILURE); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Read the Header of a file containing a BDD.] | |
|    | |
|   Description  [File name Selection.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| HeaderLoadBdd ( | |
|   dddmpVarInfo_t *varInfo      /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   Dddmp_DecompType ddType; | |
|   int retValue, nRoots, nVars, nSuppVars; | |
|   int *tmpVarIds = NULL; | |
|   int *tmpVarAuxIds = NULL; | |
|   int *tmpVarComposeIds = NULL; | |
|   char **tmpOrderedVarNames = NULL; | |
|   char **tmpSuppVarNames = NULL; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
| 
 | |
|   retValue = Dddmp_cuddHeaderLoad (&ddType, &nVars, &nSuppVars, | |
|     &tmpSuppVarNames, &tmpOrderedVarNames, &tmpVarIds, &tmpVarComposeIds, | |
|     &tmpVarAuxIds, &nRoots, fileName, NULL); | |
| 
 | |
|   if (retValue == DDDMP_FAILURE) { | |
|     return (DDDMP_FAILURE); | |
|   } | |
| 
 | |
|   /*---------------------------- Tail Operations ----------------------------*/ | |
| 
 | |
|   CompleteInfoStruct (ddType, nVars, nSuppVars, | |
|     tmpSuppVarNames, tmpOrderedVarNames, tmpVarIds, tmpVarComposeIds, | |
|     tmpVarAuxIds, nRoots, varInfo); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Read the Header of a file containing a CNF formula.] | |
|    | |
|   Description  [File name Selection.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| HeaderLoadCnf ( | |
|   dddmpVarInfo_t *varInfo      /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   int retValue, nRoots, nVars, nSuppVars; | |
|   int *tmpVarIds = NULL; | |
|   int *tmpVarComposeIds = NULL; | |
|   int *tmpVarAuxIds = NULL; | |
|   char **tmpOrderedVarNames = NULL; | |
|   char **tmpSuppVarNames = NULL; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
| 
 | |
|   retValue = Dddmp_cuddHeaderLoadCnf (&nVars, &nSuppVars, | |
|    &tmpSuppVarNames, &tmpOrderedVarNames, &tmpVarIds, &tmpVarComposeIds, | |
|    &tmpVarAuxIds, &nRoots, fileName, NULL); | |
| 
 | |
|   if (retValue == DDDMP_FAILURE) { | |
|     return (DDDMP_FAILURE); | |
|   } | |
| 
 | |
|   /*---------------------------- Tail Operations ----------------------------*/ | |
| 
 | |
|   CompleteInfoStruct (DDDMP_CNF, nVars, nSuppVars, | |
|     tmpSuppVarNames, tmpOrderedVarNames, tmpVarIds, tmpVarComposeIds, | |
|     tmpVarAuxIds, nRoots, varInfo); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Read the Header of a filke containing a BDD.] | |
|    | |
|   Description  [File name Selection.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| HeaderWrite( | |
|   dddmpVarInfo_t *varInfo      /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   int i; | |
| 
 | |
|   switch (varInfo->ddType) { | |
|     case DDDMP_BDD: | |
|       fprintf (stdout, "DD TYPE: DDDMP_BDD\n"); | |
|       break; | |
|     case DDDMP_ADD: | |
|       fprintf (stdout, "DD TYPE: DDDMP_ADD\n"); | |
|       break; | |
|     case DDDMP_CNF: | |
|       fprintf (stdout, "DD TYPE: DDDMP_CNF\n"); | |
|       break; | |
|     case DDDMP_NONE: | |
|       fprintf (stdout, "DD TYPE: NONE - Error\n"); | |
|       break; | |
|   } | |
| 
 | |
|   fprintf (stdout, "Number of variables: %d\n", varInfo->nVars); | |
|   fprintf (stdout, "Number of support variables: %d\n", varInfo->nSuppVars); | |
| 
 | |
|   if (varInfo->suppVarNames != NULL) { | |
|     fprintf (stdout, "suppVarNames: "); | |
|     for (i=0; i<varInfo->nSuppVars; i++) { | |
|       if (varInfo->suppVarNames[i] != NULL) { | |
|         fprintf (stdout, "%s ", varInfo->suppVarNames[i]); | |
|       } | |
|     } | |
|     fprintf (stdout, "\n"); | |
|   } | |
| 
 | |
|   if (varInfo->orderedVarNames != NULL) { | |
|     fprintf (stdout, "orderedVarNames: "); | |
|     for (i=0; i<varInfo->nVars; i++) { | |
|       if (varInfo->orderedVarNames[i] != NULL) { | |
|         fprintf (stdout, "%s ", varInfo->orderedVarNames[i]); | |
|       } | |
|     } | |
|     fprintf (stdout, "\n"); | |
|   } | |
| 
 | |
|   if (varInfo->varIds != NULL) { | |
|     fprintf (stdout, "varIds: "); | |
|     for (i=0; i<varInfo->nSuppVars; i++) { | |
|       fprintf (stdout, "%d ", varInfo->varIds[i]); | |
|     } | |
|     fprintf (stdout, "\n"); | |
|   } | |
| 
 | |
|   if (varInfo->varIdsAll != NULL) { | |
|     fprintf (stdout, "varIds for ALL Manager Variables: "); | |
|     for (i=0; i<varInfo->nVars; i++) { | |
|       fprintf (stdout, "%d ", varInfo->varIdsAll[i]); | |
|     } | |
|     fprintf (stdout, "\n"); | |
|   } | |
| 
 | |
|   if (varInfo->varComposeIds != NULL) { | |
|     fprintf (stdout, "varComposeIds: "); | |
|     for (i=0; i<varInfo->nSuppVars; i++) { | |
|       fprintf (stdout, "%d ", varInfo->varComposeIds[i]); | |
|     } | |
|     fprintf (stdout, "\n"); | |
|   } | |
| 
 | |
|   if (varInfo->varComposeIdsAll != NULL) { | |
|     fprintf (stdout, "varComposeIds for ALL Manager Variables: "); | |
|     for (i=0; i<varInfo->nVars; i++) { | |
|       fprintf (stdout, "%d ", varInfo->varComposeIdsAll[i]); | |
|     } | |
|     fprintf (stdout, "\n"); | |
|   } | |
| 
 | |
|   if (varInfo->varAuxIds != NULL) { | |
|     fprintf (stdout, "varAuxIds: "); | |
|     for (i=0; i<varInfo->nSuppVars; i++) { | |
|       fprintf (stdout, "%d ", varInfo->varAuxIds[i]); | |
|     } | |
|     fprintf (stdout, "\n"); | |
|   } | |
| 
 | |
|   if (varInfo->varAuxIdsAll != NULL) { | |
|     fprintf (stdout, "varAuxIds for ALL Manager Variables: "); | |
|     for (i=0; i<varInfo->nVars; i++) { | |
|       fprintf (stdout, "%d ", varInfo->varAuxIdsAll[i]); | |
|     } | |
|     fprintf (stdout, "\n"); | |
|   } | |
| 
 | |
|   fprintf (stdout, "Number of roots: %d\n", varInfo->nRoots); | |
| 
 | |
|   fflush (stdout); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|    | |
|   Synopsis     [Print the Help messages.]  | |
|    | |
|   Description  [Print the Help messages.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| Help( | |
|   void | |
|   ) | |
| { | |
|   fprintf (stdout, "Commands:\n"); | |
|   fprintf (stdout, "MAIN\n"); | |
| 
 | |
|   fprintf (stdout, "\thelp : Print this set of messages.\n"); | |
|   fprintf (stdout, "\tquit : Quit the test program.\n"); | |
| 
 | |
|   fprintf (stdout, "MANAGER OPERATIONs\n"); | |
| 
 | |
|   fprintf (stdout, | |
|     "\thmi  : Manager Init (To do BEFORE any BDD/ADD operation).\n"); | |
|   fprintf (stdout, "\thmq  : Manager Quit.\n"); | |
| 
 | |
|   fprintf (stdout, "LOAD\n"); | |
| 
 | |
|   fprintf (stdout, "\thlb  : Load the header from a BDD/ADD file.\n"); | |
|   fprintf (stdout, "\thlc  : Load the header from a CNF file.\n"); | |
|   fprintf (stdout, "\tbl   : Load a BDD from a file.\n"); | |
|   fprintf (stdout, "\tbal  : Load an Array-BDD from a file.\n"); | |
|   fprintf (stdout, "\tal   : Load an ADD from a file.\n"); | |
|   fprintf (stdout, "\taal  : Load an Array-ADD from a file.\n"); | |
|   fprintf (stdout, "\tcl   : Load a CNF Formula from a file.\n"); | |
|   fprintf (stdout, "\tcal  : Load an Array of CNF Formulas from a file.\n"); | |
| 
 | |
|   fprintf (stdout, "STORE\n"); | |
| 
 | |
|   fprintf (stdout, | |
|     "\thw   : (Header) Write variable information on stdout.\n"); | |
|   fprintf (stdout, "\tbs   : Store a BDD into a file.\n"); | |
|   fprintf (stdout, "\tbas  : Store an Array-BDD from a file.\n"); | |
|   fprintf (stdout, "\tas   : Store an ADD into a file.\n"); | |
|   fprintf (stdout, "\taas  : Store an Array-ADD into a file.\n"); | |
|   fprintf (stdout, "\tcs   : Store BDD as a CNF formula.\n"); | |
|   fprintf (stdout, "\tcas  : Store and Array of BDDs as a CNF formula.\n"); | |
| 
 | |
|   fprintf (stdout, "MISC\n"); | |
| 
 | |
|   fprintf (stdout, "\tdr   : Activate Dynamic Reordering.\n"); | |
|   fprintf (stdout, "\tonl  : Load the order from a file (varNames).\n"); | |
|   fprintf (stdout, "\toil  : Load the order from a file (varAuxIds).\n"); | |
|   fprintf (stdout, "\tcil  : Load compose IDs from a file.\n"); | |
|   fprintf (stdout, "\tslm  : Set Load matchmode for variables.\n"); | |
|   fprintf (stdout, | |
|     "\top   : Operation (or, and, xor, not, =) between BDDs.\n"); | |
|   fprintf (stdout, "\toc   : Create a terminal-one BDD.\n"); | |
|   fprintf (stdout, "\tzc   : Create a terminal-zero BDD.\n"); | |
|   fprintf (stdout, "\tlc   : Create a single variable BDD (1 node).\n"); | |
|   fprintf (stdout, "\tbc   : Create a random BDD.\n"); | |
| 
 | |
|   fprintf (stdout, "NOT YET IMPLEMENTED\n"); | |
| 
 | |
|   fprintf (stdout, | |
|     "\ta2b  : Convert a file from the ASCII format to the binary one.\n"); | |
|   fprintf (stdout, | |
|     "\tb2a  : Convert a file from the binary format to the ASCII one.\n"); | |
| 
 | |
|   fprintf (stdout, "HINT\n"); | |
| 
 | |
|   fprintf (stdout, | |
|     "  Command 'mi' has to be the first instruction to build:\n"); | |
|   fprintf (stdout, "  a) The CUDD manager.\n"); | |
|   fprintf (stdout, | |
|     "  b) The internal manager (containing name and variable IDs).\n"); | |
|   fprintf (stdout, | |
|     "  After that load an header file with 'hlb' or 'hlc' to have proper\n"); | |
|   fprintf (stdout, | |
|     "  names and ids for each subsequent load/store operation.\n"); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Load the BDD order from a file (varNames).]  | |
|    | |
|   Description  [Load the BDD order from a file (varNames). | |
|     Force the orderedVarNames field of the varInfo structure, | |
|     i.e., the local manager, to be stucked to this array of values. | |
|     ] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| OrderNamesLoad( | |
|   dddmpVarInfo_t *varInfo      /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   FILE *fp = NULL; | |
|   int i; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
|   char tmpBuf[DDDMPTEST_MAX_STRING_LENGTH]; | |
|   char tmpName[DDDMPTEST_MAX_STRING_LENGTH]; | |
|   char **tmpOrderedVarNames = NULL; | |
| 
 | |
|   /*-------------------------  Red New Var Names Array ----------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
| 
 | |
|   fp = fopen (fileName, "r"); | |
|   Dddmp_CheckAndReturn (fp==NULL, "Cannot open file."); | |
| 
 | |
|   varoutinfo = DDDMP_VARNAMES; | |
|   tmpOrderedVarNames = DDDMP_ALLOC (char *, varInfo->nDdVars); | |
| 
 | |
|   i=0; | |
|   while (fgets (tmpBuf, DDDMPTEST_MAX_STRING_LENGTH, fp)!=NULL) { | |
|     if (tmpBuf[0]=='#') { | |
|       continue; | |
|     } | |
| 
 | |
|     if (i>=varInfo->nDdVars) { | |
|       fprintf (stdout, | |
|         "Number of variables in files higher than DD manager vars (%d)\n", | |
|         varInfo->nDdVars); | |
|       fprintf (stdout, "Exceeding variables ignored\n"); | |
|       fprintf (stdout, | |
|         "You might increase the DDDMPTEST_MAX_VARIABLE constant\n"); | |
|       break; | |
|     } | |
| 
 | |
|     sscanf (tmpBuf, "%s", tmpName); | |
|     tmpOrderedVarNames[i] = DDDMP_ALLOC (char, (strlen (tmpName) + 1)); | |
|     if (tmpOrderedVarNames[i]==NULL) { | |
|       fprintf (stdout, "Error allocating memory\n"); | |
|     } else { | |
|       strcpy (tmpOrderedVarNames[i], tmpName); | |
|     } | |
|     i++; | |
|   } | |
| 
 | |
|   for ( ;i<varInfo->nDdVars; i++) { | |
|     tmpOrderedVarNames[i] = NULL; | |
|   } | |
| 
 | |
|   fclose(fp); | |
| 
 | |
|   /*----------------------- Free and Set Var Names Array --------------------*/ | |
| 
 | |
|   DddmpStrArrayFree (varInfo->orderedVarNames, varInfo->nVars); | |
|   varInfo->orderedVarNames = tmpOrderedVarNames; | |
|   varInfo->nVars = varInfo->nDdVars; | |
| 
 | |
|   /* DO NOT ALLOW FURTHER UPDATES */ | |
|   varInfo->varNamesFlagUpdate = 0; | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Load the BDD order from a file (varauxids).]  | |
|    | |
|   Description  [Load the BDD order from a file (varauxids). | |
|     Force the | |
|     varAuxIds and varAuxIdsAll | |
|     or the | |
|     varComposeIds and varComposeIdsAll | |
|     fields of the varInfo structure, i.e., the local manager, to be | |
|     stucked to this array of values. | |
|     ] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| IntArrayLoad ( | |
|   dddmpVarInfo_t *varInfo      /* IN/OUT: Variable Information */, | |
|   const char *mode | |
|   ) | |
| { | |
|   FILE *fp = NULL; | |
|   int i; | |
|   int *tmpArray1 = NULL; | |
|   int *tmpArray2 = NULL; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
|   char buf[DDDMPTEST_MAX_STRING_LENGTH]; | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
| 
 | |
|   fp = fopen(fileName, "r"); | |
|   Dddmp_CheckAndReturn (fp==NULL, "Cannot open file."); | |
| 
 | |
|   tmpArray1 = DDDMP_ALLOC (int, varInfo->nDdVars); | |
|   tmpArray2 = DDDMP_ALLOC (int, varInfo->nDdVars); | |
|   Dddmp_CheckAndReturn (tmpArray1==NULL, "Error allocating memory."); | |
|   Dddmp_CheckAndReturn (tmpArray2==NULL, "Error allocating memory."); | |
| 
 | |
|   i=0; | |
|   while (fgets(buf, DDDMPTEST_MAX_STRING_LENGTH, fp)!=NULL) { | |
|     if (buf[0]=='#') { | |
|       continue; | |
|     } | |
|     if (i>=varInfo->nDdVars) { | |
|       fprintf (stdout, | |
|         "Number of variables in files higher than DD manager vars (%d)\n", | |
|         varInfo->nDdVars); | |
|       fprintf (stdout, "Exceeding variables ignored.\n"); | |
|       fprintf (stdout, "(Increase the DDDMPTEST_MAX_VARIABLE constant.)\n"); | |
|       break; | |
|     } | |
|     sscanf(buf, "%d", &tmpArray1[i]); | |
|     sscanf(buf, "%d", &tmpArray2[i++]); | |
|   } | |
| 
 | |
|   for (;i<varInfo->nDdVars;i++) { | |
|     tmpArray1[i]= -1; | |
|     tmpArray2[i]= -1; | |
|   } | |
| 
 | |
|   fclose(fp); | |
| 
 | |
|   if (strcmp (mode, "oil") == 0) { | |
|     varInfo->varAuxIds = tmpArray1; | |
|     varInfo->varAuxIdsAll = tmpArray2; | |
| 
 | |
|     /* DO NOT ALLOW FURTHER UPDATES */ | |
|     varInfo->varAuxIdsFlagUpdate = 0; | |
|   } else { | |
|     if (strcmp (mode, "cil") == 0) { | |
|       varInfo->varComposeIds = tmpArray1; | |
|       varInfo->varComposeIdsAll = tmpArray2; | |
| 
 | |
|       /* DO NOT ALLOW FURTHER UPDATES */ | |
|       varInfo->varComposeIdsFlagUpdate = 0; | |
|     } | |
|   } | |
| 
 | |
|   varInfo->nVars = varInfo->nDdVars; | |
|   varInfo->nSuppVars = varInfo->nDdVars; | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Load a BDD from a file.] | |
|    | |
|   Description  [Load a BDD from a file.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| BddLoad ( | |
|   DdManager *ddMgr         /* IN: CUDD Manager */, | |
|   DdNode **operandBdd      /* IN: Operand BDD */, | |
|   dddmpVarInfo_t *varInfo  /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   DdNode *f = NULL; | |
|   int i; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
|   ReadInt (DDDMP_MESSAGE_BDD, &i); | |
|    | |
|   /*-------------------------------- Load BDD -------------------------------*/ | |
| 
 | |
|   fprintf (stdout, "Loading %s ...\n", fileName); | |
| 
 | |
|   f = Dddmp_cuddBddLoad (ddMgr, varmatchmode, varInfo->orderedVarNames, | |
|     varInfo->varIdsAll, varInfo->varComposeIdsAll, DDDMP_MODE_DEFAULT, | |
|     fileName, NULL); | |
| 
 | |
|   if (f==NULL) { | |
|     fprintf (stderr, "Dddmp Test Error : %s is not loaded from file\n", | |
|       fileName); | |
|   } else { | |
|     operandBdd[i] = f; | |
|   } | |
| 
 | |
|   /*---------------------------- Tail Operations ----------------------------*/ | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Load an array of BDDs from a file.] | |
|    | |
|   Description  [Load an array of BDDs from a file.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| BddArrayLoad( | |
|   DdManager *ddMgr            /* IN: CUDD Manager */, | |
|   DdNode ***operandBddArray   /* IN: Array of operand BDD */, | |
|   int *operandBddArraySize    /* IN: Number of ADD in the Array */, | |
|   dddmpVarInfo_t *varInfo     /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   DdNode **bddArray = NULL;   | |
|   int i, j, nRoots; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
|   ReadInt (DDDMP_MESSAGE_BDD_ARRAY, &i); | |
| 
 | |
|   /*---------------------------- Load BDDs ----------------------------------*/ | |
| 
 | |
|   nRoots = Dddmp_cuddBddArrayLoad (ddMgr, rootmatchmode, | |
|     varInfo->rootNames, varmatchmode, | |
|     varInfo->orderedVarNames, varInfo->varIdsAll, varInfo->varComposeIdsAll, | |
|     DDDMP_MODE_DEFAULT, fileName, NULL, &bddArray); | |
| 
 | |
|   Dddmp_CheckAndReturn (nRoots>DDDMP_MAX_BDDARRAY_LEN, | |
|     "DDDMP_MAX_BDDARRAY_LEN exceeded by BDD array len (increase it)."); | |
| 
 | |
|   if (nRoots<=0) { | |
|     return (DDDMP_FAILURE); | |
|   } | |
| 
 | |
|   varInfo->nRoots = nRoots; | |
|   operandBddArray[i] = DDDMP_ALLOC (DdNode *, nRoots); | |
|   Dddmp_CheckAndReturn (operandBddArray[i]==NULL, "Allocation error."); | |
| 
 | |
|   for (j=0; j<nRoots; j++) { | |
|     operandBddArray[i][j] = bddArray[j]; | |
|   } | |
|   operandBddArraySize[i] = nRoots; | |
| 
 | |
|   /*---------------------------- Tail Operations ----------------------------*/ | |
| 
 | |
|   /* free array */ | |
|   DDDMP_FREE (bddArray); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Load an ADD from a file.] | |
|    | |
|   Description  [Load an ADD from a file.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| AddLoad( | |
|   DdManager *ddMgr            /* IN: CUDD Manager */, | |
|   DdNode **operandBdd         /* IN: Operand BDD */, | |
|   dddmpVarInfo_t *varInfo     /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   DdNode *f = NULL; | |
|   int i; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
|   ReadInt (DDDMP_MESSAGE_BDD, &i); | |
| 
 | |
|   /*-------------------------------- Load ADD -------------------------------*/ | |
| 
 | |
|   fprintf (stdout, "Loading %s ...\n", fileName); | |
| 
 | |
|   f = Dddmp_cuddAddLoad (ddMgr, varmatchmode, varInfo->orderedVarNames, | |
|     varInfo->varIdsAll, varInfo->varComposeIdsAll, DDDMP_MODE_DEFAULT, | |
|     fileName, NULL); | |
| 
 | |
|   if (f==NULL) { | |
|     fprintf (stderr, "Dddmp Test Error : %s is not loaded from file\n", | |
|       fileName); | |
|   } else { | |
|     operandBdd[i] = f; | |
|   } | |
| 
 | |
|   /*---------------------------- Tail Operations ----------------------------*/ | |
| 
 | |
|   fprintf (stdout, "Load:\n"); | |
|   Cudd_PrintMinterm (ddMgr, f); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Load an array of ADDs from a file.] | |
|    | |
|   Description  [Load an array of ADDs from a file.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| AddArrayLoad( | |
|   DdManager *ddMgr            /* IN: CUDD Manager */, | |
|   DdNode ***operandBddArray   /* IN: Array of operand BDD */, | |
|   int *operandBddArraySize    /* IN: Number of ADD in the Array */, | |
|   dddmpVarInfo_t *varInfo     /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
|   int i, j, nRoots; | |
|   DdNode **bddArray = NULL; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
|   ReadInt (DDDMP_MESSAGE_BDD_ARRAY, &i); | |
| 
 | |
|   /*------------------------------- Load ADDs -------------------------------*/ | |
| 
 | |
|   nRoots = Dddmp_cuddAddArrayLoad (ddMgr, rootmatchmode, | |
|     varInfo->rootNames, varmatchmode, | |
|     varInfo->orderedVarNames, varInfo->varIdsAll, varInfo->varComposeIdsAll, | |
|     DDDMP_MODE_DEFAULT, fileName, NULL, &bddArray); | |
| 
 | |
|   Dddmp_CheckAndReturn (nRoots>DDDMP_MAX_BDDARRAY_LEN, | |
|     "DDDMP_MAX_BDDARRAY_LEN exceeded by BDD array len (increase it)."); | |
| 
 | |
|   if (nRoots<=0) { | |
|     return (DDDMP_FAILURE); | |
|   } | |
| 
 | |
|   varInfo->nRoots = nRoots; | |
|   operandBddArray[i] = DDDMP_ALLOC (DdNode *, nRoots); | |
|   Dddmp_CheckAndReturn (operandBddArray[i]==NULL, "Allocation error."); | |
| 
 | |
|   for (j=0; j<nRoots; j++) { | |
|     operandBddArray[i][j] = bddArray[j]; | |
|   } | |
|   operandBddArraySize[i] = nRoots; | |
| 
 | |
|   /*---------------------------- Tail Operations ----------------------------*/ | |
| 
 | |
|   /* Free array */ | |
|   DDDMP_FREE (bddArray); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Load a CNF formula from a file, and create a BDD.] | |
|    | |
|   Description  [Load a CNF formula from a file, and create a BDD.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| BddLoadCnf ( | |
|   DdManager *ddMgr            /* IN: CUDD Manager */, | |
|   DdNode **operandBdd         /* IN: Operand BDD */, | |
|   dddmpVarInfo_t *varInfo     /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   DdNode **rootsPtr = NULL; | |
|   Dddmp_DecompCnfLoadType loadingMode = DDDMP_CNF_MODE_CONJ_QUANT; | |
|   int i, retValue, nRoots; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
|   ReadInt (DDDMP_MESSAGE_BDD, &i); | |
|    | |
|   /*------------------------------- Load BDDs -------------------------------*/ | |
| 
 | |
|   fprintf (stdout, "Loading %s ...\n", fileName); | |
| 
 | |
|   retValue = Dddmp_cuddBddLoadCnf (ddMgr, varmatchmode, | |
|     varInfo->orderedVarNames, varInfo->varAuxIdsAll, varInfo->varComposeIdsAll, | |
|     loadingMode, fileName, NULL, &rootsPtr, &nRoots); | |
| 
 | |
|   Dddmp_CheckAndGotoLabel (retValue==DDDMP_FAILURE, | |
|     "Dddmp Test: Load From File Error.\n", failure); | |
| 
 | |
|   operandBdd[i] = rootsPtr[0]; | |
| 
 | |
|   /*---------------------------- Tail Operations ----------------------------*/ | |
| 
 | |
|   /* Free array */ | |
|   DDDMP_FREE (rootsPtr); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| 
 | |
|   failure: | |
|     return(DDDMP_FAILURE); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Load a CNF formula from a file, and create an array of | |
|     BDDs. | |
|   ] | |
|  | |
|   Description  [Load a CNF formula from a file, and create an array of | |
|     BDDs. | |
|   ] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| BddArrayLoadCnf ( | |
|   DdManager *ddMgr            /* IN: CUDD Manager */, | |
|   DdNode ***operandBddArray   /* IN: Array of operand BDD */, | |
|   int *operandBddArraySize    /* IN: Number of ADD in the Array */, | |
|   dddmpVarInfo_t *varInfo     /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   DdNode **rootsPtr = NULL; | |
|   Dddmp_DecompCnfLoadType loadingMode = DDDMP_CNF_MODE_CONJ_QUANT; | |
|   int i, j, nRoots, retValue; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
|   ReadInt (DDDMP_MESSAGE_BDD_ARRAY, &i); | |
| 
 | |
|   /*--------------------------- Loading BDDs --------------------------------*/ | |
| 
 | |
|   retValue = Dddmp_cuddBddArrayLoadCnf (ddMgr, rootmatchmode, | |
|     varInfo->rootNames, varmatchmode, | |
|     varInfo->orderedVarNames, varInfo->varIdsAll, varInfo->varComposeIdsAll, | |
|     loadingMode, fileName, NULL, &rootsPtr, &nRoots); | |
| 
 | |
|   Dddmp_CheckAndReturn (nRoots>DDDMP_MAX_BDDARRAY_LEN, | |
|     "DDDMP_MAX_BDDARRAY_LEN exceeded by BDD array len (increase it)."); | |
| 
 | |
|   if (nRoots<=0) { | |
|     return (DDDMP_FAILURE); | |
|   } | |
| 
 | |
|   varInfo->nRoots = nRoots; | |
|   operandBddArray[i] = DDDMP_ALLOC (DdNode *, nRoots); | |
|   Dddmp_CheckAndReturn (operandBddArray[i]==NULL, "Allocation error."); | |
| 
 | |
|   for (j=0; j<nRoots; j++) { | |
|     operandBddArray[i][j] = rootsPtr[j]; | |
|   } | |
|   operandBddArraySize[i] = nRoots; | |
| 
 | |
|   /*---------------------------- Tail Operations ----------------------------*/ | |
| 
 | |
|   /* Free array */ | |
|   DDDMP_FREE (rootsPtr); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Perform an Operation among BDDs.] | |
|    | |
|   Description  [Perform an Operation among BDDs.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| Operation( | |
|   DdManager *ddMgr      /* IN: CUDD Manager */, | |
|   DdNode **operandBdd   /* IN: Array of operandBdd */ | |
|   ) | |
| { | |
|   DdNode *f, *g, *h; | |
|   char buf[DDDMPTEST_MAX_STRING_LENGTH]; | |
|   int i; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_OP, buf); | |
|   ReadInt (DDDMP_MESSAGE_SOURCE1, &i); | |
| 
 | |
|   f = operandBdd[i]; | |
| 
 | |
|   /*-------------------------- Compute Operation ----------------------------*/ | |
| 
 | |
|   if ((strcmp(buf, "or")==0)|| (strcmp(buf, "OR")==0)) { | |
|     ReadInt (DDDMP_MESSAGE_SOURCE2, &i); | |
|     g = operandBdd[i]; | |
|     h = Cudd_bddOr(ddMgr, f, g); | |
|     Cudd_RecursiveDeref(ddMgr, f); | |
|     Cudd_Ref(h); | |
|     Cudd_RecursiveDeref(ddMgr, g); | |
|   } else if ((strcmp(buf, "and")==0) || (strcmp(buf, "AND")==0)) { | |
|       ReadInt (DDDMP_MESSAGE_SOURCE2, &i); | |
|       g = operandBdd[i]; | |
|       h = Cudd_bddAnd(ddMgr, f, g); | |
|       Cudd_Ref(h); | |
|       Cudd_RecursiveDeref(ddMgr, f); | |
|       Cudd_RecursiveDeref(ddMgr, g); | |
|   } else if ((strcmp(buf, "xor")==0) || (strcmp(buf, "XOR")==0)) { | |
|       ReadInt (DDDMP_MESSAGE_SOURCE2, &i); | |
|       g = operandBdd[i]; | |
|       h = Cudd_bddXor(ddMgr, f, g); | |
|       Cudd_Ref(h); | |
|       Cudd_RecursiveDeref(ddMgr, f); | |
|       Cudd_RecursiveDeref(ddMgr, g); | |
|   } else if (strcmp(buf, "!")==0) { | |
|       h = Cudd_Not(f); | |
|       Cudd_Ref(h); | |
|       Cudd_RecursiveDeref(ddMgr, f); | |
|   } else if ((strcmp(buf, "buf")==0)|| (strcmp(buf, "BUF")==0)) { | |
|       h = f; | |
|   } else { | |
|       fprintf (stderr, "Dddmp Test Error : Operation %s unknown\n", buf); | |
|       h = NULL; | |
|   } | |
| 
 | |
|   ReadInt (DDDMP_MESSAGE_DESTINATION, &i); | |
| 
 | |
|   operandBdd[i] = h; | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Store a BDD in a file.] | |
|    | |
|   Description  [Store a BDD in a file.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| BddStore ( | |
|   DdManager *ddMgr            /* IN: CUDD Manager */, | |
|   DdNode **operandBdd         /* IN: Operand BDD */, | |
|   dddmpVarInfo_t *varInfo     /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   DdNode *f = NULL; | |
|   int i, retValue; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
|   ReadInt (DDDMP_MESSAGE_BDD, &i); | |
| 
 | |
|   fprintf (stdout, "Storing %s ...\n", fileName); | |
|   fflush (stdout); | |
|   f = operandBdd[i]; | |
| 
 | |
|   /*----------------------------- Store BDDs -------------------------------*/ | |
| 
 | |
|   retValue = Dddmp_cuddBddStore(ddMgr, NULL, f, varInfo->orderedVarNames, | |
|     varInfo->varAuxIdsAll, DDDMP_MODE_TEXT, varoutinfo, fileName, NULL); | |
| 
 | |
|   Dddmp_CheckAndGotoLabel (retValue!=DDDMP_SUCCESS, "BDD NOT stored.", | |
|     failure); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| 
 | |
|   failure: | |
|     return(DDDMP_FAILURE); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Store an Array of BDD in a file.] | |
|    | |
|   Description  [Store an Array of BDD in a file.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| BddArrayStore ( | |
|   DdManager *ddMgr            /* IN: CUDD Manager */, | |
|   DdNode ***operandBddArray   /* IN: Array of operand BDD */, | |
|   int *operandBddArraySize    /* IN: Number of ADD in the Array */, | |
|   dddmpVarInfo_t *varInfo     /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   int i, retValue, nRoots; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
|   ReadInt (DDDMP_MESSAGE_BDD_ARRAY, &i); | |
| 
 | |
|   nRoots = operandBddArraySize[i]; | |
| 
 | |
|   /*----------------------------- Store BDDs -------------------------------*/ | |
| 
 | |
|   fprintf (stdout, "Storing Array of BDDs in file %s ...\n", fileName); | |
|   fflush (stdout); | |
| 
 | |
|   retValue = Dddmp_cuddBddArrayStore (ddMgr, NULL, nRoots, operandBddArray[i], | |
|     NULL, varInfo->orderedVarNames, varInfo->varAuxIdsAll, DDDMP_MODE_TEXT, | |
|     DDDMP_VARIDS, fileName, NULL); | |
| 
 | |
|   Dddmp_CheckAndGotoLabel (retValue!=DDDMP_SUCCESS, "BDD NOT stored.", | |
|     failure); | |
|   fprintf (stdout, "done.\n"); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| 
 | |
|   failure: | |
|     return(DDDMP_FAILURE); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Store an ADD in a file.] | |
|    | |
|   Description  [Store an ADD in a file.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| AddStore( | |
|   DdManager *ddMgr            /* IN: CUDD Manager */, | |
|   DdNode **operandBdd         /* IN: operand Bdd */, | |
|   dddmpVarInfo_t *varInfo     /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   DdNode *f; | |
|   int i, retValue; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
|   ReadInt (DDDMP_MESSAGE_BDD, &i); | |
| 
 | |
|   fprintf (stdout, "Storing %s ...\n", fileName); | |
|   fflush (stdout); | |
|   f = operandBdd[i]; | |
| 
 | |
| #if 0 | |
|   /* StQ Patch - CREATE temporary ADD to Store */ | |
|   f = Cudd_addResidue (ddMgr, 4, 3, 1, 1); | |
|   fprintf (stderr, "Store:\n"); | |
|   Cudd_PrintMinterm (ddMgr, f); | |
|   /* end ... StQ Patch */ | |
| #endif | |
|  | |
|   retValue = Dddmp_cuddAddStore (ddMgr, NULL, f, varInfo->orderedVarNames, | |
|     varInfo->varAuxIdsAll, DDDMP_MODE_TEXT, varoutinfo, fileName, NULL); | |
| 
 | |
|   Dddmp_CheckAndReturn (retValue!=DDDMP_SUCCESS, "BDD NOT stored."); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Store a BDD in a file.] | |
|    | |
|   Description  [Store a BDD in a file.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| AddArrayStore ( | |
|   DdManager *ddMgr            /* IN: CUDD Manager */, | |
|   DdNode ***operandBddArray   /* IN: Array of operand ADD */, | |
|   int *operandBddArraySize    /* IN: Number of ADD in the Array */, | |
|   dddmpVarInfo_t *varInfo | |
|   ) | |
| { | |
|   int i, retValue, nRoots; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
|   ReadInt (DDDMP_MESSAGE_BDD_ARRAY, &i); | |
| 
 | |
|   nRoots = operandBddArraySize[i]; | |
| 
 | |
|   fprintf (stdout, "Storing Array of BDDs in file %s ...\n", fileName); | |
|   fflush (stdout); | |
| 
 | |
|   retValue = Dddmp_cuddAddArrayStore (ddMgr, NULL, nRoots, operandBddArray[i], | |
|     NULL, varInfo->orderedVarNames, varInfo->varAuxIdsAll, DDDMP_MODE_TEXT, | |
|     DDDMP_VARIDS, fileName, NULL); | |
| 
 | |
|   Dddmp_CheckAndReturn (retValue!=DDDMP_SUCCESS, "BDD NOT stored."); | |
| 
 | |
|   fprintf (stdout, "done.\n"); | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Store a BDD as CNF format in a file.] | |
|    | |
|   Description  [Store a BDD as CNF format in a file.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| BddStoreCnf( | |
|   DdManager *ddMgr            /* IN: CUDD Manager */, | |
|   DdNode **operandBdd         /* IN: Array of operand ADD */, | |
|   dddmpVarInfo_t *varInfo     /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   DdNode *f = NULL; | |
|   Dddmp_DecompCnfStoreType storingMode = DDDMP_CNF_MODE_BEST; | |
|   int noHeader = 0; | |
|   int i, nVars, retValue, idInitial, varNewN, clauseNewN; | |
|   int edgeInTh = (-1); | |
|   int pathLengthTh = (-1); | |
|   int *tmpBddIds = NULL; | |
|   int *tmpCnfIds = NULL; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
|   char row[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
|   ReadInt (DDDMP_MESSAGE_BDD, &i); | |
|   ReadString (DDDMP_MESSAGE_FORMAT, row); | |
| 
 | |
|   switch (row[0]) { | |
|     case 'N': | |
|       storingMode = DDDMP_CNF_MODE_NODE; | |
|       break; | |
|     case 'M': | |
|       storingMode = DDDMP_CNF_MODE_MAXTERM; | |
|       break; | |
|     case 'B': | |
|       storingMode = DDDMP_CNF_MODE_BEST; | |
|       ReadInt (DDDMP_MESSAGE_EDGE_MAX, &edgeInTh); | |
|       ReadInt (DDDMP_MESSAGE_LENGHT_MAX, &pathLengthTh); | |
|       break; | |
|   } | |
|   ReadInt (DDDMP_MESSAGE_I_ID, &idInitial); | |
| 
 | |
|   fprintf (stdout, "Storing %s ...\n", fileName); | |
|   fflush (stdout); | |
| 
 | |
|   f = operandBdd[i]; | |
| 
 | |
|   nVars = varInfo->nDdVars; | |
| 
 | |
|   /*------------ From BDD and CNF ids to Proper Array of ids ----------------*/ | |
| 
 | |
|   tmpBddIds = DDDMP_ALLOC (int, nVars); | |
|   Dddmp_CheckAndGotoLabel (tmpBddIds==NULL, "Error allocating memory.", | |
|     failure); | |
|   tmpCnfIds = DDDMP_ALLOC (int, nVars); | |
|   Dddmp_CheckAndGotoLabel (tmpBddIds==NULL, "Error allocating memory.", | |
|     failure); | |
| 
 | |
|   for (i=0; i<nVars; i++) { | |
|     tmpBddIds[i] = i; | |
|     tmpCnfIds[i] = i+1; | |
|   } | |
| 
 | |
|   retValue = Dddmp_cuddBddStoreCnf (ddMgr, f, storingMode, noHeader, | |
|     varInfo->orderedVarNames, tmpBddIds, NULL, tmpCnfIds, idInitial, | |
|     edgeInTh, pathLengthTh, fileName, NULL, &clauseNewN, &varNewN); | |
| 
 | |
|   Dddmp_CheckAndGotoLabel (retValue!=DDDMP_SUCCESS, "BDD NOT stored.", | |
|     failure); | |
| 
 | |
|   fprintf (stdout, "Number of Clauses Stored = %d\n", clauseNewN); | |
|   fprintf (stdout, "Number of New Variable Created Storing = %d\n", | |
|     varNewN); | |
|   fflush (stdout); | |
| 
 | |
|   DDDMP_FREE (tmpBddIds); | |
|   DDDMP_FREE (tmpCnfIds); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| 
 | |
|   failure: | |
|     DDDMP_FREE (tmpBddIds); | |
|     DDDMP_FREE (tmpCnfIds); | |
| 
 | |
|     return(DDDMP_FAILURE); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Store a BDD as CNF format in a file.] | |
|    | |
|   Description  [Store a BDD as CNF format in a file.] | |
|    | |
|   SideEffects  [] | |
|    | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| BddArrayStoreCnf( | |
|   DdManager *ddMgr            /* IN: CUDD Manager */, | |
|   DdNode ***operandBddArray   /* IN: Array of operand ADD */, | |
|   int *operandBddArraySize    /* IN: Number of ADD in the Array */, | |
|   dddmpVarInfo_t *varInfo     /* IN/OUT: Variable Information */ | |
|   ) | |
| { | |
|   Dddmp_DecompCnfStoreType storingMode = DDDMP_CNF_MODE_BEST; | |
|   int noHeader = 0; | |
|   int i, nVars, bddN, retValue, idInitial, varNewN, clauseNewN; | |
|   int edgeInTh = (-1); | |
|   int pathLengthTh = (-1); | |
|   int *tmpBddIds = NULL; | |
|   int *tmpCnfIds = NULL; | |
|   char fileName[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
|   char row[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadString (DDDMP_MESSAGE_FILE, fileName); | |
|   ReadInt (DDDMP_MESSAGE_BDD_ARRAY, &bddN); | |
|   ReadString (DDDMP_MESSAGE_FORMAT, row); | |
|   switch (row[0]) { | |
|     case 'N': | |
|       storingMode = DDDMP_CNF_MODE_NODE; | |
|       break; | |
|     case 'M': | |
|       storingMode = DDDMP_CNF_MODE_MAXTERM; | |
|       break; | |
|     case 'B': | |
|       storingMode = DDDMP_CNF_MODE_BEST; | |
|       ReadInt (DDDMP_MESSAGE_EDGE_MAX, &edgeInTh); | |
|       ReadInt (DDDMP_MESSAGE_LENGHT_MAX, &pathLengthTh); | |
|       break; | |
|   } | |
|   ReadInt (DDDMP_MESSAGE_I_ID, &idInitial); | |
| 
 | |
|   nVars = varInfo->nDdVars; | |
| 
 | |
|   /*------------ From BDD and CNF ids to Proper Array of ids ----------------*/ | |
| 
 | |
|   tmpBddIds = DDDMP_ALLOC (int, nVars); | |
|   Dddmp_CheckAndReturn (tmpBddIds==NULL, "Allocation error."); | |
|   tmpCnfIds = DDDMP_ALLOC (int, nVars); | |
|   Dddmp_CheckAndReturn (tmpCnfIds==NULL, "Allocation error."); | |
| 
 | |
|   for (i=0; i<nVars; i++) { | |
|     tmpBddIds[i] = i; | |
|     tmpCnfIds[i] = i*10+1; | |
|   } | |
| 
 | |
|   fprintf (stdout, "Storing %s ...\n", fileName); | |
|   fflush (stdout); | |
| 
 | |
|   retValue = Dddmp_cuddBddArrayStoreCnf (ddMgr, operandBddArray[bddN], | |
|     operandBddArraySize[bddN], storingMode, noHeader, varInfo->orderedVarNames, | |
|     tmpBddIds, NULL, tmpCnfIds, idInitial, edgeInTh, pathLengthTh, fileName, | |
|     NULL, &varNewN, &clauseNewN); | |
| 
 | |
|   Dddmp_CheckAndGotoLabel (retValue!=DDDMP_SUCCESS, "BDD NOT stored.", | |
|     failure); | |
| 
 | |
|   fprintf (stdout, "Number of Clauses Stored = %d\n", clauseNewN); | |
|   fprintf (stdout, "Number of New Variable Created Storing = %d\n", | |
|     varNewN); | |
|   fflush (stdout); | |
| 
 | |
|   DDDMP_FREE (tmpBddIds); | |
|   DDDMP_FREE (tmpCnfIds); | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| 
 | |
|   failure: | |
|     DDDMP_FREE (tmpBddIds); | |
|     DDDMP_FREE (tmpCnfIds); | |
| 
 | |
|     return(DDDMP_FAILURE); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Dynamic Reordering BDDs.] | |
|  | |
|   Description  [Dynamic Reordering BDDs using one of the allowed CUDD | |
|     methods.] | |
|  | |
|   SideEffects  [] | |
|  | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| DynamicReordering ( | |
|   DdManager *ddMgr            /* IN: CUDD Manager */ | |
|   ) | |
| { | |
|   Cudd_ReorderingType approach = CUDD_REORDER_SIFT; | |
|   int method; | |
| 
 | |
|   /*------------------------ Read Operation Operands ------------------------*/ | |
| 
 | |
|   ReadInt (DDDMP_MESSAGE_REORDERING, &method); | |
|   approach = (Cudd_ReorderingType) method; | |
| 
 | |
|   Cudd_ReduceHeap (ddMgr, approach, 5); | |
|    | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Selects variable matching mode.] | |
|  | |
|   Description  [Selects variable matching mode.] | |
|  | |
|   SideEffects  [] | |
|  | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| SetLoadMatchmode ( | |
|   ) | |
| { | |
|   int sel; | |
|   char row[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   fprintf (stdout, "Variable matchmode:\n"); | |
|   fprintf (stdout, "Match IDs                                (1)\n"); | |
|   fprintf (stdout, "Match permIDs                            (2)\n"); | |
|   fprintf (stdout, "Match names      (must have been loaded) (3)\n"); | |
|   fprintf (stdout, "Match auxids     (must have been loaded) (4)\n"); | |
|   fprintf (stdout, "Match composeids (must have been loaded) (5)\n"); | |
|   fprintf (stdout, "Your choice: "); | |
|   fflush (stdout); | |
| 
 | |
|   fgets (row, DDDMPTEST_MAX_STRING_LENGTH, stdin); | |
|   sscanf (row, "%d", &sel); | |
| 
 | |
|   switch (sel) { | |
|     case 1: | |
|       varmatchmode = DDDMP_VAR_MATCHIDS; | |
|       break; | |
|     case 2: | |
|       varmatchmode = DDDMP_VAR_MATCHPERMIDS; | |
|       break; | |
|     case 3: | |
|       varmatchmode = DDDMP_VAR_MATCHNAMES; | |
|       break; | |
|     case 4: | |
|       varmatchmode = DDDMP_VAR_MATCHAUXIDS; | |
|       break; | |
|     case 5: | |
|       varmatchmode = DDDMP_VAR_COMPOSEIDS; | |
|       break; | |
|     default: | |
|       fprintf (stderr, "Wrong choice!\n"); | |
|       break; | |
|   } | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Complete the internal manager structure for subsequent | |
|     BDD/ADD/CNF operations. | |
|   ] | |
|  | |
|   Description  [Complete the internal manager structure for subsequent | |
|     BDD/ADD/CNF operations. | |
|     The phylosophy is simple: to have proper names and ids it is necessary | |
|     to load an header before each actual load/store operation. | |
|     An header load should initialize variable names, variable ids, | |
|     variable compose ids, and variable auxiliary ids for all variables | |
|     stored in the file. | |
|     This information has to be extended for all variables in the | |
|     *current* CUDD manager (before any store operation). | |
|     CompleteInfoStruct does this job. | |
|     Arrays varIds, varComposeIds, and varAuxIds contain information for | |
|     all the variable in the BDD/ADD/CNF while arrays varIdsAll, | |
|     varComposeIdsAll, and varAuxIdsAll contain information for *all* | |
|     variable in the current CUDD manager. | |
|   ] | |
|  | |
|  | |
|   SideEffects  [] | |
|  | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| CompleteInfoStruct ( | |
|   Dddmp_DecompType ddType  /* IN: selects the proper decomp type */, | |
|   int nVars                /* IN: number of DD variables */, | |
|   int nSuppVars            /* IN: number of support variables */, | |
|   char **suppVarNames      /* IN: array of support variable names */, | |
|   char **orderedVarNames   /* IN: array of variable names */, | |
|   int *varIds              /* IN: array of variable ids */, | |
|   int *varComposeIds       /* IN: array of permids ids */, | |
|   int *varAuxIds           /* IN: array of variable aux ids */, | |
|   int nRoots               /* IN: number of root in the file */, | |
|   dddmpVarInfo_t *varInfo  /* IN: Variable Information */ | |
|   ) | |
| { | |
|   int i; | |
|   char tmpString[DDDMPTEST_MAX_STRING_LENGTH]; | |
| 
 | |
|   /*------------------------- Updates Variable Names ------------------------*/ | |
| 
 | |
|   DddmpStrArrayFree (varInfo->suppVarNames, varInfo->nSuppVars); | |
|   varInfo->suppVarNames = suppVarNames; | |
| 
 | |
|   if (varInfo->varNamesFlagUpdate == 1) { | |
| 
 | |
|     DddmpStrArrayFree (varInfo->orderedVarNames, varInfo->nVars); | |
| 
 | |
|     if (orderedVarNames != NULL) { | |
|       varInfo->orderedVarNames = orderedVarNames; | |
|     } else { | |
|       varInfo->orderedVarNames = DDDMP_ALLOC (char *, nVars); | |
|       Dddmp_CheckAndReturn (varInfo->orderedVarNames==NULL, | |
|         "Allocation error."); | |
| 
 | |
|       for (i=0; i<nVars; i++) { | |
|         varInfo->orderedVarNames[i] = NULL; | |
|       } | |
| 
 | |
|       if (varInfo->suppVarNames != NULL) { | |
|         for (i=0; i<nSuppVars; i++) { | |
|           varInfo->orderedVarNames[i] = DDDMP_ALLOC (char, | |
|             (strlen (varInfo->suppVarNames[i]) + 1)); | |
|           strcpy (varInfo->orderedVarNames[i], varInfo->suppVarNames[i]); | |
|         } | |
|       } | |
|   | |
|       for (i=0; i<nVars; i++) { | |
|         if (varInfo->orderedVarNames[i] == NULL) { | |
|           sprintf (tmpString, "DUMMY%d", i); | |
|           varInfo->orderedVarNames[i] = DDDMP_ALLOC (char, | |
|             (strlen (tmpString) + 1)); | |
|           strcpy (varInfo->orderedVarNames[i], tmpString); | |
|         } | |
|       } | |
|     } | |
|   } | |
| 
 | |
|   /*------------------------------ Updates IDs ------------------------------*/ | |
| 
 | |
|   DDDMP_FREE (varInfo->varIds); | |
|   varInfo->varIds = varIds; | |
| 
 | |
|   if (varInfo->varIdsFlagUpdate == 1) { | |
| 
 | |
|     /* Free Previously Allocated Memory */ | |
|     DDDMP_FREE (varInfo->varIdsAll); | |
| 
 | |
|     /* Allocate New Memory and Check */ | |
|     varInfo->varIdsAll = DDDMP_ALLOC (int, nVars); | |
|     Dddmp_CheckAndReturn (varInfo->varIdsAll==NULL, "Allocation error."); | |
| 
 | |
|     /* Set New Values */ | |
|     for (i=0; i<nVars; i++) { | |
|       varInfo->varIdsAll[i] = (-1); | |
|     } | |
| 
 | |
|     if (varInfo->varIds != NULL) { | |
|       for (i=0; i<nSuppVars; i++) { | |
|         varInfo->varIdsAll[varInfo->varIds[i]] = varInfo->varIds[i]; | |
|       } | |
|     } | |
|   } | |
| 
 | |
| 
 | |
|   /*-------------------------- Updates Compose IDs --------------------------*/ | |
| 
 | |
|   DDDMP_FREE (varInfo->varComposeIds); | |
|   varInfo->varComposeIds = varComposeIds; | |
| 
 | |
|   if (varInfo->varComposeIdsFlagUpdate == 1) { | |
| 
 | |
|     /* Free Previously Allocated Memory */ | |
|     DDDMP_FREE (varInfo->varComposeIdsAll); | |
| 
 | |
|     /* Allocate New Memory and Check */ | |
|     varInfo->varComposeIdsAll = DDDMP_ALLOC (int, nVars); | |
|     Dddmp_CheckAndReturn (varInfo->varComposeIdsAll==NULL, | |
|       "Allocation error."); | |
| 
 | |
|     /* Set New Values */ | |
|     for (i=0; i<nVars; i++) { | |
|       varInfo->varComposeIdsAll[i] = (-1); | |
|     } | |
| 
 | |
|     if (varInfo->varComposeIds != NULL) { | |
|       for (i=0; i<nSuppVars; i++) { | |
|         varInfo->varComposeIdsAll[varInfo->varIds[i]] = | |
|           varInfo->varComposeIds[i]; | |
|       } | |
|     } | |
|   } | |
| 
 | |
|   /*------------------------- Updates Auxiliary IDs -------------------------*/ | |
| 
 | |
|   DDDMP_FREE (varInfo->varAuxIds); | |
|   varInfo->varAuxIds = varAuxIds; | |
| 
 | |
|   if (varInfo->varAuxIdsFlagUpdate == 1) { | |
| 
 | |
|     /* Free Previously Allocated Memory */ | |
|     DDDMP_FREE (varInfo->varAuxIdsAll); | |
| 
 | |
|     /* Allocate New Memory and Check */ | |
|     varInfo->varAuxIdsAll = DDDMP_ALLOC (int, nVars); | |
|     Dddmp_CheckAndReturn (varInfo->varAuxIdsAll==NULL, "Allocation error."); | |
| 
 | |
|     /* Set New Values */ | |
|     for (i=0; i<nVars; i++) { | |
|       varInfo->varAuxIdsAll[i] = (-1); | |
|     } | |
| 
 | |
|     if (varInfo->varAuxIds != NULL) { | |
|       for (i=0; i<nSuppVars; i++) { | |
|         varInfo->varAuxIdsAll[varInfo->varIds[i]] = varInfo->varAuxIds[i]; | |
|       } | |
|     } | |
|   } | |
| 
 | |
|   /*----------------------------- Updates Sizes -----------------------------*/ | |
| 
 | |
|   varInfo->ddType = ddType; | |
|   varInfo->nVars = nVars; | |
|   varInfo->nSuppVars = nSuppVars; | |
|   Dddmp_CheckAndReturn (varInfo->nDdVars<varInfo->nVars, | |
|     "Local Manager with Not Enough Variables."); | |
|   varInfo->nRoots = nRoots; | |
| 
 | |
|   return (DDDMP_SUCCESS); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Reads an integer value from standard input.] | |
|  | |
|   Description  [Reads an integer value from standard input.] | |
|  | |
|   SideEffects  [] | |
|  | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static void | |
| ReadInt ( | |
|   Dddmp_MessageType message, | |
|   int *i | |
|   ) | |
| { | |
|   char row[DDDMPTEST_MAX_FILENAME_LENGTH]; | |
| 
 | |
|   switch (message) { | |
|     case DDDMP_MESSAGE_MANAGER_VAR: | |
|       fprintf (stdout, "Number of Variables: "); | |
|       break; | |
|     case DDDMP_MESSAGE_BDD: | |
|       fprintf (stdout, "Which BDDs [0..%d]: ", | |
|         DDDMPTEST_MAX_OPERAND-1); | |
|       break; | |
|     case DDDMP_MESSAGE_BDD_ARRAY: | |
|       fprintf (stdout, "Which Array of BDDs [0..%d]: ", | |
|         DDDMPTEST_MAX_OPERAND-1); | |
|       break; | |
|     case DDDMP_MESSAGE_CUBE: | |
|       fprintf (stdout, "How many cubes [1..]: "); | |
|       break; | |
|     case DDDMP_MESSAGE_INDEX: | |
|       fprintf (stdout, "Index: "); | |
|       break; | |
|     case DDDMP_MESSAGE_SOURCE1: | |
|       fprintf (stdout, "Source1 [0..%d]: ", DDDMPTEST_MAX_OPERAND-1); | |
|       break; | |
|     case DDDMP_MESSAGE_SOURCE2: | |
|       fprintf (stdout, "Source2 [0..%d]: ", DDDMPTEST_MAX_OPERAND-1); | |
|       break; | |
|     case DDDMP_MESSAGE_DESTINATION: | |
|       fprintf (stdout, "Destination [0..%d]: ", DDDMPTEST_MAX_OPERAND-1); | |
|       break; | |
|     case DDDMP_MESSAGE_I_ID: | |
|       fprintf (stdout, "Initial ID : "); | |
|       break; | |
|     case DDDMP_MESSAGE_EDGE_MAX: | |
|       fprintf (stdout, | |
|         "Max Number of Edges (Insert cut-point from there on) : "); | |
|       break; | |
|      case DDDMP_MESSAGE_LENGHT_MAX: | |
|       fprintf (stdout, | |
|         "Max BDD-Path Length (Insert cut-point from there on) : "); | |
|       break; | |
|     case DDDMP_MESSAGE_REORDERING: | |
|       fprintf (stdout, "Reordering Approach (1..17): "); | |
|       break; | |
|     default: | |
|       fprintf (stdout, "Input Generic Integer: "); | |
|       break; | |
|   } | |
|   fflush (stdout); | |
| 
 | |
|   fgets (row, DDDMPTEST_MAX_STRING_LENGTH, stdin); | |
|   sscanf (row, "%d", i); | |
|   fflush (stdin); | |
| 
 | |
|   return; | |
| } | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis     [Reads a string from standard input.] | |
|  | |
|   Description  [Reads a string from standard input.] | |
|  | |
|   SideEffects  [] | |
|  | |
|   SeeAlso      [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static void | |
| ReadString ( | |
|   Dddmp_MessageType message, | |
|   char string[] | |
|   ) | |
| { | |
|   char localString[DDDMPTEST_MAX_STRING_LENGTH]; | |
| 
 | |
|   switch (message) { | |
|     case DDDMP_MESSAGE_PROMPT: | |
|       fprintf (stdout, "TestDddmp> "); | |
|       break; | |
|     case DDDMP_MESSAGE_FILE: | |
|       fprintf (stdout, "File : "); | |
|       break; | |
|     case DDDMP_MESSAGE_OP: | |
|       fprintf (stdout, "Operation [or,and,xor,!,buf(=)] : "); | |
|       break; | |
|     case DDDMP_MESSAGE_FORMAT: | |
|       fprintf (stdout, "Format (Node=N, Maxterm=M, Best=B) : "); | |
|       break; | |
|     default: | |
|       fprintf (stdout, "Input Generic String : "); | |
|       break; | |
|   } | |
|   fflush (stdout); | |
| 
 | |
|   fgets (localString, DDDMPTEST_MAX_STRING_LENGTH, stdin); | |
|   sscanf (localString, "%s", string); | |
|   fflush (stdin); | |
| 
 | |
|   return; | |
| } | |
| 
 | |
| 
 | |
| 
 | |
| 
 |