@@ -1167,34 +1167,49 @@ Function: smv_typecheckt::typecheck
11671167void smv_typecheckt::typecheck (
11681168 smv_parse_treet::modulet::itemt &item)
11691169{
1170- modet mode;
1171-
11721170 switch (item.item_type )
11731171 {
1172+ case smv_parse_treet::modulet::itemt::ASSIGN:
1173+ {
1174+ DATA_INVARIANT (
1175+ item.expr .id () == ID_equal, " ASSIGN expression must be equality" );
1176+ auto &equal_expr = to_equal_expr (item.expr );
1177+
1178+ DATA_INVARIANT (
1179+ equal_expr.lhs ().id () == ID_smv_assign_current ||
1180+ equal_expr.lhs ().id () == ID_smv_assign_init ||
1181+ equal_expr.lhs ().id () == ID_smv_assign_next,
1182+ " ASSIGN lhs must be current, init or next" );
1183+
1184+ auto &symbol_expr = to_unary_expr (equal_expr.lhs ()).op ();
1185+ auto &nil_type = static_cast <const typet &>(get_nil_irep ());
1186+ typecheck (symbol_expr, nil_type, OTHER);
1187+ typecheck (equal_expr.rhs (), symbol_expr.type (), OTHER);
1188+ }
1189+ break ;
1190+
11741191 case smv_parse_treet::modulet::itemt::INIT:
1175- mode= INIT;
1192+ typecheck (item. expr , bool_typet (), INIT) ;
11761193 break ;
11771194
11781195 case smv_parse_treet::modulet::itemt::TRANS:
1179- mode= TRANS;
1196+ typecheck (item. expr , bool_typet (), TRANS) ;
11801197 break ;
11811198
11821199 case smv_parse_treet::modulet::itemt::CTLSPEC:
1183- mode = CTL;
1200+ typecheck (item. expr , bool_typet (), CTL) ;
11841201 break ;
11851202
11861203 case smv_parse_treet::modulet::itemt::LTLSPEC:
1187- mode = LTL;
1204+ typecheck (item. expr , bool_typet (), LTL) ;
11881205 break ;
11891206
11901207 case smv_parse_treet::modulet::itemt::DEFINE:
11911208 case smv_parse_treet::modulet::itemt::INVAR:
11921209 case smv_parse_treet::modulet::itemt::FAIRNESS:
11931210 default :
1194- mode= OTHER;
1211+ typecheck (item. expr , bool_typet (), OTHER) ;
11951212 }
1196-
1197- typecheck (item.expr , bool_typet (), mode);
11981213}
11991214
12001215/* ******************************************************************\
@@ -1452,6 +1467,45 @@ void smv_typecheckt::convert(smv_parse_treet::modulet &smv_module)
14521467 trans_init.push_back (item.expr );
14531468 else if (item.is_trans ())
14541469 trans_trans.push_back (item.expr );
1470+ else if (item.is_assign ())
1471+ {
1472+ DATA_INVARIANT (
1473+ item.expr .id () == ID_equal, " ASSIGN expression must be equality" );
1474+ auto &equal_expr = to_equal_expr (item.expr );
1475+ auto &symbol_expr = to_unary_expr (equal_expr.lhs ()).op ();
1476+
1477+ auto &identifier = to_symbol_expr (symbol_expr).get_identifier ();
1478+ auto s_it = symbol_table.get_writeable (identifier);
1479+
1480+ if (s_it == nullptr )
1481+ {
1482+ throw errort ().with_location (symbol_expr.find_source_location ())
1483+ << " variable `" << identifier << " ' not found" ;
1484+ }
1485+
1486+ symbolt &symbol = *s_it;
1487+ symbol.is_input = false ;
1488+
1489+ if (equal_expr.lhs ().id () == ID_smv_assign_current)
1490+ {
1491+ trans_invar.push_back (equal_exprt{symbol_expr, equal_expr.rhs ()});
1492+ }
1493+ else if (equal_expr.lhs ().id () == ID_smv_assign_init)
1494+ {
1495+ symbol.is_state_var = true ;
1496+ trans_init.push_back (equal_exprt{symbol_expr, equal_expr.rhs ()});
1497+ }
1498+ else if (equal_expr.lhs ().id () == ID_smv_assign_next)
1499+ {
1500+ symbol.is_state_var = true ;
1501+ exprt next_symbol_expr = symbol_expr;
1502+ next_symbol_expr.id (ID_next_symbol);
1503+ trans_trans.push_back (
1504+ equal_exprt{next_symbol_expr, equal_expr.rhs ()});
1505+ }
1506+ else
1507+ DATA_INVARIANT (false , " ASSIGN must be current/init/next" );
1508+ }
14551509 }
14561510
14571511 module_symbol.value =
0 commit comments