/*
 * Copyright 2018 Google, Inc.
 *
 * 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.
 *
 * Authors: Gabe Black
 */

#include <memory>
#include <vector>

#include "base/logging.hh"
#include "systemc/ext/core/sc_module.hh"

namespace sc_core
{

sc_bind_proxy::sc_bind_proxy(const sc_interface &interface)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

sc_bind_proxy::sc_bind_proxy(const sc_port_base &port)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

const sc_bind_proxy SC_BIND_PROXY_NUL(*(const sc_port_base *)nullptr);

sc_module::~sc_module()
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

const char *
sc_module::kind() const
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
    return "";
}

const sc_bind_proxy SC_BIND_PROXY_NIL(*(const sc_port_base *)nullptr);

void
sc_module::operator () (const sc_bind_proxy &p001,
                        const sc_bind_proxy &p002,
                        const sc_bind_proxy &p003,
                        const sc_bind_proxy &p004,
                        const sc_bind_proxy &p005,
                        const sc_bind_proxy &p006,
                        const sc_bind_proxy &p007,
                        const sc_bind_proxy &p008,
                        const sc_bind_proxy &p009,
                        const sc_bind_proxy &p010,
                        const sc_bind_proxy &p011,
                        const sc_bind_proxy &p012,
                        const sc_bind_proxy &p013,
                        const sc_bind_proxy &p014,
                        const sc_bind_proxy &p015,
                        const sc_bind_proxy &p016,
                        const sc_bind_proxy &p017,
                        const sc_bind_proxy &p018,
                        const sc_bind_proxy &p019,
                        const sc_bind_proxy &p020,
                        const sc_bind_proxy &p021,
                        const sc_bind_proxy &p022,
                        const sc_bind_proxy &p023,
                        const sc_bind_proxy &p024,
                        const sc_bind_proxy &p025,
                        const sc_bind_proxy &p026,
                        const sc_bind_proxy &p027,
                        const sc_bind_proxy &p028,
                        const sc_bind_proxy &p029,
                        const sc_bind_proxy &p030,
                        const sc_bind_proxy &p031,
                        const sc_bind_proxy &p032,
                        const sc_bind_proxy &p033,
                        const sc_bind_proxy &p034,
                        const sc_bind_proxy &p035,
                        const sc_bind_proxy &p036,
                        const sc_bind_proxy &p037,
                        const sc_bind_proxy &p038,
                        const sc_bind_proxy &p039,
                        const sc_bind_proxy &p040,
                        const sc_bind_proxy &p041,
                        const sc_bind_proxy &p042,
                        const sc_bind_proxy &p043,
                        const sc_bind_proxy &p044,
                        const sc_bind_proxy &p045,
                        const sc_bind_proxy &p046,
                        const sc_bind_proxy &p047,
                        const sc_bind_proxy &p048,
                        const sc_bind_proxy &p049,
                        const sc_bind_proxy &p050,
                        const sc_bind_proxy &p051,
                        const sc_bind_proxy &p052,
                        const sc_bind_proxy &p053,
                        const sc_bind_proxy &p054,
                        const sc_bind_proxy &p055,
                        const sc_bind_proxy &p056,
                        const sc_bind_proxy &p057,
                        const sc_bind_proxy &p058,
                        const sc_bind_proxy &p059,
                        const sc_bind_proxy &p060,
                        const sc_bind_proxy &p061,
                        const sc_bind_proxy &p062,
                        const sc_bind_proxy &p063,
                        const sc_bind_proxy &p064)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

const std::vector<sc_object *> &
sc_module::get_child_objects() const
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
    return *(const std::vector<sc_object *> *)nullptr;
}

const std::vector<sc_event *> &
sc_module::get_child_events() const
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
    return *(const std::vector<sc_event *> *)nullptr;
}

