File tree Expand file tree Collapse file tree 7 files changed +47
-8
lines changed Expand file tree Collapse file tree 7 files changed +47
-8
lines changed Original file line number Diff line number Diff line change 11# EBMC 5.9
22
33* SMV: word constants
4+ * SMV: IVAR declarations
45
56# EBMC 5.8
67
Original file line number Diff line number Diff line change 11CORE
22ivar1.smv
3-
4- ^file .* line 3: No support for IVAR declarations$
5- ^EXIT=1$
3+ --bound 1
4+ ^\[.*\] some_input: REFUTED$
5+ ^\[.*\] !some_input: REFUTED$
6+ ^\[.*\] X some_input: REFUTED$
7+ ^\[.*\] X !some_input: REFUTED$
8+ ^EXIT=10$
69^SIGNAL=0$
710--
811--
Original file line number Diff line number Diff line change 11MODULE main
22
33IVAR some_input : boolean;
4+
5+ -- these should all fail
6+ LTLSPEC some_input
7+ LTLSPEC !some_input
8+ LTLSPEC X some_input
9+ LTLSPEC X !some_input
Original file line number Diff line number Diff line change @@ -402,10 +402,23 @@ var_declaration:
402402 ;
403403
404404ivar_declaration :
405- IVAR_Token simple_var_list
405+ IVAR_Token ivar_simple_var_list
406+ ;
407+
408+ ivar_simple_var_list :
409+ identifier ' :' simple_type_specifier ' ;'
406410 {
407- yyerror (" No support for IVAR declarations" );
408- YYERROR ;
411+ irep_idt identifier = stack_expr($1 ).id();
412+ stack_expr ($1 ).id(ID_smv_identifier);
413+ stack_expr ($1 ).set(ID_identifier, identifier);
414+ PARSER.module ->add_ivar (stack_expr($1 ), stack_type($3 ));
415+ }
416+ | ivar_simple_var_list identifier ' :' simple_type_specifier ' ;'
417+ {
418+ irep_idt identifier = stack_expr($2 ).id();
419+ stack_expr ($2 ).id(ID_smv_identifier);
420+ stack_expr ($2 ).set(ID_identifier, identifier);
421+ PARSER.module ->add_ivar (stack_expr($2 ), stack_type($4 ));
409422 }
410423 ;
411424
Original file line number Diff line number Diff line change @@ -76,6 +76,8 @@ std::string to_string(smv_parse_treet::modulet::itemt::item_typet i)
7676 return " DEFINE" ;
7777 case smv_parse_treet::modulet::itemt::ENUM:
7878 return " ENUM" ;
79+ case smv_parse_treet::modulet::itemt::IVAR:
80+ return " IVAR" ;
7981 case smv_parse_treet::modulet::itemt::VAR:
8082 return " VAR" ;
8183
Original file line number Diff line number Diff line change @@ -52,6 +52,7 @@ class smv_parse_treet
5252 FAIRNESS,
5353 INIT,
5454 INVAR,
55+ IVAR,
5556 LTLSPEC,
5657 TRANS,
5758 VAR
@@ -133,6 +134,11 @@ class smv_parse_treet
133134 return item_type == ENUM;
134135 }
135136
137+ bool is_ivar () const
138+ {
139+ return item_type == IVAR;
140+ }
141+
136142 bool is_var () const
137143 {
138144 return item_type == VAR;
@@ -260,6 +266,13 @@ class smv_parse_treet
260266 items.emplace_back (itemt::TRANS, std::move (expr), std::move (location));
261267 }
262268
269+ void add_ivar (exprt expr, typet type)
270+ {
271+ expr.type () = std::move (type);
272+ auto location = expr.source_location ();
273+ items.emplace_back (itemt::IVAR, std::move (expr), std::move (location));
274+ }
275+
263276 void add_var (exprt expr, typet type)
264277 {
265278 expr.type () = std::move (type);
Original file line number Diff line number Diff line change @@ -2033,6 +2033,7 @@ void smv_typecheckt::typecheck(
20332033 return ;
20342034
20352035 case smv_parse_treet::modulet::itemt::ENUM:
2036+ case smv_parse_treet::modulet::itemt::IVAR:
20362037 case smv_parse_treet::modulet::itemt::VAR:
20372038 return ;
20382039 }
@@ -2075,7 +2076,7 @@ void smv_typecheckt::create_var_symbols(
20752076
20762077 for (const auto &item : items)
20772078 {
2078- if (item.is_var ())
2079+ if (item.is_var () || item. is_ivar () )
20792080 {
20802081 irep_idt base_name = to_smv_identifier_expr (item.expr ).identifier ();
20812082 irep_idt identifier = module + " ::var::" + id2string (base_name);
@@ -2318,7 +2319,7 @@ void smv_typecheckt::convert(smv_parse_treet::modulet &smv_module)
23182319
23192320 // non-variable items
23202321 for (auto &item : smv_module.items )
2321- if (!item.is_var ())
2322+ if (!item.is_var () && !item. is_ivar () )
23222323 convert (item);
23232324
23242325 flatten_hierarchy (smv_module);
You can’t perform that action at this time.
0 commit comments