| /* | |
| 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: ModuleInstance.cpp | |
| * Author: alain | |
| * | |
| * Created on October 16, 2017, 10:48 PM | |
| */ | |
| #include <string> | |
| #include <iostream> | |
| #include "../SourceCompile/SymbolTable.h" | |
| #include "../Library/Library.h" | |
| #include "FileContent.h" | |
| #include "ModuleInstance.h" | |
| using namespace SURELOG; | |
| ModuleInstance::ModuleInstance(DesignComponent* moduleDefinition, | |
| FileContent* fileContent, NodeId nodeId, | |
| ModuleInstance* parent, std::string instName, | |
| std::string modName) | |
| : ValuedComponentI(parent), | |
| m_definition(moduleDefinition), | |
| m_childrens(NULL), | |
| m_nbChildren(0), | |
| m_fileContent(fileContent), | |
| m_nodeId(nodeId), | |
| m_parent(parent), | |
| m_instName(instName) { | |
| if (m_definition == NULL) { | |
| m_instName = modName + "&" + instName; | |
| } | |
| } | |
| ModuleInstance::~ModuleInstance() {} | |
| void ModuleInstance::addSubInstances(ModuleInstance** subInstances, | |
| unsigned int nbSubInstances) { | |
| m_childrens = subInstances; | |
| m_nbChildren = nbSubInstances; | |
| } | |
| ModuleInstance* ModuleInstanceFactory::newModuleInstance( | |
| DesignComponent* moduleDefinition, FileContent* fileContent, NodeId nodeId, | |
| ModuleInstance* parent, std::string instName, std::string modName) { | |
| return new ModuleInstance(moduleDefinition, fileContent, nodeId, parent, | |
| instName, modName); | |
| } | |
| VObjectType ModuleInstance::getType() { return m_fileContent->Type(m_nodeId); } | |
| VObjectType ModuleInstance::getModuleType() { | |
| VObjectType type = (VObjectType)0; | |
| if (m_definition) { | |
| type = m_definition->getType(); | |
| } | |
| return type; | |
| } | |
| unsigned int ModuleInstance::getLineNb() { | |
| return m_fileContent->Line(m_nodeId); | |
| } | |
| SymbolId ModuleInstance::getFullPathId(SymbolTable* symbols) { | |
| return symbols->registerSymbol(getFullPathName()); | |
| } | |
| SymbolId ModuleInstance::getInstanceId(SymbolTable* symbols) { | |
| return symbols->registerSymbol(getInstanceName()); | |
| } | |
| SymbolId ModuleInstance::getModuleNameId(SymbolTable* symbols) { | |
| return symbols->registerSymbol(getModuleName()); | |
| } | |
| std::string ModuleInstance::getFullPathName() { | |
| std::string path; | |
| ModuleInstance* tmp = this; | |
| std::vector<std::string> nibbles; | |
| while (tmp) { | |
| nibbles.push_back(tmp->getInstanceName()); | |
| tmp = tmp->getParent(); | |
| } | |
| for (int i = nibbles.size() - 1; i >= 0; i--) { | |
| path += nibbles[i]; | |
| if (i > 0) { | |
| path += "."; | |
| } | |
| } | |
| return path; | |
| } | |
| unsigned int ModuleInstance::getDepth() { | |
| unsigned int depth = 0; | |
| ModuleInstance* tmp = this; | |
| while (tmp) { | |
| tmp = tmp->getParent(); | |
| depth++; | |
| } | |
| return depth; | |
| } | |
| std::string ModuleInstance::getInstanceName() { | |
| if (m_definition == NULL) { | |
| std::string name = | |
| m_instName.substr(m_instName.find("&", 0, 1) + 1, m_instName.size()); | |
| return name; | |
| } else { | |
| return m_instName; | |
| } | |
| } | |
| std::string ModuleInstance::getModuleName() { | |
| if (m_definition == NULL) { | |
| std::string name = m_instName.substr(0, m_instName.find("&", 0, 1)); | |
| return name; | |
| } else { | |
| return m_definition->getName(); | |
| } | |
| } | |
| void ModuleInstance::overrideParentChild(ModuleInstance* parent, | |
| ModuleInstance* interm, | |
| ModuleInstance* child) { | |
| if (parent != this) return; | |
| child->m_parent = this; | |
| std::vector<ModuleInstance*> children; | |
| for (unsigned int i = 0; i < m_nbChildren; i++) { | |
| if (m_childrens[i] == interm) { | |
| for (unsigned int j = 0; j < interm->m_nbChildren; j++) { | |
| children.push_back(interm->m_childrens[j]); | |
| } | |
| } else { | |
| children.push_back(m_childrens[i]); | |
| } | |
| } | |
| ModuleInstance** newChild = new ModuleInstance*[children.size()]; | |
| for (unsigned int i = 0; i < children.size(); i++) { | |
| newChild[i] = children[i]; | |
| } | |
| m_nbChildren = children.size(); | |
| delete[] m_childrens; | |
| m_childrens = newChild; | |
| } |