Skip to content

Commit 1aa1e75

Browse files
committed
verilog: CST: add getters for NetVariableAssignment
1 parent d3e58a0 commit 1aa1e75

File tree

3 files changed

+116
-0
lines changed

3 files changed

+116
-0
lines changed

verible/verilog/CST/statement.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,4 +552,17 @@ const verible::SyntaxTreeNode *GetAssignModifyLhs(
552552
return verible::GetSubtreeAsNode(assign_modify,
553553
NodeEnum::kAssignModifyStatement, 0);
554554
}
555+
556+
const verible::SyntaxTreeNode *GetNetVariableAssignmentLhs(
557+
const verible::SyntaxTreeNode &assignment) {
558+
return verible::GetSubtreeAsNode(assignment, NodeEnum::kNetVariableAssignment,
559+
0);
560+
}
561+
562+
const verible::SyntaxTreeLeaf *GetNetVariableAssignmentOperator(
563+
const verible::SyntaxTreeNode &assignment) {
564+
return verible::GetSubtreeAsLeaf(assignment, NodeEnum::kNetVariableAssignment,
565+
1);
566+
}
567+
555568
} // namespace verilog

verible/verilog/CST/statement.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,16 @@ const verible::SyntaxTreeNode *GetAssignModifyRhs(
237237
const verible::SyntaxTreeNode *GetAssignModifyLhs(
238238
const verible::SyntaxTreeNode &assign_modify);
239239

240+
// Return the left hand side (Lhs) from a NetVariableAssignment
241+
// Example: get 'x' from 'x = y'
242+
const verible::SyntaxTreeNode *GetNetVariableAssignmentLhs(
243+
const verible::SyntaxTreeNode &assignment);
244+
245+
// Return the operator from a NetVariableAssignment
246+
// Example: get '=' from 'x = y'
247+
const verible::SyntaxTreeLeaf *GetNetVariableAssignmentOperator(
248+
const verible::SyntaxTreeNode &assignment);
249+
240250
} // namespace verilog
241251

242252
#endif // VERIBLE_VERILOG_CST_STATEMENT_H_

verible/verilog/CST/statement_test.cc

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1745,5 +1745,98 @@ TEST(GetAssignModifyRhs, Various) {
17451745
}
17461746
}
17471747

1748+
TEST(GetNetVariableAssignmentLhs, Various) {
1749+
constexpr int kTag = 1; // value doesn't matter
1750+
const SyntaxTreeSearchTestCase kTestCases[] = {
1751+
{""},
1752+
{"module m;\nendmodule\n"},
1753+
{"module m;\n"
1754+
"reg k;\n"
1755+
"always_comb begin\n",
1756+
{kTag, "k"},
1757+
" = 1;\nend\n",
1758+
"endmodule\n"},
1759+
{"module m;\n"
1760+
"reg k;\n"
1761+
"always_comb begin\n",
1762+
"k &= 1;\nend\n"
1763+
"endmodule\n"},
1764+
{"module m;\n"
1765+
"reg k;\n"
1766+
"always_comb begin\n"
1767+
"k |= 1;\nend\n"
1768+
"endmodule\n"},
1769+
{"module m;\n"
1770+
"reg k;\n"
1771+
"always_ff begin\n"
1772+
"k <= 1;\nend\n"
1773+
"endmodule\n"},
1774+
};
1775+
for (const auto &test : kTestCases) {
1776+
TestVerilogSyntaxRangeMatches(
1777+
__FUNCTION__, test, [](const TextStructureView &text_structure) {
1778+
const auto &root = text_structure.SyntaxTree();
1779+
const auto &net_var_assignments = SearchSyntaxTree(
1780+
*ABSL_DIE_IF_NULL(root), NodekNetVariableAssignment());
1781+
1782+
std::vector<TreeSearchMatch> left_hand_sides;
1783+
for (const auto &assignment : net_var_assignments) {
1784+
const auto *lhs = GetNetVariableAssignmentLhs(
1785+
verible::SymbolCastToNode(*assignment.match));
1786+
left_hand_sides.emplace_back(
1787+
TreeSearchMatch{lhs, {/* ignored context */}});
1788+
}
1789+
return left_hand_sides;
1790+
});
1791+
}
1792+
}
1793+
1794+
TEST(GetNetVariableAssignmentOperator, Various) {
1795+
constexpr int kTag = 1; // value doesn't matter
1796+
const SyntaxTreeSearchTestCase kTestCases[] = {
1797+
{""},
1798+
{"module m;\nendmodule\n"},
1799+
{"module m;\n"
1800+
"reg k;\n"
1801+
"always_comb begin\n",
1802+
"k ",
1803+
{kTag, "="},
1804+
" 1;\nend\n",
1805+
"endmodule\n"},
1806+
{"module m;\n"
1807+
"reg k;\n"
1808+
"always_comb begin\n",
1809+
"k &= 1;\nend\n"
1810+
"endmodule\n"},
1811+
{"module m;\n"
1812+
"reg k;\n"
1813+
"always_comb begin\n"
1814+
"k |= 1;\nend\n"
1815+
"endmodule\n"},
1816+
{"module m;\n"
1817+
"reg k;\n"
1818+
"always_ff begin\n"
1819+
"k <= 1;\nend\n"
1820+
"endmodule\n"},
1821+
};
1822+
for (const auto &test : kTestCases) {
1823+
TestVerilogSyntaxRangeMatches(
1824+
__FUNCTION__, test, [](const TextStructureView &text_structure) {
1825+
const auto &root = text_structure.SyntaxTree();
1826+
const auto &net_var_assignments = SearchSyntaxTree(
1827+
*ABSL_DIE_IF_NULL(root), NodekNetVariableAssignment());
1828+
1829+
std::vector<TreeSearchMatch> left_hand_sides;
1830+
for (const auto &assignment : net_var_assignments) {
1831+
const auto *lhs = GetNetVariableAssignmentOperator(
1832+
verible::SymbolCastToNode(*assignment.match));
1833+
left_hand_sides.emplace_back(
1834+
TreeSearchMatch{lhs, {/* ignored context */}});
1835+
}
1836+
return left_hand_sides;
1837+
});
1838+
}
1839+
}
1840+
17481841
} // namespace
17491842
} // namespace verilog

0 commit comments

Comments
 (0)