1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#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