xref: /llvm-project/clang/unittests/Format/FormatTestVerilog.cpp (revision 0ff8b79160509b25fd913ffa320b9dab5b87b55e)
19ed2e68cSsstwcw //===- unittest/Format/FormatTestVerilog.cpp ------------------------------===//
29ed2e68cSsstwcw //
39ed2e68cSsstwcw // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
49ed2e68cSsstwcw // See https://llvm.org/LICENSE.txt for license information.
59ed2e68cSsstwcw // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69ed2e68cSsstwcw //
79ed2e68cSsstwcw //===----------------------------------------------------------------------===//
89ed2e68cSsstwcw 
96cef3254Ssstwcw #include "FormatTestBase.h"
109ed2e68cSsstwcw 
119ed2e68cSsstwcw #define DEBUG_TYPE "format-test"
129ed2e68cSsstwcw 
139ed2e68cSsstwcw namespace clang {
149ed2e68cSsstwcw namespace format {
156cef3254Ssstwcw namespace test {
166cef3254Ssstwcw namespace {
176cef3254Ssstwcw class FormatTestVerilog : public test::FormatTestBase {
189ed2e68cSsstwcw protected:
196cef3254Ssstwcw   FormatStyle getDefaultStyle() const override {
206cef3254Ssstwcw     return getLLVMStyle(FormatStyle::LK_Verilog);
219ed2e68cSsstwcw   }
221c58208dSOwen Pan   std::string messUp(StringRef Code) const override {
236cef3254Ssstwcw     return test::messUp(Code, /*HandleHash=*/false);
249ed2e68cSsstwcw   }
259ed2e68cSsstwcw };
269ed2e68cSsstwcw 
27cad708b9Ssstwcw TEST_F(FormatTestVerilog, Align) {
286cef3254Ssstwcw   FormatStyle Style = getDefaultStyle();
29cad708b9Ssstwcw   Style.AlignConsecutiveAssignments.Enabled = true;
30cad708b9Ssstwcw   verifyFormat("x            <= x;\n"
31cad708b9Ssstwcw                "sfdbddfbdfbb <= x;\n"
32cad708b9Ssstwcw                "x             = x;",
33cad708b9Ssstwcw                Style);
34cad708b9Ssstwcw   verifyFormat("x            = x;\n"
35cad708b9Ssstwcw                "sfdbddfbdfbb = x;\n"
36cad708b9Ssstwcw                "x            = x;",
37cad708b9Ssstwcw                Style);
38cad708b9Ssstwcw   // Compound assignments are not aligned by default. '<=' is not a compound
39cad708b9Ssstwcw   // assignment.
40cad708b9Ssstwcw   verifyFormat("x            <= x;\n"
41cad708b9Ssstwcw                "sfdbddfbdfbb <= x;",
42cad708b9Ssstwcw                Style);
43cad708b9Ssstwcw   verifyFormat("x += x;\n"
44cad708b9Ssstwcw                "sfdbddfbdfbb <= x;",
45cad708b9Ssstwcw                Style);
46cad708b9Ssstwcw   verifyFormat("x <<= x;\n"
47cad708b9Ssstwcw                "sfdbddfbdfbb <= x;",
48cad708b9Ssstwcw                Style);
49cad708b9Ssstwcw   verifyFormat("x <<<= x;\n"
50cad708b9Ssstwcw                "sfdbddfbdfbb <= x;",
51cad708b9Ssstwcw                Style);
52cad708b9Ssstwcw   verifyFormat("x >>= x;\n"
53cad708b9Ssstwcw                "sfdbddfbdfbb <= x;",
54cad708b9Ssstwcw                Style);
55cad708b9Ssstwcw   verifyFormat("x >>>= x;\n"
56cad708b9Ssstwcw                "sfdbddfbdfbb <= x;",
57cad708b9Ssstwcw                Style);
58cad708b9Ssstwcw   Style.AlignConsecutiveAssignments.AlignCompound = true;
59cad708b9Ssstwcw   verifyFormat("x            <= x;\n"
60cad708b9Ssstwcw                "sfdbddfbdfbb <= x;",
61cad708b9Ssstwcw                Style);
62cad708b9Ssstwcw   verifyFormat("x            += x;\n"
63cad708b9Ssstwcw                "sfdbddfbdfbb <= x;",
64cad708b9Ssstwcw                Style);
65cad708b9Ssstwcw   verifyFormat("x            <<= x;\n"
66cad708b9Ssstwcw                "sfdbddfbdfbb  <= x;",
67cad708b9Ssstwcw                Style);
68cad708b9Ssstwcw   verifyFormat("x            <<<= x;\n"
69cad708b9Ssstwcw                "sfdbddfbdfbb   <= x;",
70cad708b9Ssstwcw                Style);
71cad708b9Ssstwcw   verifyFormat("x            >>= x;\n"
72cad708b9Ssstwcw                "sfdbddfbdfbb  <= x;",
73cad708b9Ssstwcw                Style);
74cad708b9Ssstwcw   verifyFormat("x            >>>= x;\n"
75cad708b9Ssstwcw                "sfdbddfbdfbb   <= x;",
76cad708b9Ssstwcw                Style);
77cad708b9Ssstwcw }
78cad708b9Ssstwcw 
79f90668c8Ssstwcw TEST_F(FormatTestVerilog, Assign) {
80f90668c8Ssstwcw   verifyFormat("assign mynet = enable;");
81f90668c8Ssstwcw   verifyFormat("assign (strong1, pull0) #1 mynet = enable;");
82f90668c8Ssstwcw   verifyFormat("assign #1 mynet = enable;");
83f90668c8Ssstwcw   verifyFormat("assign mynet = enable;");
84f90668c8Ssstwcw   // Test that assignments are on separate lines.
85f90668c8Ssstwcw   verifyFormat("assign mynet = enable,\n"
86f90668c8Ssstwcw                "       mynet1 = enable1;");
87f90668c8Ssstwcw   // Test that `<=` and `,` don't confuse it.
88f90668c8Ssstwcw   verifyFormat("assign mynet = enable1 <= enable2;");
89f90668c8Ssstwcw   verifyFormat("assign mynet = enable1 <= enable2,\n"
90f90668c8Ssstwcw                "       mynet1 = enable3;");
91f90668c8Ssstwcw   verifyFormat("assign mynet = enable,\n"
92f90668c8Ssstwcw                "       mynet1 = enable2 <= enable3;");
93f90668c8Ssstwcw   verifyFormat("assign mynet = enable(enable1, enable2);");
94f90668c8Ssstwcw }
95f90668c8Ssstwcw 
96f93182a8Ssstwcw TEST_F(FormatTestVerilog, BasedLiteral) {
97f93182a8Ssstwcw   verifyFormat("x = '0;");
98f93182a8Ssstwcw   verifyFormat("x = '1;");
99f93182a8Ssstwcw   verifyFormat("x = 'X;");
100f93182a8Ssstwcw   verifyFormat("x = 'x;");
101f93182a8Ssstwcw   verifyFormat("x = 'Z;");
102f93182a8Ssstwcw   verifyFormat("x = 'z;");
103f93182a8Ssstwcw   verifyFormat("x = 659;");
104f93182a8Ssstwcw   verifyFormat("x = 'h837ff;");
105f93182a8Ssstwcw   verifyFormat("x = 'o7460;");
106f93182a8Ssstwcw   verifyFormat("x = 4'b1001;");
107f93182a8Ssstwcw   verifyFormat("x = 5'D3;");
108f93182a8Ssstwcw   verifyFormat("x = 3'b01x;");
109f93182a8Ssstwcw   verifyFormat("x = 12'hx;");
110f93182a8Ssstwcw   verifyFormat("x = 16'hz;");
111f93182a8Ssstwcw   verifyFormat("x = -8'd6;");
112f93182a8Ssstwcw   verifyFormat("x = 4'shf;");
113f93182a8Ssstwcw   verifyFormat("x = -4'sd15;");
114f93182a8Ssstwcw   verifyFormat("x = 16'sd?;");
115f93182a8Ssstwcw }
116f93182a8Ssstwcw 
11767480b36Ssstwcw TEST_F(FormatTestVerilog, Block) {
11867480b36Ssstwcw   verifyFormat("begin\n"
11967480b36Ssstwcw                "  x = x;\n"
12067480b36Ssstwcw                "end");
12167480b36Ssstwcw   verifyFormat("begin : x\n"
12267480b36Ssstwcw                "  x = x;\n"
12367480b36Ssstwcw                "end : x");
12467480b36Ssstwcw   verifyFormat("begin\n"
12567480b36Ssstwcw                "  x = x;\n"
12667480b36Ssstwcw                "  x = x;\n"
12767480b36Ssstwcw                "end");
12867480b36Ssstwcw   verifyFormat("fork\n"
12967480b36Ssstwcw                "  x = x;\n"
13067480b36Ssstwcw                "join");
13167480b36Ssstwcw   verifyFormat("fork\n"
13267480b36Ssstwcw                "  x = x;\n"
13367480b36Ssstwcw                "join_any");
13467480b36Ssstwcw   verifyFormat("fork\n"
13567480b36Ssstwcw                "  x = x;\n"
13667480b36Ssstwcw                "join_none");
13767480b36Ssstwcw   verifyFormat("generate\n"
13867480b36Ssstwcw                "  x = x;\n"
13967480b36Ssstwcw                "endgenerate");
14067480b36Ssstwcw   verifyFormat("generate : x\n"
14167480b36Ssstwcw                "  x = x;\n"
14267480b36Ssstwcw                "endgenerate : x");
14367480b36Ssstwcw   // Nested blocks.
14467480b36Ssstwcw   verifyFormat("begin\n"
14567480b36Ssstwcw                "  begin\n"
14667480b36Ssstwcw                "  end\n"
14767480b36Ssstwcw                "end");
14867480b36Ssstwcw   verifyFormat("begin : x\n"
14967480b36Ssstwcw                "  begin\n"
15067480b36Ssstwcw                "  end\n"
15167480b36Ssstwcw                "end : x");
15267480b36Ssstwcw   verifyFormat("begin : x\n"
15367480b36Ssstwcw                "  begin : x\n"
15467480b36Ssstwcw                "  end : x\n"
15567480b36Ssstwcw                "end : x");
15667480b36Ssstwcw   verifyFormat("begin\n"
15767480b36Ssstwcw                "  begin : x\n"
15867480b36Ssstwcw                "  end : x\n"
15967480b36Ssstwcw                "end");
16067480b36Ssstwcw   // Test that 'disable fork' and 'rand join' don't get mistaken as blocks.
16167480b36Ssstwcw   verifyFormat("disable fork;\n"
16267480b36Ssstwcw                "x = x;");
16367480b36Ssstwcw   verifyFormat("rand join x x;\n"
16467480b36Ssstwcw                "x = x;");
165df722b01Ssstwcw   // The begin keyword should not be indented if it is too long to fit on the
166df722b01Ssstwcw   // same line.
167df722b01Ssstwcw   verifyFormat("while (true) //\n"
168df722b01Ssstwcw                "begin\n"
169df722b01Ssstwcw                "  while (true) //\n"
170df722b01Ssstwcw                "  begin\n"
171df722b01Ssstwcw                "  end\n"
172df722b01Ssstwcw                "end");
173df722b01Ssstwcw   verifyFormat("while (true) //\n"
174df722b01Ssstwcw                "begin : x\n"
175df722b01Ssstwcw                "  while (true) //\n"
176df722b01Ssstwcw                "  begin : x\n"
177df722b01Ssstwcw                "  end : x\n"
178df722b01Ssstwcw                "end : x");
179df722b01Ssstwcw   verifyFormat("while (true) //\n"
180df722b01Ssstwcw                "fork\n"
181df722b01Ssstwcw                "  while (true) //\n"
182df722b01Ssstwcw                "  fork\n"
183df722b01Ssstwcw                "  join\n"
184df722b01Ssstwcw                "join");
185df722b01Ssstwcw   auto Style = getDefaultStyle();
186df722b01Ssstwcw   Style.ColumnLimit = 17;
187df722b01Ssstwcw   verifyFormat("while (true)\n"
188df722b01Ssstwcw                "begin\n"
189df722b01Ssstwcw                "  while (true)\n"
190df722b01Ssstwcw                "  begin\n"
191df722b01Ssstwcw                "  end\n"
192df722b01Ssstwcw                "end",
193df722b01Ssstwcw                "while (true) begin\n"
194df722b01Ssstwcw                "  while (true) begin"
195df722b01Ssstwcw                "  end\n"
196df722b01Ssstwcw                "end",
197df722b01Ssstwcw                Style);
19867480b36Ssstwcw }
19967480b36Ssstwcw 
200c8871948Ssstwcw TEST_F(FormatTestVerilog, Case) {
201c8871948Ssstwcw   verifyFormat("case (data)\n"
202c8871948Ssstwcw                "endcase");
203c8871948Ssstwcw   verifyFormat("casex (data)\n"
204c8871948Ssstwcw                "endcase");
205c8871948Ssstwcw   verifyFormat("casez (data)\n"
206c8871948Ssstwcw                "endcase");
207c8871948Ssstwcw   verifyFormat("case (data) inside\n"
208c8871948Ssstwcw                "endcase");
209c8871948Ssstwcw   verifyFormat("case (data)\n"
210c8871948Ssstwcw                "  16'd0:\n"
211c8871948Ssstwcw                "    result = 10'b0111111111;\n"
212c8871948Ssstwcw                "endcase");
213c8871948Ssstwcw   verifyFormat("case (data)\n"
214c8871948Ssstwcw                "  xxxxxxxx:\n"
215c8871948Ssstwcw                "    result = 10'b0111111111;\n"
216c8871948Ssstwcw                "endcase");
217c8871948Ssstwcw   // Test labels with multiple options.
218c8871948Ssstwcw   verifyFormat("case (data)\n"
219c8871948Ssstwcw                "  16'd0, 16'd1:\n"
220c8871948Ssstwcw                "    result = 10'b0111111111;\n"
221c8871948Ssstwcw                "endcase");
222c8871948Ssstwcw   verifyFormat("case (data)\n"
223c8871948Ssstwcw                "  16'd0, //\n"
224c8871948Ssstwcw                "      16'd1:\n"
225c8871948Ssstwcw                "    result = 10'b0111111111;\n"
226c8871948Ssstwcw                "endcase");
227c8871948Ssstwcw   // Test that blocks following labels are indented.
228c8871948Ssstwcw   verifyFormat("case (data)\n"
229c8871948Ssstwcw                "  16'd1: fork\n"
230c8871948Ssstwcw                "    result = 10'b1011111111;\n"
231c8871948Ssstwcw                "  join\n"
2326c3bc910SOwen Pan                "endcase");
233c8871948Ssstwcw   verifyFormat("case (data)\n"
234c8871948Ssstwcw                "  16'd1: fork : x\n"
235c8871948Ssstwcw                "    result = 10'b1011111111;\n"
236c8871948Ssstwcw                "  join : x\n"
2376c3bc910SOwen Pan                "endcase");
238c8871948Ssstwcw   // Test default.
239c8871948Ssstwcw   verifyFormat("case (data)\n"
240c8871948Ssstwcw                "  default\n"
241c8871948Ssstwcw                "    result = 10'b1011111111;\n"
242c8871948Ssstwcw                "endcase");
243c8871948Ssstwcw   verifyFormat("case (data)\n"
244c8871948Ssstwcw                "  default:\n"
245c8871948Ssstwcw                "    result = 10'b1011111111;\n"
246c8871948Ssstwcw                "endcase");
247c8871948Ssstwcw   // Test that question marks and colons don't get mistaken as labels.
248c8871948Ssstwcw   verifyFormat("case (data)\n"
249c8871948Ssstwcw                "  8'b1???????:\n"
250c8871948Ssstwcw                "    instruction1(ir);\n"
251c8871948Ssstwcw                "endcase");
252c8871948Ssstwcw   verifyFormat("case (data)\n"
253c8871948Ssstwcw                "  x ? 8'b1??????? : 1:\n"
254c8871948Ssstwcw                "    instruction3(ir);\n"
255c8871948Ssstwcw                "endcase");
256c8871948Ssstwcw   // Test indention options.
2576cef3254Ssstwcw   auto Style = getDefaultStyle();
258c8871948Ssstwcw   Style.IndentCaseLabels = false;
259c8871948Ssstwcw   verifyFormat("case (data)\n"
260c8871948Ssstwcw                "16'd0:\n"
261c8871948Ssstwcw                "  result = 10'b0111111111;\n"
262c8871948Ssstwcw                "endcase",
263c8871948Ssstwcw                Style);
264c8871948Ssstwcw   verifyFormat("case (data)\n"
265c8871948Ssstwcw                "16'd0: begin\n"
266c8871948Ssstwcw                "  result = 10'b0111111111;\n"
267c8871948Ssstwcw                "end\n"
268c8871948Ssstwcw                "endcase",
269c8871948Ssstwcw                Style);
270c8871948Ssstwcw   Style.IndentCaseLabels = true;
271c8871948Ssstwcw   verifyFormat("case (data)\n"
272c8871948Ssstwcw                "  16'd0:\n"
273c8871948Ssstwcw                "    result = 10'b0111111111;\n"
274c8871948Ssstwcw                "endcase",
275c8871948Ssstwcw                Style);
276c8871948Ssstwcw   verifyFormat("case (data)\n"
277c8871948Ssstwcw                "  16'd0: begin\n"
278c8871948Ssstwcw                "    result = 10'b0111111111;\n"
279c8871948Ssstwcw                "  end\n"
280c8871948Ssstwcw                "endcase",
281c8871948Ssstwcw                Style);
282b688b58fSsstwcw   // Other colons should not be mistaken as case colons.
2836cef3254Ssstwcw   Style = getDefaultStyle();
284b688b58fSsstwcw   Style.BitFieldColonSpacing = FormatStyle::BFCS_None;
285b688b58fSsstwcw   verifyFormat("case (x[1:0])\n"
286b688b58fSsstwcw                "endcase",
287b688b58fSsstwcw                Style);
288b688b58fSsstwcw   verifyFormat("default:\n"
289b688b58fSsstwcw                "  x[1:0] = x[1:0];",
290b688b58fSsstwcw                Style);
291b688b58fSsstwcw   Style.BitFieldColonSpacing = FormatStyle::BFCS_Both;
292b688b58fSsstwcw   verifyFormat("case (x[1 : 0])\n"
293b688b58fSsstwcw                "endcase",
294b688b58fSsstwcw                Style);
295b688b58fSsstwcw   verifyFormat("default:\n"
296b688b58fSsstwcw                "  x[1 : 0] = x[1 : 0];",
297b688b58fSsstwcw                Style);
2986cef3254Ssstwcw   Style = getDefaultStyle();
299b688b58fSsstwcw   Style.SpacesInContainerLiterals = true;
300b688b58fSsstwcw   verifyFormat("case ('{x : x, default : 9})\n"
301b688b58fSsstwcw                "endcase",
302b688b58fSsstwcw                Style);
3036c3bc910SOwen Pan   verifyFormat("x = '{x : x, default : 9};", Style);
304b688b58fSsstwcw   verifyFormat("default:\n"
3056c3bc910SOwen Pan                "  x = '{x : x, default : 9};",
306b688b58fSsstwcw                Style);
307b688b58fSsstwcw   Style.SpacesInContainerLiterals = false;
308b688b58fSsstwcw   verifyFormat("case ('{x: x, default: 9})\n"
309b688b58fSsstwcw                "endcase",
310b688b58fSsstwcw                Style);
3116c3bc910SOwen Pan   verifyFormat("x = '{x: x, default: 9};", Style);
312b688b58fSsstwcw   verifyFormat("default:\n"
3136c3bc910SOwen Pan                "  x = '{x: x, default: 9};",
314b688b58fSsstwcw                Style);
31500e794b4Ssstwcw   // When the line following the case label needs to be broken, the continuation
31600e794b4Ssstwcw   // should be indented correctly.
31700e794b4Ssstwcw   verifyFormat("case (data)\n"
31800e794b4Ssstwcw                "  16'd0:\n"
31900e794b4Ssstwcw                "    result = //\n"
32000e794b4Ssstwcw                "        10'b0111111111;\n"
32100e794b4Ssstwcw                "endcase");
32200e794b4Ssstwcw   verifyFormat("case (data)\n"
32300e794b4Ssstwcw                "  16'd0, //\n"
32400e794b4Ssstwcw                "      16'd1:\n"
32500e794b4Ssstwcw                "    result = //\n"
32600e794b4Ssstwcw                "        10'b0111111111;\n"
32700e794b4Ssstwcw                "endcase");
32800e794b4Ssstwcw   verifyFormat("case (data)\n"
32900e794b4Ssstwcw                "  16'd0:\n"
33000e794b4Ssstwcw                "    result = (10'b0111111111 + //\n"
33100e794b4Ssstwcw                "              10'b0111111111 + //\n"
33200e794b4Ssstwcw                "              10'b0111111111);\n"
33300e794b4Ssstwcw                "endcase");
33400e794b4Ssstwcw   verifyFormat("case (data)\n"
33500e794b4Ssstwcw                "  16'd0:\n"
33600e794b4Ssstwcw                "    result =              //\n"
33700e794b4Ssstwcw                "        (10'b0111111111 + //\n"
33800e794b4Ssstwcw                "         10'b0111111111 + //\n"
33900e794b4Ssstwcw                "         10'b0111111111);\n"
34000e794b4Ssstwcw                "endcase");
34100e794b4Ssstwcw   verifyFormat("case (data)\n"
34200e794b4Ssstwcw                "  16'd0:\n"
34300e794b4Ssstwcw                "    result =          //\n"
34400e794b4Ssstwcw                "        longfunction( //\n"
34500e794b4Ssstwcw                "            arg);\n"
34600e794b4Ssstwcw                "endcase");
3479fa2d74bSsstwcw   verifyFormat("case (data)\n"
3489fa2d74bSsstwcw                "  16'd0:\n"
3499fa2d74bSsstwcw                "    //\n"
3509fa2d74bSsstwcw                "    result = //\n"
3519fa2d74bSsstwcw                "        10'b0111111111;\n"
3529fa2d74bSsstwcw                "endcase");
3539fa2d74bSsstwcw   verifyFormat("case (data)\n"
3549fa2d74bSsstwcw                "  16'd0:\n"
3559fa2d74bSsstwcw                "    //\n"
3569fa2d74bSsstwcw                "\n"
3579fa2d74bSsstwcw                "    //\n"
3589fa2d74bSsstwcw                "    result = //\n"
3599fa2d74bSsstwcw                "        10'b0111111111;\n"
3609fa2d74bSsstwcw                "endcase");
36100e794b4Ssstwcw   Style = getDefaultStyle();
36200e794b4Ssstwcw   Style.ContinuationIndentWidth = 1;
36300e794b4Ssstwcw   verifyFormat("case (data)\n"
36400e794b4Ssstwcw                "  16'd0:\n"
36500e794b4Ssstwcw                "    result = //\n"
36600e794b4Ssstwcw                "     10'b0111111111;\n"
36700e794b4Ssstwcw                "endcase",
36800e794b4Ssstwcw                Style);
36900e794b4Ssstwcw   verifyFormat("case (data)\n"
37000e794b4Ssstwcw                "  16'd0:\n"
37100e794b4Ssstwcw                "    result =       //\n"
37200e794b4Ssstwcw                "     longfunction( //\n"
37300e794b4Ssstwcw                "      arg);\n"
37400e794b4Ssstwcw                "endcase",
37500e794b4Ssstwcw                Style);
376b3e80d8eSsstwcw 
377b3e80d8eSsstwcw   verifyFormat("case (v) matches\n"
378b3e80d8eSsstwcw                "  tagged Valid .n:\n"
379b3e80d8eSsstwcw                "    ;\n"
380b3e80d8eSsstwcw                "endcase");
381c8871948Ssstwcw }
382c8871948Ssstwcw 
383a1f8bab9Ssstwcw TEST_F(FormatTestVerilog, Coverage) {
384a1f8bab9Ssstwcw   verifyFormat("covergroup x\n"
385a1f8bab9Ssstwcw                "    @@(begin x);\n"
386a1f8bab9Ssstwcw                "endgroup");
387a1f8bab9Ssstwcw }
388a1f8bab9Ssstwcw 
3896e473aefSsstwcw TEST_F(FormatTestVerilog, Declaration) {
3906e473aefSsstwcw   verifyFormat("wire mynet;");
3916e473aefSsstwcw   verifyFormat("wire mynet, mynet1;");
3926e473aefSsstwcw   verifyFormat("wire mynet, //\n"
3936e473aefSsstwcw                "     mynet1;");
394ef18986bSsstwcw   verifyFormat("wire #0 mynet, mynet1;");
395ef18986bSsstwcw   verifyFormat("wire logic #0 mynet, mynet1;");
396ef18986bSsstwcw   verifyFormat("wire #(1, 2, 3) mynet, mynet1;");
397ef18986bSsstwcw   verifyFormat("wire #0 mynet, //\n"
398ef18986bSsstwcw                "        mynet1;");
399ef18986bSsstwcw   verifyFormat("wire logic #0 mynet, //\n"
400ef18986bSsstwcw                "              mynet1;");
401ef18986bSsstwcw   verifyFormat("wire #(1, 2, 3) mynet, //\n"
402ef18986bSsstwcw                "                mynet1;");
4036e473aefSsstwcw   verifyFormat("wire mynet = enable;");
4046e473aefSsstwcw   verifyFormat("wire mynet = enable, mynet1;");
4056e473aefSsstwcw   verifyFormat("wire mynet = enable, //\n"
4066e473aefSsstwcw                "     mynet1;");
4076e473aefSsstwcw   verifyFormat("wire mynet, mynet1 = enable;");
4086e473aefSsstwcw   verifyFormat("wire mynet, //\n"
4096e473aefSsstwcw                "     mynet1 = enable;");
4106e473aefSsstwcw   verifyFormat("wire mynet = enable, mynet1 = enable;");
4116e473aefSsstwcw   verifyFormat("wire mynet = enable, //\n"
4126e473aefSsstwcw                "     mynet1 = enable;");
4136e473aefSsstwcw   verifyFormat("wire (strong1, pull0) mynet;");
4146e473aefSsstwcw   verifyFormat("wire (strong1, pull0) mynet, mynet1;");
4156e473aefSsstwcw   verifyFormat("wire (strong1, pull0) mynet, //\n"
4166e473aefSsstwcw                "                      mynet1;");
4176e473aefSsstwcw   verifyFormat("wire (strong1, pull0) mynet = enable;");
4186e473aefSsstwcw   verifyFormat("wire (strong1, pull0) mynet = enable, mynet1;");
4196e473aefSsstwcw   verifyFormat("wire (strong1, pull0) mynet = enable, //\n"
4206e473aefSsstwcw                "                      mynet1;");
4216e473aefSsstwcw   verifyFormat("wire (strong1, pull0) mynet, mynet1 = enable;");
4226e473aefSsstwcw   verifyFormat("wire (strong1, pull0) mynet, //\n"
4236e473aefSsstwcw                "                      mynet1 = enable;");
4246e473aefSsstwcw }
4256e473aefSsstwcw 
4262e32ff10Ssstwcw TEST_F(FormatTestVerilog, Delay) {
4272e32ff10Ssstwcw   // Delay by the default unit.
4282e32ff10Ssstwcw   verifyFormat("#0;");
4292e32ff10Ssstwcw   verifyFormat("#1;");
4302e32ff10Ssstwcw   verifyFormat("#10;");
4312e32ff10Ssstwcw   verifyFormat("#1.5;");
4322e32ff10Ssstwcw   // Explicit unit.
4332e32ff10Ssstwcw   verifyFormat("#1fs;");
4342e32ff10Ssstwcw   verifyFormat("#1.5fs;");
4352e32ff10Ssstwcw   verifyFormat("#1ns;");
4362e32ff10Ssstwcw   verifyFormat("#1.5ns;");
4372e32ff10Ssstwcw   verifyFormat("#1us;");
4382e32ff10Ssstwcw   verifyFormat("#1.5us;");
4392e32ff10Ssstwcw   verifyFormat("#1ms;");
4402e32ff10Ssstwcw   verifyFormat("#1.5ms;");
4412e32ff10Ssstwcw   verifyFormat("#1s;");
4422e32ff10Ssstwcw   verifyFormat("#1.5s;");
4432e32ff10Ssstwcw   // The following expression should be on the same line.
4442e32ff10Ssstwcw   verifyFormat("#1 x = x;");
4456cef3254Ssstwcw   verifyFormat("#1 x = x;", "#1\n"
4466cef3254Ssstwcw                             "x = x;");
4472e32ff10Ssstwcw }
4482e32ff10Ssstwcw 
44992b2be39Ssstwcw TEST_F(FormatTestVerilog, Enum) {
45092b2be39Ssstwcw   verifyFormat("enum { x } x;");
45192b2be39Ssstwcw   verifyFormat("typedef enum { x } x;");
45292b2be39Ssstwcw   verifyFormat("enum { red, yellow, green } x;");
45392b2be39Ssstwcw   verifyFormat("typedef enum { red, yellow, green } x;");
45492b2be39Ssstwcw   verifyFormat("enum integer { x } x;");
45592b2be39Ssstwcw   verifyFormat("typedef enum { x = 0 } x;");
45692b2be39Ssstwcw   verifyFormat("typedef enum { red = 0, yellow = 1, green = 2 } x;");
45792b2be39Ssstwcw   verifyFormat("typedef enum integer { x } x;");
45892b2be39Ssstwcw   verifyFormat("typedef enum bit [0 : 1] { x } x;");
45992b2be39Ssstwcw   verifyFormat("typedef enum { add = 10, sub[5], jmp[6 : 8] } E1;");
46092b2be39Ssstwcw   verifyFormat("typedef enum { add = 10, sub[5] = 0, jmp[6 : 8] = 1 } E1;");
46192b2be39Ssstwcw }
46292b2be39Ssstwcw 
4636e473aefSsstwcw TEST_F(FormatTestVerilog, Headers) {
4646e473aefSsstwcw   // Test headers with multiple ports.
4656e473aefSsstwcw   verifyFormat("module mh1\n"
4666e473aefSsstwcw                "    (input var int in1,\n"
4676e473aefSsstwcw                "     input var shortreal in2,\n"
4686e473aefSsstwcw                "     output tagged_st out);\n"
4696e473aefSsstwcw                "endmodule");
4704134f836Ssstwcw   // There should be a space following the type but not the variable name.
4714134f836Ssstwcw   verifyFormat("module test\n"
4724134f836Ssstwcw                "    (input wire [7 : 0] a,\n"
4734134f836Ssstwcw                "     input wire b[7 : 0],\n"
4744134f836Ssstwcw                "     input wire [7 : 0] c[7 : 0]);\n"
4754134f836Ssstwcw                "endmodule");
4766e473aefSsstwcw   // Ports should be grouped by types.
4776e473aefSsstwcw   verifyFormat("module test\n"
4786e473aefSsstwcw                "    (input [7 : 0] a,\n"
4796e473aefSsstwcw                "     input signed [7 : 0] b, c, d);\n"
4806e473aefSsstwcw                "endmodule");
4816e473aefSsstwcw   verifyFormat("module test\n"
4826e473aefSsstwcw                "    (input [7 : 0] a,\n"
4836e473aefSsstwcw                "     (* x = x *) input signed [7 : 0] b, c, d);\n"
4846e473aefSsstwcw                "endmodule");
4856e473aefSsstwcw   verifyFormat("module test\n"
4866e473aefSsstwcw                "    (input [7 : 0] a = 0,\n"
4876e473aefSsstwcw                "     input signed [7 : 0] b = 0, c = 0, d = 0);\n"
4886e473aefSsstwcw                "endmodule");
4896e473aefSsstwcw   verifyFormat("module test\n"
4906e473aefSsstwcw                "    #(parameter x)\n"
4916e473aefSsstwcw                "    (input [7 : 0] a,\n"
4926e473aefSsstwcw                "     input signed [7 : 0] b, c, d);\n"
4936e473aefSsstwcw                "endmodule");
4946e473aefSsstwcw   // When a line needs to be broken, ports of the same type should be aligned to
4956e473aefSsstwcw   // the same column.
4966e473aefSsstwcw   verifyFormat("module test\n"
4976e473aefSsstwcw                "    (input signed [7 : 0] b, c, //\n"
4986e473aefSsstwcw                "                          d);\n"
4996e473aefSsstwcw                "endmodule");
5006e473aefSsstwcw   verifyFormat("module test\n"
5016e473aefSsstwcw                "    ((* x = x *) input signed [7 : 0] b, c, //\n"
5026e473aefSsstwcw                "                                      d);\n"
5036e473aefSsstwcw                "endmodule");
5046e473aefSsstwcw   verifyFormat("module test\n"
5056e473aefSsstwcw                "    (input signed [7 : 0] b = 0, c, //\n"
5066e473aefSsstwcw                "                          d);\n"
5076e473aefSsstwcw                "endmodule");
5086e473aefSsstwcw   verifyFormat("module test\n"
5096e473aefSsstwcw                "    (input signed [7 : 0] b, c = 0, //\n"
5106e473aefSsstwcw                "                          d);\n"
5116e473aefSsstwcw                "endmodule");
5126e473aefSsstwcw   verifyFormat("module test\n"
5136e473aefSsstwcw                "    (input signed [7 : 0] b, c, //\n"
5146e473aefSsstwcw                "                          d = 0);\n"
5156e473aefSsstwcw                "endmodule");
5166e473aefSsstwcw   verifyFormat("module test\n"
5176e473aefSsstwcw                "    (input wire logic signed [7 : 0][0 : 1] b, c, //\n"
5186e473aefSsstwcw                "                                            d);\n"
5196e473aefSsstwcw                "endmodule");
5206e473aefSsstwcw   verifyFormat("module test\n"
5216e473aefSsstwcw                "    (input signed [7 : 0] b, //\n"
5226e473aefSsstwcw                "                          c, //\n"
5236e473aefSsstwcw                "                          d);\n"
5246e473aefSsstwcw                "endmodule");
5256e473aefSsstwcw   verifyFormat("module test\n"
5266e473aefSsstwcw                "    (input [7 : 0] a,\n"
5276e473aefSsstwcw                "     input signed [7 : 0] b, //\n"
5286e473aefSsstwcw                "                          c, //\n"
5296e473aefSsstwcw                "                          d);\n"
5306e473aefSsstwcw                "endmodule");
5316e473aefSsstwcw   verifyFormat("module test\n"
5326e473aefSsstwcw                "    (input signed [7 : 0] b, //\n"
5336e473aefSsstwcw                "                          c, //\n"
5346e473aefSsstwcw                "                          d,\n"
5356e473aefSsstwcw                "     output signed [7 : 0] h);\n"
5366e473aefSsstwcw                "endmodule");
5376e473aefSsstwcw   // With a modport.
5386e473aefSsstwcw   verifyFormat("module m\n"
5396e473aefSsstwcw                "    (i2.master i);\n"
5406e473aefSsstwcw                "endmodule");
5416e473aefSsstwcw   verifyFormat("module m\n"
5426e473aefSsstwcw                "    (i2.master i, ii);\n"
5436e473aefSsstwcw                "endmodule");
5446e473aefSsstwcw   verifyFormat("module m\n"
5456e473aefSsstwcw                "    (i2.master i, //\n"
5466e473aefSsstwcw                "               ii);\n"
5476e473aefSsstwcw                "endmodule");
5486e473aefSsstwcw   verifyFormat("module m\n"
5496e473aefSsstwcw                "    (i2.master i,\n"
5506e473aefSsstwcw                "     input ii);\n"
5516e473aefSsstwcw                "endmodule");
5526e473aefSsstwcw   verifyFormat("module m\n"
5536e473aefSsstwcw                "    (i2::i2.master i);\n"
5546e473aefSsstwcw                "endmodule");
5556e473aefSsstwcw   verifyFormat("module m\n"
5566e473aefSsstwcw                "    (i2::i2.master i, ii);\n"
5576e473aefSsstwcw                "endmodule");
5586e473aefSsstwcw   verifyFormat("module m\n"
5596e473aefSsstwcw                "    (i2::i2.master i, //\n"
5606e473aefSsstwcw                "                   ii);\n"
5616e473aefSsstwcw                "endmodule");
5626e473aefSsstwcw   verifyFormat("module m\n"
5636e473aefSsstwcw                "    (i2::i2.master i,\n"
5646e473aefSsstwcw                "     input ii);\n"
5656e473aefSsstwcw                "endmodule");
5666e473aefSsstwcw   verifyFormat("module m\n"
5676e473aefSsstwcw                "    (i2::i2 i);\n"
5686e473aefSsstwcw                "endmodule");
5696e473aefSsstwcw   verifyFormat("module m\n"
5706e473aefSsstwcw                "    (i2::i2 i, ii);\n"
5716e473aefSsstwcw                "endmodule");
5726e473aefSsstwcw   verifyFormat("module m\n"
5736e473aefSsstwcw                "    (i2::i2 i, //\n"
5746e473aefSsstwcw                "            ii);\n"
5756e473aefSsstwcw                "endmodule");
5766e473aefSsstwcw   verifyFormat("module m\n"
5776e473aefSsstwcw                "    (i2::i2 i,\n"
5786e473aefSsstwcw                "     input ii);\n"
5796e473aefSsstwcw                "endmodule");
5806e473aefSsstwcw   // With a macro in the names.
5816e473aefSsstwcw   verifyFormat("module m\n"
5826e473aefSsstwcw                "    (input var `x a, b);\n"
5836e473aefSsstwcw                "endmodule");
5846e473aefSsstwcw   verifyFormat("module m\n"
5856e473aefSsstwcw                "    (input var `x a, //\n"
5866e473aefSsstwcw                "                  b);\n"
5876e473aefSsstwcw                "endmodule");
5886e473aefSsstwcw   verifyFormat("module m\n"
5896e473aefSsstwcw                "    (input var x `a, b);\n"
5906e473aefSsstwcw                "endmodule");
5916e473aefSsstwcw   verifyFormat("module m\n"
5926e473aefSsstwcw                "    (input var x `a, //\n"
5936e473aefSsstwcw                "                 b);\n"
5946e473aefSsstwcw                "endmodule");
595369e8762Ssstwcw   // A line comment shouldn't disrupt the indentation of the port list.
596369e8762Ssstwcw   verifyFormat("extern module x\n"
597369e8762Ssstwcw                "    (//\n"
598369e8762Ssstwcw                "     output y);");
599369e8762Ssstwcw   verifyFormat("extern module x\n"
600369e8762Ssstwcw                "    #(//\n"
601369e8762Ssstwcw                "      parameter x)\n"
602369e8762Ssstwcw                "    (//\n"
603369e8762Ssstwcw                "     output y);");
6046e473aefSsstwcw   // With a concatenation in the names.
6056cef3254Ssstwcw   auto Style = getDefaultStyle();
6066e473aefSsstwcw   Style.ColumnLimit = 40;
6076e473aefSsstwcw   verifyFormat("`define X(x)                           \\\n"
6086e473aefSsstwcw                "  module test                          \\\n"
6096e473aefSsstwcw                "      (input var x``x a, b);",
6106e473aefSsstwcw                Style);
6116e473aefSsstwcw   verifyFormat("`define X(x)                           \\\n"
6126e473aefSsstwcw                "  module test                          \\\n"
6136e473aefSsstwcw                "      (input var x``x aaaaaaaaaaaaaaa, \\\n"
6146e473aefSsstwcw                "                      b);",
6156e473aefSsstwcw                Style);
6166e473aefSsstwcw   verifyFormat("`define X(x)                           \\\n"
6176e473aefSsstwcw                "  module test                          \\\n"
6186e473aefSsstwcw                "      (input var x a``x, b);",
6196e473aefSsstwcw                Style);
6206e473aefSsstwcw   verifyFormat("`define X(x)                           \\\n"
6216e473aefSsstwcw                "  module test                          \\\n"
6226e473aefSsstwcw                "      (input var x aaaaaaaaaaaaaaa``x, \\\n"
6236e473aefSsstwcw                "                   b);",
6246e473aefSsstwcw                Style);
625e3acfbc4Ssstwcw   // When the ports line is not to be formatted, following lines should not take
626e3acfbc4Ssstwcw   // on its indentation.
627e3acfbc4Ssstwcw   verifyFormat("module x\n"
628e3acfbc4Ssstwcw                "    (output x);\n"
629e3acfbc4Ssstwcw                "  assign x = 0;\n"
630e3acfbc4Ssstwcw                "endmodule",
631e3acfbc4Ssstwcw                "module x\n"
632e3acfbc4Ssstwcw                "    (output x);\n"
633e3acfbc4Ssstwcw                "    assign x = 0;\n"
634e3acfbc4Ssstwcw                "endmodule",
635e3acfbc4Ssstwcw                getDefaultStyle(), {tooling::Range(25, 18)});
6366e473aefSsstwcw }
6376e473aefSsstwcw 
6386db0c18bSsstwcw TEST_F(FormatTestVerilog, Hierarchy) {
6396db0c18bSsstwcw   verifyFormat("module x;\n"
6406db0c18bSsstwcw                "endmodule");
6416db0c18bSsstwcw   // Test that the end label is on the same line as the end keyword.
6426db0c18bSsstwcw   verifyFormat("module x;\n"
6436db0c18bSsstwcw                "endmodule : x");
6446db0c18bSsstwcw   // Test that things inside are indented.
6456db0c18bSsstwcw   verifyFormat("module x;\n"
6466db0c18bSsstwcw                "  generate\n"
6476db0c18bSsstwcw                "  endgenerate\n"
6486db0c18bSsstwcw                "endmodule");
6496db0c18bSsstwcw   verifyFormat("program x;\n"
6506db0c18bSsstwcw                "  generate\n"
6516db0c18bSsstwcw                "  endgenerate\n"
6526db0c18bSsstwcw                "endprogram");
6536db0c18bSsstwcw   verifyFormat("interface x;\n"
6546db0c18bSsstwcw                "  generate\n"
6556db0c18bSsstwcw                "  endgenerate\n"
6566db0c18bSsstwcw                "endinterface");
6576db0c18bSsstwcw   verifyFormat("task x;\n"
6586db0c18bSsstwcw                "  generate\n"
6596db0c18bSsstwcw                "  endgenerate\n"
6606db0c18bSsstwcw                "endtask");
6616db0c18bSsstwcw   verifyFormat("function x;\n"
6626db0c18bSsstwcw                "  generate\n"
6636db0c18bSsstwcw                "  endgenerate\n"
6646db0c18bSsstwcw                "endfunction");
6656db0c18bSsstwcw   verifyFormat("class x;\n"
6666db0c18bSsstwcw                "  generate\n"
6676db0c18bSsstwcw                "  endgenerate\n"
6686db0c18bSsstwcw                "endclass");
6696db0c18bSsstwcw   // Test that they nest.
6706db0c18bSsstwcw   verifyFormat("module x;\n"
6716db0c18bSsstwcw                "  program x;\n"
6726db0c18bSsstwcw                "    program x;\n"
6736db0c18bSsstwcw                "    endprogram\n"
6746db0c18bSsstwcw                "  endprogram\n"
6756db0c18bSsstwcw                "endmodule");
6766db0c18bSsstwcw   // Test that an extern declaration doesn't change the indentation.
6776db0c18bSsstwcw   verifyFormat("extern module x;\n"
6786db0c18bSsstwcw                "x = x;");
6796db0c18bSsstwcw   // Test complex headers
6806db0c18bSsstwcw   verifyFormat("extern module x\n"
6816db0c18bSsstwcw                "    import x.x::x::*;\n"
6826db0c18bSsstwcw                "    import x;\n"
6836db0c18bSsstwcw                "    #(parameter x)\n"
6846db0c18bSsstwcw                "    (output x);");
6856db0c18bSsstwcw   verifyFormat("module x\n"
6866db0c18bSsstwcw                "    import x.x::x::*;\n"
6876db0c18bSsstwcw                "    import x;\n"
6886db0c18bSsstwcw                "    #(parameter x)\n"
6896db0c18bSsstwcw                "    (output x);\n"
6906db0c18bSsstwcw                "  generate\n"
6916db0c18bSsstwcw                "  endgenerate\n"
6926db0c18bSsstwcw                "endmodule : x");
6936db0c18bSsstwcw   verifyFormat("virtual class x\n"
6946db0c18bSsstwcw                "    (x)\n"
6956db0c18bSsstwcw                "    extends x(x)\n"
6966db0c18bSsstwcw                "    implements x, x, x;\n"
6976db0c18bSsstwcw                "  generate\n"
6986db0c18bSsstwcw                "  endgenerate\n"
6996c3bc910SOwen Pan                "endclass : x");
7006db0c18bSsstwcw   verifyFormat("function automatic logic [1 : 0] x\n"
7016db0c18bSsstwcw                "    (input x);\n"
7026db0c18bSsstwcw                "  generate\n"
7036db0c18bSsstwcw                "  endgenerate\n"
7046db0c18bSsstwcw                "endfunction : x");
705*0ff8b791Ssstwcw   // Type names with '::' should be recognized.
706*0ff8b791Ssstwcw   verifyFormat("function automatic x::x x\n"
707*0ff8b791Ssstwcw                "    (input x);\n"
708*0ff8b791Ssstwcw                "endfunction : x");
709*0ff8b791Ssstwcw   // Names having to do macros should be recognized.
710*0ff8b791Ssstwcw   verifyFormat("function automatic x::x x``x\n"
711*0ff8b791Ssstwcw                "    (input x);\n"
712*0ff8b791Ssstwcw                "endfunction : x");
713*0ff8b791Ssstwcw   verifyFormat("function automatic x::x `x\n"
714*0ff8b791Ssstwcw                "    (input x);\n"
715*0ff8b791Ssstwcw                "endfunction : x");
716*0ff8b791Ssstwcw   verifyNoCrash("x x(x x, x x);");
7176db0c18bSsstwcw }
7186db0c18bSsstwcw 
7196cef3254Ssstwcw TEST_F(FormatTestVerilog, Identifiers) {
7206cef3254Ssstwcw   // Escaped identifiers should not be split.
7216cef3254Ssstwcw   verifyFormat("\\busa+index");
7226cef3254Ssstwcw   verifyFormat("\\-clock");
7236cef3254Ssstwcw   verifyFormat("\\***error-condition***");
7246cef3254Ssstwcw   verifyFormat("\\net1\\/net2");
7256cef3254Ssstwcw   verifyFormat("\\{a,b}");
7266cef3254Ssstwcw   verifyFormat("\\a*(b+c)");
7276cef3254Ssstwcw   // Escaped identifiers can't be joined with the next token.  Extra space
7286cef3254Ssstwcw   // should be removed.
7296cef3254Ssstwcw   verifyFormat("\\busa+index ;", "\\busa+index\n"
7306cef3254Ssstwcw                                  ";");
7316cef3254Ssstwcw   verifyFormat("\\busa+index ;", "\\busa+index\r\n"
7326cef3254Ssstwcw                                  ";");
7336cef3254Ssstwcw   verifyFormat("\\busa+index ;", "\\busa+index  ;");
7346cef3254Ssstwcw   verifyFormat("\\busa+index ;", "\\busa+index\n"
7356cef3254Ssstwcw                                  " ;");
7366cef3254Ssstwcw   verifyFormat("\\busa+index ;");
7376cef3254Ssstwcw   verifyFormat("(\\busa+index );");
7386cef3254Ssstwcw   verifyFormat("\\busa+index \\busa+index ;");
7396cef3254Ssstwcw }
7406cef3254Ssstwcw 
7419ed2e68cSsstwcw TEST_F(FormatTestVerilog, If) {
7429ed2e68cSsstwcw   verifyFormat("if (x)\n"
7439ed2e68cSsstwcw                "  x = x;");
74460e12068Ssstwcw   verifyFormat("unique if (x)\n"
74560e12068Ssstwcw                "  x = x;");
74660e12068Ssstwcw   verifyFormat("unique0 if (x)\n"
74760e12068Ssstwcw                "  x = x;");
74860e12068Ssstwcw   verifyFormat("priority if (x)\n"
74960e12068Ssstwcw                "  x = x;");
7509ed2e68cSsstwcw   verifyFormat("if (x)\n"
7519ed2e68cSsstwcw                "  x = x;\n"
7529ed2e68cSsstwcw                "x = x;");
7539ed2e68cSsstwcw 
7549ed2e68cSsstwcw   // Test else
7559ed2e68cSsstwcw   verifyFormat("if (x)\n"
7569ed2e68cSsstwcw                "  x = x;\n"
7579ed2e68cSsstwcw                "else if (x)\n"
7589ed2e68cSsstwcw                "  x = x;\n"
7599ed2e68cSsstwcw                "else\n"
7609ed2e68cSsstwcw                "  x = x;");
7619ed2e68cSsstwcw   verifyFormat("if (x) begin\n"
7629ed2e68cSsstwcw                "  x = x;\n"
7639ed2e68cSsstwcw                "end else if (x) begin\n"
7649ed2e68cSsstwcw                "  x = x;\n"
7659ed2e68cSsstwcw                "end else begin\n"
7669ed2e68cSsstwcw                "  x = x;\n"
7679ed2e68cSsstwcw                "end");
7689ed2e68cSsstwcw   verifyFormat("if (x) begin : x\n"
7699ed2e68cSsstwcw                "  x = x;\n"
7709ed2e68cSsstwcw                "end : x else if (x) begin : x\n"
7719ed2e68cSsstwcw                "  x = x;\n"
7729ed2e68cSsstwcw                "end : x else begin : x\n"
7739ed2e68cSsstwcw                "  x = x;\n"
7749ed2e68cSsstwcw                "end : x");
7759ed2e68cSsstwcw 
7769ed2e68cSsstwcw   // Test block keywords.
7779ed2e68cSsstwcw   verifyFormat("if (x) begin\n"
7789ed2e68cSsstwcw                "  x = x;\n"
7799ed2e68cSsstwcw                "end");
7809ed2e68cSsstwcw   verifyFormat("if (x) begin : x\n"
7819ed2e68cSsstwcw                "  x = x;\n"
7829ed2e68cSsstwcw                "end : x");
7839ed2e68cSsstwcw   verifyFormat("if (x) begin\n"
7849ed2e68cSsstwcw                "  x = x;\n"
7859ed2e68cSsstwcw                "  x = x;\n"
7869ed2e68cSsstwcw                "end");
7879ed2e68cSsstwcw   verifyFormat("if (x) fork\n"
7889ed2e68cSsstwcw                "  x = x;\n"
7899ed2e68cSsstwcw                "join");
7909ed2e68cSsstwcw   verifyFormat("if (x) fork\n"
7919ed2e68cSsstwcw                "  x = x;\n"
7929ed2e68cSsstwcw                "join_any");
7939ed2e68cSsstwcw   verifyFormat("if (x) fork\n"
7949ed2e68cSsstwcw                "  x = x;\n"
7959ed2e68cSsstwcw                "join_none");
7969ed2e68cSsstwcw   verifyFormat("if (x) generate\n"
7979ed2e68cSsstwcw                "  x = x;\n"
7989ed2e68cSsstwcw                "endgenerate");
7999ed2e68cSsstwcw   verifyFormat("if (x) generate : x\n"
8009ed2e68cSsstwcw                "  x = x;\n"
8019ed2e68cSsstwcw                "endgenerate : x");
8029ed2e68cSsstwcw 
8039ed2e68cSsstwcw   // Test that concatenation braces don't get regarded as blocks.
8049ed2e68cSsstwcw   verifyFormat("if (x)\n"
8059ed2e68cSsstwcw                "  {x} = x;");
8069ed2e68cSsstwcw   verifyFormat("if (x)\n"
8079ed2e68cSsstwcw                "  x = {x};");
8089ed2e68cSsstwcw   verifyFormat("if (x)\n"
8099ed2e68cSsstwcw                "  x = {x};\n"
8109ed2e68cSsstwcw                "else\n"
8119ed2e68cSsstwcw                "  {x} = {x};");
81260e12068Ssstwcw 
81360e12068Ssstwcw   // With attributes.
81460e12068Ssstwcw   verifyFormat("(* x *) if (x)\n"
81560e12068Ssstwcw                "  x = x;");
81660e12068Ssstwcw   verifyFormat("(* x = \"x\" *) if (x)\n"
81760e12068Ssstwcw                "  x = x;");
81860e12068Ssstwcw   verifyFormat("(* x, x = \"x\" *) if (x)\n"
81960e12068Ssstwcw                "  x = x;");
8200571ba8dSsstwcw 
8210571ba8dSsstwcw   // Assert are treated similar to if.  But the else parts should not be
8220571ba8dSsstwcw   // chained.
8230571ba8dSsstwcw   verifyFormat("assert (x);");
8240571ba8dSsstwcw   verifyFormat("assert (x)\n"
8250571ba8dSsstwcw                "  $info();");
8260571ba8dSsstwcw   verifyFormat("assert (x)\n"
8270571ba8dSsstwcw                "  $info();\n"
8280571ba8dSsstwcw                "else\n"
8290571ba8dSsstwcw                "  $error();");
8300571ba8dSsstwcw   verifyFormat("assert (x)\n"
8310571ba8dSsstwcw                "else\n"
8320571ba8dSsstwcw                "  $error();");
8330571ba8dSsstwcw   verifyFormat("assert (x)\n"
8340571ba8dSsstwcw                "else begin\n"
8350571ba8dSsstwcw                "end");
8360571ba8dSsstwcw   verifyFormat("assert (x)\n"
8370571ba8dSsstwcw                "else\n"
8380571ba8dSsstwcw                "  if (x)\n"
8390571ba8dSsstwcw                "    $error();");
8400571ba8dSsstwcw   verifyFormat("assert (x)\n"
8410571ba8dSsstwcw                "  $info();\n"
8420571ba8dSsstwcw                "else\n"
8430571ba8dSsstwcw                "  if (x)\n"
8440571ba8dSsstwcw                "    $error();");
8450571ba8dSsstwcw   verifyFormat("assert (x)\n"
8460571ba8dSsstwcw                "  $info();\n"
8470571ba8dSsstwcw                "else\n"
8480571ba8dSsstwcw                "  if (x)\n"
8490571ba8dSsstwcw                "    $error();\n"
8500571ba8dSsstwcw                "  else\n"
8510571ba8dSsstwcw                "    $error();");
8520571ba8dSsstwcw   verifyFormat("assert (x)\n"
8530571ba8dSsstwcw                "  $info();\n"
8540571ba8dSsstwcw                "else\n"
8550571ba8dSsstwcw                "  if (x)\n"
8560571ba8dSsstwcw                "    $error();\n"
8570571ba8dSsstwcw                "  else if (x)\n"
8580571ba8dSsstwcw                "    $error();\n"
8590571ba8dSsstwcw                "  else\n"
8600571ba8dSsstwcw                "    $error();");
8610571ba8dSsstwcw   // The body is optional for asserts.  The next line should not be indented if
8620571ba8dSsstwcw   // the statement already ended with a semicolon.
8630571ba8dSsstwcw   verifyFormat("assert (x);\n"
8640571ba8dSsstwcw                "x = x;");
8650571ba8dSsstwcw   verifyFormat("if (x)\n"
8660571ba8dSsstwcw                "  assert (x);\n"
8670571ba8dSsstwcw                "else if (x) begin\n"
8680571ba8dSsstwcw                "end else begin\n"
8690571ba8dSsstwcw                "end");
8700571ba8dSsstwcw   verifyFormat("if (x)\n"
8710571ba8dSsstwcw                "  assert (x);\n"
8720571ba8dSsstwcw                "else begin\n"
8730571ba8dSsstwcw                "end");
8740571ba8dSsstwcw   verifyFormat("if (x)\n"
8750571ba8dSsstwcw                "  assert (x)\n"
8760571ba8dSsstwcw                "  else begin\n"
8770571ba8dSsstwcw                "  end");
8780571ba8dSsstwcw   // Other keywords.
8790571ba8dSsstwcw   verifyFormat("assume (x)\n"
8800571ba8dSsstwcw                "  $info();");
8810571ba8dSsstwcw   verifyFormat("cover (x)\n"
8820571ba8dSsstwcw                "  $info();");
8830571ba8dSsstwcw   verifyFormat("restrict (x)\n"
8840571ba8dSsstwcw                "  $info();");
8850571ba8dSsstwcw   verifyFormat("assert #0 (x)\n"
8860571ba8dSsstwcw                "  $info();");
8870571ba8dSsstwcw   verifyFormat("assert final (x)\n"
8880571ba8dSsstwcw                "  $info();");
8890571ba8dSsstwcw   verifyFormat("cover #0 (x)\n"
8900571ba8dSsstwcw                "  $info();");
8910571ba8dSsstwcw   verifyFormat("cover final (x)\n"
8920571ba8dSsstwcw                "  $info();");
8930571ba8dSsstwcw 
8940571ba8dSsstwcw   // The space around parentheses options should work.
8950571ba8dSsstwcw   auto Style = getDefaultStyle();
8960571ba8dSsstwcw   verifyFormat("if (x)\n"
8970571ba8dSsstwcw                "  x = x;\n"
8980571ba8dSsstwcw                "else if (x)\n"
8990571ba8dSsstwcw                "  x = x;",
9000571ba8dSsstwcw                Style);
9010571ba8dSsstwcw   verifyFormat("assert (x);", Style);
9020571ba8dSsstwcw   verifyFormat("assert #0 (x);", Style);
9030571ba8dSsstwcw   verifyFormat("assert (x)\n"
9040571ba8dSsstwcw                "else\n"
9050571ba8dSsstwcw                "  if (x)\n"
9060571ba8dSsstwcw                "    x = x;",
9070571ba8dSsstwcw                Style);
908c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Custom;
909c669541cSGedare Bloom   Style.SpacesInParensOptions.InConditionalStatements = true;
9100571ba8dSsstwcw   verifyFormat("if ( x )\n"
9110571ba8dSsstwcw                "  x = x;\n"
9120571ba8dSsstwcw                "else if ( x )\n"
9130571ba8dSsstwcw                "  x = x;",
9140571ba8dSsstwcw                Style);
9150571ba8dSsstwcw   verifyFormat("assert ( x );", Style);
9160571ba8dSsstwcw   verifyFormat("assert #0 ( x );", Style);
9170571ba8dSsstwcw   verifyFormat("assert ( x )\n"
9180571ba8dSsstwcw                "else\n"
9190571ba8dSsstwcw                "  if ( x )\n"
9200571ba8dSsstwcw                "    x = x;",
9210571ba8dSsstwcw                Style);
9229ed2e68cSsstwcw }
9239ed2e68cSsstwcw 
92474cc4389Ssstwcw TEST_F(FormatTestVerilog, Instantiation) {
92574cc4389Ssstwcw   // Without ports.
92674cc4389Ssstwcw   verifyFormat("ffnand ff1;");
92774cc4389Ssstwcw   // With named ports.
92874cc4389Ssstwcw   verifyFormat("ffnand ff1(.qbar(out1),\n"
92974cc4389Ssstwcw                "           .clear(in1),\n"
93074cc4389Ssstwcw                "           .preset(in2));");
93174cc4389Ssstwcw   // With wildcard.
93274cc4389Ssstwcw   verifyFormat("ffnand ff1(.qbar(out1),\n"
93374cc4389Ssstwcw                "           .clear(in1),\n"
93474cc4389Ssstwcw                "           .preset(in2),\n"
93574cc4389Ssstwcw                "           .*);");
93674cc4389Ssstwcw   verifyFormat("ffnand ff1(.*,\n"
93774cc4389Ssstwcw                "           .qbar(out1),\n"
93874cc4389Ssstwcw                "           .clear(in1),\n"
93974cc4389Ssstwcw                "           .preset(in2));");
94074cc4389Ssstwcw   // With unconnected ports.
94174cc4389Ssstwcw   verifyFormat("ffnand ff1(.q(),\n"
94274cc4389Ssstwcw                "           .qbar(out1),\n"
94374cc4389Ssstwcw                "           .clear(in1),\n"
94474cc4389Ssstwcw                "           .preset(in2));");
94574cc4389Ssstwcw   verifyFormat("ffnand ff1(.q(),\n"
94674cc4389Ssstwcw                "           .qbar(),\n"
94774cc4389Ssstwcw                "           .clear(),\n"
94874cc4389Ssstwcw                "           .preset());");
94974cc4389Ssstwcw   verifyFormat("ffnand ff1(,\n"
95074cc4389Ssstwcw                "           .qbar(out1),\n"
95174cc4389Ssstwcw                "           .clear(in1),\n"
95274cc4389Ssstwcw                "           .preset(in2));");
95374cc4389Ssstwcw   // With positional ports.
95474cc4389Ssstwcw   verifyFormat("ffnand ff1(out1,\n"
95574cc4389Ssstwcw                "           in1,\n"
95674cc4389Ssstwcw                "           in2);");
95774cc4389Ssstwcw   verifyFormat("ffnand ff1(,\n"
95874cc4389Ssstwcw                "           out1,\n"
95974cc4389Ssstwcw                "           in1,\n"
96074cc4389Ssstwcw                "           in2);");
96174cc4389Ssstwcw   // Multiple instantiations.
96274cc4389Ssstwcw   verifyFormat("ffnand ff1(.q(),\n"
96374cc4389Ssstwcw                "           .qbar(out1),\n"
96474cc4389Ssstwcw                "           .clear(in1),\n"
96574cc4389Ssstwcw                "           .preset(in2)),\n"
96674cc4389Ssstwcw                "       ff1(.q(),\n"
96774cc4389Ssstwcw                "           .qbar(out1),\n"
96874cc4389Ssstwcw                "           .clear(in1),\n"
96974cc4389Ssstwcw                "           .preset(in2));");
97074cc4389Ssstwcw   verifyFormat("ffnand //\n"
97174cc4389Ssstwcw                "    ff1(.q(),\n"
97274cc4389Ssstwcw                "        .qbar(out1),\n"
97374cc4389Ssstwcw                "        .clear(in1),\n"
97474cc4389Ssstwcw                "        .preset(in2)),\n"
97574cc4389Ssstwcw                "    ff1(.q(),\n"
97674cc4389Ssstwcw                "        .qbar(out1),\n"
97774cc4389Ssstwcw                "        .clear(in1),\n"
97874cc4389Ssstwcw                "        .preset(in2));");
979253ff327Ssstwcw   verifyNoCrash(", ff1();");
98074cc4389Ssstwcw   // With breaking between instance ports disabled.
98174cc4389Ssstwcw   auto Style = getDefaultStyle();
98274cc4389Ssstwcw   Style.VerilogBreakBetweenInstancePorts = false;
98374cc4389Ssstwcw   verifyFormat("ffnand ff1;", Style);
98474cc4389Ssstwcw   verifyFormat("ffnand ff1(.qbar(out1), .clear(in1), .preset(in2), .*);",
98574cc4389Ssstwcw                Style);
98674cc4389Ssstwcw   verifyFormat("ffnand ff1(out1, in1, in2);", Style);
98774cc4389Ssstwcw   verifyFormat("ffnand ff1(.q(), .qbar(out1), .clear(in1), .preset(in2)),\n"
98874cc4389Ssstwcw                "       ff1(.q(), .qbar(out1), .clear(in1), .preset(in2));",
98974cc4389Ssstwcw                Style);
99074cc4389Ssstwcw   verifyFormat("ffnand //\n"
99174cc4389Ssstwcw                "    ff1(.q(), .qbar(out1), .clear(in1), .preset(in2)),\n"
99274cc4389Ssstwcw                "    ff1(.q(), .qbar(out1), .clear(in1), .preset(in2));",
99374cc4389Ssstwcw                Style);
99474cc4389Ssstwcw }
99574cc4389Ssstwcw 
9960571ba8dSsstwcw TEST_F(FormatTestVerilog, Loop) {
9970571ba8dSsstwcw   verifyFormat("foreach (x[x])\n"
9980571ba8dSsstwcw                "  x = x;");
9990571ba8dSsstwcw   verifyFormat("repeat (x)\n"
10000571ba8dSsstwcw                "  x = x;");
10010571ba8dSsstwcw   verifyFormat("foreach (x[x]) begin\n"
10020571ba8dSsstwcw                "end");
10030571ba8dSsstwcw   verifyFormat("repeat (x) begin\n"
10040571ba8dSsstwcw                "end");
10050571ba8dSsstwcw   auto Style = getDefaultStyle();
1006c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Custom;
1007c669541cSGedare Bloom   Style.SpacesInParensOptions.InConditionalStatements = true;
10080571ba8dSsstwcw   verifyFormat("foreach ( x[x] )\n"
10090571ba8dSsstwcw                "  x = x;",
10100571ba8dSsstwcw                Style);
10110571ba8dSsstwcw   verifyFormat("repeat ( x )\n"
10120571ba8dSsstwcw                "  x = x;",
10130571ba8dSsstwcw                Style);
10140571ba8dSsstwcw }
10150571ba8dSsstwcw 
1016f93182a8Ssstwcw TEST_F(FormatTestVerilog, Operators) {
1017f93182a8Ssstwcw   // Test that unary operators are not followed by space.
1018f93182a8Ssstwcw   verifyFormat("x = +x;");
1019f93182a8Ssstwcw   verifyFormat("x = -x;");
1020f93182a8Ssstwcw   verifyFormat("x = !x;");
1021f93182a8Ssstwcw   verifyFormat("x = ~x;");
1022f93182a8Ssstwcw   verifyFormat("x = &x;");
1023f93182a8Ssstwcw   verifyFormat("x = ~&x;");
1024f93182a8Ssstwcw   verifyFormat("x = |x;");
1025f93182a8Ssstwcw   verifyFormat("x = ~|x;");
1026f93182a8Ssstwcw   verifyFormat("x = ^x;");
1027f93182a8Ssstwcw   verifyFormat("x = ~^x;");
1028f93182a8Ssstwcw   verifyFormat("x = ^~x;");
1029f93182a8Ssstwcw   verifyFormat("x = ++x;");
1030f93182a8Ssstwcw   verifyFormat("x = --x;");
1031f93182a8Ssstwcw 
10320e01c3d2Ssstwcw   // Test that `*` and `*>` are binary.
10330e01c3d2Ssstwcw   verifyFormat("x = x * x;");
10340e01c3d2Ssstwcw   verifyFormat("x = (x * x);");
10350e01c3d2Ssstwcw   verifyFormat("(opcode *> o1) = 6.1;");
10360e01c3d2Ssstwcw   verifyFormat("(C, D *> Q) = 18;");
10370e01c3d2Ssstwcw   // The wildcard import is not a binary operator.
10380e01c3d2Ssstwcw   verifyFormat("import p::*;");
10390e01c3d2Ssstwcw 
1040f93182a8Ssstwcw   // Test that operators don't get split.
1041f93182a8Ssstwcw   verifyFormat("x = x++;");
1042f93182a8Ssstwcw   verifyFormat("x = x--;");
1043f93182a8Ssstwcw   verifyFormat("x = x ** x;");
1044f93182a8Ssstwcw   verifyFormat("x = x << x;");
1045f93182a8Ssstwcw   verifyFormat("x = x >> x;");
1046f93182a8Ssstwcw   verifyFormat("x = x <<< x;");
1047f93182a8Ssstwcw   verifyFormat("x = x >>> x;");
1048f93182a8Ssstwcw   verifyFormat("x = x <= x;");
1049f93182a8Ssstwcw   verifyFormat("x = x >= x;");
1050f93182a8Ssstwcw   verifyFormat("x = x == x;");
1051f93182a8Ssstwcw   verifyFormat("x = x != x;");
1052f93182a8Ssstwcw   verifyFormat("x = x === x;");
1053f93182a8Ssstwcw   verifyFormat("x = x !== x;");
1054f93182a8Ssstwcw   verifyFormat("x = x ==? x;");
1055f93182a8Ssstwcw   verifyFormat("x = x !=? x;");
1056f93182a8Ssstwcw   verifyFormat("x = x ~^ x;");
1057f93182a8Ssstwcw   verifyFormat("x = x ^~ x;");
1058f93182a8Ssstwcw   verifyFormat("x = x && x;");
1059f93182a8Ssstwcw   verifyFormat("x = x || x;");
1060f93182a8Ssstwcw   verifyFormat("x = x -> x;");
1061f93182a8Ssstwcw   verifyFormat("x = x <-> x;");
1062f93182a8Ssstwcw   verifyFormat("x += x;");
1063f93182a8Ssstwcw   verifyFormat("x -= x;");
1064f93182a8Ssstwcw   verifyFormat("x *= x;");
1065f93182a8Ssstwcw   verifyFormat("x /= x;");
1066f93182a8Ssstwcw   verifyFormat("x %= x;");
1067f93182a8Ssstwcw   verifyFormat("x &= x;");
1068f93182a8Ssstwcw   verifyFormat("x ^= x;");
1069f93182a8Ssstwcw   verifyFormat("x |= x;");
1070f93182a8Ssstwcw   verifyFormat("x <<= x;");
1071f93182a8Ssstwcw   verifyFormat("x >>= x;");
1072f93182a8Ssstwcw   verifyFormat("x <<<= x;");
1073f93182a8Ssstwcw   verifyFormat("x >>>= x;");
1074f93182a8Ssstwcw   verifyFormat("x <= x;");
1075f93182a8Ssstwcw 
1076f93182a8Ssstwcw   // Test that space is added between operators.
10776cef3254Ssstwcw   verifyFormat("x = x < -x;", "x=x<-x;");
10786cef3254Ssstwcw   verifyFormat("x = x << -x;", "x=x<<-x;");
10796cef3254Ssstwcw   verifyFormat("x = x <<< -x;", "x=x<<<-x;");
10800e01c3d2Ssstwcw 
10810e01c3d2Ssstwcw   // Test that operators that are C++ identifiers get treated as operators.
10820e01c3d2Ssstwcw   verifyFormat("solve s before d;");                       // before
10830e01c3d2Ssstwcw   verifyFormat("binsof(i) intersect {0};");                // intersect
10840e01c3d2Ssstwcw   verifyFormat("req dist {1};");                           // dist
10850e01c3d2Ssstwcw   verifyFormat("a inside {b, c};");                        // inside
10860e01c3d2Ssstwcw   verifyFormat("bus.randomize() with { atype == low; };"); // with
1087f93182a8Ssstwcw }
1088f93182a8Ssstwcw 
10892e32ff10Ssstwcw TEST_F(FormatTestVerilog, Preprocessor) {
10906cef3254Ssstwcw   auto Style = getDefaultStyle();
10912e32ff10Ssstwcw   Style.ColumnLimit = 20;
10922e32ff10Ssstwcw 
10932e32ff10Ssstwcw   // Macro definitions.
10946cef3254Ssstwcw   verifyFormat("`define X          \\\n"
10952e32ff10Ssstwcw                "  if (x)           \\\n"
10962e32ff10Ssstwcw                "    x = x;",
10976cef3254Ssstwcw                "`define X if(x)x=x;", Style);
10986cef3254Ssstwcw   verifyFormat("`define X(x)       \\\n"
10992e32ff10Ssstwcw                "  if (x)           \\\n"
11002e32ff10Ssstwcw                "    x = x;",
11016cef3254Ssstwcw                "`define X(x) if(x)x=x;", Style);
11026cef3254Ssstwcw   verifyFormat("`define X          \\\n"
11032e32ff10Ssstwcw                "  x = x;           \\\n"
11042e32ff10Ssstwcw                "  x = x;",
11056cef3254Ssstwcw                "`define X x=x;x=x;", Style);
11062e32ff10Ssstwcw   // Macro definitions with invocations inside.
11076cef3254Ssstwcw   verifyFormat("`define LIST       \\\n"
11082e32ff10Ssstwcw                "  `ENTRY           \\\n"
11092e32ff10Ssstwcw                "  `ENTRY",
11106cef3254Ssstwcw                "`define LIST \\\n"
11112e32ff10Ssstwcw                "`ENTRY \\\n"
11122e32ff10Ssstwcw                "`ENTRY",
11136cef3254Ssstwcw                Style);
11146cef3254Ssstwcw   verifyFormat("`define LIST       \\\n"
11152e32ff10Ssstwcw                "  `x = `x;         \\\n"
11162e32ff10Ssstwcw                "  `x = `x;",
11176cef3254Ssstwcw                "`define LIST \\\n"
11182e32ff10Ssstwcw                "`x = `x; \\\n"
11192e32ff10Ssstwcw                "`x = `x;",
11206cef3254Ssstwcw                Style);
11216cef3254Ssstwcw   verifyFormat("`define LIST       \\\n"
11222e32ff10Ssstwcw                "  `x = `x;         \\\n"
11232e32ff10Ssstwcw                "  `x = `x;",
11246cef3254Ssstwcw                "`define LIST `x=`x;`x=`x;", Style);
11252e32ff10Ssstwcw   // Macro invocations.
11262e32ff10Ssstwcw   verifyFormat("`x = (`x1 + `x2 + x);");
11272e32ff10Ssstwcw   // Lines starting with a preprocessor directive should not be indented.
11282e32ff10Ssstwcw   std::string Directives[] = {
11292e32ff10Ssstwcw       "begin_keywords",
11302e32ff10Ssstwcw       "celldefine",
11312e32ff10Ssstwcw       "default_nettype",
11322e32ff10Ssstwcw       "define",
11332e32ff10Ssstwcw       "else",
11342e32ff10Ssstwcw       "elsif",
11352e32ff10Ssstwcw       "end_keywords",
11362e32ff10Ssstwcw       "endcelldefine",
11372e32ff10Ssstwcw       "endif",
11382e32ff10Ssstwcw       "ifdef",
11392e32ff10Ssstwcw       "ifndef",
11402e32ff10Ssstwcw       "include",
11412e32ff10Ssstwcw       "line",
11422e32ff10Ssstwcw       "nounconnected_drive",
11432e32ff10Ssstwcw       "pragma",
11442e32ff10Ssstwcw       "resetall",
11452e32ff10Ssstwcw       "timescale",
11462e32ff10Ssstwcw       "unconnected_drive",
11472e32ff10Ssstwcw       "undef",
11482e32ff10Ssstwcw       "undefineall",
11492e32ff10Ssstwcw   };
11502e32ff10Ssstwcw   for (auto &Name : Directives) {
11516cef3254Ssstwcw     verifyFormat("if (x)\n"
11522e32ff10Ssstwcw                  "`" +
11532e32ff10Ssstwcw                      Name +
11542e32ff10Ssstwcw                      "\n"
11552e32ff10Ssstwcw                      "  ;",
11566cef3254Ssstwcw                  "if (x)\n"
11572e32ff10Ssstwcw                  "`" +
11582e32ff10Ssstwcw                      Name +
11592e32ff10Ssstwcw                      "\n"
11602e32ff10Ssstwcw                      ";",
11616cef3254Ssstwcw                  Style);
11622e32ff10Ssstwcw   }
11632e32ff10Ssstwcw   // Lines starting with a regular macro invocation should be indented as a
11642e32ff10Ssstwcw   // normal line.
11656cef3254Ssstwcw   verifyFormat("if (x)\n"
11662e32ff10Ssstwcw                "  `x = `x;\n"
11672e32ff10Ssstwcw                "`timescale 1ns / 1ps",
11686cef3254Ssstwcw                "if (x)\n"
11692e32ff10Ssstwcw                "`x = `x;\n"
11702e32ff10Ssstwcw                "`timescale 1ns / 1ps",
11716cef3254Ssstwcw                Style);
11726cef3254Ssstwcw   verifyFormat("if (x)\n"
11732e32ff10Ssstwcw                "`timescale 1ns / 1ps\n"
11742e32ff10Ssstwcw                "  `x = `x;",
11756cef3254Ssstwcw                "if (x)\n"
11762e32ff10Ssstwcw                "`timescale 1ns / 1ps\n"
11772e32ff10Ssstwcw                "`x = `x;",
11786cef3254Ssstwcw                Style);
11792e32ff10Ssstwcw   std::string NonDirectives[] = {
11802e32ff10Ssstwcw       // For `__FILE__` and `__LINE__`, although the standard classifies them as
11812e32ff10Ssstwcw       // preprocessor directives, they are used like regular macros.
11822e32ff10Ssstwcw       "__FILE__", "__LINE__", "elif", "foo", "x",
11832e32ff10Ssstwcw   };
11842e32ff10Ssstwcw   for (auto &Name : NonDirectives) {
11856cef3254Ssstwcw     verifyFormat("if (x)\n"
11862e32ff10Ssstwcw                  "  `" +
11872e32ff10Ssstwcw                      Name + ";",
11886cef3254Ssstwcw                  "if (x)\n"
11892e32ff10Ssstwcw                  "`" +
11902e32ff10Ssstwcw                      Name +
11912e32ff10Ssstwcw                      "\n"
11922e32ff10Ssstwcw                      ";",
11936cef3254Ssstwcw                  Style);
11942e32ff10Ssstwcw   }
11952e32ff10Ssstwcw }
11962e32ff10Ssstwcw 
1197b67ee18eSsstwcw TEST_F(FormatTestVerilog, Primitive) {
1198b67ee18eSsstwcw   verifyFormat("primitive multiplexer\n"
1199b67ee18eSsstwcw                "    (mux, control, dataA, dataB);\n"
1200b67ee18eSsstwcw                "  output mux;\n"
1201b67ee18eSsstwcw                "  input control, dataA, dataB;\n"
1202b67ee18eSsstwcw                "  table\n"
1203b67ee18eSsstwcw                "    0 1 ? : 1;\n"
1204b67ee18eSsstwcw                "    0 0 ? : 0;\n"
1205b67ee18eSsstwcw                "    1 ? 1 : 1;\n"
1206b67ee18eSsstwcw                "    1 ? 0 : 0;\n"
1207b67ee18eSsstwcw                "    x 0 0 : 0;\n"
1208b67ee18eSsstwcw                "    x 1 1 : 1;\n"
1209b67ee18eSsstwcw                "  endtable\n"
1210b67ee18eSsstwcw                "endprimitive");
1211b67ee18eSsstwcw   verifyFormat("primitive latch\n"
1212b67ee18eSsstwcw                "    (q, ena_, data);\n"
1213b67ee18eSsstwcw                "  output q;\n"
1214b67ee18eSsstwcw                "  reg q;\n"
1215b67ee18eSsstwcw                "  input ena_, data;\n"
1216b67ee18eSsstwcw                "  table\n"
1217b67ee18eSsstwcw                "    0 1 : ? : 1;\n"
1218b67ee18eSsstwcw                "    0 0 : ? : 0;\n"
1219b67ee18eSsstwcw                "    1 ? : ? : -;\n"
1220b67ee18eSsstwcw                "    ? * : ? : -;\n"
1221b67ee18eSsstwcw                "  endtable\n"
1222b67ee18eSsstwcw                "endprimitive");
1223b67ee18eSsstwcw   verifyFormat("primitive d\n"
1224b67ee18eSsstwcw                "    (q, clock, data);\n"
1225b67ee18eSsstwcw                "  output q;\n"
1226b67ee18eSsstwcw                "  reg q;\n"
1227b67ee18eSsstwcw                "  input clock, data;\n"
1228b67ee18eSsstwcw                "  table\n"
1229b67ee18eSsstwcw                "    (01) 0 : ? : 0;\n"
1230b67ee18eSsstwcw                "    (01) 1 : ? : 1;\n"
1231b67ee18eSsstwcw                "    (0?) 1 : 1 : 1;\n"
1232b67ee18eSsstwcw                "    (0?) 0 : 0 : 0;\n"
1233b67ee18eSsstwcw                "    (?0) ? : ? : -;\n"
1234b67ee18eSsstwcw                "    (?\?) ? : ? : -;\n"
1235b67ee18eSsstwcw                "  endtable\n"
1236b67ee18eSsstwcw                "endprimitive");
1237b67ee18eSsstwcw }
1238a1f8bab9Ssstwcw 
12390e01c3d2Ssstwcw TEST_F(FormatTestVerilog, Streaming) {
12400e01c3d2Ssstwcw   verifyFormat("x = {>>{j}};");
12410e01c3d2Ssstwcw   verifyFormat("x = {>>byte{j}};");
12420e01c3d2Ssstwcw   verifyFormat("x = {<<{j}};");
12430e01c3d2Ssstwcw   verifyFormat("x = {<<byte{j}};");
12440e01c3d2Ssstwcw   verifyFormat("x = {<<16{j}};");
12450e01c3d2Ssstwcw   verifyFormat("x = {<<{8'b0011_0101}};");
12460e01c3d2Ssstwcw   verifyFormat("x = {<<4{6'b11_0101}};");
12470e01c3d2Ssstwcw   verifyFormat("x = {>>4{6'b11_0101}};");
12480e01c3d2Ssstwcw   verifyFormat("x = {<<2{{<<{4'b1101}}}};");
12490e01c3d2Ssstwcw   verifyFormat("bit [96 : 1] y = {>>{a, b, c}};");
12500e01c3d2Ssstwcw   verifyFormat("int j = {>>{a, b, c}};");
12510e01c3d2Ssstwcw   verifyFormat("{>>{a, b, c}} = 23'b1;");
12520e01c3d2Ssstwcw   verifyFormat("{>>{a, b, c}} = x;");
12530e01c3d2Ssstwcw   verifyFormat("{>>{j}} = x;");
12540e01c3d2Ssstwcw   verifyFormat("{>>byte{j}} = x;");
12550e01c3d2Ssstwcw   verifyFormat("{<<{j}} = x;");
12560e01c3d2Ssstwcw   verifyFormat("{<<byte{j}} = x;");
12570e01c3d2Ssstwcw }
12580e01c3d2Ssstwcw 
1259ddc80637Ssstwcw TEST_F(FormatTestVerilog, StringLiteral) {
1260ddc80637Ssstwcw   // Long strings should be broken.
1261ddc80637Ssstwcw   verifyFormat(R"(x({"xxxxxxxxxxxxxxxx ",
1262ddc80637Ssstwcw    "xxxx"});)",
1263ddc80637Ssstwcw                R"(x({"xxxxxxxxxxxxxxxx xxxx"});)",
1264ddc80637Ssstwcw                getStyleWithColumns(getDefaultStyle(), 23));
1265ddc80637Ssstwcw   verifyFormat(R"(x({"xxxxxxxxxxxxxxxx",
1266ddc80637Ssstwcw    " xxxx"});)",
1267ddc80637Ssstwcw                R"(x({"xxxxxxxxxxxxxxxx xxxx"});)",
1268ddc80637Ssstwcw                getStyleWithColumns(getDefaultStyle(), 22));
1269ddc80637Ssstwcw   // Braces should be added when they don't already exist.
1270ddc80637Ssstwcw   verifyFormat(R"(x({"xxxxxxxxxxxxxxxx ",
1271ddc80637Ssstwcw    "xxxx"});)",
1272ddc80637Ssstwcw                R"(x("xxxxxxxxxxxxxxxx xxxx");)",
1273ddc80637Ssstwcw                getStyleWithColumns(getDefaultStyle(), 23));
1274ddc80637Ssstwcw   verifyFormat(R"(x({"xxxxxxxxxxxxxxxx",
1275ddc80637Ssstwcw    " xxxx"});)",
1276ddc80637Ssstwcw                R"(x("xxxxxxxxxxxxxxxx xxxx");)",
1277ddc80637Ssstwcw                getStyleWithColumns(getDefaultStyle(), 22));
1278ddc80637Ssstwcw   verifyFormat(R"(x({{"xxxxxxxxxxxxxxxx ",
1279ddc80637Ssstwcw     "xxxx"} == x});)",
1280ddc80637Ssstwcw                R"(x({"xxxxxxxxxxxxxxxx xxxx" == x});)",
1281ddc80637Ssstwcw                getStyleWithColumns(getDefaultStyle(), 24));
1282ddc80637Ssstwcw   verifyFormat(R"(string x = {"xxxxxxxxxxxxxxxx ",
1283ddc80637Ssstwcw             "xxxxxxxx"};)",
1284ddc80637Ssstwcw                R"(string x = "xxxxxxxxxxxxxxxx xxxxxxxx";)",
1285ddc80637Ssstwcw                getStyleWithColumns(getDefaultStyle(), 32));
1286ddc80637Ssstwcw   // Space around braces should be correct.
1287ddc80637Ssstwcw   auto Style = getStyleWithColumns(getDefaultStyle(), 24);
1288ddc80637Ssstwcw   Style.Cpp11BracedListStyle = false;
1289ddc80637Ssstwcw   verifyFormat(R"(x({ "xxxxxxxxxxxxxxxx ",
1290ddc80637Ssstwcw     "xxxx" });)",
1291ddc80637Ssstwcw                R"(x("xxxxxxxxxxxxxxxx xxxx");)", Style);
1292ddc80637Ssstwcw   // Braces should not be added twice.
1293ddc80637Ssstwcw   verifyFormat(R"(x({"xxxxxxxx",
1294ddc80637Ssstwcw    "xxxxxxxx",
1295ddc80637Ssstwcw    "xxxxxx"});)",
1296ddc80637Ssstwcw                R"(x("xxxxxxxxxxxxxxxxxxxxxx");)",
1297ddc80637Ssstwcw                getStyleWithColumns(getDefaultStyle(), 14));
1298ddc80637Ssstwcw   verifyFormat(R"(x({"xxxxxxxxxxxxxxxx ",
1299ddc80637Ssstwcw    "xxxxxxxxxxxxxxxx ",
1300ddc80637Ssstwcw    "xxxx"});)",
1301ddc80637Ssstwcw                R"(x("xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxx");)",
1302ddc80637Ssstwcw                getStyleWithColumns(getDefaultStyle(), 23));
1303ddc80637Ssstwcw   verifyFormat(R"(x({"xxxxxxxxxxxxxxxx ",
1304ddc80637Ssstwcw    "xxxxxxxxxxxxxxxx ",
1305ddc80637Ssstwcw    "xxxx"});)",
1306ddc80637Ssstwcw                R"(x({"xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx ", "xxxx"});)",
1307ddc80637Ssstwcw                getStyleWithColumns(getDefaultStyle(), 23));
1308e0388e0eSArthur Eubanks   // import/export "DPI"/"DPI-C" cannot be split.
1309e0388e0eSArthur Eubanks   verifyFormat(R"(import
1310e0388e0eSArthur Eubanks     "DPI-C" function void foo
1311e0388e0eSArthur Eubanks     ();)",
1312e0388e0eSArthur Eubanks                R"(import "DPI-C" function void foo();)",
1313e0388e0eSArthur Eubanks                getStyleWithColumns(getDefaultStyle(), 23));
1314e0388e0eSArthur Eubanks   verifyFormat(R"(export "DPI-C" function foo;)",
1315e0388e0eSArthur Eubanks                R"(export "DPI-C" function foo;)",
1316e0388e0eSArthur Eubanks                getStyleWithColumns(getDefaultStyle(), 23));
1317ddc80637Ssstwcw   // These kinds of strings don't exist in Verilog.
1318ddc80637Ssstwcw   verifyNoCrash(R"(x(@"xxxxxxxxxxxxxxxx xxxx");)",
1319ddc80637Ssstwcw                 getStyleWithColumns(getDefaultStyle(), 23));
1320ddc80637Ssstwcw   verifyNoCrash(R"(x(u"xxxxxxxxxxxxxxxx xxxx");)",
1321ddc80637Ssstwcw                 getStyleWithColumns(getDefaultStyle(), 23));
1322ddc80637Ssstwcw   verifyNoCrash(R"(x(u8"xxxxxxxxxxxxxxxx xxxx");)",
1323ddc80637Ssstwcw                 getStyleWithColumns(getDefaultStyle(), 23));
1324ddc80637Ssstwcw   verifyNoCrash(R"(x(_T("xxxxxxxxxxxxxxxx xxxx"));)",
1325ddc80637Ssstwcw                 getStyleWithColumns(getDefaultStyle(), 23));
1326ddc80637Ssstwcw }
1327ddc80637Ssstwcw 
1328feb585e7Ssstwcw TEST_F(FormatTestVerilog, StructLiteral) {
1329feb585e7Ssstwcw   verifyFormat("c = '{0, 0.0};");
1330feb585e7Ssstwcw   verifyFormat("c = '{'{1, 1.0}, '{2, 2.0}};");
1331feb585e7Ssstwcw   verifyFormat("c = '{a: 0, b: 0.0};");
1332feb585e7Ssstwcw   verifyFormat("c = '{a: 0, b: 0.0, default: 0};");
1333b3e80d8eSsstwcw   verifyFormat("d = {int: 1, shortreal: 1.0};");
1334b3e80d8eSsstwcw   verifyFormat("c = '{default: 0};");
1335b3e80d8eSsstwcw 
1336b3e80d8eSsstwcw   // The identifier before the quote can be either a tag or a type case.  There
1337b3e80d8eSsstwcw   // should be a space between the tag and the quote.
1338feb585e7Ssstwcw   verifyFormat("c = ab'{a: 0, b: 0.0};");
1339feb585e7Ssstwcw   verifyFormat("c = ab'{cd: cd'{1, 1.0}, ef: ef'{2, 2.0}};");
1340feb585e7Ssstwcw   verifyFormat("c = ab'{cd'{1, 1.0}, ef'{2, 2.0}};");
1341feb585e7Ssstwcw   verifyFormat("d = ab'{int: 1, shortreal: 1.0};");
1342b3e80d8eSsstwcw   verifyFormat("x = tagged Add '{e1, 4, ed};");
1343b3e80d8eSsstwcw 
1344feb585e7Ssstwcw   auto Style = getDefaultStyle();
1345feb585e7Ssstwcw   Style.SpacesInContainerLiterals = true;
1346feb585e7Ssstwcw   verifyFormat("c = '{a : 0, b : 0.0};", Style);
1347feb585e7Ssstwcw   verifyFormat("c = '{a : 0, b : 0.0, default : 0};", Style);
1348feb585e7Ssstwcw   verifyFormat("c = ab'{a : 0, b : 0.0};", Style);
1349feb585e7Ssstwcw   verifyFormat("c = ab'{cd : cd'{1, 1.0}, ef : ef'{2, 2.0}};", Style);
13506bf66d83Ssstwcw 
13516bf66d83Ssstwcw   // It should be indented correctly when the line has to break.
13526bf66d83Ssstwcw   verifyFormat("c = //\n"
13536bf66d83Ssstwcw                "    '{default: 0};");
13546bf66d83Ssstwcw   Style = getDefaultStyle();
13556bf66d83Ssstwcw   Style.ContinuationIndentWidth = 2;
13566bf66d83Ssstwcw   verifyFormat("c = //\n"
13576bf66d83Ssstwcw                "  '{default: 0};",
13586bf66d83Ssstwcw                Style);
1359feb585e7Ssstwcw }
1360feb585e7Ssstwcw 
1361a1f8bab9Ssstwcw TEST_F(FormatTestVerilog, StructuredProcedure) {
1362a1f8bab9Ssstwcw   // Blocks should be indented correctly.
1363a1f8bab9Ssstwcw   verifyFormat("initial begin\n"
1364a1f8bab9Ssstwcw                "end");
1365a1f8bab9Ssstwcw   verifyFormat("initial begin\n"
1366a1f8bab9Ssstwcw                "  x <= x;\n"
1367a1f8bab9Ssstwcw                "  x <= x;\n"
1368a1f8bab9Ssstwcw                "end");
1369a1f8bab9Ssstwcw   verifyFormat("initial\n"
1370a1f8bab9Ssstwcw                "  x <= x;\n"
1371a1f8bab9Ssstwcw                "x <= x;");
1372a1f8bab9Ssstwcw   verifyFormat("always @(x) begin\n"
1373a1f8bab9Ssstwcw                "end");
1374a1f8bab9Ssstwcw   verifyFormat("always @(x) begin\n"
1375a1f8bab9Ssstwcw                "  x <= x;\n"
1376a1f8bab9Ssstwcw                "  x <= x;\n"
1377a1f8bab9Ssstwcw                "end");
1378a1f8bab9Ssstwcw   verifyFormat("always @(x)\n"
1379a1f8bab9Ssstwcw                "  x <= x;\n"
1380a1f8bab9Ssstwcw                "x <= x;");
1381a1f8bab9Ssstwcw   // Various keywords.
1382a1f8bab9Ssstwcw   verifyFormat("always @(x)\n"
1383a1f8bab9Ssstwcw                "  x <= x;");
1384a1f8bab9Ssstwcw   verifyFormat("always @(posedge x)\n"
1385a1f8bab9Ssstwcw                "  x <= x;");
1386e1242855Ssstwcw   verifyFormat("always @(posedge x or posedge y)\n"
1387e1242855Ssstwcw                "  x <= x;");
1388e1242855Ssstwcw   verifyFormat("always @(posedge x, posedge y)\n"
1389e1242855Ssstwcw                "  x <= x;");
1390e1242855Ssstwcw   verifyFormat("always @(negedge x, negedge y)\n"
1391e1242855Ssstwcw                "  x <= x;");
1392e1242855Ssstwcw   verifyFormat("always @(edge x, edge y)\n"
1393e1242855Ssstwcw                "  x <= x;");
1394a1f8bab9Ssstwcw   verifyFormat("always\n"
1395a1f8bab9Ssstwcw                "  x <= x;");
1396a1f8bab9Ssstwcw   verifyFormat("always @*\n"
1397a1f8bab9Ssstwcw                "  x <= x;");
1398a1f8bab9Ssstwcw   verifyFormat("always @(*)\n"
1399a1f8bab9Ssstwcw                "  x <= x;");
1400a1f8bab9Ssstwcw   verifyFormat("always_comb\n"
1401a1f8bab9Ssstwcw                "  x <= x;");
1402a1f8bab9Ssstwcw   verifyFormat("always_latch @(x)\n"
1403a1f8bab9Ssstwcw                "  x <= x;");
1404a1f8bab9Ssstwcw   verifyFormat("always_ff @(posedge x)\n"
1405a1f8bab9Ssstwcw                "  x <= x;");
1406a1f8bab9Ssstwcw   verifyFormat("initial\n"
1407a1f8bab9Ssstwcw                "  x <= x;");
1408a1f8bab9Ssstwcw   verifyFormat("final\n"
1409a1f8bab9Ssstwcw                "  x <= x;");
1410a1f8bab9Ssstwcw   verifyFormat("forever\n"
1411a1f8bab9Ssstwcw                "  x <= x;");
1412a1f8bab9Ssstwcw }
14136cef3254Ssstwcw } // namespace
14146cef3254Ssstwcw } // namespace test
14159ed2e68cSsstwcw } // namespace format
14166cef3254Ssstwcw } // namespace clang
1417