#!/usr/bin/env python3 # Copyright 2021 The IREE Authors # # Licensed under the Apache License v2.0 with LLVM Exceptions. # See https://llvm.org/LICENSE.txt for license information. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception """Converts a dump of IR text to a markdown file with formatting. Example usage: # Get a dump of IR from a compiler tool: $ iree-opt \ --iree-transformation-pipeline \ --iree-hal-target-backends=vmvx \ --mlir-disable-threading \ --mlir-print-ir-after-all \ --mlir-print-ir-after-change \ --mlir-elide-elementsattrs-if-larger=8 \ $PWD/iree/samples/models/simple_abs.mlir \ 2> /tmp/simple_abs_vmvx_pipeline.mlir > /dev/null # Convert the IR dump to markdown: $ python3 ir_to_markdown.py \ /tmp/simple_abs_vmvx_pipeline.mlir \ -o /tmp/simple_abs_vmvx_pipeline.md """ import argparse import re MLIR_START_SEQUENCE = "// -----//" MLIR_END_SEQUENCE = "//----- //" def parse_arguments(): """Parses command line arguments.""" parser = argparse.ArgumentParser() parser.add_argument( "input_file_path", type=str, nargs="?", metavar="", help="Input IR dump (.mlir from -mlir-print-ir-after-all)", ) parser.add_argument( "-o,", "--output", type=str, required=True, metavar="", help="Output file path (e.g. translation_ir.md)", ) # TODO(scotttodd): flags for original IR path and compilation command line # .md could then show original IR + flags -> output # TODO(scotttodd): flag for markdown flavor (mkdocs, github, etc.) # TODO(scotttodd): flag for diff view (correlate IR before and IR after)? return parser.parse_args() def main(args): input_file_path = args.input_file_path output_file_path = args.output print("Converting input file '%s'" % (input_file_path)) print(" into output file '%s'" % (output_file_path)) with open(input_file_path, "r") as input_file: with open(output_file_path, "w") as output_file: # Iterate line by line through the input file, collecting text into # blocks and writing them into the output file with markdown formatting # as we go. # # Note: we could parse through and find/replace within the file using # regex (or sed), but iterating this way is easier to understand and # uses a predictable amount of memory. current_block_lines = [] dump_after_regex = re.compile( MLIR_START_SEQUENCE + "\s(.*)\s" + MLIR_END_SEQUENCE ) def finish_block(): nonlocal current_block_lines if len(current_block_lines) != 0: current_block_lines.append("```\n\n") output_file.writelines(current_block_lines) current_block_lines = [] for input_line in input_file: if input_line == "\n": continue if input_line.startswith(MLIR_START_SEQUENCE): finish_block() header_text = dump_after_regex.match(input_line).group(1) current_block_lines.append("### " + header_text + "\n\n") current_block_lines.append("```mlir\n") else: current_block_lines.append(input_line) finish_block() if __name__ == "__main__": main(parse_arguments())