00001 #include "mdd.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 array_t *
00019 mdd_substitute_array(
00020 mdd_manager *mgr,
00021 array_t *fn_array,
00022 array_t *old_mvars,
00023 array_t *new_mvars)
00024 {
00025 array_t *new_fn_array;
00026 mdd_t *new_fn, *fn;
00027 int i;
00028
00029 new_fn_array = array_alloc(mdd_t *, 0);
00030 arrayForEachItem(mdd_t *, fn_array, i, fn) {
00031 new_fn = mdd_substitute(mgr, fn, old_mvars, new_mvars);
00032 array_insert(mdd_t *, new_fn_array, i, new_fn);
00033 }
00034
00035 return(new_fn_array);
00036 }
00037
00038 mdd_t *
00039 mdd_substitute(
00040 mdd_manager *mgr,
00041 mdd_t *fn,
00042 array_t *old_mvars,
00043 array_t *new_mvars)
00044 {
00045 array_t *old_bdd_vars, *new_bdd_vars;
00046 int i, j, old_mv_no, new_mv_no, no_mvar;
00047 mvar_type old_mv, new_mv;
00048 mdd_t *top;
00049 array_t *mvar_list = mdd_ret_mvar_list(mgr);
00050 bdd_t *varBdd;
00051
00052 old_bdd_vars = array_alloc( bdd_t *, 0);
00053 new_bdd_vars = array_alloc( bdd_t *, 0);
00054
00055 no_mvar = array_n(old_mvars);
00056 if (no_mvar != array_n(new_mvars))
00057 fail("mdd_substitute: arrays contains different no. of mvars.\n");
00058
00059 for (i=0; i<no_mvar; i++) {
00060 old_mv_no = array_fetch(int, old_mvars, i);
00061 old_mv = array_fetch(mvar_type, mvar_list, old_mv_no);
00062 if (old_mv.status == MDD_BUNDLED) {
00063 (void) fprintf(stderr,
00064 "\nmdd_substitute: bundled variable %s used\n",old_mv.name);
00065 fail("");
00066 }
00067
00068 new_mv_no = array_fetch(int, new_mvars, i);
00069 new_mv = array_fetch(mvar_type, mvar_list, new_mv_no);
00070 if (new_mv.status == MDD_BUNDLED) {
00071 (void) fprintf(stderr,
00072 "\nmdd_substitute: bundled variable %s used\n",new_mv.name);
00073 fail("");
00074 }
00075
00076 if (old_mv.values != new_mv.values)
00077 fail("mdd_substitute: mvars have different no. of values\n");
00078
00079 for (j=0; j<old_mv.encode_length; j++) {
00080 varBdd = bdd_get_variable( mgr, mdd_ret_bvar_id(&old_mv,j) );
00081 array_insert_last( bdd_t *, old_bdd_vars, varBdd );
00082
00083 varBdd = bdd_get_variable( mgr, mdd_ret_bvar_id(&new_mv, j) );
00084 array_insert_last( bdd_t *, new_bdd_vars, varBdd);
00085 }
00086 }
00087 top = bdd_substitute(fn, old_bdd_vars, new_bdd_vars);
00088
00089 for(j=0; j<array_n(old_bdd_vars); j++) {
00090 varBdd = array_fetch(bdd_t*,old_bdd_vars,j);
00091 bdd_free(varBdd);
00092 }
00093 array_free(old_bdd_vars);
00094 for(j=0; j<array_n(new_bdd_vars); j++) {
00095 varBdd = array_fetch(bdd_t*,new_bdd_vars,j);
00096 bdd_free(varBdd);
00097 }
00098 array_free(new_bdd_vars);
00099
00100 return top;
00101 }
00102
00103
00104
00105
00106