// +---------------------------------------------------------------------------- // |"sc_object::sc_object_init" // | // | This method initializes this object instance and places it in to the // | object hierarchy if the supplied name is not NULL. // | // | Arguments: // | nm = leaf name for the object. // +---------------------------------------------------------------------------- void sc_object::sc_object_init(const char* nm) { // SET UP POINTERS TO OBJECT MANAGER, PARENT, AND SIMULATION CONTEXT: // // Make the current simcontext the simcontext for this object m_simc = sc_get_curr_simcontext(); m_attr_cltn_p = 0; sc_object_manager* object_manager = m_simc->get_object_manager(); m_parent = m_simc->active_object(); // CONSTRUCT PATHNAME TO OBJECT BEING CREATED: // // If there is not a leaf name generate one. m_name = object_manager->create_name(nm ? nm : sc_object_newname().c_str()); // PLACE THE OBJECT INTO THE HIERARCHY IF A USER LEAF NAME WAS SUPPLIED: if ( nm != NULL && strncmp(nm, SC_KERNEL_MODULE_PREFIX, strlen(SC_KERNEL_MODULE_PREFIX)) ) { object_manager->insert_object(m_name, this); if ( m_parent ) m_parent->add_child_object( this ); else m_simc->add_child_object( this ); } }
void sc_object::sc_object_init(const char* nm) { bool clash; // True if path name exists in obj table const char* leafname_p; // Leaf name (this object) char pathname[BUFSIZ]; // Path name char pathname_orig[BUFSIZ]; // Original path name which may clash const char* parentname_p; // Parent path name bool put_in_table; // True if should put in object table // SET UP POINTERS TO OBJECT MANAGER, PARENT, AND SIMULATION CONTEXT: // // Make the current simcontext the simcontext for this object m_simc = sc_get_curr_simcontext(); m_attr_cltn_p = 0; sc_object_manager* object_manager = m_simc->get_object_manager(); sc_object* parent_p = object_manager->hierarchy_curr(); if (!parent_p) { sc_object* proc = (sc_object*)sc_get_current_process_b(); parent_p = proc; } m_parent = parent_p; // CONSTRUCT PATHNAME TO OBJECT BEING CREATED: // // If there is not a leaf name generate one. parentname_p = parent_p ? parent_p->name() : ""; if (nm && nm[0] ) { leafname_p = nm; put_in_table = true; } else { leafname_p = sc_object_newname(pathname_orig); put_in_table = false; } if (parent_p) { std::sprintf(pathname, "%s%c%s", parentname_p, SC_HIERARCHY_CHAR, leafname_p ); } else { strcpy(pathname, leafname_p); } // SAVE the original path name // strcpy(pathname_orig, pathname); // MAKE SURE THE OBJECT NAME IS UNIQUE // // If not use unique name generator to make it unique. clash = false; while (object_manager->find_object(pathname)) { clash = true; leafname_p = sc_gen_unique_name(leafname_p); if (parent_p) { std::sprintf(pathname, "%s%c%s", parentname_p, SC_HIERARCHY_CHAR, leafname_p ); } else { strcpy(pathname, leafname_p); } } if (clash) { std::string message = pathname_orig; message += ". Latter declaration will be renamed to "; message += pathname; SC_REPORT_WARNING( SC_ID_OBJECT_EXISTS_, message.c_str()); } // MOVE OBJECT NAME TO PERMANENT STORAGE // // Note here we pull a little trick -- use the first byte to store // information about whether to put the object in the object table in the // object manager char* ptr = new char[strlen( pathname ) + 2]; ptr[0] = put_in_table; m_name = ptr + 1; strcpy(m_name, pathname); if (put_in_table) { object_manager->insert_object(m_name, this); sc_module* curr_module = m_simc->hierarchy_curr(); if( curr_module != 0 ) { curr_module->add_child_object( this ); } else { sc_process_b* curr_proc = sc_get_current_process_b(); if (curr_proc) { curr_proc->add_child_object( this ); } else { m_simc->add_child_object( this ); } } } }