#!/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
    import sys
    import argparse

    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)
    params = parser.parse_args()

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

    # easier than using argparse action.
    if params.model_name != None:
        print(params.model_name)

    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("  - Edit include/trace/events/rv.h to add the tracepoint entry")
    print("  - Move it to the kernel's monitor directory")
    print("  - Edit kernel/trace/rv/Makefile")
    print("  - Edit kernel/trace/rv/Kconfig")
