/*****************************************************************************

  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
  more contributor license agreements.  See the NOTICE file distributed
  with this work for additional information regarding copyright ownership.
  Accellera licenses this file to you under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with the
  License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  implied.  See the License for the specific language governing
  permissions and limitations under the License.

 *****************************************************************************/

/*****************************************************************************

  sc_value_base.cpp -- Base class for all SystemC data values.

  Original Author: Andy Goodrich, Forte Design Systems

 *****************************************************************************/

/*****************************************************************************

  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
  changes you are making here.

      Name, Affiliation, Date:
  Description of Modification:

 *****************************************************************************/


// $Log: sc_value_base.cpp,v $
// Revision 1.2  2011/08/15 16:43:24  acg
//  Torsten Maehne: changes to remove unused argument warnings.
//
// Revision 1.1.1.1  2006/12/15 20:20:05  acg
// SystemC 2.3
//
// Revision 1.3  2006/01/13 18:54:01  acg
// Andy Goodrich: added $Log command so that CVS comments are reproduced in
// the source.
//

#include <cctype>
#include <cstdio>
#include <cstdlib>

#include "systemc/ext/dt/misc/sc_value_base.hh"
#include "systemc/ext/utils/sc_report_handler.hh"

namespace sc_dt
{

void
sc_value_base::concat_clear_data(bool /* to_ones */)
{
    static const char error_message[] =
        "concat_clear_data method not supported by this type";
    SC_REPORT_ERROR("operation failed", error_message);
}

bool
sc_value_base::concat_get_ctrl(sc_digit * /*dst_p*/, int /*low_i*/) const
{
    static const char error_message[] =
        "concat_get_ctrl method not supported by this type";
    SC_REPORT_ERROR("operation failed", error_message);
    return false;
}

bool
sc_value_base::concat_get_data(sc_digit * /*dst_p*/, int /*low_i*/) const
{
    static const char error_message[] =
        "concat_get_data method not supported by this type";
    SC_REPORT_ERROR("operation failed", error_message);
    return false;
}

sc_dt::uint64
sc_value_base::concat_get_uint64() const
{
    static const char error_message[] =
        "concat_get_uint64 method not supported by this type";
    SC_REPORT_ERROR("operation failed", error_message);
    return 0;
}

int
sc_value_base::concat_length(bool * /*xz_present_p*/) const
{
    static const char error_message[] =
        "concat_length method not supported by this type";
    SC_REPORT_ERROR("operation failed", error_message);
    return 0;
}

void
sc_value_base::concat_set(int64 /*src*/, int /*low_i*/)
{
    static const char error_message[] =
        "concat_set(int64) method not supported by this type";
    SC_REPORT_ERROR("operation failed", error_message);
}

void
sc_value_base::concat_set(const sc_signed &/*src*/, int /*low_i*/)
{
    static const char error_message[] =
        "concat_set(sc_signed) method not supported by this type";
    SC_REPORT_ERROR("operation failed", error_message);
}

void
sc_value_base::concat_set(const sc_unsigned &/*src*/, int /*low_i*/)
{
    static const char error_message[] =
        "concat_set(sc_unsigned) method not supported by this type";
    SC_REPORT_ERROR("operation failed", error_message);
}

void
sc_value_base::concat_set(uint64 /*src*/, int /*low_i*/)
{
    static const char error_message[] =
        "concat_set(uint64) method not supported by this type";
    SC_REPORT_ERROR("operation failed", error_message);
}

} // namespace sc_dt
