Skip to content

Commit 620025a

Browse files
authored
Merge pull request #1395 from diffblue/smvlang-ivar
SMV: IVAR declarations
2 parents 2be0696 + a21a031 commit 620025a

File tree

7 files changed

+47
-8
lines changed

7 files changed

+47
-8
lines changed

CHANGELOG

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# EBMC 5.9
22

33
* SMV: word constants
4+
* SMV: IVAR declarations
45

56
# EBMC 5.8
67

regression/smv/ivar/ivar1.desc

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
CORE
22
ivar1.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
--

regression/smv/ivar/ivar1.smv

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
MODULE main
22

33
IVAR 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

src/smvlang/parser.y

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -402,10 +402,23 @@ var_declaration:
402402
;
403403

404404
ivar_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

src/smvlang/smv_parse_tree.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff 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

src/smvlang/smv_parse_tree.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff 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);

src/smvlang/smv_typecheck.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff 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);

0 commit comments

Comments
 (0)