File tree Expand file tree Collapse file tree 3 files changed +44
-6
lines changed Expand file tree Collapse file tree 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)
190190 return static_cast <bitxor_exprt &>(expr);
191191}
192192
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+
193228// / \brief Bit-wise AND
194229class bitand_exprt : public multi_ary_exprt
195230{
Original file line number Diff line number Diff line change @@ -950,9 +950,10 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
950950 {
951951 irep_idt op_id = expr.op ().id ();
952952
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)
956957 {
957958 exprt result = expr.op ();
958959
@@ -2949,9 +2950,9 @@ simplify_exprt::resultt<> simplify_exprt::simplify_node(const exprt &node)
29492950 {
29502951 r = simplify_bitnot (to_bitnot_expr (expr));
29512952 }
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 )
29552956 {
29562957 r = simplify_bitwise (to_multi_ary_expr (expr));
29572958 }
Original file line number Diff line number Diff line change @@ -745,6 +745,8 @@ simplify_exprt::simplify_bitwise(const multi_ary_exprt &expr)
745745 f = [](bool a, bool b) { return a || b; };
746746 else if (new_expr.id () == ID_bitxor)
747747 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; };
748750 else
749751 UNREACHABLE;
750752
You can’t perform that action at this time.
0 commit comments