Skip to content

Commit 308c683

Browse files
authored
Merge pull request #1531 from diffblue/smv_set_exprt
introduce `smv_set_exprt` and others
2 parents efbb29c + 6a6cfcc commit 308c683

File tree

3 files changed

+84
-12
lines changed

3 files changed

+84
-12
lines changed

src/smvlang/expr2smv.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Function: expr2smvt::convert_smv_set
2626
2727
\*******************************************************************/
2828

29-
expr2smvt::resultt expr2smvt::convert_smv_set(const exprt &src)
29+
expr2smvt::resultt expr2smvt::convert_smv_set(const smv_set_exprt &src)
3030
{
3131
std::string dest = "{ ";
3232

@@ -777,16 +777,16 @@ expr2smvt::resultt expr2smvt::convert_rec(const exprt &src)
777777
return convert_binary(to_mod_expr(src), src.id_string(), precedencet::MULT);
778778

779779
else if(src.id() == ID_smv_set)
780-
return convert_smv_set(src);
780+
return convert_smv_set(to_smv_set_expr(src));
781781

782782
else if(src.id() == ID_smv_setin)
783-
return convert_binary(to_binary_expr(src), "in", precedencet::IN);
783+
return convert_binary(to_smv_setin_expr(src), "in", precedencet::IN);
784784

785785
else if(src.id() == ID_smv_setnotin)
786786
return convert_binary(to_binary_expr(src), "notin", precedencet::IN);
787787

788788
else if(src.id() == ID_smv_union)
789-
return convert_binary(to_binary_expr(src), "union", precedencet::UNION);
789+
return convert_binary(to_smv_union_expr(src), "union", precedencet::UNION);
790790

791791
else if(src.id()==ID_lt || src.id()==ID_gt ||
792792
src.id()==ID_le || src.id()==ID_ge)
@@ -912,13 +912,7 @@ expr2smvt::resultt expr2smvt::convert_rec(const exprt &src)
912912
return convert_constant(to_constant_expr(src));
913913

914914
else if(src.id()==ID_nondet_bool)
915-
{
916-
exprt smv_set_expr(ID_smv_set);
917-
smv_set_expr.operands().clear();
918-
smv_set_expr.operands().push_back(false_exprt());
919-
smv_set_expr.operands().push_back(true_exprt());
920-
return convert_smv_set(smv_set_expr);
921-
}
915+
return convert_smv_set(smv_set_exprt{{false_exprt(), true_exprt()}});
922916

923917
else if(src.id()==ID_cond)
924918
return convert_cond(src);

src/smvlang/expr2smv_class.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ Author: Daniel Kroening, [email protected]
1818

1919
#include "expr2smv.h"
2020

21+
class smv_set_exprt;
22+
2123
class expr2smvt
2224
{
2325
public:
@@ -86,7 +88,7 @@ class expr2smvt
8688

8789
virtual resultt convert_rec(const exprt &);
8890

89-
resultt convert_smv_set(const exprt &);
91+
resultt convert_smv_set(const smv_set_exprt &);
9092

9193
resultt convert_binary(
9294
const binary_exprt &src,

src/smvlang/smv_expr.h

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,4 +369,80 @@ inline smv_identifier_exprt &to_smv_identifier_expr(exprt &expr)
369369
return static_cast<smv_identifier_exprt &>(expr);
370370
}
371371

372+
/// set constructor expression
373+
class smv_set_exprt : public multi_ary_exprt
374+
{
375+
public:
376+
explicit smv_set_exprt(exprt::operandst __elements)
377+
: multi_ary_exprt{ID_smv_set, std::move(__elements), typet{ID_smv_set}}
378+
{
379+
}
380+
};
381+
382+
inline const smv_set_exprt &to_smv_set_expr(const exprt &expr)
383+
{
384+
PRECONDITION(expr.id() == ID_smv_set);
385+
smv_set_exprt::check(expr, validation_modet::INVARIANT);
386+
return static_cast<const smv_set_exprt &>(expr);
387+
}
388+
389+
inline smv_set_exprt &to_smv_set_expr(exprt &expr)
390+
{
391+
PRECONDITION(expr.id() == ID_smv_set);
392+
smv_set_exprt::check(expr, validation_modet::INVARIANT);
393+
return static_cast<smv_set_exprt &>(expr);
394+
}
395+
396+
/// set union expression
397+
class smv_union_exprt : public binary_exprt
398+
{
399+
public:
400+
smv_union_exprt(exprt lhs, exprt rhs, typet type)
401+
: binary_exprt{
402+
std::move(lhs),
403+
ID_smv_union,
404+
std::move(rhs),
405+
std::move(type)}
406+
{
407+
}
408+
};
409+
410+
inline const smv_union_exprt &to_smv_union_expr(const exprt &expr)
411+
{
412+
PRECONDITION(expr.id() == ID_smv_union);
413+
smv_union_exprt::check(expr);
414+
return static_cast<const smv_union_exprt &>(expr);
415+
}
416+
417+
inline smv_union_exprt &to_smv_union_expr(exprt &expr)
418+
{
419+
PRECONDITION(expr.id() == ID_smv_union);
420+
smv_union_exprt::check(expr);
421+
return static_cast<smv_union_exprt &>(expr);
422+
}
423+
424+
/// set inclusion expression
425+
class smv_setin_exprt : public binary_predicate_exprt
426+
{
427+
public:
428+
smv_setin_exprt(exprt lhs, exprt rhs)
429+
: binary_predicate_exprt{std::move(lhs), ID_smv_setin, std::move(rhs)}
430+
{
431+
}
432+
};
433+
434+
inline const smv_setin_exprt &to_smv_setin_expr(const exprt &expr)
435+
{
436+
PRECONDITION(expr.id() == ID_smv_setin);
437+
smv_setin_exprt::check(expr);
438+
return static_cast<const smv_setin_exprt &>(expr);
439+
}
440+
441+
inline smv_setin_exprt &to_smv_setin_expr(exprt &expr)
442+
{
443+
PRECONDITION(expr.id() == ID_smv_setin);
444+
smv_setin_exprt::check(expr);
445+
return static_cast<smv_setin_exprt &>(expr);
446+
}
447+
372448
#endif // CPROVER_SMV_EXPR_H

0 commit comments

Comments
 (0)