#ifndef ULMDOC0_EXPRWRAPPER_HPP
#define ULMDOC0_EXPRWRAPPER_HPP
#include "expr.hpp"
namespace ulmdoc {
class ExprWrapper
{
public:
ExprWrapper(const Expr::ExprPtr exprPtr);
ExprWrapper(std::int64_t literal);
bool isLiteral() const;
bool isLiteralZero() const;
bool isLiteralOne() const;
bool isZeroReg() const;
bool isIntEnum(std::string sym) const;
std::int64_t getLiteral() const;
Expr::ExprPtr exprPtr;
};
std::string latex(ExprWrapper expr);
Expr::ExprPtr ulm_regVal(ExprWrapper reg);
ExprWrapper declareBitField(std::string sym,
Expr::BitPatternType bitPatternType,
std::size_t numBits);
std::ostream &operator<<(std::ostream &out, const ExprWrapper expr);
ExprWrapper operator+(ExprWrapper left, ExprWrapper right);
ExprWrapper operator-(ExprWrapper left, ExprWrapper right);
ExprWrapper operator*(ExprWrapper left, ExprWrapper right);
ExprWrapper operator/(ExprWrapper left, ExprWrapper right);
ExprWrapper operator%(ExprWrapper left, ExprWrapper right);
ExprWrapper operator&(ExprWrapper left, ExprWrapper right);
ExprWrapper operator|(ExprWrapper left, ExprWrapper right);
ExprWrapper operator&&(ExprWrapper left, ExprWrapper right);
ExprWrapper operator||(ExprWrapper left, ExprWrapper right);
ExprWrapper operator==(ExprWrapper left, ExprWrapper right);
ExprWrapper operator!=(ExprWrapper left, ExprWrapper right);
ExprWrapper operator<<(ExprWrapper left, ExprWrapper right);
} // namespace ulmdoc
#endif // ULMDOC0_EXPRWRAPPER_HPP