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_PARSER_PSL_PSL_EXPR_H__
00039 #define __NUSMV_CORE_PARSER_PSL_PSL_EXPR_H__
00040
00041 #include "nusmv/core/parser/psl/pslNode.h"
00042 #include "nusmv/core/utils/utils.h"
00043 #include "nusmv/core/utils/error.h"
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 typedef enum SyntaxClass_TAG
00054 {
00055 SC_NUM_EXPR,
00056 SC_BOOL_EXPR,
00057 SC_WORD_EXPR,
00058 SC_IDENTIFIER,
00059 SC_NUM_BOOL_WORD_EXPR,
00060 SC_NUM_BOOL_EXPR,
00061
00062 SC_BOOL_WORD_EXPR,
00063
00064 SC_NUM_WORD_EXPR,
00065
00066 SC_PROPERTY,
00067 SC_FL_PROPERTY,
00068 SC_OBE_PROPERTY,
00069
00070 SC_SEQUENCE,
00071 SC_REPLICATOR,
00072 SC_NONE,
00073 SC_RANGE,
00074 SC_LIST,
00075 SC_NUM_RANGE
00076 } SyntaxClass ;
00077
00078
00079 typedef struct PslExpr_TAG
00080 {
00081 SyntaxClass klass;
00082 PslNode_ptr psl_node;
00083 } PslExpr;
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00110 #define PSL_EXPR_MAKE_W2W_OP(env, res, right, op) \
00111 psl_expr_make_unary_op(env, &res, &right, op, SC_WORD_EXPR, SC_WORD_EXPR)
00112
00118 #define PSL_EXPR_MAKE_B2W_OP(env, res, right, op) \
00119 psl_expr_make_unary_op(env, &res, &right, op, SC_BOOL_EXPR, SC_WORD_EXPR)
00120
00126 #define PSL_EXPR_MAKE_W2B_OP(env, res, right, op) \
00127 psl_expr_make_unary_op(env, &res, &right, op, SC_WORD_EXPR, SC_BOOL_EXPR)
00128
00134 #define PSL_EXPR_MAKE_W2N_OP(env, res, right, op) \
00135 psl_expr_make_unary_op(env, &res, &right, op, SC_WORD_EXPR, SC_BOOL_EXPR)
00136
00142 #define PSL_EXPR_MAKE_NW2NW_OP(env, res, right, op) \
00143 psl_expr_make_unary_op(env, &res, &right, op, SC_NUM_WORD_EXPR, SC_NUM_WORD_EXPR)
00144
00150 #define PSL_EXPR_MAKE_BW2BW_OP(env, res, right, op) \
00151 psl_expr_make_unary_op(env, &res, &right, op, SC_BOOL_WORD_EXPR, SC_BOOL_WORD_EXPR)
00152
00158 #define PSL_EXPR_MAKE_N2N_OP(env, res, right, op) \
00159 psl_expr_make_unary_op(env, &res, &right, op, SC_NUM_EXPR, SC_NUM_EXPR)
00160
00166 #define PSL_EXPR_MAKE_N2B_OP(env, res, right, op) \
00167 psl_expr_make_unary_op(env, &res, &right, op, SC_NUM_EXPR, SC_BOOL_EXPR)
00168
00174 #define PSL_EXPR_MAKE_B2B_OP(env, res, right, op) \
00175 psl_expr_make_unary_op(env, &res, &right, op, SC_BOOL_EXPR, SC_BOOL_EXPR)
00176
00182 #define PSL_EXPR_MAKE_NBW2N_OP(env, res, right, op) \
00183 psl_expr_make_unary_op(env, &res, &right, op, SC_NUM_BOOL_WORD_EXPR, SC_NUM_EXPR)
00184
00190 #define PSL_EXPR_MAKE_NBW2B_OP(env, res, right, op) \
00191 psl_expr_make_unary_op(env, &res, &right, op, SC_NUM_BOOL_WORD_EXPR, SC_BOOL_EXPR)
00192
00198 #define PSL_EXPR_MAKE_F2F_OP(env, res, right, op) \
00199 psl_expr_make_unary_op(env, &res, &right, op, SC_FL_PROPERTY, SC_FL_PROPERTY)
00200
00206 #define PSL_EXPR_MAKE_B2F_OP(env, res, right, op) \
00207 psl_expr_make_unary_op(env, &res, &right, op, SC_BOOL_EXPR, SC_FL_PROPERTY)
00208
00209
00210
00216 #define PSL_EXPR_MAKE_T2T_OP(env, res, right, op) \
00217 psl_expr_make_unary_op(env, &res, &right, op, right.klass, right.klass)
00218
00219
00220
00226 #define PSL_EXPR_MAKE_W_N2W_OP(env, res, left, op, right) \
00227 psl_expr_make_binary_mixed_op(env, &res, &left, op, &right, \
00228 SC_WORD_EXPR, SC_NUM_EXPR, SC_WORD_EXPR)
00229
00230
00236 #define PSL_EXPR_MAKE_N_N2W_OP(env, res, left, op, right) \
00237 psl_expr_make_binary_op(env, &res, &left, op, &right, \
00238 SC_NUM_EXPR, SC_WORD_EXPR)
00239
00245 #define PSL_EXPR_MAKE_N_N2N_OP(env, res, left, op, right) \
00246 psl_expr_make_binary_op(env, &res, &left, op, &right, SC_NUM_EXPR, SC_NUM_EXPR)
00247
00253 #define PSL_EXPR_MAKE_N_N2B_OP(env, res, left, op, right) \
00254 psl_expr_make_binary_op(env, &res, &left, op, &right, SC_NUM_EXPR, SC_BOOL_EXPR)
00255
00261 #define PSL_EXPR_MAKE_NB_NB2B_OP(env, res, left, op, right) \
00262 psl_expr_make_binary_op(env, &res, &left, op, &right, SC_NUM_BOOL_EXPR, SC_BOOL_EXPR)
00263
00269 #define PSL_EXPR_MAKE_BW_BW2BW_OP(env, res, left, op, right) \
00270 psl_expr_make_binary_op(env, &res, &left, op, &right, \
00271 SC_BOOL_WORD_EXPR, SC_BOOL_WORD_EXPR)
00272
00278 #define PSL_EXPR_MAKE_B_B2B_OP(env, res, left, op, right) \
00279 psl_expr_make_binary_op(env, &res, &left, op, &right, SC_BOOL_EXPR, SC_BOOL_EXPR)
00280
00286 #define PSL_EXPR_MAKE_W_W2W_OP(env, res, left, op, right) \
00287 psl_expr_make_binary_op(env, &res, &left, op, &right, SC_WORD_EXPR, SC_WORD_EXPR)
00288
00289 #define PSL_EXPR_MAKE_W_N2W_OP(env, res, left, op, right) \
00290 psl_expr_make_binary_mixed_op(env, &res, &left, op, &right, \
00291 SC_WORD_EXPR, SC_NUM_EXPR, SC_WORD_EXPR)
00292
00298 #define PSL_EXPR_MAKE_W_NW2W_OP(env, res, left, op, right) \
00299 psl_expr_make_binary_mixed_op(env, &res, &left, op, &right, \
00300 SC_WORD_EXPR, SC_NUM_WORD_EXPR, SC_WORD_EXPR)
00301
00307 #define PSL_EXPR_MAKE_N_W2W_OP(env, res, left, op, right) \
00308 psl_expr_make_binary_mixed_op(env, &res, &left, op, &right, \
00309 SC_NUM_EXPR, SC_WORD_EXPR, SC_WORD_EXPR)
00310
00316 #define PSL_EXPR_MAKE_NB_NB2N_OP(env, res, left, op, right) \
00317 psl_expr_make_binary_op(env, &res, &left, op, &right, SC_NUM_BOOL_EXPR, SC_NUM_EXPR)
00318
00324 #define PSL_EXPR_MAKE_NW_NW2NW_OP(env, res, left, op, right) \
00325 psl_expr_make_binary_op(env, &res, &left, op, &right, SC_NUM_WORD_EXPR, SC_NUM_WORD_EXPR)
00326
00332 #define PSL_EXPR_MAKE_NW_NW2B_OP(env, res, left, op, right) \
00333 psl_expr_make_binary_op(env, &res, &left, op, &right, SC_NUM_WORD_EXPR, SC_BOOL_EXPR)
00334
00340 #define PSL_EXPR_MAKE_NBW_NBW2N_OP(env, res, left, op, right) \
00341 psl_expr_make_binary_op(env, &res, &left, op, &right, SC_NUM_BOOL_WORD_EXPR, SC_NUM_EXPR)
00342
00348 #define PSL_EXPR_MAKE_NBW_NBW2B_OP(env, res, left, op, right) \
00349 psl_expr_make_binary_op(env, &res, &left, op, &right, SC_NUM_BOOL_WORD_EXPR, SC_BOOL_EXPR)
00350
00356 #define PSL_EXPR_MAKE_F_F2F_OP(env, res, left, op, right) \
00357 psl_expr_make_binary_op(env, &res, &left, op, &right, SC_FL_PROPERTY, SC_FL_PROPERTY)
00358
00364 #define PSL_EXPR_MAKE_B_B2F_OP(env, res, left, op, right) \
00365 psl_expr_make_binary_op(env, &res, &left, op, &right, SC_BOOL_EXPR, SC_FL_PROPERTY)
00366
00372 #define PSL_EXPR_MAKE_T_T2T_OP(env, res, left, op, right) \
00373 psl_expr_make_binary_op(env, &res, &left, op, &right, left.klass, left.klass)
00374
00380 #define PSL_EXPR_MAKE_EXT_NEXT_OP_BOOL(env, res, operator, fl_property, bool_expr) \
00381 psl_expr_make_extended_next_op(env, operator, &fl_property, NULL, &bool_expr, &res);
00382
00388 #define PSL_EXPR_MAKE_EXT_NEXT_OP_WHEN(env, res, operator, fl_property, when) \
00389 psl_expr_make_extended_next_op(env, operator, &fl_property, &when, NULL, &res);
00390
00396 #define PSL_EXPR_MAKE_EXT_NEXT_OP_WHEN_BOOL(env, res, operator, fl_property, \
00397 when, bool_expr) \
00398 psl_expr_make_extended_next_op(env, operator, &fl_property, &when, &bool_expr, &res);
00399
00400
00401
00402
00403
00404
00410 void psl_expr_make_unary_op(const NuSMVEnv_ptr env,
00411 PslExpr* res,
00412 const PslExpr* right,
00413 const PslOp op_id,
00414 const SyntaxClass right_req_klass,
00415 const SyntaxClass res_klass);
00416
00422 void psl_expr_make_binary_op(const NuSMVEnv_ptr env,
00423 PslExpr* res,
00424 const PslExpr* left,
00425 const PslOp op_id,
00426 const PslExpr* right,
00427 const SyntaxClass ops_req_klass,
00428 const SyntaxClass res_klass);
00429
00435 void psl_expr_make_binary_mixed_op(const NuSMVEnv_ptr env,
00436 PslExpr* res,
00437 const PslExpr* left,
00438 const PslOp op_id,
00439 const PslExpr* right,
00440 const SyntaxClass left_req_klass,
00441 const SyntaxClass right_req_klass,
00442 const SyntaxClass res_klass);
00443
00449 void psl_expr_make_extended_next_op(const NuSMVEnv_ptr env,
00450 PslOp op_id,
00451 const PslExpr* fl_property,
00452 const PslExpr* when,
00453 const PslExpr* bool_expr,
00454 PslExpr* res);
00455
00461 PslExpr psl_expr_make_replicator(const NuSMVEnv_ptr env,
00462 PslOp op_id,
00463 PslExpr id, PslExpr range,
00464 PslExpr value_set);
00465
00471 PslExpr
00472 psl_expr_make_replicated_property(const NuSMVEnv_ptr env,
00473 PslExpr replicator, PslExpr expr);
00474
00480 PslExpr psl_expr_make_atom(const NuSMVEnv_ptr env, const char* str);
00481
00487 PslExpr psl_expr_make_id(const NuSMVEnv_ptr env,
00488 PslExpr left, PslExpr right);
00489
00495 PslExpr psl_expr_make_id_array(const NuSMVEnv_ptr env,
00496 PslExpr id, PslExpr num);
00497
00503 PslExpr psl_expr_make_context(const NuSMVEnv_ptr env,
00504 PslExpr ctx, PslExpr node);
00505
00511 PslExpr psl_expr_make_empty(void);
00512
00518 PslExpr psl_expr_make_true(const NuSMVEnv_ptr env);
00519
00525 PslExpr psl_expr_make_false(const NuSMVEnv_ptr env);
00526
00532 PslExpr psl_expr_make_inf(const NuSMVEnv_ptr env);
00533
00539 PslExpr psl_expr_make_boolean_type(const NuSMVEnv_ptr env);
00540
00546 PslExpr psl_expr_make_boolean_value(const NuSMVEnv_ptr env,
00547 int val);
00548
00554 PslExpr psl_expr_make_failure(const NuSMVEnv_ptr env, const char* msg, FailureKind kind);
00555
00561 PslExpr psl_expr_make_number(const NuSMVEnv_ptr env,
00562 int val);
00563
00569 PslExpr psl_expr_make_base_number(const NuSMVEnv_ptr env,
00570 char* base_num);
00571
00577 PslExpr psl_expr_make_real_number(const NuSMVEnv_ptr env, char* fval);
00578
00584 PslExpr psl_expr_make_word_number(const NuSMVEnv_ptr env, char* wval);
00585
00591 PslExpr psl_expr_make_range(const NuSMVEnv_ptr env,
00592 PslExpr low, PslExpr high);
00593
00599 PslExpr
00600 psl_expr_make_case(const NuSMVEnv_ptr env,
00601 PslExpr cond, PslExpr _then, PslExpr _list);
00602
00608 PslExpr
00609 psl_expr_make_ite(const NuSMVEnv_ptr env,
00610 PslExpr cond, PslExpr _then, PslExpr _else);
00611
00617 PslExpr
00618 psl_expr_make_suffix_implication_weak(const NuSMVEnv_ptr env,
00619 PslExpr seq, PslOp op,
00620 PslExpr expr);
00621
00627 PslExpr
00628 psl_expr_make_suffix_implication_strong(const NuSMVEnv_ptr env,
00629 PslExpr seq, PslOp op,
00630 PslExpr expr);
00631
00637 PslExpr
00638 psl_expr_make_within(const NuSMVEnv_ptr env,
00639 PslOp op, PslExpr begin, PslExpr end,
00640 PslExpr seq);
00641
00647 PslExpr
00648 psl_expr_make_whilenot(const NuSMVEnv_ptr env,
00649 PslOp op, PslExpr expr, PslExpr seq);
00650
00656 PslExpr psl_expr_make_abort(const NuSMVEnv_ptr env,
00657 PslExpr fl_prop, PslExpr cond);
00658
00664 PslExpr psl_expr_make_sere(const NuSMVEnv_ptr env,
00665 PslExpr expr);
00666
00672 PslExpr psl_expr_make_sere_concat(const NuSMVEnv_ptr env,
00673 PslExpr seq1, PslExpr seq2);
00674
00680 PslExpr psl_expr_make_sere_fusion(const NuSMVEnv_ptr env,
00681 PslExpr seq1, PslExpr seq2);
00682
00688 PslExpr
00689 psl_expr_make_sere_compound_binary_op(const NuSMVEnv_ptr env,
00690 PslExpr seq1, PslOp op,
00691 PslExpr seq2);
00692
00698 PslExpr
00699 psl_expr_make_repeated_sere(const NuSMVEnv_ptr env,
00700 PslOp op, PslExpr sere, PslExpr count);
00701
00707 PslExpr psl_expr_make_cons(const NuSMVEnv_ptr env,
00708 PslExpr a, PslExpr b);
00709
00715 PslExpr psl_expr_make_cons_new(const NuSMVEnv_ptr env,
00716 PslExpr a, PslExpr b);
00717
00723 PslExpr psl_expr_make_concatenation(const NuSMVEnv_ptr env,
00724 PslExpr expr_list);
00725
00731 PslExpr
00732 psl_expr_make_multiple_concatenation(const NuSMVEnv_ptr env,
00733 PslExpr expr, PslExpr expr_list);
00734
00740 PslExpr psl_expr_make_obe_unary(const NuSMVEnv_ptr env,
00741 PslOp op, PslExpr expr);
00742
00748 PslExpr
00749 psl_expr_make_obe_binary(const NuSMVEnv_ptr env,
00750 PslExpr left, PslOp op, PslExpr right);
00751
00757 PslExpr
00758 psl_expr_make_bit_selection(const NuSMVEnv_ptr env,
00759 PslExpr word_expr, PslExpr left, PslExpr right);
00760
00766 PslExpr
00767 psl_expr_make_word_concatenation(const NuSMVEnv_ptr env,
00768 PslExpr left, PslExpr right);
00769
00770
00771 #endif