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
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"
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"
def __descr_to_tex(meta): if not "descr" in meta: return "" return text_to_tex(meta["descr"]) + "\n\n"