| /***************************************************************************** |
| |
| 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 |