#include "bddint.h"
Go to the source code of this file.
void bdd_block_delta | ( | block | b, | |
long | delta | |||
) |
Definition at line 57 of file bdd.c.
00058 { 00059 long i; 00060 00061 b->first_index+=delta; 00062 b->last_index+=delta; 00063 for (i=0; i < b->num_children; ++i) 00064 bdd_block_delta(b->children[i], delta); 00065 }
static int bdd_default_canonical_fn | ( | cmu_bdd_manager | bddm, | |
INT_PTR | value1, | |||
INT_PTR | value2, | |||
pointer | junk | |||
) | [static] |
static void bdd_default_transform_fn | ( | cmu_bdd_manager | bddm, | |
INT_PTR | value1, | |||
INT_PTR | value2, | |||
INT_PTR * | result1, | |||
INT_PTR * | result2, | |||
pointer | junk | |||
) | [static] |
Definition at line 1002 of file bdd.c.
01003 { 01004 if (!value2) 01005 /* Will be a carry when taking 2's complement of value2. Thus, */ 01006 /* take 2's complement of high part. */ 01007 value1= -(long)value1; 01008 else 01009 { 01010 value2= -(long)value2; 01011 value1= ~value1; 01012 } 01013 *result1=value1; 01014 *result2=value2; 01015 }
long bdd_find_block | ( | block | b, | |
long | index | |||
) |
Definition at line 36 of file bdd.c.
00037 { 00038 long i, j, k; 00039 00040 i=0; 00041 j=b->num_children-1; 00042 while (i <= j) 00043 { 00044 k=(i+j)/2; 00045 if (b->children[k]->first_index <= index && b->children[k]->last_index >= index) 00046 return (k); 00047 if (b->children[k]->first_index > index) 00048 j=k-1; 00049 else 00050 i=k+1; 00051 } 00052 return (i); 00053 }
Definition at line 26 of file bdd.c.
00027 { 00028 BDD_SETUP(f); 00029 BDD_INCREFS(f); 00030 BDD_TEMP_DECREFS(f); 00031 return (f); 00032 }
static bdd bdd_new_var | ( | cmu_bdd_manager | bddm, | |
bdd_index_type | index | |||
) | [static] |
Definition at line 114 of file bdd.c.
00115 { 00116 long i; 00117 long temp; 00118 long oldmax; 00119 assoc_list p; 00120 bdd var; 00121 00122 if (bddm->vars == BDD_MAX_INDEXINDEX) 00123 cmu_bdd_fatal("bdd_new_var: no more indexes"); 00124 if (index > bddm->vars) 00125 cmu_bdd_fatal("bdd_new_var: index out of range"); 00126 if (bddm->vars == bddm->maxvars) 00127 { 00128 /* Expand indexing tables and variable associations. */ 00129 oldmax=bddm->maxvars; 00130 temp=bddm->maxvars*2; 00131 if (temp > BDD_MAX_INDEXINDEX-1) 00132 temp=BDD_MAX_INDEXINDEX-1; 00133 bddm->maxvars=temp; 00134 bddm->variables=(bdd *)mem_resize_block((pointer)bddm->variables, 00135 (SIZE_T)((bddm->maxvars+1)*sizeof(bdd))); 00136 bddm->indexes=(bdd_index_type *)mem_resize_block((pointer)bddm->indexes, 00137 (SIZE_T)((bddm->maxvars+1)*sizeof(bdd_index_type))); 00138 bddm->indexindexes= 00139 (bdd_indexindex_type *)mem_resize_block((pointer)bddm->indexindexes, 00140 (SIZE_T)(bddm->maxvars*sizeof(bdd_indexindex_type))); 00141 bddm->unique_table.tables= 00142 (var_table *)mem_resize_block((pointer)bddm->unique_table.tables, 00143 (SIZE_T)((bddm->maxvars+1)*sizeof(var_table))); 00144 /* Variable associations are padded with nulls in case new variables */ 00145 /* are created. */ 00146 for (p=bddm->assocs; p; p=p->next) 00147 { 00148 p->va.assoc=(bdd *)mem_resize_block((pointer)p->va.assoc, (SIZE_T)((bddm->maxvars+1)*sizeof(bdd))); 00149 for (i=oldmax; i < bddm->maxvars; ++i) 00150 p->va.assoc[i+1]=0; 00151 } 00152 bddm->temp_assoc.assoc=(bdd *)mem_resize_block((pointer)bddm->temp_assoc.assoc, (SIZE_T)((bddm->maxvars+1)*sizeof(bdd))); 00153 for (i=oldmax; i < bddm->maxvars; ++i) 00154 bddm->temp_assoc.assoc[i+1]=0; 00155 } 00156 /* Shift index of following variables. */ 00157 if (index != bddm->vars) 00158 for (i=0; i < bddm->vars; ++i) 00159 if (bddm->indexes[i+1] >= index) 00160 bddm->indexes[i+1]++; 00161 for (p=bddm->assocs; p; p=p->next) 00162 if (p->va.last >= index) 00163 p->va.last++; 00164 if (bddm->temp_assoc.last >= index) 00165 bddm->temp_assoc.last++; 00166 /* Shift indexindex values. */ 00167 for (i=bddm->vars; i > index; --i) 00168 bddm->indexindexes[i]=bddm->indexindexes[i-1]; 00169 /* Make a new variable table. */ 00170 bddm->vars++; 00171 bddm->unique_table.tables[bddm->vars]=bdd_new_var_table(bddm); 00172 /* Create the variable. */ 00173 var=bdd_find_aux(bddm, (bdd_indexindex_type)bddm->vars, (INT_PTR)BDD_ONE(bddm), (INT_PTR)BDD_ZERO(bddm)); 00174 var->refs=BDD_MAX_REFS; 00175 /* Record everything. */ 00176 bddm->variables[bddm->vars]=var; 00177 bddm->indexes[bddm->vars]=index; 00178 bddm->indexindexes[index]=bddm->vars; 00179 /* Make a new variable block containing the variable. */ 00180 shift_block(bddm, bddm->super_block, (long)index); 00181 return (var); 00182 }
void cmu_bdd_abort_closure | ( | cmu_bdd_manager | bddm, | |
void(*)(cmu_bdd_manager, pointer) | abort_fn, | |||
pointer | abort_env | |||
) |
Definition at line 928 of file bdd.c.
00929 { 00930 bddm->bag_it_fn=abort_fn; 00931 bddm->bag_it_env=abort_env; 00932 }
bdd cmu_bdd_and | ( | cmu_bdd_manager | bddm, | |
bdd | f, | |||
bdd | g | |||
) |
Definition at line 501 of file bdd.c.
00502 { 00503 return (cmu_bdd_ite(bddm, f, g, BDD_ZERO(bddm))); 00504 }
static bdd cmu_bdd_and_step | ( | cmu_bdd_manager | bddm, | |
bdd | f, | |||
bdd | g | |||
) | [static] |
Definition at line 273 of file bdd.c.
00274 { 00275 bdd_indexindex_type top_indexindex; 00276 bdd f1, f2; 00277 bdd g1, g2; 00278 bdd temp1, temp2; 00279 bdd result; 00280 00281 BDD_SETUP(f); 00282 BDD_SETUP(g); 00283 if (BDD_IS_CONST(f)) 00284 { 00285 if (f == BDD_ZERO(bddm)) 00286 return (f); 00287 BDD_TEMP_INCREFS(g); 00288 return (g); 00289 } 00290 /* f is not constant. */ 00291 if (BDD_IS_CONST(g)) 00292 { 00293 if (g == BDD_ZERO(bddm)) 00294 return (g); 00295 BDD_TEMP_INCREFS(f); 00296 return (f); 00297 } 00298 /* f and g are not constant. */ 00299 if (BDD_SAME_OR_NEGATIONS(f, g)) 00300 { 00301 if (f == g) 00302 { 00303 BDD_TEMP_INCREFS(f); 00304 return (f); 00305 } 00306 return (BDD_ZERO(bddm)); 00307 } 00308 /* f and g are not constant and are not equal or negations. */ 00309 if (BDD_OUT_OF_ORDER(f, g)) 00310 BDD_SWAP(f, g); 00311 if (bdd_lookup_in_cache31(bddm, CACHE_TYPE_ITE, (INT_PTR)f, (INT_PTR)g, (INT_PTR)BDD_ZERO(bddm), (INT_PTR *)&result)) 00312 return (result); 00313 BDD_TOP_VAR2(top_indexindex, bddm, f, g); 00314 BDD_COFACTOR(top_indexindex, f, f1, f2); 00315 BDD_COFACTOR(top_indexindex, g, g1, g2); 00316 temp1=cmu_bdd_and_step(bddm, f1, g1); 00317 temp2=cmu_bdd_and_step(bddm, f2, g2); 00318 result=bdd_find(bddm, top_indexindex, temp1, temp2); 00319 bdd_insert_in_cache31(bddm, CACHE_TYPE_ITE, (INT_PTR)f, (INT_PTR)g, (INT_PTR)BDD_ZERO(bddm), (INT_PTR)result); 00320 return (result); 00321 }
int cmu_bdd_cache_ratio | ( | cmu_bdd_manager | bddm, | |
int | new_ratio | |||
) |
Definition at line 863 of file bdd.c.
00864 { 00865 int old_ratio; 00866 00867 old_ratio=bddm->op_cache.cache_ratio; 00868 if (new_ratio < 1) 00869 new_ratio=1; 00870 else if (new_ratio > 32) 00871 new_ratio=32; 00872 bddm->op_cache.cache_ratio=new_ratio; 00873 return (old_ratio); 00874 }
bdd cmu_bdd_else | ( | cmu_bdd_manager | bddm, | |
bdd | f | |||
) |
Definition at line 672 of file bdd.c.
00673 { 00674 if (bdd_check_arguments(1, f)) 00675 { 00676 BDD_SETUP(f); 00677 if (BDD_IS_CONST(f)) 00678 { 00679 cmu_bdd_warning("cmu_bdd_else: argument is a constant"); 00680 return (f); 00681 } 00682 f=BDD_ELSE(f); 00683 BDD_RESET(f); 00684 BDD_INCREFS(f); 00685 } 00686 return (f); 00687 }
void cmu_bdd_free | ( | cmu_bdd_manager | bddm, | |
bdd | f | |||
) |
Definition at line 828 of file bdd.c.
00829 { 00830 if (f) 00831 { 00832 BDD_SETUP(f); 00833 if (BDD_REFS(f) == 0) 00834 cmu_bdd_fatal("cmu_bdd_free: attempt to free node with zero references"); 00835 else 00836 BDD_DECREFS(f); 00837 } 00838 }
bdd cmu_bdd_identity | ( | cmu_bdd_manager | bddm, | |
bdd | f | |||
) |
Definition at line 568 of file bdd.c.
00569 { 00570 if (bdd_check_arguments(1, f)) 00571 { 00572 BDD_SETUP(f); 00573 BDD_INCREFS(f); 00574 } 00575 return (f); 00576 }
bdd cmu_bdd_if | ( | cmu_bdd_manager | bddm, | |
bdd | f | |||
) |
Definition at line 597 of file bdd.c.
00598 { 00599 if (bdd_check_arguments(1, f)) 00600 { 00601 BDD_SETUP(f); 00602 if (BDD_IS_CONST(f)) 00603 { 00604 cmu_bdd_warning("cmu_bdd_if: argument is a constant"); 00605 return (f); 00606 } 00607 FIREWALL(bddm); 00608 RETURN_BDD(BDD_IF(bddm, f)); 00609 } 00610 return (f); 00611 }
long cmu_bdd_if_id | ( | cmu_bdd_manager | bddm, | |
bdd | f | |||
) |
Definition at line 635 of file bdd.c.
00636 { 00637 if (bdd_check_arguments(1, f)) 00638 { 00639 BDD_SETUP(f); 00640 if (BDD_IS_CONST(f)) 00641 return (-1l); 00642 return ((long)BDD_INDEXINDEX(f)); 00643 } 00644 return (-1l); 00645 }
long cmu_bdd_if_index | ( | cmu_bdd_manager | bddm, | |
bdd | f | |||
) |
Definition at line 618 of file bdd.c.
00619 { 00620 if (bdd_check_arguments(1, f)) 00621 { 00622 BDD_SETUP(f); 00623 if (BDD_IS_CONST(f)) 00624 return (-1l); 00625 return ((long)BDD_INDEX(bddm, f)); 00626 } 00627 return (-1l); 00628 }
bdd cmu_bdd_implies | ( | cmu_bdd_manager | bddm, | |
bdd | f, | |||
bdd | g | |||
) |
Definition at line 766 of file bdd.c.
00767 { 00768 if (bdd_check_arguments(2, f, g)) 00769 { 00770 FIREWALL(bddm); 00771 RETURN_BDD(cmu_bdd_intersects_step(bddm, f, BDD_NOT(g))); 00772 } 00773 return ((bdd)0); 00774 }
cmu_bdd_manager cmu_bdd_init | ( | void | ) |
Definition at line 1021 of file bdd.c.
01022 { 01023 cmu_bdd_manager bddm; 01024 long i; 01025 01026 bddm=(cmu_bdd_manager)mem_get_block((SIZE_T)sizeof(struct bdd_manager_)); 01027 bddm->overflow=0; 01028 bddm->overflow_fn=0; 01029 bddm->overflow_env=0; 01030 bddm->bag_it_fn=0; 01031 bddm->bag_it_env=0; 01032 bddm->canonical_fn=bdd_default_canonical_fn; 01033 bddm->transform_fn=bdd_default_transform_fn; 01034 bddm->transform_env=0; 01035 bddm->reorder_fn=0; 01036 bddm->reorder_data=0; 01037 bddm->vars=0; 01038 bddm->maxvars=30; 01039 bddm->check=1; 01040 bddm->variables=(bdd *)mem_get_block((SIZE_T)((bddm->maxvars+1)*sizeof(bdd))); 01041 bddm->indexes=(bdd_index_type *)mem_get_block((SIZE_T)((bddm->maxvars+1)*sizeof(bdd_index_type))); 01042 bddm->indexindexes=(bdd_indexindex_type *)mem_get_block((SIZE_T)(bddm->maxvars*sizeof(bdd_indexindex_type))); 01043 bddm->indexes[BDD_CONST_INDEXINDEX]=BDD_MAX_INDEX; 01044 for (i=0; i < REC_MGRS; ++i) 01045 bddm->rms[i]=mem_new_rec_mgr(MIN_REC_SIZE+ALLOC_ALIGNMENT*i); 01046 bddm->temp_assoc.assoc=(bdd *)mem_get_block((SIZE_T)((bddm->maxvars+1)*sizeof(bdd))); 01047 bddm->temp_assoc.last= -1; 01048 for (i=0; i < bddm->maxvars; ++i) 01049 bddm->temp_assoc.assoc[i+1]=0; 01050 bddm->curr_assoc_id= -1; 01051 bddm->curr_assoc= &bddm->temp_assoc; 01052 bddm->assocs=0; 01053 bddm->temp_op= -1; 01054 bddm->super_block=(block)BDD_NEW_REC(bddm, sizeof(struct block_)); 01055 bddm->super_block->num_children=0; 01056 bddm->super_block->children=0; 01057 bddm->super_block->reorderable=1; 01058 bddm->super_block->first_index= -1; 01059 bddm->super_block->last_index=0; 01060 cmu_bdd_init_unique(bddm); 01061 cmu_bdd_init_cache(bddm); 01062 bddm->one=bdd_find_terminal(bddm, ~(INT_PTR)0, ~(INT_PTR)0); 01063 bddm->one->refs=BDD_MAX_REFS; 01064 bddm->one->mark=0; 01065 bddm->zero=BDD_NOT(bddm->one); 01066 if (sizeof(double) > 2*sizeof(long)) 01067 cmu_bdd_warning("cmu_bdd_init: portability problem for cmu_bdd_satisfying_fraction"); 01068 return (bddm); 01069 }
bdd cmu_bdd_intersects | ( | cmu_bdd_manager | bddm, | |
bdd | f, | |||
bdd | g | |||
) |
Definition at line 751 of file bdd.c.
00752 { 00753 if (bdd_check_arguments(2, f, g)) 00754 { 00755 FIREWALL(bddm); 00756 RETURN_BDD(cmu_bdd_intersects_step(bddm, f, g)); 00757 } 00758 return ((bdd)0); 00759 }
static bdd cmu_bdd_intersects_step | ( | cmu_bdd_manager | bddm, | |
bdd | f, | |||
bdd | g | |||
) | [static] |
Definition at line 692 of file bdd.c.
00693 { 00694 bdd_indexindex_type top_indexindex; 00695 bdd f1, f2; 00696 bdd g1, g2; 00697 bdd temp; 00698 00699 BDD_SETUP(f); 00700 BDD_SETUP(g); 00701 if (BDD_IS_CONST(f)) 00702 { 00703 if (f == BDD_ZERO(bddm)) 00704 return (f); 00705 BDD_TEMP_INCREFS(g); 00706 return (g); 00707 } 00708 /* f is not constant. */ 00709 if (BDD_IS_CONST(g)) 00710 { 00711 if (g == BDD_ZERO(bddm)) 00712 return (g); 00713 BDD_TEMP_INCREFS(f); 00714 return (f); 00715 } 00716 /* f and g are not constant. */ 00717 if (BDD_SAME_OR_NEGATIONS(f, g)) 00718 { 00719 if (f == g) 00720 { 00721 BDD_TEMP_INCREFS(f); 00722 return (f); 00723 } 00724 return (BDD_ZERO(bddm)); 00725 } 00726 /* f and g are not constant and are not equal or negations. */ 00727 if (BDD_OUT_OF_ORDER(f, g)) 00728 BDD_SWAP(f, g); 00729 if (bdd_lookup_in_cache31(bddm, CACHE_TYPE_ITE, (INT_PTR)f, (INT_PTR)g, (INT_PTR)BDD_ZERO(bddm), (INT_PTR *)&temp)) 00730 return (temp); 00731 BDD_TOP_VAR2(top_indexindex, bddm, f, g); 00732 BDD_COFACTOR(top_indexindex, f, f1, f2); 00733 BDD_COFACTOR(top_indexindex, g, g1, g2); 00734 temp=cmu_bdd_intersects_step(bddm, f1, g1); 00735 if (temp != BDD_ZERO(bddm)) 00736 return (bdd_find(bddm, top_indexindex, temp, BDD_ZERO(bddm))); 00737 temp=bdd_find(bddm, top_indexindex, BDD_ZERO(bddm), cmu_bdd_intersects_step(bddm, f2, g2)); 00738 if (temp == BDD_ZERO(bddm)) 00739 bdd_insert_in_cache31(bddm, CACHE_TYPE_ITE, (INT_PTR)f, (INT_PTR)g, (INT_PTR)BDD_ZERO(bddm), (INT_PTR)temp); 00740 return (temp); 00741 }
bdd cmu_bdd_ite | ( | cmu_bdd_manager | bddm, | |
bdd | f, | |||
bdd | g, | |||
bdd | h | |||
) |
Definition at line 487 of file bdd.c.
00488 { 00489 if (bdd_check_arguments(3, f, g, h)) 00490 { 00491 FIREWALL(bddm); 00492 RETURN_BDD(cmu_bdd_ite_step(bddm, f, g, h)); 00493 } 00494 return ((bdd)0); 00495 }
bdd cmu_bdd_ite_step | ( | cmu_bdd_manager | bddm, | |
bdd | f, | |||
bdd | g, | |||
bdd | h | |||
) |
Definition at line 383 of file bdd.c.
00384 { 00385 int outneg; 00386 bdd_indexindex_type top_indexindex; 00387 bdd f1, f2; 00388 bdd g1, g2; 00389 bdd h1, h2; 00390 bdd temp1, temp2; 00391 bdd result; 00392 00393 BDD_SETUP(f); 00394 BDD_SETUP(g); 00395 BDD_SETUP(h); 00396 if (BDD_IS_CONST(f)) 00397 { 00398 if (f == BDD_ONE(bddm)) 00399 { 00400 BDD_TEMP_INCREFS(g); 00401 return (g); 00402 } 00403 BDD_TEMP_INCREFS(h); 00404 return (h); 00405 } 00406 /* f is not constant. */ 00407 if (BDD_SAME_OR_NEGATIONS(f, g)) 00408 { 00409 if (f == g) 00410 g=BDD_ONE(bddm); 00411 else 00412 g=BDD_ZERO(bddm); 00413 BDD_RESET(g); 00414 } 00415 if (BDD_SAME_OR_NEGATIONS(f, h)) 00416 { 00417 if (f == h) 00418 h=BDD_ZERO(bddm); 00419 else 00420 h=BDD_ONE(bddm); 00421 BDD_RESET(h); 00422 } 00423 if (BDD_IS_CONST(g)) 00424 { 00425 if (BDD_IS_CONST(h)) 00426 { 00427 if (g == h) 00428 return (g); 00429 BDD_TEMP_INCREFS(f); 00430 if (g == BDD_ONE(bddm)) 00431 return (f); 00432 return (BDD_NOT(f)); 00433 } 00434 if (g == BDD_ZERO(bddm)) 00435 return (cmu_bdd_and_step(bddm, BDD_NOT(f), h)); 00436 return (BDD_NOT(cmu_bdd_and_step(bddm, BDD_NOT(f), BDD_NOT(h)))); 00437 } 00438 else if (BDD_SAME_OR_NEGATIONS(g, h)) 00439 { 00440 if (g == h) 00441 { 00442 BDD_TEMP_INCREFS(g); 00443 return (g); 00444 } 00445 return (cmu_bdd_xnor_step(bddm, f, g)); 00446 } 00447 else if (BDD_IS_CONST(h)) 00448 { 00449 if (h == BDD_ZERO(bddm)) 00450 return (cmu_bdd_and_step(bddm, f, g)); 00451 else 00452 return (BDD_NOT(cmu_bdd_and_step(bddm, f, BDD_NOT(g)))); 00453 } 00454 /* No special cases; it's a real if-then-else. */ 00455 if (!BDD_IS_OUTPOS(f)) 00456 { 00457 f=BDD_NOT(f); 00458 BDD_SWAP(g, h); 00459 } 00460 /* f is now an uncomplemented output pointer. */ 00461 if (BDD_IS_OUTPOS(g)) 00462 outneg=0; 00463 else 00464 { 00465 outneg=1; 00466 g=BDD_NOT(g); 00467 h=BDD_NOT(h); 00468 } 00469 /* g is now an uncomplemented output pointer. */ 00470 if (bdd_lookup_in_cache31(bddm, CACHE_TYPE_ITE, (INT_PTR)f, (INT_PTR)g, (INT_PTR)h, (INT_PTR *)&result)) 00471 return (outneg ? BDD_NOT(result) : result); 00472 BDD_TOP_VAR3(top_indexindex, bddm, f, g, h); 00473 BDD_COFACTOR(top_indexindex, f, f1, f2); 00474 BDD_COFACTOR(top_indexindex, g, g1, g2); 00475 BDD_COFACTOR(top_indexindex, h, h1, h2); 00476 temp1=cmu_bdd_ite_step(bddm, f1, g1, h1); 00477 temp2=cmu_bdd_ite_step(bddm, f2, g2, h2); 00478 result=bdd_find(bddm, top_indexindex, temp1, temp2); 00479 bdd_insert_in_cache31(bddm, CACHE_TYPE_ITE, (INT_PTR)f, (INT_PTR)g, (INT_PTR)h, (INT_PTR)result); 00480 return (outneg ? BDD_NOT(result) : result); 00481 }
bdd cmu_bdd_nand | ( | cmu_bdd_manager | bddm, | |
bdd | f, | |||
bdd | g | |||
) |
bdd cmu_bdd_new_var_after | ( | cmu_bdd_manager | bddm, | |
bdd | var | |||
) |
Definition at line 230 of file bdd.c.
00231 { 00232 if (bdd_check_arguments(1, var)) 00233 { 00234 BDD_SETUP(var); 00235 if (cmu_bdd_type_aux(bddm, var) != BDD_TYPE_POSVAR) 00236 { 00237 cmu_bdd_warning("cmu_bdd_new_var_after: argument is not a positive variable"); 00238 if (BDD_IS_CONST(var)) 00239 return (cmu_bdd_new_var_last(bddm)); 00240 } 00241 return (bdd_new_var(bddm, BDD_INDEX(bddm, var)+1)); 00242 } 00243 return ((bdd)0); 00244 }
bdd cmu_bdd_new_var_before | ( | cmu_bdd_manager | bddm, | |
bdd | var | |||
) |
Definition at line 209 of file bdd.c.
00210 { 00211 if (bdd_check_arguments(1, var)) 00212 { 00213 BDD_SETUP(var); 00214 if (cmu_bdd_type_aux(bddm, var) != BDD_TYPE_POSVAR) 00215 { 00216 cmu_bdd_warning("cmu_bdd_new_var_before: argument is not a positive variable"); 00217 if (BDD_IS_CONST(var)) 00218 return (cmu_bdd_new_var_last(bddm)); 00219 } 00220 return (bdd_new_var(bddm, BDD_INDEX(bddm, var))); 00221 } 00222 return ((bdd)0); 00223 }
bdd cmu_bdd_new_var_first | ( | cmu_bdd_manager | bddm | ) |
Definition at line 189 of file bdd.c.
00190 { 00191 return (bdd_new_var(bddm, (bdd_index_type)0)); 00192 }
bdd cmu_bdd_new_var_last | ( | cmu_bdd_manager | bddm | ) |
Definition at line 199 of file bdd.c.
00200 { 00201 return (bdd_new_var(bddm, (bdd_index_type)bddm->vars)); 00202 }
long cmu_bdd_node_limit | ( | cmu_bdd_manager | bddm, | |
long | new_limit | |||
) |
Definition at line 881 of file bdd.c.
00882 { 00883 long old_limit; 00884 00885 old_limit=bddm->unique_table.node_limit; 00886 if (new_limit < 0) 00887 new_limit=0; 00888 bddm->unique_table.node_limit=new_limit; 00889 if (new_limit && bddm->unique_table.gc_limit > new_limit) 00890 bddm->unique_table.gc_limit=new_limit; 00891 return (old_limit); 00892 }
bdd cmu_bdd_nor | ( | cmu_bdd_manager | bddm, | |
bdd | f, | |||
bdd | g | |||
) |
bdd cmu_bdd_not | ( | cmu_bdd_manager | bddm, | |
bdd | f | |||
) |
Definition at line 582 of file bdd.c.
00583 { 00584 if (bdd_check_arguments(1, f)) 00585 { 00586 BDD_SETUP(f); 00587 BDD_INCREFS(f); 00588 return (BDD_NOT(f)); 00589 } 00590 return ((bdd)0); 00591 }
bdd cmu_bdd_one | ( | cmu_bdd_manager | bddm | ) |
bdd cmu_bdd_or | ( | cmu_bdd_manager | bddm, | |
bdd | f, | |||
bdd | g | |||
) |
Definition at line 523 of file bdd.c.
00524 { 00525 return (cmu_bdd_ite(bddm, f, BDD_ONE(bddm), g)); 00526 }
int cmu_bdd_overflow | ( | cmu_bdd_manager | bddm | ) |
void cmu_bdd_overflow_closure | ( | cmu_bdd_manager | bddm, | |
void(*)(cmu_bdd_manager, pointer) | overflow_fn, | |||
pointer | overflow_env | |||
) |
Definition at line 914 of file bdd.c.
00915 { 00916 bddm->overflow_fn=overflow_fn; 00917 bddm->overflow_env=overflow_env; 00918 }
void cmu_bdd_quit | ( | cmu_bdd_manager | bddm | ) |
Definition at line 1076 of file bdd.c.
01077 { 01078 int i; 01079 assoc_list p, q; 01080 01081 cmu_bdd_free_unique(bddm); 01082 cmu_bdd_free_cache(bddm); 01083 mem_free_block((pointer)bddm->variables); 01084 mem_free_block((pointer)bddm->indexes); 01085 mem_free_block((pointer)bddm->indexindexes); 01086 mem_free_block((pointer)bddm->temp_assoc.assoc); 01087 for (p=bddm->assocs; p; p=q) 01088 { 01089 q=p->next; 01090 mem_free_block((pointer)p->va.assoc); 01091 BDD_FREE_REC(bddm, (pointer)p, sizeof(struct assoc_list_)); 01092 } 01093 BDD_FREE_REC(bddm, (pointer)bddm->super_block, sizeof(struct block_)); 01094 for (i=0; i < REC_MGRS; ++i) 01095 mem_free_rec_mgr(bddm->rms[i]); 01096 mem_free_block((pointer)bddm); 01097 }
void cmu_bdd_stats | ( | cmu_bdd_manager | bddm, | |
FILE * | fp | |||
) |
Definition at line 939 of file bdd.c.
00940 { 00941 long i; 00942 long ue, ce, cs, mem; 00943 SIZE_T alloc; 00944 assoc_list q; 00945 00946 ue=bddm->unique_table.entries; 00947 ce=bddm->op_cache.entries; 00948 cs=bddm->op_cache.size; 00949 mem=0; 00950 for (i=0; i < bddm->vars; ++i) 00951 { 00952 mem+=sizeof(struct var_table_); 00953 mem+=bddm->unique_table.tables[i]->size*sizeof(bdd); 00954 } 00955 mem=ue*sizeof(struct bdd_); 00956 mem+=cs*sizeof(struct cache_bin_)+ce*sizeof(struct cache_entry_); 00957 mem+=bddm->maxvars*(sizeof(bdd_index_type)+sizeof(bdd_indexindex_type)+sizeof(bdd)+sizeof(var_table)); 00958 for (q=bddm->assocs, i=1; q; q=q->next, ++i); 00959 mem+=i*bddm->maxvars*sizeof(bdd); 00960 if ((alloc=mem_allocation())) 00961 /* mem_allocation may be meaningless depending on mem library. */ 00962 fprintf(fp, "Memory manager bytes allocated: %ld\n", (long)alloc); 00963 fprintf(fp, "Approximate bytes used: %ld\n", mem); 00964 fprintf(fp, "Number of nodes: %ld\n", ue); 00965 if (bddm->unique_table.node_limit) 00966 fprintf(fp, "Node limit: %ld\n", bddm->unique_table.node_limit); 00967 else 00968 fprintf(fp, "Node limit: ---\n"); 00969 fprintf(fp, "Overflow: %s\n", bddm->overflow ? "yes" : "no"); 00970 fprintf(fp, "Approximate bytes per node: %-.2f\n", ((double)mem)/ue); 00971 fprintf(fp, "Cache entries: %ld\n", ce); 00972 fprintf(fp, "Cache size: %ld\n", 2*cs); 00973 fprintf(fp, "Cache load factor: %-.2f\n", ((double)ce)/(2*cs)); 00974 fprintf(fp, "Cache look ups: %ld\n", bddm->op_cache.lookups); 00975 fprintf(fp, "Cache hits: %ld\n", bddm->op_cache.hits); 00976 if (bddm->op_cache.lookups) 00977 fprintf(fp, "Cache hit rate: %-.2f\n", ((double)(bddm->op_cache.hits))/bddm->op_cache.lookups); 00978 else 00979 fprintf(fp, "Cache hit rate: ---\n"); 00980 fprintf(fp, "Cache insertions: %ld\n", bddm->op_cache.inserts); 00981 fprintf(fp, "Cache collisions: %ld\n", bddm->op_cache.collisions); 00982 fprintf(fp, "Number of variables: %ld\n", bddm->vars); 00983 fprintf(fp, "Number of variable associations: %ld\n", i); 00984 fprintf(fp, "Number of garbage collections: %ld\n", bddm->unique_table.gcs); 00985 fprintf(fp, "Number of nodes garbage collected: %ld\n", bddm->unique_table.freed); 00986 fprintf(fp, "Number of find operations: %ld\n", bddm->unique_table.finds); 00987 }
bdd cmu_bdd_then | ( | cmu_bdd_manager | bddm, | |
bdd | f | |||
) |
Definition at line 651 of file bdd.c.
00652 { 00653 if (bdd_check_arguments(1, f)) 00654 { 00655 BDD_SETUP(f); 00656 if (BDD_IS_CONST(f)) 00657 { 00658 cmu_bdd_warning("cmu_bdd_then: argument is a constant"); 00659 return (f); 00660 } 00661 f=BDD_THEN(f); 00662 BDD_RESET(f); 00663 BDD_INCREFS(f); 00664 } 00665 return (f); 00666 }
long cmu_bdd_total_size | ( | cmu_bdd_manager | bddm | ) |
Definition at line 853 of file bdd.c.
00854 { 00855 return (bddm->unique_table.entries); 00856 }
int cmu_bdd_type | ( | cmu_bdd_manager | bddm, | |
bdd | f | |||
) |
Definition at line 804 of file bdd.c.
00805 { 00806 if (bdd_check_arguments(1, f)) 00807 return (cmu_bdd_type_aux(bddm, f)); 00808 return (BDD_TYPE_OVERFLOW); 00809 }
int cmu_bdd_type_aux | ( | cmu_bdd_manager | bddm, | |
bdd | f | |||
) |
Definition at line 778 of file bdd.c.
00779 { 00780 BDD_SETUP(f); 00781 if (BDD_IS_CONST(f)) 00782 { 00783 if (f == BDD_ZERO(bddm)) 00784 return (BDD_TYPE_ZERO); 00785 if (f == BDD_ONE(bddm)) 00786 return (BDD_TYPE_ONE); 00787 return (BDD_TYPE_CONSTANT); 00788 } 00789 if (BDD_THEN(f) == BDD_ONE(bddm) && BDD_ELSE(f) == BDD_ZERO(bddm)) 00790 return (BDD_TYPE_POSVAR); 00791 if (BDD_THEN(f) == BDD_ZERO(bddm) && BDD_ELSE(f) == BDD_ONE(bddm)) 00792 return (BDD_TYPE_NEGVAR); 00793 return (BDD_TYPE_NONTERMINAL); 00794 }
void cmu_bdd_unfree | ( | cmu_bdd_manager | bddm, | |
bdd | f | |||
) |
Definition at line 815 of file bdd.c.
00816 { 00817 if (f) 00818 { 00819 BDD_SETUP(f); 00820 BDD_INCREFS(f); 00821 } 00822 }
bdd cmu_bdd_var_with_id | ( | cmu_bdd_manager | bddm, | |
long | indexindex | |||
) |
bdd cmu_bdd_var_with_index | ( | cmu_bdd_manager | bddm, | |
long | index | |||
) |
long cmu_bdd_vars | ( | cmu_bdd_manager | bddm | ) |
bdd cmu_bdd_xnor | ( | cmu_bdd_manager | bddm, | |
bdd | f, | |||
bdd | g | |||
) |
static bdd cmu_bdd_xnor_step | ( | cmu_bdd_manager | bddm, | |
bdd | f, | |||
bdd | g | |||
) | [static] |
Definition at line 326 of file bdd.c.
00327 { 00328 int outneg; 00329 bdd_indexindex_type top_indexindex; 00330 bdd f1, f2; 00331 bdd g1, g2; 00332 bdd temp1, temp2; 00333 bdd result; 00334 00335 BDD_SETUP(f); 00336 BDD_SETUP(g); 00337 if (BDD_IS_CONST(f)) 00338 { 00339 BDD_TEMP_INCREFS(g); 00340 if (f == BDD_ONE(bddm)) 00341 return (g); 00342 return (BDD_NOT(g)); 00343 } 00344 if (BDD_IS_CONST(g)) 00345 { 00346 BDD_TEMP_INCREFS(f); 00347 if (g == BDD_ONE(bddm)) 00348 return (f); 00349 return (BDD_NOT(f)); 00350 } 00351 /* f and g are not constant. */ 00352 if (BDD_SAME_OR_NEGATIONS(f, g)) 00353 { 00354 if (f == g) 00355 return (BDD_ONE(bddm)); 00356 return (BDD_ZERO(bddm)); 00357 } 00358 /* f and g are not constant, not same, not negations. */ 00359 if (BDD_OUT_OF_ORDER(f, g)) 00360 BDD_SWAP(f, g); 00361 if (BDD_IS_OUTPOS(g)) 00362 outneg=0; 00363 else 00364 { 00365 outneg=1; 00366 g=BDD_NOT(g); 00367 } 00368 /* g is an uncomplemented output pointer. */ 00369 if (bdd_lookup_in_cache31(bddm, CACHE_TYPE_ITE, (INT_PTR)f, (INT_PTR)g, (INT_PTR)BDD_NOT(g), (INT_PTR *)&result)) 00370 return (outneg ? BDD_NOT(result) : result); 00371 BDD_TOP_VAR2(top_indexindex, bddm, f, g); 00372 BDD_COFACTOR(top_indexindex, f, f1, f2); 00373 BDD_COFACTOR(top_indexindex, g, g1, g2); 00374 temp1=cmu_bdd_xnor_step(bddm, f1, g1); 00375 temp2=cmu_bdd_xnor_step(bddm, f2, g2); 00376 result=bdd_find(bddm, top_indexindex, temp1, temp2); 00377 bdd_insert_in_cache31(bddm, CACHE_TYPE_ITE, (INT_PTR)f, (INT_PTR)g, (INT_PTR)BDD_NOT(g), (INT_PTR)result); 00378 return (outneg ? BDD_NOT(result) : result); 00379 }
bdd cmu_bdd_xor | ( | cmu_bdd_manager | bddm, | |
bdd | f, | |||
bdd | g | |||
) |
Definition at line 545 of file bdd.c.
00546 { 00547 return (cmu_bdd_ite(bddm, f, BDD_NOT(g), g)); 00548 }
bdd cmu_bdd_zero | ( | cmu_bdd_manager | bddm | ) |
static block shift_block | ( | cmu_bdd_manager | bddm, | |
block | b, | |||
long | index | |||
) | [static] |
Definition at line 70 of file bdd.c.
00071 { 00072 long i, j; 00073 block p; 00074 00075 if (b->first_index >= index) 00076 { 00077 bdd_block_delta(b, 1l); 00078 return (b); 00079 } 00080 if (b->last_index < index) 00081 return (b); 00082 b->last_index++; 00083 i=bdd_find_block(b, index); 00084 if (i == b->num_children || b->children[i]->first_index == index) 00085 { 00086 b->children=(block *)mem_resize_block((pointer)b->children, (SIZE_T)(sizeof(block)*(b->num_children+1))); 00087 for (j=b->num_children-1; j >= i; --j) 00088 b->children[j+1]=shift_block(bddm, b->children[j], index); 00089 b->num_children++; 00090 p=(block)BDD_NEW_REC(bddm, sizeof(struct block_)); 00091 p->reorderable=0; 00092 p->first_index=index; 00093 p->last_index=index; 00094 p->num_children=0; 00095 p->children=0; 00096 b->children[i]=p; 00097 } 00098 else 00099 while (i < b->num_children) 00100 { 00101 shift_block(bddm, b->children[i], index); 00102 ++i; 00103 } 00104 return (b); 00105 }