/*
 * 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 "systemc/ext/channel/messages.hh"
#include "systemc/utils/report.hh"

namespace sc_core
{

const char SC_ID_PORT_OUTSIDE_MODULE_[] = "port specified outside of module";
const char SC_ID_CLOCK_PERIOD_ZERO_[] = "sc_clock period is zero";
const char SC_ID_CLOCK_HIGH_TIME_ZERO_[] = "sc_clock high time is zero";
const char SC_ID_CLOCK_LOW_TIME_ZERO_[] = "sc_clock low time is zero";
const char SC_ID_MORE_THAN_ONE_FIFO_READER_[] =
    "sc_fifo<T> cannot have more than one reader";
const char SC_ID_MORE_THAN_ONE_FIFO_WRITER_[] =
    "sc_fifo<T> cannot have more than one writer";
const char SC_ID_INVALID_FIFO_SIZE_[] =
    "sc_fifo<T> must have a size of at least 1";
const char SC_ID_BIND_IF_TO_PORT_[] = "bind interface to port failed";
const char SC_ID_BIND_PORT_TO_PORT_[] = "bind parent port to port failed";
const char SC_ID_COMPLETE_BINDING_[] = "complete binding failed";
const char SC_ID_INSERT_PORT_[] = "insert port failed";
const char SC_ID_REMOVE_PORT_[] = "remove port failed";
const char SC_ID_GET_IF_[] = "get interface failed";
const char SC_ID_INSERT_PRIM_CHANNEL_[] = "insert primitive channel failed";
const char SC_ID_REMOVE_PRIM_CHANNEL_[] = "remove primitive channel failed";
const char SC_ID_MORE_THAN_ONE_SIGNAL_DRIVER_[] =
    "sc_signal<T> cannot have more than one driver";
const char SC_ID_NO_DEFAULT_EVENT_[] = "channel doesn't have a default event";
const char SC_ID_RESOLVED_PORT_NOT_BOUND_[] =
    "resolved port not bound to resolved signal";
const char SC_ID_FIND_EVENT_[] = "find event failed";
const char SC_ID_INVALID_SEMAPHORE_VALUE_[] =
    "sc_semaphore requires an initial value >= 0";
const char SC_ID_SC_EXPORT_HAS_NO_INTERFACE_[] =
    "sc_export instance has no interface";
const char SC_ID_INSERT_EXPORT_[] = "insert sc_export failed";
const char SC_ID_EXPORT_OUTSIDE_MODULE_[] =
    "sc_export specified outside of module";
const char SC_ID_SC_EXPORT_NOT_REGISTERED_[] =
    "remove sc_export failed, sc_export not registered";
const char SC_ID_SC_EXPORT_NOT_BOUND_AFTER_CONSTRUCTION_[] =
    "sc_export instance not bound to interface at end of construction";
const char SC_ID_ATTEMPT_TO_WRITE_TO_CLOCK_[] =
    "attempt to write the value of an sc_clock instance";
const char SC_ID_SC_EXPORT_ALREADY_BOUND_[] =
    "sc_export instance already bound";
const char SC_ID_OPERATION_ON_NON_SPECIALIZED_SIGNAL_[] =
    "attempted specalized signal operation on non-specialized signal";
const char SC_ID_ATTEMPT_TO_BIND_CLOCK_TO_OUTPUT_[] =
    "attempted to bind sc_clock instance to sc_inout or sc_out";
const char SC_ID_NO_ASYNC_UPDATE_[] =
    "this build has no asynchronous update support";

namespace
{

sc_gem5::DefaultReportMessages predefinedMessages{
    {100, SC_ID_PORT_OUTSIDE_MODULE_},
    {101, SC_ID_CLOCK_PERIOD_ZERO_},
    {102, SC_ID_CLOCK_HIGH_TIME_ZERO_},
    {103, SC_ID_CLOCK_LOW_TIME_ZERO_},
    {104, SC_ID_MORE_THAN_ONE_FIFO_READER_},
    {105, SC_ID_MORE_THAN_ONE_FIFO_WRITER_},
    {106, SC_ID_INVALID_FIFO_SIZE_},
    {107, SC_ID_BIND_IF_TO_PORT_},
    {108, SC_ID_BIND_PORT_TO_PORT_},
    {109, SC_ID_COMPLETE_BINDING_},
    {110, SC_ID_INSERT_PORT_},
    {111, SC_ID_REMOVE_PORT_},
    {112, SC_ID_GET_IF_},
    {113, SC_ID_INSERT_PRIM_CHANNEL_},
    {114, SC_ID_REMOVE_PRIM_CHANNEL_},
    {115, SC_ID_MORE_THAN_ONE_SIGNAL_DRIVER_},
    {116, SC_ID_NO_DEFAULT_EVENT_},
    {117, SC_ID_RESOLVED_PORT_NOT_BOUND_},
    {118, SC_ID_FIND_EVENT_},
    {119, SC_ID_INVALID_SEMAPHORE_VALUE_},
    {120, SC_ID_SC_EXPORT_HAS_NO_INTERFACE_},
    {121, SC_ID_INSERT_EXPORT_},
    {122, SC_ID_EXPORT_OUTSIDE_MODULE_},
    {123, SC_ID_SC_EXPORT_NOT_REGISTERED_},
    {124, SC_ID_SC_EXPORT_NOT_BOUND_AFTER_CONSTRUCTION_},
    {125, SC_ID_ATTEMPT_TO_WRITE_TO_CLOCK_},
    {126, SC_ID_SC_EXPORT_ALREADY_BOUND_},
    {127, SC_ID_OPERATION_ON_NON_SPECIALIZED_SIGNAL_},
    {128, SC_ID_ATTEMPT_TO_BIND_CLOCK_TO_OUTPUT_},
    {129, SC_ID_NO_ASYNC_UPDATE_}
};

} // anonymous namespace

} // namespace sc_core
