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 + -
显示快捷键?