Skip to content

Commit 4ea7001

Browse files
committed
SMV: use module items for VAR and DEFINE for creating symbols
The SMV typechecker now uses the module items for creating the symbols for VAR and DEFINE.
1 parent a152b63 commit 4ea7001

File tree

1 file changed

+34
-21
lines changed

1 file changed

+34
-21
lines changed

src/smvlang/smv_typecheck.cpp

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class smv_typecheckt:public typecheckt
5858
} modet;
5959

6060
void convert(smv_parse_treet::modulet &);
61-
void convert(smv_parse_treet::mc_varst &);
61+
void create_var_symbols(const smv_parse_treet::modulet::item_listt &);
6262

6363
void collect_define(const equal_exprt &);
6464
void convert_defines(exprt::operandst &invar);
@@ -1901,7 +1901,7 @@ void smv_typecheckt::convert(
19011901

19021902
/*******************************************************************\
19031903
1904-
Function: smv_typecheckt::convert_vars
1904+
Function: smv_typecheckt::create_var_symbols
19051905
19061906
Inputs:
19071907
@@ -1911,43 +1911,56 @@ Function: smv_typecheckt::convert_vars
19111911
19121912
\*******************************************************************/
19131913

1914-
void smv_typecheckt::convert(smv_parse_treet::mc_varst &vars)
1914+
void smv_typecheckt::create_var_symbols(
1915+
const smv_parse_treet::modulet::item_listt &items)
19151916
{
19161917
symbolt symbol;
19171918

19181919
symbol.mode="SMV";
19191920
symbol.module=modulep->name;
19201921

1921-
for(const auto &var_it : vars)
1922+
for(const auto &item : items)
19221923
{
1923-
const smv_parse_treet::mc_vart &var = var_it.second;
1924-
1925-
typet type = var.type;
1924+
if(item.is_var())
1925+
{
1926+
typet type = item.expr.type();
19261927

1927-
// check the type, if any
1928-
if(type.is_not_nil())
1928+
// check the type
19291929
check_type(type);
19301930

1931-
symbol.base_name = var_it.first;
1931+
symbol.base_name = to_symbol_expr(item.expr).get_identifier();
1932+
symbol.name = module + "::var::" + id2string(symbol.base_name);
1933+
1934+
if(module == "smv::main")
1935+
symbol.pretty_name = symbol.base_name;
1936+
else
1937+
symbol.pretty_name = strip_smv_prefix(symbol.name);
1938+
1939+
symbol.value = nil_exprt{};
1940+
symbol.is_input = true;
1941+
symbol.is_state_var = false;
1942+
symbol.type = std::move(type);
19321943

1933-
if(var.identifier=="")
1944+
symbol_table.add(symbol);
1945+
}
1946+
else if(item.is_define())
19341947
{
1948+
symbol.base_name =
1949+
to_symbol_expr(to_equal_expr(item.expr).lhs()).get_identifier();
19351950
symbol.name=module+"::var::"+id2string(symbol.base_name);
19361951

19371952
if(module == "smv::main")
19381953
symbol.pretty_name = symbol.base_name;
19391954
else
19401955
symbol.pretty_name = strip_smv_prefix(symbol.name);
1941-
}
1942-
else
1943-
symbol.name=var.identifier;
19441956

1945-
symbol.value.make_nil();
1946-
symbol.is_input=true;
1947-
symbol.is_state_var=false;
1948-
symbol.type = std::move(type);
1957+
symbol.value = nil_exprt{};
1958+
symbol.is_input = true;
1959+
symbol.is_state_var = false;
1960+
symbol.type.make_nil();
19491961

1950-
symbol_table.add(symbol);
1962+
symbol_table.add(symbol);
1963+
}
19511964
}
19521965
}
19531966

@@ -2091,8 +2104,8 @@ void smv_typecheckt::convert(smv_parse_treet::modulet &smv_module)
20912104

20922105
define_map.clear();
20932106

2094-
// variables first, need to be visible before declaration
2095-
convert(smv_module.vars);
2107+
// variables/defines first, can be used before their declaration
2108+
create_var_symbols(smv_module.items);
20962109

20972110
// transition relation
20982111

0 commit comments

Comments
 (0)