@@ -1167,34 +1167,49 @@ Function: smv_typecheckt::typecheck
1167
1167
void smv_typecheckt::typecheck (
1168
1168
smv_parse_treet::modulet::itemt &item)
1169
1169
{
1170
- modet mode;
1171
-
1172
1170
switch (item.item_type )
1173
1171
{
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
+
1174
1191
case smv_parse_treet::modulet::itemt::INIT:
1175
- mode= INIT;
1192
+ typecheck (item. expr , bool_typet (), INIT) ;
1176
1193
break ;
1177
1194
1178
1195
case smv_parse_treet::modulet::itemt::TRANS:
1179
- mode= TRANS;
1196
+ typecheck (item. expr , bool_typet (), TRANS) ;
1180
1197
break ;
1181
1198
1182
1199
case smv_parse_treet::modulet::itemt::CTLSPEC:
1183
- mode = CTL;
1200
+ typecheck (item. expr , bool_typet (), CTL) ;
1184
1201
break ;
1185
1202
1186
1203
case smv_parse_treet::modulet::itemt::LTLSPEC:
1187
- mode = LTL;
1204
+ typecheck (item. expr , bool_typet (), LTL) ;
1188
1205
break ;
1189
1206
1190
1207
case smv_parse_treet::modulet::itemt::DEFINE:
1191
1208
case smv_parse_treet::modulet::itemt::INVAR:
1192
1209
case smv_parse_treet::modulet::itemt::FAIRNESS:
1193
1210
default :
1194
- mode= OTHER;
1211
+ typecheck (item. expr , bool_typet (), OTHER) ;
1195
1212
}
1196
-
1197
- typecheck (item.expr , bool_typet (), mode);
1198
1213
}
1199
1214
1200
1215
/* ******************************************************************\
@@ -1452,6 +1467,45 @@ void smv_typecheckt::convert(smv_parse_treet::modulet &smv_module)
1452
1467
trans_init.push_back (item.expr );
1453
1468
else if (item.is_trans ())
1454
1469
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
+ }
1455
1509
}
1456
1510
1457
1511
module_symbol.value =
0 commit comments