sc_module::sc_module(const sc_module_name &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

sc_module::sc_module()
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

sc_module::sc_module(const char *)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

sc_module::sc_module(const std::string &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::reset_signal_is(const sc_in<bool> &, bool)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::reset_signal_is(const sc_inout<bool> &, bool)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::reset_signal_is(const sc_out<bool> &, bool)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::reset_signal_is(const sc_signal_in_if<bool> &, bool)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}


void
sc_module::async_reset_signal_is(const sc_in<bool> &, bool)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::async_reset_signal_is(const sc_inout<bool> &, bool)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::async_reset_signal_is(const sc_out<bool> &, bool)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::async_reset_signal_is(const sc_signal_in_if<bool> &, bool)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}


void
sc_module::dont_initialize()
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::set_stack_size(size_t)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}


void
sc_module::next_trigger()
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::next_trigger(const sc_event &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::next_trigger(const sc_event_or_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::next_trigger(const sc_event_and_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::next_trigger(const sc_time &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::next_trigger(double, sc_time_unit)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::next_trigger(const sc_time &, const sc_event &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::next_trigger(double, sc_time_unit, const sc_event &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::next_trigger(const sc_time &, const sc_event_or_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::next_trigger(double, sc_time_unit, const sc_event_or_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::next_trigger(const sc_time &, const sc_event_and_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::next_trigger(double, sc_time_unit, const sc_event_and_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}


void
sc_module::wait()
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::wait(int)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::wait(const sc_event &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::wait(const sc_event_or_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::wait(const sc_event_and_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::wait(const sc_time &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::wait(double, sc_time_unit)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::wait(const sc_time &, const sc_event &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::wait(double, sc_time_unit, const sc_event &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::wait(const sc_time &, const sc_event_or_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::wait(double, sc_time_unit, const sc_event_or_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::wait(const sc_time &, const sc_event_and_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::wait(double, sc_time_unit, const sc_event_and_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}


void
sc_module::halt()
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::at_posedge(const sc_signal_in_if<bool> &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::at_posedge(const sc_signal_in_if<sc_dt::sc_logic> &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::at_negedge(const sc_signal_in_if<bool> &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
sc_module::at_negedge(const sc_signal_in_if<sc_dt::sc_logic> &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}


void
next_trigger()
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
next_trigger(const sc_event &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
next_trigger(const sc_event_or_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
next_trigger(const sc_event_and_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
next_trigger(const sc_time &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
next_trigger(double, sc_time_unit)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
next_trigger(const sc_time &, const sc_event &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
next_trigger(double, sc_time_unit, const sc_event &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
next_trigger(const sc_time &, const sc_event_or_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
next_trigger(double, sc_time_unit, const sc_event_or_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
next_trigger(const sc_time &, const sc_event_and_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
next_trigger(double, sc_time_unit, const sc_event_and_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}


void
wait()
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
wait(int)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
wait(const sc_event &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
wait(const sc_event_or_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
wait(const sc_event_and_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
wait(const sc_time &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
wait(double, sc_time_unit)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
wait(const sc_time &, const sc_event &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
wait(double, sc_time_unit, const sc_event &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
wait(const sc_time &, const sc_event_or_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
wait(double, sc_time_unit, const sc_event_or_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
wait(const sc_time &, const sc_event_and_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
wait(double, sc_time_unit, const sc_event_and_list &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
halt()
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
at_posedge(const sc_signal_in_if<bool> &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
at_posedge(const sc_signal_in_if<sc_dt::sc_logic> &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
at_negedge(const sc_signal_in_if<bool> &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

void
at_negedge(const sc_signal_in_if<sc_dt::sc_logic> &)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
}

const char *
sc_gen_unique_name(const char *)
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
    return "";
}

bool
sc_start_of_simulation_invoked()
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
    return false;
}

bool
sc_end_of_simulation_invoked()
{
    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
    return false;
}

sc_module *
sc_module_sc_new(sc_module *mod)
{
    static std::vector<std::unique_ptr<sc_module> > modules;
    modules.emplace_back(mod);
    return mod;
}

} // namespace sc_core
