コード例 #1
0
    def __fields_to_tex(meta):
        result = "\\begin{bytefield}{32}\n"

        # Define the bytefield header.
        field_limits = set([0, 31])
        for short_name in meta["fields"]:
            field = meta["fields"][short_name]
            offs = field["offs"]
            width = field["width"]
            field_limits.update({offs, min(offs + width, 31)})
        bitheader = ",".join([str(x) for x in field_limits])
        result += f"  \\bitheader{{{bitheader}}} \\\\\n"

        # Extract all fields, and sort them in decreasing order.
        sorted_fields = []
        for short_name in meta["fields"]:
            field = meta["fields"][short_name]
            sorted_fields.append({"name": short_name, "offs": field["offs"], "width": field["width"]})
        sorted_fields = sorted(sorted_fields, reverse=True, key=lambda x: x["offs"])

        # Emit the LaTeX bytefield fields.
        pos = 32
        for field in sorted_fields:
            name = field["name"]
            offs = field["offs"]
            width = field["width"]
            pad = pos - (offs + width)
            if pad < 0:
                raise SystemRegisterDBError("Invalid bit field specification")
            if pad > 0:
                result += f"  \\bitboxes*{{1}}{{{'0' * pad}}} &\n"
            bit_tex = "\\tiny " if width <= 2 else ""
            bit_tex += escape_tex(name)
            result += f"  \\bitbox{{{width}}}{{{bit_tex}}} &\n"
            pos = offs
        if pos > 0:
            result += f"  \\bitboxes*{{1}}{{{'0' * pos}}}\n"
        result += "\\end{bytefield}\n\n"

        # Describe each field.
        for short_name in meta["fields"]:
            field = meta["fields"][short_name]
            name = field['name'] if "name" in field else short_name
            first_bit = field["offs"]
            last_bit = first_bit + field["width"] - 1
            if first_bit == last_bit:
                bit_range = f"bit {first_bit}"
            else:
                bit_range = f"bits <{last_bit}:{first_bit}>"
            result += f"\\paragraph{{{escape_tex(name)} ({bit_range})}}\n\n"
            result += text_to_tex(field["descr"]) + "\n\n"

        return result
コード例 #2
0
 def __note_to_tex(meta):
     if not "note" in meta:
         return ""
     return "\\begin{notebox}\n" + text_to_tex(meta["note"]) + "\n\\end{notebox}\n\n"
コード例 #3
0
 def __todo_to_tex(meta):
     if not "todo" in meta:
         return ""
     return "\\begin{todobox}\n" + text_to_tex(meta["todo"]) + "\n\\end{todobox}\n\n"
コード例 #4
0
 def __descr_to_tex(meta):
     if not "descr" in meta:
         return ""
     return text_to_tex(meta["descr"]) + "\n\n"