GpiObjHdl *VpiImpl::get_root_handle(const char* name) { vpiHandle root; vpiHandle iterator; GpiObjHdl *rv; std::string root_name = name; // vpi_iterate with a ref of NULL returns the top level module iterator = vpi_iterate(vpiModule, NULL); check_vpi_error(); for (root = vpi_scan(iterator); root != NULL; root = vpi_scan(iterator)) { if (name == NULL || !strcmp(name, vpi_get_str(vpiFullName, root))) break; } if (!root) { check_vpi_error(); goto error; } //Need to free the iterator if it didn't return NULL if (iterator && !vpi_free_object(iterator)) { LOG_WARN("VPI: Attempting to free root iterator failed!"); check_vpi_error(); } rv = new GpiObjHdl(this, root); rv->initialise(root_name); return rv; error: LOG_CRITICAL("VPI: Couldn't find root handle %s", name); iterator = vpi_iterate(vpiModule, NULL); for (root = vpi_scan(iterator); root != NULL; root = vpi_scan(iterator)) { LOG_CRITICAL("VPI: Toplevel instances: %s != %s...", name, vpi_get_str(vpiFullName, root)); if (name == NULL || !strcmp(name, vpi_get_str(vpiFullName, root))) break; } return NULL; }
/** * @name Find the root handle * @brief Find the root handle using an optional name * * Get a handle to the root simulator object. This is usually the toplevel. * * If no name is provided, we return the first root instance. * * If name is provided, we check the name against the available objects until * we find a match. If no match is found we return NULL */ GpiObjHdl *FliImpl::get_root_handle(const char *name) { mtiRegionIdT root; GpiObjHdl *rv; char *rgn_name; std::string root_name; for (root = mti_GetTopRegion(); root != NULL; root = mti_NextRegion(root)) { LOG_DEBUG("Iterating over: %s", mti_GetRegionName(root)); if (name == NULL || !strcmp(name, mti_GetRegionName(root))) break; } if (!root) { goto error; } rgn_name = mti_GetRegionFullName(root); root_name = rgn_name; mti_VsimFree(rgn_name); LOG_DEBUG("Found toplevel: %s, creating handle....", root_name.c_str()); rv = new FliRegionObjHdl(this, root); rv->initialise(root_name); LOG_DEBUG("Returning root handle %p", rv); return rv; error: LOG_CRITICAL("FLI: Couldn't find root handle %s", name); for (root = mti_GetTopRegion(); root != NULL; root = mti_NextRegion(root)) { if (name == NULL) break; LOG_CRITICAL("FLI: Toplevel instances: %s != %s...", name, mti_GetRegionName(root)); } return NULL; }