#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