blob: 8ff2caf6c1f08d3de5ef43bcae3dd4e0142a1384 [file] [log] [blame]
// Copyright 2017-2023 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_STATEMENT_H_
#define VERIBLE_VERILOG_CST_STATEMENT_H_
#include <vector>
#include "common/analysis/syntax_tree_search.h"
#include "common/text/concrete_syntax_tree.h"
#include "common/text/symbol.h"
#include "common/text/visitors.h"
namespace verilog {
std::vector<verible::TreeSearchMatch> FindAllConditionalStatements(
const verible::Symbol &root);
std::vector<verible::TreeSearchMatch> FindAllForLoopsInitializations(
const verible::Symbol &root);
std::vector<verible::TreeSearchMatch> FindAllGenerateBlocks(
const verible::Symbol &root);
// Generate flow control constructs
//
// TODO(fangism): consider moving the *GenerateBody functions to generate.{h,cc}
// Returns the generate-item body of a generate-if construct.
const verible::SyntaxTreeNode *GetIfClauseGenerateBody(
const verible::Symbol &if_clause);
// Returns the generate-item body of a generate-else construct.
const verible::SyntaxTreeNode *GetElseClauseGenerateBody(
const verible::Symbol &else_clause);
// Returns the generate-item body of a generate-for-loop construct.
const verible::SyntaxTreeNode *GetLoopGenerateBody(const verible::Symbol &loop);
// Returns the if-clause of a generate-if construct.
const verible::SyntaxTreeNode *GetConditionalGenerateIfClause(
const verible::Symbol &conditional);
// Returns the else-clause of a generate-if construct, or nullptr.
const verible::SyntaxTreeNode *GetConditionalGenerateElseClause(
const verible::Symbol &conditional);
// Statement flow control constructs
// For if-conditional statement blocks, return the construct's
// statement body (which should be some form of statement list).
const verible::SyntaxTreeNode *GetIfClauseStatementBody(
const verible::Symbol &if_clause);
// For else-clause statement blocks, return the construct's
// statement body (which should be some form of statement list).
const verible::SyntaxTreeNode *GetElseClauseStatementBody(
const verible::Symbol &else_clause);
// Returns the if-clause of a conditional statement construct.
const verible::SyntaxTreeNode *GetConditionalStatementIfClause(
const verible::Symbol &conditional);
// Returns the else-clause of a conditional statement construct, or nullptr.
const verible::SyntaxTreeNode *GetConditionalStatementElseClause(
const verible::Symbol &conditional);
// Immediate assertion statements
// Returns the assert-clause of an assertion statement, or nullptr.
const verible::SyntaxTreeNode *GetAssertionStatementAssertClause(
const verible::Symbol &assertion_statement);
// Returns the else-clause of an assertion statement, or nullptr.
const verible::SyntaxTreeNode *GetAssertionStatementElseClause(
const verible::Symbol &assertion_statement);
// Returns the assume-clause of an assume statement, or nullptr.
const verible::SyntaxTreeNode *GetAssumeStatementAssumeClause(
const verible::Symbol &assume_statement);
// Returns the else-clause of an assume statement, or nullptr.
const verible::SyntaxTreeNode *GetAssumeStatementElseClause(
const verible::Symbol &assume_statement);
// Returns the statement body of a cover statement, or nullptr.
const verible::SyntaxTreeNode *GetCoverStatementBody(
const verible::Symbol &cover_statement);
// Returns the statement body of a wait statement, or nullptr.
const verible::SyntaxTreeNode *GetWaitStatementBody(
const verible::Symbol &wait_statement);
// Concurrent assertion statements
// Returns the assert-clause of an assert property statement, or nullptr.
const verible::SyntaxTreeNode *GetAssertPropertyStatementAssertClause(
const verible::Symbol &assert_property_statement);
// Returns the else-clause of an assert property statement, or nullptr.
const verible::SyntaxTreeNode *GetAssertPropertyStatementElseClause(
const verible::Symbol &assert_property_statement);
// Returns the assume-clause of an assume property statement, or nullptr.
const verible::SyntaxTreeNode *GetAssumePropertyStatementAssumeClause(
const verible::Symbol &assume_property_statement);
// Returns the else-clause of an assume property statement, or nullptr.
const verible::SyntaxTreeNode *GetAssumePropertyStatementElseClause(
const verible::Symbol &assume_property_statement);
// Returns the expect-clause of an expect property statement, or nullptr.
const verible::SyntaxTreeNode *GetExpectPropertyStatementExpectClause(
const verible::Symbol &expect_property_statement);
// Returns the else-clause of an expect property statement, or nullptr.
const verible::SyntaxTreeNode *GetExpectPropertyStatementElseClause(
const verible::Symbol &expect_property_statement);
// Loop-like statements
// For loop statement blocks, return the looped statement body.
const verible::SyntaxTreeNode *GetLoopStatementBody(
const verible::Symbol &loop);
// For do-while statement blocks, return the looped statement body.
const verible::SyntaxTreeNode *GetDoWhileStatementBody(
const verible::Symbol &do_while);
// Return the statement body of forever blocks.
const verible::SyntaxTreeNode *GetForeverStatementBody(
const verible::Symbol &forever);
// Return the statement body of foreach blocks.
const verible::SyntaxTreeNode *GetForeachStatementBody(
const verible::Symbol &foreach);
// Return the statement body of repeat blocks.
const verible::SyntaxTreeNode *GetRepeatStatementBody(
const verible::Symbol &repeat);
// Return the statement body of while blocks.
const verible::SyntaxTreeNode *GetWhileStatementBody(
const verible::Symbol &while_stmt);
// TODO(fangism): case-items
// Return the statement body of procedural timing constructs.
const verible::SyntaxTreeNode *GetProceduralTimingControlStatementBody(
const verible::Symbol &proc_timing_control);
// Combines all of the above Get*StatementBody.
// Also works for control flow generate constructs.
const verible::SyntaxTreeNode *GetAnyControlStatementBody(
const verible::Symbol &statement);
// Returns the if-clause of a conditional generate/statement.
const verible::SyntaxTreeNode *GetAnyConditionalIfClause(
const verible::Symbol &conditional);
// Returns the else-clause of a conditional generate/statement, or nullptr if it
// doesn't exist.
const verible::SyntaxTreeNode *GetAnyConditionalElseClause(
const verible::Symbol &conditional);
// Returns the data type node from for loop initialization.
const verible::SyntaxTreeNode *GetDataTypeFromForInitialization(
const verible::Symbol &);
// Returns the variable name leaf from for loop initialization.
const verible::SyntaxTreeLeaf *GetVariableNameFromForInitialization(
const verible::Symbol &);
// Returns the rhs expression from for loop initialization.
const verible::SyntaxTreeNode *GetExpressionFromForInitialization(
const verible::Symbol &);
// Returns the 'begin' node of a generate block.
const verible::SyntaxTreeNode *GetGenerateBlockBegin(
const verible::Symbol &generate_block);
// Returns the 'end' node of a generate block.
const verible::SyntaxTreeNode *GetGenerateBlockEnd(
const verible::Symbol &generate_block);
// Returns the procedural timing control statement of an always statement node
const verible::SyntaxTreeNode *GetProceduralTimingControlFromAlways(
const verible::SyntaxTreeNode &always_statement);
// Returns the event control symbol of a procedural timing control statement
const verible::Symbol *GetEventControlFromProceduralTimingControl(
const verible::SyntaxTreeNode &proc_timing_ctrl);
} // namespace verilog
#endif // VERIBLE_VERILOG_CST_STATEMENT_H_