/*******************************************************************\

Module:

Author: Daniel Kroening, kroening@cs.cmu.edu

\*******************************************************************/

#include "boolbv.h"

/*******************************************************************\

Function: boolbvt::convert_mod

  Inputs:

 Outputs:

 Purpose:

\*******************************************************************/

bool boolbvt::convert_mod(const exprt &expr, bvt &bv)
{
  if(expr.type().id()!="unsignedbv" &&
     expr.type().id()!="signedbv")
    return true;

  unsigned width;
  if(get_width(expr.type(), width))
    return true;

  if(expr.operands().size()!=2)
    throw "mod takes two operands";

  if(expr.op0().type().id()!=expr.type().id() ||
     expr.op1().type().id()!=expr.type().id())
    return true;

  bvt op0, op1;

  if(convert_bv(expr.op0(), op0)) return true;
  if(convert_bv(expr.op1(), op1)) return true;

  if(op0.size()!=width ||
     op1.size()!=width)
    throw "convert_mod: unexpected operand width";

  bvt res, rem;

  bv_utils.divider(op0, op1, res, rem, expr.type().id()=="signedbv");

  bv=rem;

  return false;
}
