@@ -1220,12 +1220,9 @@ void smt2_convt::convert_expr(const exprt &expr)
1220
1220
1221
1221
convert_expr (expr.operands ().front ());
1222
1222
}
1223
- else if (expr.id ()==ID_concatenation ||
1224
- expr.id ()==ID_bitand ||
1225
- expr.id ()==ID_bitor ||
1226
- expr.id ()==ID_bitxor ||
1227
- expr.id ()==ID_bitnand ||
1228
- expr.id ()==ID_bitnor)
1223
+ else if (
1224
+ expr.id () == ID_concatenation || expr.id () == ID_bitand ||
1225
+ expr.id () == ID_bitor || expr.id () == ID_bitxor)
1229
1226
{
1230
1227
DATA_INVARIANT_WITH_DIAGNOSTICS (
1231
1228
expr.operands ().size () >= 2 ,
@@ -1255,6 +1252,60 @@ void smt2_convt::convert_expr(const exprt &expr)
1255
1252
1256
1253
out << " )" ;
1257
1254
}
1255
+ else if (
1256
+ expr.id () == ID_bitxnor || expr.id () == ID_bitnand ||
1257
+ expr.id () == ID_bitnor)
1258
+ {
1259
+ // SMT-LIB only has these as a binary expression,
1260
+ // owing to their ambiguity.
1261
+ if (expr.operands ().size () == 2 )
1262
+ {
1263
+ const auto &binary_expr = to_binary_expr (expr);
1264
+
1265
+ out << ' (' ;
1266
+ if (binary_expr.id () == ID_bitxnor)
1267
+ out << " bvxnor" ;
1268
+ else if (binary_expr.id () == ID_bitnand)
1269
+ out << " bvnand" ;
1270
+ else if (binary_expr.id () == ID_bitnor)
1271
+ out << " bvnor" ;
1272
+ out << ' ' ;
1273
+ flatten2bv (binary_expr.op0 ());
1274
+ out << ' ' ;
1275
+ flatten2bv (binary_expr.op1 ());
1276
+ out << ' )' ;
1277
+ }
1278
+ else if (expr.operands ().size () == 1 )
1279
+ {
1280
+ out << " (bvnot " ;
1281
+ flatten2bv (to_unary_expr (expr).op ());
1282
+ out << ' )' ;
1283
+ }
1284
+ else if (expr.operands ().size () >= 3 )
1285
+ {
1286
+ out << " (bvnot (" ;
1287
+ if (expr.id () == ID_bitxnor)
1288
+ out << " bvxor" ;
1289
+ else if (expr.id () == ID_bitnand)
1290
+ out << " bvand" ;
1291
+ else if (expr.id () == ID_bitnor)
1292
+ out << " bvor" ;
1293
+
1294
+ for (const auto &op : expr.operands ())
1295
+ {
1296
+ out << ' ' ;
1297
+ flatten2bv (op);
1298
+ }
1299
+
1300
+ out << " ))" ; // bvX, bvnot
1301
+ }
1302
+ else
1303
+ {
1304
+ DATA_INVARIANT (
1305
+ expr.operands ().size () >= 1 ,
1306
+ expr.id_string () + " should have at least one operand" );
1307
+ }
1308
+ }
1258
1309
else if (expr.id ()==ID_bitnot)
1259
1310
{
1260
1311
const bitnot_exprt &bitnot_expr = to_bitnot_expr (expr);
0 commit comments