00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00038 #ifndef __NUSMV_CORE_COMPILE_SYMB_TABLE_SYMB_LAYER_H__
00039 #define __NUSMV_CORE_COMPILE_SYMB_TABLE_SYMB_LAYER_H__
00040
00041 #include "nusmv/core/compile/symb_table/SymbType.h"
00042 #include "nusmv/core/utils/utils.h"
00043 #include "nusmv/core/utils/NodeList.h"
00044 #include "nusmv/core/node/node.h"
00045 #include "nusmv/core/compile/symb_table/NFunction.h"
00046 #include "nusmv/core/set/set.h"
00047
00055 typedef struct SymbLayer_TAG* SymbLayer_ptr;
00056
00062 #define SYMB_LAYER(x) \
00063 ((SymbLayer_ptr) x)
00064
00070 #define SYMB_LAYER_CHECK_INSTANCE(x) \
00071 (nusmv_assert(SYMB_LAYER(x) != SYMB_LAYER(NULL)))
00072
00073
00090 typedef enum LayerInsertPolicy_TAG {
00091 SYMB_LAYER_POS_DEFAULT,
00092 SYMB_LAYER_POS_FORCE_TOP,
00093 SYMB_LAYER_POS_TOP,
00094 SYMB_LAYER_POS_BOTTOM,
00095 SYMB_LAYER_POS_FORCE_BOTTOM
00096 } LayerInsertPolicy;
00097
00103 typedef boolean (*SymbLayerIterFilterFun)(const SymbLayer_ptr layer,
00104 const node_ptr sym,
00105 void* arg);
00106
00107 typedef struct SymbLayerIter_TAG {
00108 unsigned int index;
00109 unsigned int mask;
00110 SymbLayerIterFilterFun filter;
00111 void* arg;
00112 } SymbLayerIter;
00113
00119 #define SYMB_LAYER_FOREACH(self, iter, mask) \
00120 for (SymbLayer_gen_iter(self, &iter, mask); \
00121 !SymbLayer_iter_is_end(self, &iter); \
00122 SymbLayer_iter_next(self, &iter))
00123
00129 #define SYMB_LAYER_FOREACH_FILTER(self, iter, mask, filter, arg) \
00130 for (SymbLayer_gen_iter(self, &iter, mask), \
00131 SymbLayer_iter_set_filter(self, &iter, filter, arg); \
00132 !SymbLayer_iter_is_end(self, &iter); \
00133 SymbLayer_iter_next(self, &iter))
00134
00135
00136
00137
00138
00139
00140
00141
00142
00151 void SymbLayer_gen_iter(const SymbLayer_ptr self,
00152 SymbLayerIter* iter,
00153 unsigned int mask);
00154
00163 void SymbLayer_iter_next(const SymbLayer_ptr self,
00164 SymbLayerIter* iter);
00165
00172 boolean SymbLayer_iter_is_end(const SymbLayer_ptr self,
00173 const SymbLayerIter* iter);
00174
00181 node_ptr SymbLayer_iter_get_symbol(const SymbLayer_ptr self,
00182 const SymbLayerIter* iter);
00183
00193 void
00194 SymbLayer_iter_set_filter(const SymbLayer_ptr layer,
00195 SymbLayerIter* iter,
00196 SymbLayerIterFilterFun fun,
00197 void* arg);
00198
00206 boolean
00207 SymbLayer_iter_filter_bool_vars(const SymbLayer_ptr self,
00208 const node_ptr sym,
00209 void* arg);
00210
00219 Set_t
00220 SymbLayer_iter_to_set(const SymbLayer_ptr self, SymbLayerIter iter);
00221
00230 NodeList_ptr
00231 SymbLayer_iter_to_list(const SymbLayer_ptr self, SymbLayerIter iter);
00232
00241 unsigned int
00242 SymbLayer_iter_count(const SymbLayer_ptr self, SymbLayerIter iter);
00243
00250 const char*
00251 SymbLayer_get_name(const SymbLayer_ptr self);
00252
00263 boolean
00264 SymbLayer_can_declare_constant(const SymbLayer_ptr self,
00265 const node_ptr name);
00266
00275 void
00276 SymbLayer_declare_constant(SymbLayer_ptr self, node_ptr name);
00277
00287 boolean
00288 SymbLayer_can_declare_var(const SymbLayer_ptr self,
00289 const node_ptr name);
00290
00300 void
00301 SymbLayer_declare_input_var(SymbLayer_ptr self, node_ptr var,
00302 SymbType_ptr type);
00303
00313 void
00314 SymbLayer_declare_state_var(SymbLayer_ptr self, node_ptr var,
00315 SymbType_ptr type);
00316
00326 void
00327 SymbLayer_declare_frozen_var(SymbLayer_ptr self, node_ptr var,
00328 SymbType_ptr type);
00329
00338 void
00339 SymbLayer_redeclare_state_as_frozen_var(SymbLayer_ptr self, node_ptr var);
00340
00350 boolean
00351 SymbLayer_can_declare_define(const SymbLayer_ptr self,
00352 const node_ptr name);
00353
00363 boolean
00364 SymbLayer_can_declare_function(const SymbLayer_ptr self,
00365 const node_ptr name);
00366
00376 boolean
00377 SymbLayer_can_declare_parameter(const SymbLayer_ptr self,
00378 const node_ptr name);
00379
00389 boolean
00390 SymbLayer_can_declare_array_define(const SymbLayer_ptr self,
00391 const node_ptr name);
00392
00402 boolean
00403 SymbLayer_can_declare_variable_array(const SymbLayer_ptr self,
00404 const node_ptr name);
00405
00413 void
00414 SymbLayer_declare_define(SymbLayer_ptr self, node_ptr name,
00415 node_ptr ctx, node_ptr definition);
00416
00427 void
00428 SymbLayer_declare_function(SymbLayer_ptr self, node_ptr name,
00429 node_ptr ctx, SymbType_ptr type);
00430
00438 void
00439 SymbLayer_declare_parameter(SymbLayer_ptr self, node_ptr formal,
00440 node_ptr ctx, node_ptr actual);
00441
00449 void
00450 SymbLayer_declare_array_define(SymbLayer_ptr self, node_ptr name,
00451 node_ptr ctx, node_ptr definition);
00452
00460 void
00461 SymbLayer_declare_variable_array(SymbLayer_ptr self, node_ptr var,
00462 SymbType_ptr type);
00463
00476 void SymbLayer_remove_symbol(SymbLayer_ptr self, node_ptr name);
00477
00488 void SymbLayer_remove_var(SymbLayer_ptr self, node_ptr name);
00489
00500 void SymbLayer_remove_define(SymbLayer_ptr self, node_ptr name);
00501
00512 void SymbLayer_remove_function(SymbLayer_ptr self, node_ptr name);
00513
00524 void SymbLayer_remove_variable_array(SymbLayer_ptr self, node_ptr name);
00525
00526
00533 int SymbLayer_get_symbols_num(const SymbLayer_ptr self);
00534
00541 int SymbLayer_get_constants_num(const SymbLayer_ptr self);
00542
00549 int SymbLayer_get_state_vars_num(const SymbLayer_ptr self);
00550
00557 int SymbLayer_get_bool_state_vars_num(const SymbLayer_ptr self);
00558
00565 int SymbLayer_get_frozen_vars_num(const SymbLayer_ptr self);
00566
00573 int SymbLayer_get_bool_frozen_vars_num(const SymbLayer_ptr self);
00574
00581 int SymbLayer_get_input_vars_num(const SymbLayer_ptr self);
00582
00589 int SymbLayer_get_vars_num(const SymbLayer_ptr self);
00590
00597 int SymbLayer_get_bool_input_vars_num(const SymbLayer_ptr self);
00598
00605 int SymbLayer_get_defines_num(const SymbLayer_ptr self);
00606
00613 int SymbLayer_get_functions_num(const SymbLayer_ptr self);
00614
00621 int SymbLayer_get_parameters_num(const SymbLayer_ptr self);
00622
00629 int SymbLayer_get_array_defines_num(const SymbLayer_ptr self);
00630
00637 int SymbLayer_get_variable_arrays_num(const SymbLayer_ptr self);
00638
00647 boolean
00648 SymbLayer_must_insert_before(const SymbLayer_ptr self,
00649 const SymbLayer_ptr other);
00650
00657 boolean
00658 SymbLayer_is_variable_in_layer(SymbLayer_ptr self,
00659 node_ptr name);
00660
00667 boolean
00668 SymbLayer_is_symbol_in_layer(SymbLayer_ptr self, node_ptr name);
00669
00678 LayerInsertPolicy
00679 SymbLayer_get_insert_policy(const SymbLayer_ptr self);
00680
00687 NuSMVEnv_ptr SymbLayer_get_environment(const SymbLayer_ptr self);
00688
00689 #endif