summaryrefslogtreecommitdiff
path: root/ext/systemc/src/sysc/utils/sc_report.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ext/systemc/src/sysc/utils/sc_report.cpp')
-rw-r--r--ext/systemc/src/sysc/utils/sc_report.cpp330
1 files changed, 330 insertions, 0 deletions
diff --git a/ext/systemc/src/sysc/utils/sc_report.cpp b/ext/systemc/src/sysc/utils/sc_report.cpp
new file mode 100644
index 000000000..378d45cde
--- /dev/null
+++ b/ext/systemc/src/sysc/utils/sc_report.cpp
@@ -0,0 +1,330 @@
+/*****************************************************************************
+
+ 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_report.cpp -- Run-time logging and reporting facilities
+
+ Interface design by SystemC Verification Working Group.
+ Implementation by Alex Riesen, Synopsys Inc.
+ Original implementation by Martin Janssen, Synopsys Inc.
+ Reference implementation by Cadence Design Systems, Inc., 2002-09-23:
+ Norris Ip, Dean Shea, John Rose, Jasvinder Singh, William Paulsen,
+ John Pierce, Rachida Kebichi, Ted Elkind, David Bailey.
+
+ CHANGE LOG AT END OF FILE
+ *****************************************************************************/
+
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "sysc/kernel/sc_process.h"
+#include "sysc/kernel/sc_simcontext_int.h"
+#include "sysc/utils/sc_stop_here.h"
+#include "sysc/utils/sc_report.h"
+#include "sysc/utils/sc_utils_ids.h"
+#include <algorithm> // std::swap
+
+namespace sc_core {
+
+
+static void sc_deprecated_report_ids(const char* method)
+{
+ static bool warn_report_ids_deprecated=true;
+ if ( warn_report_ids_deprecated )
+ {
+ std::string message;
+ message = "integer report ids are deprecated, use string values: ";
+ message += method;
+ warn_report_ids_deprecated=false;
+ SC_REPORT_INFO(SC_ID_IEEE_1666_DEPRECATION_, message.c_str());
+ }
+}
+
+static char empty_str[] = "";
+static inline char * empty_dup(const char * p)
+{
+ if ( p && *p )
+ {
+ char* result;
+ result = (char*)malloc(strlen(p)+1);
+ strcpy(result, p);
+ return result;
+ }
+ else
+ {
+ return empty_str;
+ }
+}
+
+sc_report::sc_report()
+: severity(SC_INFO),
+ md(0),
+ msg(empty_dup(0)),
+ file(empty_dup(0)),
+ line(0),
+ timestamp(new sc_time(sc_time_stamp())),
+ process(0),
+ m_verbosity_level(SC_MEDIUM),
+ m_what(empty_dup(0))
+{
+}
+
+sc_report::sc_report(sc_severity severity_,
+ const sc_msg_def* md_,
+ const char* msg_,
+ const char* file_,
+ int line_,
+ int verbosity_level)
+: severity(severity_),
+ md(md_),
+ msg(empty_dup(msg_)),
+ file(empty_dup(file_)),
+ line(line_),
+ timestamp(new sc_time(sc_time_stamp())),
+ process(sc_get_current_process_b()),
+ m_verbosity_level(verbosity_level),
+ m_what( empty_dup( sc_report_compose_message(*this).c_str() ) )
+{
+}
+
+sc_report::sc_report(const sc_report& other)
+: std::exception(other),
+ severity(other.severity),
+ md(other.md),
+ msg(empty_dup(other.msg)),
+ file(empty_dup(other.file)),
+ line(other.line),
+ timestamp(new sc_time(*other.timestamp)),
+ process(other.process),
+ m_verbosity_level(other.m_verbosity_level),
+ m_what(empty_dup(other.m_what))
+{
+}
+
+sc_report & sc_report::operator=(const sc_report& other)
+{
+ sc_report copy(other);
+ swap( copy );
+ return *this;
+}
+
+void
+sc_report::swap( sc_report & that )
+{
+ using std::swap;
+ swap( severity, that.severity );
+ swap( md, that.md );
+ swap( msg, that.msg );
+ swap( file, that.file );
+ swap( line, that.line );
+ swap( timestamp, that.timestamp );
+ swap( process, that.process );
+ swap( m_verbosity_level, that.m_verbosity_level );
+ swap( m_what, that.m_what );
+}
+
+sc_report::~sc_report() throw()
+{
+ if ( file != empty_str )
+ free(file);
+ if ( msg != empty_str )
+ free(msg);
+ delete timestamp;
+ if ( m_what != empty_str )
+ free(m_what);
+}
+
+const char * sc_report::get_msg_type() const
+{
+ return md->msg_type;
+}
+
+//
+// backward compatibility with 2.0+
+//
+
+static bool warnings_are_errors = false;
+static const char unknown_id[] = "unknown id";
+
+void sc_report_handler::report(sc_severity severity_,
+ int id_,
+ const char* msg_,
+ const char* file_,
+ int line_ )
+{
+ sc_msg_def * md = sc_report_handler::mdlookup(id_);
+
+ if ( !md )
+ {
+ md = sc_report_handler::add_msg_type(unknown_id);
+ md->id = id_;
+ }
+
+ if ( severity_ == SC_WARNING && warnings_are_errors )
+ severity_ = SC_ERROR;
+
+ sc_actions actions = execute(md, severity_);
+ sc_report rep(severity_, md, msg_, file_, line_);
+
+ if ( actions & SC_CACHE_REPORT )
+ cache_report(rep);
+
+ if ( severity_ == SC_ERROR )
+ actions |= SC_THROW;
+ else if ( severity_ == SC_FATAL )
+ actions |= SC_ABORT;
+
+ handler(rep, actions);
+}
+
+void sc_report::register_id( int id, const char* msg )
+{
+ sc_deprecated_report_ids("sc_report::register_id()");
+ if( id < 0 ) {
+ SC_REPORT_ERROR( SC_ID_REGISTER_ID_FAILED_,
+ "invalid report id" );
+ }
+ if( msg == 0 ) {
+ SC_REPORT_ERROR( SC_ID_REGISTER_ID_FAILED_,
+ "invalid report message" );
+ }
+ sc_msg_def * md = sc_report_handler::mdlookup(id);
+
+ if ( !md )
+ md = sc_report_handler::add_msg_type(msg);
+
+ if ( !md ) {
+ SC_REPORT_ERROR( SC_ID_REGISTER_ID_FAILED_,
+ "report_map insertion error" );
+ }
+
+ if( md->id != -1 ) {
+ if( strcmp( msg, md->msg_type ) != 0 ) {
+ SC_REPORT_ERROR( SC_ID_REGISTER_ID_FAILED_,
+ "report id already exists" );
+ }
+ return;
+ }
+ md->id = id;
+}
+
+const char* sc_report::get_message( int id )
+{
+ sc_deprecated_report_ids("sc_report::get_message()");
+ sc_msg_def* md = sc_report_handler::mdlookup(id);
+
+ return md ? md->msg_type: unknown_id;
+}
+
+bool sc_report::is_suppressed( int id )
+{
+ sc_deprecated_report_ids("sc_report::is_suppressed()");
+ sc_msg_def* md = sc_report_handler::mdlookup(id);
+
+ return md ? md->actions == SC_DO_NOTHING: false; // only do-nothing set
+}
+
+void sc_report::suppress_id(int id_, bool suppress)
+{
+ sc_deprecated_report_ids("sc_report::suppress_id()");
+ sc_msg_def* md = sc_report_handler::mdlookup(id_);
+
+ if ( md )
+ md->actions = suppress ? SC_DO_NOTHING: SC_UNSPECIFIED;
+}
+
+void sc_report::suppress_infos(bool suppress)
+{
+ sc_deprecated_report_ids("sc_report::supress_infos");
+ sc_report_handler::sev_actions[SC_INFO] =
+ suppress ? SC_DO_NOTHING: SC_DEFAULT_INFO_ACTIONS;
+}
+
+void sc_report::suppress_warnings(bool suppress)
+{
+ sc_deprecated_report_ids("sc_report::suppress_warnings");
+ sc_report_handler::sev_actions[SC_WARNING] =
+ suppress ? SC_DO_NOTHING: SC_DEFAULT_WARNING_ACTIONS;
+}
+
+void sc_report::make_warnings_errors(bool flag)
+{
+ sc_deprecated_report_ids("sc_report::make_warnings_errors");
+ warnings_are_errors = flag;
+}
+
+int sc_report::get_id() const
+{
+ return md->id;
+}
+
+} // namespace sc_core
+
+// $Log: sc_report.cpp,v $
+// Revision 1.8 2011/08/29 18:04:32 acg
+// Philipp A. Hartmann: miscellaneous clean ups.
+//
+// Revision 1.7 2011/08/26 20:43:01 acg
+// Andy Goodrich:
+// (1) Replaced strdup with new and strcpy to eliminate issue with the
+// Greenhills compiler.
+// (2) Moved modification log to the end of the file to eliminate line
+// skew when check-ins are done.
+//
+// Revision 1.6 2011/08/24 22:05:56 acg
+// Torsten Maehne: initialization changes to remove warnings.
+//
+// Revision 1.5 2011/05/05 17:46:04 acg
+// Philip A. Hartmann: changes in "swap" support.
+//
+// Revision 1.4 2011/03/23 16:16:48 acg
+// Andy Goodrich: finish message verbosity support.
+//
+// Revision 1.3 2011/02/18 20:38:44 acg
+// Andy Goodrich: Updated Copyright notice.
+//
+// Revision 1.2 2011/02/01 23:02:05 acg
+// Andy Goodrich: IEEE 1666 2011 changes.
+//
+// Revision 1.1.1.1 2006/12/15 20:20:06 acg
+// SystemC 2.3
+//
+// Revision 1.7 2006/03/21 00:00:37 acg
+// Andy Goodrich: changed name of sc_get_current_process_base() to be
+// sc_get_current_process_b() since its returning an sc_process_b instance.
+//
+// Revision 1.6 2006/01/25 00:31:27 acg
+// Andy Goodrich: Changed over to use a standard message id of
+// SC_ID_IEEE_1666_DEPRECATION for all deprecation messages.
+//
+// Revision 1.5 2006/01/24 22:02:30 acg
+// Andy Goodrich: switch deprecated features warnings to use a single message
+// id, SC_ID_IEEE_1666_DEPRECATION_.
+//
+// Revision 1.4 2006/01/24 20:53:41 acg
+// Andy Goodrich: added warnings indicating that use of integer ids in reports
+// is deprecated. Added tracing/sc_trace_ids.h to message list.
+//
+// Revision 1.3 2006/01/13 18:53:11 acg
+// Andy Goodrich: Added $Log command so that CVS comments are reproduced in
+// the source.
+
+// taf