Skip to content

Commit

Permalink
[clang-format] Handle Verilog assign statements
Browse files Browse the repository at this point in the history
Reviewed By: MyDeveloperDay

Differential Revision: https://reviews.llvm.org/D146402
  • Loading branch information
eywdck2l committed Mar 25, 2023
1 parent 0e01c3d commit f90668c
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 2 deletions.
2 changes: 2 additions & 0 deletions clang/lib/Format/FormatToken.h
Expand Up @@ -144,6 +144,8 @@ namespace format {
TYPE(UnaryOperator) \
TYPE(UnionLBrace) \
TYPE(UntouchableMacroFunc) \
/* Like in 'assign x = 0, y = 1;' . */ \
TYPE(VerilogAssignComma) \
/* like in begin : block */ \
TYPE(VerilogBlockLabelColon) \
/* The square bracket for the dimension part of the type name. \
Expand Down
10 changes: 8 additions & 2 deletions clang/lib/Format/TokenAnnotator.cpp
Expand Up @@ -1286,8 +1286,11 @@ class AnnotatingParser {
Tok->setType(TT_InheritanceComma);
break;
default:
if (Contexts.back().FirstStartOfName &&
(Contexts.size() == 1 || startsWithInitStatement(Line))) {
if (Style.isVerilog() && Contexts.size() == 1 &&
Line.startsWith(Keywords.kw_assign)) {
Tok->setFinalizedType(TT_VerilogAssignComma);
} else if (Contexts.back().FirstStartOfName &&
(Contexts.size() == 1 || startsWithInitStatement(Line))) {
Contexts.back().FirstStartOfName->PartOfMultiVariableDeclStmt = true;
Line.IsMultiVariableDeclStmt = true;
}
Expand Down Expand Up @@ -4720,6 +4723,9 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
return true;
}
} else if (Style.isVerilog()) {
// Break between assignments.
if (Left.is(TT_VerilogAssignComma))
return true;
// Break between ports of different types.
if (Left.is(TT_VerilogTypeComma))
return true;
Expand Down
17 changes: 17 additions & 0 deletions clang/unittests/Format/FormatTestVerilog.cpp
Expand Up @@ -97,6 +97,23 @@ TEST_F(FormatTestVerilog, Align) {
Style);
}

TEST_F(FormatTestVerilog, Assign) {
verifyFormat("assign mynet = enable;");
verifyFormat("assign (strong1, pull0) #1 mynet = enable;");
verifyFormat("assign #1 mynet = enable;");
verifyFormat("assign mynet = enable;");
// Test that assignments are on separate lines.
verifyFormat("assign mynet = enable,\n"
" mynet1 = enable1;");
// Test that `<=` and `,` don't confuse it.
verifyFormat("assign mynet = enable1 <= enable2;");
verifyFormat("assign mynet = enable1 <= enable2,\n"
" mynet1 = enable3;");
verifyFormat("assign mynet = enable,\n"
" mynet1 = enable2 <= enable3;");
verifyFormat("assign mynet = enable(enable1, enable2);");
}

TEST_F(FormatTestVerilog, BasedLiteral) {
verifyFormat("x = '0;");
verifyFormat("x = '1;");
Expand Down

0 comments on commit f90668c

Please sign in to comment.