00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef SPOT_TGBA_BDDDICT_HH
00023 # define SPOT_TGBA_BDDDICT_HH
00024
00025 #include <list>
00026 #include <set>
00027 #include <map>
00028 #include <iosfwd>
00029 #include <bdd.h>
00030 #include "ltlast/formula.hh"
00031 #include "misc/bddalloc.hh"
00032
00033 namespace spot
00034 {
00035
00038 class bdd_dict: public bdd_allocator
00039 {
00040 public:
00041
00042 bdd_dict();
00043 ~bdd_dict();
00044
00046 typedef std::map<const ltl::formula*, int> fv_map;
00048 typedef std::map<int, const ltl::formula*> vf_map;
00049
00050 fv_map now_map;
00051 vf_map now_formula_map;
00052 fv_map var_map;
00053 vf_map var_formula_map;
00054 fv_map acc_map;
00055 vf_map acc_formula_map;
00056
00060 bddPair* next_to_now;
00064 bddPair* now_to_next;
00065
00076 int register_proposition(const ltl::formula* f, const void* for_me);
00077
00085 void register_propositions(bdd f, const void* for_me);
00086
00098 int register_state(const ltl::formula* f, const void* for_me);
00099
00110 int register_acceptance_variable(const ltl::formula* f, const void* for_me);
00111
00119 void register_acceptance_variables(bdd f, const void* for_me);
00120
00128 int register_anonymous_variables(int n, const void* for_me);
00129
00136 void register_all_variables_of(const void* from_other, const void* for_me);
00137
00141 void unregister_all_my_variables(const void* me);
00142
00144 void unregister_variable(int var, const void* me);
00145
00148 bool is_registered_proposition(const ltl::formula* f, const void* by_me);
00149 bool is_registered_state(const ltl::formula* f, const void* by_me);
00150 bool is_registered_acceptance_variable(const ltl::formula* f,
00151 const void* by_me);
00153
00156 std::ostream& dump(std::ostream& os) const;
00157
00162 void assert_emptiness() const;
00163
00164 protected:
00166 typedef std::set<const void*> ref_set;
00167 typedef std::map<int, ref_set> vr_map;
00168 vr_map var_refs;
00169
00170 void unregister_variable(vr_map::iterator& cur, const void* me);
00171
00172
00173
00174 #ifndef SWIG
00175 class annon_free_list : public spot::free_list
00176 {
00177 public:
00178
00179
00180
00181 annon_free_list(bdd_dict* d = 0);
00182 virtual int extend(int n);
00183 private:
00184 bdd_dict* dict_;
00185 };
00186 #endif
00187
00189 typedef std::map<const void*, annon_free_list> free_annonymous_list_of_type;
00190 free_annonymous_list_of_type free_annonymous_list_of;
00191
00192 private:
00193
00194 bdd_dict(const bdd_dict& other);
00195 bdd_dict& operator=(const bdd_dict& other);
00196 };
00197
00198
00199 }
00200
00201 #endif // SPOT_TGBA_BDDDICT_HH