File tree 3 files changed +44
-6
lines changed
3 files changed +44
-6
lines changed Original file line number Diff line number Diff line change @@ -190,6 +190,41 @@ inline bitxor_exprt &to_bitxor_expr(exprt &expr)
190
190
return static_cast <bitxor_exprt &>(expr);
191
191
}
192
192
193
+ // / \brief Bit-wise XNOR
194
+ class bitxnor_exprt : public multi_ary_exprt
195
+ {
196
+ public:
197
+ bitxnor_exprt (exprt _op0, exprt _op1)
198
+ : multi_ary_exprt(std::move(_op0), ID_bitxnor, std::move(_op1))
199
+ {
200
+ }
201
+ };
202
+
203
+ template <>
204
+ inline bool can_cast_expr<bitxnor_exprt>(const exprt &base)
205
+ {
206
+ return base.id () == ID_bitxnor;
207
+ }
208
+
209
+ // / \brief Cast an exprt to a \ref bitxnor_exprt
210
+ // /
211
+ // / \a expr must be known to be \ref bitxnor_exprt.
212
+ // /
213
+ // / \param expr: Source expression
214
+ // / \return Object of type \ref bitxnor_exprt
215
+ inline const bitxnor_exprt &to_bitxnor_expr (const exprt &expr)
216
+ {
217
+ PRECONDITION (expr.id () == ID_bitxnor);
218
+ return static_cast <const bitxnor_exprt &>(expr);
219
+ }
220
+
221
+ // / \copydoc to_bitxnor_expr(const exprt &)
222
+ inline bitxnor_exprt &to_bitxnor_expr (exprt &expr)
223
+ {
224
+ PRECONDITION (expr.id () == ID_bitxnor);
225
+ return static_cast <bitxnor_exprt &>(expr);
226
+ }
227
+
193
228
// / \brief Bit-wise AND
194
229
class bitand_exprt : public multi_ary_exprt
195
230
{
Original file line number Diff line number Diff line change @@ -950,9 +950,10 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
950
950
{
951
951
irep_idt op_id = expr.op ().id ();
952
952
953
- if (op_id==ID_plus || op_id==ID_minus || op_id==ID_mult ||
954
- op_id==ID_unary_minus ||
955
- op_id==ID_bitxor || op_id==ID_bitor || op_id==ID_bitand)
953
+ if (
954
+ op_id == ID_plus || op_id == ID_minus || op_id == ID_mult ||
955
+ op_id == ID_unary_minus || op_id == ID_bitxor || op_id == ID_bitxnor ||
956
+ op_id == ID_bitor || op_id == ID_bitand)
956
957
{
957
958
exprt result = expr.op ();
958
959
@@ -2949,9 +2950,9 @@ simplify_exprt::resultt<> simplify_exprt::simplify_node(const exprt &node)
2949
2950
{
2950
2951
r = simplify_bitnot (to_bitnot_expr (expr));
2951
2952
}
2952
- else if (expr. id ()==ID_bitand ||
2953
- expr.id ()==ID_bitor ||
2954
- expr.id ()==ID_bitxor )
2953
+ else if (
2954
+ expr. id () == ID_bitand || expr. id () == ID_bitor || expr.id () == ID_bitxor ||
2955
+ expr.id () == ID_bitxnor )
2955
2956
{
2956
2957
r = simplify_bitwise (to_multi_ary_expr (expr));
2957
2958
}
Original file line number Diff line number Diff line change @@ -745,6 +745,8 @@ simplify_exprt::simplify_bitwise(const multi_ary_exprt &expr)
745
745
f = [](bool a, bool b) { return a || b; };
746
746
else if (new_expr.id () == ID_bitxor)
747
747
f = [](bool a, bool b) { return a != b; };
748
+ else if (new_expr.id () == ID_bitxnor)
749
+ f = [](bool a, bool b) { return a == b; };
748
750
else
749
751
UNREACHABLE;
750
752
You can’t perform that action at this time.
0 commit comments