# Copyright 2004-2006 The Regents of The University of Michigan
# Copyright 2010-20013 Advanced Micro Devices, Inc.
# Copyright 2013 Mark D. Hill and David A. Wood
# Copyright 2017-2020 ARM Limited
# Copyright 2021 Google, Inc.
#
# 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.
#
# 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 importlib
import os.path
import sys

import importer

from code_formatter import code_formatter

parser = argparse.ArgumentParser()
parser.add_argument("modpath", help="module the simobject belongs to")
parser.add_argument("param_cc", help="parameter cc file to generate")
parser.add_argument(
    "use_python", help="whether python is enabled in gem5 (True or False)"
)

args = parser.parse_args()

use_python = args.use_python.lower()
if use_python == "true":
    use_python = True
elif use_python == "false":
    use_python = False
else:
    print(f'Unrecognized "use_python" value {use_python}', file=sys.stderr)
    sys.exit(1)

basename = os.path.basename(args.param_cc)
no_ext = os.path.splitext(basename)[0]
sim_object_name = "_".join(no_ext.split("_")[1:])

importer.install()
module = importlib.import_module(args.modpath)
sim_object = getattr(module, sim_object_name)

from m5.objects.SimObject import PyBindProperty

code = code_formatter()

py_class_name = sim_object.pybind_class

# The 'local' attribute restricts us to the params declared in
# the object itself, not including inherited params (which
# will also be inherited from the base class's param struct
# here). Sort the params based on their key
params = list(
    map(lambda k_v: k_v[1], sorted(sim_object._params.local.items()))
)
ports = sim_object._ports.local

# only include pybind if python is enabled in the build
if use_python:

    code(
        """#include "pybind11/pybind11.h"
#include "pybind11/stl.h"

#include <type_traits>

#include "base/compiler.hh"
#include "params/$sim_object.hh"
#include "sim/init.hh"
#include "sim/sim_object.hh"

#include "${{sim_object.cxx_header}}"

"""
    )
else:
    code(
        """
#include <type_traits>

#include "base/compiler.hh"
#include "params/$sim_object.hh"

#include "${{sim_object.cxx_header}}"

"""
    )
# only include the python params code if python is enabled.
if use_python:
    for param in params:
        param.pybind_predecls(code)

    code(
        """namespace py = pybind11;

namespace gem5
{

static void
module_init(py::module_ &m_internal)
{
py::module_ m = m_internal.def_submodule("param_${sim_object}");
"""
    )
    code.indent()
    if sim_object._base:
        code(
            "py::class_<${sim_object}Params, "
            "${{sim_object._base.type}}Params, "
            "std::unique_ptr<${{sim_object}}Params, py::nodelete>>("
            'm, "${sim_object}Params")'
        )
    else:
        code(
            "py::class_<${sim_object}Params, "
            "std::unique_ptr<${sim_object}Params, py::nodelete>>("
            'm, "${sim_object}Params")'
        )

    code.indent()
    if not hasattr(sim_object, "abstract") or not sim_object.abstract:
        code(".def(py::init<>())")
        code('.def("create", &${sim_object}Params::create)')

    param_exports = (
        sim_object.cxx_param_exports
        + [
            PyBindProperty(k)
            for k, v in sorted(sim_object._params.local.items())
        ]
        + [
            PyBindProperty(f"port_{port.name}_connection_count")
            for port in ports.values()
        ]
    )
    for exp in param_exports:
        exp.export(code, f"{sim_object}Params")

    code(";")
    code()
    code.dedent()

    bases = []
    if "cxx_base" in sim_object._value_dict:
        # If the c++ base class implied by python inheritance was
        # overridden, use that value.
        if sim_object.cxx_base:
            bases.append(sim_object.cxx_base)
    elif sim_object._base:
        # If not and if there was a SimObject base, use its c++ class
        # as this class' base.
        bases.append(sim_object._base.cxx_class)
    # Add in any extra bases that were requested.
    bases.extend(sim_object.cxx_extra_bases)

    if bases:
        base_str = ", ".join(bases)
        code(
            "py::class_<${{sim_object.cxx_class}}, ${base_str}, "
            "std::unique_ptr<${{sim_object.cxx_class}}, py::nodelete>>("
            'm, "${py_class_name}")'
        )
    else:
        code(
            "py::class_<${{sim_object.cxx_class}}, "
            "std::unique_ptr<${{sim_object.cxx_class}}, py::nodelete>>("
            'm, "${py_class_name}")'
        )
    code.indent()
    for exp in sim_object.cxx_exports:
        exp.export(code, sim_object.cxx_class)
    code(";")
    code.dedent()
    code()
    code.dedent()
    code("}")
    code()
    code(
        "static EmbeddedPyBind " 'embed_obj("${0}", module_init, "${1}");',
        sim_object,
        sim_object._base.type if sim_object._base else "",
    )
    code()
    code("} // namespace gem5")

# include the create() methods whether or not python is enabled.
if not hasattr(sim_object, "abstract") or not sim_object.abstract:
    if "type" in sim_object.__dict__:
        code(
            """
namespace gem5
{

namespace
{

/*
 * If we can't define a default create() method for this params
 * struct because the SimObject doesn't have the right
 * constructor, use template magic to make it so we're actually
 * defining a create method for this class instead.
 */
class Dummy${sim_object}ParamsClass
{
  public:
    ${{sim_object.cxx_class}} *create() const;
};

template <class CxxClass, class Enable=void>
class Dummy${sim_object}Shunt;

/*
 * This version directs to the real Params struct and the
 * default behavior of create if there's an appropriate
 * constructor.
 */
template <class CxxClass>
class Dummy${sim_object}Shunt<CxxClass, std::enable_if_t<
    std::is_constructible_v<CxxClass, const ${sim_object}Params &>>>
{
  public:
    using Params = ${sim_object}Params;
    static ${{sim_object.cxx_class}} *
    create(const Params &p)
    {
        return new CxxClass(p);
    }
};

/*
 * This version diverts to the DummyParamsClass and a dummy
 * implementation of create if the appropriate constructor does
 * not exist.
 */
template <class CxxClass>
class Dummy${sim_object}Shunt<CxxClass, std::enable_if_t<
    !std::is_constructible_v<CxxClass, const ${sim_object}Params &>>>
{
  public:
    using Params = Dummy${sim_object}ParamsClass;
    static ${{sim_object.cxx_class}} *
    create(const Params &p)
    {
        return nullptr;
    }
};

} // anonymous namespace

/*
 * An implementation of either the real Params struct's create
 * method, or the Dummy one. Either an implementation is
 * mandantory since this was shunted off to the dummy class, or
 * one is optional which will override this weak version.
 */
[[maybe_unused]] ${{sim_object.cxx_class}} *
Dummy${sim_object}Shunt<${{sim_object.cxx_class}}>::Params::create() const
{
    return Dummy${sim_object}Shunt<${{sim_object.cxx_class}}>::create(*this);
}

} // namespace gem5
"""
        )

code.write(args.param_cc)
