// Should be run after every VPI call to check error status static int __check_vhpi_error(const char *func, long line) { int level=0; #if VHPI_CHECKING vhpiErrorInfoT info; int loglevel; level = vhpi_check_error(&info); if (level == 0) return; switch (level) { case vhpiNote: loglevel = GPIInfo; break; case vhpiWarning: loglevel = GPIWarning; break; case vhpiError: loglevel = GPIError; break; case vhpiFailure: case vhpiSystem: case vhpiInternal: loglevel = GPICritical; break; } gpi_log("cocotb.gpi", loglevel, __FILE__, func, line, "VPI Error level %d: %s\nFILE %s:%d", info.severity, info.message, info.file, info.line); #endif return level; }
// System function to permit code in the simulator to fail a test // TODO: Pass in an error string static int system_function_overload(char *userdata) { vpiHandle systfref, args_iter, argh; struct t_vpi_value argval; const char *msg = "*** NO MESSAGE PROVIDED ***"; // Obtain a handle to the argument list systfref = vpi_handle(vpiSysTfCall, NULL); args_iter = vpi_iterate(vpiArgument, systfref); // The first argument to fatal is the FinishNum which we discard if (args_iter && *userdata == systf_fatal_level) { argh = vpi_scan(args_iter); } if (args_iter) { // Grab the value of the first argument argh = vpi_scan(args_iter); argval.format = vpiStringVal; vpi_get_value(argh, &argval); vpi_free_object(args_iter); msg = argval.value.str; } gpi_log("simulator", *userdata, vpi_get_str(vpiFile, systfref), "", (long)vpi_get(vpiLineNo, systfref), msg ); // Fail the test for critical errors if (GPICritical == *userdata) gpi_embed_event(SIM_TEST_FAIL, argval.value.str); return 0; }
static PyObject *log_msg(PyObject *self, PyObject *args) { const char *name; const char *path; const char *msg; const char *funcname; int lineno; if (!PyArg_ParseTuple(args, "sssis", &name, &path, &funcname, &lineno, &msg)) return NULL; gpi_log(name, GPIInfo, path, funcname, lineno, msg); return Py_BuildValue("s", "OK!"); }