00001
00002
00003
00004 #if !defined(_BDDINTH)
00005 #define _BDDINTH
00006
00007
00008 #include <setjmp.h>
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #define BROKEN_CPP
00027
00028
00029
00030
00031
00032 #include "bdduser.h"
00033
00034
00035 #define ARGS(args) args
00036
00037
00038
00039
00040 typedef struct hash_table_ *hash_table;
00041
00042
00043
00044
00045 #if !defined(POWER_OF_2_SIZES)
00046 extern long bdd_primes[];
00047 #endif
00048
00049
00050
00051
00052 #define POINTER(p) ((pointer)(((INT_PTR)(p)) & ~(INT_PTR)0x7))
00053 #define BDD_POINTER(p) ((bdd)POINTER(p))
00054 #define CACHE_POINTER(p) ((cache_entry)POINTER(p))
00055
00056 #define TAG(p) ((int)(((INT_PTR)(p)) & 0x7))
00057 #define SET_TAG(p, t) ((pointer)((INT_PTR)POINTER(p) | (t)))
00058
00059 #define TAG0(p) ((int)((INT_PTR)(p) & 0x1))
00060 #define FLIP_TAG0(p) ((pointer)((INT_PTR)(p) ^ 0x1))
00061 #define TAG0_HI(p) ((pointer)((INT_PTR)(p) | 0x1))
00062 #define TAG0_LO(p) ((pointer)((INT_PTR)(p) & ~(INT_PTR)0x1))
00063
00064 #define TAG1(p) ((int)((INT_PTR)(p) & 0x2))
00065 #define FLIP_TAG1(p) ((pointer)((INT_PTR)(p) ^ 0x2))
00066 #define TAG1_HI(p) ((pointer)((INT_PTR)(p) | 0x2))
00067 #define TAG1_LO(p) ((pointer)((INT_PTR)(p) & ~(INT_PTR)0x2))
00068
00069 #define TAG2(p) ((int)((INT_PTR)(p) & 0x4))
00070 #define FLIP_TAG2(p) ((pointer)((INT_PTR)(p) ^ 0x4))
00071 #define TAG2_HI(p) ((pointer)((INT_PTR)(p) | 0x4))
00072 #define TAG2_LO(p) ((pointer)((INT_PTR)(p) & ~(INT_PTR)0x4))
00073
00074
00075
00076
00077 typedef unsigned short bdd_index_type;
00078
00079
00080
00081
00082 typedef unsigned short bdd_indexindex_type;
00083 typedef unsigned char bdd_refcount_type;
00084 typedef unsigned char bdd_mark_type;
00085
00086
00087
00088
00089 struct bdd_
00090 {
00091 bdd_indexindex_type indexindex;
00092
00093 bdd_refcount_type refs;
00094 bdd_mark_type mark;
00095 INT_PTR data[2];
00096
00097 struct bdd_ *next;
00098 };
00099
00100
00101
00102
00103 #define BDD_MAX_REFS ((bdd_refcount_type)((1l << (8*sizeof(bdd_refcount_type))) - 1))
00104 #define BDD_MAX_TEMP_REFS ((bdd_mark_type)((1l << (8*sizeof(bdd_mark_type)-1)) - 1))
00105
00106 #define BDD_GC_MARK ((bdd_mark_type)(1l << (8*sizeof(bdd_mark_type)-1)))
00107
00108
00109
00110
00111 #define BDD_CONST_INDEXINDEX 0
00112 #define BDD_MAX_INDEXINDEX ((bdd_indexindex_type)((1l << (8*sizeof(bdd_indexindex_type))) - 1))
00113 #define BDD_MAX_INDEX ((bdd_index_type)((1l << (8*sizeof(bdd_index_type))) - 1))
00114
00115
00116
00117
00118 #define CONCAT_PTR(f) f##_ptr
00119
00120 #if defined(CONCAT_PTR)
00121
00122
00123 #define BDD_SETUP(f) bdd CONCAT_PTR(f)=BDD_POINTER(f)
00124 #define BDD_RESET(f) CONCAT_PTR(f)=BDD_POINTER(f)
00125 #define BDD_INDEXINDEX(f) (CONCAT_PTR(f)->indexindex)
00126 #define BDD_DATA(f) (CONCAT_PTR(f)->data)
00127 #define BDD_DATA0(f) (CONCAT_PTR(f)->data[0])
00128 #define BDD_DATA1(f) (CONCAT_PTR(f)->data[1])
00129 #define BDD_REFS(f) (CONCAT_PTR(f)->refs)
00130 #define BDD_MARK(f) (CONCAT_PTR(f)->mark)
00131 #define BDD_TEMP_REFS(f) (CONCAT_PTR(f)->mark)
00132
00133
00134
00135
00136 #define BDD_INDEX(bddm, f) ((bddm)->indexes[BDD_INDEXINDEX(f)])
00137 #define BDD_THEN(f) ((bdd)(BDD_DATA0(f) ^ TAG0(f)))
00138 #define BDD_ELSE(f) ((bdd)(BDD_DATA1(f) ^ TAG0(f)))
00139 #define BDD_SAME_OR_NEGATIONS(f, g) (CONCAT_PTR(f) == CONCAT_PTR(g))
00140 #define BDD_IS_CONST(f) (BDD_INDEXINDEX(f) == BDD_CONST_INDEXINDEX)
00141 #else
00142
00143
00144 #define BDD_SETUP(f)
00145 #define BDD_RESET(f)
00146 #define BDD_INDEXINDEX(f) (BDD_POINTER(f)->indexindex)
00147 #define BDD_DATA(f) (BDD_POINTER(f)->data)
00148 #define BDD_DATA0(f) (BDD_POINTER(f)->data[0])
00149 #define BDD_DATA1(f) (BDD_POINTER(f)->data[1])
00150 #define BDD_REFS(f) (BDD_POINTER(f)->refs)
00151 #define BDD_MARK(f) (BDD_POINTER(f)->mark)
00152 #define BDD_TEMP_REFS(f) (BDD_POINTER(f)->mark)
00153
00154
00155
00156
00157 #define BDD_INDEX(bddm, f) ((bddm)->indexes[BDD_INDEXINDEX(f)])
00158 #define BDD_THEN(f) ((bdd)(BDD_DATA0(f) ^ TAG0(f)))
00159 #define BDD_ELSE(f) ((bdd)(BDD_DATA1(f) ^ TAG0(f)))
00160 #define BDD_SAME_OR_NEGATIONS(f, g) (BDD_POINTER(f) == BDD_POINTER(g))
00161 #define BDD_IS_CONST(f) (BDD_INDEXINDEX(f) == BDD_CONST_INDEXINDEX)
00162 #endif
00163
00164
00165
00166
00167 #define BDD_IS_OUTPOS(f) (!TAG0(f))
00168 #define BDD_OUTPOS(f) ((bdd)TAG0_LO(f))
00169 #define BDD_NOT(f) ((bdd)FLIP_TAG0(f))
00170
00171
00172
00173
00174 #define BDD_TOP_VAR2(top_indexindex, bddm, f, g)\
00175 do\
00176 if (BDD_INDEX(bddm, f) < BDD_INDEX(bddm, g))\
00177 top_indexindex=BDD_INDEXINDEX(f);\
00178 else\
00179 top_indexindex=BDD_INDEXINDEX(g);\
00180 while (0)
00181
00182 #define BDD_TOP_VAR3(top_indexindex, bddm, f, g, h)\
00183 do\
00184 if (BDD_INDEX(bddm, f) < BDD_INDEX(bddm, g))\
00185 {\
00186 top_indexindex=BDD_INDEXINDEX(f);\
00187 if ((bddm)->indexes[top_indexindex] > BDD_INDEX(bddm, h))\
00188 top_indexindex=BDD_INDEXINDEX(h);\
00189 }\
00190 else\
00191 {\
00192 top_indexindex=BDD_INDEXINDEX(g);\
00193 if ((bddm)->indexes[top_indexindex] > BDD_INDEX(bddm, h))\
00194 top_indexindex=BDD_INDEXINDEX(h);\
00195 }\
00196 while (0)
00197
00198 #define BDD_COFACTOR(top_indexindex, f, f_then, f_else)\
00199 do\
00200 if (BDD_INDEXINDEX(f) == top_indexindex)\
00201 {\
00202 f_then=BDD_THEN(f);\
00203 f_else=BDD_ELSE(f);\
00204 }\
00205 else\
00206 {\
00207 f_then=f;\
00208 f_else=f;\
00209 }\
00210 while (0)
00211
00212
00213
00214
00215 #define BDD_OUT_OF_ORDER(f, g) ((INT_PTR)f > (INT_PTR)g)
00216
00217 #if defined(CONCAT_PTR)
00218 #define BDD_SWAP(f, g)\
00219 do\
00220 {\
00221 bdd _temp;\
00222 _temp=f;\
00223 f=g;\
00224 g=_temp;\
00225 _temp=CONCAT_PTR(f);\
00226 CONCAT_PTR(f)=CONCAT_PTR(g);\
00227 CONCAT_PTR(g)=_temp;\
00228 }\
00229 while (0)
00230 #else
00231 #define BDD_SWAP(f, g)\
00232 do\
00233 {\
00234 bdd _temp;\
00235 _temp=f;\
00236 f=g;\
00237 g=_temp;\
00238 }\
00239 while (0)
00240 #endif
00241
00242
00243
00244
00245 #define BDD_IF(bddm, f) ((bddm)->variables[BDD_INDEXINDEX(f)])
00246
00247
00248
00249
00250 #define BDD_INCREFS(f)\
00251 do\
00252 {\
00253 if (BDD_REFS(f) >= BDD_MAX_REFS-1)\
00254 {\
00255 BDD_REFS(f)=BDD_MAX_REFS;\
00256 BDD_TEMP_REFS(f)=0;\
00257 }\
00258 else\
00259 BDD_REFS(f)++;\
00260 }\
00261 while (0)
00262
00263 #define BDD_DECREFS(f)\
00264 do\
00265 {\
00266 if (BDD_REFS(f) < BDD_MAX_REFS)\
00267 BDD_REFS(f)--;\
00268 }\
00269 while (0)
00270
00271 #define BDD_TEMP_INCREFS(f)\
00272 do\
00273 {\
00274 if (BDD_REFS(f) < BDD_MAX_REFS)\
00275 {\
00276 BDD_TEMP_REFS(f)++;\
00277 if (BDD_TEMP_REFS(f) == BDD_MAX_TEMP_REFS)\
00278 {\
00279 BDD_REFS(f)=BDD_MAX_REFS;\
00280 BDD_TEMP_REFS(f)=0;\
00281 }\
00282 }\
00283 }\
00284 while (0)
00285
00286 #define BDD_TEMP_DECREFS(f)\
00287 do\
00288 {\
00289 if (BDD_REFS(f) < BDD_MAX_REFS)\
00290 BDD_TEMP_REFS(f)--;\
00291 }\
00292 while (0)
00293
00294 #define BDD_IS_USED(f) ((BDD_MARK(f) & BDD_GC_MARK) != 0)
00295
00296
00297
00298
00299 #define RETURN_BDD(thing)\
00300 return (bdd_make_external(thing))
00301
00302
00303
00304
00305 #define BDD_ONE(bddm) ((bddm)->one)
00306 #define BDD_ZERO(bddm) ((bddm)->zero)
00307
00308
00309
00310
00311 struct cache_entry_
00312 {
00313 INT_PTR slot[4];
00314 };
00315
00316 typedef struct cache_entry_ *cache_entry;
00317
00318
00319
00320
00321
00322
00323
00324
00325 #define CACHE_TYPE_ITE 0x0
00326 #define CACHE_TYPE_TWO 0x1
00327 #define CACHE_TYPE_ONEDATA 0x2
00328 #define CACHE_TYPE_TWODATA 0x3
00329 #define CACHE_TYPE_USER1 0x4
00330
00331 #define USER_ENTRY_TYPES 4
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341 #define OP_COFACTOR 100l
00342 #define OP_SATFRAC 200l
00343 #define OP_FWD 300l
00344 #define OP_REV 400l
00345 #define OP_RED 500l
00346 #define OP_EQUAL 600l
00347 #define OP_QNT 10000l
00348 #define OP_RELPROD 20000l
00349 #define OP_SUBST 30000l
00350 #define OP_COMP 100000l
00351 #define OP_CMPTO 200000l
00352 #define OP_SWAP 300000l
00353 #define OP_SWAPAUX 400000l
00354
00355
00356
00357
00358 struct var_assoc_
00359 {
00360 bdd *assoc;
00361 long last;
00362 };
00363
00364 typedef struct var_assoc_ *var_assoc;
00365
00366
00367 struct assoc_list_
00368 {
00369 struct var_assoc_ va;
00370 int id;
00371 int refs;
00372 struct assoc_list_ *next;
00373 };
00374
00375 typedef struct assoc_list_ *assoc_list;
00376
00377
00378
00379
00380 struct block_
00381 {
00382 long num_children;
00383 struct block_ **children;
00384 int reorderable;
00385 long first_index;
00386 long last_index;
00387 };
00388
00389
00390
00391
00392 struct cache_bin_
00393 {
00394 cache_entry entry[2];
00395 };
00396
00397 typedef struct cache_bin_ cache_bin;
00398
00399
00400
00401
00402 struct cache_
00403 {
00404 cache_bin *table;
00405 int size_index;
00406 long size;
00407 int cache_level;
00408
00409 long (*rehash_fn[8]) ARGS((cmu_bdd_manager, cache_entry));
00410
00411 int (*gc_fn[8]) ARGS((cmu_bdd_manager, cache_entry));
00412
00413 void (*purge_fn[8]) ARGS((cmu_bdd_manager, cache_entry));
00414
00415 void (*return_fn[8]) ARGS((cmu_bdd_manager, cache_entry));
00416
00417 int (*flush_fn[8]) ARGS((cmu_bdd_manager, cache_entry, pointer));
00418
00419 int cache_ratio;
00420 long entries;
00421 long lookups;
00422 long hits;
00423 long inserts;
00424 long collisions;
00425 };
00426
00427 typedef struct cache_ cache;
00428
00429
00430
00431
00432 struct var_table_
00433 {
00434 bdd *table;
00435 int size_index;
00436 long size;
00437 long entries;
00438 };
00439
00440 typedef struct var_table_ *var_table;
00441
00442
00443
00444
00445 struct unique_
00446 {
00447 var_table *tables;
00448 void (*free_terminal_fn) ARGS((cmu_bdd_manager, INT_PTR, INT_PTR, pointer));
00449
00450 pointer free_terminal_env;
00451 long entries;
00452 long gc_limit;
00453 long node_limit;
00454 long gcs;
00455 long freed;
00456 long finds;
00457 };
00458
00459 typedef struct unique_ unique;
00460
00461
00462
00463
00464 #define MIN_REC_SIZE ALLOC_ALIGNMENT
00465 #define MAX_REC_SIZE 64
00466
00467 #define REC_MGRS (((MAX_REC_SIZE-MIN_REC_SIZE)/ALLOC_ALIGNMENT)+1)
00468
00469
00470
00471
00472
00473 struct jump_buf_
00474 {
00475 jmp_buf context;
00476 };
00477
00478 typedef struct jump_buf_ jump_buf;
00479
00480
00481
00482
00483 struct bdd_manager_
00484 {
00485 unique unique_table;
00486 cache op_cache;
00487 int check;
00488 bdd one;
00489 bdd zero;
00490 int overflow;
00491 void (*overflow_fn) ARGS((cmu_bdd_manager, pointer));
00492
00493 pointer overflow_env;
00494 void (*transform_fn) ARGS((cmu_bdd_manager, INT_PTR, INT_PTR, INT_PTR *, INT_PTR *, pointer));
00495
00496 pointer transform_env;
00497 int (*canonical_fn) ARGS((cmu_bdd_manager, INT_PTR, INT_PTR, pointer));
00498
00499
00500 block super_block;
00501 void (*reorder_fn) ARGS((cmu_bdd_manager));
00502
00503 pointer reorder_data;
00504 int allow_reordering;
00505 long nodes_at_start;
00506 long vars;
00507 long maxvars;
00508 bdd *variables;
00509 bdd_index_type *indexes;
00510 bdd_indexindex_type *indexindexes;
00511
00512 int curr_assoc_id;
00513 var_assoc curr_assoc;
00514 assoc_list assocs;
00515 struct var_assoc_ temp_assoc;
00516 rec_mgr rms[REC_MGRS];
00517 long temp_op;
00518 jump_buf abort;
00519 void (*bag_it_fn) ARGS((cmu_bdd_manager, pointer));
00520
00521 pointer bag_it_env; char *hooks;
00522 };
00523
00524
00525
00526
00527 #define BDD_ABORTED 1
00528 #define BDD_OVERFLOWED 2
00529 #define BDD_REORDERED 3
00530
00531
00532 #define FIREWALL(bddm)\
00533 do\
00534 {\
00535 int retcode;\
00536 (bddm)->allow_reordering=1;\
00537 (bddm)->nodes_at_start=(bddm)->unique_table.entries;\
00538 while ((retcode=(setjmp((bddm)->abort.context))))\
00539 {\
00540 bdd_cleanup(bddm, retcode);\
00541 if (retcode == BDD_ABORTED || retcode == BDD_OVERFLOWED)\
00542 return ((bdd)0);\
00543 (bddm)->nodes_at_start=(bddm)->unique_table.entries;\
00544 }\
00545 }\
00546 while (0)
00547
00548
00549 #define FIREWALL1(bddm, cleanupcode)\
00550 do\
00551 {\
00552 int retcode;\
00553 (bddm)->allow_reordering=1;\
00554 (bddm)->nodes_at_start=(bddm)->unique_table.entries;\
00555 while ((retcode=(setjmp((bddm)->abort.context))))\
00556 {\
00557 bdd_cleanup(bddm, retcode);\
00558 cleanupcode\
00559 (bddm)->nodes_at_start=(bddm)->unique_table.entries;\
00560 }\
00561 }\
00562 while (0)
00563
00564
00565
00566
00567 #define HASH_NODE(f, g) (((f) << 1)+(g))
00568
00569
00570
00571
00572 #if defined(POWER_OF_2_SIZES)
00573 #define TABLE_SIZE(size_index) (1l << (size_index))
00574 #define BDD_REDUCE(i, size) (i)&=(size)-1
00575 #else
00576 #define TABLE_SIZE(size_index) (bdd_primes[size_index])
00577 #define BDD_REDUCE(i, size)\
00578 do\
00579 {\
00580 (i)%=(size);\
00581 if ((i) < 0)\
00582 (i)= -(i);\
00583 }\
00584 while (0)
00585 #endif
00586
00587
00588
00589
00590 #define BDD_NEW_REC(bddm, size) mem_new_rec((bddm)->rms[(ROUNDUP(size)-MIN_REC_SIZE)/ALLOC_ALIGNMENT])
00591 #define BDD_FREE_REC(bddm, rec, size) mem_free_rec((bddm)->rms[(ROUNDUP(size)-MIN_REC_SIZE)/ALLOC_ALIGNMENT], (rec))
00592
00593
00594
00595
00596
00597
00598 extern int bdd_check_arguments ARGS((int, ...));
00599 extern void bdd_check_array ARGS((bdd *));
00600 extern bdd bdd_make_external ARGS((bdd));
00601 extern int cmu_bdd_type_aux ARGS((cmu_bdd_manager, bdd));
00602 extern int cmu_bdd_is_cube ARGS((cmu_bdd_manager, bdd));
00603 extern void bdd_rehash_var_table ARGS((var_table, int));
00604 extern bdd bdd_find_aux ARGS((cmu_bdd_manager, bdd_indexindex_type, INT_PTR, INT_PTR));
00605 extern bdd cmu_bdd_ite_step ARGS((cmu_bdd_manager, bdd, bdd, bdd));
00606 extern bdd cmu_bdd_exists_temp ARGS((cmu_bdd_manager, bdd, long));
00607 extern bdd cmu_bdd_compose_temp ARGS((cmu_bdd_manager, bdd, bdd, bdd));
00608 extern bdd cmu_bdd_substitute_step ARGS((cmu_bdd_manager, bdd, long, bdd (*) ARGS((cmu_bdd_manager, bdd, bdd, bdd)), var_assoc));
00609 extern bdd cmu_bdd_swap_vars_temp ARGS((cmu_bdd_manager, bdd, bdd, bdd));
00610 extern int cmu_bdd_compare_temp ARGS((cmu_bdd_manager, bdd, bdd, bdd));
00611 extern double cmu_bdd_satisfying_fraction_step ARGS((cmu_bdd_manager, bdd));
00612 extern void bdd_mark_shared_nodes ARGS((cmu_bdd_manager, bdd));
00613 extern void bdd_number_shared_nodes ARGS((cmu_bdd_manager, bdd, hash_table, long *));
00614 extern char *bdd_terminal_id ARGS((cmu_bdd_manager, bdd, char *(*) ARGS((cmu_bdd_manager, INT_PTR, INT_PTR, pointer)), pointer));
00615 extern char *bdd_var_name ARGS((cmu_bdd_manager, bdd, char *(*) ARGS((cmu_bdd_manager, bdd, pointer)), pointer));
00616 extern long bdd_find_block ARGS((block, long));
00617 extern void bdd_block_delta ARGS((block, long));
00618 extern void cmu_bdd_reorder_aux ARGS((cmu_bdd_manager));
00619 extern void cmu_mtbdd_terminal_value_aux ARGS((cmu_bdd_manager, bdd, INT_PTR *, INT_PTR *));
00620
00621
00622
00623
00624 extern void bdd_insert_in_cache31 ARGS((cmu_bdd_manager, int, INT_PTR, INT_PTR, INT_PTR, INT_PTR));
00625 extern int bdd_lookup_in_cache31 ARGS((cmu_bdd_manager, int, INT_PTR, INT_PTR, INT_PTR, INT_PTR *));
00626 extern void bdd_insert_in_cache22 ARGS((cmu_bdd_manager, int, INT_PTR, INT_PTR, INT_PTR, INT_PTR));
00627 extern int bdd_lookup_in_cache22 ARGS((cmu_bdd_manager, int, INT_PTR, INT_PTR, INT_PTR *, INT_PTR *));
00628 extern void bdd_insert_in_cache13 ARGS((cmu_bdd_manager, int, INT_PTR, INT_PTR, INT_PTR, INT_PTR));
00629 extern int bdd_lookup_in_cache13 ARGS((cmu_bdd_manager, int, INT_PTR, INT_PTR *, INT_PTR *, INT_PTR *));
00630 extern void bdd_flush_cache ARGS((cmu_bdd_manager, int (*) ARGS((cmu_bdd_manager, cache_entry, pointer)), pointer));
00631 extern void bdd_purge_cache ARGS((cmu_bdd_manager));
00632 extern void bdd_flush_all ARGS((cmu_bdd_manager));
00633 extern int bdd_cache_functions ARGS((cmu_bdd_manager,
00634 int,
00635 int (*) ARGS((cmu_bdd_manager, cache_entry)),
00636 void (*) ARGS((cmu_bdd_manager, cache_entry)),
00637 void (*) ARGS((cmu_bdd_manager,cache_entry)),
00638 int (*) ARGS((cmu_bdd_manager, cache_entry, pointer))));
00639 extern void cmu_bdd_free_cache_tag ARGS((cmu_bdd_manager, long));
00640 extern void bdd_rehash_cache ARGS((cmu_bdd_manager, int));
00641 extern void cmu_bdd_init_cache ARGS((cmu_bdd_manager));
00642 extern void cmu_bdd_free_cache ARGS((cmu_bdd_manager));
00643
00644 #define bdd_insert_in_cache2(bddm, op, f, g, result)\
00645 bdd_insert_in_cache31((bddm), CACHE_TYPE_TWO, (INT_PTR)(op), (INT_PTR)(f), (INT_PTR)(g), (INT_PTR)(result))
00646 #define bdd_lookup_in_cache2(bddm, op, f, g, result)\
00647 bdd_lookup_in_cache31((bddm), CACHE_TYPE_TWO, (INT_PTR)(op), (INT_PTR)(f), (INT_PTR)(g), (INT_PTR *)(result))
00648
00649 #define bdd_insert_in_cache1(bddm, op, f, result)\
00650 bdd_insert_in_cache2((bddm), (op), (f), BDD_ONE(bddm), (result))
00651 #define bdd_lookup_in_cache1(bddm, op, f, result)\
00652 bdd_lookup_in_cache2((bddm), (op), (f), BDD_ONE(bddm), (result))
00653
00654 #define bdd_insert_in_cache2d(bddm, op, f, g, result)\
00655 bdd_insert_in_cache31((bddm), CACHE_TYPE_TWODATA, (INT_PTR)(op), (INT_PTR)(f), (INT_PTR)(g), (INT_PTR)(result))
00656 #define bdd_lookup_in_cache2d(bddm, op, f, g, result)\
00657 bdd_lookup_in_cache31((bddm), CACHE_TYPE_TWODATA, (INT_PTR)(op), (INT_PTR)(f), (INT_PTR)(g), (INT_PTR *)(result))
00658
00659 #define bdd_insert_in_cache1d(bddm, op, f, result1, result2)\
00660 bdd_insert_in_cache22((bddm), CACHE_TYPE_ONEDATA, (INT_PTR)(op), (INT_PTR)(f), (INT_PTR)(result1), (INT_PTR)(result2))
00661 #define bdd_lookup_in_cache1d(bddm, op, f, result1, result2)\
00662 bdd_lookup_in_cache22((bddm), CACHE_TYPE_ONEDATA, (INT_PTR)(op), (INT_PTR)(f), (INT_PTR *)(result1), (INT_PTR *)(result2))
00663
00664 #define cache_return_fn_none ((void (*)(cmu_bdd_manager, cache_entry))0)
00665 #define cache_purge_fn_none ((void (*)(cmu_bdd_manager, cache_entry))0)
00666 #define cache_reclaim_fn_none ((int (*)(cmu_bdd_manager, cache_entry, pointer))0)
00667
00668
00669
00670
00671 extern void bdd_clear_temps ARGS((cmu_bdd_manager));
00672 extern void bdd_sweep_var_table ARGS((cmu_bdd_manager, long, int));
00673 extern void bdd_sweep ARGS((cmu_bdd_manager));
00674 extern void bdd_cleanup ARGS((cmu_bdd_manager, int));
00675 extern bdd bdd_find ARGS((cmu_bdd_manager, bdd_indexindex_type, bdd, bdd));
00676 extern bdd bdd_find_terminal ARGS((cmu_bdd_manager, INT_PTR, INT_PTR));
00677 extern var_table bdd_new_var_table ARGS((cmu_bdd_manager));
00678 extern void cmu_bdd_init_unique ARGS((cmu_bdd_manager));
00679 extern void cmu_bdd_free_unique ARGS((cmu_bdd_manager));
00680
00681
00682
00683
00684 extern void cmu_bdd_fatal ARGS((char *));
00685 extern void cmu_bdd_warning ARGS((char *));
00686
00687
00688
00689
00690 struct hash_rec_
00691 {
00692 bdd key;
00693 struct hash_rec_ *next;
00694 };
00695
00696 typedef struct hash_rec_ *hash_rec;
00697
00698
00699 struct hash_table_
00700 {
00701 hash_rec *table;
00702 int size_index;
00703 long size;
00704 long entries;
00705 int item_size;
00706 cmu_bdd_manager bddm;
00707 };
00708
00709
00710
00711
00712 extern void bdd_insert_in_hash_table ARGS((hash_table, bdd, pointer));
00713 extern pointer bdd_lookup_in_hash_table ARGS((hash_table, bdd));
00714 extern hash_table bdd_new_hash_table ARGS((cmu_bdd_manager, int));
00715 extern void cmu_bdd_free_hash_table ARGS((hash_table));
00716
00717
00718 #undef ARGS
00719
00720 #endif