| /* |
| 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: ResolveSymbols.h |
| * Author: alain |
| * |
| * Created on July 1, 2017, 12:38 PM |
| */ |
| |
| #ifndef RESOLVESYMBOLS_H |
| #define RESOLVESYMBOLS_H |
| #include "Design/TimeInfo.h" |
| #include "Design/FileContent.h" |
| #include "DesignCompile/CompileStep.h" |
| |
| namespace SURELOG { |
| |
| struct FunctorCreateLookup { |
| FunctorCreateLookup(CompileDesign* compileDesign, FileContent* fileContent, |
| Design* design, SymbolTable* symbolTable, |
| ErrorContainer* errors) |
| : m_compileDesign(compileDesign), |
| m_fileData(fileContent), |
| m_symbolTable(symbolTable), |
| m_errorContainer(errors) {} |
| int operator()() const; |
| |
| private: |
| CompileDesign* m_compileDesign; |
| FileContent* m_fileData; |
| SymbolTable* m_symbolTable; |
| ErrorContainer* m_errorContainer; |
| }; |
| |
| struct FunctorResolve { |
| FunctorResolve(CompileDesign* compileDesign, FileContent* fileContent, |
| Design* design, SymbolTable* symbolTable, |
| ErrorContainer* errors) |
| : m_compileDesign(compileDesign), |
| m_fileData(fileContent), |
| m_symbolTable(symbolTable), |
| m_errorContainer(errors) {} |
| int operator()() const; |
| |
| private: |
| CompileDesign* m_compileDesign; |
| FileContent* m_fileData; |
| SymbolTable* m_symbolTable; |
| ErrorContainer* m_errorContainer; |
| }; |
| |
| class ResolveSymbols : public CompileStep { |
| public: |
| ResolveSymbols(CompileDesign* compileDesign, FileContent* fileContent, |
| SymbolTable* symbolTable, ErrorContainer* errors) |
| : m_compileDesign(compileDesign), |
| m_fileData(fileContent), |
| m_symbolTable(symbolTable), |
| m_errorContainer(errors) {} |
| |
| void createFastLookup(); |
| |
| bool resolve(); |
| |
| VObject& Object(NodeId index); |
| |
| NodeId UniqueId(NodeId index); |
| |
| SymbolId Name(NodeId index); |
| |
| NodeId Child(NodeId index); |
| |
| NodeId Sibling(NodeId index); |
| |
| NodeId& Definition(NodeId index); |
| |
| NodeId Parent(NodeId index); |
| |
| unsigned short& Type(NodeId index); |
| |
| unsigned int Line(NodeId index); |
| |
| std::string Symbol(SymbolId id); |
| |
| std::string SymName(NodeId index); |
| |
| NodeId sl_get(NodeId parent, VObjectType type); // Get first item of type |
| |
| NodeId sl_parent(NodeId parent, |
| VObjectType type); // Get first parent item of type |
| |
| NodeId sl_parent(NodeId parent, std::vector<VObjectType> types, |
| VObjectType& actualType); |
| |
| std::vector<NodeId> sl_get_all(NodeId parent, |
| VObjectType type); // get all items of type |
| |
| NodeId sl_collect( |
| NodeId parent, |
| VObjectType type); // Recursively search for first item of type |
| |
| std::vector<NodeId> sl_collect_all( |
| NodeId parent, |
| VObjectType type); // Recursively search for all items of type |
| |
| ResolveSymbols(const ResolveSymbols& orig); |
| virtual ~ResolveSymbols(); |
| |
| Compiler* getCompiler() { return m_compileDesign->getCompiler(); } |
| |
| private: |
| bool bindDefinition_(unsigned int objIndex, |
| std::vector<VObjectType> bindTypes); |
| |
| CompileDesign* m_compileDesign; |
| FileContent* m_fileData; |
| SymbolTable* m_symbolTable; |
| ErrorContainer* m_errorContainer; |
| }; |
| |
| }; // namespace SURELOG |
| |
| #endif /* RESOLVESYMBOLS_H */ |