00001
00002 #ifndef DIVINE_SPOR_HH
00003 #define DIVINE_SPOR_HH
00004
00005 #include <sevine.h>
00006 #include <list>
00007 #include <set>
00008
00009 namespace divine {
00010
00011 enum change_var_on_cycle_t { CV_INCREASE, CV_DECREASE, CV_NOTHING, CV_ANYTHING };
00012 enum computed_change_t { CC_INCREASE, CC_DECREASE, CC_POSITIVE, CC_NEGATIVE, CC_ZERO, CC_GOOD_VAR, CC_ANYTHING };
00013
00014 struct loc_cycle_t
00015 {
00016 size_int_t cycle_length;
00017 size_int_t *transitions;
00018 change_var_on_cycle_t *vars_and_chans;
00019 };
00020
00021 struct glob_cycle_t
00022 {
00023 size_int_t cycles_length;
00024 size_int_t *transitions;
00025 };
00026
00027 class spor_t
00028 {
00029 public:
00030 ~spor_t();
00031 spor_t(dve_explicit_system_t* system);
00032 void get_sticky_transitions(std::set<size_t> &sticky);
00033 private:
00034 dve_symbol_table_t* Table;
00035 dve_explicit_system_t* System;
00036 std::list<loc_cycle_t> local_cycles;
00037 std::list<glob_cycle_t> global_cycles;
00038 std::set<size_t> sticky_trans;
00039 size_int_t *index_of_var;
00040 size_int_t unwrapped_variables;
00041 dve_process_t *act_process;
00042 std::deque<size_int_t> *process_graph;
00043 size_int_t stack_size;
00044 size_int_t *stack_of_trans;
00045 size_int_t *state_on_stack;
00046 void dfs(size_int_t state);
00047 void collect_local_cycle(size_int_t start_state);
00048 void guard_expr_to_vars(const expression_t *expr0, change_var_on_cycle_t* vars);
00049 void effect_expr_to_vars(const dve_expression_t *expr0, change_var_on_cycle_t* vars);
00050 bool compute_changes(const dve_expression_t *expr_on_left, const dve_expression_t *expr0, computed_change_t &change);
00051 void detect_local_cycles(void);
00052 void global_cycles_cover(void);
00053 void remove_irelevant_local_cycles(void);
00054 void detect_global_cycles(void);
00055 void compute_sticky_transitions(void);
00056 void complete_to_global_cycle(std::list<std::list<loc_cycle_t>::iterator> *candidate, change_var_on_cycle_t *vars_and_chans);
00057 };
00058
00059
00060 }
00061
00062 #endif
00063