| // Copyright 2017-2020 The Verible Authors. | |
| // | |
| // 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. | |
| #ifndef VERIBLE_VERILOG_CST_DECLARATION_H_ | |
| #define VERIBLE_VERILOG_CST_DECLARATION_H_ | |
| // See comment at the top | |
| // verilog/CST/verilog_treebuilder_utils.h that explains use | |
| // of std::forward in Make* helper functions. | |
| #include <utility> | |
| #include "common/analysis/syntax_tree_search.h" | |
| #include "common/text/concrete_syntax_tree.h" | |
| #include "common/text/symbol.h" | |
| #include "common/text/tree_utils.h" | |
| #include "verilog/CST/verilog_nonterminals.h" | |
| namespace verilog { | |
| // Interface for consistently building a type-id-dimensions tuple. | |
| template <typename T1, typename T2, typename T3> | |
| verible::SymbolPtr MakeTypeIdDimensionsTuple(T1&& type, T2&& id, | |
| T3&& unpacked_dimensions) { | |
| verible::CheckSymbolAsNode(*type.get(), NodeEnum::kDataType); | |
| // id can be qualified or unqualified | |
| verible::CheckOptionalSymbolAsNode(unpacked_dimensions, | |
| NodeEnum::kUnpackedDimensions); | |
| return verible::MakeTaggedNode(NodeEnum::kDataTypeImplicitBasicIdDimensions, | |
| std::forward<T1>(type), std::forward<T2>(id), | |
| std::forward<T3>(unpacked_dimensions)); | |
| } | |
| // Interface for consistently building a type-id tuple (no unpacked dimensions). | |
| // TODO(fangism): combine this with MakeTypeIdDimensionsTuple above? | |
| // That would be one fewer auxiliary CST node type. | |
| template <typename T1, typename T2> | |
| verible::SymbolPtr MakeTypeIdTuple(T1&& type, T2&& id) { | |
| verible::CheckSymbolAsNode(*type.get(), NodeEnum::kDataType); | |
| verible::CheckSymbolAsNode(*id.get(), NodeEnum::kUnqualifiedId); | |
| return verible::MakeTaggedNode(NodeEnum::kTypeIdentifierId, | |
| std::forward<T1>(type), std::forward<T2>(id)); | |
| } | |
| // Repacks output of MakeTypeIdDimensionsTuple into a type-id pair. | |
| verible::SymbolPtr RepackReturnTypeId(verible::SymbolPtr type_id_tuple); | |
| // Maps lexical token enum to corresponding syntax tree node. | |
| // Useful for syntax tree construction. | |
| NodeEnum DeclarationKeywordToNodeEnum(const verible::Symbol&); | |
| template <typename T1, typename T2> | |
| verible::SymbolPtr MakeInstantiationBase(T1&& type, T2&& decl_list) { | |
| verible::CheckSymbolAsNode(*type.get(), NodeEnum::kInstantiationType); | |
| // decl_list could contain either instantiations or variable declarations | |
| return verible::MakeTaggedNode(NodeEnum::kInstantiationBase, | |
| std::forward<T1>(type), | |
| std::forward<T2>(decl_list)); | |
| } | |
| // Interface for consistently building a data declaration. | |
| template <typename T1, typename T2, typename T3> | |
| verible::SymbolPtr MakeDataDeclaration(T1&& qualifiers, T2&& inst_base, | |
| T3&& semicolon) { | |
| verible::CheckOptionalSymbolAsNode(qualifiers, NodeEnum::kQualifierList); | |
| verible::CheckSymbolAsNode(*inst_base.get(), NodeEnum::kInstantiationBase); | |
| verible::CheckSymbolAsLeaf(*semicolon.get(), ';'); | |
| return verible::MakeTaggedNode( | |
| NodeEnum::kDataDeclaration, std::forward<T1>(qualifiers), | |
| std::forward<T2>(inst_base), std::forward<T3>(semicolon)); | |
| } | |
| // Find all data declarations. | |
| std::vector<verible::TreeSearchMatch> FindAllDataDeclarations( | |
| const verible::Symbol&); | |
| std::vector<verible::TreeSearchMatch> FindAllNetVariables( | |
| const verible::Symbol&); | |
| std::vector<verible::TreeSearchMatch> FindAllRegisterVariables( | |
| const verible::Symbol&); | |
| std::vector<verible::TreeSearchMatch> FindAllGateInstances( | |
| const verible::Symbol&); | |
| // For a given data declaration (includes module instantiation), returns the | |
| // subtree containing qualifiers. e.g. from "const foo bar, baz;", | |
| // this returns the subtree spanning "const". Returns nullptr if there | |
| // are no qualifiers. | |
| const verible::SyntaxTreeNode* GetQualifiersOfDataDeclaration( | |
| const verible::Symbol& data_declaration); | |
| // For a given data declaration (includes module instantiation), returns the | |
| // subtree containing the type. e.g. from "foo #(...) bar..., baz...;", | |
| // this returns the subtree spanning "foo #(...)". | |
| // It is possible for type to be implicit, in which case, the node | |
| // will be an empty subtree. | |
| const verible::SyntaxTreeNode& GetTypeOfDataDeclaration( | |
| const verible::Symbol& data_declaration); | |
| // For a given data declaration returns the TokenInfo of the module type. | |
| // e.g. bar b1() returns the TokenInfo for "bar" in instantiation. | |
| const verible::TokenInfo& GetTypeTokenInfoFromDataDeclaration( | |
| const verible::Symbol&); | |
| // For a given data declaration (includes module instantiation), returns the | |
| // subtree containing instances. e.g. from "foo bar..., baz...;", | |
| // this returns the subtree spanning "bar..., baz..." | |
| const verible::SyntaxTreeNode& GetInstanceListFromDataDeclaration( | |
| const verible::Symbol& data_declaration); | |
| // For a given gate instance subtree returns the TokenInfo of the module name. | |
| // e.g. bar b1(); returns TokenInfo for "b1". | |
| const verible::TokenInfo& GetModuleInstanceNameTokenInfoFromGateInstance( | |
| const verible::Symbol&); | |
| // For a given register variable subtree returns the TokenInfo of the instance | |
| // name. e.g. int b1; returns TokenInfo for "b1". | |
| const verible::TokenInfo& GetInstanceNameTokenInfoFromRegisterVariable( | |
| const verible::Symbol&); | |
| } // namespace verilog | |
| #endif // VERIBLE_VERILOG_CST_DECLARATION_H_ |