# 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('cxx_config_cc', help='cxx config cc file to generate')

args = parser.parse_args()

basename = os.path.basename(args.cxx_config_cc)
sim_object_name = os.path.splitext(basename)[0]

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

from m5.params import isSimObjectClass
import m5.params

code = code_formatter()

entry_class = 'CxxConfigDirectoryEntry_%s' % sim_object_name
param_class = '%sCxxConfigParams' % sim_object_name

def cxx_bool(b):
    return 'true' if b else 'false'

code('#include "params/%s.hh"' % sim_object_name)

for param in sim_object._params.values():
    if isSimObjectClass(param.ptype):
        code('#include "%s"' % param.ptype._value_dict['cxx_header'])
        code('#include "params/%s.hh"' % param.ptype.__name__)
    else:
        param.ptype.cxx_ini_predecls(code)

code('''#include "${{sim_object._value_dict['cxx_header']}}"
#include "base/str.hh"
#include "cxx_config/${sim_object_name}.hh"

namespace gem5
{

${param_class}::DirectoryEntry::DirectoryEntry()
{
''')
code.indent()
for param in sim_object._params.values():
    is_vector = isinstance(param, m5.params.VectorParamDesc)
    is_simobj = issubclass(param.ptype, m5.SimObject.SimObject)

    code('parameters["%s"] = new ParamDesc("%s", %s, %s);' %
        (param.name, param.name, cxx_bool(is_vector),
        cxx_bool(is_simobj)));

for port in sim_object._ports.values():
    is_vector = isinstance(port, m5.params.VectorPort)
    is_requestor = port.role == 'GEM5 REQUESTOR'

    code('ports["%s"] = new PortDesc("%s", %s, %s);' %
        (port.name, port.name, cxx_bool(is_vector),
        cxx_bool(is_requestor)))

code.dedent()

code('''}

bool
${param_class}::setSimObject(const std::string &name, SimObject *simObject)
{
    bool ret = true;
    if (false) {
''')

code.indent()
for param in sim_object._params.values():
    is_vector = isinstance(param, m5.params.VectorParamDesc)
    is_simobj = issubclass(param.ptype, m5.SimObject.SimObject)

    if is_simobj and not is_vector:
        code('} else if (name == "${{param.name}}") {')
        code.indent()
        code('this->${{param.name}} = '
            'dynamic_cast<${{param.ptype.cxx_type}}>(simObject);')
        code('if (simObject && !this->${{param.name}})')
        code('   ret = false;')
        code.dedent()
code.dedent()

code('''
    } else {
        ret = false;
    }

    return ret;
}

bool
${param_class}::setSimObjectVector(const std::string &name,
    const std::vector<SimObject *> &simObjects)
{
    bool ret = true;

    if (false) {
''')

code.indent()
for param in sim_object._params.values():
    is_vector = isinstance(param, m5.params.VectorParamDesc)
    is_simobj = issubclass(param.ptype, m5.SimObject.SimObject)

    if is_simobj and is_vector:
        code('} else if (name == "${{param.name}}") {')
        code.indent()
        code('this->${{param.name}}.clear();')
        code('for (auto i = simObjects.begin(); '
            'ret && i != simObjects.end(); i ++)')
        code('{')
        code.indent()
        code('${{param.ptype.cxx_type}} object = '
            'dynamic_cast<${{param.ptype.cxx_type}}>(*i);')
        code('if (*i && !object)')
        code('    ret = false;')
        code('else')
        code('    this->${{param.name}}.push_back(object);')
        code.dedent()
        code('}')
        code.dedent()
code.dedent()

code('''
    } else {
        ret = false;
    }

    return ret;
}

void
${param_class}::setName(const std::string &name_)
{
    this->name = name_;
}

bool
${param_class}::setParam(const std::string &name,
    const std::string &value, const Flags flags)
{
    bool ret = true;

    if (false) {
''')

code.indent()
for param in sim_object._params.values():
    is_vector = isinstance(param, m5.params.VectorParamDesc)
    is_simobj = issubclass(param.ptype, m5.SimObject.SimObject)

    if not is_simobj and not is_vector:
        code('} else if (name == "${{param.name}}") {')
        code.indent()
        param.ptype.cxx_ini_parse(code,
            'value', 'this->%s' % param.name, 'ret =')
        code.dedent()
code.dedent()

code('''
    } else {
        ret = false;
    }

    return ret;
}

bool
${param_class}::setParamVector(const std::string &name,
    const std::vector<std::string> &values, const Flags flags)
{
    bool ret = true;

    if (false) {
''')

code.indent()
for param in sim_object._params.values():
    is_vector = isinstance(param, m5.params.VectorParamDesc)
    is_simobj = issubclass(param.ptype, m5.SimObject.SimObject)

    if not is_simobj and is_vector:
        code('} else if (name == "${{param.name}}") {')
        code.indent()
        code('${{param.name}}.clear();')
        code('for (auto i = values.begin(); '
            'ret && i != values.end(); i ++)')
        code('{')
        code.indent()
        code('${{param.ptype.cxx_type}} elem;')
        param.ptype.cxx_ini_parse(code,
            '*i', 'elem', 'ret =')
        code('if (ret)')
        code('    this->${{param.name}}.push_back(elem);')
        code.dedent()
        code('}')
        code.dedent()
code.dedent()

code('''
    } else {
        ret = false;
    }

    return ret;
}

bool
${param_class}::setPortConnectionCount(const std::string &name,
    unsigned int count)
{
    bool ret = true;

    if (false) {
''')

code.indent()
for port in sim_object._ports.values():
    code('} else if (name == "${{port.name}}") {')
    code('    this->port_${{port.name}}_connection_count = count;')
code.dedent()

code('''
    } else {
        ret = false;
    }

    return ret;
}

SimObject *
${param_class}::simObjectCreate()
{
''')

code.indent()
if hasattr(sim_object, 'abstract') and sim_object.abstract:
    code('return nullptr;')
else:
    code('return this->create();')
code.dedent()

code('''}

} // namespace gem5
''')

code.write(args.cxx_config_cc)
