@@ -137,6 +137,12 @@ class smv_typecheckt:public typecheckt
137
137
else
138
138
return id;
139
139
}
140
+
141
+ void lower_node (exprt &) const ;
142
+ void lower (exprt &expr) const
143
+ {
144
+ expr.visit_post ([this ](exprt &expr) { lower_node (expr); });
145
+ }
140
146
};
141
147
142
148
/* ******************************************************************\
@@ -1227,6 +1233,27 @@ void smv_typecheckt::typecheck_expr_rec(exprt &expr, modet mode)
1227
1233
1228
1234
/* ******************************************************************\
1229
1235
1236
+ Function: smv_typecheckt::lower_node
1237
+
1238
+ Inputs:
1239
+
1240
+ Outputs:
1241
+
1242
+ Purpose:
1243
+
1244
+ \*******************************************************************/
1245
+
1246
+ void smv_typecheckt::lower_node (exprt &expr) const
1247
+ {
1248
+ if (expr.id () == ID_smv_extend)
1249
+ {
1250
+ auto &binary = to_binary_expr (expr);
1251
+ expr = typecast_exprt{binary.lhs (), expr.type ()};
1252
+ }
1253
+ }
1254
+
1255
+ /* ******************************************************************\
1256
+
1230
1257
Function: smv_typecheckt::convert_expr_to
1231
1258
1232
1259
Inputs:
@@ -1497,53 +1524,62 @@ void smv_typecheckt::typecheck(
1497
1524
case smv_parse_treet::modulet::itemt::INIT:
1498
1525
typecheck (item.expr , INIT);
1499
1526
convert_expr_to (item.expr , bool_typet{});
1527
+ lower (item.expr );
1500
1528
return ;
1501
1529
1502
1530
case smv_parse_treet::modulet::itemt::TRANS:
1503
1531
typecheck (item.expr , TRANS);
1504
1532
convert_expr_to (item.expr , bool_typet{});
1533
+ lower (item.expr );
1505
1534
return ;
1506
1535
1507
1536
case smv_parse_treet::modulet::itemt::CTLSPEC:
1508
1537
typecheck (item.expr , CTL);
1509
1538
convert_expr_to (item.expr , bool_typet{});
1539
+ lower (item.expr );
1510
1540
return ;
1511
1541
1512
1542
case smv_parse_treet::modulet::itemt::LTLSPEC:
1513
1543
typecheck (item.expr , LTL);
1514
1544
convert_expr_to (item.expr , bool_typet{});
1545
+ lower (item.expr );
1515
1546
return ;
1516
1547
1517
1548
case smv_parse_treet::modulet::itemt::INVAR:
1518
1549
case smv_parse_treet::modulet::itemt::FAIRNESS:
1519
1550
typecheck (item.expr , OTHER);
1520
1551
convert_expr_to (item.expr , bool_typet{});
1552
+ lower (item.expr );
1521
1553
return ;
1522
1554
1523
1555
case smv_parse_treet::modulet::itemt::ASSIGN_CURRENT:
1524
1556
typecheck (item.equal_expr ().lhs (), OTHER);
1525
1557
typecheck (item.equal_expr ().rhs (), OTHER);
1526
1558
convert_expr_to (item.equal_expr ().rhs (), item.equal_expr ().lhs ().type ());
1527
1559
item.equal_expr ().type () = bool_typet{};
1560
+ lower (item.expr );
1528
1561
return ;
1529
1562
1530
1563
case smv_parse_treet::modulet::itemt::ASSIGN_INIT:
1531
1564
typecheck (item.equal_expr ().lhs (), INIT);
1532
1565
typecheck (item.equal_expr ().rhs (), INIT);
1533
1566
convert_expr_to (item.equal_expr ().rhs (), item.equal_expr ().lhs ().type ());
1534
1567
item.equal_expr ().type () = bool_typet{};
1568
+ lower (item.expr );
1535
1569
return ;
1536
1570
1537
1571
case smv_parse_treet::modulet::itemt::ASSIGN_NEXT:
1538
1572
typecheck (item.equal_expr ().lhs (), TRANS);
1539
1573
typecheck (item.equal_expr ().rhs (), TRANS);
1540
1574
convert_expr_to (item.equal_expr ().rhs (), item.equal_expr ().lhs ().type ());
1541
1575
item.equal_expr ().type () = bool_typet{};
1576
+ lower (item.expr );
1542
1577
return ;
1543
1578
1544
1579
case smv_parse_treet::modulet::itemt::DEFINE:
1545
1580
typecheck (item.expr , OTHER);
1546
1581
item.equal_expr ().type () = bool_typet{};
1582
+ lower (item.expr );
1547
1583
return ;
1548
1584
}
1549
1585
}
0 commit comments