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