| /* |
| Copyright 2019 Alain Dargelas |
| |
| 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. |
| */ |
| |
| /* |
| * File: ErrorDefinition.cpp |
| * Author: alain |
| * |
| * Created on March 5, 2017, 11:25 PM |
| */ |
| #include "Utils/StringUtils.h" |
| #include "ErrorReporting/ErrorDefinition.h" |
| |
| using namespace SURELOG; |
| |
| std::map<ErrorDefinition::ErrorType, ErrorDefinition::ErrorInfo> |
| ErrorDefinition::m_errorInfoMap; |
| |
| void ErrorDefinition::rec(ErrorType type, ErrorSeverity severity, |
| ErrorCategory category, std::string text, |
| std::string extraText) { |
| ErrorInfo info(severity, category, text, extraText); |
| m_errorInfoMap.insert(std::make_pair(type, info)); |
| } |
| |
| void ErrorDefinition::setSeverity(ErrorDefinition::ErrorType type, |
| ErrorDefinition::ErrorSeverity severity) { |
| std::map<ErrorDefinition::ErrorType, ErrorDefinition::ErrorInfo>::iterator |
| itr = m_errorInfoMap.find(type); |
| if (itr != m_errorInfoMap.end()) { |
| ErrorDefinition::ErrorInfo& info = (*itr).second; |
| info.m_severity = severity; |
| } |
| } |
| |
| ErrorDefinition::ErrorType ErrorDefinition::getErrorType(std::string errorId) { |
| errorId = StringUtils::rtrim(errorId, ']'); |
| errorId = StringUtils::ltrim(errorId, '['); |
| errorId = errorId.erase(0, 8); |
| unsigned int id = atoi(errorId.c_str()); |
| return (ErrorDefinition::ErrorType)id; |
| } |
| |
| ErrorDefinition::ErrorSeverity ErrorDefinition::getErrorSeverity( |
| std::string errorSeverity) { |
| if (errorSeverity == "FATAL") |
| return FATAL; |
| else if (errorSeverity == "ERROR") |
| return ERROR; |
| else if (errorSeverity == "WARNI" || errorSeverity == "WARNING") |
| return WARNING; |
| else if (errorSeverity == "INFO" || errorSeverity == "INFO ") |
| return INFO; |
| else if (errorSeverity == "NOTE" || errorSeverity == "NOTE ") |
| return NOTE; |
| else if (errorSeverity == "SYNTX" || errorSeverity == "SYNTAX") |
| return NOTE; |
| else |
| return FATAL; |
| } |
| |
| std::string ErrorDefinition::getCategoryName( |
| ErrorDefinition::ErrorCategory category) { |
| std::string cat; |
| switch (category) { |
| case ErrorDefinition::CMD: |
| cat = "CM"; |
| break; |
| case ErrorDefinition::PP: |
| cat = "PP"; |
| break; |
| case ErrorDefinition::PARSE: |
| cat = "PA"; |
| break; |
| case ErrorDefinition::PYTH: |
| cat = "PY"; |
| break; |
| case ErrorDefinition::LANG: |
| cat = "LA"; |
| break; |
| case ErrorDefinition::SEMA: |
| cat = "SM"; |
| break; |
| case ErrorDefinition::COMP: |
| cat = "CP"; |
| break; |
| case ErrorDefinition::ELAB: |
| cat = "EL"; |
| break; |
| case ErrorDefinition::LIB: |
| cat = "LIB"; |
| break; |
| case ErrorDefinition::LINT: |
| cat = "LN"; |
| break; |
| case ErrorDefinition::USER: |
| cat = "US"; |
| break; |
| } |
| return cat; |
| } |
| |
| ErrorDefinition::ErrorCategory ErrorDefinition::getCategory(std::string cat) { |
| if (cat == "CM") |
| return ErrorDefinition::CMD; |
| else if (cat == "PP") |
| return ErrorDefinition::PP; |
| else if (cat == "PA") |
| return ErrorDefinition::PARSE; |
| else if (cat == "PY") |
| return ErrorDefinition::PYTH; |
| else if (cat == "LA") |
| return ErrorDefinition::LANG; |
| else if (cat == "SM") |
| return ErrorDefinition::SEMA; |
| else if (cat == "CP") |
| return ErrorDefinition::COMP; |
| else if (cat == "EL") |
| return ErrorDefinition::ELAB; |
| else if (cat == "LIB") |
| return ErrorDefinition::LIB; |
| else if (cat == "LN") |
| return ErrorDefinition::LINT; |
| else if (cat == "US") |
| return ErrorDefinition::USER; |
| return ErrorDefinition::USER; |
| } |
| |
| bool ErrorDefinition::init() { |
| rec(CMD_FILE_DOES_NOT_EXIST, FATAL, CMD, "File \"%s\" does not exist"); |
| rec(CMD_CANNOT_OPEN_FILE_FOR_READ, FATAL, CMD, |
| "Cannot open file \"%s\" for read operation"); |
| rec(CMD_CANNOT_OPEN_FILE_FOR_WRITE, FATAL, CMD, |
| "Cannot open file \"%s\" for write operation"); |
| rec(CMD_DASH_F_FILE_DOES_NOT_EXIST, FATAL, CMD, |
| "Command file (-f) \"%s\" does not exist"); |
| rec(CMD_INCLUDE_PATH_DOES_NOT_EXIST, WARNING, CMD, |
| "Include path \"%s\" does not exist"); |
| rec(CMD_LIBRARY_FILE_DOES_NOT_EXIST, FATAL, CMD, |
| "Library file \"%s\" does not exist"); |
| rec(CMD_LIBRARY_PATH_DOES_NOT_EXIST, WARNING, CMD, |
| "Library path \"%s\" does not exist"); |
| rec(CMD_VERILOG_FILE_DOES_NOT_EXIST, FATAL, CMD, |
| "Verilog File \"%s\" does not exist"); |
| rec(CMD_PLUS_ARG_IGNORED, NOTE, CMD, "Command line argument \"%s\" ignored"); |
| rec(CMD_MINUS_ARG_IGNORED, WARNING, CMD, |
| "Command line argument \"%s\" ignored"); |
| rec(CMD_DEBUG_MISSING_LEVEL, ERROR, CMD, |
| "Option -d is missing the debug level <level>"); |
| rec(CMD_DEBUG_INCORRECT_LEVEL, WARNING, CMD, |
| "Option -d received incorrect level: \"%s\", level should be 0-3"); |
| rec(CMD_LIBRARY_FILE_MISSING_FILE, ERROR, CMD, |
| "Library File option \"%s\" is missing the file name"); |
| rec(CMD_LIBRARY_PATH_MISSING_PATH, ERROR, CMD, |
| "Library Path option \"%s\" is missing the path name"); |
| rec(CMD_LOG_FILE_MISSING_FILE, ERROR, CMD, |
| "Log file option \"%s\" is missing the path name"); |
| rec(CMD_PP_FILE_MISSING_FILE, ERROR, CMD, |
| "Output file option \"%s\" is missing the path name"); |
| rec(CMD_MT_MISSING_LEVEL, ERROR, CMD, |
| "Option -mt is missing the number of threads <max_threads>"); |
| rec(CMD_MT_INCORRECT_LEVEL, ERROR, CMD, |
| "Option -mt received incorrect level: \"%s\", level should be 0-64"); |
| rec(CMD_SEPARATE_COMPILATION_UNIT_ON, INFO, CMD, |
| "Separate compilation-unit mode is on"); |
| rec(CMD_PP_FILE_MISSING_ODIR, FATAL, CMD, |
| "Missing output directory argument for -odir option"); |
| rec(CMD_PP_CANNOT_CREATE_OUTPUT_DIR, FATAL, CMD, |
| "Cannot create output directory \"%s\""); |
| rec(CMD_CREATING_LOG_FILE, INFO, CMD, "Creating log file %s"); |
| rec(CMD_NUMBER_THREADS, INFO, CMD, "Executing with %s threads"); |
| rec(CMD_PP_CANNOT_CREATE_CACHE_DIR, FATAL, CMD, |
| "Cannot create cache directory \"%s\""); |
| rec(CMD_TIMESCALE_MISSING_SETTING, FATAL, CMD, "Missing timescale setting"); |
| rec(CMD_SPLIT_FILE_MISSING_SIZE, FATAL, CMD, "Missing file splitting size"); |
| rec(CMD_UNDEFINED_CONFIG, ERROR, CMD, "Undefined configuration: \"%s\""); |
| rec(CMD_USING_GLOBAL_TIMESCALE, INFO, CMD, "Using global timescale: \"%s\""); |
| rec(PP_CANNOT_OPEN_FILE, ERROR, PP, "Cannot open file \"%s\""); |
| rec(PP_CANNOT_OPEN_INCLUDE_FILE, ERROR, PP, |
| "Cannot open include file \"%s\""); |
| rec(PP_UNKOWN_MACRO, ERROR, PP, "Unknown macro \"%s\""); |
| rec(PP_UNDEF_UNKOWN_MACRO, WARNING, PP, "Undefining an unknown macro \"%s\""); |
| rec(PP_OPEN_FILE_FOR_WRITE, FATAL, PP, |
| "Cannot open file \"%s\" for write operation"); |
| rec(PP_MULTIPLY_DEFINED_MACRO, NOTE, PP, "Multiply defined macro \"%s\"", |
| "%exloc previous definition"); |
| rec(PP_SYNTAX_ERROR, SYNTAX, PP, "Syntax error: %s", "%exobj"); |
| rec(PP_TOO_MANY_ARGS_MACRO, ERROR, PP, |
| "Too many arguments (%exobj) for macro \"%s\"", |
| "%exloc macro definition takes %exobj"); |
| rec(PP_MACRO_SYNTAX_ERROR, SYNTAX, PP, "Syntax error in macro: %s", |
| "%exloc macro instantiation"); |
| rec(PP_MACRO_NO_DEFAULT_VALUE, ERROR, PP, |
| "Macro instantiation omits argument %exobj for \"%s\"", |
| "%exloc No default value for argument %exobj in macro definition"); |
| rec(PP_MACRO_PARENTHESIS_NEEDED, ERROR, PP, |
| "Macro instantiation omits parenthesis for \"%s\"", |
| "%exloc macro definition has arguments"); |
| rec(PP_MACRO_NAME_RESERVED, ERROR, PP, |
| "Illegally redefining compiler directive \"`%s\" as a macro name"); |
| rec(PP_MACRO_HAS_SPACE_BEFORE_ARGS, ERROR, PP, |
| "Illegal space in between macro name \"%s\" and open parenthesis"); |
| rec(PP_MACRO_UNUSED_ARGUMENT, WARNING, PP, "Unused macro argument \"%s\""); |
| rec(PP_MACRO_UNDEFINED_ARGUMENT, WARNING, PP, |
| "Undefined macro argument \"%s\""); |
| rec(PP_RECURSIVE_MACRO_DEFINITION, ERROR, PP, |
| "Recursive macro definition for \"%s\"", |
| "%exloc macro used in macro \"%exobj\""); |
| rec(PP_UNTERMINATED_STRING, ERROR, PP, "Illegal unterminated string: >>%s<<", |
| "%exloc macro instance"); |
| rec(PP_UNESCAPED_CHARACTER_IN_STRING, ERROR, PP, |
| "Illegal un-escaped character '%s' in string"); |
| rec(PP_UNRECOGNIZED_ESCAPED_SEQUENCE, ERROR, PP, |
| "Unknown escaped sequence '%s'"); |
| rec(PP_INVALID_INCLUDE_FILENAME, ERROR, PP, "Invalid include filename"); |
| rec(PP_ILLEGAL_DIRECTIVE_IN_DESIGN_ELEMENT, ERROR, PP, |
| "Illegal directive in design element \"%s\"", "%exloc macro instance"); |
| rec(PP_CANNOT_CREATE_DIRECTORY, FATAL, PP, "Cannot create directory \"%s\""); |
| rec(PP_PROCESSING_SOURCE_FILE, INFO, PP, "Preprocessing source file \"%s\""); |
| rec(PP_PROCESSING_INCLUDE_FILE, INFO, PP, |
| "Preprocessing include file \"%s\""); |
| rec(PP_ILLEGAL_DIRECTIVE_ELSEIF, ERROR, PP, |
| "Illegal directive `elseif, correct directive is `elsif"); |
| rec(PP_CANNOT_READ_FILE_CONTENT, ERROR, PP, |
| "Cannot read the file's content \"%s\". Only UTF-8 is supported"); |
| rec(PP_RECURSIVE_INCLUDE_DIRECTIVE, FATAL, PP, |
| "Recursive include directive for file \"%s\""); |
| rec(PA_CANNOT_SPLIT_FILE, WARNING, PARSE, "Cannot split large file \"%s\""); |
| rec(PA_PROCESSING_SOURCE_FILE, INFO, PARSE, "Parsing source file \"%s\""); |
| rec(PA_CANNOT_OPEN_FILE, FATAL, PARSE, "Cannot open file \"%s\""); |
| rec(PA_UNKOWN_MACRO, ERROR, PARSE, "Unknown macro \"%s\""); |
| rec(PA_MAX_LENGTH_IDENTIFIER, ERROR, PARSE, |
| "Indentifier exceeds max length \"%s\""); |
| rec(PA_NOTIMESCALE_INFO, WARNING, PARSE, "No timescale set for \"%s\""); |
| rec(PA_MISSING_TIMEUNIT, ERROR, PARSE, |
| "Missing timeunit/timeprecision for \"%s\""); |
| rec(PA_SYNTAX_ERROR, SYNTAX, PARSE, "Syntax error: %s", "%exobj"); |
| rec(PA_RESERVED_KEYWORD, ERROR, PARSE, "Reserved keyword: %s"); |
| rec(PA_UNSUPPORTED_KEYWORD_LIST, ERROR, PARSE, "Unsupported keyword set: %s"); |
| rec(COMP_COMPILE, INFO, COMP, "Compilation.."); |
| rec(COMP_COMPILE_PACKAGE, INFO, COMP, "Compile package \"%s\""); |
| rec(COMP_COMPILE_CLASS, INFO, COMP, "Compile class \"%s\""); |
| rec(COMP_COMPILE_MODULE, INFO, COMP, "Compile module \"%s\""); |
| rec(COMP_COMPILE_UDP, INFO, COMP, "Compile udp \"%s\""); |
| rec(COMP_COMPILE_PROGRAM, INFO, COMP, "Compile program \"%s\""); |
| rec(COMP_COMPILE_CHECKER, INFO, COMP, "Compile checker \"%s\""); |
| rec(COMP_COMPILE_INTERFACE, INFO, COMP, "Compile interface \"%s\""); |
| rec(COMP_UNDEFINED_INTERFACE, ERROR, COMP, "Undefined interface \"%s\""); |
| rec(COMP_PORT_MISSING_TYPE, NOTE, COMP, |
| "Implicit port type (wire) for \"%s\"", |
| "there are %exobj more instances of this message"); |
| rec(COMP_PORT_MISSING_DIRECTION, WARNING, COMP, |
| "Port \"%s\" definition missing its direction (input, output, inout)", |
| "there are %exobj more instances of this message"); |
| rec(COMP_MODPORT_UNDEFINED_PORT, ERROR, COMP, |
| "Undefined port used in modport: \"%s\""); |
| rec(COMP_MODPORT_UNDEFINED_CLOCKING_BLOCK, ERROR, COMP, |
| "Undefined clocking block used in modport: \"%s\""); |
| rec(COMP_NO_MODPORT_IN_GENERATE, ERROR, COMP, |
| "Illegal modport in generate statement"); |
| rec(COMP_PROGRAM_OBSOLETE_USAGE, WARNING, COMP, |
| "Using programs is discouraged \"%s\", programs are obsoleted by UVM"); |
| rec(COMP_UNDEFINED_CLASS, ERROR, COMP, "Undefined class \"%s\""); |
| rec(COMP_UNDEFINED_PACKAGE, ERROR, COMP, "Undefined package \"%s\""); |
| rec(COMP_UNDEFINED_TYPE, ERROR, COMP, "Undefined type \"%s\""); |
| rec(COMP_MULTIPLY_DEFINED_PROPERTY, ERROR, COMP, |
| "Multiply defined property \"%s\"", "%exloc previous definition"); |
| rec(COMP_MULTIPLY_DEFINED_CLASS, WARNING, COMP, |
| "Multiply defined class \"%s\"", "%exloc previous definition"); |
| rec(COMP_MULTIPLY_DEFINED_FUNCTION, ERROR, COMP, |
| "Multiply defined function \"%s\"", "%exloc previous definition"); |
| rec(COMP_MULTIPLY_DEFINED_TASK, ERROR, COMP, "Multiply defined task \"%s\"", |
| "%exloc previous definition"); |
| rec(COMP_MULTIPLY_DEFINED_CONSTRAINT, ERROR, COMP, |
| "Multiply defined constraint \"%s\"", "%exloc previous definition"); |
| rec(COMP_MULTIPLY_DEFINED_TYPEDEF, ERROR, COMP, |
| "Multiply defined typedef \"%s\"", "%exloc previous definition"); |
| rec(COMP_MULTIPLY_DEFINED_INNER_CLASS, ERROR, COMP, |
| "Multiply defined inner class \"%s\"", "%exloc previous definition"); |
| rec(COMP_MULTIPLY_DEFINED_COVERGROUP, ERROR, COMP, |
| "Multiply defined covergroup \"%s\"", "%exloc previous definition"); |
| rec(COMP_MULTIPLY_DEFINED_PARAMETER, ERROR, COMP, |
| "Multiply defined parameter \"%s\"", "%exloc previous definition"); |
| rec(COMP_UNDEFINED_VARIABLE, ERROR, COMP, "Undefined variable \"%s\""); |
| rec(COMP_UNDEFINED_BASE_CLASS, ERROR, COMP, |
| "Undefined base class \"%s\" extended by \"%exobj\""); |
| rec(COMP_MULTIPLY_DEFINED_PACKAGE, ERROR, COMP, |
| "Multiply defined package: \"%s\"", "%exloc previous definition"); |
| rec(COMP_INCOMPATIBLE_TYPES, ERROR, COMP, |
| "Incompatible types: \"%s\" is assigned \"%exobj\""); |
| rec(COMP_MULTIPLY_DEFINED_VARIABLE, ERROR, COMP, |
| "Multiply defined variable \"%s\"", "%exloc previous definition"); |
| rec(COMP_NO_METHOD_FOR_TYPE, ERROR, COMP, |
| "Function \"%exobj\" is not defined for variable %s", |
| "%exloc type definition"); |
| rec(COMP_UNDEFINED_SYSTEM_FUNCTION, ERROR, COMP, |
| "Undefined system task/function \"$%s\""); |
| rec(COMP_MULTIPLY_DEFINED_DESIGN_UNIT, ERROR, COMP, |
| "Colliding compilation unit name: \"%s\"", "%exloc previous usage"); |
| rec(PY_PROCESSING_SOURCE_FILE, INFO, PYTH, "Processing source file \"%s\""); |
| rec(PY_NO_PYTHON_LISTENER_FOUND, FATAL, PYTH, |
| "No Python listener found (slSV3_1aPythonListener.py)"); |
| rec(ELAB_NO_MODULE_DEFINITION, WARNING, ELAB, |
| "Cannot find a module definition for \"%s\""); |
| rec(ELAB_NO_UDP_DEFINITION, WARNING, ELAB, |
| "Cannot find a Udp definition for \"%s\""); |
| rec(ELAB_NO_INTERFACE_DEFINITION, WARNING, ELAB, |
| "Cannot find an interface definition for \"%s\""); |
| rec(ELAB_TOP_LEVEL_MODULE, NOTE, ELAB, "Top level module \"%s\""); |
| rec(ELAB_MULTIPLE_TOP_LEVEL_MODULES, NOTE, ELAB, |
| "Multiple top level modules in design"); |
| rec(ELAB_MULTIPLY_DEFINED_MODULE, WARNING, ELAB, |
| "Multiply defined module \"%s\"", "%exloc previous definition"); |
| rec(ELAB_NO_TOP_LEVEL_MODULE, ERROR, ELAB, "No top level module in design"); |
| rec(ELAB_INSTANTIATION_LOOP, ERROR, ELAB, "Instantiation loop for \"%s\"", |
| "%exloc previous instantiation"); |
| rec(ELAB_NB_TOP_LEVEL_MODULES, NOTE, ELAB, "Nb Top level modules: %s"); |
| rec(ELAB_MAX_INSTANCE_DEPTH, NOTE, ELAB, "Max instance depth: %s"); |
| rec(ELAB_NB_INSTANCES, NOTE, ELAB, "Nb instances: %s"); |
| rec(ELAB_NB_LEAF_INSTANCES, NOTE, ELAB, "Nb leaf instances: %s"); |
| rec(ELAB_NB_UNDEF_MODULES, WARNING, ELAB, "Nb undefined modules: %s"); |
| rec(ELAB_NB_UNDEF_INSTANCES, WARNING, ELAB, "Nb undefined instances: %s"); |
| rec(ELAB_UNDEF_VARIABLE, ERROR, ELAB, "Undefined variable: %s"); |
| rec(ELAB_UNMATCHED_DEFPARAM, WARNING, ELAB, |
| "Defparam does not match any design object: \"%s\""); |
| rec(ELAB_DEFPARAM_OUTSIDE_SCOPE, ERROR, ELAB, |
| "Defparam sets an object outside its generate scope: \"%s\""); |
| rec(ELAB_MULTI_DEFPARAM_ON_OBJECT, WARNING, ELAB, |
| "Multiple defparam on object: \"%s\"", "%exloc previous setting"); |
| rec(ELAB_UNDEFINED_CONFIG, ERROR, ELAB, "Undefined configuration: \"%s\""); |
| rec(ELAB_CONFIGURATION_USED, NOTE, ELAB, "Using configuration \"%s\""); |
| rec(ELAB_CONFIGURATION_IGNORED, NOTE, ELAB, "Ignoring configuration \"%s\""); |
| rec(ELAB_USE_CLAUSE_IGNORED, WARNING, ELAB, |
| "Use clause has no effect, no matching design object found \"%s\""); |
| rec(ELAB_SCOPE_PATH, NOTE, ELAB, "Scope \"%s\""); |
| rec(ELAB_INSTANCE_PATH, NOTE, ELAB, "Instance \"%s\""); |
| rec(ELAB_INTERFACE_INSTANCE_PATH, NOTE, ELAB, "Interface Instance \"%s\""); |
| rec(ELAB_PROGRAM_INSTANCE_PATH, NOTE, ELAB, "Program Instance \"%s\""); |
| rec(ELAB_ELABORATING_DESIGN, INFO, ELAB, "Design Elaboration.."); |
| rec(ELAB_ELABORATING_TESTBENCH, INFO, ELAB, "Testbench Elaboration.."); |
| rec(ELAB_UNDEFINED_PACKAGE, ERROR, ELAB, |
| "Undefined imported package: \"%s\""); |
| rec(ELAB_OUT_OF_RANGE_PARAM_INDEX, ERROR, ELAB, |
| "Out of range parameter index: \"%s\""); |
| rec(LIB_FILE_MAPS_TO_MULTIPLE_LIBS, ERROR, LIB, |
| "File \"%exobj\" maps to multiple libraries: \"%s\""); |
| return true; |
| } |