File tree Expand file tree Collapse file tree 2 files changed +30
-8
lines changed Expand file tree Collapse file tree 2 files changed +30
-8
lines changed Original file line number Diff line number Diff line change @@ -1220,12 +1220,9 @@ void smt2_convt::convert_expr(const exprt &expr)
12201220
12211221    convert_expr (expr.operands ().front ());
12221222  }
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)
12291226  {
12301227    DATA_INVARIANT_WITH_DIAGNOSTICS (
12311228      expr.operands ().size () >= 2 ,
@@ -1255,6 +1252,28 @@ void smt2_convt::convert_expr(const exprt &expr)
12551252
12561253    out << " )"  ;
12571254  }
1255+   else  if (
1256+     expr.id () == ID_bitxnor || expr.id () == ID_bitnand ||
1257+     expr.id () == ID_bitnor)
1258+   {
1259+     //  only exist as a binary expression
1260+     const  auto  &bitxnor = to_bitxnor_expr (expr);
1261+     DATA_INVARIANT (
1262+       expr.operands ().size () == 2 , " bitxnor should have two operands"  );
1263+ 
1264+     out << ' ('  ;
1265+     if (expr.id () == ID_bitxnor)
1266+       out << " bvxnor"  ;
1267+     else  if (expr.id () == ID_bitnand)
1268+       out << " bvnand"  ;
1269+     else  if (expr.id () == ID_bitnor)
1270+       out << " bvnor"  ;
1271+     out << '  '  ;
1272+     flatten2bv (bitxnor.op0 ());
1273+     out << '  '  ;
1274+     flatten2bv (bitxnor.op1 ());
1275+     out << ' )'  ;
1276+   }
12581277  else  if (expr.id ()==ID_bitnot)
12591278  {
12601279    const  bitnot_exprt &bitnot_expr = to_bitnot_expr (expr);
Original file line number Diff line number Diff line change @@ -191,11 +191,12 @@ inline bitxor_exprt &to_bitxor_expr(exprt &expr)
191191}
192192
193193// / \brief Bit-wise XNOR
194- class  bitxnor_exprt  : public  multi_ary_exprt 
194+ // / Binary, not multi-ary, to avoid the ambiguity.
195+ class  bitxnor_exprt  : public  binary_exprt 
195196{
196197public: 
197198  bitxnor_exprt (exprt _op0, exprt _op1)
198-     : multi_ary_exprt (std::move(_op0), ID_bitxnor, std::move(_op1))
199+     : binary_exprt (std::move(_op0), ID_bitxnor, std::move(_op1))
199200  {
200201  }
201202};
@@ -215,13 +216,15 @@ inline bool can_cast_expr<bitxnor_exprt>(const exprt &base)
215216inline  const  bitxnor_exprt &to_bitxnor_expr (const  exprt &expr)
216217{
217218  PRECONDITION (expr.id () == ID_bitxnor);
219+   bitxnor_exprt::check (expr);
218220  return  static_cast <const  bitxnor_exprt &>(expr);
219221}
220222
221223// / \copydoc to_bitxnor_expr(const exprt &)
222224inline  bitxnor_exprt &to_bitxnor_expr (exprt &expr)
223225{
224226  PRECONDITION (expr.id () == ID_bitxnor);
227+   bitxnor_exprt::check (expr);
225228  return  static_cast <bitxnor_exprt &>(expr);
226229}
227230
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments