#include "calInt.h"
Go to the source code of this file.
Defines | |
#define | MAGIC_COOKIE 0x5e02f795l |
#define | CAL_BDD_IOERROR 100 |
#define | TRUE_ENCODING 0xffffff00l |
#define | FALSE_ENCODING 0xffffff01l |
#define | POSVAR_ENCODING 0xffffff02l |
#define | NEGVAR_ENCODING 0xffffff03l |
#define | POSNODE_ENCODING 0xffffff04l |
#define | NEGNODE_ENCODING 0xffffff05l |
#define | NODELABEL_ENCODING 0xffffff06l |
#define | CONSTANT_ENCODING 0xffffff07l |
Functions | |
static void | Write (Cal_BddManager_t *bddManager, unsigned long n, int bytes, FILE *fp) |
static void | BddDumpBddStep (Cal_BddManager_t *bddManager, Cal_Bdd_t f, FILE *fp, CalHashTable_t *h, Cal_BddIndex_t *normalizedIndexes, int indexSize, int nodeNumberSize) |
static unsigned long | Read (int *error, int bytes, FILE *fp) |
static Cal_Bdd_t | BddUndumpBddStep (Cal_BddManager_t *bddManager, Cal_Bdd_t *vars, FILE *fp, Cal_BddIndex_t numberVars, Cal_Bdd_t *shared, long numberShared, long *sharedSoFar, int indexSize, int nodeNumberSize, int *error) |
static int | BytesNeeded (long n) |
Cal_Bdd | Cal_BddUndumpBdd (Cal_BddManager bddManager, Cal_Bdd *userVars, FILE *fp, int *error) |
int | Cal_BddDumpBdd (Cal_BddManager bddManager, Cal_Bdd fUserBdd, Cal_Bdd *userVars, FILE *fp) |
Variables | |
static long | indexMask [] = {0xffl, 0xffffl, 0xffffffl} |
#define MAGIC_COOKIE 0x5e02f795l |
CFile***********************************************************************
FileName [calDump.c]
PackageName [cal]
Synopsis [BDD library dump/undump routines]
Description [ ]
SeeAlso [optional]
Author [Jagesh Sanghavi (sanghavi@eecs.berkeley.edu) Rajeev Ranjan (rajeev@eecs.berkeley.edu) Originally written by David Long. ]
Copyright [Copyright (c) 1994-1996 The Regents of the Univ. of California. All rights reserved.
Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose, provided that the above copyright notice and the following two paragraphs appear in all copies of this software.
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.]
Revision [
]
static void BddDumpBddStep | ( | Cal_BddManager_t * | bddManager, | |
Cal_Bdd_t | f, | |||
FILE * | fp, | |||
CalHashTable_t * | h, | |||
Cal_BddIndex_t * | normalizedIndexes, | |||
int | indexSize, | |||
int | nodeNumberSize | |||
) | [static] |
Function********************************************************************
Synopsis []
Description [optional]
SideEffects [required]
SeeAlso [optional]
Definition at line 342 of file calDump.c.
00350 { 00351 int negated; 00352 long *number; 00353 Cal_Bdd_t thenBdd, elseBdd; 00354 00355 switch(CalBddTypeAux(bddManager, f)){ 00356 case CAL_BDD_TYPE_ZERO: 00357 Write(bddManager, FALSE_ENCODING, indexSize+1, fp); 00358 break; 00359 case CAL_BDD_TYPE_ONE: 00360 Write(bddManager, TRUE_ENCODING, indexSize+1, fp); 00361 break; 00362 case CAL_BDD_TYPE_CONSTANT: 00363 Write(bddManager, CONSTANT_ENCODING, indexSize+1, fp); 00364 #ifdef JAGESH 00365 Write(bddManager, (unsigned long)BDD_DATA(f)[0], sizeof(long), fp); 00366 Write(bddManager, (unsigned long)BDD_DATA(f)[1], sizeof(long), fp); 00367 #endif 00368 break; 00369 case CAL_BDD_TYPE_POSVAR: 00370 Write(bddManager, POSVAR_ENCODING, indexSize+1, fp); 00371 Write(bddManager, 00372 (unsigned long)normalizedIndexes[CalBddGetBddIndex(bddManager, f)], 00373 indexSize, fp); 00374 break; 00375 case CAL_BDD_TYPE_NEGVAR: 00376 Write(bddManager, NEGVAR_ENCODING, indexSize+1, fp); 00377 Write(bddManager, 00378 (unsigned long)normalizedIndexes[CalBddGetBddIndex(bddManager, f)], 00379 indexSize, fp); 00380 break; 00381 case CAL_BDD_TYPE_NONTERMINAL: 00382 CalBddNot(f, f); 00383 if(CalHashTableOneLookup(h, f, (char **)0)){ 00384 negated = 1; 00385 } 00386 else{ 00387 CalBddNot(f, f); 00388 negated = 0; 00389 } 00390 CalHashTableOneLookup(h, f, (char **)&number); 00391 if(number && *number < 0){ 00392 if(negated) 00393 Write(bddManager, NEGNODE_ENCODING, indexSize+1, fp); 00394 else 00395 Write(bddManager, POSNODE_ENCODING, indexSize+1, fp); 00396 Write(bddManager, (unsigned long)(-*number-1), nodeNumberSize, fp); 00397 } 00398 else{ 00399 if(number){ 00400 Write(bddManager, NODELABEL_ENCODING, indexSize+1, fp); 00401 *number = -*number-1; 00402 } 00403 Write(bddManager, 00404 (unsigned long)normalizedIndexes[CalBddGetBddIndex(bddManager, f)], 00405 indexSize, fp); 00406 CalBddGetThenBdd(f, thenBdd); 00407 BddDumpBddStep(bddManager, thenBdd, fp, h, normalizedIndexes, 00408 indexSize, nodeNumberSize); 00409 CalBddGetElseBdd(f, elseBdd); 00410 BddDumpBddStep(bddManager, elseBdd, fp, h, normalizedIndexes, 00411 indexSize, nodeNumberSize); 00412 } 00413 break; 00414 default: 00415 CalBddFatalMessage("BddDumpBddStep: unknown type returned by CalBddType"); 00416 } 00417 }
static Cal_Bdd_t BddUndumpBddStep | ( | Cal_BddManager_t * | bddManager, | |
Cal_Bdd_t * | vars, | |||
FILE * | fp, | |||
Cal_BddIndex_t | numberVars, | |||
Cal_Bdd_t * | shared, | |||
long | numberShared, | |||
long * | sharedSoFar, | |||
int | indexSize, | |||
int | nodeNumberSize, | |||
int * | error | |||
) | [static] |
Function********************************************************************
Synopsis []
Description [optional]
SideEffects [required]
SeeAlso [optional]
Definition at line 477 of file calDump.c.
00488 { 00489 long nodeNumber; 00490 long encoding; 00491 Cal_BddIndex_t i; 00492 CalAddress_t value1, value2; 00493 Cal_Bdd_t v; 00494 Cal_Bdd_t temp1, temp2; 00495 Cal_Bdd_t result; 00496 00497 i = Read(error, indexSize, fp); 00498 if(*error){ 00499 return CalBddNull(bddManager); 00500 } 00501 if(i == indexMask[indexSize-1]){ 00502 encoding = 0xffffff00l+Read(error, 1, fp); 00503 if(*error){ 00504 return CalBddNull(bddManager); 00505 } 00506 switch(encoding){ 00507 case TRUE_ENCODING: 00508 return (CalBddOne(bddManager)); 00509 case FALSE_ENCODING: 00510 return (CalBddZero(bddManager)); 00511 case CONSTANT_ENCODING: 00512 value1 = Read(error, sizeof(long), fp); 00513 value2 = Read(error, sizeof(long), fp); 00514 if(*error){ 00515 return CalBddNull(bddManager); 00516 } 00517 *error = CAL_BDD_UNDUMP_OVERFLOW; 00518 return CalBddNull(bddManager); 00519 case POSVAR_ENCODING: 00520 case NEGVAR_ENCODING: 00521 i = Read(error, indexSize, fp); 00522 if(!*error && i >= numberVars){ 00523 *error = CAL_BDD_UNDUMP_FORMAT; 00524 } 00525 if(*error){ 00526 return CalBddNull(bddManager); 00527 } 00528 v = vars[i]; 00529 if(encoding == POSVAR_ENCODING){ 00530 return (v); 00531 } 00532 else{ 00533 CalBddNot(v, v); 00534 return (v); 00535 } 00536 case POSNODE_ENCODING: 00537 case NEGNODE_ENCODING: 00538 nodeNumber = Read(error, nodeNumberSize, fp); 00539 if(!*error && (nodeNumber >= numberShared || 00540 CalBddIsBddNull(bddManager, shared[nodeNumber]))){ 00541 *error = CAL_BDD_UNDUMP_FORMAT; 00542 } 00543 if(*error){ 00544 return CalBddNull(bddManager); 00545 } 00546 v = shared[nodeNumber]; 00547 v = CalBddIdentity(bddManager, v); 00548 if(encoding == POSNODE_ENCODING){ 00549 return (v); 00550 } 00551 else{ 00552 CalBddNot(v, v); 00553 return (v); 00554 } 00555 case NODELABEL_ENCODING: 00556 nodeNumber = *sharedSoFar; 00557 ++*sharedSoFar; 00558 v = BddUndumpBddStep(bddManager, vars, fp, numberVars, shared, 00559 numberShared, sharedSoFar, indexSize, nodeNumberSize, error); 00560 shared[nodeNumber] = v; 00561 v = CalBddIdentity(bddManager, v); 00562 return (v); 00563 default: 00564 *error = CAL_BDD_UNDUMP_FORMAT; 00565 return CalBddNull(bddManager); 00566 } 00567 } 00568 if(i >= numberVars){ 00569 *error = CAL_BDD_UNDUMP_FORMAT; 00570 return CalBddNull(bddManager); 00571 } 00572 temp1 = BddUndumpBddStep(bddManager, vars, fp, numberVars, shared, 00573 numberShared, sharedSoFar, indexSize, nodeNumberSize, error); 00574 temp2 = BddUndumpBddStep(bddManager, vars, fp, numberVars, shared, 00575 numberShared, sharedSoFar, indexSize, nodeNumberSize, error); 00576 if(*error){ 00577 CalBddFree(temp1); 00578 return CalBddNull(bddManager); 00579 } 00580 result = CalBddITE(bddManager, vars[i], temp1, temp2); 00581 CalBddFree(temp1); 00582 CalBddFree(temp2); 00583 if(CalBddIsBddNull(bddManager, result)){ 00584 *error = CAL_BDD_UNDUMP_OVERFLOW; 00585 } 00586 return (result); 00587 }
static int BytesNeeded | ( | long | n | ) | [static] |
Function********************************************************************
Synopsis []
Description [optional]
SideEffects [required]
SeeAlso [optional]
int Cal_BddDumpBdd | ( | Cal_BddManager | bddManager, | |
Cal_Bdd | fUserBdd, | |||
Cal_Bdd * | userVars, | |||
FILE * | fp | |||
) |
Function********************************************************************
Synopsis [Write a BDD to a file]
Description [Writes an encoded description of the BDD to the file given by fp. The argument vars should be a null-terminated array of variables that include the support of f . These variables need not be in order of increasing index. The function returns a nonzero value if f was written to the file successfully. ]
SideEffects [required]
SeeAlso [optional]
Definition at line 229 of file calDump.c.
00234 { 00235 long i; 00236 Cal_BddIndex_t *normalizedIndexes; 00237 Cal_BddIndex_t vIndex; 00238 Cal_Bdd_t f; 00239 Cal_BddIndex_t numberVars; 00240 Cal_Bdd *support; 00241 int ok; 00242 CalHashTable_t *h; 00243 int indexSize; 00244 long next; 00245 int nodeNumberSize; 00246 00247 if(CalBddPreProcessing(bddManager, 1, fUserBdd)){ 00248 f = CalBddGetInternalBdd(bddManager, fUserBdd); 00249 for(i = 0; userVars[i]; ++i){ 00250 if(Cal_BddType(bddManager, userVars[i]) != CAL_BDD_TYPE_POSVAR){ 00251 CalBddWarningMessage("Cal_BddDumpBdd: support is not all positive variables"); 00252 return (0); 00253 } 00254 } 00255 normalizedIndexes = Cal_MemAlloc(Cal_BddIndex_t, bddManager->numVars); 00256 for(i = 0; i < bddManager->numVars; ++i){ 00257 normalizedIndexes[i] = CAL_BDD_CONST_INDEX; 00258 } 00259 for(i = 0; userVars[i]; ++i){ 00260 vIndex = Cal_BddGetIfIndex(bddManager, userVars[i]); 00261 if(normalizedIndexes[vIndex] != CAL_BDD_CONST_INDEX){ 00262 CalBddWarningMessage("Cal_BddDumpBdd: variables duplicated in support"); 00263 Cal_MemFree(normalizedIndexes); 00264 return 0; 00265 } 00266 normalizedIndexes[vIndex] = i; 00267 } 00268 numberVars = i; 00269 support = Cal_MemAlloc(Cal_Bdd, bddManager->numVars+1); 00270 Cal_BddSupport(bddManager, fUserBdd, support); 00271 ok = 1; 00272 for(i = 0; ok && support[i]; ++i){ 00273 if(normalizedIndexes[Cal_BddGetIfIndex(bddManager, support[i])] == CAL_BDD_CONST_INDEX){ 00274 CalBddWarningMessage("Cal_BddDumpBdd: incomplete support specified"); 00275 ok = 0; 00276 } 00277 } 00278 if(!ok){ 00279 Cal_MemFree(normalizedIndexes); 00280 Cal_MemFree(support); 00281 return 0; 00282 } 00283 Cal_MemFree(support); 00284 /* Everything checked now; barring I/O errors, we should be able to */ 00285 /* Write a valid output file. */ 00286 f = CalBddGetInternalBdd(bddManager, fUserBdd); 00287 h = CalHashTableOneInit(bddManager, sizeof(long)); 00288 indexSize = BytesNeeded(numberVars+1); 00289 CalBddMarkSharedNodes(bddManager, f); 00290 next = 0; 00291 CalBddNumberSharedNodes(bddManager, f, h, &next); 00292 nodeNumberSize = BytesNeeded(next); 00293 Write(bddManager, MAGIC_COOKIE, sizeof(long), fp); 00294 Write(bddManager, (unsigned long)numberVars, sizeof(Cal_BddIndex_t), fp); 00295 Write(bddManager, (unsigned long)next, sizeof(long), fp); 00296 BddDumpBddStep(bddManager, f, fp, h, normalizedIndexes, indexSize, nodeNumberSize); 00297 CalHashTableOneQuit(h); 00298 Cal_MemFree(normalizedIndexes); 00299 return (1); 00300 } 00301 return (0); 00302 }
Cal_Bdd Cal_BddUndumpBdd | ( | Cal_BddManager | bddManager, | |
Cal_Bdd * | userVars, | |||
FILE * | fp, | |||
int * | error | |||
) |
AutomaticEnd Function********************************************************************
Synopsis [Reads a BDD from a file]
Description [Loads an encoded description of a BDD from the file given by fp. The argument vars should be a null terminated array of variables that will become the support of the BDD. As in Cal_BddDumpBdd, these need not be in the order of increasing index. If the same array of variables in used in dumping and undumping, the BDD returned will be equal to the one that was dumped. More generally, if array v1 is used when dumping, and the array v2 is used when undumping, the BDD returned will be equal to the original BDD with the ith variable in v2 substituted for the ith variable in v1 for all i. Null BDD is returned in the operation fails for reason (node limit reached, I/O error, invalid file format, etc.). In this case, an error code is stored in error. the code will be one of the following. CAL_BDD_UNDUMP_FORMAT Invalid file format CAL_BDD_UNDUMP_OVERFLOW Node limit exceeded CAL_BDD_UNDUMP_IOERROR File I/O error CAL_BDD_UNDUMP_EOF Unexpected EOF]
SideEffects [required]
SeeAlso [optional]
Definition at line 121 of file calDump.c.
00126 { 00127 long i,j; 00128 Cal_BddIndex_t numberVars; 00129 long numberShared; 00130 int indexSize; 00131 int nodeNumberSize; 00132 Cal_Bdd_t *shared; 00133 long sharedSoFar; 00134 Cal_Bdd_t v; 00135 Cal_Bdd_t result; 00136 Cal_Bdd_t *vars; 00137 00138 *error = 0; 00139 for(i = 0; userVars[i]; ++i){ 00140 if(Cal_BddType(bddManager, userVars[i]) != CAL_BDD_TYPE_POSVAR){ 00141 CalBddWarningMessage("Cal_BddUndumpBdd: support is not all positive variables"); 00142 return (Cal_Bdd) 0; 00143 } 00144 } 00145 vars = Cal_MemAlloc(Cal_Bdd_t, i); 00146 for (j=0; j < i; j++){ 00147 vars[j] = CalBddGetInternalBdd(bddManager,userVars[j]); 00148 } 00149 00150 if(Read(error, sizeof(long), fp) != MAGIC_COOKIE){ 00151 if(!*error){ 00152 *error = CAL_BDD_UNDUMP_FORMAT; 00153 } 00154 Cal_MemFree(vars); 00155 return (Cal_Bdd) 0; 00156 } 00157 numberVars = Read(error, sizeof(Cal_BddIndex_t), fp); 00158 if(*error){ 00159 Cal_MemFree(vars); 00160 return (Cal_Bdd) 0; 00161 } 00162 if(numberVars != i){ 00163 *error = CAL_BDD_UNDUMP_FORMAT; 00164 Cal_MemFree(vars); 00165 return (Cal_Bdd) 0; 00166 } 00167 numberShared = Read(error, sizeof(long), fp); 00168 if(*error){ 00169 Cal_MemFree(vars); 00170 return (Cal_Bdd) 0; 00171 } 00172 indexSize = BytesNeeded(numberVars+1); 00173 nodeNumberSize = BytesNeeded(numberShared); 00174 if(numberShared < 0){ 00175 *error = CAL_BDD_UNDUMP_FORMAT; 00176 Cal_MemFree(vars); 00177 return (Cal_Bdd) 0; 00178 } 00179 shared = Cal_MemAlloc(Cal_Bdd_t, numberShared); 00180 for(i = 0; i < numberShared; ++i){ 00181 shared[i] = CalBddNull(bddManager); 00182 } 00183 sharedSoFar = 0; 00184 result = BddUndumpBddStep(bddManager, vars, fp, numberVars, shared, 00185 numberShared, &sharedSoFar, indexSize, nodeNumberSize, error); 00186 Cal_MemFree(vars); 00187 00188 for(i = 0; i < numberShared; ++i){ 00189 v = shared[i]; 00190 if(!CalBddIsBddNull(bddManager, v)){ 00191 CalBddFree(v); 00192 } 00193 } 00194 if(!*error && sharedSoFar != numberShared){ 00195 *error = CAL_BDD_UNDUMP_FORMAT; 00196 } 00197 Cal_MemFree(shared); 00198 if(*error){ 00199 if(!CalBddIsBddNull(bddManager, result)){ 00200 CalBddFree(result); 00201 } 00202 return (Cal_Bdd) 0; 00203 } 00204 /* 00205 * Decrement the reference count of result by 1. Since it has 00206 * already been incremented in BddUndumpBddStep. 00207 */ 00208 CalBddDcrRefCount(result); 00209 return CalBddGetExternalBdd(bddManager, result); 00210 }
static unsigned long Read | ( | int * | error, | |
int | bytes, | |||
FILE * | fp | |||
) | [static] |
Function********************************************************************
Synopsis []
Description [optional]
SideEffects [required]
SeeAlso [optional]
Definition at line 433 of file calDump.c.
00437 { 00438 int c; 00439 long result; 00440 00441 result = 0; 00442 if(*error){ 00443 return (result); 00444 } 00445 while(bytes){ 00446 c = fgetc(fp); 00447 if(c == EOF){ 00448 if(ferror(fp)){ 00449 *error = CAL_BDD_UNDUMP_IOERROR; 00450 } 00451 else{ 00452 *error = CAL_BDD_UNDUMP_EOF; 00453 } 00454 return (0l); 00455 } 00456 result = (result << 8)+c; 00457 --bytes; 00458 } 00459 return (result); 00460 }
static void Write | ( | Cal_BddManager_t * | bddManager, | |
unsigned long | n, | |||
int | bytes, | |||
FILE * | fp | |||
) | [static] |
AutomaticStart
Function********************************************************************
Synopsis []
Description [optional]
SideEffects [required]
SeeAlso [optional]