blob: 799985a1f6e007866eb54e6d3cb9c6537ea76eab [file] [log] [blame]
/*****************************************************************************
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_handler.h -
Original Author: Alex Riesen, Synopsys, Inc.
see also sc_report.h
CHANGE LOG AT END OF FILE
*****************************************************************************/
#ifndef SC_REPORT_HANDLER_H
#define SC_REPORT_HANDLER_H
namespace sc_core {
// ----------------------------------------------------------------------------
// STRUCT : sc_msg_def
//
// Exception message definition structure
// ----------------------------------------------------------------------------
struct sc_msg_def
{
const char* msg_type;
sc_actions actions;
sc_actions sev_actions[SC_MAX_SEVERITY];
unsigned limit;
unsigned sev_limit[SC_MAX_SEVERITY];
unsigned limit_mask; // 0 - limit, 1..4 - sev_limit
unsigned call_count;
unsigned sev_call_count[SC_MAX_SEVERITY];
char* msg_type_data;
int id; // backward compatibility with 2.0+
};
typedef void (* sc_report_handler_proc)(const sc_report&, const sc_actions &);
class sc_report;
extern bool sc_report_close_default_log();
class sc_report_handler
{
public:
static void report(sc_severity,
const char* msg_type,
const char* msg,
const char* file,
int line);
static void report( sc_severity,
const char* msg_type,
const char* msg,
int verbosity,
const char* file,
int line );
static sc_actions set_actions(sc_severity,
sc_actions = SC_UNSPECIFIED);
static sc_actions set_actions(const char * msg_type,
sc_actions = SC_UNSPECIFIED);
static sc_actions set_actions(const char * msg_type,
sc_severity,
sc_actions = SC_UNSPECIFIED);
static int stop_after(sc_severity, int limit = -1);
static int stop_after(const char* msg_type, int limit = -1);
static int stop_after(const char* msg_type, sc_severity, int limit = -1);
static sc_actions suppress(sc_actions);
static sc_actions suppress();
static sc_actions force(sc_actions);
static sc_actions force();
static int get_count(sc_severity severity_);
static int get_count(const char* msg_type_);
static int get_count(const char* msg_type_, sc_severity severity_);
static int get_verbosity_level();
static int set_verbosity_level( int level );
static void initialize(); // just reset counters
static void release(); // initialize() needed for reports after it
static sc_report_handler_proc set_handler(sc_report_handler_proc);
static sc_report_handler_proc get_handler();
// use set_handler(NULL); to restore default handler
static void default_handler(const sc_report&, const sc_actions&);
static sc_actions get_new_action_id();
static sc_report* get_cached_report();
static void clear_cached_report();
// if filename is NULL, the previous log file name will be removed.
// The provider of a report_handler supposed to handle this.
// Return false if filename is not NULL and filename is already set.
static bool set_log_file_name(const char* filename);
static const char* get_log_file_name();
public: // private, actually
struct msg_def_items
{
sc_msg_def* md; // have to point to sc_msg_def-s
int count; // set to number of items in md[]
bool allocated; // used internally, previous value ignored
msg_def_items* next; // used internally, previous value ignored
};
static void add_static_msg_types(msg_def_items *);
static sc_msg_def* add_msg_type(const char * msg_type);
protected:
static void cache_report(const sc_report&);
static sc_actions execute(sc_msg_def*, sc_severity);
static sc_actions suppress_mask;
static sc_actions force_mask;
static sc_actions sev_actions[SC_MAX_SEVERITY];
static unsigned sev_limit[SC_MAX_SEVERITY];
static unsigned sev_call_count[SC_MAX_SEVERITY];
static sc_report* last_global_report;
static sc_actions available_actions;
static char* log_file_name;
static int verbosity_level;
static msg_def_items* messages;
static msg_def_items msg_terminator;
static sc_report_handler_proc handler;
static sc_msg_def* mdlookup(const char* msg_type);
private: // backward compatibility with 2.0+
friend class sc_report;
static sc_msg_def* mdlookup(int id);
public:
static void report(sc_severity,
int id,
const char* add_msg,
const char* file,
int line);
};
} // namespace sc_core
// $Log: sc_report_handler.h,v $
// Revision 1.5 2011/08/26 20:46:19 acg
// Andy Goodrich: moved the modification log to the end of the file to
// eliminate source line number skew when check-ins are done.
//
// Revision 1.4 2011/03/23 16:16:49 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.3 2006/01/13 18:53:11 acg
// Andy Goodrich: Added $Log command so that CVS comments are reproduced in
// the source.
//
#endif
// Taf!