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
50
51
52
#include <sstream>

#include "latex.hpp"

namespace ulmdoc {

std::string
truncateInt(ExprWrapper val, std::size_t bits)
{
    auto intVal = makeInt(val.exprPtr);
    auto str = latex(intVal);
    if (intVal->isAdditiveBinaryExpr()) {
        str = "\\left(" + str + "\\right)";
    }

    std::ostringstream exp;
    exp << bits;

    return str + " \\bmod 2^{" + exp.str() + "}";
}

std::string
unsignedReg(ExprWrapper dest)
{
    return "u\\left(" + latex(ulm_regVal(dest)) + "\\right)";
}

std::string
signedReg(ExprWrapper dest)
{
    return "s\\left(" + latex(ulm_regVal(dest)) + "\\right)";
}

std::string
readFromUnsignedReg(ExprWrapper dest, std::size_t numBytes)
{
    return truncateInt(ulm_regVal(dest), 8 * numBytes) + " \\to ";
}

std::string
writeToUnsignedReg(ExprWrapper dest)
{
    return " \\to " + unsignedReg(dest);
}

std::string
writeToSignedReg(ExprWrapper dest)
{
    return " \\to " + unsignedReg(dest);
}

} // namespace ulmdoc