00001
00002
00003
00004 #include "bddint.h"
00005
00006
00007 static
00008 void
00009 add_block(block b1, block b2)
00010 {
00011 long i, j, k;
00012 block start, end;
00013
00014 if (b1->num_children)
00015 {
00016 i=bdd_find_block(b1, b2->first_index);
00017 start=b1->children[i];
00018 j=bdd_find_block(b1, b2->last_index);
00019 end=b1->children[j];
00020 if (i == j)
00021 add_block(start, b2);
00022 else
00023 {
00024 if (start->first_index != b2->first_index || end->last_index != b2->last_index)
00025 cmu_bdd_fatal("add_block: illegal block overlap");
00026 b2->num_children=j-i+1;
00027 b2->children=(block *)mem_get_block((SIZE_T)(sizeof(block)*b2->num_children));
00028 for (k=0; k < b2->num_children; ++k)
00029 b2->children[k]=b1->children[i+k];
00030 b1->children[i]=b2;
00031 ++i;
00032 for (k=j+1; k < b1->num_children; ++k, ++i)
00033 b1->children[i]=b1->children[k];
00034 b1->num_children-=(b2->num_children-1);
00035 b1->children=(block *)mem_resize_block((pointer)b1->children, (SIZE_T)(sizeof(block)*b1->num_children));
00036 }
00037 }
00038 else
00039 {
00040
00041 b1->num_children=1;
00042 b1->children=(block *)mem_get_block((SIZE_T)(sizeof(block)*b1->num_children));
00043 b1->children[0]=b2;
00044 b2->num_children=0;
00045 b2->children=0;
00046 }
00047 }
00048
00049
00050 block
00051 cmu_bdd_new_var_block(cmu_bdd_manager bddm, bdd v, long n)
00052 {
00053 block b;
00054
00055 if (bdd_check_arguments(1, v))
00056 {
00057 BDD_SETUP(v);
00058 if (cmu_bdd_type_aux(bddm, v) != BDD_TYPE_POSVAR)
00059 {
00060 cmu_bdd_warning("cmu_bdd_new_var_block: second argument is not a positive variable");
00061 if (BDD_IS_CONST(v))
00062 return ((block)0);
00063 }
00064 b=(block)BDD_NEW_REC(bddm, sizeof(struct block_));
00065 b->reorderable=0;
00066 b->first_index=BDD_INDEX(bddm, v);
00067 if (n <= 0)
00068 {
00069 cmu_bdd_warning("cmu_bdd_new_var_block: invalid final argument");
00070 n=1;
00071 }
00072 b->last_index=b->first_index+n-1;
00073 if (b->last_index >= bddm->vars)
00074 {
00075 cmu_bdd_warning("cmu_bdd_new_var_block: range covers non-existent variables");
00076 b->last_index=bddm->vars-1;
00077 }
00078 add_block(bddm->super_block, b);
00079 return (b);
00080 }
00081 return ((block)0);
00082 }