# Copyright (c) 2013-2020 ARM Limited
# All rights reserved.
#
# The license below extends only to copyright in the software and shall
# not be construed as granting a license to any other intellectual
# property including but not limited to intellectual property relating
# to a hardware implementation of the functionality of the software
# licensed hereunder.  You may use the software subject to the license
# terms below provided that you ensure that this notice is replicated
# unmodified and in its entirety in all distributions of the software,
# modified or unmodified, in source code or in binary form.
#
# Copyright (c) 2006-2008 The Regents of The University of Michigan
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met: redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer;
# redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution;
# neither the name of the copyright holders nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import argparse

import m5
from m5.defines import buildEnv
from m5.objects import *

from common.Benchmarks import *
from common import ObjectList

vio_9p_help = """\
Enable the Virtio 9P device and set the path to share. The default 9p path is
m5ou5/9p/share, and it can be changed by setting VirtIO9p.root with --param. A
sample guest mount command is: "mount -t 9p -o
trans=virtio,version=9p2000.L,aname=<host-full-path> gem5 /mnt/9p" where
"<host-full-path>" is the full path being shared on the host, and "gem5" is a
fixed mount tag. This option requires the diod 9P server to be installed in the
host PATH or selected with with: VirtIO9PDiod.diod.
"""


class ListCpu(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        ObjectList.cpu_list.print()
        sys.exit(0)


class ListBp(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        ObjectList.bp_list.print()
        sys.exit(0)


class ListHWP(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        ObjectList.hwp_list.print()
        sys.exit(0)


class ListRP(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        ObjectList.rp_list.print()
        sys.exit(0)


class ListIndirectBP(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        ObjectList.indirect_bp_list.print()
        sys.exit(0)


class ListMem(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        ObjectList.mem_list.print()
        sys.exit(0)


class ListPlatform(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        ObjectList.platform_list.print()
        sys.exit(0)

# Add the very basic options that work also in the case of the no ISA
# being used, and consequently no CPUs, but rather various types of
# testers and traffic generators.


def addNoISAOptions(parser):
    parser.add_argument("-n", "--num-cpus", type=int, default=1)
    parser.add_argument("--sys-voltage", action="store", type=str,
                        default='1.0V',
                        help="""Top-level voltage for blocks running at system
                      power supply""")
    parser.add_argument("--sys-clock", action="store", type=str,
                        default='1GHz',
                        help="""Top-level clock for blocks running at system
                      speed""")

    # Memory Options
    parser.add_argument("--list-mem-types",
                        action=ListMem, nargs=0,
                        help="List available memory types")
    parser.add_argument("--mem-type", default="DDR3_1600_8x8",
                        choices=ObjectList.mem_list.get_names(),
                        help="type of memory to use")
    parser.add_argument("--mem-channels", type=int, default=1,
                        help="number of memory channels")
    parser.add_argument("--mem-ranks", type=int, default=None,
                        help="number of memory ranks per channel")
    parser.add_argument(
        "--mem-size", action="store", type=str, default="512MB",
        help="Specify the physical memory size (single memory)")
    parser.add_argument("--enable-dram-powerdown", action="store_true",
                        help="Enable low-power states in DRAMInterface")
    parser.add_argument("--mem-channels-intlv", type=int, default=0,
                        help="Memory channels interleave")

    parser.add_argument("--memchecker", action="store_true")

    # Cache Options
    parser.add_argument("--external-memory-system", type=str,
                        help="use external ports of this port_type for caches")
    parser.add_argument("--tlm-memory", type=str,
                        help="use external port for SystemC TLM cosimulation")
    parser.add_argument("--caches", action="store_true")
    parser.add_argument("--l2cache", action="store_true")
    parser.add_argument("--num-dirs", type=int, default=1)
    parser.add_argument("--num-l2caches", type=int, default=1)
    parser.add_argument("--num-l3caches", type=int, default=1)
    parser.add_argument("--l1d_size", type=str, default="64kB")
    parser.add_argument("--l1i_size", type=str, default="32kB")
    parser.add_argument("--l2_size", type=str, default="2MB")
    parser.add_argument("--l3_size", type=str, default="16MB")
    parser.add_argument("--l1d_assoc", type=int, default=2)
    parser.add_argument("--l1i_assoc", type=int, default=2)
    parser.add_argument("--l2_assoc", type=int, default=8)
    parser.add_argument("--l3_assoc", type=int, default=16)
    parser.add_argument("--cacheline_size", type=int, default=64)

    # Enable Ruby
    parser.add_argument("--ruby", action="store_true")

    # Run duration options
    parser.add_argument("-m", "--abs-max-tick", type=int, default=m5.MaxTick,
                        metavar="TICKS", help="Run to absolute simulated tick "
                        "specified including ticks from a restored checkpoint")
    parser.add_argument(
        "--rel-max-tick", type=int, default=None, metavar="TICKS",
        help="Simulate for specified number of"
        " ticks relative to the simulation start tick (e.g. if "
        "restoring a checkpoint)")
    parser.add_argument("--maxtime", type=float, default=None,
                        help="Run to the specified absolute simulated time in "
                        "seconds")
    parser.add_argument(
        "-P", "--param", action="append", default=[],
        help="Set a SimObject parameter relative to the root node. "
        "An extended Python multi range slicing syntax can be used "
        "for arrays. For example: "
        "'system.cpu[0,1,3:8:2].max_insts_all_threads = 42' "
        "sets max_insts_all_threads for cpus 0, 1, 3, 5 and 7 "
        "Direct parameters of the root object are not accessible, "
        "only parameters of its children.")

# Add common options that assume a non-NULL ISA.


def addCommonOptions(parser):
    # start by adding the base options that do not assume an ISA
    addNoISAOptions(parser)

    # system options
    parser.add_argument("--list-cpu-types",
                        action=ListCpu, nargs=0,
                        help="List available CPU types")
    parser.add_argument("--cpu-type", default="AtomicSimpleCPU",
                        choices=ObjectList.cpu_list.get_names(),
                        help="type of cpu to run with")
    parser.add_argument("--list-bp-types",
                        action=ListBp, nargs=0,
                        help="List available branch predictor types")
    parser.add_argument("--list-indirect-bp-types",
                        action=ListIndirectBP, nargs=0,
                        help="List available indirect branch predictor types")
    parser.add_argument("--bp-type", default=None,
                        choices=ObjectList.bp_list.get_names(),
                        help="""
                        type of branch predictor to run with
                        (if not set, use the default branch predictor of
                        the selected CPU)""")
    parser.add_argument("--indirect-bp-type", default=None,
                        choices=ObjectList.indirect_bp_list.get_names(),
                        help="type of indirect branch predictor to run with")

    parser.add_argument("--list-rp-types",
                        action=ListRP, nargs=0,
                        help="List available replacement policy types")

    parser.add_argument("--list-hwp-types",
                        action=ListHWP, nargs=0,
                        help="List available hardware prefetcher types")
    parser.add_argument("--l1i-hwp-type", default=None,
                        choices=ObjectList.hwp_list.get_names(),
                        help="""
                        type of hardware prefetcher to use with the L1
                        instruction cache.
                        (if not set, use the default prefetcher of
                        the selected cache)""")
    parser.add_argument("--l1d-hwp-type", default=None,
                        choices=ObjectList.hwp_list.get_names(),
                        help="""
                        type of hardware prefetcher to use with the L1
                        data cache.
                        (if not set, use the default prefetcher of
                        the selected cache)""")
    parser.add_argument("--l2-hwp-type", default=None,
                        choices=ObjectList.hwp_list.get_names(),
                        help="""
                        type of hardware prefetcher to use with the L2 cache.
                        (if not set, use the default prefetcher of
                        the selected cache)""")
    parser.add_argument("--checker", action="store_true")
    parser.add_argument("--cpu-clock", action="store", type=str,
                        default='2GHz',
                        help="Clock for blocks running at CPU speed")
    parser.add_argument("--smt", action="store_true", default=False,
                        help="""
                      Only used if multiple programs are specified. If true,
                      then the number of threads per cpu is same as the
                      number of programs.""")
    parser.add_argument(
        "--elastic-trace-en", action="store_true",
        help="""Enable capture of data dependency and instruction
                      fetch traces using elastic trace probe.""")
    # Trace file paths input to trace probe in a capture simulation and input
    # to Trace CPU in a replay simulation
    parser.add_argument("--inst-trace-file", action="store", type=str,
                        help="""Instruction fetch trace file input to
                      Elastic Trace probe in a capture simulation and
                      Trace CPU in a replay simulation""", default="")
    parser.add_argument("--data-trace-file", action="store", type=str,
                        help="""Data dependency trace file input to
                      Elastic Trace probe in a capture simulation and
                      Trace CPU in a replay simulation""", default="")

    # dist-gem5 options
    parser.add_argument("--dist", action="store_true",
                        help="Parallel distributed gem5 simulation.")
    parser.add_argument(
        "--dist-sync-on-pseudo-op", action="store_true",
        help="Use a pseudo-op to start dist-gem5 synchronization.")
    parser.add_argument(
        "--is-switch", action="store_true",
        help="Select the network switch simulator process for a"
        "distributed gem5 run")
    parser.add_argument("--dist-rank", default=0, action="store", type=int,
                        help="Rank of this system within the dist gem5 run.")
    parser.add_argument(
        "--dist-size", default=0, action="store", type=int,
        help="Number of gem5 processes within the dist gem5 run.")
    parser.add_argument(
        "--dist-server-name", default="127.0.0.1", action="store", type=str,
        help="Name of the message server host\nDEFAULT: localhost")
    parser.add_argument("--dist-server-port",
                        default=2200,
                        action="store", type=int,
                        help="Message server listen port\nDEFAULT: 2200")
    parser.add_argument(
        "--dist-sync-repeat", default="0us", action="store", type=str,
        help="Repeat interval for synchronisation barriers among "
        "dist-gem5 processes\nDEFAULT: --ethernet-linkdelay")
    parser.add_argument(
        "--dist-sync-start", default="5200000000000t", action="store",
        type=str,
        help="Time to schedule the first dist synchronisation barrier\n"
        "DEFAULT:5200000000000t")
    parser.add_argument("--ethernet-linkspeed", default="10Gbps",
                        action="store", type=str,
                        help="Link speed in bps\nDEFAULT: 10Gbps")
    parser.add_argument("--ethernet-linkdelay", default="10us",
                        action="store", type=str,
                        help="Link delay in seconds\nDEFAULT: 10us")

    # Run duration options
    parser.add_argument("-I", "--maxinsts", action="store", type=int,
                        default=None, help="""Total number of instructions to
                                            simulate (default: run forever)""")
    parser.add_argument("--work-item-id", action="store", type=int,
                        help="the specific work id for exit & checkpointing")
    parser.add_argument("--num-work-ids", action="store", type=int,
                        help="Number of distinct work item types")
    parser.add_argument("--work-begin-cpu-id-exit", action="store", type=int,
                        help="exit when work starts on the specified cpu")
    parser.add_argument("--work-end-exit-count", action="store", type=int,
                        help="exit at specified work end count")
    parser.add_argument("--work-begin-exit-count", action="store", type=int,
                        help="exit at specified work begin count")
    parser.add_argument("--init-param", action="store", type=int, default=0,
                        help="""Parameter available in simulation with m5
                              initparam""")
    parser.add_argument(
        "--initialize-only", action="store_true", default=False,
        help="""Exit after initialization. Do not simulate time.
                              Useful when gem5 is run as a library.""")

    # Simpoint options
    parser.add_argument("--simpoint-profile", action="store_true",
                        help="Enable basic block profiling for SimPoints")
    parser.add_argument("--simpoint-interval", type=int, default=10000000,
                        help="SimPoint interval in num of instructions")
    parser.add_argument(
        "--take-simpoint-checkpoints", action="store", type=str,
        help="<simpoint file,weight file,interval-length,warmup-length>")
    parser.add_argument("--restore-simpoint-checkpoint", action="store_true",
                        default=False,
                        help="restore from a simpoint checkpoint taken with " +
                        "--take-simpoint-checkpoints")

    # Checkpointing options
    # Note that performing checkpointing via python script files will override
    # checkpoint instructions built into binaries.
    parser.add_argument(
        "--take-checkpoints", action="store", type=str,
        help="<M,N> take checkpoints at tick M and every N ticks thereafter")
    parser.add_argument(
        "--max-checkpoints", action="store", type=int,
        help="the maximum number of checkpoints to drop", default=5)
    parser.add_argument(
        "--checkpoint-dir", action="store", type=str,
        help="Place all checkpoints in this absolute directory")
    parser.add_argument("-r", "--checkpoint-restore", action="store", type=int,
                        help="restore from checkpoint <N>")
    parser.add_argument("--checkpoint-at-end", action="store_true",
                        help="take a checkpoint at end of run")
    parser.add_argument(
        "--work-begin-checkpoint-count", action="store", type=int,
        help="checkpoint at specified work begin count")
    parser.add_argument(
        "--work-end-checkpoint-count", action="store", type=int,
        help="checkpoint at specified work end count")
    parser.add_argument(
        "--work-cpus-checkpoint-count", action="store", type=int,
        help="checkpoint and exit when active cpu count is reached")
    parser.add_argument("--restore-with-cpu", action="store",
                        default="AtomicSimpleCPU",
                        choices=ObjectList.cpu_list.get_names(),
                        help="cpu type for restoring from a checkpoint")

    # CPU Switching - default switch model goes from a checkpoint
    # to a timing simple CPU with caches to warm up, then to detailed CPU for
    # data measurement
    parser.add_argument(
        "--repeat-switch", action="store", type=int, default=None,
        help="switch back and forth between CPUs with period <N>")
    parser.add_argument(
        "-s", "--standard-switch", action="store", type=int, default=None,
        help="switch from timing to Detailed CPU after warmup period of <N>")
    parser.add_argument("-p", "--prog-interval", type=str,
                        help="CPU Progress Interval")

    # Fastforwarding and simpoint related materials
    parser.add_argument(
        "-W", "--warmup-insts", action="store", type=int, default=None,
        help="Warmup period in total instructions (requires --standard-switch)")
    parser.add_argument(
        "--bench", action="store", type=str, default=None,
        help="base names for --take-checkpoint and --checkpoint-restore")
    parser.add_argument(
        "-F", "--fast-forward", action="store", type=str, default=None,
        help="Number of instructions to fast forward before switching")
    parser.add_argument(
        "-S", "--simpoint", action="store_true", default=False,
        help="""Use workload simpoints as an instruction offset for
                --checkpoint-restore or --take-checkpoint.""")
    parser.add_argument(
        "--at-instruction", action="store_true", default=False,
        help="""Treat value of --checkpoint-restore or --take-checkpoint as a
                number of instructions.""")
    parser.add_argument("--spec-input", default="ref",
                        choices=["ref", "test", "train", "smred", "mdred",
                                 "lgred"],
                        help="Input set size for SPEC CPU2000 benchmarks.")
    parser.add_argument("--arm-iset", default="arm",
                        choices=["arm", "thumb", "aarch64"],
                        help="ARM instruction set.")
    parser.add_argument(
        "--stats-root", action="append", default=[],
        help="If given, dump only stats of objects under the given SimObject. "
        "SimObjects are identified with Python notation as in: "
        "system.cpu[0].mmu. All elements of an array can be selected at "
        "once with: system.cpu[:].mmu. If given multiple times, dump stats "
        "that are present under any of the roots. If not given, dump all "
        "stats. ")


def addSEOptions(parser):
    # Benchmark options
    parser.add_argument("-c", "--cmd", default="",
                        help="The binary to run in syscall emulation mode.")
    parser.add_argument("-o", "--options", default="",
                        help="""The options to pass to the binary, use " "
                              around the entire string""")
    parser.add_argument("-e", "--env", default="",
                        help="Initialize workload environment from text file.")
    parser.add_argument("-i", "--input", default="",
                        help="Read stdin from a file.")
    parser.add_argument("--output", default="",
                        help="Redirect stdout to a file.")
    parser.add_argument("--errout", default="",
                        help="Redirect stderr to a file.")
    parser.add_argument("--chroot", action="store", type=str, default=None,
                        help="The chroot option allows a user to alter the "
                        "search path for processes running in SE mode. "
                        "Normally, the search path would begin at the "
                        "root of the filesystem (i.e. /). With chroot, "
                        "a user can force the process to begin looking at"
                        "some other location (i.e. /home/user/rand_dir)."
                        "The intended use is to trick sophisticated "
                        "software which queries the __HOST__ filesystem "
                        "for information or functionality. Instead of "
                        "finding files on the __HOST__ filesystem, the "
                        "process will find the user's replacment files.")
    parser.add_argument("--interp-dir", action="store", type=str,
                        default=None,
                        help="The interp-dir option is used for "
                        "setting the interpreter's path. This will "
                        "allow to load the guest dynamic linker/loader "
                        "itself from the elf binary. The option points to "
                        "the parent folder of the guest /lib in the "
                        "host fs")

    parser.add_argument("--redirects", action="append", type=str,
                        default=[],
                        help="A collection of one or more redirect paths "
                        "to be used in syscall emulation."
                        "Usage: gem5.opt [...] --redirects /dir1=/path/"
                        "to/host/dir1 --redirects /dir2=/path/to/host/dir2")
    parser.add_argument("--wait-gdb", default=False, action='store_true',
                        help="Wait for remote GDB to connect.")


def addFSOptions(parser):
    from common.FSConfig import os_types

    # Simulation options
    parser.add_argument(
        "--timesync", action="store_true",
        help="Prevent simulated time from getting ahead of real time")

    # System options
    parser.add_argument("--kernel", action="store", type=str)
    parser.add_argument("--os-type", action="store",
                        choices=os_types[str(buildEnv['TARGET_ISA'])],
                        default="linux",
                        help="Specifies type of OS to boot")
    parser.add_argument("--script", action="store", type=str)
    parser.add_argument(
        "--frame-capture", action="store_true",
        help="Stores changed frame buffers from the VNC server to compressed "
        "files in the gem5 output directory")

    if buildEnv['TARGET_ISA'] == "arm":
        parser.add_argument(
            "--bare-metal", action="store_true",
            help="Provide the raw system without the linux specific bits")
        parser.add_argument("--list-machine-types",
                            action=ListPlatform, nargs=0,
                            help="List available platform types")
        parser.add_argument("--machine-type", action="store",
                            choices=ObjectList.platform_list.get_names(),
                            default="VExpress_GEM5_V1")
        parser.add_argument(
            "--dtb-filename", action="store", type=str,
            help="Specifies device tree blob file to use with device-tree-"
            "enabled kernels")
        parser.add_argument(
            "--enable-context-switch-stats-dump", action="store_true",
            help="Enable stats dump at context "
            "switches and dump tasks file (required for Streamline)")
        parser.add_argument("--vio-9p", action="store_true", help=vio_9p_help)
        parser.add_argument(
            "--bootloader", action='append',
            help="executable file that runs before the --kernel")

    # Benchmark options
    parser.add_argument(
        "--dual", action="store_true",
        help="Simulate two systems attached with an ethernet link")
    parser.add_argument(
        "-b", "--benchmark", action="store", type=str, dest="benchmark",
        help="Specify the benchmark to run. Available benchmarks: %s" %
        DefinedBenchmarks)

    # Metafile options
    parser.add_argument(
        "--etherdump", action="store", type=str, dest="etherdump",
        help="Specify the filename to dump a pcap capture of the"
        "ethernet traffic")

    # Disk Image Options
    parser.add_argument("--disk-image", action="append", type=str,
                        default=[], help="Path to the disk images to use.")
    parser.add_argument("--root-device", action="store", type=str,
                        default=None, help="OS device name for root partition")

    # Command line options
    parser.add_argument("--command-line", action="store", type=str,
                        default=None,
                        help="Template for the kernel command line.")
    parser.add_argument(
        "--command-line-file", action="store", default=None, type=str,
        help="File with a template for the kernel command line")

    # Debug option
    parser.add_argument("--wait-gdb", default=False, action='store_true',
                        help="Wait for remote GDB to connect.")
