#pragma once
#include <libsmtutil/SolverInterface.h>
namespace solidity::smtutil
{
inline Expression signedDivisionEVM(Expression _left, Expression _right)
{
return Expression::ite(
_left >= 0,
Expression::ite(_right >= 0, _left / _right, 0 - (_left / (0 - _right))),
Expression::ite(_right >= 0, 0 - ((0 - _left) / _right), (0 - _left) / (0 - _right))
);
}
inline Expression abs(Expression _value)
{
return Expression::ite(_value >= 0, _value, 0 - _value);
}
inline Expression signedModuloEVM(Expression _left, Expression _right)
{
return Expression::ite(
_left >= 0,
_left % _right,
Expression::ite(
(_left % _right) == 0,
0,
(_left % _right) - abs(_right)
)
);
}
}