| // 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. |
| |
| #include "verilog/analysis/extractors.h" |
| |
| #include <string> |
| |
| #include "verilog/CST/identifier.h" |
| #include "verilog/CST/module.h" |
| #include "verilog/analysis/verilog_analyzer.h" |
| |
| namespace verilog { |
| namespace analysis { |
| |
| // Find all modules and collect interface names |
| absl::Status CollectInterfaceNames( |
| absl::string_view content, std::set<std::string>* if_names, |
| const VerilogPreprocess::Config& preprocess_config) { |
| VLOG(1) << __FUNCTION__; |
| |
| const auto analyzer = verilog::VerilogAnalyzer::AnalyzeAutomaticMode( |
| content, "<file>", preprocess_config); |
| auto lex_status = ABSL_DIE_IF_NULL(analyzer)->LexStatus(); |
| auto parse_status = analyzer->ParseStatus(); |
| |
| if (!lex_status.ok()) return lex_status; |
| if (!parse_status.ok()) return parse_status; |
| |
| // TODO: Having a syntax error may still result in a partial syntax tree |
| // to work with. Currently, this utility has zero tolerance on syntax error. |
| |
| const auto& syntax_tree = analyzer->SyntaxTree(); |
| const auto mod_headers = |
| FindAllModuleHeaders(*ABSL_DIE_IF_NULL(syntax_tree).get()); |
| |
| // For each module, collect all identifiers under the module |
| // header tree into if_names. |
| for (const auto& mod_header : mod_headers) { |
| const auto if_leafs = FindAllSymbolIdentifierLeafs(*mod_header.match); |
| for (const auto& if_leaf_match : if_leafs) { |
| const auto& if_leaf = SymbolCastToLeaf(*if_leaf_match.match); |
| absl::string_view if_name = if_leaf.get().text(); |
| if_names->insert(std::string(if_name)); // TODO: use absl::string_view |
| } |
| } |
| return absl::OkStatus(); |
| } |
| |
| } // namespace analysis |
| } // namespace verilog |