00001
00004 #ifndef DIVINE_DVE_TRANSITION_HH
00005 #define DIVINE_DVE_TRANSITION_HH
00006
00007 #ifndef DOXYGEN_PROCESSING
00008 #include <iostream>
00009 #include <string>
00010 #include <sstream>
00011 #include "system/transition.hh"
00012 #include "common/error.hh"
00013 #include "system/dve/dve_expression.hh"
00014 #include "system/dve/dve_source_position.hh"
00015 #include "common/array.hh"
00016 #include "common/bit_string.hh"
00017 #include "common/deb.hh"
00018
00019 namespace divine {
00020 using std::cerr; using std::endl;
00021 #endif //DOXYGEN_PROCESSING
00022
00023 class dve_parser_t;
00024 class dve_symbol_table_t;
00025
00026
00027
00029 enum sync_mode_t { SYNC_NO_SYNC = 0,
00030 SYNC_EXCLAIM = 1,
00031 SYNC_ASK = 2,
00032 SYNC_EXCLAIM_BUFFER = 3,
00033 SYNC_ASK_BUFFER = 4
00034 };
00035
00038 const size_int_t TR_effects_default_alloc = 10;
00041 const size_int_t TR_effects_alloc_step = 20;
00042
00044
00069 class dve_transition_t: public dve_source_position_t, public virtual transition_t
00070 {
00071 private:
00072 static dve_parser_t trans_parser;
00073
00074 protected:
00075 typedef array_t<dve_expression_t *> effects_container_t;
00076 bool valid;
00077
00078 size_int_t state1_gid;
00079 size_int_t state1_lid;
00080 size_int_t state2_gid;
00081 size_int_t state2_lid;
00082 size_int_t channel_gid;
00083 dve_expression_t * guard;
00084
00085 array_t<dve_expression_t *> sync_exprs;
00086
00087 sync_mode_t sync_mode;
00088 effects_container_t effects;
00089
00090
00091 bit_string_t glob_mask;
00092
00093 size_int_t process_gid;
00094
00095
00096 size_int_t part_id;
00097
00098 public:
00099
00101 dve_transition_t():
00102 transition_t(),
00103 valid(false),
00104 sync_exprs(1,10),
00105 effects(TR_effects_default_alloc,TR_effects_alloc_step)
00106 { guard = 0; }
00109 dve_transition_t(system_t * const system):
00110 transition_t(system),
00111 valid(false),
00112 sync_exprs(1,10),
00113 effects(TR_effects_default_alloc,TR_effects_alloc_step)
00114 { guard = 0; }
00115
00117 virtual ~dve_transition_t();
00118
00120
00121 virtual std::string to_string() const;
00123 virtual void write(std::ostream & ostr) const;
00124
00128
00129 virtual int from_string(std::string & trans_str,
00130 const size_int_t process_gid = NO_ID);
00132 virtual int read(std::istream & istr, size_int_t process_gid = NO_ID);
00142
00144
00146 dve_symbol_table_t * get_symbol_table() const;
00148
00150 bool get_valid() const { return valid; }
00152 void set_valid(const bool valid_value) { valid = valid_value; }
00154 size_int_t get_state1_gid() const { return state1_gid; }
00156 void set_state1_gid(const size_int_t state_gid);
00158 size_int_t get_state2_gid() const { return state2_gid; }
00160 void set_state2_gid(const size_int_t state_gid);
00162 size_int_t get_state1_lid() const { return state1_lid; }
00164 size_int_t get_state2_lid() const { return state2_lid; }
00166
00168 size_int_t get_channel_gid() const { return channel_gid; }
00170 void set_channel_gid(const size_int_t gid_of_channel)
00171 { channel_gid = gid_of_channel; }
00173
00174 dve_expression_t * get_guard() { return guard; }
00177
00178 const dve_expression_t * get_guard() const { return guard; }
00180 void set_guard(dve_expression_t * const guard_expr) { guard = guard_expr; }
00182 size_int_t get_sync_expr_list_size() const { return sync_exprs.size(); }
00184 void set_sync_expr_list_size(const size_int_t size) {sync_exprs.resize(size);}
00186
00188 dve_expression_t * get_sync_expr_list_item(const size_int_t i)
00189 { return (sync_exprs.size() ? sync_exprs[i] : 0); }
00192
00195 const dve_expression_t * get_sync_expr_list_item(const size_int_t i) const
00196 { return (sync_exprs.size() ? sync_exprs[i] : 0); }
00198 void set_sync_expr_list_item(const size_int_t i,
00199 dve_expression_t * const synchro_expr)
00200 { sync_exprs[i] = synchro_expr; }
00202 sync_mode_t get_sync_mode() const { return sync_mode; }
00204 void set_sync_mode(const sync_mode_t synchro_mode) { sync_mode=synchro_mode; }
00206 bool is_without_sync() const { return (sync_mode==SYNC_NO_SYNC); }
00208 bool is_sync_exclaim() const { return (sync_mode==SYNC_EXCLAIM); }
00210 bool is_sync_ask() const { return (sync_mode==SYNC_ASK); }
00212
00216 dve_expression_t * get_effect(size_int_t eff_nbr) const
00217 { return effects[eff_nbr];}
00219 void add_effect(dve_expression_t * const effect)
00220 { effects.push_back(effect); }
00222 size_int_t get_effect_count() const { return effects.size(); }
00224
00227 const bit_string_t & get_glob_mask() const { return glob_mask; }
00229 void set_glob_mark(const size_int_t i, const bool mark)
00230 { if (mark) glob_mask.enable_bit(i); else glob_mask.disable_bit(i); }
00233 void alloc_glob_mask(const size_int_t count_of_glob_vars)
00234 { glob_mask.alloc_mem(count_of_glob_vars); }
00236 size_int_t get_process_gid() const { return process_gid; }
00238
00239 void set_process_gid(const size_int_t gid) { process_gid = gid; }
00242
00245 size_int_t get_partial_id() const { return part_id; }
00247
00249 void set_partial_id(const size_int_t partial_id) { part_id = partial_id; }
00250
00251
00252
00254 const char * get_state1_name() const;
00256 const char * get_state2_name() const;
00258
00261 bool get_guard_string(std::string & str) const;
00263
00265 const char * get_sync_channel_name() const;
00268
00272 bool get_sync_expr_string(std::string & str) const;
00274 void get_effect_expr_string(size_int_t i, std::string & str) const;
00276 };
00277
00278 #ifndef DOXYGEN_PROCESSING
00279 }
00280 #include "common/undeb.hh"
00281
00282 #endif //DOXYGEN_PROCESSING
00283
00284 #endif
00285
00286