Source code for uvm.macros.uvm_message_defines

#//----------------------------------------------------------------------
#//   Copyright 2007-2011 Mentor Graphics Corporation
#//   Copyright 2007-2010 Cadence Design Systems, Inc.
#//   Copyright 2010 Synopsys, Inc.
#//   Copyright 2019 Tuomas Poikela (tpoikela)
#//   All Rights Reserved Worldwide
#//
#//   Licensed 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.
#//----------------------------------------------------------------------

from ..base.uvm_globals import (UVM_ERROR, UVM_FATAL, UVM_INFO, UVM_NONE, UVM_WARNING,
                                uvm_report_enabled, uvm_report_error, uvm_report_fatal,
                                uvm_report_info, uvm_report_warning)

import inspect
from inspect import getframeinfo, stack



UVM_REPORT_DISABLE_FILE = False
UVM_REPORT_DISABLE_LINE = False

UVM_LINE_WIDTH = 120
UVM_NUM_LINES = 120


def uvm_file():
    return "<TODO uvm_file>"


if UVM_REPORT_DISABLE_FILE:
[docs] def uvm_file(): return ""
def uvm_line(): return "<TODO uvm_line>" if UVM_REPORT_DISABLE_LINE:
[docs] def uvm_line(): return 0
#//------------------------------------------------------------------------------ #// #// Title: Report Macros #// #// This set of macros provides wrappers around the uvm_report_* <Reporting> #// functions. The macros serve two essential purposes: #// #// - To reduce the processing overhead associated with filtered out messages, #// a check is made against the report's verbosity setting and the action #// for the id/severity pair before any string formatting is performed. This #// affects only `uvm_info reports. #// #// - The `__FILE__ and `__LINE__ information is automatically provided to the #// underlying uvm_report_* call. Having the file and line number from where #// a report was issued aides in debug. You can disable display of file and #// line information in reports by defining UVM_REPORT_DISABLE_FILE_LINE on #// the command line. #// #// The macros also enforce a verbosity setting of UVM_NONE for warnings, errors #// and fatals so that they cannot be mistakenly turned off by setting the #// verbosity level too low (warning and errors can still be turned off by #// setting the actions appropriately). #// #// To use the macros, replace the previous call to uvm_report_* with the #// corresponding macro. #// #//| //Previous calls to uvm_report_* #//| uvm_report_info("MYINFO1", $sformatf("val: %0d", val), UVM_LOW); #//| uvm_report_warning("MYWARN1", "This is a warning"); #//| uvm_report_error("MYERR", "This is an error"); #//| uvm_report_fatal("MYFATAL", "A fatal error has occurred"); #// #// The above code is replaced by #// #//| //New calls to `uvm_* #//| `uvm_info("MYINFO1", $sformatf("val: %0d", val), UVM_LOW) #//| `uvm_warning("MYWARN1", "This is a warning") #//| `uvm_error("MYERR", "This is an error") #//| `uvm_fatal("MYFATAL", "A fatal error has occurred") #// #// Macros represent text substitutions, not statements, so they should not be #// terminated with semi-colons. #//---------------------------------------------------------------------------- #// Group: Basic Messaging Macros #//---------------------------------------------------------------------------- #// MACRO: `uvm_info #// #// Calls uvm_report_info if ~VERBOSITY~ is lower than the configured verbosity of #// the associated reporter. ~ID~ is given as the message tag and ~MSG~ is given as #// the message text. The file and line are also sent to the uvm_report_info call. #// #// |`uvm_info(ID, MSG, VERBOSITY)
[docs]def uvm_info(ID, MSG, VERBOSITY): if uvm_report_enabled(VERBOSITY, UVM_INFO, ID): caller = getframeinfo(stack()[1][0]) fname = caller.filename lineno = caller.lineno f_locals = inspect.currentframe().f_back.f_locals # type: ignore if 'self' in f_locals: parent_self = f_locals['self'] if hasattr(parent_self, 'uvm_report_info'): parent_self.uvm_report_info(ID, MSG, VERBOSITY, fname, lineno, "", 1) else: uvm_report_info(ID, MSG, VERBOSITY, fname, lineno, "", 1) else: uvm_report_info(ID, MSG, VERBOSITY, fname, lineno, "", 1)
#// MACRO: `uvm_warning #// #// Calls uvm_report_warning with a verbosity of UVM_NONE. The message cannot #// be turned off using the reporter's verbosity setting, but can be turned off #// by setting the action for the message. ~ID~ is given as the message tag and #// ~MSG~ is given as the message text. The file and line are also sent to the #// uvm_report_warning call. #// #// |`uvm_warning(ID, MSG)
[docs]def uvm_warning(ID, MSG): if uvm_report_enabled(UVM_NONE, UVM_WARNING,ID): caller = getframeinfo(stack()[1][0]) fname = caller.filename lineno = caller.lineno f_locals = inspect.currentframe().f_back.f_locals # type: ignore if 'self' in f_locals: parent_self = f_locals['self'] if hasattr(parent_self, 'uvm_report_warning'): parent_self.uvm_report_warning(ID, MSG, UVM_NONE, fname, lineno, "", 1) else: uvm_report_warning(ID, MSG, UVM_NONE, fname, lineno, "", 1) else: uvm_report_warning(ID, MSG, UVM_NONE, fname, lineno, "", 1)
#// MACRO: `uvm_error #// #// Calls uvm_report_error with a verbosity of UVM_NONE. The message cannot #// be turned off using the reporter's verbosity setting, but can be turned off #// by setting the action for the message. ~ID~ is given as the message tag and #// ~MSG~ is given as the message text. The file and line are also sent to the #// uvm_report_error call. #// #// |`uvm_error(ID, MSG)
[docs]def uvm_error(ID, MSG): if uvm_report_enabled(UVM_NONE, UVM_ERROR,ID): caller = getframeinfo(stack()[1][0]) fname = caller.filename lineno = caller.lineno f_locals = inspect.currentframe().f_back.f_locals # type: ignore if 'self' in f_locals: parent_self = f_locals['self'] if hasattr(parent_self, 'uvm_report_error'): parent_self.uvm_report_error(ID, MSG, UVM_NONE, fname, lineno, "", 1) else: uvm_report_error(ID, MSG, UVM_NONE, fname, lineno, "", 1) else: uvm_report_error(ID, MSG, UVM_NONE, fname, lineno, "", 1)
#// MACRO: `uvm_fatal #// #// Calls uvm_report_fatal with a verbosity of UVM_NONE. The message cannot #// be turned off using the reporter's verbosity setting, but can be turned off #// by setting the action for the message. ~ID~ is given as the message tag and #// ~MSG~ is given as the message text. The file and line are also sent to the #// uvm_report_fatal call. #// #// |`uvm_fatal(ID, MSG)
[docs]def uvm_fatal(ID, MSG): if uvm_report_enabled(UVM_NONE, UVM_FATAL,ID): caller = getframeinfo(stack()[1][0]) fname = caller.filename lineno = caller.lineno f_locals = inspect.currentframe().f_back.f_locals # type: ignore if 'self' in f_locals: parent_self = f_locals['self'] if hasattr(parent_self, 'uvm_report_fatal'): parent_self.uvm_report_fatal(ID, MSG, UVM_NONE, fname, lineno, "", 1) else: uvm_report_fatal(ID, MSG, UVM_NONE, fname, lineno, "", 1) else: uvm_report_fatal(ID, MSG, UVM_NONE, fname, lineno, "", 1)
#// MACRO: `uvm_info_context #// #//| `uvm_info_context(ID, MSG, VERBOSITY, RO) #// #// Operates identically to `uvm_info but requires that the #// context, or <uvm_report_object>, in which the message is printed be #// explicitly supplied as a macro argument.
[docs]def uvm_info_context(ID, MSG, VERBOSITY, RO): if RO.uvm_report_enabled(VERBOSITY, UVM_INFO, ID): caller = getframeinfo(stack()[1][0]) fname = caller.filename lineno = caller.lineno RO.uvm_report_info(ID, MSG, VERBOSITY, fname, lineno, "", 1)
#// MACRO: `uvm_warning_context #// #//| `uvm_warning_context(ID, MSG, RO) #// #// Operates identically to `uvm_warning but requires that the #// context, or <uvm_report_object>, in which the message is printed be #// explicitly supplied as a macro argument. # #`define uvm_warning_context(ID, MSG, RO) \ # begin \ # if (RO.uvm_report_enabled(UVM_NONE,UVM_WARNING,ID)) \ # RO.uvm_report_warning (ID, MSG, UVM_NONE, uvm_file(), uvm_line(), "", 1); \ # end #// MACRO: `uvm_error_context #// #//| `uvm_error_context(ID, MSG, RO) #// #// Operates identically to `uvm_error but requires that the #// context, or <uvm_report_object> in which the message is printed be #// explicitly supplied as a macro argument. # #`define uvm_error_context(ID, MSG, RO) \ # begin \ # if (RO.uvm_report_enabled(UVM_NONE,UVM_ERROR,ID)) \ # RO.uvm_report_error (ID, MSG, UVM_NONE, uvm_file(), uvm_line(), "", 1); \ # end
[docs]def uvm_error_context(ID, MSG, RO): if RO.uvm_report_enabled(UVM_NONE, UVM_ERROR, ID): caller = getframeinfo(stack()[1][0]) fname = caller.filename lineno = caller.lineno RO.uvm_report_error(ID, MSG, UVM_NONE, fname, lineno, "", 1)
#// MACRO: `uvm_fatal_context #// #//| `uvm_fatal_context(ID, MSG, RO) #// #// Operates identically to `uvm_fatal but requires that the #// context, or <uvm_report_object>, in which the message is printed be #// explicitly supplied as a macro argument. # #`define uvm_fatal_context(ID, MSG, RO) \ # begin \ # if (RO.uvm_report_enabled(UVM_NONE,UVM_FATAL,ID)) \ # RO.uvm_report_fatal (ID, MSG, UVM_NONE, uvm_file(), uvm_line(), "", 1); \ # end #//---------------------------------------------------------------------------- #// Group: Message Trace Macros #//---------------------------------------------------------------------------- #// MACRO- `uvm_message_begin #// #// Undocumented. Library internal use. #// #`define uvm_message_begin(SEVERITY, ID, MSG, VERBOSITY, FILE, LINE, RM) \ # begin \ # if (uvm_report_enabled(VERBOSITY,SEVERITY,ID)) begin \ # uvm_report_message __uvm_msg; \ # if (RM == null) RM = uvm_report_message::new_report_message(); \ # __uvm_msg = RM; \ # __uvm_msg.set_report_message(SEVERITY, ID, MSG, VERBOSITY, FILE, LINE, ""); #// MACRO- `uvm_message_end #// #// Undocumented. Library internal use. #// #// #`define uvm_message_end \ # uvm_process_report_message(__uvm_msg); \ # end \ # end #// MACRO- `uvm_message_context_begin #// #// Undocumented. Library internal use. #// #`define uvm_message_context_begin(SEVERITY, ID, MSG, VERBOSITY, FILE, LINE, RO, RM) \ # begin \ # uvm_report_object __report_object; \ # __report_object = RO; \ # if (__report_object.uvm_report_enabled(VERBOSITY,SEVERITY,ID)) begin \ # uvm_report_message __uvm_msg; \ # if (RM == null) RM = uvm_report_message::new_report_message(); \ # __uvm_msg = RM; \ # __uvm_msg.set_report_message(SEVERITY, ID, MSG, VERBOSITY, FILE, LINE, ""); # # #// MACRO- `uvm_message_context_end #// #// Undocumented. Library internal use. #// #// #`define uvm_message_context_end \ # __report_object.uvm_process_report_message(__uvm_msg); \ # end \ # end #// MACRO: `uvm_info_begin #// #// |`uvm_info_begin(ID, MSG, VERBOSITY, RM = __uvm_msg) #// # #`define uvm_info_begin(ID, MSG, VERBOSITY, RM = __uvm_msg) \ # `uvm_message_begin(UVM_INFO, ID, MSG, VERBOSITY, uvm_file(), uvm_line(), RM) # #// MACRO: `uvm_info_end #// #// This macro pair provides the ability to add elements to messages. #// #// |`uvm_info_end #// #// Example usage is shown here. #// #// |... #// |task my_task(); #// | ... #// | `uvm_info_begin("MY_ID", "This is my message...", UVM_LOW) #// | `uvm_message_add_tag("my_color", "red") #// | `uvm_message_add_int(my_int, UVM_DEC) #// | `uvm_message_add_string(my_string) #// | `uvm_message_add_object(my_obj) #// | `uvm_info_end #// | ... #// |endtask #// # #`define uvm_info_end \ # `uvm_message_end # # #// MACRO: `uvm_warning_begin #// #// |`uvm_warning_begin(ID, MSG, RM = __uvm_msg) #// # #`define uvm_warning_begin(ID, MSG, RM = __uvm_msg) \ # `uvm_message_begin(UVM_WARNING, ID, MSG, UVM_NONE, uvm_file(), uvm_line(), RM) # #// MACRO: `uvm_warning_end #// #// This macro pair operates identically to <`uvm_info_begin>/<`uvm_info_end> with #// exception that the message severity is <UVM_WARNING> and has no verbosity threshold. #// #// |`uvm_warning_end #// #// The usage shown in <`uvm_info_end> works identically for this pair. #// # #`define uvm_warning_end \ # `uvm_message_end # # #// MACRO: `uvm_error_begin #// #// |`uvm_error_begin(ID, MSG, RM = __uvm_msg) #// # #`define uvm_error_begin(ID, MSG, RM = __uvm_msg) \ # `uvm_message_begin(UVM_ERROR, ID, MSG, UVM_NONE, uvm_file(), uvm_line(), RM) # # #// MACRO: `uvm_error_end #// #// This macro pair operates identically to <`uvm_info_begin>/<`uvm_info_end> with #// exception that the message severity is <UVM_ERROR> and has no verbosity threshold. #// #// |`uvm_error_end #// #// The usage shown in <`uvm_info_end> works identically for this pair. #// # #`define uvm_error_end \ # `uvm_message_end # # #// MACRO: `uvm_fatal_begin #// #// |`uvm_fatal_begin(ID, MSG, RM = __uvm_msg) #// # #`define uvm_fatal_begin(ID, MSG, RM = __uvm_msg) \ # `uvm_message_begin(UVM_FATAL, ID, MSG, UVM_NONE, uvm_file(), uvm_line(), RM) # # #// MACRO: `uvm_fatal_end #// #// This macro pair operates identically to <`uvm_info_begin>/<`uvm_info_end> with #// exception that the message severity is <UVM_FATAL> and has no verbosity threshold. #// #// |`uvm_fatal_end #// #// The usage shown in <`uvm_info_end> works identically for this pair. #// # #`define uvm_fatal_end \ # `uvm_message_end # # #// MACRO: `uvm_info_context_begin #// #// |`uvm_info_context_begin(ID, MSG, UVM_NONE, RO, RM = __uvm_msg) #// # #`define uvm_info_context_begin(ID, MSG, VERBOSITY, RO, RM = __uvm_msg) \ # `uvm_message_context_begin(UVM_INFO, ID, MSG, VERBOSITY, uvm_file(), uvm_line(), RO, RM) # # #// MACRO: `uvm_info_context_end #// #// |`uvm_info_context_end #// #// This macro pair operates identically to <`uvm_info_begin>/<`uvm_info_end>, but #// requires that the context, or <uvm_report_object> in which the message is printed #// be explicitly supplied as a macro argument. #// # #`define uvm_info_context_end \ # `uvm_message_context_end # # #// MACRO: `uvm_warning_context_begin #// #// |`uvm_warning_context_begin(ID, MSG, RO, RM = __uvm_msg) #// # #`define uvm_warning_context_begin(ID, MSG, RO, RM = __uvm_msg) \ # `uvm_message_context_begin(UVM_WARNING, ID, MSG, UVM_NONE, uvm_file(), uvm_line(), RO, RM) # #// MACRO: `uvm_warning_context_end #// #// |`uvm_warning_context_end #// #// This macro pair operates identically to <`uvm_warning_begin>/<`uvm_warning_end>, but #// requires that the context, or <uvm_report_object> in which the message is printed #// be explicitly supplied as a macro argument. #// # #`define uvm_warning_context_end \ # `uvm_message_context_end # # #// MACRO: `uvm_error_context_begin #// #// |`uvm_error_context_begin(ID, MSG, RO, RM = __uvm_msg) #// # #`define uvm_error_context_begin(ID, MSG, RO, RM = __uvm_msg) \ # `uvm_message_context_begin(UVM_ERROR, ID, MSG, UVM_NONE, uvm_file(), uvm_line(), RO, RM) # # #// MACRO: `uvm_error_context_end #// #// |`uvm_error_context_end #// #// This macro pair operates identically to <`uvm_error_begin>/<`uvm_error_end>, but #// requires that the context, or <uvm_report_object> in which the message is printed #// be explicitly supplied as a macro argument. #// # #`define uvm_error_context_end \ # `uvm_message_context_end # # #// MACRO: `uvm_fatal_context_begin #// #// |`uvm_fatal_context_begin(ID, MSG, RO, RM = __uvm_msg) #// # #`define uvm_fatal_context_begin(ID, MSG, RO, RM = __uvm_msg) \ # `uvm_message_context_begin(UVM_FATAL, ID, MSG, UVM_NONE, uvm_file(), uvm_line(), RO, RM) # # #// MACRO: `uvm_fatal_context_end #// #// |`uvm_fatal_context_end #// #// This macro pair operates identically to <`uvm_fatal_begin>/<`uvm_fatal_end>, but #// requires that the context, or <uvm_report_object> in which the message is printed #// be explicitly supplied as a macro argument. #// # #`define uvm_fatal_context_end \ # `uvm_message_context_end # # #//---------------------------------------------------------------------------- #// Group: Message Element Macros #//---------------------------------------------------------------------------- # # #// MACRO: `uvm_message_add_tag #// #// |`uvm_message_add_tag(NAME, VALUE, ACTION=(UVM_LOG|UVM_RM_RECORD)) #// # #`define uvm_message_add_tag(NAME, VALUE, ACTION=(UVM_LOG|UVM_RM_RECORD)) \ # __uvm_msg.add_string(NAME, VALUE, ACTION); # # #// MACRO: `uvm_message_add_int #// #// |`uvm_message_add_int(VAR, RADIX, LABEL = "", ACTION=(UVM_LOG|UVM_RM_RECORD)) #// # #`define uvm_message_add_int(VAR, RADIX, LABEL="", ACTION=(UVM_LOG|UVM_RM_RECORD)) \ # if (LABEL == "") \ # __uvm_msg.add_int(`"VAR`", VAR, $bits(VAR), RADIX, ACTION); \ # else \ # __uvm_msg.add_int(LABEL, VAR, $bits(VAR), RADIX, ACTION); # # #// MACRO: `uvm_message_add_string #// #// |`uvm_message_add_string(VAR, LABEL = "", ACTION=(UVM_LOG|UVM_RM_RECORD)) #// # #`define uvm_message_add_string(VAR, LABEL="", ACTION=(UVM_LOG|UVM_RM_RECORD)) \ # if (LABEL == "") \ # __uvm_msg.add_string(`"VAR`", VAR, ACTION); \ # else \ # __uvm_msg.add_string(LABEL, VAR, ACTION); # # #// MACRO: `uvm_message_add_object #// #// These macros allow the user to provide elements that are associated with #// <uvm_report_message>s. Separate macros are provided such that the #// user can supply arbitrary string/string pairs using <`uvm_message_add_tag>, #// integral types along with a radix using <`uvm_message_add_int>, string #// using <`uvm_message_add_string> and <uvm_object>s using #// <`uvm_message_add_object>. #// #// |`uvm_message_add_object(VAR, LABEL = "", ACTION=(UVM_LOG|UVM_RM_RECORD)) #// #// Example usage is shown in <`uvm_info_end>. #// # #`define uvm_message_add_object(VAR, LABEL="", ACTION=(UVM_LOG|UVM_RM_RECORD)) \ # if (LABEL == "") \ # __uvm_msg.add_object(`"VAR`", VAR, ACTION); \ # else \ # __uvm_msg.add_object(LABEL, VAR, ACTION); #