#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2019-2022 Red Hat, Inc. Daniel Bristot de Oliveira <bristot@kernel.org>
#
# dot2k: transform dot files into a monitor for the Linux kernel.
#
# For further information, see:
#   Documentation/trace/rv/da_monitor_synthesis.rst

if __name__ == '__main__':
    from dot2.dot2k import dot2k
    import argparse
    import ntpath
    import os
    import platform
    import sys

    parser = argparse.ArgumentParser(description='transform .dot file into kernel rv monitor')
    parser.add_argument('-d', "--dot", dest="dot_file", required=True)
    parser.add_argument('-t', "--monitor_type", dest="monitor_type", required=True)
    parser.add_argument('-n', "--model_name", dest="model_name", required=False)
    parser.add_argument("-D", "--description", dest="description", required=False)
    parser.add_argument("-a", "--auto_patch", dest="auto_patch",
                        action="store_true", required=False,
                        help="Patch the kernel in place")
    params = parser.parse_args()

    print("Opening and parsing the dot file %s" % params.dot_file)
    try:
        monitor=dot2k(params.dot_file, params.monitor_type, vars(params))
    except Exception as e:
        print('Error: '+ str(e))
        print("Sorry : :-(")
        sys.exit(1)

    print("Writing the monitor into the directory %s" % monitor.name)
    monitor.print_files()
    print("Almost done, checklist")
    print("  - Edit the %s/%s.c to add the instrumentation" % (monitor.name, monitor.name))
    print(monitor.fill_tracepoint_tooltip())
    print(monitor.fill_makefile_tooltip())
    print(monitor.fill_kconfig_tooltip())
    print(monitor.fill_monitor_tooltip())
