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
00039 #ifndef __NUSMV_CORE_WFF_EXPR_MGR_H__
00040 #define __NUSMV_CORE_WFF_EXPR_MGR_H__
00041
00042 #if HAVE_CONFIG_H
00043 # include "nusmv-config.h"
00044 #endif
00045
00046 #include "nusmv/core/utils/utils.h"
00047 #include "nusmv/core/cinit/NuSMVEnv.h"
00048 #include "nusmv/core/node/node.h"
00049 #include "nusmv/core/compile/symb_table/SymbTable.h"
00050
00051
00052
00053
00059 #define EXPR_UNTIMED_CURRENT -2
00060
00066 #define EXPR_UNTIMED_NEXT -1
00067
00073 #define EXPR_UNTIMED_DONTCARE -3
00074
00080 #define EXPR_TIME_OFS 10
00081
00090 typedef enum {
00091 EXPR_SIMPLE,
00092 EXPR_NEXT,
00093 EXPR_LTL,
00094 EXPR_CTL
00095 } ExprKind;
00096
00102 typedef node_ptr Expr_ptr;
00103
00109 #define EXPR(x) \
00110 ((Expr_ptr) x)
00111
00117 #define EXPR_CHECK_INSTANCE(x) \
00118 (nusmv_assert(EXPR(x) != EXPR(NULL)))
00119
00126 typedef struct ExprMgr_TAG* ExprMgr_ptr;
00127
00134 #define EXPR_MGR(self) \
00135 ((ExprMgr_ptr) self)
00136
00142 #define EXPR_MGR_CHECK_INSTANCE(self) \
00143 (nusmv_assert(EXPR_MGR(self) != EXPR_MGR(NULL)))
00144
00150 #define Expr_get_type(t) \
00151 node_get_type(t)
00152
00153
00156
00157
00158
00159
00160
00169 ExprMgr_ptr ExprMgr_create(const NuSMVEnv_ptr env);
00170
00179 void ExprMgr_destroy(ExprMgr_ptr self);
00180
00181
00188 NodeMgr_ptr ExprMgr_get_node_manager(const ExprMgr_ptr self);
00189
00190
00191
00192
00218 Expr_ptr ExprMgr_simplify(const ExprMgr_ptr self, SymbTable_ptr st, Expr_ptr expr);
00219
00248 Expr_ptr ExprMgr_resolve(const ExprMgr_ptr self, SymbTable_ptr st,
00249 int type, Expr_ptr left, Expr_ptr right);
00250
00251
00252
00253
00262 boolean ExprMgr_is_equal_to_zero(const ExprMgr_ptr self, const Expr_ptr input);
00263
00270 boolean
00271 ExprMgr_is_ge_to_number(const ExprMgr_ptr self, const Expr_ptr input,
00272 const Expr_ptr number);
00273
00282 boolean ExprMgr_is_true(const ExprMgr_ptr self, const Expr_ptr expr);
00283
00292 boolean ExprMgr_is_false(const ExprMgr_ptr self, const Expr_ptr expr);
00293
00303 boolean ExprMgr_is_boolean_range(const ExprMgr_ptr self, Expr_ptr expr);
00304
00313 boolean ExprMgr_is_number(const ExprMgr_ptr self, const Expr_ptr expr, const int value);
00314
00330 boolean ExprMgr_is_timed(const ExprMgr_ptr self, Expr_ptr expr, hash_ptr cache);
00331
00340 boolean ExprMgr_is_syntax_correct(Expr_ptr exp, ExprKind expectedKind);
00341
00342
00343
00352 Expr_ptr ExprMgr_boolean_range(const ExprMgr_ptr self);
00353
00362 Expr_ptr ExprMgr_true(const ExprMgr_ptr self);
00363
00372 Expr_ptr ExprMgr_false(const ExprMgr_ptr self);
00373
00382 Expr_ptr ExprMgr_number(const ExprMgr_ptr self, int value);
00383
00395 Expr_ptr ExprMgr_word_max_value(const ExprMgr_ptr self,
00396 const int size, const int type);
00397
00406 Expr_ptr ExprMgr_next(const ExprMgr_ptr self, const Expr_ptr a, const SymbTable_ptr st);
00407
00418 Expr_ptr ExprMgr_ite(const ExprMgr_ptr self, const Expr_ptr cond,
00419 const Expr_ptr t,
00420 const Expr_ptr e,
00421 const SymbTable_ptr st);
00422
00432 Expr_ptr ExprMgr_equal(const ExprMgr_ptr self, const Expr_ptr a,
00433 const Expr_ptr b,
00434 const SymbTable_ptr st);
00435
00445 Expr_ptr ExprMgr_notequal(const ExprMgr_ptr self, const Expr_ptr a,
00446 const Expr_ptr b,
00447 const SymbTable_ptr st);
00448
00459 Expr_ptr ExprMgr_le(const ExprMgr_ptr self, const Expr_ptr a,
00460 const Expr_ptr b,
00461 const SymbTable_ptr st);
00462
00473 Expr_ptr ExprMgr_ge(const ExprMgr_ptr self, const Expr_ptr a,
00474 const Expr_ptr b,
00475 const SymbTable_ptr st);
00476
00486 Expr_ptr ExprMgr_simplify_word_extend(const ExprMgr_ptr self, const SymbTable_ptr st,
00487 Expr_ptr w, Expr_ptr i);
00488
00497 Expr_ptr ExprMgr_attime(const ExprMgr_ptr self, Expr_ptr e, int time,
00498 const SymbTable_ptr st);
00499
00511 Expr_ptr ExprMgr_word_constant(const ExprMgr_ptr self, const SymbTable_ptr st,
00512 int type,
00513 Expr_ptr w,
00514 Expr_ptr i);
00515
00529 Expr_ptr ExprMgr_and_from_list(const ExprMgr_ptr self, node_ptr list,
00530 const SymbTable_ptr st);
00531
00540 Expr_ptr ExprMgr_and(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00541
00551 Expr_ptr ExprMgr_and_nil(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00552
00561 Expr_ptr ExprMgr_not(const ExprMgr_ptr self, const Expr_ptr expr);
00562
00571 Expr_ptr ExprMgr_or(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00572
00581 Expr_ptr ExprMgr_xor(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00582
00591 Expr_ptr ExprMgr_xnor(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00592
00601 Expr_ptr ExprMgr_iff(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00602
00611 Expr_ptr ExprMgr_implies(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00612
00622 Expr_ptr ExprMgr_lt(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00623
00633 Expr_ptr ExprMgr_simplify_lt(const ExprMgr_ptr self, const SymbTable_ptr st,
00634 const Expr_ptr a,
00635 const Expr_ptr b);
00636
00647 Expr_ptr ExprMgr_gt(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00648
00659 Expr_ptr ExprMgr_simplify_gt(const ExprMgr_ptr self, const SymbTable_ptr st,
00660 const Expr_ptr a,
00661 const Expr_ptr b);
00662
00672 Expr_ptr ExprMgr_plus(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00673
00683 Expr_ptr ExprMgr_minus(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00684
00694 Expr_ptr ExprMgr_times(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00695
00705 Expr_ptr ExprMgr_divide(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00706
00716 Expr_ptr ExprMgr_mod(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
00717
00728 Expr_ptr ExprMgr_unary_minus(const ExprMgr_ptr self, const Expr_ptr a);
00729
00739 Expr_ptr ExprMgr_array_read(const ExprMgr_ptr self,
00740 const Expr_ptr a, const Expr_ptr i);
00741
00751 Expr_ptr ExprMgr_array_write(const ExprMgr_ptr self,
00752 const Expr_ptr a, const Expr_ptr i,
00753 const Expr_ptr v);
00754
00764 Expr_ptr ExprMgr_array_const(const ExprMgr_ptr self,
00765 const Expr_ptr a, const Expr_ptr v);
00766
00786 Expr_ptr ExprMgr_word_left_shift(const ExprMgr_ptr self, const Expr_ptr a,
00787 const Expr_ptr b);
00788
00808 Expr_ptr ExprMgr_word_right_shift(const ExprMgr_ptr self, const Expr_ptr a,
00809 const Expr_ptr b);
00810
00830 Expr_ptr ExprMgr_word_left_rotate(const ExprMgr_ptr self, const Expr_ptr a,
00831 const Expr_ptr b);
00832
00852 Expr_ptr ExprMgr_word_right_rotate(const ExprMgr_ptr self, const Expr_ptr a,
00853 const Expr_ptr b);
00854
00874 Expr_ptr ExprMgr_word_bit_select(const ExprMgr_ptr self, const Expr_ptr w,
00875 const Expr_ptr r);
00876
00896 Expr_ptr ExprMgr_simplify_word_bit_select(const ExprMgr_ptr self, const SymbTable_ptr st,
00897 const Expr_ptr w,
00898 const Expr_ptr r);
00899
00919 Expr_ptr ExprMgr_word_concatenate(const ExprMgr_ptr self, const Expr_ptr a,
00920 const Expr_ptr b);
00921
00941 Expr_ptr ExprMgr_word1_to_bool(const ExprMgr_ptr self, Expr_ptr w);
00942
00962 Expr_ptr ExprMgr_bool_to_word1(const ExprMgr_ptr self, Expr_ptr a);
00963
00984 Expr_ptr ExprMgr_signed_word_to_unsigned(const ExprMgr_ptr self, Expr_ptr w);
00985
01005 Expr_ptr ExprMgr_unsigned_word_to_signed(const ExprMgr_ptr self, Expr_ptr w);
01006
01016 Expr_ptr ExprMgr_word_extend(const ExprMgr_ptr self, Expr_ptr w,
01017 Expr_ptr i,
01018 const SymbTable_ptr st);
01019
01028 int ExprMgr_attime_get_time(const ExprMgr_ptr self, Expr_ptr e);
01029
01038 Expr_ptr ExprMgr_attime_get_untimed(const ExprMgr_ptr self, Expr_ptr e);
01039
01050 Expr_ptr ExprMgr_union(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
01051
01061 Expr_ptr ExprMgr_setin(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b, const SymbTable_ptr st);
01062
01071 Expr_ptr ExprMgr_range(const ExprMgr_ptr self, const Expr_ptr a, const Expr_ptr b);
01072
01083 Expr_ptr ExprMgr_function(const ExprMgr_ptr self, const Expr_ptr name,
01084 const Expr_ptr params);
01085
01107 int ExprMgr_get_time(const ExprMgr_ptr self, SymbTable_ptr st, Expr_ptr expr);
01108
01137 int* ExprMgr_get_time_interval(const ExprMgr_ptr self,
01138 const SymbTable_ptr st,
01139 Expr_ptr expr);
01140
01149 Expr_ptr ExprMgr_untimed(const ExprMgr_ptr self, SymbTable_ptr st, Expr_ptr expr);
01150
01161 Expr_ptr ExprMgr_untimed_explicit_time(const ExprMgr_ptr self, SymbTable_ptr st,
01162 Expr_ptr expr,
01163 int time);
01164
01175 Expr_ptr ExprMgr_wsizeof(const ExprMgr_ptr self, Expr_ptr l, Expr_ptr r);
01176
01185 Expr_ptr ExprMgr_cast_toint(const ExprMgr_ptr self, Expr_ptr l, Expr_ptr r);
01186
01196 Expr_ptr ExprMgr_simplify_floor(const ExprMgr_ptr self, const SymbTable_ptr symb_table,
01197 Expr_ptr body);
01198
01199
01208 Expr_ptr ExprMgr_floor(const ExprMgr_ptr self, Expr_ptr l);
01209
01210
01219 Expr_ptr ExprMgr_plus_one(const ExprMgr_ptr self,
01220 const Expr_ptr a);
01221
01230 Expr_ptr ExprMgr_minus_one(const ExprMgr_ptr self,
01231 const Expr_ptr a);
01232
01240 Expr_ptr ExprMgr_plus_number(const ExprMgr_ptr self,
01241 const Expr_ptr a,
01242 const Expr_ptr b);
01243
01252 Expr_ptr ExprMgr_simplify_iff(const ExprMgr_ptr self,
01253 const SymbTable_ptr st,
01254 const Expr_ptr a,
01255 const Expr_ptr b);
01256
01265 Expr_ptr ExprMgr_simplify_word_resize(const ExprMgr_ptr self, const SymbTable_ptr st,
01266 Expr_ptr w,
01267 Expr_ptr i);
01268
01269
01277 Expr_ptr ExprMgr_cast_to_unsigned_word(const ExprMgr_ptr self,
01278 Expr_ptr width, Expr_ptr arg);
01279
01289 boolean ExprMgr_time_is_dont_care(const ExprMgr_ptr self, int time);
01290
01300 boolean ExprMgr_time_is_current(const ExprMgr_ptr self, int time);
01301
01311 boolean ExprMgr_time_is_next(const ExprMgr_ptr self, int time);
01312
01319 Expr_ptr ExprMgr_move_next_to_leaves(const ExprMgr_ptr self, SymbTable_ptr st, Expr_ptr expr);
01320
01325 #endif