sc_report_handler.cpp

来自「system C源码 一种替代verilog的语言」· C++ 代码 · 共 708 行 · 第 1/2 页

CPP
708
字号
    {	for ( int i = 0; i < items->count; ++i )	    if ( items->md[i].msg_type == items->md[i].msg_type_data )		free(items->md[i].msg_type_data);	msg_def_items * prev = items;	items = items->next;	if ( prev->allocated )	{	    delete [] prev->md;	    delete prev;	}	else	{	    prev->next = newitems;	    newitems = prev;	}    }    messages = newitems;}sc_msg_def * sc_report_handler::add_msg_type(const char * msg_type_){    sc_msg_def * md = mdlookup(msg_type_);    if ( md )	return md;    msg_def_items * items = new msg_def_items;    if ( !items )	return 0;    items->count = 1;    items->md = new sc_msg_def[items->count];    if ( !items->md )    {	delete items;	return 0;    }    memset(items->md, 0, sizeof(sc_msg_def) * items->count);    items->md->msg_type_data = strdup(msg_type_);    items->md->id = -1; // backward compatibility with 2.0+    if ( !items->md->msg_type_data )    {	delete items->md;	delete items;	return 0;    }    items->md->msg_type = items->md->msg_type_data;    add_static_msg_types(items);    items->allocated = true;    return items->md;}void sc_report_handler::add_static_msg_types(msg_def_items * items){    items->allocated = false;    items->next = messages;    messages = items;}sc_actions sc_report_handler::set_actions(sc_severity severity_,					  sc_actions actions_){    sc_actions old = sev_actions[severity_];    sev_actions[severity_] = actions_;    return old;}sc_actions sc_report_handler::set_actions(const char * msg_type_,					  sc_actions actions_){    sc_msg_def * md = mdlookup(msg_type_);    if ( !md )	md = add_msg_type(msg_type_);    sc_actions old = md->actions;    md->actions = actions_;    return old;}sc_actions sc_report_handler::set_actions(const char * msg_type_,					  sc_severity severity_,					  sc_actions actions_){    sc_msg_def * md = mdlookup(msg_type_);    if ( !md )	md = add_msg_type(msg_type_);    sc_actions old = md->sev_actions[severity_];    md->sev_actions[severity_] = actions_;    return old;}int sc_report_handler::stop_after(sc_severity severity_, int limit){    int old = sev_limit[severity_];    sev_limit[severity_] = limit < 0 ? UINT_MAX: limit;    return old;}int sc_report_handler::stop_after(const char * msg_type_, int limit){    sc_msg_def * md = mdlookup(msg_type_);    if ( !md )	md = add_msg_type(msg_type_);    int old = md->limit_mask & 1 ? md->limit: UINT_MAX;    if ( limit < 0 )	md->limit_mask &= ~1;    else    {	md->limit_mask |= 1;	md->limit = limit;    }    return old;}int sc_report_handler::stop_after(const char * msg_type_,				  sc_severity severity_,				  int limit){    sc_msg_def * md = mdlookup(msg_type_);    if ( !md )	md = add_msg_type(msg_type_);    int mask = 1 << (severity_ + 1);    int old = md->limit_mask & mask ?  md->sev_limit[severity_]: UINT_MAX;    if ( limit < 0 )	md->limit_mask &= ~mask;    else    {	md->limit_mask |= mask;	md->sev_limit[severity_] = limit;    }    return old;}sc_actions sc_report_handler::suppress(sc_actions mask){    sc_actions old = suppress_mask;    suppress_mask = mask;    return old;}sc_actions sc_report_handler::suppress(){    return suppress(0);}sc_actions sc_report_handler::force(sc_actions mask){    sc_actions old = force_mask;    force_mask = mask;    return old;}sc_actions sc_report_handler::force(){    return force(0);}void sc_report_handler::set_handler(sc_report_handler_proc handler_){    handler = handler_ ? handler_: &sc_report_handler::default_handler;}sc_report* sc_report_handler::get_cached_report(){    sc_process_b * proc = sc_get_current_process_b();    if ( proc )	return proc->get_last_report();    return last_global_report;}void sc_report_handler::clear_cached_report(){    sc_process_b * proc = sc_get_current_process_b();    if ( proc )	proc->set_last_report(0);    else    {	if ( last_global_report )	    delete last_global_report;	last_global_report = 0;    }}sc_actions sc_report_handler::get_new_action_id(){    for ( sc_actions p = 1; p; p <<= 1 )    {	if ( !(p & available_actions) ) // free	{	    available_actions |= p;	    return p;	}    }    return SC_UNSPECIFIED;}bool sc_report_handler::set_log_file_name(const char* name_){    if ( !name_ )    {	free(log_file_name);	log_file_name = 0;	return false;    }    if ( log_file_name )	return false;    log_file_name = strdup(name_);    return true;}const char * sc_report_handler::get_log_file_name(){    return log_file_name;}void sc_report_handler::cache_report(const sc_report& rep){    sc_process_b * proc = sc_get_current_process_b();    if ( proc )	proc->set_last_report(new sc_report(rep));    else    {	if ( last_global_report )	    delete last_global_report;	last_global_report = new sc_report(rep);    }}//// backward compatibility with 2.0+//sc_msg_def * sc_report_handler::mdlookup(int id){    for ( msg_def_items * item = messages; item; item = item->next )    {	for ( int i = 0; i < item->count; ++i )	    if ( id == item->md[i].id )		return item->md + i;    }    return 0;}//// CLASS: sc_report_handler// static variables//sc_actions sc_report_handler::suppress_mask = 0;sc_actions sc_report_handler::force_mask = 0;sc_actions sc_report_handler::sev_actions[SC_MAX_SEVERITY] ={    /* info  */ SC_DEFAULT_INFO_ACTIONS,    /* warn  */ SC_DEFAULT_WARNING_ACTIONS,    /* error */ SC_DEFAULT_ERROR_ACTIONS,    /* fatal */ SC_DEFAULT_FATAL_ACTIONS};// Note that SC_FATAL has a limit of 1 by defaultsc_actions sc_report_handler::sev_limit[SC_MAX_SEVERITY] ={    UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX};sc_actions sc_report_handler::sev_call_count[SC_MAX_SEVERITY] = { 0, 0, 0, 0 };sc_report* sc_report_handler::last_global_report = NULL;sc_actions sc_report_handler::available_actions =    SC_DO_NOTHING |    SC_THROW |    SC_LOG |    SC_DISPLAY |    SC_CACHE_REPORT |    SC_INTERRUPT |    SC_STOP |    SC_ABORT;sc_report_handler_proc sc_report_handler::handler =    &sc_report_handler::default_handler;char * sc_report_handler::log_file_name = 0;sc_report_handler::msg_def_items * sc_report_handler::messages =    &sc_report_handler::msg_terminator;//// predefined messages//const char SC_ID_REGISTER_ID_FAILED_[] = "register_id failed";const char SC_ID_UNKNOWN_ERROR_[]      = "unknown error";const char SC_ID_WITHOUT_MESSAGE_[]    = "";const char SC_ID_NOT_IMPLEMENTED_[]    = "not implemented";const char SC_ID_INTERNAL_ERROR_[]     = "internal error";const char SC_ID_ASSERTION_FAILED_[]   = "assertion failed";const char SC_ID_OUT_OF_BOUNDS_[]      = "out of bounds";#define DEFINE_MSG(id,n)                                                     \    {                                                                        \	(id),                                                                \	0u, {0u}, /* actions */                                              \	0u, {0u}, 0u, /* limits */                                           \	0u, {0u}, NULL, /* call counters */                                  \	n                                                                    \    }static sc_msg_def default_msgs[] = {    DEFINE_MSG(SC_ID_REGISTER_ID_FAILED_, 800),    DEFINE_MSG(SC_ID_UNKNOWN_ERROR_, 0),    DEFINE_MSG(SC_ID_WITHOUT_MESSAGE_, 1),    DEFINE_MSG(SC_ID_NOT_IMPLEMENTED_, 2),    DEFINE_MSG(SC_ID_INTERNAL_ERROR_, 3),    DEFINE_MSG(SC_ID_ASSERTION_FAILED_, 4),    DEFINE_MSG(SC_ID_OUT_OF_BOUNDS_, 5)};sc_report_handler::msg_def_items sc_report_handler::msg_terminator ={    default_msgs,    sizeof(default_msgs)/sizeof(*default_msgs),    false,    NULL};} // namespace sc_core// Taf!

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?