| #!/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="<input_file_path>", | |
| help="Input IR dump (.mlir from -mlir-print-ir-after-all)", | |
| ) | |
| parser.add_argument( | |
| "-o,", | |
| "--output", | |
| type=str, | |
| required=True, | |
| metavar="<output>", | |
| 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()) |