blob: 476dff3c4db2813332112f63f7c39646fa32e8dd [file] [log] [blame]
#!/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())