Merge branch 'chipsalliance:master' into fix/2605
diff --git a/verible/verilog/formatting/BUILD b/verible/verilog/formatting/BUILD index 6431226..eb089df 100644 --- a/verible/verilog/formatting/BUILD +++ b/verible/verilog/formatting/BUILD
@@ -181,28 +181,91 @@ ], ) -cc_test( - name = "formatter_test", - srcs = ["formatter_test.cc"], +cc_library( + name = "formatter-test-utils", + testonly = True, + hdrs = ["formatter-test-utils.h"], deps = [ ":format-style", ":formatter", - "//verible/common/formatting:align", - "//verible/common/formatting:basic-format-style", - "//verible/common/strings:display-utils", - "//verible/common/strings:position", - "//verible/common/text:text-structure", - "//verible/common/util:interval", "//verible/common/util:logging", - "//verible/verilog/analysis:verilog-analyzer", - "@abseil-cpp//absl/log:die_if_null", - "@abseil-cpp//absl/status", - "@abseil-cpp//absl/strings", "@googletest//:gtest", - "@googletest//:gtest_main", ], ) +_FORMATTER_E2E_TEST_DEPS = [ + ":format-style", + ":formatter", + ":formatter-test-utils", + "//verible/common/formatting:align", + "//verible/common/formatting:basic-format-style", + "//verible/common/strings:display-utils", + "//verible/common/strings:position", + "//verible/common/text:text-structure", + "//verible/common/util:interval", + "//verible/common/util:logging", + "//verible/verilog/analysis:verilog-analyzer", + "@abseil-cpp//absl/log:die_if_null", + "@abseil-cpp//absl/status", + "@abseil-cpp//absl/strings", + "@googletest//:gtest", + "@googletest//:gtest_main", +] + +cc_test( + name = "formatter_test", + srcs = ["formatter_test.cc"], + deps = _FORMATTER_E2E_TEST_DEPS, +) + +cc_test( + name = "formatter_macro_test", + srcs = ["formatter_macro_test.cc"], + deps = _FORMATTER_E2E_TEST_DEPS, +) + +cc_test( + name = "formatter_module_test", + srcs = ["formatter_module_test.cc"], + deps = _FORMATTER_E2E_TEST_DEPS, +) + +cc_test( + name = "formatter_class_package_test", + srcs = ["formatter_class_package_test.cc"], + deps = _FORMATTER_E2E_TEST_DEPS, +) + +cc_test( + name = "formatter_function_task_test", + srcs = ["formatter_function_task_test.cc"], + deps = _FORMATTER_E2E_TEST_DEPS, +) + +cc_test( + name = "formatter_align_test", + srcs = ["formatter_align_test.cc"], + deps = _FORMATTER_E2E_TEST_DEPS, +) + +cc_test( + name = "formatter_wrap_style_test", + srcs = ["formatter_wrap_style_test.cc"], + deps = _FORMATTER_E2E_TEST_DEPS, +) + +cc_test( + name = "formatter_disable_test", + srcs = ["formatter_disable_test.cc"], + deps = _FORMATTER_E2E_TEST_DEPS, +) + +cc_test( + name = "formatter_issue_regression_test", + srcs = ["formatter_issue_regression_test.cc"], + deps = _FORMATTER_E2E_TEST_DEPS, +) + cc_test( name = "formatter-tuning_test", srcs = ["formatter-tuning_test.cc"],
diff --git a/verible/verilog/formatting/README.md b/verible/verilog/formatting/README.md index 6f815bf..03b6f5e 100644 --- a/verible/verilog/formatting/README.md +++ b/verible/verilog/formatting/README.md
@@ -16,7 +16,23 @@ Below is a quick summary of the major components. [formatter.h](formatter.h) contains the top-level entry point into the -formatter. Text-in-text-out tests are in [formatter_test.cc](formatter_test.cc). +formatter. Text-in-text-out tests are split by concern to reduce merge +conflicts: + +- [formatter_test.cc](formatter_test.cc) — core smoke / `VerifyFormatting` +- [formatter_macro_test.cc](formatter_macro_test.cc) — preprocessor, `` `uvm ``, directives +- [formatter_module_test.cc](formatter_module_test.cc) — modules, ports, nets, expressions +- [formatter_class_package_test.cc](formatter_class_package_test.cc) — classes, packages, constraints +- [formatter_function_task_test.cc](formatter_function_task_test.cc) — functions, tasks, properties +- [formatter_align_test.cc](formatter_align_test.cc) — tabular / param alignment +- [formatter_wrap_style_test.cc](formatter_wrap_style_test.cc) — wrap/indent options, diagnostics +- [formatter_disable_test.cc](formatter_disable_test.cc) — `verilog_format` on/off +- [formatter_issue_regression_test.cc](formatter_issue_regression_test.cc) — GitHub issue regressions +- Shared helpers: [formatter-test-utils.h](formatter-test-utils.h) + +**New GitHub-issue formatter regressions belong in +`formatter_issue_regression_test.cc` only** (do not append them to +`formatter_test.cc`). [FormatStyle](format_style.h) defines ways in which formatting can be configured.
diff --git a/verible/verilog/formatting/formatter-test-utils.h b/verible/verilog/formatting/formatter-test-utils.h new file mode 100644 index 0000000..0be6382 --- /dev/null +++ b/verible/verilog/formatting/formatter-test-utils.h
@@ -0,0 +1,69 @@ +// Copyright 2017-2026 The Verible Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Shared helpers for formatter end-to-end tests. +// Penalty-sensitive cases belong in formatter-tuning_test.cc. + +#ifndef VERIBLE_VERILOG_FORMATTING_FORMATTER_TEST_UTILS_H_ +#define VERIBLE_VERILOG_FORMATTING_FORMATTER_TEST_UTILS_H_ + +#include <sstream> +#include <string_view> + +#include "gtest/gtest.h" +#include "verible/common/util/logging.h" +#include "verible/verilog/formatting/format-style.h" +#include "verible/verilog/formatting/formatter.h" + +#undef EXPECT_OK +#define EXPECT_OK(value) EXPECT_TRUE((value).ok()) + +#undef ASSERT_OK +#define ASSERT_OK(value) ASSERT_TRUE((value).ok()) + +namespace verilog { +namespace formatter { + +struct FormatterTestCase { + std::string_view input; + std::string_view expected; +}; + +// Runs FormatVerilog on each case and checks status + exact expected output. +template <typename CaseRange> +void RunFormatterTestCases(const FormatStyle &style, const CaseRange &cases) { + for (const auto &test_case : cases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Convenience: column_limit 40 / indent 2 / wrap 4 — the default E2E style. +template <typename CaseRange> +void RunFormatterTestCases40(const CaseRange &cases) { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + RunFormatterTestCases(style, cases); +} + +} // namespace formatter +} // namespace verilog + +#endif // VERIBLE_VERILOG_FORMATTING_FORMATTER_TEST_UTILS_H_
diff --git a/verible/verilog/formatting/formatter_align_test.cc b/verible/verilog/formatting/formatter_align_test.cc new file mode 100644 index 0000000..affb5a7 --- /dev/null +++ b/verible/verilog/formatting/formatter_align_test.cc
@@ -0,0 +1,5066 @@ +// Copyright 2017-2026 The Verible Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Test cases in this file should be *insensitive* to wrapping penalties. +// Penalty-sensitive tests belong in formatter-tuning_test.cc. + +#include <sstream> +#include <string_view> + +#include "gtest/gtest.h" +#include "verible/common/formatting/align.h" +#include "verible/common/util/logging.h" +#include "verible/verilog/formatting/format-style.h" +#include "verible/verilog/formatting/formatter-test-utils.h" +#include "verible/verilog/formatting/formatter.h" + +namespace verilog { +namespace formatter { +namespace { + +using verible::AlignmentPolicy; + +static constexpr FormatterTestCase kAlignFormatterTestCases[] = { + // module instantiation named ports tabular alignment + //{// module instantiation with no port, only comments + // "module m;\n" + // "foo bar(\n" + // "\t//comment1\n" + // "//comment2\n" + // ");\n" + // "endmodule\n", + // "module m;\n" + // " foo bar (\n" + // " //comment1\n" + // " //comment2\n" + // " );\n" + // "endmodule\n" + //}, + {// all named ports + "module m;\n" + "foo bar(.a(a), .aa(aa), .aaa(aaa));\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a),\n" + " .aa (aa),\n" + " .aaa(aaa)\n" + " );\n" + "endmodule\n"}, + {// named ports left unconnected + "module m;\n" + "foo bar(.a(), .aa(), .aaa());\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (),\n" + " .aa (),\n" + " .aaa()\n" + " );\n" + "endmodule\n"}, + {// multiple named ports groups separated by blank line + "module m;\n" + "foo bar(.a(a), .aaa(aaa),\n\n .b(b), .bbbbbb(bbbbb));\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a),\n" + " .aaa(aaa),\n" + "\n" + " .b (b),\n" + " .bbbbbb(bbbbb)\n" + " );\n" + "endmodule\n"}, + {// named ports with concatenation + "module m;\n" + "foo bar(.a(a), .aaa({a,b,c}));\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a),\n" + " .aaa({a, b, c})\n" + " );\n" + "endmodule\n"}, + {// name ports with slices + "module m;\n" + "foo bar(.a(a), .aaa(q[r:s]));\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a),\n" + " .aaa(q[r:s])\n" + " );\n" + "endmodule\n"}, + {// named ports with pre-proc directives + "module m;\n" + "foo bar(.a(a), `ifdef MACRO .aa(aa), `endif .aaa(aaa));\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a),\n" + "`ifdef MACRO\n" + " .aa (aa),\n" + "`endif\n" + " .aaa(aaa)\n" + " );\n" + "endmodule\n"}, + {// named ports with macros + "module m;\n" + "foo bar(.a(a), .aa(aa[`RANGE]), .aaa(aaa));\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a),\n" + " .aa (aa[`RANGE]),\n" + " .aaa(aaa)\n" + " );\n" + "endmodule\n"}, + {"module m;\n" + "foo bar(.a(a), .AA, .aaa(aaa));\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a),\n" + " .AA,\n" + " .aaa(aaa)\n" + " );\n" + "endmodule\n"}, + {// name ports with comments + "module m;\n" + "foo bar(.a(a), .aa(aa)/*comment*/, .aaa(aaa));\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a),\n" + " .aa (aa) /*comment*/,\n" + " .aaa(aaa)\n" + " );\n" + "endmodule\n"}, + {"module m;\n" + "foo bar(.a(a),//comment1\n .aaa(aaa)//comment2\n);\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a), //comment1\n" + " .aaa(aaa) //comment2\n" + " );\n" + "endmodule\n"}, + {"module m;\n" + "foo bar(.a(a),\n" + " //.aa(aa),\n" + ".aaa(aaa));\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a),\n" + " //.aa(aa),\n" + " .aaa(aaa)\n" + " );\n" + "endmodule\n"}, + {"module m;\n" + "foo bar(\n" + ".a(a) //comment1\n" + ", .aaa(aaa) //comment2\n" + ") //comment3\n" + ";\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a) //comment1\n" + " , .aaa(aaa) //comment2\n" + " ) //comment3\n" + " ;\n" + "endmodule\n"}, + {// module instantiation with all implicit connections + "module m;\n" + "foo bar(.a, .aa, .aaaaa);\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a,\n" + " .aa,\n" + " .aaaaa\n" + " );\n" + "endmodule\n"}, + {// named ports corssed with implicit connections + "module m;\n" + "foo bar(.a(a), .aa, .aaaaa(aaaaa));\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a),\n" + " .aa,\n" + " .aaaaa(aaaaa)\n" + " );\n" + "endmodule\n"}, + {// named ports corssed with wildcard connections + "module m;\n" + "foo bar(.a(a), .aaa(aaa), .*);\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a),\n" + " .aaa(aaa),\n" + " .*\n" + " );\n" + "endmodule\n"}, + {"module m;\n" + "foo bar(.a(a), .aa(aa), .* , .aaa(aaa));\n" + "endmodule\n", + "module m;\n" + " foo bar (\n" + " .a (a),\n" + " .aa (aa),\n" + " .*,\n" + " .aaa(aaa)\n" + " );\n" + "endmodule\n"}, + + // Parameterized data types, declarations inside #() tabular alignment + {// parameterized module with 'list_of_param_assignments' + "module foo #(A = 2, AA = 22, AAA = 222);\n" + "endmodule\n", + "module foo #(\n" + " A = 2,\n" + " AA = 22,\n" + " AAA = 222\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'parameter_declaration' + "module foo #(parameter int a = 2, parameter int aa = 22);\n" + "endmodule\n", + "module foo #(\n" + " parameter int a = 2,\n" + " parameter int aa = 22\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'parameter_declaration' and comments + "module foo #(//comment\nparameter int a = 2, parameter int aa = 22);\n" + "endmodule\n", + "module foo #( //comment\n" + " parameter int a = 2,\n" + " parameter int aa = 22\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'parameter_declaration' and trailing comments + "module foo #(parameter int a = 2,//comment\n parameter int aa = 22);\n" + "endmodule\n", + "module foo #(\n" + " parameter int a = 2, //comment\n" + " parameter int aa = 22\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'parameter_declaration' and pre-proc + "module foo #(parameter int a = 2,\n" + "`ifdef MACRO parameter int aa = 22, `endif\n" + "parameter int aaa = 222);\n" + "endmodule\n", + "module foo #(\n" + " parameter int a = 2,\n" + "`ifdef MACRO\n" + " parameter int aa = 22,\n" + "`endif\n" + " parameter int aaa = 222\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'parameter_declaration' and packed dimensions + "module foo #(parameter logic [3:0] a = 2, parameter logic [30:0] aa = " + "22);\n" + "endmodule\n", + "module foo #(\n" + " parameter logic [ 3:0] a = 2,\n" + " parameter logic [30:0] aa = 22\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'parameter_declaration' and unpacked + // dimensions + "module foo #(parameter logic a[3:0] = 2, parameter logic aa [30:0] = " + "22);\n" + "endmodule\n", + "module foo #(\n" + " parameter logic a [ 3:0] = 2,\n" + " parameter logic aa[30:0] = 22\n" + ");\n" + "endmodule\n"}, + + {// parameterized module with 'local_parameter_declaration' + "module foo #(localparam int a = 2, localparam int aa = 22);\n" + "endmodule\n", + "module foo #(\n" + " localparam int a = 2,\n" + " localparam int aa = 22\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'local_parameter_declaration' and comments + "module foo #(//comment\nlocalparam int a = 2, localparam int aa = 22);\n" + "endmodule\n", + "module foo #( //comment\n" + " localparam int a = 2,\n" + " localparam int aa = 22\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'local_parameter_declaration' and trailing + // comments + "module foo #(localparam int a = 2,//comment\n localparam int aa = 22);\n" + "endmodule\n", + "module foo #(\n" + " localparam int a = 2, //comment\n" + " localparam int aa = 22\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'local_parameter_declaration' and pre-proc + "module foo #(localparam int a = 2,\n" + "`ifdef MACRO localparam int aa = 22, `endif\n" + "localparam int aaa = 222);\n" + "endmodule\n", + "module foo #(\n" + " localparam int a = 2,\n" + "`ifdef MACRO\n" + " localparam int aa = 22,\n" + "`endif\n" + " localparam int aaa = 222\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'local_parameter_declaration' and packed + // dimensions + "module foo #(localparam logic [3:0] a = 2, localparam logic [30:0] aa = " + "22);\n" + "endmodule\n", + "module foo #(\n" + " localparam logic [ 3:0] a = 2,\n" + " localparam logic [30:0] aa = 22\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'local_parameter_declaration' and unpacked + // dimensions + "module foo #(localparam logic a[3:0] = 2, localparam logic aa [30:0] = " + "22);\n" + "endmodule\n", + "module foo #(\n" + " localparam logic a [ 3:0] = 2,\n" + " localparam logic aa[30:0] = 22\n" + ");\n" + "endmodule\n"}, + + {// parameterized module with 'data_type list_of_param_assignments' + "module foo #( int a = 2, real aa = 22, longint aaa = 222);\n" + "endmodule\n", + "module foo #(\n" + " int a = 2,\n" + " real aa = 22,\n" + " longint aaa = 222\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'data_type list_of_param_assignments' and + // comments + "module foo #(//comment\nint a = 2, shortreal aa = 22, longint aaa = " + "222);\n" + "endmodule\n", + "module foo #( //comment\n" + " int a = 2,\n" + " shortreal aa = 22,\n" + " longint aaa = 222\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'data_type list_of_param_assignments' and + // trailing comments + "module foo #(int a = 2, shortreal aa = 22,//comment\n longint aaa = " + "222);\n" + "endmodule\n", + "module foo #(\n" + " int a = 2,\n" + " shortreal aa = 22, //comment\n" + " longint aaa = 222\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'data_type list_of_param_assignments' and + // pre-proc + "module foo #(int a = 2,\n" + "`ifdef MACRO shortreal aa = 22, `endif\n" + " longint aaa = 222);\n" + "endmodule\n", + "module foo #(\n" + " int a = 2,\n" + "`ifdef MACRO\n" + " shortreal aa = 22,\n" + "`endif\n" + " longint aaa = 222\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'data_type list_of_param_assignments' and + // packed dimensions + "module foo #(bit [1:0] a = 2, reg [12:0] aa = 22, logic [123:0] aaa = " + "222);\n" + "endmodule\n", + "module foo #(\n" + " bit [ 1:0] a = 2,\n" + " reg [ 12:0] aa = 22,\n" + " logic [123:0] aaa = 222\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'data_type list_of_param_assignments' and + // unpacked dimensions + "module foo #(bit a[1:0] = 2, reg aa[12:0] = 22, logic aaa [123:0] = " + "222);\n" + "endmodule\n", + "module foo #(\n" + " bit a [ 1:0] = 2,\n" + " reg aa [ 12:0] = 22,\n" + " logic aaa[123:0] = 222\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'type list_of_type_assignments' + "module foo #(type T = int, type TT = bit, type TTT= C#(logic) );\n" + "endmodule\n", + "module foo #(\n" + " type T = int,\n" + " type TT = bit,\n" + " type TTT = C#(logic)\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'type list_of_type_assignments' and comments + "module foo #(//comment\ntype T = int, type TT = bit, type TTT= C#(logic) " + ");\n" + "endmodule\n", + "module foo #( //comment\n" + " type T = int,\n" + " type TT = bit,\n" + " type TTT = C#(logic)\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'data_type list_of_param_assignments' and + // trailing comments + "module foo #(type T = int, type TT = bit, //comment\n type TTT= " + "C#(logic) );\n" + "endmodule\n", + "module foo #(\n" + " type T = int,\n" + " type TT = bit, //comment\n" + " type TTT = C#(logic)\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'data_type list_of_param_assignments' and + // pre-proc + "module foo #(type T = int,\n" + "`ifdef MACRO type TT = bit, `endif\n" + " type TTT= C#(logic));\n" + "endmodule\n", + "module foo #(\n" + " type T = int,\n" + "`ifdef MACRO\n" + " type TT = bit,\n" + "`endif\n" + " type TTT = C#(logic)\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'data_type list_of_param_assignments' and + // packed dimensions + "module foo #(type T = int [3:0], type TT = bit [250:0]);\n" + "endmodule\n", + "module foo #(\n" + " type T = int [ 3:0],\n" + " type TT = bit [250:0]\n" + ");\n" + "endmodule\n"}, + {"module foo #(type T = int, " + "A = 2, int AA = 22, parameter AAA = 222, parameter longint AAAA = 2222, " + "localparam AAAAA = 22222, localparam real AAAAAA = 222222" + ");\n" + "endmodule\n", + "module foo #(\n" + " type T = int,\n" + " A = 2,\n" + " int AA = 22,\n" + " parameter AAA = 222,\n" + " parameter longint AAAA = 2222,\n" + " localparam AAAAA = 22222,\n" + " localparam real AAAAAA = 222222\n" + ");\n" + "endmodule\n"}, + {// parameterized module with built-in data type + "module foo #(int a = 2, real abc = 2234);\n" + "endmodule\n", + "module foo #(\n" + " int a = 2,\n" + " real abc = 2234\n" + ");\n" + "endmodule\n"}, + {// parameterized module with type + "module foo #(type TYPE1 = int, type TYPE2 = boo);\n" + "endmodule\n", + "module foo #(\n" + " type TYPE1 = int,\n" + " type TYPE2 = boo\n" + ");\n" + "endmodule\n"}, + {"module foo#(localparam type TYPE1 = int, type TYPE22 = bool, parameter " + " type TYPE333 = real);\n" + "endmodule\n", + "module foo #(\n" + " localparam type TYPE1 = int,\n" + " type TYPE22 = bool,\n" + " parameter type TYPE333 = real\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'data_type list_of_param_assignments' and 1D + // packed dimensions + "module foo #(parameter type T = int [3:0], type TT = bit [123:0]);\n" + "endmodule\n", + "module foo #(\n" + " parameter type T = int [ 3:0],\n" + " type TT = bit [123:0]\n" + ");\n" + "endmodule\n"}, + {// parameterized module with 'data_type list_of_param_assignments' and 2D + // packed dimensions + "module foo #(type T = int [3:0][123:0], type TT = bit [123:0][1:0]);\n" + "endmodule\n", + "module foo #(\n" + " type T = int [ 3:0][123:0],\n" + " type TT = bit [123:0][ 1:0]\n" + ");\n" + "endmodule\n"}, + {// parametrized module with user defined data types + "module foo #(type T = my_type1_t, type TT = my_pkg::my_type2_t);\n" + "endmodule\n", + "module foo #(\n" + " type T = my_type1_t,\n" + " type TT = my_pkg::my_type2_t\n" + ");\n" + "endmodule\n"}, + + {// parameterized class with 'list_of_param_assignments' + "class foo #(A = 2, AA = 22, AAA = 222);\n" + "endclass\n", + "class foo #(\n" + " A = 2,\n" + " AA = 22,\n" + " AAA = 222\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'parameter_declaration' + "class foo #(parameter int a = 2, parameter int aa = 22);\n" + "endclass\n", + "class foo #(\n" + " parameter int a = 2,\n" + " parameter int aa = 22\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'parameter_declaration' and comments + "class foo #(//comment\nparameter int a = 2, parameter int aa = 22);\n" + "endclass\n", + "class foo #( //comment\n" + " parameter int a = 2,\n" + " parameter int aa = 22\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'parameter_declaration' and trailing comments + "class foo #(parameter int a = 2,//comment\n parameter int aa = 22);\n" + "endclass\n", + "class foo #(\n" + " parameter int a = 2, //comment\n" + " parameter int aa = 22\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'parameter_declaration' and pre-proc + "class foo #(parameter int a = 2,\n" + "`ifdef MACRO parameter int aa = 22, `endif\n" + "parameter int aaa = 222);\n" + "endclass\n", + "class foo #(\n" + " parameter int a = 2,\n" + "`ifdef MACRO\n" + " parameter int aa = 22,\n" + "`endif\n" + " parameter int aaa = 222\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'parameter_declaration' and packed dimensions + "class foo #(parameter logic [3:0] a = 2, parameter logic [30:0] aa = " + "22);\n" + "endclass\n", + "class foo #(\n" + " parameter logic [ 3:0] a = 2,\n" + " parameter logic [30:0] aa = 22\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'parameter_declaration' and unpacked dimensions + "class foo #(parameter logic a[3:0] = 2, parameter logic aa [30:0] = " + "22);\n" + "endclass\n", + "class foo #(\n" + " parameter logic a [ 3:0] = 2,\n" + " parameter logic aa[30:0] = 22\n" + ");\n" + "endclass\n"}, + + {// parameterized class with 'local_parameter_declaration' + "class foo #(localparam int a = 2, localparam int aa = 22);\n" + "endclass\n", + "class foo #(\n" + " localparam int a = 2,\n" + " localparam int aa = 22\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'local_parameter_declaration' and comments + "class foo #(//comment\nlocalparam int a = 2, localparam int aa = 22);\n" + "endclass\n", + "class foo #( //comment\n" + " localparam int a = 2,\n" + " localparam int aa = 22\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'local_parameter_declaration' and trailing + // comments + "class foo #(localparam int a = 2,//comment\n localparam int aa = 22);\n" + "endclass\n", + "class foo #(\n" + " localparam int a = 2, //comment\n" + " localparam int aa = 22\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'local_parameter_declaration' and pre-proc + "class foo #(localparam int a = 2,\n" + "`ifdef MACRO localparam int aa = 22, `endif\n" + "localparam int aaa = 222);\n" + "endclass\n", + "class foo #(\n" + " localparam int a = 2,\n" + "`ifdef MACRO\n" + " localparam int aa = 22,\n" + "`endif\n" + " localparam int aaa = 222\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'local_parameter_declaration' and packed + // dimensions + "class foo #(localparam logic [3:0] a = 2, localparam logic [30:0] aa = " + "22);\n" + "endclass\n", + "class foo #(\n" + " localparam logic [ 3:0] a = 2,\n" + " localparam logic [30:0] aa = 22\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'local_parameter_declaration' and unpacked + // dimensions + "class foo #(localparam logic a[3:0] = 2, localparam logic aa [30:0] = " + "22);\n" + "endclass\n", + "class foo #(\n" + " localparam logic a [ 3:0] = 2,\n" + " localparam logic aa[30:0] = 22\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'data_type list_of_param_assignments' + "class foo #( int a = 2, real aa = 22, longint aaa = 222);\n" + "endclass\n", + "class foo #(\n" + " int a = 2,\n" + " real aa = 22,\n" + " longint aaa = 222\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'data_type list_of_param_assignments' and + // comments + "class foo #(//comment\nint a = 2, shortreal aa = 22, longint aaa = " + "222);\n" + "endclass\n", + "class foo #( //comment\n" + " int a = 2,\n" + " shortreal aa = 22,\n" + " longint aaa = 222\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'data_type list_of_param_assignments' and + // trailing comments + "class foo #(int a = 2, shortreal aa = 22,//comment\n longint aaa = " + "222);\n" + "endclass\n", + "class foo #(\n" + " int a = 2,\n" + " shortreal aa = 22, //comment\n" + " longint aaa = 222\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'data_type list_of_param_assignments' and + // pre-proc + "class foo #(int a = 2,\n" + "`ifdef MACRO shortreal aa = 22, `endif\n" + " longint aaa = 222);\n" + "endclass\n", + "class foo #(\n" + " int a = 2,\n" + "`ifdef MACRO\n" + " shortreal aa = 22,\n" + "`endif\n" + " longint aaa = 222\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'data_type list_of_param_assignments' and + // packed dimensions + "class foo #(bit [1:0] a = 2, reg [12:0] aa = 22, logic [123:0] aaa = " + "222);\n" + "endclass\n", + "class foo #(\n" + " bit [ 1:0] a = 2,\n" + " reg [ 12:0] aa = 22,\n" + " logic [123:0] aaa = 222\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'data_type list_of_param_assignments' and + // unpacked dimensions + "class foo #(bit a[1:0] = 2, reg aa[12:0] = 22, logic aaa [123:0] = " + "222);\n" + "endclass\n", + "class foo #(\n" + " bit a [ 1:0] = 2,\n" + " reg aa [ 12:0] = 22,\n" + " logic aaa[123:0] = 222\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'type list_of_type_assignments' + "class foo #(type T = int, type TT = bit, type TTT= C#(logic) );\n" + "endclass\n", + "class foo #(\n" + " type T = int,\n" + " type TT = bit,\n" + " type TTT = C#(logic)\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'type list_of_type_assignments' and comments + "class foo #(//comment\ntype T = int, type TT = bit, type TTT= C#(logic) " + ");\n" + "endclass\n", + "class foo #( //comment\n" + " type T = int,\n" + " type TT = bit,\n" + " type TTT = C#(logic)\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'data_type list_of_param_assignments' and + // trailing comments + "class foo #(type T = int, type TT = bit, //comment\n type TTT= C#(logic) " + ");\n" + "endclass\n", + "class foo #(\n" + " type T = int,\n" + " type TT = bit, //comment\n" + " type TTT = C#(logic)\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'data_type list_of_param_assignments' and + // pre-proc + "class foo #(type T = int,\n" + "`ifdef MACRO type TT = bit, `endif\n" + " type TTT= C#(logic));\n" + "endclass\n", + "class foo #(\n" + " type T = int,\n" + "`ifdef MACRO\n" + " type TT = bit,\n" + "`endif\n" + " type TTT = C#(logic)\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'data_type list_of_param_assignments' and + // packed dimensions + "class foo #(type T = int [3:0], type TT = bit [250:0]);\n" + "endclass\n", + "class foo #(\n" + " type T = int [ 3:0],\n" + " type TT = bit [250:0]\n" + ");\n" + "endclass\n"}, + {"class foo #(type T = int, " + "A = 2, int AA = 22, parameter AAA = 222, parameter longint AAAA = 2222, " + "localparam AAAAA = 22222, localparam real AAAAAA = 222222" + ");\n" + "endclass\n", + "class foo #(\n" + " type T = int,\n" + " A = 2,\n" + " int AA = 22,\n" + " parameter AAA = 222,\n" + " parameter longint AAAA = 2222,\n" + " localparam AAAAA = 22222,\n" + " localparam real AAAAAA = 222222\n" + ");\n" + "endclass\n"}, + {// parameterized class with built-in data type + "class foo #(int a = 2, real abc = 2234);\n" + "endclass\n", + "class foo #(\n" + " int a = 2,\n" + " real abc = 2234\n" + ");\n" + "endclass\n"}, + {// parameterized class with type + "class foo #(type TYPE1 = int, type TYPE2 = boo);\n" + "endclass\n", + "class foo #(\n" + " type TYPE1 = int,\n" + " type TYPE2 = boo\n" + ");\n" + "endclass\n"}, + {"class foo#(localparam type TYPE1 = int, type TYPE22 = bool, parameter " + "type TYPE333 = real);\n" + "endclass\n", + "class foo #(\n" + " localparam type TYPE1 = int,\n" + " type TYPE22 = bool,\n" + " parameter type TYPE333 = real\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'data_type list_of_param_assignments' and 1D + // packed dimensions + "class foo #(parameter type T = int [3:0], type TT = bit [123:0]);\n" + "endclass\n", + "class foo #(\n" + " parameter type T = int [ 3:0],\n" + " type TT = bit [123:0]\n" + ");\n" + "endclass\n"}, + {// parameterized class with 'data_type list_of_param_assignments' and 2D + // packed dimensions + "class foo #(type T = int [3:0][123:0], type TT = bit [123:0][1:0]);\n" + "endclass\n", + "class foo #(\n" + " type T = int [ 3:0][123:0],\n" + " type TT = bit [123:0][ 1:0]\n" + ");\n" + "endclass\n"}, + {// parametrized class with user defined data types + "class foo #(type T = my_type1_t, type TT = my_pkg::my_type2_t);\n" + "endclass\n", + "class foo #(\n" + " type T = my_type1_t,\n" + " type TT = my_pkg::my_type2_t\n" + ");\n" + "endclass\n"}, + + {// parameterized interface with 'local_parameter_declaration' + "interface foo #(localparam int a = 2, localparam int aa = 22);\n" + "endinterface\n", + "interface foo #(\n" + " localparam int a = 2,\n" + " localparam int aa = 22\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'local_parameter_declaration' and comments + "interface foo #(//comment\nlocalparam int a = 2, localparam int aa = " + "22);\n" + "endinterface\n", + "interface foo #( //comment\n" + " localparam int a = 2,\n" + " localparam int aa = 22\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'local_parameter_declaration' and trailing + // comments + "interface foo #(localparam int a = 2,//comment\n localparam int aa = " + "22);\n" + "endinterface\n", + "interface foo #(\n" + " localparam int a = 2, //comment\n" + " localparam int aa = 22\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'local_parameter_declaration' and pre-proc + "interface foo #(localparam int a = 2,\n" + "`ifdef MACRO localparam int aa = 22, `endif\n" + "localparam int aaa = 222);\n" + "endinterface\n", + "interface foo #(\n" + " localparam int a = 2,\n" + "`ifdef MACRO\n" + " localparam int aa = 22,\n" + "`endif\n" + " localparam int aaa = 222\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'local_parameter_declaration' and packed + // dimensions + "interface foo #(localparam logic [3:0] a = 2, localparam logic [30:0] aa " + "= 22);\n" + "endinterface\n", + "interface foo #(\n" + " localparam logic [ 3:0] a = 2,\n" + " localparam logic [30:0] aa = 22\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'local_parameter_declaration' and unpacked + // dimensions + "interface foo #(localparam logic a[3:0] = 2, localparam logic aa [30:0] " + "= 22);\n" + "endinterface\n", + "interface foo #(\n" + " localparam logic a [ 3:0] = 2,\n" + " localparam logic aa[30:0] = 22\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'data_type list_of_param_assignments' + "interface foo #( int a = 2, real aa = 22, longint aaa = 222);\n" + "endinterface\n", + "interface foo #(\n" + " int a = 2,\n" + " real aa = 22,\n" + " longint aaa = 222\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'data_type list_of_param_assignments' and + // comments + "interface foo #(//comment\nint a = 2, shortreal aa = 22, longint aaa = " + "222);\n" + "endinterface\n", + "interface foo #( //comment\n" + " int a = 2,\n" + " shortreal aa = 22,\n" + " longint aaa = 222\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'data_type list_of_param_assignments' and + // trailing comments + "interface foo #(int a = 2, shortreal aa = 22,//comment\n longint aaa = " + "222);\n" + "endinterface\n", + "interface foo #(\n" + " int a = 2,\n" + " shortreal aa = 22, //comment\n" + " longint aaa = 222\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'data_type list_of_param_assignments' and + // pre-proc + "interface foo #(int a = 2,\n" + "`ifdef MACRO shortreal aa = 22, `endif\n" + " longint aaa = 222);\n" + "endinterface\n", + "interface foo #(\n" + " int a = 2,\n" + "`ifdef MACRO\n" + " shortreal aa = 22,\n" + "`endif\n" + " longint aaa = 222\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'data_type list_of_param_assignments' and + // packed dimensions + "interface foo #(bit [1:0] a = 2, reg [12:0] aa = 22, logic [123:0] aaa " + "= 222);\n" + "endinterface\n", + "interface foo #(\n" + " bit [ 1:0] a = 2,\n" + " reg [ 12:0] aa = 22,\n" + " logic [123:0] aaa = 222\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'data_type list_of_param_assignments' and + // unpacked dimensions + "interface foo #(bit a[1:0] = 2, reg aa[12:0] = 22, logic aaa [123:0] " + "= 222);\n" + "endinterface\n", + "interface foo #(\n" + " bit a [ 1:0] = 2,\n" + " reg aa [ 12:0] = 22,\n" + " logic aaa[123:0] = 222\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'type list_of_type_assignments' + "interface foo #(type T = int, type TT = bit, type TTT= C#(logic) );\n" + "endinterface\n", + "interface foo #(\n" + " type T = int,\n" + " type TT = bit,\n" + " type TTT = C#(logic)\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'type list_of_type_assignments' and + // comments + "interface foo #(//comment\ntype T = int, type TT = bit, type TTT= " + "C#(logic) );\n" + "endinterface\n", + "interface foo #( //comment\n" + " type T = int,\n" + " type TT = bit,\n" + " type TTT = C#(logic)\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'data_type list_of_param_assignments' and + // trailing comments + "interface foo #(type T = int, type TT = bit, //comment\n type TTT= " + "C#(logic) );\n" + "endinterface\n", + "interface foo #(\n" + " type T = int,\n" + " type TT = bit, //comment\n" + " type TTT = C#(logic)\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'data_type list_of_param_assignments' and + // pre-proc + "interface foo #(type T = int,\n" + "`ifdef MACRO type TT = bit, `endif\n" + " type TTT= C#(logic));\n" + "endinterface\n", + "interface foo #(\n" + " type T = int,\n" + "`ifdef MACRO\n" + " type TT = bit,\n" + "`endif\n" + " type TTT = C#(logic)\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'data_type list_of_param_assignments' and + // packed dimensions + "interface foo #(type T = int [3:0], type TT = bit [250:0]);\n" + "endinterface\n", + "interface foo #(\n" + " type T = int [ 3:0],\n" + " type TT = bit [250:0]\n" + ");\n" + "endinterface\n"}, + {"interface foo #(type T = int, " + "A = 2, int AA = 22, parameter AAA = 222, parameter longint AAAA = 2222, " + "localparam AAAAA = 22222, localparam real AAAAAA = 222222" + ");\n" + "endinterface\n", + "interface foo #(\n" + " type T = int,\n" + " A = 2,\n" + " int AA = 22,\n" + " parameter AAA = 222,\n" + " parameter longint AAAA = 2222,\n" + " localparam AAAAA = 22222,\n" + " localparam real AAAAAA = 222222\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with built-in data type + "interface foo #(int a = 2, real abc = 2234);\n" + "endinterface\n", + "interface foo #(\n" + " int a = 2,\n" + " real abc = 2234\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with type + "interface foo #(type TYPE1 = int, type TYPE2 = boo);\n" + "endinterface\n", + "interface foo #(\n" + " type TYPE1 = int,\n" + " type TYPE2 = boo\n" + ");\n" + "endinterface\n"}, + {"interface foo#(localparam type TYPE1 = int, type TYPE22 = bool, " + "parameter type TYPE333 = real);\n" + "endinterface\n", + "interface foo #(\n" + " localparam type TYPE1 = int,\n" + " type TYPE22 = bool,\n" + " parameter type TYPE333 = real\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'data_type list_of_param_assignments' and + // 1D packed dimensions + "interface foo #(parameter type T = int [3:0], type TT = bit [123:0]);\n" + "endinterface\n", + "interface foo #(\n" + " parameter type T = int [ 3:0],\n" + " type TT = bit [123:0]\n" + ");\n" + "endinterface\n"}, + {// parameterized interface with 'data_type list_of_param_assignments' and + // 2D packed dimensions + "interface foo #(type T = int [3:0][123:0], type TT = bit [123:0][1:0]);\n" + "endinterface\n", + "interface foo #(\n" + " type T = int [ 3:0][123:0],\n" + " type TT = bit [123:0][ 1:0]\n" + ");\n" + "endinterface\n"}, + {// parametrized interface with user defined data types + "interface foo #(type T = my_type1_t, type TT = my_pkg::my_type2_t);\n" + "endinterface\n", + "interface foo #(\n" + " type T = my_type1_t,\n" + " type TT = my_pkg::my_type2_t\n" + ");\n" + "endinterface\n"}, + {// wildcard import package at module header + "module foo import bar::*; (baz); endmodule\n", + "module foo\n" + " import bar::*;\n" + "(\n" + " baz\n" + ");\n" + "endmodule\n"}, + {// import package at module header + "module foo import bar::baz; (qux); endmodule\n", + "module foo\n" + " import bar::baz;\n" + "(\n" + " qux\n" + ");\n" + "endmodule\n"}, + {// wildcard import multiple packages at module header + "module foo import bar::*,baz::*; (qux); endmodule\n", + "module foo\n" + " import bar::*, baz::*;\n" + "(\n" + " qux\n" + ");\n" + "endmodule\n"}, + {// separate package import declarations in module header + "module foo import bar::*,baz::*; import q_pkg::qux; (qux); endmodule\n", + "module foo\n" + " import bar::*, baz::*;\n" + " import q_pkg::qux;\n" + "(\n" + " qux\n" + ");\n" + "endmodule\n"}, + {// import package at module header + "module foo import bar::baz; #(int p = 3)(qux); endmodule\n", + "module foo\n" + " import bar::baz;\n" + "#(\n" + " int p = 3\n" + ") (\n" + " qux\n" + ");\n" + "endmodule\n"}, + // Space between return keyword and return value + {"function int foo(logic [31:0] data); return{<<8{data}}; endfunction", + "function int foo(logic [31:0] data);\n" + " return {<<8{data}};\n" + "endfunction\n"}, + {"function int f;return(1);endfunction", + "function int f;\n" + " return (1);\n" + "endfunction\n"}, + {"function int f;return-1;endfunction", + "function int f;\n" + " return -1;\n" + "endfunction\n"}, + {"function int f ;return ! x\n;endfunction", + "function int f;\n" + " return !x;\n" + "endfunction\n"}, + {"function int f ;return ~ x\n;endfunction", + "function int f;\n" + " return ~x;\n" + "endfunction\n"}, + {"function int f ;return $x\n;endfunction", + "function int f;\n" + " return $x;\n" + "endfunction\n"}, + // String initializers + {"string a[] = {\n\"a\"\n};\n", "string a[] = {\"a\"};\n"}, + {"string abc[] = {\n\"a\",\n\"b\",\n\"c\"\n};\n", + "string abc[] = {\"a\", \"b\", \"c\"};\n"}, + {"string abc[] = {\n" + "\"a\",//\n" + "\"b\", \"c\"\n" + "};\n", + "string abc[] = {\"a\", //\n" + " \"b\",\n" + " \"c\"};\n"}, + {"string abc[] = {//\n" + "\"a\", \"b\", \"c\"" + "};\n", + "string abc[] = { //\n" + " \"a\",\n" + " \"b\",\n" + " \"c\"\n" + "};\n"}, + {"string abc[] = {\n" + "\"a\", \"b\", \"c\"//\n" + "};\n", + "string abc[] = {\"a\",\n" + " \"b\",\n" + " \"c\" //\n" + " };\n"}, + {"string abc[] = {//\n" + "\"a\",//\n" + "\"b\", \"c\"//\n" + "};\n", + "string abc[] = { //\n" + " \"a\", //\n" + " \"b\",\n" + " \"c\" //\n" + "};\n"}, + {"string abc[] = {\n" + "\"a\",\n" + "// comment\n" + "// comment\n" + "\"b\",\n" + "\"c\"\n" + "};\n", + "string abc[] = {\"a\",\n" + " // comment\n" + " // comment\n" + " \"b\",\n" + " \"c\"};\n"}, + {"string numbers[] = {\"one\", \"two\", \"three\", \"four\"};\n", + "string numbers[] = {\"one\",\n" + " \"two\",\n" + " \"three\",\n" + " \"four\"};\n"}, + {"string numbers[] = {\"one\", \"two\", THREE, \"four\"};\n", + "string numbers[] = {\n" + " \"one\", \"two\", THREE, \"four\"\n" + "};\n"}, + {"string numbers[] = {\"one\", {\"two\", \"three\"}, \"four\"};\n", + "string numbers[] = {\n" + " \"one\", {\"two\", \"three\"}, \"four\"\n" + "};\n"}, + {"string numbers[] = {\"one\", {\"two\", //\n" + "\"three\"}, \"four\"};\n", + "string numbers[] = {\n" + " \"one\",\n" + " {\n" + " \"two\", //\n" + " \"three\"\n" + " },\n" + " \"four\"\n" + "};\n"}, + {"string years[] = {\"two_thousand_nineteen\", \"two_thousand_twenty\",\n" + "\"two_thousand_twenty_one\"};\n", + // line with 3rd string would exceed column limit in unwrapped style + "string years[] = {\n" + " \"two_thousand_nineteen\",\n" + " \"two_thousand_twenty\",\n" + " \"two_thousand_twenty_one\"\n" + "};\n"}, + {"class class_name;\n" + "var_type var_name = new(\"the_string\");\n" + "endclass\n", + "class class_name;\n" + " var_type var_name = new(\"the_string\");\n" + "endclass\n"}, + + //{ // parameterized class with 'parameter_declaration' and MACRO + // "class foo #(parameter int a = 2,\n" + // "parameter int aaa = `MACRO);\n" + // "endclass\n", + // "class foo #(\n" + // " parameter int a = 2,\n" + // " parameter int aaa = `MACRO\n" + // ");\n" + // "endclass\n" + //}, + // Struct/Union alignment + {"typedef struct {\n" + "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n" + "} type_t;", + "typedef struct {\n" + " bit [3:0] first;\n" + " bit [31:0] second;\n" + " generic_type_name_t third;\n" + "} type_t;\n"}, + {"typedef union soft packed {\n" + "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n" + "} type_t;", + "typedef union soft packed {\n" + " bit [3:0] first;\n" + " bit [31:0] second;\n" + " generic_type_name_t third;\n" + "} type_t;\n"}, + {"typedef union soft {\n" + "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n" + "} type_t;", + "typedef union soft {\n" + " bit [3:0] first;\n" + " bit [31:0] second;\n" + " generic_type_name_t third;\n" + "} type_t;\n"}, + {"typedef struct {\n" + "// comment\n" + "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n" + "} type_t;", + "typedef struct {\n" + " // comment\n" + " bit [3:0] first;\n" + " bit [31:0] second;\n" + " generic_type_name_t third;\n" + "} type_t;\n"}, + {"typedef struct {\n" + "// comment 0\n" + "bit [31:0] first; // a\n" + "bit [31:0] second; // b\n" + "bit third; // c\n" + "uint fourth; // d\n" + "\n" + "// comment 1\n" + "int fifth;\n" + "// comment 2.1\n" + "// comment 2.2\n" + "uint sixth;\n" + "} timing_cfg_t;", + "typedef struct {\n" + " // comment 0\n" + " bit [31:0] first; // a\n" + " bit [31:0] second; // b\n" + " bit third; // c\n" + " uint fourth; // d\n" + "\n" + " // comment 1\n" + " int fifth;\n" + " // comment 2.1\n" + " // comment 2.2\n" + " uint sixth;\n" + "} timing_cfg_t;\n"}, + {"typedef struct {\n" + "// comment\n" + "rand int r;\n" + "int a;\n" + "int aa = 0;\n" + "int aaa = 1; // comment\n" + "foo#(bar) z;\n" + "int [x:y] zz; // comment\n" + "int zzz[a:b];\n" + "} type_t;", + "typedef struct {\n" + " // comment\n" + " rand int r;\n" + " int a;\n" + " int aa = 0;\n" + " int aaa = 1; // comment\n" + " foo #(bar) z;\n" + " int [x:y] zz; // comment\n" + " int zzz[a:b];\n" + "} type_t;\n"}, + {"typedef struct packed {\n" + "struct packed { bit q; logic qq; logic qqq; } a_few_qs;\n" + "struct packed {\n" + "logic [1:0] q;\n" + "} one_q;\n" + "int q;\n" + "uint qq;\n" + "} nested_qs_t;", + "typedef struct packed {\n" + " struct packed {\n" + " bit q;\n" + " logic qq;\n" + " logic qqq;\n" + " } a_few_qs;\n" + " struct packed {logic [1:0] q;} one_q;\n" + " int q;\n" + " uint qq;\n" + "} nested_qs_t;\n"}, + {"typedef struct packed {\n" + "struct packed { bit q; logic qq; logic qqq; } a_few_qs;\n" + "struct packed {\n" + "// comment\n" + "logic [1:0] q;\n" + "} one_q;\n" + "int q;\n" + "uint qq;\n" + "} nested_qs_t;", + "typedef struct packed {\n" + " struct packed {\n" + " bit q;\n" + " logic qq;\n" + " logic qqq;\n" + " } a_few_qs;\n" + " struct packed {\n" + " // comment\n" + " logic [1:0] q;\n" + " } one_q;\n" + " int q;\n" + " uint qq;\n" + "} nested_qs_t;\n"}, + {"typedef struct {bit [3:0] first;\n" + "`ifdef MACRO\n" + "bit [31:0] second; generic_type_name_t third;\n" + "`endif\n" + "} type_t;\n", + "typedef struct {\n" + " bit [3:0] first;\n" + "`ifdef MACRO\n" + " bit [31:0] second;\n" + " generic_type_name_t third;\n" + "`endif\n" + "} type_t;\n"}, + {"typedef struct {\n" + "bit [3:0] first // c\n" + "; bit [31:0] second" + "// c\n" + "; generic_type_name_t third // c\n" + ";} type_t;\n", + "typedef struct {\n" + " bit [3:0] first // c\n" + ";\n" + " bit [31:0] second // c\n" + ";\n" + " generic_type_name_t third // c\n" + ";\n" + "} type_t;\n"}, + {"struct {logic test1; // c\n" + "logic test2;} test3;\n", + "struct {\n" + " logic test1; // c\n" + " logic test2;\n" + "} test3;\n"}, + {"struct {\n" + " /* t */ logic test1; /* t */\n" + "/* t */ logic test2; }test3;\n", + "struct {\n" + " /* t */ logic test1; /* t */\n" + " /* t */ logic test2;\n" + "} test3;\n"}, + // Continuation comment alignment + {"`define BAR 1 // A\n" + "module foo(); // B\n" + "wire baz; // C\n" + "endmodule:foo // D\n", + "`define BAR 1 // A\n" + "module foo (); // B\n" + " wire baz; // C\n" + "endmodule : foo // D\n"}, + {"`define BAR 1 // A\n" + "module foo(); // B\n" + " // B.1\n" + " // B.2\n" + "wire baz; // C\n" + " // C.1\n" + " // C.2\n" + "endmodule:foo // D\n" + " // D.1\n" + " // D.2\n", + "`define BAR 1 // A\n" + "module foo (); // B\n" + " // B.1\n" + " // B.2\n" + " wire baz; // C\n" + " // C.1\n" + " // C.2\n" + "endmodule : foo // D\n" + " // D.1\n" + " // D.2\n"}, + {"// W\n" + "`define BAR 1 // A\n" + " // X\n" + "module foo(); // B\n" + " // B.1\n" + " // B.2\n" + " // Y\n" + "wire baz; // C\n" + " // C.1\n" + " // C.2\n" + " // Z\n" + "endmodule:foo // D\n" + " // D.1\n" + " // D.2\n", + "// W\n" + "`define BAR 1 // A\n" + "// X\n" + "module foo (); // B\n" + " // B.1\n" + " // B.2\n" + " // Y\n" + " wire baz; // C\n" + " // C.1\n" + " // C.2\n" + " // Z\n" + "endmodule : foo // D\n" + " // D.1\n" + " // D.2\n"}, + {"module foo( // A\n" + " // A.1\n" + "// X\n" + "input wire i1 [a:b], // B\n" + " // B.1\n" + "input [c:d] i2, // C\n" + " // C.1\n" + "\n" + "// Y\n" + "output reg o1 // D\n" + " // D.1\n" + ");endmodule:foo\n", + "module foo ( // A\n" + " // A.1\n" + " // X\n" + " input wire i1[a:b], // B\n" + " // B.1\n" + " input [c:d] i2, // C\n" + " // C.1\n" + "\n" + " // Y\n" + " output reg o1 // D\n" + " // D.1\n" + ");\n" + "endmodule : foo\n"}, + // user defined type alignment + { + "module foo();\n" + " logic [5:0][5:0] net_c;\n" + " messy_type_name [1:0] net_e;\n" + "endmodule\n", + "module foo ();\n" + " logic [5:0][5:0] net_c;\n" + " messy_type_name [1:0] net_e;\n" + "endmodule\n", + }, + // Continuation comment's original starting column is allowed to differ from + // starting comment's original starting column at most by 1. + // Starting column of comments B and C will change after formatting. + // TODO: refine the column alignment depending on current vs previous line. + // https://github.com/chipsalliance/verible/pull/858#discussion_r672844015 + {"module foo (); // A\n" // Starting comment; already on correct column + " // A.1\n" // A's column + 1 + " // A.2\n" // A's column - 1 + "wire baz; // B\n" // Starting comment; will be moved left + " // B.1\n" // B's column - 1 + " // B.2\n" // B's column + 1 + " // B.3\n" // B's column + "endmodule:foo // C\n" // Starting comment; will be moved right + " // C.1\n" // C's column + 1 + " // C.2\n", // C's column - 1 + "module foo (); // A\n" + " // A.1\n" + " // A.2\n" + " wire baz; // B\n" + " // B.1\n" + " // B.2\n" + " // B.3\n" + "endmodule : foo // C\n" + " // C.1\n" + " // C.2\n"}, + {"module foo\n" + "#(\n" + " parameter type baz_t = struct packed { `BAZ(); }\n" + ")\n" + "();\n" + "endmodule\n", + "module foo #(\n" + " parameter type\n" + " baz_t = struct packed {\n" + " `BAZ();\n" + " }\n" + ") ();\n" + "endmodule\n"}, + // The same as the previous test case, but without a semicolon at the macro + // call + {"module foo\n" + "#(\n" + " parameter type baz_t = struct packed { `BAZ() }\n" + ")\n" + "();\n" + "endmodule\n", + "module foo #(\n" + " parameter type\n" + " baz_t = struct packed {\n" + " `BAZ()\n" + " }\n" + ") ();\n" + "endmodule\n"}, + // Check that comments with too large starting column difference are not + // aligned as continuation comments. + // Check that starting comments are not linked with a comment in + // comment-only line above them, even when the starting column is the same. + // All comments in this test case are aligned independently, i.e. none are + // "continuation comments". + {" // comment1\n" // A's column, but is above it + "module foo (); // A\n" + " // comment2\n" // A's column + 2 + " // comment3\n" // A's column - 2 + "wire baz; // B\n" + " // comment4\n" // B's column - 2 + " // comment5\n" // B's column + 2 + " // comment6\n" // B's column, but not directly under B + "endmodule:foo // C\n" + " // comment7\n" // C's column + 2 + " // comment8\n", // C's column, but not directly under B + "// comment1\n" + "module foo (); // A\n" + " // comment2\n" + " // comment3\n" + " wire baz; // B\n" + " // comment4\n" + " // comment5\n" + " // comment6\n" + "endmodule : foo // C\n" + "// comment7\n" + "// comment8\n"}, + // Continuation comment alignment when a line with the starting comment is + // wrapped. + {"module foo(output logic very_very_very_very_long_name // A\n" + " // A.1\n" + "); endmodule\n", + "module foo (\n" + " output logic\n" + " very_very_very_very_long_name // A\n" + " // A.1\n" + ");\n" + "endmodule\n"}, + + // Attachment of ',' to elements in enum list (with and without comments) + {"typedef enum {\n" + " first , // c1\n" + " second\n" + "} e;\n", + "typedef enum {\n" + " first, // c1\n" + " second\n" + "} e;\n"}, + {"typedef enum {\n" + " first ,\n" + " // c1\n" + " second\n" + "} e;\n", + "typedef enum {\n" + " first,\n" + " // c1\n" + " second\n" + "} e;\n"}, + {"typedef enum {\n" + " first // c1\n" + " , second\n" + "} e;\n", + "typedef enum {\n" + " first // c1\n" + " , second\n" + "} e;\n"}, + {"typedef enum {\n" + " first\n" + " // c1\n" + " , second\n" + "} e;\n", + "typedef enum {\n" + " first\n" + " // c1\n" + " , second\n" + "} e;\n"}, + {"typedef enum {\n" + " first // c1\n" + " , // c2\n" + " second\n" + "} e;\n", + "typedef enum {\n" + " first // c1\n" + " , // c2\n" + " second\n" + "} e;\n"}, + {"typedef enum {\n" + " first\n" + " // c1\n" + " ,\n" + " // c2\n" + " second\n" + "} e;\n", + "typedef enum {\n" + " first\n" + " // c1\n" + " , // c2\n" + " second\n" + "} e;\n"}, + {"typedef enum {\n" + " first\n" + " // c1\n" + " , // c2\n" + " // c3\n" + " second\n" + "} e;\n", + "typedef enum {\n" + " first\n" + " // c1\n" + " , // c2\n" + " // c3\n" + " second\n" + "} e;\n"}, + {"typedef enum {\n" + " // c1\n" + " first\n" + " // c2\n" + " , // c3\n" + " // c4\n" + " second\n" + " // c5\n" + "} e;\n", + "typedef enum {\n" + " // c1\n" + " first\n" + " // c2\n" + " , // c3\n" + " // c4\n" + " second\n" + " // c5\n" + "} e;\n"}, + {"typedef enum {\n" + " // c1\n" + " // c1+\n" + " first // c2\n" + " // c2+\n" + " , // c3\n" + " // c3+\n" + " // c4\n" + " // c4+\n" + " second // c5\n" + " // c5+\n" + "} e;\n", + "typedef enum {\n" + " // c1\n" + " // c1+\n" + " first // c2\n" + " // c2+\n" + " , // c3\n" + " // c3+\n" + " // c4\n" + " // c4+\n" + " second // c5\n" + " // c5+\n" + "} e;\n"}, + {"typedef enum {\n" + " first , /* c1 */\n" + " second\n" + "} e;\n", + "typedef enum {\n" + " first, /* c1 */\n" + " second\n" + "} e;\n"}, + {"typedef enum {\n" + " first ,\n" + " /* c1 */\n" + " second\n" + "} e;\n", + "typedef enum {\n" + " first,\n" + " /* c1 */\n" + " second\n" + "} e;\n"}, + {"typedef enum {\n" + " first /* c1 */\n" + " , second\n" + "} e;\n", + "typedef enum {\n" + " first /* c1 */\n" + " , second\n" + "} e;\n"}, + {"typedef enum {\n" + " first\n" + " /* c1 */\n" + " , second\n" + "} e;\n", + "typedef enum {\n" + " first\n" + " /* c1 */\n" + " , second\n" + "} e;\n"}, + {"typedef enum {\n" + " first /* c1 */\n" + " , /* c2 */\n" + " second\n" + "} e;\n", + "typedef enum {\n" + " first /* c1 */\n" + " , /* c2 */\n" + " second\n" + "} e;\n"}, + {"typedef enum {\n" + " first\n" + " /* c1 */\n" + " ,\n" + " /* c2 */\n" + " second\n" + "} e;\n", + "typedef enum {\n" + " first\n" + " /* c1 */\n" + " ,\n" + " /* c2 */\n" + " second\n" + "} e;\n"}, + {"typedef enum {\n" + " /* c1 */\n" + " first\n" + " /* c2 */\n" + " , /* c3 */\n" + " /* c4 */\n" + " second\n" + " /* c5 */\n" + "} e;\n", + "typedef enum {\n" + " /* c1 */\n" + " first\n" + " /* c2 */\n" + " , /* c3 */\n" + " /* c4 */\n" + " second\n" + " /* c5 */\n" + "} e;\n"}, + {"typedef enum {\n" + " /* c1 */\n" + " /* c1+ */\n" + " first /* c2 */\n" + " /* c2+ */\n" + " , /* c3 */\n" + " /* c3+ */\n" + " /* c4 */\n" + " /* c4+ */\n" + " second /* c5 */\n" + " /* c5+ */\n" + "} e;\n", + "typedef enum {\n" + " /* c1 */\n" + " /* c1+ */\n" + " first /* c2 */\n" + " /* c2+ */\n" + " , /* c3 */\n" + " /* c3+ */\n" + " /* c4 */\n" + " /* c4+ */\n" + " second /* c5 */\n" + " /* c5+ */\n" + "} e;\n"}, + {"module m;\n" + "typedef enum {\n" + " first,\n" + " second\n" + "} // c\n" + "e;\n" + "endmodule\n", + "module m;\n" + " typedef enum {\n" + " first,\n" + " second\n" + " } // c\n" + " e;\n" + "endmodule\n"}, + // Attachment of ';' preceded by EOL comment + {"module m;\n" + "typedef enum {\n" + " first,\n" + " second\n" + "} e // c\n" + ";\n" + "endmodule\n", + "module m;\n" + " typedef enum {\n" + " first,\n" + " second\n" + " } e // c\n" + " ;\n" + "endmodule\n"}, + {"module m;\n" + "typedef enum {\n" + " first,\n" + " second\n" + "} // c1\n" + "e // c2\n" + ";\n" + "endmodule\n", + "module m;\n" + " typedef enum {\n" + " first,\n" + " second\n" + " } // c1\n" + " e // c2\n" + " ;\n" + "endmodule\n"}, + {"assign foo = bar\n" + "// comment\n" + ";\n", + "assign foo = bar\n" + " // comment\n" + " ;\n"}, + {"assign foo = bar // comment\n" + ";\n", + "assign foo = bar // comment\n" + ";\n"}, + + // Attachment of ',' to elements in PortActualList (with and without + // comments) + {"module foo;\n" + " bar foobar(\n" + " .first(1) // c1\n" + " ,\n" + " .second(2) // c2\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " .first (1) // c1\n" + " , .second(2) // c2\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " .first(1) // c1\n" + " , .second(2) // c2\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " .first (1) // c1\n" + " , .second(2) // c2\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " .first(1)\n" + " // c1\n" + " ,\n" + " .second(2)\n" + " // c2\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " .first (1)\n" + " // c1\n" + " , .second(2)\n" + " // c2\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " .first(1)\n" + " // c1\n" + " , .second(2)\n" + " // c2\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " .first (1)\n" + " // c1\n" + " , .second(2)\n" + " // c2\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " .first(1)\n" + " // c1\n" + " , // c2\n" + " .second(2)\n" + " // c3\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " .first (1)\n" + " // c1\n" + " , // c2\n" + " .second(2)\n" + " // c3\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " // c1\n" + " // c1+\n" + " .first(1) // c2\n" + " // c2+\n" + " , // c3\n" + " // c3+\n" + " .second(2) // c4\n" + " // c4+\n" + " // c5\n" + " // c5+\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " // c1\n" + " // c1+\n" + " .first (1) // c2\n" + " // c2+\n" + " , // c3\n" + " // c3+\n" + " .second(2) // c4\n" + " // c4+\n" + " // c5\n" + " // c5+\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " .first(1) /* c1 */\n" + " ,\n" + " .second(2) /* c2 */\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " .first (1) /* c1 */\n" + " , .second(2) /* c2 */\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " /* c1 */ .first(1),\n" + " /* c2 */ .second(2)\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " /* c1 */.first (1),\n" + " /* c2 */.second(2)\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " .first(1) /* c1 */\n" + " , .second(2) /* c2 */\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " .first (1) /* c1 */\n" + " , .second(2) /* c2 */\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " /* c1 */.first(1)\n" + " /* c2 */, .second(2)\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " /* c1 */ .first (1)\n" + " /* c2 */, .second(2)\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " .first(1)\n" + " /* c1 */\n" + " ,\n" + " .second(2)\n" + " /* c2 */\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " .first (1)\n" + " /* c1 */\n" + " , .second(2)\n" + " /* c2 */\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " .first(1)\n" + " /* c1 */\n" + " , .second(2)\n" + " /* c2 */\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " .first (1)\n" + " /* c1 */\n" + " , .second(2)\n" + " /* c2 */\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " .first(1)\n" + " /* c1 */\n" + " , /* c2 */\n" + " .second(2)\n" + " /* c3 */\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " .first (1)\n" + " /* c1 */\n" + " , /* c2 */\n" + " .second(2)\n" + " /* c3 */\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " .first(1)\n" + " /* c1 */\n" + " , /* c2 */\n" + " .second(2)\n" + " /* c3 */\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " .first (1)\n" + " /* c1 */\n" + " , /* c2 */\n" + " .second(2)\n" + " /* c3 */\n" + " );\n" + "endmodule\n"}, + {"module foo;\n" + " bar foobar(\n" + " /* c1 */\n" + " /* c1+ */\n" + " .first(1) /* c2 */\n" + " /* c2+ */\n" + " , /* c3 */\n" + " /* c3+ */\n" + " .second(2) /* c4 */\n" + " /* c4+ */\n" + " /* c5 */\n" + " /* c5+ */\n" + " );\n" + "endmodule\n", + "module foo;\n" + " bar foobar (\n" + " /* c1 */\n" + " /* c1+ */\n" + " .first (1) /* c2 */\n" + " /* c2+ */\n" + " , /* c3 */\n" + " /* c3+ */\n" + " .second(2) /* c4 */\n" + " /* c4+ */\n" + " /* c5 */\n" + " /* c5+ */\n" + " );\n" + "endmodule\n"}, + + // Attachment of ',' to elements in ActualNamedParameterList (with and + // without comments) + {"module foo;\n" + " bar#(\n" + " .first(1) // c1\n" + " ,\n" + " .second(2) // c2\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " .first (1) // c1\n" + " , .second(2) // c2\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " .first(1) // c1\n" + " , .second(2) // c2\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " .first (1) // c1\n" + " , .second(2) // c2\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " .first(1)\n" + " // c1\n" + " ,\n" + " .second(2)\n" + " // c2\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " .first (1)\n" + " // c1\n" + " , .second(2)\n" + " // c2\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " .first(1)\n" + " // c1\n" + " , .second(2)\n" + " // c2\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " .first (1)\n" + " // c1\n" + " , .second(2)\n" + " // c2\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " .first(1)\n" + " // c1\n" + " , // c2\n" + " .second(2)\n" + " // c3\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " .first (1)\n" + " // c1\n" + " , // c2\n" + " .second(2)\n" + " // c3\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " // c1\n" + " // c1+\n" + " .first(1) // c2\n" + " // c2+\n" + " , // c3\n" + " // c3+\n" + " .second(2) // c4\n" + " // c4+\n" + " // c5\n" + " // c5+\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " // c1\n" + " // c1+\n" + " .first (1) // c2\n" + " // c2+\n" + " , // c3\n" + " // c3+\n" + " .second(2) // c4\n" + " // c4+\n" + " // c5\n" + " // c5+\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " .first(1) /* c1 */\n" + " ,\n" + " .second(2) /* c2 */\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " .first (1) /* c1 */\n" + " , .second(2) /* c2 */\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " /* c1 */ .first(1),\n" + " /* c2 */ .second(2)\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " /* c1 */.first (1),\n" + " /* c2 */.second(2)\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " .first(1) /* c1 */\n" + " , .second(2) /* c2 */\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " .first (1) /* c1 */\n" + " , .second(2) /* c2 */\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " /* c1 */.first(1)\n" + " /* c2 */, .second(2)\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " /* c1 */ .first (1)\n" + " /* c2 */, .second(2)\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " .first(1)\n" + " /* c1 */\n" + " ,\n" + " .second(2)\n" + " /* c2 */\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " .first (1)\n" + " /* c1 */\n" + " , .second(2)\n" + " /* c2 */\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " .first(1)\n" + " /* c1 */\n" + " , .second(2)\n" + " /* c2 */\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " .first (1)\n" + " /* c1 */\n" + " , .second(2)\n" + " /* c2 */\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " .first(1)\n" + " /* c1 */\n" + " , /* c2 */\n" + " .second(2)\n" + " /* c3 */\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " .first (1)\n" + " /* c1 */\n" + " , /* c2 */\n" + " .second(2)\n" + " /* c3 */\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " .first(1)\n" + " /* c1 */\n" + " , /* c2 */\n" + " .second(2)\n" + " /* c3 */\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " .first (1)\n" + " /* c1 */\n" + " , /* c2 */\n" + " .second(2)\n" + " /* c3 */\n" + " ) baz ();\n" + "endmodule\n"}, + {"module foo;\n" + " bar#(\n" + " /* c1 */\n" + " /* c1+ */\n" + " .first(1) /* c2 */\n" + " /* c2+ */\n" + " , /* c3 */\n" + " /* c3+ */\n" + " .second(2) /* c4 */\n" + " /* c4+ */\n" + " /* c5 */\n" + " /* c5+ */\n" + " ) baz ();\n" + "endmodule\n", + "module foo;\n" + " bar #(\n" + " /* c1 */\n" + " /* c1+ */\n" + " .first (1) /* c2 */\n" + " /* c2+ */\n" + " , /* c3 */\n" + " /* c3+ */\n" + " .second(2) /* c4 */\n" + " /* c4+ */\n" + " /* c5 */\n" + " /* c5+ */\n" + " ) baz ();\n" + "endmodule\n"}, + + // ":" and "'{" in a single line + {"assign foo[2] =\n" + "'{\n" + "bar: 1'b1, // c\n" + "baz: 1'b0, // c\n" + "foobar: CONSTANT,\n" + "qux:\n" + "{\n" + "a, // c\n" + "b\n" + "}\n" + "};\n", + "assign foo[2] = '{\n" + " bar: 1'b1, // c\n" + " baz: 1'b0, // c\n" + " foobar: CONSTANT,\n" + " qux: {\n" + " a, // c\n" + " b\n" + " }\n" + " };\n"}, + {"assign a = (b) ? '{c: d[e], f: '1} : g;\n", + "assign a = (b) ?\n" + " '{c: d[e], f: '1}\n" + " : g;\n"}, + + // ----------------------------------------------------------------- + // Comments around `else`. + // Check whether `else` partition is found correctly and that actual code is + // not appended to EOL comments. + + // generate if + + {"module zx;\n" + "if (x) assign z=y;\n" + "// eol-c\n" + "else if (r) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " // eol-c\n" + " else if (r) assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "// eol-c\n" + "// eol-c\n" + "else if (r) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " // eol-c\n" + " // eol-c\n" + " else if (r) assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "else // eol-c\n" + "if (r) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " else // eol-c\n" + " if (r) assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "else\n" + "// eol-c\n" + "if (r) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " else\n" + " // eol-c\n" + " if (r)\n" + " assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "// eol-c\n" + "else // eol-c\n" + "if (r) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " // eol-c\n" + " else // eol-c\n" + " if (r) assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "else // eol-c\n" + "// eol-c\n" + "if (r) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " else // eol-c\n" + " // eol-c\n" + " if (r)\n" + " assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "// eol-c\n" + "else // eol-c\n" + "// eol-c\n" + "if (r) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " // eol-c\n" + " else // eol-c\n" + " // eol-c\n" + " if (r)\n" + " assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "// eol-c\n" + "else // eol-c\n" + "// eol-c\n" + "if\n" + "// eol-c\n" + "(r) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " // eol-c\n" + " else // eol-c\n" + " // eol-c\n" + " if\n" + " // eol-c\n" + " (r)\n" + " assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "// eol-c\n" + "// eol-c\n" + "else // eol-c\n" + "// eol-c\n" + "// eol-c\n" + "if\n" + "// eol-c\n" + "// eol-c\n" + "(r) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " // eol-c\n" + " // eol-c\n" + " else // eol-c\n" + " // eol-c\n" + " // eol-c\n" + " if\n" + " // eol-c\n" + " // eol-c\n" + " (r)\n" + " assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + + // generate if with function call + + {"module zx;\n" + "if (x) assign z=y;\n" + "// eol-c\n" + "else if (foo(x) == bar(1, 2)) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " // eol-c\n" + " else if (foo(x) == bar(1, 2))\n" + " assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "// eol-c\n" + "// eol-c\n" + "else if (foo(x) == bar(1, 2)) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " // eol-c\n" + " // eol-c\n" + " else if (foo(x) == bar(1, 2))\n" + " assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "else // eol-c\n" + "if (foo(x) == bar(1, 2)) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " else // eol-c\n" + " if (foo(x) == bar(1, 2)) assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "else\n" + "// eol-c\n" + "if (foo(x) == bar(1, 2)) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " else\n" + " // eol-c\n" + " if (foo(\n" + " x\n" + " ) == bar(\n" + " 1, 2\n" + " ))\n" + " assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "// eol-c\n" + "else // eol-c\n" + "if (foo(x) == bar(1, 2)) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " // eol-c\n" + " else // eol-c\n" + " if (foo(x) == bar(1, 2)) assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "else // eol-c\n" + "// eol-c\n" + "if (foo(x) == bar(1, 2)) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " else // eol-c\n" + " // eol-c\n" + " if (foo(\n" + " x\n" + " ) == bar(\n" + " 1, 2\n" + " ))\n" + " assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "// eol-c\n" + "else // eol-c\n" + "// eol-c\n" + "if (foo(x) == bar(1, 2)) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " // eol-c\n" + " else // eol-c\n" + " // eol-c\n" + " if (foo(\n" + " x\n" + " ) == bar(\n" + " 1, 2\n" + " ))\n" + " assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "// eol-c\n" + "else // eol-c\n" + "// eol-c\n" + "if\n" + "// eol-c\n" + "(foo(x) == bar(1, 2)) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " // eol-c\n" + " else // eol-c\n" + " // eol-c\n" + " if\n" + " // eol-c\n" + " (foo(\n" + " x\n" + " ) == bar(\n" + " 1, 2\n" + " ))\n" + " assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + {"module zx;\n" + "if (x) assign z=y;\n" + "// eol-c\n" + "// eol-c\n" + "else // eol-c\n" + "// eol-c\n" + "// eol-c\n" + "if\n" + "// eol-c\n" + "// eol-c\n" + "(foo(x) == bar(1, 2)) assign z=w;\n" + "else assign x=y;\n" + "endmodule\n", + "module zx;\n" + " if (x) assign z = y;\n" + " // eol-c\n" + " // eol-c\n" + " else // eol-c\n" + " // eol-c\n" + " // eol-c\n" + " if\n" + " // eol-c\n" + " // eol-c\n" + " (foo(\n" + " x\n" + " ) == bar(\n" + " 1, 2\n" + " ))\n" + " assign z = w;\n" + " else assign x = y;\n" + "endmodule\n"}, + + // else begin + + {"module zx;\n" + "always begin\n" + "if (a) b<=1;\n" + "// eol-c\n" + "else begin b<=2;\n" + "end\n" + "end\n" + "endmodule\n", + "module zx;\n" + " always begin\n" + " if (a) b <= 1;\n" + " // eol-c\n" + " else begin\n" + " b <= 2;\n" + " end\n" + " end\n" + "endmodule\n"}, + {"module zx;\n" + "always begin\n" + "if (a) b<=1;\n" + "// eol-c\n" + "// eol-c\n" + "else begin b<=2;\n" + "end\n" + "end\n" + "endmodule\n", + "module zx;\n" + " always begin\n" + " if (a) b <= 1;\n" + " // eol-c\n" + " // eol-c\n" + " else begin\n" + " b <= 2;\n" + " end\n" + " end\n" + "endmodule\n"}, + {"module zx;\n" + "always begin\n" + "if (a) b<=1;\n" + "else // eol-c\n" + "begin b<=2;\n" + "end\n" + "end\n" + "endmodule\n", + "module zx;\n" + " always begin\n" + " if (a) b <= 1;\n" + " else // eol-c\n" + " begin\n" + " b <= 2;\n" + " end\n" + " end\n" + "endmodule\n"}, + {"module zx;\n" + "always begin\n" + "if (a) b<=1;\n" + "else\n" + "// eol-c\n" + "begin b<=2;\n" + "end\n" + "end\n" + "endmodule\n", + "module zx;\n" + " always begin\n" + " if (a) b <= 1;\n" + " else\n" + " // eol-c\n" + " begin\n" + " b <= 2;\n" + " end\n" + " end\n" + "endmodule\n"}, + {"module zx;\n" + "always begin\n" + "if (a) b<=1;\n" + "// eol-c\n" + "else // eol-c\n" + "begin b<=2;\n" + "end\n" + "end\n" + "endmodule\n", + "module zx;\n" + " always begin\n" + " if (a) b <= 1;\n" + " // eol-c\n" + " else // eol-c\n" + " begin\n" + " b <= 2;\n" + " end\n" + " end\n" + "endmodule\n"}, + {"module zx;\n" + "always begin\n" + "if (a) b<=1;\n" + "else // eol-c\n" + "// eol-c\n" + "begin b<=2;\n" + "end\n" + "end\n" + "endmodule\n", + "module zx;\n" + " always begin\n" + " if (a) b <= 1;\n" + " else // eol-c\n" + " // eol-c\n" + " begin\n" + " b <= 2;\n" + " end\n" + " end\n" + "endmodule\n"}, + + // else if + + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "// eol-c\n" + "else if (set) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " // eol-c\n" + " else if (set) assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "// eol-c\n" + "// eol-c\n" + "else if (set) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " // eol-c\n" + " // eol-c\n" + " else if (set) assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "else // eol-c\n" + "if (set) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " else // eol-c\n" + " if (set) assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "else\n" + "// eol-c\n" + "if (set) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " else\n" + " // eol-c\n" + " if (set)\n" + " assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "// eol-c\n" + "else // eol-c\n" + "if (set) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " // eol-c\n" + " else // eol-c\n" + " if (set) assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "else // eol-c\n" + "// eol-c\n" + "if (set) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " else // eol-c\n" + " // eol-c\n" + " if (set)\n" + " assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "// eol-c\n" + "else // eol-c\n" + "// eol-c\n" + "if (set) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " // eol-c\n" + " else // eol-c\n" + " // eol-c\n" + " if (set)\n" + " assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "// eol-c\n" + "else // eol-c\n" + "// eol-c\n" + "if\n" + "// eol-c\n" + "(set) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " // eol-c\n" + " else // eol-c\n" + " // eol-c\n" + " if\n" + " // eol-c\n" + " (set)\n" + " assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "// eol-c\n" + "// eol-c\n" + "else // eol-c\n" + "// eol-c\n" + "// eol-c\n" + "if\n" + "// eol-c\n" + "// eol-c\n" + "(set) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " // eol-c\n" + " // eol-c\n" + " else // eol-c\n" + " // eol-c\n" + " // eol-c\n" + " if\n" + " // eol-c\n" + " // eol-c\n" + " (set)\n" + " assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + + // else if with function call + + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "// eol-c\n" + "else if (foo(clr, set, 1)) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " // eol-c\n" + " else if (foo(clr, set, 1))\n" + " assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "// eol-c\n" + "// eol-c\n" + "else if (foo(clr, set, 1)) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " // eol-c\n" + " // eol-c\n" + " else if (foo(clr, set, 1))\n" + " assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "else // eol-c\n" + "if (foo(clr, set, 1)) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " else // eol-c\n" + " if (foo(clr, set, 1)) assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "else\n" + "// eol-c\n" + "if (foo(clr, set, 1)) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " else\n" + " // eol-c\n" + " if (foo(\n" + " clr, set, 1\n" + " ))\n" + " assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "// eol-c\n" + "else // eol-c\n" + "if (foo(clr, set, 1)) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " // eol-c\n" + " else // eol-c\n" + " if (foo(clr, set, 1)) assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "else // eol-c\n" + "// eol-c\n" + "if (foo(clr, set, 1)) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " else // eol-c\n" + " // eol-c\n" + " if (foo(\n" + " clr, set, 1\n" + " ))\n" + " assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "// eol-c\n" + "else // eol-c\n" + "// eol-c\n" + "if (foo(clr, set, 1)) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " // eol-c\n" + " else // eol-c\n" + " // eol-c\n" + " if (foo(\n" + " clr, set, 1\n" + " ))\n" + " assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "// eol-c\n" + "else // eol-c\n" + "// eol-c\n" + "if\n" + "// eol-c\n" + "(foo(clr, set, 1)) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " // eol-c\n" + " else // eol-c\n" + " // eol-c\n" + " if\n" + " // eol-c\n" + " (foo(\n" + " clr, set, 1\n" + " ))\n" + " assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + {"module zx;\n" + "always @(clr or set)\n" + "if (clr) assign q=0;\n" + "// eol-c\n" + "// eol-c\n" + "else // eol-c\n" + "// eol-c\n" + "// eol-c\n" + "if\n" + "// eol-c\n" + "// eol-c\n" + "(foo(clr, set, 1)) assign q=1;\n" + "else deassign q;\n" + "endmodule\n", + "module zx;\n" + " always @(clr or set)\n" + " if (clr) assign q = 0;\n" + " // eol-c\n" + " // eol-c\n" + " else // eol-c\n" + " // eol-c\n" + " // eol-c\n" + " if\n" + " // eol-c\n" + " // eol-c\n" + " (foo(\n" + " clr, set, 1\n" + " ))\n" + " assign q = 1;\n" + " else deassign q;\n" + "endmodule\n"}, + + // ----------------------------------------------------------------- + // Comments around and inside macro calls. + +}; + +TEST(FormatterEndToEndTest, AlignFormatterTestCases) { + RunFormatterTestCases40(kAlignFormatterTestCases); +} + +TEST(FormatterEndToEndTest, AlignmentGroupBoundaryNone) { + // Default behavior: separator comments and blank lines do NOT break groups. + static constexpr FormatterTestCase kTestCases[] = { + {// Separator comment does not break alignment group + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "// ============\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + " // ============\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.alignment_group_boundary = AlignmentGroupBoundary::kNone; + style.assignment_statement_alignment = AlignmentPolicy::kAlign; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, AlignmentGroupBoundarySeparatorComments) { + static constexpr FormatterTestCase kTestCases[] = { + {// Separator comment breaks alignment group + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "// ============\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + " // ============\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + {// Dashes separator also breaks + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "// ------------\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + " // ------------\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + {// Captioned divider (text between separator runs) also breaks + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "// ------ section heading ------\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + " // ------ section heading ------\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + {// Leading-only divider run with trailing caption text + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "// ==== Registers\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + " // ==== Registers\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + {// No space after // also works + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "//============\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + " //============\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + {// Slash separator (/////) also works + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "//////////\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + " //////////\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + {// Regular comment does NOT break alignment + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "// Title text\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + " // Title text\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + {// Multi-line comment block with separators + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "// ============\n" + "// Title\n" + "// ============\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + " // ============\n" + " // Title\n" + " // ============\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + {// Short repeated body (3 chars) does NOT break + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "// ---\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + " // ---\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + {// Declarations also respect separator comments + "module m;\n" + "logic a;\n" + "logic [7:0] b;\n" + "// ============\n" + "logic c_long_name;\n" + "logic d;\n" + "endmodule\n", + "module m;\n" + " logic a;\n" + " logic [7:0] b;\n" + " // ============\n" + " logic c_long_name;\n" + " logic d;\n" + "endmodule\n"}, + {// Statements in always blocks + "module m;\n" + "always_comb begin\n" + "aaaaa = b;\n" + "c = 1'b0;\n" + "// ============\n" + "dd = eee;\n" + "ffffff = g;\n" + "end\n" + "endmodule\n", + "module m;\n" + " always_comb begin\n" + " aaaaa = b;\n" + " c = 1'b0;\n" + " // ============\n" + " dd = eee;\n" + " ffffff = g;\n" + " end\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.alignment_group_boundary = AlignmentGroupBoundary::kSeparatorComments; + style.assignment_statement_alignment = AlignmentPolicy::kAlign; + style.module_net_variable_alignment = AlignmentPolicy::kAlign; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, AlignmentGroupBoundaryBlankLines) { + static constexpr FormatterTestCase kTestCases[] = { + {// Blank line breaks alignment group + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + "\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + {// No blank line: single alignment group + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + {// Single item before blank line (not enough for alignment) + "module m;\n" + "assign foo = 1'b1;\n" + "\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + "\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + {// Separator comment does NOT break (only blank lines) + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "// ============\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + " // ============\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.alignment_group_boundary = AlignmentGroupBoundary::kBlankLines; + style.assignment_statement_alignment = AlignmentPolicy::kAlign; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, + AlignmentGroupBoundaryBlankLinesAndSeparatorComments) { + static constexpr FormatterTestCase kTestCases[] = { + {// Both blank line and separator break groups + "module m;\n" + "assign foo = 1'b1;\n" + "assign baar = 1'b0;\n" + "\n" + "assign baaaaz = 1'b1;\n" + "assign c = 1'b0;\n" + "// ============\n" + "assign dd = 1'b1;\n" + "assign eee = 1'b0;\n" + "endmodule\n", + "module m;\n" + " assign foo = 1'b1;\n" + " assign baar = 1'b0;\n" + "\n" + " assign baaaaz = 1'b1;\n" + " assign c = 1'b0;\n" + " // ============\n" + " assign dd = 1'b1;\n" + " assign eee = 1'b0;\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.alignment_group_boundary = + AlignmentGroupBoundary::kBlankLinesAndSeparatorComments; + style.assignment_statement_alignment = AlignmentPolicy::kAlign; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify kAlign behavior for body-level param/localparam declarations +// in module and package bodies. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBasics) { + static constexpr FormatterTestCase kTestCases[] = { + {// localparam alignment in module body + "module m;\n" + "localparam foo = 4'b0000;\n" + "localparam barr = 4'b0010;\n" + "localparam baaaaz = 4'b0111;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 4'b0000;\n" + " localparam barr = 4'b0010;\n" + " localparam baaaaz = 4'b0111;\n" + "endmodule\n"}, + {// localparam alignment in package body + "package p;\n" + "localparam foo = 4'b0000;\n" + "localparam barr = 4'b0010;\n" + "localparam baaaaz = 4'b0111;\n" + "endpackage\n", + "package p;\n" + " localparam foo = 4'b0000;\n" + " localparam barr = 4'b0010;\n" + " localparam baaaaz = 4'b0111;\n" + "endpackage\n"}, + {// parameter alignment in module body + "module m;\n" + "parameter int foo = 1;\n" + "parameter int barr = 2;\n" + "endmodule\n", + "module m;\n" + " parameter int foo = 1;\n" + " parameter int barr = 2;\n" + "endmodule\n"}, + {// parameter alignment in package body + "package p;\n" + "parameter int foo = 1;\n" + "parameter int barrrr = 2;\n" + "endpackage\n", + "package p;\n" + " parameter int foo = 1;\n" + " parameter int barrrr = 2;\n" + "endpackage\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify kFlushLeft behavior: body-level param/localparam declarations +// are not aligned. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentFlushLeft) { + static constexpr FormatterTestCase kTestCases[] = { + {// module body: parameters are not aligned + "module m;\n" + "localparam foo = 4'b0000;\n" + "localparam barr = 4'b0010;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 4'b0000;\n" + " localparam barr = 4'b0010;\n" + "endmodule\n"}, + {// package context: flush-left + "package p;\n" + "localparam foo = 4'b0000;\n" + "localparam barr = 4'b0010;\n" + "endpackage\n", + "package p;\n" + " localparam foo = 4'b0000;\n" + " localparam barr = 4'b0010;\n" + "endpackage\n"}, + {// generate context: flush-left + "module m;\n" + "generate\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "endgenerate\n" + "endmodule\n", + "module m;\n" + " generate\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " endgenerate\n" + "endmodule\n"}, + {// parameter in module body: flush-left + "module m;\n" + "parameter int W = 8;\n" + "parameter int HHHH = 2;\n" + "endmodule\n", + "module m;\n" + " parameter int W = 8;\n" + " parameter int HHHH = 2;\n" + "endmodule\n"}, + {// mixed parameter and localparam: flush-left, no alignment + "module m;\n" + "parameter int W = 8;\n" + "localparam L = 4;\n" + "parameter int H = 2;\n" + "endmodule\n", + "module m;\n" + " parameter int W = 8;\n" + " localparam L = 4;\n" + " parameter int H = 2;\n" + "endmodule\n"}, + {// interface context: flush-left + "interface my_if;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "endinterface\n", + "interface my_if;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + "endinterface\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify kPreserve behavior: body-level param/localparam declarations +// maintain their existing spacing. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentPreserve) { + static constexpr FormatterTestCase kTestCases[] = { + {// module body: existing spacing is kept + "module m;\n" + "localparam foo = 4'b0000;\n" + "localparam barr = 4'b0010;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 4'b0000;\n" + " localparam barr = 4'b0010;\n" + "endmodule\n"}, + {// package: existing flush-left spacing preserved + "package p;\n" + "localparam foo = 4'b0000;\n" + "localparam barr = 4'b0010;\n" + "endpackage\n", + "package p;\n" + " localparam foo = 4'b0000;\n" + " localparam barr = 4'b0010;\n" + "endpackage\n"}, + {// generate: existing aligned spacing preserved + "module m;\n" + "generate\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "endgenerate\n" + "endmodule\n", + "module m;\n" + " generate\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " endgenerate\n" + "endmodule\n"}, + {// parameter flush-left preserved + "module m;\n" + "parameter int W = 8;\n" + "parameter int HHHH = 2;\n" + "endmodule\n", + "module m;\n" + " parameter int W = 8;\n" + " parameter int HHHH = 2;\n" + "endmodule\n"}, + {// parameter pre-aligned preserved + "module m;\n" + "parameter int W = 8;\n" + "parameter int HHHH = 2;\n" + "endmodule\n", + "module m;\n" + " parameter int W = 8;\n" + " parameter int HHHH = 2;\n" + "endmodule\n"}, + {// interface pre-aligned preserved + "interface my_if;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "endinterface\n", + "interface my_if;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + "endinterface\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kPreserve; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify kAlign behavior for param/localparam declarations across +// interface, generate, and module body contexts, including mixed +// param/localparam and packed dimension alignment. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentContexts) { + static constexpr FormatterTestCase kTestCases[] = { + {// interface body localparam alignment + "interface my_if;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "endinterface\n", + "interface my_if;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + "endinterface\n"}, + {// interface body parameter alignment + "interface my_if;\n" + "parameter int X = 1;\n" + "parameter int Y_LONG = 2;\n" + "endinterface\n", + "interface my_if;\n" + " parameter int X = 1;\n" + " parameter int Y_LONG = 2;\n" + "endinterface\n"}, + {// generate block localparam alignment + "module m;\n" + "generate\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "endgenerate\n" + "endmodule\n", + "module m;\n" + " generate\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " endgenerate\n" + "endmodule\n"}, + {// generate block parameter alignment + "module m;\n" + "generate\n" + "parameter int A = 1;\n" + "parameter int BB = 2;\n" + "endgenerate\n" + "endmodule\n", + "module m;\n" + " generate\n" + " parameter int A = 1;\n" + " parameter int BB = 2;\n" + " endgenerate\n" + "endmodule\n"}, + {// mixed param and net declarations form separate alignment groups + "module m;\n" + "localparam X = 1;\n" + "localparam YYY = 2;\n" + "logic clk;\n" + "logic rst_n;\n" + "localparam ZZ = 3;\n" + "endmodule\n", + "module m;\n" + " localparam X = 1;\n" + " localparam YYY = 2;\n" + " logic clk;\n" + " logic rst_n;\n" + " localparam ZZ = 3;\n" + "endmodule\n"}, + {// mixed parameter and localparam in same block + "module m;\n" + "parameter int W = 8;\n" + "localparam L = 4;\n" + "parameter int H = 2;\n" + "endmodule\n", + "module m;\n" + " parameter int W = 8;\n" + " localparam L = 4;\n" + " parameter int H = 2;\n" + "endmodule\n"}, + {// packed dimensions are aligned + "module m;\n" + "parameter bit [7:0] X = 0;\n" + "parameter bit [31:0] YYYY = 1;\n" + "endmodule\n", + "module m;\n" + " parameter bit [ 7:0] X = 0;\n" + " parameter bit [31:0] YYYY = 1;\n" + "endmodule\n"}, + {// multi-identifier comma-separated params are not split (no-crash) + "module m;\n" + "parameter int a=1, b=2, ccc=3;\n" + "localparam d=4, e=5;\n" + "endmodule\n", + "module m;\n" + " parameter int a = 1, b = 2, ccc = 3;\n" + " localparam d = 4, e = 5;\n" + "endmodule\n"}, + {// parameter type declarations do not crash + "module m;\n" + "parameter type T = int;\n" + "parameter type TT_LONG = bit;\n" + "endmodule\n", + "module m;\n" + " parameter type T = int;\n" + " parameter type TT_LONG = bit;\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify kInferUserIntent behavior: body-level param/localparam +// declarations infer alignment intent from existing spacing. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentInferUserIntent) { + static constexpr FormatterTestCase kTestCases[] = { + {// flush-left localparams with small spacing diff: infer aligns + "module m;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + "endmodule\n"}, + {// pre-aligned localparams: infer preserves alignment + "module m;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "localparam baaaaz = 3;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " localparam baaaaz = 3;\n" + "endmodule\n"}, + {// flush-left params in package with small spacing diff: infer aligns + "package p;\n" + "localparam X = 1;\n" + "localparam YY = 2;\n" + "endpackage\n", + "package p;\n" + " localparam X = 1;\n" + " localparam YY = 2;\n" + "endpackage\n"}, + {// mixed param/localparam flush-left: infer keeps flush-left + "module m;\n" + "parameter int W = 8;\n" + "localparam L = 4;\n" + "endmodule\n", + "module m;\n" + " parameter int W = 8;\n" + " localparam L = 4;\n" + "endmodule\n"}, + {// interface flush-left with small diff: infer aligns + "interface my_if;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "endinterface\n", + "interface my_if;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + "endinterface\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify boundary behavior for param declarations with +// kBlankLinesAndSeparatorComments: both blank lines and separator comments +// break alignment groups. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBoundary) { + static constexpr FormatterTestCase kTestCases[] = { + {// separator comment breaks param alignment group + "module m;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "// ============\n" + "localparam baaaaz = 1;\n" + "localparam c = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " // ============\n" + " localparam baaaaz = 1;\n" + " localparam c = 2;\n" + "endmodule\n"}, + {// blank line breaks param alignment group + "module m;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "\n" + "localparam baaaaz = 1;\n" + "localparam c = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + "\n" + " localparam baaaaz = 1;\n" + " localparam c = 2;\n" + "endmodule\n"}, + {// no separator: single alignment group (all aligned together) + "module m;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "localparam baaaaz = 1;\n" + "localparam c = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " localparam baaaaz = 1;\n" + " localparam c = 2;\n" + "endmodule\n"}, + {// regular comment does NOT break alignment group + "module m;\n" + "localparam foo = 1;\n" + "// regular comment\n" + "localparam barr = 2;\n" + "localparam baaaaz = 1;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " // regular comment\n" + " localparam barr = 2;\n" + " localparam baaaaz = 1;\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + style.alignment_group_boundary = + AlignmentGroupBoundary::kBlankLinesAndSeparatorComments; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify edge cases: unpacked dimensions, signed/unsigned, implicit types, +// complex types, single declarations, deeply nested generate blocks. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentEdgeCases) { + // Use column_limit = 80 to avoid unintended line wrapping inside + // deeply nested generate blocks (generate-if, generate-for), which + // would interfere with verifying alignment behavior. + static constexpr FormatterTestCase kTestCases[] = { + {// unpacked dimension alignment + "module m;\n" + "parameter bit X [7:0] = 0;\n" + "parameter bit YYYY [15:0] = 1;\n" + "endmodule\n", + "module m;\n" + " parameter bit X [ 7:0] = 0;\n" + " parameter bit YYYY[15:0] = 1;\n" + "endmodule\n"}, + {// param declarations with only type and default value (no idim) + "module m;\n" + "parameter int X = 0;\n" + "parameter int YYYY = 0;\n" + "endmodule\n", + "module m;\n" + " parameter int X = 0;\n" + " parameter int YYYY = 0;\n" + "endmodule\n"}, + {// signed modifier with packed dimensions + "module m;\n" + "parameter bit signed [7:0] X = 0;\n" + "parameter bit signed [31:0] YYYY = 1;\n" + "endmodule\n", + "module m;\n" + " parameter bit signed [ 7:0] X = 0;\n" + " parameter bit signed [31:0] YYYY = 1;\n" + "endmodule\n"}, + {// param with complex type (struct/typedef) — does not crash + "module m;\n" + "parameter foo_t X = foo_t'(0);\n" + "parameter foo_t Y_LONG = foo_t'(0);\n" + "endmodule\n", + "module m;\n" + " parameter foo_t X = foo_t'(0);\n" + " parameter foo_t Y_LONG = foo_t'(0);\n" + "endmodule\n"}, + {// single param declaration (not enough for alignment group) + "module m;\n" + "localparam X = 1;\n" + "endmodule\n", + "module m;\n" + " localparam X = 1;\n" + "endmodule\n"}, + {// params inside generate-if block + "module m;\n" + "generate\n" + "if (1) begin : blk\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "end\n" + "endgenerate\n" + "endmodule\n", + "module m;\n" + " generate\n" + " if (1) begin : blk\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " end\n" + " endgenerate\n" + "endmodule\n"}, + {// unsigned keyword with packed dimensions (complement to signed) + "module m;\n" + "parameter bit unsigned [7:0] X = 0;\n" + "parameter bit unsigned [31:0] YYYY = 1;\n" + "endmodule\n", + "module m;\n" + " parameter bit unsigned [ 7:0] X = 0;\n" + " parameter bit unsigned [31:0] YYYY = 1;\n" + "endmodule\n"}, + {// parameter with implicit type (no explicit type keyword) + "module m;\n" + "parameter X = 32;\n" + "parameter Y_LONG = 64;\n" + "endmodule\n", + "module m;\n" + " parameter X = 32;\n" + " parameter Y_LONG = 64;\n" + "endmodule\n"}, + {// params inside generate-for block + "module m;\n" + "generate\n" + "for (i = 0; i < 2; i++) begin : blk\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "end\n" + "endgenerate\n" + "endmodule\n", + "module m;\n" + " generate\n" + " for (i = 0; i < 2; i++) begin : blk\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " end\n" + " endgenerate\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 80; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify parameter declarations inside generate-case blocks are aligned. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentGenerateCase) { + // Params inside generate-case need wider column limit to avoid wrapping the + // case label / begin block line. + static constexpr FormatterTestCase kTestCases[] = { + {// params inside generate-case block + "module m #(P = 0);\n" + "generate\n" + "case (P)\n" + "0: begin : blk\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "end\n" + "endcase\n" + "endgenerate\n" + "endmodule\n", + "module m #(\n" + " P = 0\n" + ");\n" + " generate\n" + " case (P)\n" + " 0: begin : blk\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " end\n" + " endcase\n" + " endgenerate\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 80; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, FormalAndBodyParamAlignmentIndependence) { + // Verify that --formal_parameters_alignment and + // --parameter_declaration_alignment act independently: setting formal params + // to kFlushLeft should not affect body-level param alignment, and vice versa. + static constexpr FormatterTestCase kTestCases[] = { + {// formal flush-left + body align: only body params align + "module m #(\n" + "int W = 2,\n" + "int LLLL = 4\n" + ");\n" + "localparam foo = 0;\n" + "localparam barrrr = 0;\n" + "endmodule\n", + "module m #(\n" + " int W = 2,\n" + " int LLLL = 4\n" + ");\n" + " localparam foo = 0;\n" + " localparam barrrr = 0;\n" + "endmodule\n"}, + {// formal align + body flush-left: only formal params align + "module m #(\n" + "int W = 2,\n" + "int LLLL = 4\n" + ");\n" + "localparam foo = 0;\n" + "localparam barrrr = 0;\n" + "endmodule\n", + "module m #(\n" + " int W = 2,\n" + " int LLLL = 4\n" + ");\n" + " localparam foo = 0;\n" + " localparam barrrr = 0;\n" + "endmodule\n"}, + {// both flush-left: no alignment anywhere + "module m #(\n" + "int W = 2,\n" + "int LLLL = 4\n" + ");\n" + "localparam foo = 0;\n" + "localparam barrrr = 0;\n" + "endmodule\n", + "module m #(\n" + " int W = 2,\n" + " int LLLL = 4\n" + ");\n" + " localparam foo = 0;\n" + " localparam barrrr = 0;\n" + "endmodule\n"}, + {// both align: both formal and body params aligned + "module m #(\n" + "int W = 2,\n" + "int LLLL = 4\n" + ");\n" + "localparam foo = 0;\n" + "localparam barrrr = 0;\n" + "endmodule\n", + "module m #(\n" + " int W = 2,\n" + " int LLLL = 4\n" + ");\n" + " localparam foo = 0;\n" + " localparam barrrr = 0;\n" + "endmodule\n"}, + }; + // First case: formal kFlushLeft, body kAlign + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + style.formal_parameters_alignment = AlignmentPolicy::kFlushLeft; + const auto &tc = kTestCases[0]; + VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>"; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } + // Second case: formal kAlign, body kFlushLeft + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft; + style.formal_parameters_alignment = AlignmentPolicy::kAlign; + const auto &tc = kTestCases[1]; + VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>"; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } + // Third case: both kFlushLeft + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft; + style.formal_parameters_alignment = AlignmentPolicy::kFlushLeft; + const auto &tc = kTestCases[2]; + VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>"; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } + // Fourth case: both kAlign + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + style.formal_parameters_alignment = AlignmentPolicy::kAlign; + const auto &tc = kTestCases[3]; + VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>"; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } +} + +TEST(FormatterEndToEndTest, ClassBodyParamNotAffected) { + // Verify that class body parameter/localparam declarations are NOT affected + // by --parameter_declaration_alignment, which targets only module/generate/ + // package/interface body-level params. + static constexpr FormatterTestCase kTestCases[] = { + {// class body params are not affected + "class c;\n" + "parameter int X = 1;\n" + "parameter int YYYY = 2;\n" + "localparam foo = 3;\n" + "localparam barrrr = 4;\n" + "endclass\n", + "class c;\n" + " parameter int X = 1;\n" + " parameter int YYYY = 2;\n" + " localparam foo = 3;\n" + " localparam barrrr = 4;\n" + "endclass\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, PackageBodyVariableAlignment) { + // Verify that moving kPackageItemList to kTabularAlignment in tree-unwrapper + // enables net/variable declaration alignment in package bodies via + // module_net_variable_alignment. + static constexpr FormatterTestCase kTestCases[] = { + {// net/variable declaration alignment in package body + "package p;\n" + "logic [7:0] a;\n" + "logic [31:0] bb;\n" + "endpackage\n", + "package p;\n" + " logic [ 7:0] a;\n" + " logic [31:0] bb;\n" + "endpackage\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.module_net_variable_alignment = AlignmentPolicy::kAlign; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentApplyToAll) { + // Verify that ApplyToAllAlignmentPolicies affects + // parameter_declaration_alignment for all four alignment policies. + static constexpr FormatterTestCase kTestCases[] = { + {// kAlign aligns identifiers and = signs across declarations + "module m;\n" + "localparam foo = 1;\n" + "localparam barrrr = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barrrr = 2;\n" + "endmodule\n"}, + {// kFlushLeft: declarations remain flush-left + "module m;\n" + "localparam foo = 1;\n" + "localparam barrrr = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barrrr = 2;\n" + "endmodule\n"}, + {// kPreserve: existing spacing is kept + "module m;\n" + "localparam foo = 1;\n" + "localparam barrrr = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barrrr = 2;\n" + "endmodule\n"}, + {// kInferUserIntent: large identifier width difference (3 cols) + // suggests flush-left intent, no alignment. + "module m;\n" + "localparam foo = 1;\n" + "localparam barrrr = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barrrr = 2;\n" + "endmodule\n"}, + }; + // kAlign + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kAlign); + const auto &tc = kTestCases[0]; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } + // kFlushLeft + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kFlushLeft); + const auto &tc = kTestCases[1]; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } + // kPreserve + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kPreserve); + const auto &tc = kTestCases[2]; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } + // kInferUserIntent + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kInferUserIntent); + const auto &tc = kTestCases[3]; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } +} + +// Verify that alignment_group_boundary=kBlankLines treats only blank lines +// (not separator comments) as boundary breaks for param declarations. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBoundaryBlankLines) { + static constexpr FormatterTestCase kTestCases[] = { + {// Only blank line breaks group; separator comment does not + "module m;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "\n" + "localparam baaaaz = 1;\n" + "localparam c = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + "\n" + " localparam baaaaz = 1;\n" + " localparam c = 2;\n" + "endmodule\n"}, + {// Separator comment does NOT break group with kBlankLines + "module m;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "// ============\n" + "localparam baaaaz = 1;\n" + "localparam c = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " // ============\n" + " localparam baaaaz = 1;\n" + " localparam c = 2;\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + style.alignment_group_boundary = AlignmentGroupBoundary::kBlankLines; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify that alignment_group_boundary=kNone keeps all param declarations +// in a single alignment group regardless of blank lines or comments. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBoundaryNone) { + static constexpr FormatterTestCase kTestCases[] = { + {// Blank line does NOT break group with kNone + "module m;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "\n" + "localparam baaaaz = 1;\n" + "localparam c = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + "\n" + " localparam baaaaz = 1;\n" + " localparam c = 2;\n" + "endmodule\n"}, + {// Separator comment does NOT break group with kNone + "module m;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "// ============\n" + "localparam baaaaz = 1;\n" + "localparam c = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " // ============\n" + " localparam baaaaz = 1;\n" + " localparam c = 2;\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + style.alignment_group_boundary = AlignmentGroupBoundary::kNone; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify that alignment_group_boundary=kSeparatorComments treats only +// separator comments (not blank lines) as boundary breaks for param +// declarations. +TEST(FormatterEndToEndTest, + ParamDeclarationAlignmentBoundarySeparatorComments) { + static constexpr FormatterTestCase kTestCases[] = { + {// Separator comment breaks alignment group + "module m;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "// ============\n" + "localparam baaaaz = 1;\n" + "localparam c = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " // ============\n" + " localparam baaaaz = 1;\n" + " localparam c = 2;\n" + "endmodule\n"}, + {// Blank line does NOT break group with kSeparatorComments + "module m;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "\n" + "localparam baaaaz = 1;\n" + "localparam c = 2;\n" + "endmodule\n", + "module m;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + "\n" + " localparam baaaaz = 1;\n" + " localparam c = 2;\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + style.alignment_group_boundary = AlignmentGroupBoundary::kSeparatorComments; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify that class body parameter/localparam declarations are NOT affected +// by --parameter_declaration_alignment for the kFlushLeft, kPreserve, +// and kInferUserIntent policies (kAlign is covered in +// ClassBodyParamNotAffected). +TEST(FormatterEndToEndTest, ClassBodyParamNotAffectedOtherPolicies) { + static constexpr FormatterTestCase kTestCases[] = { + {// kFlushLeft: class body params remain flush-left + "class c;\n" + "parameter int X = 1;\n" + "parameter int YYYY = 2;\n" + "localparam foo = 3;\n" + "localparam barrrr = 4;\n" + "endclass\n", + "class c;\n" + " parameter int X = 1;\n" + " parameter int YYYY = 2;\n" + " localparam foo = 3;\n" + " localparam barrrr = 4;\n" + "endclass\n"}, + {// kPreserve: parameter_declaration_alignment does not apply to class + // bodies; whitespace is normalized by default formatting. + "class c;\n" + "parameter int X = 1;\n" + "parameter int YYYY = 2;\n" + "endclass\n", + "class c;\n" + " parameter int X = 1;\n" + " parameter int YYYY = 2;\n" + "endclass\n"}, + {// kInferUserIntent: class body params infer flush-left + "class c;\n" + "parameter int X = 1;\n" + "parameter int YYYY = 2;\n" + "endclass\n", + "class c;\n" + " parameter int X = 1;\n" + " parameter int YYYY = 2;\n" + "endclass\n"}, + }; + // kFlushLeft + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft; + const auto &tc = kTestCases[0]; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } + // kPreserve + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kPreserve; + const auto &tc = kTestCases[1]; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } + // kInferUserIntent + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent; + const auto &tc = kTestCases[2]; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } +} + +// Verify formal_parameters_alignment and parameter_declaration_alignment +// independence for kPreserve and kInferUserIntent combinations. +TEST(FormatterEndToEndTest, + FormalAndBodyParamAlignmentIndependenceOtherPolicies) { + static constexpr FormatterTestCase kTestCases[] = { + {// formal kPreserve + body kAlign: only body params aligned + "module m #(\n" + "int W = 2,\n" + "int LLLL = 4\n" + ");\n" + "localparam foo = 0;\n" + "localparam barrrr = 0;\n" + "endmodule\n", + "module m #(\n" + " int W = 2,\n" + " int LLLL = 4\n" + ");\n" + " localparam foo = 0;\n" + " localparam barrrr = 0;\n" + "endmodule\n"}, + {// formal kAlign + body kPreserve: only formal params aligned + "module m #(\n" + "int W = 2,\n" + "int LLLL = 4\n" + ");\n" + "localparam foo = 0;\n" + "localparam barrrr = 0;\n" + "endmodule\n", + "module m #(\n" + " int W = 2,\n" + " int LLLL = 4\n" + ");\n" + " localparam foo = 0;\n" + " localparam barrrr = 0;\n" + "endmodule\n"}, + {// formal kInferUserIntent + body kAlign: only body params aligned + "module m #(\n" + "int W = 2,\n" + "int LLLL = 4\n" + ");\n" + "localparam foo = 0;\n" + "localparam barrrr = 0;\n" + "endmodule\n", + "module m #(\n" + " int W = 2,\n" + " int LLLL = 4\n" + ");\n" + " localparam foo = 0;\n" + " localparam barrrr = 0;\n" + "endmodule\n"}, + }; + // formal kPreserve + body kAlign + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + style.formal_parameters_alignment = AlignmentPolicy::kPreserve; + const auto &tc = kTestCases[0]; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } + // formal kAlign + body kPreserve + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kPreserve; + style.formal_parameters_alignment = AlignmentPolicy::kAlign; + const auto &tc = kTestCases[1]; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } + // formal kInferUserIntent + body kAlign + { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + style.formal_parameters_alignment = AlignmentPolicy::kInferUserIntent; + const auto &tc = kTestCases[2]; + std::ostringstream stream; + const auto status = FormatVerilog(tc.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; + } +} + +// Verify parameter declarations with string, real, and function-call default +// value types to exercise the ColumnSchemaScanner on non-standard type tokens. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentTypeVariants) { + static constexpr FormatterTestCase kTestCases[] = { + {// parameter real type + "module m;\n" + "parameter real X = 1.0;\n" + "parameter real Y_LONG = 2.0;\n" + "endmodule\n", + "module m;\n" + " parameter real X = 1.0;\n" + " parameter real Y_LONG = 2.0;\n" + "endmodule\n"}, + {// parameter string type + "module m;\n" + "parameter string s = \"hello\";\n" + "parameter string long_s = \"world\";\n" + "endmodule\n", + "module m;\n" + " parameter string s = \"hello\";\n" + " parameter string long_s = \"world\";\n" + "endmodule\n"}, + {// parameter with function call in default value + "module m;\n" + "parameter int W = func(1, 2);\n" + "parameter int H_LONG = other(3);\n" + "endmodule\n", + "module m;\n" + " parameter int W = func(1, 2);\n" + " parameter int H_LONG = other(3);\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify parameter_declaration_alignment kInferUserIntent in package bodies. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentPackageInfer) { + static constexpr FormatterTestCase kTestCases[] = { + {// flush-left params with small diff: infer aligns + "package p;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "endpackage\n", + "package p;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + "endpackage\n"}, + {// pre-aligned params: infer preserves + "package p;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "localparam baaaaz = 3;\n" + "endpackage\n", + "package p;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " localparam baaaaz = 3;\n" + "endpackage\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify parameter_declaration_alignment boundary behavior in package bodies. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentPackageBoundary) { + static constexpr FormatterTestCase kTestCases[] = { + {// blank line breaks alignment group in package + "package p;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "\n" + "localparam baaaaz = 1;\n" + "localparam c = 2;\n" + "endpackage\n", + "package p;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + "\n" + " localparam baaaaz = 1;\n" + " localparam c = 2;\n" + "endpackage\n"}, + {// separator comment breaks alignment group in package + "package p;\n" + "localparam foo = 1;\n" + "localparam barr = 2;\n" + "// ============\n" + "localparam baaaaz = 1;\n" + "localparam c = 2;\n" + "endpackage\n", + "package p;\n" + " localparam foo = 1;\n" + " localparam barr = 2;\n" + " // ============\n" + " localparam baaaaz = 1;\n" + " localparam c = 2;\n" + "endpackage\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + style.alignment_group_boundary = + AlignmentGroupBoundary::kBlankLinesAndSeparatorComments; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify the most common default scenario: both formal_parameters_alignment +// and parameter_declaration_alignment set to kInferUserIntent. +TEST(FormatterEndToEndTest, BothParamAlignmentsInferUserIntent) { + static constexpr FormatterTestCase kTestCases[] = { + {// both flush-left with small diff: infer aligns both formal and body + "module m #(\n" + "int W = 2,\n" + "int LL = 4\n" + ");\n" + "localparam foo = 0;\n" + "localparam barr = 0;\n" + "endmodule\n", + "module m #(\n" + " int W = 2,\n" + " int LL = 4\n" + ");\n" + " localparam foo = 0;\n" + " localparam barr = 0;\n" + "endmodule\n"}, + {// both infer: pre-aligned formal, pre-aligned body preserved + "module m #(\n" + "int W = 2,\n" + "int LLLL = 4\n" + ");\n" + "localparam foo = 0;\n" + "localparam barrrr = 0;\n" + "endmodule\n", + "module m #(\n" + " int W = 2,\n" + " int LLLL = 4\n" + ");\n" + " localparam foo = 0;\n" + " localparam barrrr = 0;\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent; + style.formal_parameters_alignment = AlignmentPolicy::kInferUserIntent; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Verify that a large multi-line comment block between parameter +// declarations does not crash the formatter. The tree-unwrapper may +// produce a partition structure where the comment tokens are absorbed +// into the following parameter partition, which the alignment code +// must handle gracefully by skipping alignment for that row. +TEST(FormatterEndToEndTest, ParamDeclarationAlignmentCommentBlockNoCrash) { + // These inputs contain large multi-line comment blocks between + // parameter/localparam declarations. The formatter must not crash + // (SIGABRT). Output correctness is secondary; the formatter may + // fall back to preserving the original input when the partition + // structure prevents safe alignment. + const char *kInputs[] = { + "module m;\n" + "parameter int W = 8;\n" + "// Multi-line comment block\n" + "// that spans across\n" + "//\n" + "// several lines\n" + "// of explanatory text\n" + "//\n" + "// It contains enough\n" + "// lines to trigger\n" + "// the partition structure\n" + "// edge case where\n" + "// comment tokens are\n" + "// absorbed into the\n" + "// following parameter\n" + "// partition.\n" + "//\n" + "localparam int H = 2;\n" + "endmodule\n", + "package p;\n" + "parameter int X = 1;\n" + "// Long comment block\n" + "// with many lines\n" + "//\n" + "// of text\n" + "//\n" + "localparam int Y = 2;\n" + "endpackage\n", + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.parameter_declaration_alignment = AlignmentPolicy::kAlign; + for (const char *input : kInputs) { + VLOG(1) << "code-to-format:\n" << input << "<EOF>"; + std::ostringstream stream; + const auto status = FormatVerilog(input, "<filename>", style, stream); + // The primary requirement is that the formatter does not crash + // (SIGABRT). Gtest will report failure if the process aborts. + // The partition structure may cause output format differences; + // the important thing is the formatter handled it gracefully. + } +} + +} // namespace +} // namespace formatter +} // namespace verilog
diff --git a/verible/verilog/formatting/formatter_class_package_test.cc b/verible/verilog/formatting/formatter_class_package_test.cc new file mode 100644 index 0000000..0c5e067 --- /dev/null +++ b/verible/verilog/formatting/formatter_class_package_test.cc
@@ -0,0 +1,974 @@ +// Copyright 2017-2026 The Verible Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Test cases in this file should be *insensitive* to wrapping penalties. +// Penalty-sensitive tests belong in formatter-tuning_test.cc. + +#include "gtest/gtest.h" +#include "verible/verilog/formatting/formatter-test-utils.h" + +namespace verilog { +namespace formatter { +namespace { + +static constexpr FormatterTestCase kClassPackageFormatterTestCases[] = { + // interface test cases + {// two interface declarations + " interface if1 ; endinterface\t\t" + "interface if2; endinterface ", + "interface if1;\n" + "endinterface\n" + "interface if2;\n" + "endinterface\n"}, + {// two interface declarations, end labels + " interface if1 ; endinterface:if1\t\t" + "interface if2; endinterface : if2 ", + "interface if1;\n" + "endinterface : if1\n" + "interface if2;\n" + "endinterface : if2\n"}, + {// interface declaration with parameters + " interface if1#( parameter int W= 8 );endinterface\t\t", + "interface if1 #(\n" + " parameter int W = 8\n" + ");\n" + "endinterface\n"}, + {// interface declaration with ports (empty) + " interface if1()\n;endinterface\t\t", + "interface if1 ();\n" + "endinterface\n"}, + {// interface declaration with parameter comment only, empty ports + " interface if1#( \n" + "//param\n" + ")();endinterface\t\t", + "interface if1 #(\n" + " //param\n" + ") ();\n" + "endinterface\n"}, + {// interface declaration with parameter, empty ports + " interface if1#( parameter int W= 8 )();endinterface\t\t", + "interface if1 #(\n" + " parameter int W = 8\n" + ") ();\n" + "endinterface\n"}, + {// interface declaration with ports + " interface if1( input\tlogic z)\n;endinterface\t\t", + "interface if1 (\n" + " input logic z\n" + ");\n" + "endinterface\n"}, + {// interface declaration with multiple ports + " interface if1( input\tlogic z, output logic a)\n;endinterface\t\t", + "interface if1 (\n" + " input logic z,\n" // should be one-per-line, even it it fits + " output logic a\n" // aligned + ");\n" + "endinterface\n"}, + {// interface declaration with parameters and ports + " interface if1#( parameter int W= 8 )(input logic z);endinterface\t\t", + // doesn't fit on one line + "interface if1 #(\n" + " parameter int W = 8\n" + ") (\n" + " input logic z\n" + ");\n" + "endinterface\n"}, + { + // interface with modport declarations + "interface\tfoo_if ;" + "modport mp1\t( output a, input b);" + "modport\tmp2 (output c,input d );\t" + "endinterface", + "interface foo_if;\n" + " modport mp1(output a, input b);\n" + " modport mp2(output c, input d);\n" + "endinterface\n", + }, + { + // interface with long modport port names + "interface\tfoo_if ;" + "modport mp1\t( output a_long_output, input detailed_input_name);" + "endinterface", + "interface foo_if;\n" + " modport mp1(\n" + " output a_long_output,\n" + " input detailed_input_name\n" + " );\n" + "endinterface\n", + }, + { + // interface with modport declaration with multiple ports + "interface\tfoo_if ;" + "modport mp1\t( output a_long_output, input detailed_input_name);" + "endinterface", + "interface foo_if;\n" + " modport mp1(\n" + " output a_long_output,\n" + " input detailed_input_name\n" + " );\n" + "endinterface\n", + }, + { + // interface with modport TF port declaration + "interface\tfoo_if ;" + "modport mp1\t( output a, input b, import c);" + "endinterface", + "interface foo_if;\n" + " modport mp1(\n" + " output a,\n" + " input b,\n" + " import c\n" + " );\n" + "endinterface\n", + }, + { + // interface with complex modport ports list + "interface\tfoo_if ;" + "modport producer\t(input ready,\toutput data, valid, user," + " strobe, keep, last,\timport producer_reset, producer_tick);" + "modport consumer\t(input data, valid, user, strobe, keep, last," + " output ready,\timport consumer_reset, consumer_tick, consume);" + "endinterface", + "interface foo_if;\n" + " modport producer(\n" + " input ready,\n" + " output data, valid, user, strobe,\n" + " keep, last,\n" + " import producer_reset,\n" + " producer_tick\n" + " );\n" + " modport consumer(\n" + " input data, valid, user, strobe,\n" + " keep, last,\n" + " output ready,\n" + " import consumer_reset,\n" + " consumer_tick, consume\n" + " );\n" + "endinterface\n", + }, + { + // interface with modports and comments inside + "interface foo_if;\n" + " modport mp1(\n" + " // Our output\n" + " output a,\n" + " /* Inputs */\n" + " input b1, b_f /*last*/," + " import c\n" + " );\n" + "endinterface\n", + "interface foo_if;\n" + " modport mp1(\n" + " // Our output\n" + " output a,\n" + " /* Inputs */\n" + " input b1, b_f /*last*/,\n" + " import c\n" + " );\n" + "endinterface\n", + }, + + // class test cases + {"class action;int xyz;endclass : action\n", + "class action;\n" + " int xyz;\n" + "endclass : action\n"}, + {"class action extends mypkg :: inaction;endclass : action\n", + "class action extends mypkg::inaction;\n" // tests for spacing around :: + "endclass : action\n"}, + {"class c;function new;endfunction endclass", + "class c;\n" + " function new;\n" + " endfunction\n" + "endclass\n"}, + {"class c;function new ( );endfunction endclass", + "class c;\n" + " function new();\n" + " endfunction\n" + "endclass\n"}, + {"class c;function new ( string s );endfunction endclass", + "class c;\n" + " function new(string s);\n" + " endfunction\n" + "endclass\n"}, + {"class c;function new ( string s ,int i );endfunction endclass", + "class c;\n" + " function new(string s, int i);\n" + " endfunction\n" + "endclass\n"}, + {"class c;function void f;endfunction endclass", + "class c;\n" + " function void f;\n" + " endfunction\n" + "endclass\n"}, + {"class c;virtual function void f;endfunction endclass", + "class c;\n" + " virtual function void f;\n" + " endfunction\n" + "endclass\n"}, + {"class c;function int f ( );endfunction endclass", + "class c;\n" + " function int f();\n" + " endfunction\n" + "endclass\n"}, + {"class c;function int f ( int ii );endfunction endclass", + "class c;\n" + " function int f(int ii);\n" + " endfunction\n" + "endclass\n"}, + {"class c;function int f ( int ii ,bit bb );endfunction endclass", + "class c;\n" + " function int f(int ii, bit bb);\n" + " endfunction\n" + "endclass\n"}, + {"class c;task t ;endtask endclass", + "class c;\n" + " task t;\n" + " endtask\n" + "endclass\n"}, + {"class c;task t ( int ii ,bit bb );endtask endclass", + "class c;\n" + " task t(int ii, bit bb);\n" + " endtask\n" + "endclass\n"}, + {"class c; task automatic repeated_assigner;" + "repeat (count) y = w;" // single statement body + "endtask endclass", + "class c;\n" + " task automatic repeated_assigner;\n" + " repeat (count) y = w;\n" + " endtask\n" + "endclass\n"}, + {"class c; task automatic delayed_assigner;" + "# 100 y = w;" // delayed assignment + "endtask endclass", + "class c;\n" + " task automatic delayed_assigner;\n" + " #100 y = w;\n" + " endtask\n" + "endclass\n"}, + {"class c; task automatic labeled_assigner;" + "lbl : y = w;" // delayed assignment + "endtask endclass", + "class c;\n" + " task automatic labeled_assigner;\n" + " lbl : y = w;\n" // TODO(fangism): no space before ':' + " endtask\n" + "endclass\n"}, + // task with macro call + {"module m1;\ntask automatic t1();\n" + "t2(`R1(1)+ 8);endtask : t1\nendmodule", + "module m1;\n" + " task automatic t1();\n" + " t2(`R1(1) + 8);\n" + " endtask : t1\n" + "endmodule\n"}, + + // tasks with control statements + {"class c; task automatic waiter;" + "if (count == 0) begin #0; return;end " + "endtask endclass", + "class c;\n" + " task automatic waiter;\n" + " if (count == 0) begin\n" + " #0;\n" + " return;\n" + " end\n" + " endtask\n" + "endclass\n"}, + {"class c; task automatic heartbreaker;" + "if( c)if( d) break ;" + "endtask endclass", + "class c;\n" + " task automatic heartbreaker;\n" + " if (c) if (d) break;\n" + " endtask\n" + "endclass\n"}, + {"class c; task automatic waiter;" + "repeat (count) @(posedge clk);" + "endtask endclass", + "class c;\n" + " task automatic waiter;\n" + " repeat (count) @(posedge clk);\n" + " endtask\n" + "endclass\n"}, + {"class c; task automatic repeat_assigner;" + "repeat( r )\ny = w;" + "repeat( q )\ny = 1;" + "endtask endclass", + "class c;\n" + " task automatic repeat_assigner;\n" + " repeat (r) y = w;\n" + " repeat (q) y = 1;\n" + " endtask\n" + "endclass\n"}, + {"class c; task automatic event_control_assigner;" + "@ ( posedge clk )\ny = w;" + "@ ( negedge clk )\nz = w;" + "endtask endclass", + "class c;\n" + " task automatic event_control_assigner;\n" + " @(posedge clk) y = w;\n" + " @(negedge clk) z = w;\n" + " endtask\n" + "endclass\n"}, + { + // classes with surrrounding comments + // vertical spacing preserved + "\n// pre-c\n\n" + " class c ;\n" + "// c stuff\n" + "endclass\n" + " // pre-d\n" + "\n\nclass d ;\n" + " // d stuff\n" + "endclass\n" + "\n// the end\n", + "\n// pre-c\n\n" + "class c;\n" + " // c stuff\n" + "endclass\n" + "// pre-d\n\n\n" + "class d;\n" + " // d stuff\n" + "endclass\n\n" + "// the end\n", + }, + {// class with comments around task/function declarations + "class c; // c is for cookie\n" + " // f is for false\n" + "\tfunction f(integer size) ; endfunction\n" + " // t is for true\n" + "task t();endtask\n" + " // class is about to end\n" + "endclass", + "class c; // c is for cookie\n" + " // f is for false\n" + " function f(integer size);\n" + " endfunction\n" + " // t is for true\n" + " task t();\n" + " endtask\n" + " // class is about to end\n" + "endclass\n"}, + + // interface class test cases + {"interface class Foo;\nendclass\n", + "interface class Foo;\n" + "endclass\n"}, + {"interface class Foo ; endclass\n", + "interface class Foo;\n" + "endclass\n"}, + {"interface class Foo extends Bar , Baz ;\nendclass\n", + "interface class Foo extends Bar, Baz;\n" + "endclass\n"}, + {"interface class Foo;\n pure virtual task foo ( ) ; \nendclass\n", + "interface class Foo;\n" + " pure virtual task foo();\n" + "endclass\n"}, + + // class property alignment test cases + {"class c;\n" + "int foo ;\n" + "byte bar;\n" + "endclass : c\n", + "class c;\n" + " int foo;\n" + " byte bar;\n" + "endclass : c\n"}, + {"class c;\n" + "int foo;\n" + "const bit b;\n" + "endclass : c\n", + "class c;\n" + " int foo;\n" + " const bit b;\n" + "endclass : c\n"}, + {"class c;\n" + "rand logic l;\n" + "int foo;\n" + "endclass : c\n", + "class c;\n" + " rand logic l;\n" + " int foo;\n" + "endclass : c\n"}, + {"class c;\n" + "rand logic l;\n" + "const static int foo;\n" // more qualifiers + "endclass : c\n", + "class c;\n" + " rand logic l;\n" + " const static int foo;\n" + "endclass : c\n"}, + {"class c;\n" + "static local int foo;\n" + "const bit b;\n" + "endclass : c\n", + "class c;\n" + " static local int foo;\n" + " const bit b;\n" + "endclass : c\n"}, + {// example with queue + "class c;\n" + "int foo [$] ;\n" + "int foo_bar ;\n" + "endclass : c\n", + "class c;\n" + " int foo [$];\n" + " int foo_bar;\n" + "endclass : c\n"}, + {// subcolumns + "class cc;\n" + "rand bit [A-1:0] foo;\n" + "rand bit [A-1:0][2] bar;\n" + "int foobar[X+1:Y];\n" + "int baz[42];\n" + "rand bit qux[Z];\n" + "rand bit [1:0] quux[3:0];\n" + "rand bit [A:BB][42] quuz[7];\n" + "endclass\n", + "class cc;\n" + " rand bit [A-1: 0] foo;\n" + " rand bit [A-1: 0][ 2] bar;\n" + " int foobar[X+1:Y];\n" + " int baz [ 42];\n" + " rand bit qux [ Z];\n" + " rand bit [ 1: 0] quux [ 3:0];\n" + " rand bit [ A:BB][42] quuz [ 7];\n" + "endclass\n"}, + {"class cc;\n" + "int qux[2];\n" + "int quux[SIZE-1+SHIFT:SHIFT];\n" + "int quuz[SOME_CONSTANT];\n" + "endclass\n", + "class cc;\n" + " int qux [ 2];\n" + " int quux[SIZE-1+SHIFT:SHIFT];\n" + " int quuz[ SOME_CONSTANT];\n" + "endclass\n"}, + {// aligns over comments (ignored) + "class c;\n" + "// foo is...\n" + "int foo;\n" + "// b is...\n" + "const bit b;\n" + " // llama is...\n" + "logic llama;\n" + "endclass : c\n", + "class c;\n" + " // foo is...\n" + " int foo;\n" + " // b is...\n" + " const bit b;\n" + " // llama is...\n" + " logic llama;\n" + "endclass : c\n"}, + {// aligns over comments (ignored), even with blank lines + "class c;\n" + "// foo is...\n" + "int foo;\n" + "\n" + "// b is...\n" + "const bit b;\n" + "\n" + " // llama is...\n" + "logic llama;\n" + "endclass : c\n", + "class c;\n" + " // foo is...\n" + " int foo;\n" + "\n" + " // b is...\n" + " const bit b;\n" + "\n" + " // llama is...\n" + " logic llama;\n" + "endclass : c\n"}, + {"class c;\n" + "rand logic l;\n" + "int [1:0] foo;\n" + "endclass : c\n", + "class c;\n" + " rand logic l;\n" + " int [1:0] foo;\n" + "endclass : c\n"}, + {// non-data-declarations break up groups + "class c;\n" + "rand logic l;\n" + "int foo;\n" + "`uvm_bar_foo()\n" + "logic k;\n" + "rand int bar;\n" + "endclass : c\n", + "class c;\n" + " rand logic l;\n" + " int foo;\n" + " `uvm_bar_foo()\n" // separates alignment groups above/below + " logic k;\n" + " rand int bar;\n" + "endclass : c\n"}, + {// non-data-declarations break up groups + "class c;\n" + "logic k;\n" + "rand int bar;\n" + "function void f();\n" + "endfunction\n" + "rand logic l;\n" + "int foo;\n" + "endclass : c\n", + "class c;\n" + " logic k;\n" + " rand int bar;\n" + " function void f();\n" // function declaration breaks groups + " endfunction\n" + " rand logic l;\n" + " int foo;\n" + "endclass : c\n"}, + {// align single-value initializers at the '=' + "class c;\n" + "const logic foo=0;\n" + "const bit b=1;\n" + "endclass : c\n", + "class c;\n" + " const logic foo = 0;\n" + " const bit b = 1;\n" + "endclass : c\n"}, + {// align single-value initializers at the '=', over non-initialized + "class c;\n" + "const logic foo=0;\n" + "rand int iidrv;\n" + "const bit b=1;\n" + "endclass : c\n", + "class c;\n" + " const logic foo = 0;\n" + " rand int iidrv;\n" // no initializer, but align across this + " const bit b = 1;\n" + "endclass : c\n"}, + + // constraint test cases + { + "class foo; constraint c1_c{ } endclass", + "class foo;\n" + " constraint c1_c {}\n" + "endclass\n", + }, + { + "class foo; constraint c1_c{ } constraint c2_c{ } endclass", + "class foo;\n" + " constraint c1_c {}\n" + " constraint c2_c {}\n" + "endclass\n", + }, + { + "class foo; constraint c1_c{soft z==y;unique{baz};}endclass", + "class foo;\n" + " constraint c1_c {\n" + " soft z == y;\n" + " unique {baz};\n" + " }\n" + "endclass\n", + }, + { + "class foo; constraint c1_c{ //comment1\n" + "//comment2\n" + "//comment3\n" + "} endclass", + "class foo;\n" + " constraint c1_c { //comment1\n" + " //comment2\n" + " //comment3\n" + " }\n" + "endclass\n", + }, + + {"class foo;constraint c { " + "timer_enable dist { [ 8'h0 : 8'hfe ] :/ 90 , 8'hff :/ 10 }; " + "} endclass\n", + "class foo;\n" + " constraint c {\n" + " timer_enable dist {\n" + " [8'h0 : 8'hfe] :/ 90,\n" + " 8'hff :/ 10\n" // aligned + " };\n" + " }\n" + "endclass\n"}, + + { + "class Foo; constraint if_c { if (z) { soft x == y; } } endclass\n", + "class Foo;\n" + " constraint if_c {\n" + " if (z) {\n" + " soft x == y;\n" + " }\n" + " }\n" + "endclass\n", + }, + { + "class Foo; constraint if_c { if (z) {\n" + "//comment-a\n" + "soft x == y;\n" + "//comment-b\n" + "} } endclass\n", + "class Foo;\n" + " constraint if_c {\n" + " if (z) {\n" + " //comment-a\n" // properly indented + " soft x == y;\n" + " //comment-b\n" // properly indented + " }\n" + " }\n" + "endclass\n", + }, + { + "class c; " + "constraint c_has_config_error {" + "if (yyy) {zzzz == 1;} else {yyyyyyy == 0;}} " + "endclass", + "class c;\n" + " constraint c_has_config_error {\n" + " if (yyy) {\n" + " zzzz == 1;\n" + " } else {\n" + " yyyyyyy == 0;\n" + " }\n" + " }\n" + "endclass\n", + }, + // distributions: colon alignment + {"class c;\n" + "constraint co {\n" + "d dist {\n" + "[1:2]:/2,\n" + "[11:33]:/22,\n" + "[111:444]:/8,\n" + "[1:42]:/10,\n" + "[11:12]:/3\n" + "};\n" + "}\n" + "endclass\n", + "class c;\n" + " constraint co {\n" + " d dist {\n" + " [ 1 : 2] :/ 2,\n" + " [ 11 : 33] :/ 22,\n" + " [111 : 444] :/ 8,\n" + " [ 1 : 42] :/ 10,\n" + " [ 11 : 12] :/ 3\n" + " };\n" + " }\n" + "endclass\n"}, + // distributions: subcolumns + {"class foo;\n" + "constraint bar {\n" + "baz dist {\n" + "[1:2]:/2,\n" + "QUX[3:0]:/10,\n" + "[11:33]:/22,\n" + "ID_LONGER_THAN_RANGES:/3,\n" + "[111:QUUZ[Z]]:/8,\n" + "[X[4:0]:Y[8:Z-2]]:/8\n" + "};\n" + "}\n" + "endclass\n", + "class foo;\n" + " constraint bar {\n" + " baz dist {\n" + " [ 1 : 2] :/ 2,\n" + " QUX[3:0] :/ 10,\n" + " [ 11 : 33] :/ 22,\n" + " ID_LONGER_THAN_RANGES :/ 3,\n" + " [ 111 : QUUZ[Z]] :/ 8,\n" + " [X[4:0] : Y[8:Z-2]] :/ 8\n" + " };\n" + " }\n" + "endclass\n"}, + // class with empty parameter list + {"class foo #(); endclass", + "class foo #();\n" + "endclass\n"}, + // class with empty parameter list, with comment + {"class foo #( \n" + "// comment\n" + "); endclass", + "class foo #(\n" + " // comment\n" + ");\n" + "endclass\n"}, + // class with empty parameter list, extends + {"class foo #()extends bar ; endclass", + "class foo #() extends bar;\n" + "endclass\n"}, + // class extends from type with named parameters + {"class foo extends bar #(.N(N), .M(M)); endclass", + "class foo extends bar #(\n" + " .N(N),\n" + " .M(M)\n" + ");\n" + "endclass\n"}, + + // class with one parameter list + {"class foo #(type a = b); endclass", + "class foo #(\n" + " type a = b\n" + ");\n" + "endclass\n"}, + + // class with multiple paramter list + {"class foo #(type a = b, type c = d, type e = f); endclass", + "class foo #(\n" + " type a = b,\n" + " type c = d,\n" + " type e = f\n" + ");\n" + "endclass\n"}, + + // class with data members + {"class i_love_data ;const\ninteger sizer\t;endclass", + "class i_love_data;\n" + " const integer sizer;\n" + "endclass\n"}, + {"class i_love_data ;const\ninteger sizer=3\t;endclass", + "class i_love_data;\n" + " const integer sizer = 3;\n" + "endclass\n"}, + {"class i_love_data ;protected\nint count \t;endclass", + "class i_love_data;\n" + " protected int count;\n" + "endclass\n"}, + {"class i_love_data ;\t\nint counter\n ;int countess \t;endclass", + "class i_love_data;\n" + " int counter;\n" + " int countess;\n" + "endclass\n"}, + {"class i_love_params ;foo#( . bar) baz\t;endclass", + "class i_love_params;\n" + " foo #(.bar) baz;\n" + "endclass\n"}, + {"class i_love_params ;foo#( . bar ( bah )) baz\t;endclass", + "class i_love_params;\n" + " foo #(.bar(bah)) baz;\n" + "endclass\n"}, + {"class i_love_params ;foo#( . bar ( bah\n)," + ".\ncat( dog) ) baz\t;endclass", + "class i_love_params;\n" + " foo #(\n" + " .bar(bah),\n" + " .cat(dog)\n" + " ) baz;\n" + "endclass\n"}, + {"class i_love_params ;foo#( . bar) baz1,baz2\t;endclass", + "class i_love_params;\n" + " foo #(.bar) baz1, baz2;\n" + "endclass\n"}, + {"class i_love_params ;foo#( . bar) baz\t;baz#(.foo)bar;endclass", + "class i_love_params;\n" + " foo #(.bar) baz;\n" + " baz #(.foo) bar;\n" + "endclass\n"}, + {"class i_love_params // comment\n" + ";\n" + "foo#(\n" + ".foobar(quuuuux) // comment\n" + ", .cat(dog)\n" + ") baz // comment\n" + ";endclass\n", + "class i_love_params // comment\n" + ";\n" + " foo #(\n" + " .foobar(quuuuux) // comment\n" + " , .cat (dog)\n" + " ) baz // comment\n" + " ;\n" + "endclass\n"}, + + // typedef test cases + {"typedef enum logic\t{ A=0, B=1 }foo_t;", + "typedef enum logic {\n" + " A = 0,\n" + " B = 1\n" + "} foo_t;\n"}, + {"typedef enum uint8_t\t{ kA=8'b0, kB=8'b1 }foo_t;", + "typedef enum uint8_t {\n" // uint8_t is user-defined + " kA = 8'b0,\n" + " kB = 8'b1\n" + "} foo_t;\n"}, + {// With comments on same line as enum value + "typedef enum logic\t{ A=0, // foo\n" + "B,// bar\n" + "`ifndef DO_PANIC\n" + "C=42,// answer\n" + "`endif\n" + "D=3 // baz\n" + "}foo_t;", + "typedef enum logic {\n" + " A = 0, // foo\n" + " B, // bar\n" + "`ifndef DO_PANIC\n" + " C = 42, // answer\n" + "`endif\n" + " D = 3 // baz\n" + "} foo_t;\n"}, + {// with scalar dimensions + "typedef enum logic[2]\t{ A=0, B=1 }foo_t;", + "typedef enum logic [2] {\n" + " A = 0,\n" + " B = 1\n" + "} foo_t;\n"}, + {// with range dimensions + "typedef enum logic[1:0]\t{ A=0, B=1 }foo_t;", + "typedef enum logic [1:0] {\n" + " A = 0,\n" + " B = 1\n" + "} foo_t;\n"}, + {"typedef foo_pkg::baz_t#(.L(L), .W(W)) bar_t;\n", + "typedef foo_pkg::baz_t#(\n" + " .L(L),\n" + " .W(W)\n" + ") bar_t;\n"}, + // By default (class_parameter_space == false), no space before '#' + {"typedef dv_base_env_cov #(.CFG_T(tl_agent_env_cfg)) tl_agent_env_cov;\n", + "typedef dv_base_env_cov#(\n" + " .CFG_T(tl_agent_env_cfg)\n" + ") tl_agent_env_cov;\n"}, + {"typedef dv_base_env_cov#(.CFG_T(tl_agent_env_cfg)) tl_agent_env_cov;\n", + "typedef dv_base_env_cov#(\n" + " .CFG_T(tl_agent_env_cfg)\n" + ") tl_agent_env_cov;\n"}, + // single short parameter stays on one line + {"typedef my_class #(.P(P)) my_class_t;\n", + "typedef my_class#(.P(P)) my_class_t;\n"}, + + // let declarations each stay on their own line + {"module t;\n" + "let OFF = 4;\n" + "let UNIQUE = 32;\n" + "let PP(a) = 30 + a;\n" + "endmodule\n", + "module t;\n" + " let OFF = 4;\n" + " let UNIQUE = 32;\n" + " let PP(a) = 30 + a;\n" + "endmodule\n"}, + + // let declarations each stay on their own line + {"module t;\n" + "let OFF = 4;\n" + "let UNIQUE = 32;\n" + "let PP(a) = 30 + a;\n" + "endmodule\n", + "module t;\n" + " let OFF = 4;\n" + " let UNIQUE = 32;\n" + " let PP(a) = 30 + a;\n" + "endmodule\n"}, + + // package test cases + {"package fedex;localparam int www=3 ;endpackage : fedex\n", + "package fedex;\n" + " localparam int www = 3;\n" + "endpackage : fedex\n"}, + {"package typey ;" + "typedef enum int{ A=0, B=1 }foo_t;" + "typedef enum{ C=0, D=1 }bar_t;" + "endpackage:typey\n", + "package typey;\n" + " typedef enum int {\n" + " A = 0,\n" + " B = 1\n" + " } foo_t;\n" + " typedef enum {\n" + " C = 0,\n" + " D = 1\n" + " } bar_t;\n" + "endpackage : typey\n"}, + {// net type declarations + "package foo_pkg;" + "nettype shortreal\t\tfoo ;" + "nettype\nbar[1:0 ] baz with\tquux ;" + "endpackage", + "package foo_pkg;\n" + " nettype shortreal foo;\n" + " nettype bar [1:0] baz with quux;\n" + "endpackage\n"}, + {"package foo_pkg; \n" + "// function description.......\n" + "function automatic void bar();" + "endfunction " + "endpackage\n", + "package foo_pkg;\n" + " // function description.......\n" + " function automatic void bar();\n" + " endfunction\n" + "endpackage\n"}, + {"package foo_pkg; \n" + "// function description.......\n" + "function void bar(string name=\"x\" ) ;" + "endfunction " + "endpackage\n", + "package foo_pkg;\n" + " // function description.......\n" + " function void bar(string name = \"x\");\n" + " endfunction\n" + "endpackage\n"}, + {" package foo_pkg; \n" + "// class description.............\n" + "class classy;" + "endclass " + "endpackage\n", + "package foo_pkg;\n" + " // class description.............\n" + " class classy;\n" + " endclass\n" + "endpackage\n"}, + {"package\tfoo_pkg; \n" + "// class description.............\n" + "class classy; \n" + "// function description.......\n" + "function\nautomatic void bar( );" + "endfunction " + "endclass\t" + "endpackage\n", + "package foo_pkg;\n" + " // class description.............\n" + " class classy;\n" + " // function description.......\n" + " function automatic void bar();\n" + " endfunction\n" + " endclass\n" + "endpackage\n"}, + {"package fedex;\n" + " import \"asdf\" context function void bar(\n" + " input bit [2:1] aaaa, // EOL COMMENT\n" + " // another\n" + " input bit foo\n" + " );\n" + "endpackage\n", + "package fedex;\n" + " import \"asdf\" context\n" + " function void bar(\n" + " input\n bit [2:1] aaaa, // EOL COMMENT\n" + " // another\n" + " input bit foo\n" + " );\n" + "endpackage\n"}, + +}; + +TEST(FormatterEndToEndTest, ClassPackageFormatterTestCases) { + RunFormatterTestCases40(kClassPackageFormatterTestCases); +} + +} // namespace +} // namespace formatter +} // namespace verilog
diff --git a/verible/verilog/formatting/formatter_disable_test.cc b/verible/verilog/formatting/formatter_disable_test.cc new file mode 100644 index 0000000..b653063 --- /dev/null +++ b/verible/verilog/formatting/formatter_disable_test.cc
@@ -0,0 +1,5814 @@ +// Copyright 2017-2026 The Verible Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Test cases in this file should be *insensitive* to wrapping penalties. +// Penalty-sensitive tests belong in formatter-tuning_test.cc. + +#include "gtest/gtest.h" +#include "verible/verilog/formatting/formatter-test-utils.h" + +namespace verilog { +namespace formatter { +namespace { + +static constexpr FormatterTestCase kDisableFormatterTestCases[] = { + // comment-controlled formatter disabling + {"// verilog_format: off\n" // disables whole file + " `include \t\t \"path/to/file.vh\"\n", + "// verilog_format: off\n" + " `include \t\t \"path/to/file.vh\"\n"}, // keeps bad spacing + {"/* verilog_format: off */\n" // disables whole file + " `include \t\t \"path/to/file.svh\" \n", + "/* verilog_format: off */\n" + " `include \t\t \"path/to/file.svh\" \n"}, // keeps bad spacing + {"// verilog_format: on\n" // already enabled, no effect + " `include \t \"path/to/file.svh\" \t\n", + "// verilog_format: on\n" + "`include \"path/to/file.svh\"\n"}, + {"// verilog_format: off\n" + "// verilog_format: on\n" // re-enable right away + " `include \t\t \"path/to/file.svh\" \n", + "// verilog_format: off\n" + "// verilog_format: on\n" + "`include \"path/to/file.svh\"\n"}, + {"/* aaa *//* bbb */\n" // not formatting controls + " `include \t\t \"path/to/file.svh\" \n", // should format + "/* aaa */ /* bbb */\n" // currently inserts 2 spaces + "`include \"path/to/file.svh\"\n"}, + {"/* verilog_format: off *//* verilog_format: on */\n" // re-enable + " `include \t\t \"path/to/file.svh\" \n", + // Note that this case normally wouldn't fit in 40 columns, + // but disabling formatting lets it overflow. + "/* verilog_format: off *//* verilog_format: on */\n" + "`include \"path/to/file.svh\"\n"}, + {"// verilog_format: off\n" + " `include \t\t \"path/to/fileA.svh\" // verilog_format: on\n" + " `include \t\t \"path/to/fileB.svh\" \n", + // re-enable formatting with comment trailing other tokens + "// verilog_format: off\n" + " `include \t\t \"path/to/fileA.svh\" // verilog_format: on\n" + "`include \"path/to/fileB.svh\"\n"}, + {" `include \t\t \"path/to/file1.vh\" \n" // format this + "// verilog_format: off\n" // start disabling + " `include \t\t \"path/to/file2.vh\" \n" + "\t\t\n" + " `include \t\t \"path/to/file3.vh\" \n" + "// verilog_format: on\n" // stop disabling + " `include \t\t \"path/to/file4.vh\" \n", // format this + "`include \"path/to/file1.vh\"\n" + "// verilog_format: off\n" // start disabling + " `include \t\t \"path/to/file2.vh\" \n" + "\t\t\n" + " `include \t\t \"path/to/file3.vh\" \n" + "// verilog_format: on\n" // stop disabling + "`include \"path/to/file4.vh\"\n"}, + {// disabling formatting on a module (to end of file) + "// verilog_format: off\n" + "module m;endmodule\n", + "// verilog_format: off\n" + "module m;endmodule\n"}, + {// disabling formatting on a module (to end of file) + "// verilog_format: off\n" + "module m;\n" + "unindented instantiation;\n" + "endmodule\n", + "// verilog_format: off\n" + "module m;\n" + "unindented instantiation;\n" + "endmodule\n"}, + {// disabling formatting inside a port declaration list disables alignment, + // but falls back to standard compaction. + "module align_off(\n" + "input w ,\n" + " // verilog_format: off\n" + "input wire [y:z] wwww,\n" + " // verilog_format: on\n" + "output reg xx\n" + ");\n" + "endmodule", + "module align_off (\n" + " input w ,\n" // preserved because group is partially disabled + " // verilog_format: off\n" + "input wire [y:z] wwww,\n" // not compacted + " // verilog_format: on\n" + " output reg xx\n" // preserved because group is partially disabled + ");\n" + "endmodule\n"}, + + {// multiple tokens with EOL comment + "module please; // don't break before the comment\n" + "endmodule\n", + "module please\n" + " ; // don't break before the comment\n" + "endmodule\n"}, + {// one token with EOL comment + "module please;\n" + "endmodule // don't break before the comment\n", + "module please;\n" + "endmodule // don't break before the comment\n"}, + { + // line with only an EOL comment + "module wild;\n" + "// a really long comment on its own line to be left alone\n" + "endmodule", + "module wild;\n" + " // a really long comment on its own line to be left alone\n" + "endmodule\n", + }, + { + // primitive declaration + "primitive primitive1(o, s, r);output o;reg o;input s;input r;table 1 " + "? :" + " ? : 0; ? 1 : 0 : -; endtable endprimitive", + "primitive primitive1(o, s, r);\n" + " output o;\n" + " reg o;\n" + " input s;\n" + " input r;\n" + " table\n" + " 1 ? : ? : 0;\n" + " ? 1 : 0 : -;\n" + " endtable\n" + "endprimitive\n", + }, + { + // one-input combinatorial UDP + "primitive primitive1 ( o,i ) ;output o;input i;" + " table 1 : 0 ; 0 : 1 ; endtable endprimitive", + "primitive primitive1(o, i);\n" + " output o;\n" + " input i;\n" + " table\n" + " 1 : 0;\n" + " 0 : 1;\n" + " endtable\n" + "endprimitive\n", + }, + { + // two-input combinatorial UDP + "primitive primitive2(o, s, r);output o;input s;input r;" + "table 1 ? : 0;? 1 : -; endtable endprimitive", + "primitive primitive2(o, s, r);\n" + " output o;\n" + " input s;\n" + " input r;\n" + " table\n" + " 1 ? : 0;\n" + " ? 1 : -;\n" + " endtable\n" + "endprimitive\n", + }, + { + // ten-input combinatorial UDP + "primitive comb10(o, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9);" + "output o;input i0, i1, i2, i3, i4, i5, i6, i7, i8, i9;" + "table 0 ? ? ? ? ? ? ? ? 0 : 0;1 ? ? ? ? ? ? ? ? 0 : 1;" + "1 ? ? ? ? ? ? ? ? 1 : 1;0 ? ? ? ? ? ? ? ? 1 : 0;endtable endprimitive", + "primitive comb10(o, i0, i1, i2, i3, i4,\n" + " i5, i6, i7, i8, i9);\n" + " output o;\n" + " input i0, i1, i2, i3, i4, i5, i6, i7,\n" + " i8, i9;\n" + " table\n" + " 0 ? ? ? ? ? ? ? ? 0 : 0;\n" + " 1 ? ? ? ? ? ? ? ? 0 : 1;\n" + " 1 ? ? ? ? ? ? ? ? 1 : 1;\n" + " 0 ? ? ? ? ? ? ? ? 1 : 0;\n" + " endtable\n" + "endprimitive\n", + }, + { + // sequential level-sensitive UDP + "primitive level_seq(o, c, d);output o;reg o;" + " input c;input d;table\n" + "// C D state O\n" + "0 ? : ? : -; // No Change\n" + "? 0 : 0 : 0; // Unknown\n" + "endtable endprimitive", + "primitive level_seq(o, c, d);\n" + " output o;\n" + " reg o;\n" + " input c;\n" + " input d;\n" + " table\n" + " // C D state O\n" + " 0 ? : ? : -; // No Change\n" + " ? 0 : 0 : 0; // Unknown\n" + " endtable\n" + "endprimitive\n", + }, + { + // sequential edge-sensitive UDP + "primitive edge_seq(o, c, d);output o;reg o;input c;input d;" + "table (01) 0 : ? : 0;(01) 1 : ? : 1;(0?) 1 : 1 : 1;(0?) 0 : 0 : " + "0;\n" + "// ignore negative c\n" + "(?0) ? : ? : -;\n" + "// ignore changes on steady c\n" + "? (?\?) : ? : -; endtable endprimitive", + "primitive edge_seq(o, c, d);\n" + " output o;\n" + " reg o;\n" + " input c;\n" + " input d;\n" + " table\n" + " (01) 0 : ? : 0;\n" + " (01) 1 : ? : 1;\n" + " (0?) 1 : 1 : 1;\n" + " (0?) 0 : 0 : 0;\n" + " // ignore negative c\n" + " (?0) ? : ? : -;\n" + " // ignore changes on steady c\n" + " ? (?\?) : ? : -;\n" + " endtable\n" + "endprimitive\n", + }, + { + // mixed sequential UDP + "primitive mixed(o, clk, j, k, preset, clear);output o;reg o;" + "input c;input j, k;input preset, clear;table " + "? ?? 01:?:1 ; // preset logic\n" + "? ?? *1:1:1 ;? ?? 10:?:0 ; // clear logic\n" + "? ?? 1*:0:0 ;r 00 00:0:1 ; // normal\n" + "r 00 11:?:- ;r 01 11:?:0 ;r 10 11:?:1 ;r 11 11:0:1 ;" + "r 11 11:1:0 ;f ?? ??:?:- ;b *? ??:?:- ;" + " // j and k\n" + "b ?* ??:?:- ;endtable endprimitive\n", + "primitive mixed(o, clk, j, k, preset,\n" + " clear);\n" + " output o;\n" + " reg o;\n" + " input c;\n" + " input j, k;\n" + " input preset, clear;\n" + " table\n" + " ? ? ? 0 1 : ? : 1; // preset logic\n" + " ? ? ? * 1 : 1 : 1;\n" + " ? ? ? 1 0 : ? : 0; // clear logic\n" + " ? ? ? 1 * : 0 : 0;\n" + " r 0 0 0 0 : 0 : 1; // normal\n" + " r 0 0 1 1 : ? : -;\n" + " r 0 1 1 1 : ? : 0;\n" + " r 1 0 1 1 : ? : 1;\n" + " r 1 1 1 1 : 0 : 1;\n" + " r 1 1 1 1 : 1 : 0;\n" + " f ? ? ? ? : ? : -;\n" + " b * ? ? ? : ? : -; // j and k\n" + " b ? * ? ? : ? : -;\n" + " endtable\n" + "endprimitive\n", + }, + // un-lexed multiline macro arg token + { + " task S ; " + "`ppgJH3JoxhwyTmZ2dgPiuMQzpRAWiSs(" + "{xYtxuh6.FIMcVPEWfhtoI2FSe, xYtxuh6.ZVL5XASVGLYz32} == " + "SqRgavM[15:2];\n" + "JgQLBG == 4'h0;, \"foo\" )\n" + "endtask\n", + "task S;\n" + " `ppgJH3JoxhwyTmZ2dgPiuMQzpRAWiSs(\n" + " {xYtxuh6.FIMcVPEWfhtoI2FSe, xYtxuh6.ZVL5XASVGLYz32} == " + "SqRgavM[15:2];\n" + "JgQLBG == 4'h0;,\n" + " \"foo\")\n" + "endtask\n", + }, + + // between identifier and '(', no args + + {"// verilog_syntax: parse-as-module-body", + "// verilog_syntax: parse-as-module-body\n"}, + {"// verilog_syntax: parse-as-statements", + "// verilog_syntax: parse-as-statements\n"}, + {"// verilog_syntax: parse-as-class-body", + "// verilog_syntax: parse-as-class-body\n"}, + {"// verilog_syntax: parse-as-package-body", + "// verilog_syntax: parse-as-package-body\n"}, + {"// verilog_syntax: parse-as-library-map", + "// verilog_syntax: parse-as-library-map\n"}, + {"// verilog_syntax: does-not-exist-mode", + "// verilog_syntax: does-not-exist-mode\n"}, + {"// verilog_syntax: parse-as-module-body\n", + "// verilog_syntax: parse-as-module-body\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "// comment", + "// verilog_syntax: parse-as-module-body\n" + "// comment\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c */ ();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c */ ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ /* c2 */ ();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ /* c2 */ ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c */\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c */\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ /* c2 */\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ /* c2 */\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ // c2\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ // c2\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c */ ();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c */ ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */ /* c2 */ ();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */ /* c2 */ ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c */\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c */\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */ /* c2 */\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */ /* c2 */\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "// c\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " // c\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */ // c2\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */ // c2\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */\n" + "/* c2 */\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */\n" + " /* c2 */\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "// c1\n" + "// c2\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " // c1\n" + " // c2\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + "/* c2 */ ();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */ ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + "/* c2 */ ();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " /* c2 */ ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + "/* c2 */\n" + "/* c3 */ ();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */\n" + " /* c3 */ ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + "/* c2 */\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + "/* c2 */\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " /* c2 */\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + "// c2\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " // c2\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + "// c2\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " // c2\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " ();\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + "// c2\n" + "// c3\n" + "();\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " // c2\n" + " // c3\n" + " ();\n"}, + + // between identifier and '(', with arg + + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c */ (arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c */ (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ /* c2 */ (arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ /* c2 */ (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c */\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c */\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ /* c2 */\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ /* c2 */\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ // c2\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ // c2\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c */ (arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c */ (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */ /* c2 */ (arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */ /* c2 */ (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c */\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c */\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */ /* c2 */\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */ /* c2 */\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "// c\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " // c\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */ // c2\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */ // c2\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */\n" + "/* c2 */\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */\n" + " /* c2 */\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "// c1\n" + "// c2\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " // c1\n" + " // c2\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + "/* c2 */ (arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */ (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + "/* c2 */ (arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " /* c2 */ (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + "/* c2 */\n" + "/* c3 */ (arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */\n" + " /* c3 */ (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + "/* c2 */\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + "/* c2 */\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " /* c2 */\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + "// c2\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " // c2\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + "// c2\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " // c2\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " (arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + "// c2\n" + "// c3\n" + "(arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " // c2\n" + " // c3\n" + " (arg);\n"}, + + // after '(', no args + + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */ /* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */ /* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */ /* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */ /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(// c\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( // c\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */ // c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */ // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c1 */ /* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c1 */ /* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " /* c */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c1 */ /* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " /* c1 */ /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "// c\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " // c\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c1 */ // c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " /* c1 */ // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c1 */\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " /* c1 */\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "// c1\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " // c1\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */\n" + "/* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */\n" + "/* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(// c1\n" + "/* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( // c1\n" + "/* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */\n" + "/* c2 */\n" + "/* c3 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */\n" + " /* c2 */\n" + "/* c3 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(// c1\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( // c1\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(// c1\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( // c1\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(// c1\n" + "// c2\n" + "// c3\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( // c1\n" + " // c2\n" + " // c3\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */ /* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */ /* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */ /* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */ /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */ // c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */ // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ /* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ /* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ /* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */ /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "// c\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " // c\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ // c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */ // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "// c1\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " // c1\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + "/* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "/* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + "/* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */\n" + "/* c3 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */\n" + "/* c3 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "// c2\n" + "// c3\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " // c2\n" + " // c3\n" + ");\n"}, + + // after '(', with arg + + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */ /* c2 */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */ /* c2 */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */ /* c2 */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */ /* c2 */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(// c\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( // c\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */ // c2\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */ // c2\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " /* c */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c1 */ /* c2 */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " /* c1 */ /* c2 */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " /* c */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c1 */ /* c2 */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " /* c1 */ /* c2 */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "// c\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " // c\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c1 */ // c2\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " /* c1 */ // c2\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "/* c1 */\n" + "/* c2 */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " /* c1 */\n" + " /* c2 */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + "// c1\n" + "// c2\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(\n" + " // c1\n" + " // c2\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */\n" + "/* c2 */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */\n" + " /* c2 */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(// c1\n" + "/* c2 */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( // c1\n" + " /* c2 */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */\n" + "/* c2 */\n" + "/* c3 */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */\n" + " /* c2 */\n" + " /* c3 */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */\n" + "/* c2 */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */\n" + " /* c2 */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(// c1\n" + "/* c2 */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( // c1\n" + " /* c2 */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */\n" + "// c2\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */\n" + " // c2\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(// c1\n" + "// c2\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( // c1\n" + " // c2\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(// c1\n" + "// c2\n" + "// c3\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz( // c1\n" + " // c2\n" + " // c3\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */ /* c2 */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */ /* c2 */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */ /* c2 */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */ /* c2 */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */ // c2\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */ // c2\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ /* c2 */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */ /* c2 */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ /* c2 */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */ /* c2 */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "// c\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " // c\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ // c2\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */ // c2\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */\n" + "/* c2 */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */\n" + " /* c2 */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "// c1\n" + "// c2\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " // c1\n" + " // c2\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "/* c2 */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " /* c2 */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */\n" + "/* c3 */arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */\n" + " /* c3 */ arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "/* c2 */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " /* c2 */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "// c2\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " // c2\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "// c2\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " // c2\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " arg);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "// c2\n" + "// c3\n" + "arg);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " // c2\n" + " // c3\n" + " arg);\n"}, + + // after single arg + + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg/* c */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg /* c */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg/* c1 */ /* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg /* c1 */ /* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg/* c */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg /* c */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg/* c1 */ /* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg /* c1 */ /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg// c\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg // c\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg/* c1 */ // c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg /* c1 */ // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + "/* c */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + "/* c */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + "/* c1 */ /* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + "/* c1 */ /* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + "/* c */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + " /* c */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + "/* c1 */ /* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + " /* c1 */ /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + "// c\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + " // c\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + "/* c1 */ // c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + " /* c1 */ // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + "/* c1 */\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + " /* c1 */\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + "// c1\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg\n" + " // c1\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg/* c1 */\n" + "/* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg /* c1 */\n" + "/* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg// c1\n" + "/* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg // c1\n" + "/* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg/* c1 */\n" + "/* c2 */\n" + "/* c3 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg /* c1 */\n" + " /* c2 */\n" + "/* c3 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg/* c1 */\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg /* c1 */\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg// c1\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg // c1\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg/* c1 */\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg /* c1 */\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg// c1\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg // c1\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg// c1\n" + "// c2\n" + "// c3\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg // c1\n" + " // c2\n" + " // c3\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg/* c */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg /* c */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg/* c1 */ /* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg /* c1 */ /* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg/* c */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg /* c */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg/* c1 */ /* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg /* c1 */ /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg// c\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg // c\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg/* c1 */ // c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg /* c1 */ // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + "/* c */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + "/* c */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + "/* c1 */ /* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + "/* c1 */ /* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + "/* c */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + " /* c */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + "/* c1 */ /* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + " /* c1 */ /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + "// c\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + " // c\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + "/* c1 */ // c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + " /* c1 */ // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + "/* c1 */\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + " /* c1 */\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + "// c1\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg\n" + " // c1\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg/* c1 */\n" + "/* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg /* c1 */\n" + "/* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg// c1\n" + "/* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg // c1\n" + "/* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg/* c1 */\n" + "/* c2 */\n" + "/* c3 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg /* c1 */\n" + " /* c2 */\n" + "/* c3 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg/* c1 */\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg /* c1 */\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg// c1\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg // c1\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg/* c1 */\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg /* c1 */\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg// c1\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg // c1\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg// c1\n" + "// c2\n" + "// c3\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg // c1\n" + " // c2\n" + " // c3\n" + ");\n"}, + + // before colon + + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1/* c */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 /* c */, arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1/* c1 */ /* c2 */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 /* c1 */ /* c2 */,\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1/* c */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 /* c */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1/* c1 */ /* c2 */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 /* c1 */ /* c2 */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1// c\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 // c\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1/* c1 */ // c2\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 /* c1 */ // c2\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + "/* c */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + " /* c */, arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + "/* c1 */ /* c2 */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + " /* c1 */ /* c2 */, arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + "/* c */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + " /* c */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + "/* c1 */ /* c2 */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + " /* c1 */ /* c2 */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + "// c\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + " // c\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + "/* c1 */ // c2\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + " /* c1 */ // c2\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + "/* c1 */\n" + "/* c2 */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + " /* c1 */\n" + " /* c2 */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + "// c1\n" + "// c2\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1\n" + " // c1\n" + " // c2\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1/* c1 */\n" + "/* c2 */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 /* c1 */\n" + " /* c2 */, arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1// c1\n" + "/* c2 */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 // c1\n" + " /* c2 */, arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1/* c1 */\n" + "/* c2 */\n" + "/* c3 */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 /* c1 */\n" + " /* c2 */\n" + " /* c3 */, arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1/* c1 */\n" + "/* c2 */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 /* c1 */\n" + " /* c2 */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1// c1\n" + "/* c2 */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 // c1\n" + " /* c2 */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1/* c1 */\n" + "// c2\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 /* c1 */\n" + " // c2\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1// c1\n" + "// c2\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 // c1\n" + " // c2\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1// c1\n" + "// c2\n" + "// c3\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1 // c1\n" + " // c2\n" + " // c3\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1/* c */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 /* c */, arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1/* c1 */ /* c2 */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 /* c1 */ /* c2 */,\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1/* c */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 /* c */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1/* c1 */ /* c2 */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 /* c1 */ /* c2 */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1// c\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 // c\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1/* c1 */ // c2\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 /* c1 */ // c2\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + "/* c */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + " /* c */, arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + "/* c1 */ /* c2 */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + " /* c1 */ /* c2 */, arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + "/* c */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + " /* c */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + "/* c1 */ /* c2 */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + " /* c1 */ /* c2 */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + "// c\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + " // c\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + "/* c1 */ // c2\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + " /* c1 */ // c2\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + "/* c1 */\n" + "/* c2 */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + " /* c1 */\n" + " /* c2 */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + "// c1\n" + "// c2\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1\n" + " // c1\n" + " // c2\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1/* c1 */\n" + "/* c2 */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 /* c1 */\n" + " /* c2 */, arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1// c1\n" + "/* c2 */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 // c1\n" + " /* c2 */, arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1/* c1 */\n" + "/* c2 */\n" + "/* c3 */, arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 /* c1 */\n" + " /* c2 */\n" + " /* c3 */, arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1/* c1 */\n" + "/* c2 */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 /* c1 */\n" + " /* c2 */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1// c1\n" + "/* c2 */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 // c1\n" + " /* c2 */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1/* c1 */\n" + "// c2\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 /* c1 */\n" + " // c2\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1// c1\n" + "// c2\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 // c1\n" + " // c2\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " , arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1// c1\n" + "// c2\n" + "// c3\n" + ", arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1 // c1\n" + " // c2\n" + " // c3\n" + " , arg2);\n"}, + + // after colon + + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,/* c */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, /* c */ arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,/* c1 */ /* c2 */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, /* c1 */ /* c2 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,/* c */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, /* c */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,/* c1 */ /* c2 */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, /* c1 */ /* c2 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,// c\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, // c\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,/* c1 */ // c2\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, /* c1 */ // c2\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + "/* c */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + " /* c */ arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + "/* c1 */ /* c2 */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + " /* c1 */ /* c2 */ arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + "/* c */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + " /* c */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + "/* c1 */ /* c2 */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + " /* c1 */ /* c2 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + "// c\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + " // c\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + "/* c1 */ // c2\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + " /* c1 */ // c2\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + "/* c1 */\n" + "/* c2 */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + " /* c1 */\n" + " /* c2 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + "// c1\n" + "// c2\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + " // c1\n" + " // c2\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,/* c1 */\n" + "/* c2 */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, /* c1 */\n" + " /* c2 */ arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,// c1\n" + "/* c2 */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, // c1\n" + " /* c2 */ arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,/* c1 */\n" + "/* c2 */\n" + "/* c3 */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, /* c1 */\n" + " /* c2 */\n" + " /* c3 */ arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,/* c1 */\n" + "/* c2 */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, /* c1 */\n" + " /* c2 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,// c1\n" + "/* c2 */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, // c1\n" + " /* c2 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,/* c1 */\n" + "// c2\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, /* c1 */\n" + " // c2\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,// c1\n" + "// c2\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, // c1\n" + " // c2\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,// c1\n" + "// c2\n" + "// c3\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, // c1\n" + " // c2\n" + " // c3\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,/* c */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, /* c */ arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,/* c1 */ /* c2 */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, /* c1 */ /* c2 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,/* c */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, /* c */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,/* c1 */ /* c2 */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, /* c1 */ /* c2 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,// c\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, // c\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,/* c1 */ // c2\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, /* c1 */ // c2\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + "/* c */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + " /* c */ arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + "/* c1 */ /* c2 */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + " /* c1 */ /* c2 */ arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + "/* c */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + " /* c */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + "/* c1 */ /* c2 */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + " /* c1 */ /* c2 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + "// c\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + " // c\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + "/* c1 */ // c2\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + " /* c1 */ // c2\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + "/* c1 */\n" + "/* c2 */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + " /* c1 */\n" + " /* c2 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + "// c1\n" + "// c2\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + " // c1\n" + " // c2\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,/* c1 */\n" + "/* c2 */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, /* c1 */\n" + " /* c2 */ arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,// c1\n" + "/* c2 */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, // c1\n" + " /* c2 */ arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,/* c1 */\n" + "/* c2 */\n" + "/* c3 */arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, /* c1 */\n" + " /* c2 */\n" + " /* c3 */ arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,/* c1 */\n" + "/* c2 */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, /* c1 */\n" + " /* c2 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,// c1\n" + "/* c2 */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, // c1\n" + " /* c2 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,/* c1 */\n" + "// c2\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, /* c1 */\n" + " // c2\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,// c1\n" + "// c2\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, // c1\n" + " // c2\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " arg2);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,// c1\n" + "// c2\n" + "// c3\n" + "arg2);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, // c1\n" + " // c2\n" + " // c3\n" + " arg2);\n"}, + + // after last arg + + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,/* c */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2, /* c */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,/* c1 */ /* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + " arg2, /* c1 */ /* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,/* c */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2, /* c */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,/* c1 */ /* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1,\n" + " arg2, /* c1 */ /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,// c\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2, // c\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,/* c1 */ // c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2, /* c1 */ // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + "/* c */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + "/* c */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + "/* c1 */ /* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + "/* c1 */ /* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + "/* c */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + " /* c */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + "/* c1 */ /* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + " /* c1 */ /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + "// c\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + " // c\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + "/* c1 */ // c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + " /* c1 */ // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + "/* c1 */\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + " /* c1 */\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + "// c1\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,\n" + " // c1\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,/* c1 */\n" + "/* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2, /* c1 */\n" + "/* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,// c1\n" + "/* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2, // c1\n" + "/* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,/* c1 */\n" + "/* c2 */\n" + "/* c3 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2, /* c1 */\n" + " /* c2 */\n" + "/* c3 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,/* c1 */\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2, /* c1 */\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,// c1\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2, // c1\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,/* c1 */\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2, /* c1 */\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,// c1\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2, // c1\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2, /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2,// c1\n" + "// c2\n" + "// c3\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg1, arg2, // c1\n" + " // c2\n" + " // c3\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,/* c */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2, /* c */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,/* c1 */ /* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + " arg2, /* c1 */ /* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,/* c */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2, /* c */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,/* c1 */ /* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1,\n" + " arg2, /* c1 */ /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,// c\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2, // c\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,/* c1 */ // c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2, /* c1 */ // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + "/* c */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + "/* c */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + "/* c1 */ /* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + "/* c1 */ /* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + "/* c */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + " /* c */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + "/* c1 */ /* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + " /* c1 */ /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + "// c\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + " // c\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + "/* c1 */ // c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + " /* c1 */ // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + "/* c1 */\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + " /* c1 */\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + "// c1\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,\n" + " // c1\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,/* c1 */\n" + "/* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2, /* c1 */\n" + "/* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,// c1\n" + "/* c2 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2, // c1\n" + "/* c2 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,/* c1 */\n" + "/* c2 */\n" + "/* c3 */);\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2, /* c1 */\n" + " /* c2 */\n" + "/* c3 */);\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,/* c1 */\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2, /* c1 */\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,// c1\n" + "/* c2 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2, // c1\n" + " /* c2 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,/* c1 */\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2, /* c1 */\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,// c1\n" + "// c2\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2, // c1\n" + " // c2\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2, /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + ");\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2,// c1\n" + "// c2\n" + "// c3\n" + ");\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg1, arg2, // c1\n" + " // c2\n" + " // c3\n" + ");\n"}, + + // after ')', no args + + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()/* c */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() /* c */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()/* c1 */ /* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() /* c1 */ /* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()/* c */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() /* c */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()/* c1 */ /* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() /* c1 */ /* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()// c\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() // c\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()/* c1 */ // c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() /* c1 */ // c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "/* c */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "/* c */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "/* c1 */ /* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "/* c1 */ /* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "/* c */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "/* c */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "/* c1 */ /* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "/* c1 */ /* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "// c\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "// c\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "/* c1 */ // c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "/* c1 */ // c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "// c1\n" + "// c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()\n" + "// c1\n" + "// c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()/* c1 */\n" + "/* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() /* c1 */\n" + "/* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()// c1\n" + "/* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() // c1\n" + "/* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()/* c1 */\n" + "/* c2 */\n" + "/* c3 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() /* c1 */\n" + "/* c2 */\n" + "/* c3 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()/* c1 */\n" + "/* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() /* c1 */\n" + "/* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()// c1\n" + "/* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() // c1\n" + "/* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()/* c1 */\n" + "// c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() /* c1 */\n" + "// c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()// c1\n" + "// c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() // c1\n" + "// c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz()// c1\n" + "// c2\n" + "// c3\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz() // c1\n" + "// c2\n" + "// c3\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()/* c */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() /* c */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()/* c1 */ /* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() /* c1 */ /* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()/* c */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() /* c */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()/* c1 */ /* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() /* c1 */ /* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()// c\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() // c\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()/* c1 */ // c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() /* c1 */ // c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "/* c */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "/* c */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "/* c1 */ /* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "/* c1 */ /* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "/* c */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "/* c */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "/* c1 */ /* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "/* c1 */ /* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "// c\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "// c\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "/* c1 */ // c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "/* c1 */ // c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "// c1\n" + "// c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()\n" + "// c1\n" + "// c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()/* c1 */\n" + "/* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() /* c1 */\n" + "/* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()// c1\n" + "/* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() // c1\n" + "/* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()/* c1 */\n" + "/* c2 */\n" + "/* c3 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() /* c1 */\n" + "/* c2 */\n" + "/* c3 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()/* c1 */\n" + "/* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() /* c1 */\n" + "/* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()// c1\n" + "/* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() // c1\n" + "/* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()/* c1 */\n" + "// c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() /* c1 */\n" + "// c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()// c1\n" + "// c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() // c1\n" + "// c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ()// c1\n" + "// c2\n" + "// c3\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ() // c1\n" + "// c2\n" + "// c3\n" + ";\n"}, + + // after ')', with arg + + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)/* c */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) /* c */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)/* c1 */ /* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) /* c1 */ /* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)/* c */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) /* c */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)/* c1 */ /* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) /* c1 */ /* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)// c\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) // c\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)/* c1 */ // c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) /* c1 */ // c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "/* c */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "/* c */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "/* c1 */ /* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "/* c1 */ /* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "/* c */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "/* c */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "/* c1 */ /* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "/* c1 */ /* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "// c\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) // c\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "/* c1 */ // c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "/* c1 */ // c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "// c1\n" + "// c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)\n" + "// c1\n" + "// c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)/* c1 */\n" + "/* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) /* c1 */\n" + "/* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)// c1\n" + "/* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) // c1\n" + "/* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)/* c1 */\n" + "/* c2 */\n" + "/* c3 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) /* c1 */\n" + "/* c2 */\n" + "/* c3 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)/* c1 */\n" + "/* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) /* c1 */\n" + "/* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)// c1\n" + "/* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) // c1\n" + "/* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)/* c1 */\n" + "// c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) /* c1 */\n" + "// c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)// c1\n" + "// c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) // c1\n" + "// c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg)// c1\n" + "// c2\n" + "// c3\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg) // c1\n" + "// c2\n" + "// c3\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)/* c */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) /* c */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)/* c1 */ /* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) /* c1 */ /* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)/* c */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) /* c */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)/* c1 */ /* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) /* c1 */ /* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)// c\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) // c\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)/* c1 */ // c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) /* c1 */ // c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "/* c */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "/* c */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "/* c1 */ /* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "/* c1 */ /* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "/* c */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "/* c */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "/* c1 */ /* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "/* c1 */ /* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "// c\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "// c\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "/* c1 */ // c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "/* c1 */ // c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "// c1\n" + "// c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)\n" + "// c1\n" + "// c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)/* c1 */\n" + "/* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) /* c1 */\n" + "/* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)// c1\n" + "/* c2 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) // c1\n" + "/* c2 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)/* c1 */\n" + "/* c2 */\n" + "/* c3 */;\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) /* c1 */\n" + "/* c2 */\n" + "/* c3 */;\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)/* c1 */\n" + "/* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) /* c1 */\n" + "/* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)// c1\n" + "/* c2 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) // c1\n" + "/* c2 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)/* c1 */\n" + "// c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) /* c1 */\n" + "// c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)// c1\n" + "// c2\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) // c1\n" + "// c2\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ";\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg)// c1\n" + "// c2\n" + "// c3\n" + ";\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg) // c1\n" + "// c2\n" + "// c3\n" + ";\n"}, + + // after ';', no args + + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); /* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); /* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();// c\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); // c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); /* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "// c\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "// c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "/* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "/* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();\n" + "// c1\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();// c1 c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); // c1 c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();/* c1 */\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); /* c1 */\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); // c1\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz();// c1\n" + "// c2\n" + "// c3\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(); // c1\n" + "// c2\n" + "// c3\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); /* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); /* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();// c\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); // c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); /* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "// c\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "// c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "/* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "/* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();\n" + "// c1\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();/* c1 */\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); /* c1 */\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); // c1\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ();// c1\n" + "// c2\n" + "// c3\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(); // c1\n" + "// c2\n" + "// c3\n"}, + + // after ';', with arg + + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); /* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); /* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);// c\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); // c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); /* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "// c\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "// c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "/* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "/* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);\n" + "// c1\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);// c1 c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); // c1 c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);/* c1 */\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); /* c1 */\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); // c1\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg);// c1\n" + "// c2\n" + "// c3\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz(arg); // c1\n" + "// c2\n" + "// c3\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); /* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); /* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);// c\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); // c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); /* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "// c\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "// c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "/* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "/* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);\n" + "// c1\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);/* c1 */\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); /* c1 */\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); // c1\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg);// c1\n" + "// c2\n" + "// c3\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(arg); // c1\n" + "// c2\n" + "// c3\n"}, + + // everywhere, no args + + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c */(/* c */)/* c */;/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c */\n" + " ( /* c */) /* c */; /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */ /* c2 */(/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ " + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ /* c2 */\n" + " ( /* c1 */ /* c2 */) /* c1 */ /* c2 */; /* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c */\n" + "(/* c */\n" + ")/* c */\n" + ";/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c */\n" + " ( /* c */\n" + " ) /* c */\n" + "; /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */ /* c2 */\n" + "(/* c1 */ /* c2 */\n" + ")/* c1 */ /* c2 */\n" + ";/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ /* c2 */\n" + " ( /* c1 */ /* c2 */\n" + " ) /* c1 */ /* c2 */\n" + "; /* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz// c\n" + "(// c\n" + ")// c\n" + ";// c\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c\n" + " ( // c\n" + " ) // c\n" + "; // c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */ // c2\n" + "(/* c1 */ // c2\n" + ")/* c1 */ // c2\n" + ";/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ // c2\n" + " ( /* c1 */ // c2\n" + " ) /* c1 */ // c2\n" + "; /* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c */(\n" + "/* c */)\n" + "/* c */;\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c */ (\n" + " /* c */)\n" + "/* c */;\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */ /* c2 */(\n" + "/* c1 */ /* c2 */)\n" + "/* c1 */ /* c2 */;\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */ /* c2 */ (\n" + " /* c1 */ /* c2 */)\n" + "/* c1 */ /* c2 */;\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c */\n" + "(\n" + "/* c */\n" + ")\n" + "/* c */\n" + ";\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c */\n" + " (\n" + " /* c */\n" + " )\n" + "/* c */\n" + ";\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */ /* c2 */\n" + "(\n" + "/* c1 */ /* c2 */\n" + ")\n" + "/* c1 */ /* c2 */\n" + ";\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */ /* c2 */\n" + " (\n" + " /* c1 */ /* c2 */\n" + " )\n" + "/* c1 */ /* c2 */\n" + ";\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "// c\n" + "(\n" + "// c\n" + ")\n" + "// c\n" + ";\n" + "// c\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " // c\n" + " (\n" + " // c\n" + " )\n" + "// c\n" + ";\n" + "// c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */ // c2\n" + "(\n" + "/* c1 */ // c2\n" + ")\n" + "/* c1 */ // c2\n" + ";\n" + "/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */ // c2\n" + " (\n" + " /* c1 */ // c2\n" + " )\n" + "/* c1 */ // c2\n" + ";\n" + "/* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */\n" + "/* c2 */\n" + "(\n" + "/* c1 */\n" + "/* c2 */\n" + ")\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n" + "/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */\n" + " /* c2 */\n" + " (\n" + " /* c1 */\n" + " /* c2 */\n" + " )\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n" + "/* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "// c1\n" + "// c2\n" + "(\n" + "// c1\n" + "// c2\n" + ")\n" + "// c1\n" + "// c2\n" + ";\n" + "// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " // c1\n" + " // c2\n" + " (\n" + " // c1\n" + " // c2\n" + " )\n" + "// c1\n" + "// c2\n" + ";\n" + "// c1\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */\n" + "/* c2 */(/* c1 */\n" + "/* c2 */)/* c1 */\n" + "/* c2 */;/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */ ( /* c1 */\n" + " /* c2 */) /* c1 */\n" + "/* c2 */; /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz// c1\n" + "/* c2 */(// c1\n" + "/* c2 */)// c1\n" + "/* c2 */;// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " /* c2 */ ( // c1\n" + " /* c2 */) // c1\n" + "/* c2 */; // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */\n" + "/* c2 */\n" + "/* c3 */(/* c1 */\n" + "/* c2 */\n" + "/* c3 */)/* c1 */\n" + "/* c2 */\n" + "/* c3 */;/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */\n" + " /* c3 */ ( /* c1 */\n" + " /* c2 */\n" + " /* c3 */) /* c1 */\n" + "/* c2 */\n" + "/* c3 */; /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */\n" + "/* c2 */\n" + "(/* c1 */\n" + "/* c2 */\n" + ")/* c1 */\n" + "/* c2 */\n" + ";/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */\n" + " ( /* c1 */\n" + " /* c2 */\n" + " ) /* c1 */\n" + "/* c2 */\n" + "; /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz// c1\n" + "/* c2 */\n" + "(// c1\n" + "/* c2 */\n" + ")// c1\n" + "/* c2 */\n" + ";// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " /* c2 */\n" + " ( // c1\n" + " /* c2 */\n" + " ) // c1\n" + "/* c2 */\n" + "; // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */\n" + "// c2\n" + "(/* c1 */\n" + "// c2\n" + ")/* c1 */\n" + "// c2\n" + ";/* c1 */\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " // c2\n" + " ( /* c1 */\n" + " // c2\n" + " ) /* c1 */\n" + "// c2\n" + "; /* c1 */\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz// c1\n" + "// c2\n" + "(// c1\n" + "// c2\n" + ")// c1\n" + "// c2\n" + ";// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " // c2\n" + " ( // c1\n" + " // c2\n" + " ) // c1\n" + " // c2\n" + "; // c1\n" + " // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "(/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ")/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ";/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " ( /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " ) /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "; /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz// c1\n" + "// c2\n" + "// c3\n" + "(// c1\n" + "// c2\n" + "// c3\n" + ")// c1\n" + "// c2\n" + "// c3\n" + ";// c1\n" + "// c2\n" + "// c3\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " // c2\n" + " // c3\n" + " ( // c1\n" + " // c2\n" + " // c3\n" + " ) // c1\n" + " // c2\n" + " // c3\n" + "; // c1\n" + " // c2\n" + " // c3\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c */)/* c */;/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c */) /* c */; /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */ /* c2 */) /* c1 */ /* c2 */; /* c1 */ /* c2 " + "*/\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c */\n" + ")/* c */\n" + ";/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c */\n" + ") /* c */\n" + "; /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */ /* c2 */\n" + ")/* c1 */ /* c2 */\n" + ";/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */ /* c2 */\n" + ") /* c1 */ /* c2 */\n" + "; /* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c\n" + ")// c\n" + ";// c\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c\n" + ") // c\n" + "; // c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */ // c2\n" + ")/* c1 */ // c2\n" + ";/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */ // c2\n" + ") /* c1 */ // c2\n" + "; /* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c */)\n" + "/* c */;\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c */)\n" + "/* c */;\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ /* c2 */)\n" + "/* c1 */ /* c2 */;\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ /* c2 */)\n" + "/* c1 */ /* c2 */;\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c */\n" + ")\n" + "/* c */\n" + ";\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c */\n" + ")\n" + "/* c */\n" + ";\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ /* c2 */\n" + ")\n" + "/* c1 */ /* c2 */\n" + ";\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */ /* c2 */\n" + ")\n" + "/* c1 */ /* c2 */\n" + ";\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "// c\n" + ")\n" + "// c\n" + ";\n" + "// c\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " // c\n" + ")\n" + "// c\n" + ";\n" + "// c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ // c2\n" + ")\n" + "/* c1 */ // c2\n" + ";\n" + "/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */ // c2\n" + ")\n" + "/* c1 */ // c2\n" + ";\n" + "/* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */\n" + "/* c2 */\n" + ")\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n" + "/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */\n" + " /* c2 */\n" + ")\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n" + "/* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "// c1\n" + "// c2\n" + ")\n" + "// c1\n" + "// c2\n" + ";\n" + "// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " // c1\n" + " // c2\n" + ")\n" + "// c1\n" + "// c2\n" + ";\n" + "// c1\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */)/* c1 */\n" + "/* c2 */;/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + "/* c2 */) /* c1 */\n" + "/* c2 */; /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "/* c2 */)// c1\n" + "/* c2 */;// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + "/* c2 */) // c1\n" + "/* c2 */; // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */\n" + "/* c3 */)/* c1 */\n" + "/* c2 */\n" + "/* c3 */;/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */\n" + "/* c3 */) /* c1 */\n" + "/* c2 */\n" + "/* c3 */; /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */\n" + ")/* c1 */\n" + "/* c2 */\n" + ";/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */\n" + ") /* c1 */\n" + "/* c2 */\n" + "; /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "/* c2 */\n" + ")// c1\n" + "/* c2 */\n" + ";// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " /* c2 */\n" + ") // c1\n" + "/* c2 */\n" + "; // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "// c2\n" + ")/* c1 */\n" + "// c2\n" + ";/* c1 */\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " // c2\n" + ") /* c1 */\n" + "// c2\n" + "; /* c1 */\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "// c2\n" + ")// c1\n" + "// c2\n" + ";// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " // c2\n" + ") // c1\n" + " // c2\n" + "; // c1\n" + " // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ")/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ";/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + ") /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "; /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "// c2\n" + "// c3\n" + ")// c1\n" + "// c2\n" + "// c3\n" + ";// c1\n" + "// c2\n" + "// c3\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " // c2\n" + " // c3\n" + ") // c1\n" + " // c2\n" + " // c3\n" + "; // c1\n" + " // c2\n" + " // c3\n"}, + + // everywhere, with args + + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c */(/* c */arg1/* c */,/* c */arg2/* c */)/* c */;/* c " + "*/\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c */ ( /* c */\n" + " arg1 /* c */, /* c */\n" + " arg2 /* c */) /* c */; /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */ /* c2 */(/* c1 */ /* c2 */arg1/* c1 */ /* c2 */,/* c1 " + "*/ /* c2 */arg2/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ /* c2 */ ( /* c1 */ /* c2 */\n" + " arg1 /* c1 */ /* c2 */, /* c1 */ /* c2 */\n" + " arg2 /* c1 */ /* c2 */) /* c1 */ /* c2 */; /* c1 */ /* c2 " + "*/\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c */\n" + "(/* c */\n" + "arg1/* c */\n" + ",/* c */\n" + "arg2/* c */\n" + ")/* c */\n" + ";/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c */\n" + " ( /* c */\n" + " arg1 /* c */\n" + " , /* c */\n" + " arg2 /* c */\n" + " ) /* c */\n" + "; /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */ /* c2 */\n" + "(/* c1 */ /* c2 */\n" + "arg1/* c1 */ /* c2 */\n" + ",/* c1 */ /* c2 */\n" + "arg2/* c1 */ /* c2 */\n" + ")/* c1 */ /* c2 */\n" + ";/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ /* c2 */\n" + " ( /* c1 */ /* c2 */\n" + " arg1 /* c1 */ /* c2 */\n" + " , /* c1 */ /* c2 */\n" + " arg2 /* c1 */ /* c2 */\n" + " ) /* c1 */ /* c2 */\n" + "; /* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz// c\n" + "(// c\n" + "arg1// c\n" + ",// c\n" + "arg2// c\n" + ")// c\n" + ";// c\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c\n" + " ( // c\n" + " arg1 // c\n" + " , // c\n" + " arg2 // c\n" + " ) // c\n" + "; // c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */ // c2\n" + "(/* c1 */ // c2\n" + "arg1/* c1 */ // c2\n" + ",/* c1 */ // c2\n" + "arg2/* c1 */ // c2\n" + ")/* c1 */ // c2\n" + ";/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */ // c2\n" + " ( /* c1 */ // c2\n" + " arg1 /* c1 */ // c2\n" + " , /* c1 */ // c2\n" + " arg2 /* c1 */ // c2\n" + " ) /* c1 */ // c2\n" + "; /* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c */(\n" + "/* c */arg1\n" + "/* c */,\n" + "/* c */arg2\n" + "/* c */)\n" + "/* c */;\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c */ (\n" + " /* c */ arg1\n" + " /* c */,\n" + " /* c */ arg2\n" + " /* c */)\n" + "/* c */;\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */ /* c2 */(\n" + "/* c1 */ /* c2 */arg1\n" + "/* c1 */ /* c2 */,\n" + "/* c1 */ /* c2 */arg2\n" + "/* c1 */ /* c2 */)\n" + "/* c1 */ /* c2 */;\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */ /* c2 */ (\n" + " /* c1 */ /* c2 */ arg1\n" + " /* c1 */ /* c2 */,\n" + " /* c1 */ /* c2 */ arg2\n" + " /* c1 */ /* c2 */)\n" + "/* c1 */ /* c2 */;\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c */\n" + "(\n" + "/* c */\n" + "arg1\n" + "/* c */\n" + ",\n" + "/* c */\n" + "arg2\n" + "/* c */\n" + ")\n" + "/* c */\n" + ";\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c */\n" + " (\n" + " /* c */\n" + " arg1\n" + " /* c */\n" + " ,\n" + " /* c */\n" + " arg2\n" + " /* c */\n" + " )\n" + "/* c */\n" + ";\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */ /* c2 */\n" + "(\n" + "/* c1 */ /* c2 */\n" + "arg1\n" + "/* c1 */ /* c2 */\n" + ",\n" + "/* c1 */ /* c2 */\n" + "arg2\n" + "/* c1 */ /* c2 */\n" + ")\n" + "/* c1 */ /* c2 */\n" + ";\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */ /* c2 */\n" + " (\n" + " /* c1 */ /* c2 */\n" + " arg1\n" + " /* c1 */ /* c2 */\n" + " ,\n" + " /* c1 */ /* c2 */\n" + " arg2\n" + " /* c1 */ /* c2 */\n" + " )\n" + "/* c1 */ /* c2 */\n" + ";\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "// c\n" + "(\n" + "// c\n" + "arg1\n" + "// c\n" + ",\n" + "// c\n" + "arg2\n" + "// c\n" + ")\n" + "// c\n" + ";\n" + "// c\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " // c\n" + " (\n" + " // c\n" + " arg1\n" + " // c\n" + " ,\n" + " // c\n" + " arg2\n" + " // c\n" + " )\n" + "// c\n" + ";\n" + "// c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */ // c2\n" + "(\n" + "/* c1 */ // c2\n" + "arg1\n" + "/* c1 */ // c2\n" + ",\n" + "/* c1 */ // c2\n" + "arg2\n" + "/* c1 */ // c2\n" + ")\n" + "/* c1 */ // c2\n" + ";\n" + "/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */ // c2\n" + " (\n" + " /* c1 */ // c2\n" + " arg1\n" + " /* c1 */ // c2\n" + " ,\n" + " /* c1 */ // c2\n" + " arg2\n" + " /* c1 */ // c2\n" + " )\n" + "/* c1 */ // c2\n" + ";\n" + "/* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "/* c1 */\n" + "/* c2 */\n" + "(\n" + "/* c1 */\n" + "/* c2 */\n" + "arg1\n" + "/* c1 */\n" + "/* c2 */\n" + ",\n" + "/* c1 */\n" + "/* c2 */\n" + "arg2\n" + "/* c1 */\n" + "/* c2 */\n" + ")\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n" + "/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " /* c1 */\n" + " /* c2 */\n" + " (\n" + " /* c1 */\n" + " /* c2 */\n" + " arg1\n" + " /* c1 */\n" + " /* c2 */\n" + " ,\n" + " /* c1 */\n" + " /* c2 */\n" + " arg2\n" + " /* c1 */\n" + " /* c2 */\n" + " )\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n" + "/* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + "// c1\n" + "// c2\n" + "(\n" + "// c1\n" + "// c2\n" + "arg1\n" + "// c1\n" + "// c2\n" + ",\n" + "// c1\n" + "// c2\n" + "arg2\n" + "// c1\n" + "// c2\n" + ")\n" + "// c1\n" + "// c2\n" + ";\n" + "// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz\n" + " // c1\n" + " // c2\n" + " (\n" + " // c1\n" + " // c2\n" + " arg1\n" + " // c1\n" + " // c2\n" + " ,\n" + " // c1\n" + " // c2\n" + " arg2\n" + " // c1\n" + " // c2\n" + " )\n" + "// c1\n" + "// c2\n" + ";\n" + "// c1\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */\n" + "/* c2 */(/* c1 */\n" + "/* c2 */arg1/* c1 */\n" + "/* c2 */,/* c1 */\n" + "/* c2 */arg2/* c1 */\n" + "/* c2 */)/* c1 */\n" + "/* c2 */;/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */ ( /* c1 */\n" + " /* c2 */ arg1 /* c1 */\n" + " /* c2 */, /* c1 */\n" + " /* c2 */ arg2 /* c1 */\n" + " /* c2 */) /* c1 */\n" + "/* c2 */; /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz// c1\n" + "/* c2 */(// c1\n" + "/* c2 */arg1// c1\n" + "/* c2 */,// c1\n" + "/* c2 */arg2// c1\n" + "/* c2 */)// c1\n" + "/* c2 */;// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " /* c2 */ ( // c1\n" + " /* c2 */ arg1 // c1\n" + " /* c2 */, // c1\n" + " /* c2 */ arg2 // c1\n" + " /* c2 */) // c1\n" + "/* c2 */; // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */\n" + "/* c2 */\n" + "/* c3 */(/* c1 */\n" + "/* c2 */\n" + "/* c3 */arg1/* c1 */\n" + "/* c2 */\n" + "/* c3 */,/* c1 */\n" + "/* c2 */\n" + "/* c3 */arg2/* c1 */\n" + "/* c2 */\n" + "/* c3 */)/* c1 */\n" + "/* c2 */\n" + "/* c3 */;/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */\n" + " /* c3 */ ( /* c1 */\n" + " /* c2 */\n" + " /* c3 */ arg1 /* c1 */\n" + " /* c2 */\n" + " /* c3 */, /* c1 */\n" + " /* c2 */\n" + " /* c3 */ arg2 /* c1 */\n" + " /* c2 */\n" + " /* c3 */) /* c1 */\n" + "/* c2 */\n" + "/* c3 */; /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */\n" + "/* c2 */\n" + "(/* c1 */\n" + "/* c2 */\n" + "arg1/* c1 */\n" + "/* c2 */\n" + ",/* c1 */\n" + "/* c2 */\n" + "arg2/* c1 */\n" + "/* c2 */\n" + ")/* c1 */\n" + "/* c2 */\n" + ";/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */\n" + " ( /* c1 */\n" + " /* c2 */\n" + " arg1 /* c1 */\n" + " /* c2 */\n" + " , /* c1 */\n" + " /* c2 */\n" + " arg2 /* c1 */\n" + " /* c2 */\n" + " ) /* c1 */\n" + "/* c2 */\n" + "; /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz// c1\n" + "/* c2 */\n" + "(// c1\n" + "/* c2 */\n" + "arg1// c1\n" + "/* c2 */\n" + ",// c1\n" + "/* c2 */\n" + "arg2// c1\n" + "/* c2 */\n" + ")// c1\n" + "/* c2 */\n" + ";// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " /* c2 */\n" + " ( // c1\n" + " /* c2 */\n" + " arg1 // c1\n" + " /* c2 */\n" + " , // c1\n" + " /* c2 */\n" + " arg2 // c1\n" + " /* c2 */\n" + " ) // c1\n" + "/* c2 */\n" + "; // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */\n" + "// c2\n" + "(/* c1 */\n" + "// c2\n" + "arg1/* c1 */\n" + "// c2\n" + ",/* c1 */\n" + "// c2\n" + "arg2/* c1 */\n" + "// c2\n" + ")/* c1 */\n" + "// c2\n" + ";/* c1 */\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " // c2\n" + " ( /* c1 */\n" + " // c2\n" + " arg1 /* c1 */\n" + " // c2\n" + " , /* c1 */\n" + " // c2\n" + " arg2 /* c1 */\n" + " // c2\n" + " ) /* c1 */\n" + "// c2\n" + "; /* c1 */\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz// c1\n" + "// c2\n" + "(// c1\n" + "// c2\n" + "arg1// c1\n" + "// c2\n" + ",// c1\n" + "// c2\n" + "arg2// c1\n" + "// c2\n" + ")// c1\n" + "// c2\n" + ";// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " // c2\n" + " ( // c1\n" + " // c2\n" + " arg1 // c1\n" + " // c2\n" + " , // c1\n" + " // c2\n" + " arg2 // c1\n" + " // c2\n" + " ) // c1\n" + " // c2\n" + "; // c1\n" + " // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "(/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "arg1/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ",/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "arg2/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ")/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ";/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " ( /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " arg1 /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " , /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " arg2 /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " ) /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "; /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "$foobarbaz// c1\n" + "// c2\n" + "// c3\n" + "(// c1\n" + "// c2\n" + "// c3\n" + "arg1// c1\n" + "// c2\n" + "// c3\n" + ",// c1\n" + "// c2\n" + "// c3\n" + "arg2// c1\n" + "// c2\n" + "// c3\n" + ")// c1\n" + "// c2\n" + "// c3\n" + ";// c1\n" + "// c2\n" + "// c3\n", + "// verilog_syntax: parse-as-module-body\n" + "$foobarbaz // c1\n" + " // c2\n" + " // c3\n" + " ( // c1\n" + " // c2\n" + " // c3\n" + " arg1 // c1\n" + " // c2\n" + " // c3\n" + " , // c1\n" + " // c2\n" + " // c3\n" + " arg2 // c1\n" + " // c2\n" + " // c3\n" + " ) // c1\n" + " // c2\n" + " // c3\n" + "; // c1\n" + " // c2\n" + " // c3\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c */arg1/* c */,/* c */arg2/* c */)/* c */;/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c */\n" + " arg1 /* c */, /* c */\n" + " arg2 /* c */) /* c */; /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */ /* c2 */arg1/* c1 */ /* c2 */,/* c1 */ /* c2 " + "*/arg2/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */ /* c2 */\n" + " arg1 /* c1 */ /* c2 */, /* c1 */ /* c2 */\n" + " arg2 /* c1 */ /* c2 */) /* c1 */ /* c2 */; /* c1 */ /* c2 " + "*/\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c */\n" + "arg1/* c */\n" + ",/* c */\n" + "arg2/* c */\n" + ")/* c */\n" + ";/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c */\n" + " arg1 /* c */\n" + " , /* c */\n" + " arg2 /* c */\n" + ") /* c */\n" + "; /* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */ /* c2 */\n" + "arg1/* c1 */ /* c2 */\n" + ",/* c1 */ /* c2 */\n" + "arg2/* c1 */ /* c2 */\n" + ")/* c1 */ /* c2 */\n" + ";/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */ /* c2 */\n" + " arg1 /* c1 */ /* c2 */\n" + " , /* c1 */ /* c2 */\n" + " arg2 /* c1 */ /* c2 */\n" + ") /* c1 */ /* c2 */\n" + "; /* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c\n" + "arg1// c\n" + ",// c\n" + "arg2// c\n" + ")// c\n" + ";// c\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c\n" + " arg1 // c\n" + " , // c\n" + " arg2 // c\n" + ") // c\n" + "; // c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */ // c2\n" + "arg1/* c1 */ // c2\n" + ",/* c1 */ // c2\n" + "arg2/* c1 */ // c2\n" + ")/* c1 */ // c2\n" + ";/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */ // c2\n" + " arg1 /* c1 */ // c2\n" + " , /* c1 */ // c2\n" + " arg2 /* c1 */ // c2\n" + ") /* c1 */ // c2\n" + "; /* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c */arg1\n" + "/* c */,\n" + "/* c */arg2\n" + "/* c */)\n" + "/* c */;\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c */ arg1\n" + " /* c */,\n" + " /* c */ arg2\n" + "/* c */)\n" + "/* c */;\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ /* c2 */arg1\n" + "/* c1 */ /* c2 */,\n" + "/* c1 */ /* c2 */arg2\n" + "/* c1 */ /* c2 */)\n" + "/* c1 */ /* c2 */;\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */ /* c2 */ arg1\n" + " /* c1 */ /* c2 */,\n" + " /* c1 */ /* c2 */ arg2\n" + "/* c1 */ /* c2 */)\n" + "/* c1 */ /* c2 */;\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c */\n" + "arg1\n" + "/* c */\n" + ",\n" + "/* c */\n" + "arg2\n" + "/* c */\n" + ")\n" + "/* c */\n" + ";\n" + "/* c */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c */\n" + " arg1\n" + " /* c */\n" + " ,\n" + " /* c */\n" + " arg2\n" + " /* c */\n" + ")\n" + "/* c */\n" + ";\n" + "/* c */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ /* c2 */\n" + "arg1\n" + "/* c1 */ /* c2 */\n" + ",\n" + "/* c1 */ /* c2 */\n" + "arg2\n" + "/* c1 */ /* c2 */\n" + ")\n" + "/* c1 */ /* c2 */\n" + ";\n" + "/* c1 */ /* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */ /* c2 */\n" + " arg1\n" + " /* c1 */ /* c2 */\n" + " ,\n" + " /* c1 */ /* c2 */\n" + " arg2\n" + " /* c1 */ /* c2 */\n" + ")\n" + "/* c1 */ /* c2 */\n" + ";\n" + "/* c1 */ /* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "// c\n" + "arg1\n" + "// c\n" + ",\n" + "// c\n" + "arg2\n" + "// c\n" + ")\n" + "// c\n" + ";\n" + "// c\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " // c\n" + " arg1\n" + " // c\n" + " ,\n" + " // c\n" + " arg2\n" + " // c\n" + ")\n" + "// c\n" + ";\n" + "// c\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */ // c2\n" + "arg1\n" + "/* c1 */ // c2\n" + ",\n" + "/* c1 */ // c2\n" + "arg2\n" + "/* c1 */ // c2\n" + ")\n" + "/* c1 */ // c2\n" + ";\n" + "/* c1 */ // c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */ // c2\n" + " arg1\n" + " /* c1 */ // c2\n" + " ,\n" + " /* c1 */ // c2\n" + " arg2\n" + " /* c1 */ // c2\n" + ")\n" + "/* c1 */ // c2\n" + ";\n" + "/* c1 */ // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "/* c1 */\n" + "/* c2 */\n" + "arg1\n" + "/* c1 */\n" + "/* c2 */\n" + ",\n" + "/* c1 */\n" + "/* c2 */\n" + "arg2\n" + "/* c1 */\n" + "/* c2 */\n" + ")\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n" + "/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " /* c1 */\n" + " /* c2 */\n" + " arg1\n" + " /* c1 */\n" + " /* c2 */\n" + " ,\n" + " /* c1 */\n" + " /* c2 */\n" + " arg2\n" + " /* c1 */\n" + " /* c2 */\n" + ")\n" + "/* c1 */\n" + "/* c2 */\n" + ";\n" + "/* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + "// c1\n" + "// c2\n" + "arg1\n" + "// c1\n" + "// c2\n" + ",\n" + "// c1\n" + "// c2\n" + "arg2\n" + "// c1\n" + "// c2\n" + ")\n" + "// c1\n" + "// c2\n" + ";\n" + "// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(\n" + " // c1\n" + " // c2\n" + " arg1\n" + " // c1\n" + " // c2\n" + " ,\n" + " // c1\n" + " // c2\n" + " arg2\n" + " // c1\n" + " // c2\n" + ")\n" + "// c1\n" + "// c2\n" + ";\n" + "// c1\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */arg1/* c1 */\n" + "/* c2 */,/* c1 */\n" + "/* c2 */arg2/* c1 */\n" + "/* c2 */)/* c1 */\n" + "/* c2 */;/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */ arg1 /* c1 */\n" + " /* c2 */, /* c1 */\n" + " /* c2 */ arg2 /* c1 */\n" + "/* c2 */) /* c1 */\n" + "/* c2 */; /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "/* c2 */arg1// c1\n" + "/* c2 */,// c1\n" + "/* c2 */arg2// c1\n" + "/* c2 */)// c1\n" + "/* c2 */;// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " /* c2 */ arg1 // c1\n" + " /* c2 */, // c1\n" + " /* c2 */ arg2 // c1\n" + "/* c2 */) // c1\n" + "/* c2 */; // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */\n" + "/* c3 */arg1/* c1 */\n" + "/* c2 */\n" + "/* c3 */,/* c1 */\n" + "/* c2 */\n" + "/* c3 */arg2/* c1 */\n" + "/* c2 */\n" + "/* c3 */)/* c1 */\n" + "/* c2 */\n" + "/* c3 */;/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */\n" + " /* c3 */ arg1 /* c1 */\n" + " /* c2 */\n" + " /* c3 */, /* c1 */\n" + " /* c2 */\n" + " /* c3 */ arg2 /* c1 */\n" + " /* c2 */\n" + "/* c3 */) /* c1 */\n" + "/* c2 */\n" + "/* c3 */; /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */\n" + "arg1/* c1 */\n" + "/* c2 */\n" + ",/* c1 */\n" + "/* c2 */\n" + "arg2/* c1 */\n" + "/* c2 */\n" + ")/* c1 */\n" + "/* c2 */\n" + ";/* c1 */\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */\n" + " arg1 /* c1 */\n" + " /* c2 */\n" + " , /* c1 */\n" + " /* c2 */\n" + " arg2 /* c1 */\n" + " /* c2 */\n" + ") /* c1 */\n" + "/* c2 */\n" + "; /* c1 */\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "/* c2 */\n" + "arg1// c1\n" + "/* c2 */\n" + ",// c1\n" + "/* c2 */\n" + "arg2// c1\n" + "/* c2 */\n" + ")// c1\n" + "/* c2 */\n" + ";// c1\n" + "/* c2 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " /* c2 */\n" + " arg1 // c1\n" + " /* c2 */\n" + " , // c1\n" + " /* c2 */\n" + " arg2 // c1\n" + " /* c2 */\n" + ") // c1\n" + "/* c2 */\n" + "; // c1\n" + "/* c2 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "// c2\n" + "arg1/* c1 */\n" + "// c2\n" + ",/* c1 */\n" + "// c2\n" + "arg2/* c1 */\n" + "// c2\n" + ")/* c1 */\n" + "// c2\n" + ";/* c1 */\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " // c2\n" + " arg1 /* c1 */\n" + " // c2\n" + " , /* c1 */\n" + " // c2\n" + " arg2 /* c1 */\n" + " // c2\n" + ") /* c1 */\n" + "// c2\n" + "; /* c1 */\n" + "// c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "// c2\n" + "arg1// c1\n" + "// c2\n" + ",// c1\n" + "// c2\n" + "arg2// c1\n" + "// c2\n" + ")// c1\n" + "// c2\n" + ";// c1\n" + "// c2\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " // c2\n" + " arg1 // c1\n" + " // c2\n" + " , // c1\n" + " // c2\n" + " arg2 // c1\n" + " // c2\n" + ") // c1\n" + " // c2\n" + "; // c1\n" + " // c2\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "arg1/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ",/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "arg2/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ")/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + ";/* c1 */\n" + "/* c2 */\n" + "/* c3 */\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " arg1 /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " , /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + " arg2 /* c1 */\n" + " /* c2 */\n" + " /* c3 */\n" + ") /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n" + "; /* c1 */\n" + "/* c2 */\n" + "/* c3 */\n"}, + {"// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ(// c1\n" + "// c2\n" + "// c3\n" + "arg1// c1\n" + "// c2\n" + "// c3\n" + ",// c1\n" + "// c2\n" + "// c3\n" + "arg2// c1\n" + "// c2\n" + "// c3\n" + ")// c1\n" + "// c2\n" + "// c3\n" + ";// c1\n" + "// c2\n" + "// c3\n", + "// verilog_syntax: parse-as-module-body\n" + "`FOOBARBAZ( // c1\n" + " // c2\n" + " // c3\n" + " arg1 // c1\n" + " // c2\n" + " // c3\n" + " , // c1\n" + " // c2\n" + " // c3\n" + " arg2 // c1\n" + " // c2\n" + " // c3\n" + ") // c1\n" + " // c2\n" + " // c3\n" + "; // c1\n" + " // c2\n" + " // c3\n"}, + {"module indent();\n" + " reg a;\n" + " reg [32:0] b;\n" + " wire c;\n" + " wire d = e ? kFoo : kBar;\n" + "endmodule\n", + "module indent ();\n" + " reg a;\n" + " reg [32:0] b;\n" + " wire c;\n" + " wire d = e ? kFoo : kBar;\n" + "endmodule\n"}, + + {"class C; T1 b; logic [$] a; T1 [$] c; endclass\n", + "class C;\n" + " T1 b;\n" + " logic [$] a;\n" + " T1 [$] c;\n" + "endclass\n"}, + {"class C;\n" + " T1 b; //test\n" + " logic [$] a; //test\n" + " T1 [$] c; //test\n" + "endclass\n", + "class C;\n" + " T1 b; //test\n" + " logic [$] a; //test\n" + " T1 [$] c; //test\n" + "endclass\n"}, + {"class C;\n" + " T1\n" + " b;\n" + " logic\n" + " [$]\n" + " a;\n" + " T1\n" + " [$]\n" + " c;\n" + "endclass\n", + "class C;\n" + " T1 b;\n" + " logic [$] a;\n" + " T1 [$] c;\n" + "endclass\n"}, + {"class C;\n" + " logic/*t*/ [0 : 1] /*t*/\n" + " a;/*t*/\n" + " T1/*t*/[0 : 1]/*t*/\n" + " c;/*t*/\n" + "endclass\n", + "class C;\n" + " logic/*t*/ [0 : 1] /*t*/ a; /*t*/\n" + " T1/*t*/ [0 : 1] /*t*/ c; /*t*/\n" + "endclass\n"}, + {"always @(*/*t*/) begin\n" + "end\n", + "always @(* /*t*/) begin\n" + "end\n"}, + {"always @(/*t*/*) begin\n" + "end\n", + "always @( /*t*/ *) begin\n" + "end\n"}, + {"always @(/*t*/*/*t*/) begin\n" + "end\n", + "always @( /*t*/ * /*t*/) begin\n" + "end\n"}, + {"always @(*) begin\n" + "end\n", + "always @(*) begin\n" + "end\n"}, + {"always @(* ) begin\n" + "end\n", + "always @(*) begin\n" + "end\n"}, + {"always @( *) begin\n" + "end\n", + "always @(*) begin\n" + "end\n"}, + {"always @( * ) begin\n" + "end\n", + "always @(*) begin\n" + "end\n"}, + {"always @( /*t*/ * /*t*/ ) begin\n" + "end\n", + "always @( /*t*/ * /*t*/) begin\n" + "end\n"}, + { + // Don't touch verilog_format:off region #1538 + R"( +module testcode; + // verilog_format: off + assign a = b + & c; + // verilog_format: on + assign e = d; +endmodule +)", + R"( +module testcode; + // verilog_format: off + assign a = b + & c; + // verilog_format: on + assign e = d; +endmodule +)", + + }, + + // ----------------------------------------------------------------- +}; + +TEST(FormatterEndToEndTest, DisableFormatterTestCases) { + RunFormatterTestCases40(kDisableFormatterTestCases); +} + +} // namespace +} // namespace formatter +} // namespace verilog
diff --git a/verible/verilog/formatting/formatter_function_task_test.cc b/verible/verilog/formatting/formatter_function_task_test.cc new file mode 100644 index 0000000..88e30bb --- /dev/null +++ b/verible/verilog/formatting/formatter_function_task_test.cc
@@ -0,0 +1,2234 @@ +// Copyright 2017-2026 The Verible Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Test cases in this file should be *insensitive* to wrapping penalties. +// Penalty-sensitive tests belong in formatter-tuning_test.cc. + +#include "gtest/gtest.h" +#include "verible/verilog/formatting/formatter-test-utils.h" + +namespace verilog { +namespace formatter { +namespace { + +static constexpr FormatterTestCase kFunctionTaskFormatterTestCases[] = { + // function test cases + {"function f ;endfunction", "function f;\nendfunction\n"}, + {"function f ;endfunction: f", "function f;\nendfunction : f\n"}, + {"function f ( );endfunction", "function f();\nendfunction\n"}, + {"function f (input bit x);endfunction", + "function f(input bit x);\nendfunction\n"}, + {"function f (input bit x,logic y );endfunction", + "function f(input bit x, logic y);\nendfunction\n"}, + {"function f;\n// statement comment\nendfunction\n", + "function f;\n" + " // statement comment\n" // indented + "endfunction\n"}, + {"function f();\n// statement comment\nendfunction\n", + "function f();\n" + " // statement comment\n" // indented + "endfunction\n"}, + {"function f(input int x);\n" + "// statement comment\n" + "f=x;\n" + "// statement comment\n" + "endfunction\n", + "function f(input int x);\n" + " // statement comment\n" // indented + " f = x;\n" + " // statement comment\n" // indented + "endfunction\n"}, + {// line breaks around assignments + "function f;a=b;c+=d;endfunction", + "function f;\n" + " a = b;\n" + " c += d;\n" + "endfunction\n"}, + {"function f;a&=b;c=d;endfunction", + "function f;\n" + " a &= b;\n" + " c = d;\n" + "endfunction\n"}, + {"function f;a<<=b;c=b;d>>>=b;endfunction", + "function f;\n" + " a <<= b;\n" + " c = b;\n" + " d >>>= b;\n" + "endfunction\n"}, + {// port declaration exceeds line length limit + "function f (loooong_type if_it_fits_I_sits);endfunction", + "function f(\n" + " loooong_type if_it_fits_I_sits);\n" + "endfunction\n"}, + {"function\nvoid\tspace;a=( b+c )\n;endfunction :space\n", + "function void space;\n" + " a = (b + c);\n" + "endfunction : space\n"}, + {"function\nvoid\twarranty;return to_sender\n;endfunction :warranty\n", + "function void warranty;\n" + " return to_sender;\n" + "endfunction : warranty\n"}, + {// if statement that fits on one line + "function if_i_fits_i_sits;" + "if(x)y=x;" + "endfunction", + "function if_i_fits_i_sits;\n" + " if (x) y = x;\n" + "endfunction\n"}, + {// for loop + "function\nvoid\twarranty;for(j=0; j<k; --k)begin " + "++j\n;end endfunction :warranty\n", + "function void warranty;\n" + " for (j = 0; j < k; --k) begin\n" + " ++j;\n" + " end\n" + "endfunction : warranty\n"}, + {// for loop that needs wrapping + "function\nvoid\twarranty;for(jjjjj=0; jjjjj<kkkkk; --kkkkk)begin " + "++j\n;end endfunction :warranty\n", + "function void warranty;\n" + " for (\n" + " jjjjj = 0; jjjjj < kkkkk; --kkkkk\n" + " ) begin\n" + " ++j;\n" + " end\n" + "endfunction : warranty\n"}, + {// for loop that needs more wrapping + "function\nvoid\twarranty;" + "for(jjjjjjjj=0; jjjjjjjj<kkkkkkkk; --kkkkkkkk)begin " + "++j\n;end endfunction :warranty\n", + "function void warranty;\n" + " for (\n" + " jjjjjjjj = 0;\n" + " jjjjjjjj < kkkkkkkk;\n" + " --kkkkkkkk\n" + " ) begin\n" + " ++j;\n" + " end\n" + "endfunction : warranty\n"}, + {// for loop that fits on one line + "function loop_fits;" + "for(x=0;x<N;++x) y=x;" + "endfunction", + "function loop_fits;\n" + " for (x = 0; x < N; ++x) y = x;\n" + "endfunction\n"}, + {// for loop that would fit on one line, but is force-split with //comment + "function loop_fits;" + "for(x=0;x<N;++x) //\n y=x;" + "endfunction", + "function loop_fits;\n" + " for (x = 0; x < N; ++x) //\n" + " y = x;\n" + "endfunction\n"}, + {// for loop with function call in initializer + "function void looper(); " + "for (int i=f(n); i>=0; i -- ) begin end " + "endfunction", + "function void looper();\n" + " for (int i = f(n); i >= 0; i--) begin\n" + " end\n" + "endfunction\n"}, + {// for loop with function call in condition + "function void looper(); " + "for (int i=0; i<f(m); i -- ) begin end " + "endfunction", + "function void looper();\n" + " for (int i = 0; i < f(m); i--) begin\n" + " end\n" + "endfunction\n"}, + {// for loop with an attribute instance in the initializer. + // Regression: this used to abort with a CHECK failure while reshaping + // the kForSpec partitions when an attribute appears in the header. + "module m; initial for(int i=0(* a *);i<4;i++) x=i; endmodule", + "module m;\n" + " initial\n" + " for (int i = 0 (* a *); i < 4; i++)\n" + " x = i;\n" + "endmodule\n"}, + {// forever loop + "function\nvoid\tforevah;forever begin " + "++k\n;end endfunction\n", + "function void forevah;\n" + " forever begin\n" + " ++k;\n" + " end\n" + "endfunction\n"}, + {// forever loop + "function\nvoid\tforevah;forever " + "++k\n;endfunction\n", + "function void forevah;\n" + " forever ++k;\n" + "endfunction\n"}, + {// forever loop, forced break + "function\nvoid\tforevah;forever //\n" + "++k\n;endfunction\n", + "function void forevah;\n" + " forever //\n" + " ++k;\n" + "endfunction\n"}, + {// repeat loop + "function\nvoid\tpete;repeat(3) begin " + "++k\n;end endfunction\n", + "function void pete;\n" + " repeat (3) begin\n" + " ++k;\n" + " end\n" + "endfunction\n"}, + {// repeat loop + "function\nvoid\tpete;repeat(3) " + "++k\n;endfunction\n", + "function void pete;\n" + " repeat (3)++k;\n" // TODO(fangism): space before ++ + "endfunction\n"}, + {// repeat loop, forced break + "function\nvoid\tpete;repeat(3)//\n" + "++k\n;endfunction\n", + "function void pete;\n" + " repeat (3) //\n" + " ++k;\n" + "endfunction\n"}, + {// while loop + "function\nvoid\twily;while( coyote ) begin " + "++super_genius\n;end endfunction\n", + "function void wily;\n" + " while (coyote) begin\n" + " ++super_genius;\n" + " end\n" + "endfunction\n"}, + {// while loop + "function\nvoid\twily;while( coyote ) " + "++ super_genius\n; endfunction\n", + "function void wily;\n" + " while (coyote)++super_genius;\n" // TODO(fangism): space before ++ + "endfunction\n"}, + {// while loop, forced break + "function\nvoid\twily;while( coyote ) //\n " + "++ super_genius\n; endfunction\n", + "function void wily;\n" + " while (coyote) //\n" + " ++super_genius;\n" + "endfunction\n"}, + {// do-while loop + "function\nvoid\tdonot;do begin " + "++s\n;end while( z);endfunction\n", + "function void donot;\n" + " do begin\n" + " ++s;\n" + " end while (z);\n" + "endfunction\n"}, + {// do-while loop, single statement + "function\nvoid\tdonot;do " + "++s\n; while( z);endfunction\n", + "function void donot;\n" + " do ++s; while (z);\n" + "endfunction\n"}, + {// do-while loop, single statement, forced break + "function\nvoid\tdonot;do " + "++s\n;//\n while( z);endfunction\n", + "function void donot;\n" + " do\n" + " ++s; //\n" + " while (z);\n" + "endfunction\n"}, + {// foreach loop + "function\nvoid\tforeacher;foreach( m [n] ) begin " + "++m\n;end endfunction\n", + "function void foreacher;\n" + " foreach (m[n]) begin\n" + " ++m;\n" + " end\n" + "endfunction\n"}, + {// spaces in condition expression + "function f; return {a}? {b} :{ c };endfunction", + "function f;\n" + " return {a} ? {b} : {c};\n" + "endfunction\n"}, + {"task t;endtask", + "task t;\n" + "endtask\n"}, + {"task t ( );endtask", + "task t();\n" + "endtask\n"}, + {"task t (input bit drill ) ;endtask", + "task t(input bit drill);\n" + "endtask\n"}, + {"task t; ## 100 ;endtask", + "task t;\n" + " ##100;\n" + "endtask\n"}, + {"task t; ## (1+1) ;endtask", // delay expression + "task t;\n" + " ##(1 + 1);\n" + "endtask\n"}, + {"task t; ## delay_value ;endtask", + "task t;\n" + " ##delay_value;\n" + "endtask\n"}, + {"task t; ## `DELAY_VALUE ;endtask", + "task t;\n" + " ##`DELAY_VALUE;\n" + "endtask\n"}, + {"task t;\n" + "`uvm_error( foo,bar);\n" + "endtask\n", + "task t;\n" + " `uvm_error(foo, bar);\n" + "endtask\n"}, + {"task t;\n" + "`uvm_error(foo,bar)\n" + ";\n" // null statement + "endtask\n", + "task t;\n" + " `uvm_error(foo, bar)\n" + " ;\n" + "endtask\n"}, + {"task t;\n" + "if(expr)begin\t\n" + "`uvm_error(foo,bar);\n" + "end\n" + "endtask\n", + "task t;\n" + " if (expr) begin\n" + " `uvm_error(foo, bar);\n" + " end\n" + "endtask\n"}, + {"task\nrabbit;$kill(the,\nrabbit)\n;endtask: rabbit\n", + "task rabbit;\n" + " $kill(the, rabbit);\n" + "endtask : rabbit\n"}, + {"function int foo( );if( a )a+=1 ; endfunction", + "function int foo();\n" + " if (a) a += 1;\n" + "endfunction\n"}, + {"function void foo( );foo=`MACRO(b,c) ; endfunction", + "function void foo();\n" + " foo = `MACRO(b, c);\n" + "endfunction\n"}, + {"module foo;if \t (bar)begin assign a=1; end endmodule", + "module foo;\n" + " if (bar) begin\n" + " assign a = 1;\n" + " end\n" + "endmodule\n"}, + {"module proc_cont_assigner;\n" + "always begin\n" + "assign x1 = y1;\n" + "deassign x2 ;\n" + "force x3=y3;\n" + "release x4 ;\n" + "end\n" + "endmodule\n", + "module proc_cont_assigner;\n" + " always begin\n" + " assign x1 = y1;\n" + " deassign x2;\n" + " force x3 = y3;\n" + " release x4;\n" + " end\n" + "endmodule\n"}, + {"module g_test( );\n" + "\tinitial begin:main_test \t" + "for(int i=0;i<k;i++)begin " + "case(i )\n" + " 6'd0 :release in[0]; \n" + " endcase " + " \t\tend \t" + "\t end:main_test\n" + "endmodule:g_test\n", + "module g_test ();\n" + " initial begin : main_test\n" + " for (int i = 0; i < k; i++) begin\n" + " case (i)\n" + " 6'd0: release in[0];\n" + " endcase\n" + " end\n" + " end : main_test\n" + "endmodule : g_test\n"}, + {// conditional generate (case) + "module mc; case(s)a : bb c ; d : ee f; endcase endmodule", + "module mc;\n" + " case (s)\n" + " a: bb c;\n" + " d: ee f;\n" + " endcase\n" + "endmodule\n"}, + {// conditional generate (case), with comments + "module mc; case(s)\n//comment a\na:bb c;\n//comment b\n endcase " + "endmodule", + "module mc;\n" + " case (s)\n" + " //comment a\n" // indented to case-item level + " a: bb c;\n" + " //comment b\n" // indented to case-item level + " endcase\n" + "endmodule\n"}, + + {// "default:", not "default :" + "function f; case (x) default: x=y; endcase endfunction\n", + "function f;\n" + " case (x)\n" + " default: x = y;\n" + " endcase\n" + "endfunction\n"}, + {// default with null statement: "default: ;", not "default :;" + "function f; case (x) default :; endcase endfunction\n", + "function f;\n" + " case (x)\n" + " default: ;\n" + " endcase\n" + "endfunction\n"}, + {// case statement + "function f; case (x) State0 : a=b; State1 : begin a=b; end " + "endcase endfunction\n", + "function f;\n" + " case (x)\n" + " State0: a = b;\n" + " State1: begin\n" + " a = b;\n" + " end\n" + " endcase\n" + "endfunction\n"}, + {// case statement, interleaved with comments + "function f; case (x) \n//c1\nState0 : a=b;//c2\n//c3\n State1 : " + "a=b;//c4\n//c5\n " + "endcase endfunction\n", + "function f;\n" + " case (x)\n" + " //c1\n" + " State0: a = b; //c2\n" + " //c3\n" + " State1: a = b; //c4\n" + " //c5\n" + " endcase\n" + "endfunction\n"}, + {// case inside statement, comments + "function f; case (x)inside \n//comment\n" + "[0:1]:x=y; \n" + " //comment\n" + "endcase endfunction\n", + "function f;\n" + " case (x) inside\n" + " //comment\n" + " [0 : 1]: x = y;\n" + " //comment\n" + " endcase\n" + "endfunction\n"}, + {// case inside statement + "function f; case (x)inside k1 : return b; k2 : begin return b; end " + "endcase endfunction\n", + "function f;\n" + " case (x) inside\n" + " k1: return b;\n" + " k2: begin\n" + " return b;\n" + " end\n" + " endcase\n" + "endfunction\n"}, + {// case inside statement, with ranges + "function f; case (x) inside[a:b] : return b; [c:d] : return b; " + "default :return z;" + "endcase endfunction\n", + "function f;\n" + " case (x) inside\n" + " [a : b]: return b;\n" + " [c : d]: return b;\n" + " default: return z;\n" + " endcase\n" + "endfunction\n"}, + {// case pattern statement + "function f;" + "case (y) matches " + ".foo : return 0;" + ".*\t: return 1;" + "endcase " + "case (z) matches " + ".foo\t\t: return 0;" + ".* : return 1;" + "endcase " + "endfunction", + "function f;\n" + " case (y) matches\n" + " .foo: return 0;\n" + " .*: return 1;\n" + " endcase\n" + " case (z) matches\n" + " .foo: return 0;\n" + " .*: return 1;\n" + " endcase\n" + "endfunction\n"}, + {// keep short case items on one line + "function f; case (x)k1 : if( b )break; default :return 2;" + "endcase endfunction\n", + "function f;\n" + " case (x)\n" + " k1: if (b) break;\n" // aligned + " default: return 2;\n" + " endcase\n" + "endfunction\n"}, + {// keep short default items on one line + "function f; case (x)k1 :break; default :if( c )return 2;" + "endcase endfunction\n", + "function f;\n" + " case (x)\n" + " k1: break;\n" // aligned + " default: if (c) return 2;\n" + " endcase\n" + "endfunction\n"}, + {// keep short case inside items on one line + "function f; case (x)inside k1 : if( b )return c; k2 : return a;" + "endcase endfunction\n", + "function f;\n" + " case (x) inside\n" + " k1: if (b) return c;\n" + " k2: return a;\n" + " endcase\n" + "endfunction\n"}, + {// keep short case pattern items on one line + "function f;" + "case (y) matches " + ".foo :if( n )return 0;" + ".*\t: return 1;" + "endcase " + "endfunction", + "function f;\n" + " case (y) matches\n" + " .foo: if (n) return 0;\n" + " .*: return 1;\n" + " endcase\n" + "endfunction\n"}, + {// randcase + "function f; randcase k1 : return c; k2 : return a;" + "endcase endfunction\n", + "function f;\n" + " randcase\n" + " k1: return c;\n" + " k2: return a;\n" + " endcase\n" + "endfunction\n"}, + + // This tests checks for not breaking around hierarchy operators. + {"function\nvoid\twarranty;" + "foo.bar = fancyfunction(aaaaaaaa.bbbbbbb," + " ccccccccc.ddddddddd) ;" + "endfunction :warranty\n", + "function void warranty;\n" + " foo.bar = fancyfunction(\n" + " aaaaaaaa.bbbbbbb,\n" + " ccccccccc.ddddddddd\n" + " );\n" + "endfunction : warranty\n"}, + + // Group of tests testing partitioning of arguments inside function calls + {// function with function call inside if statement header + "function foo;if(aa(bb,cc));endfunction\n", + "function foo;\n" + " if (aa(bb, cc));\n" + "endfunction\n"}, + {// function with function call inside if statement header and with + // begin-end block + "function foo;if (aa(bb,cc,dd,ee))begin end endfunction\n", + "function foo;\n" + " if (aa(bb, cc, dd, ee)) begin\n" + " end\n" + "endfunction\n"}, + {// function with kMethodCallExtension inside if statement header and with + // begin-end block + "function foo;if (aa.bb(cc,dd,ee))begin end endfunction\n", + "function foo;\n" + " if (aa.bb(cc, dd, ee)) begin\n" + " end\n" + "endfunction\n"}, + {// nested kMethodCallExtension calls - one level + "function foo;aa.bb(cc.dd(a1), ee.ff(a2));endfunction\n", + "function foo;\n" + " aa.bb(cc.dd(a1), ee.ff(a2));\n" + "endfunction\n"}, + {// nested kMethodCallExtension calls - two level + "function foo;aa.bb(cc.dd(a1.b1(a2), b1), ee.ff(c1, d1));endfunction\n", + "function foo;\n" + " aa.bb(cc.dd(a1.b1(a2), b1), ee.ff(\n" + " c1, d1));\n" + "endfunction\n"}, + + {// simple initial statement with function call + "module m;initial aa(bb,cc,dd,ee);endmodule\n", + "module m;\n" + " initial aa(bb, cc, dd, ee);\n" + "endmodule\n"}, + {// expressions and function calls inside if-statement headers + "module m;initial begin if(aa(bb)==cc(dd))a=b;if (xx()) b = a;end " + "endmodule\n", + "module m;\n" + " initial begin\n" + " if (aa(bb) == cc(dd)) a = b;\n" + " if (xx()) b = a;\n" + " end\n" + "endmodule\n"}, + {// fuction with two arguments inside if-statement headers + "module\nm;initial\nbegin\nif(aa(bb,cc))x=y;end\nendmodule\n", + "module m;\n" + " initial begin\n" + " if (aa(bb, cc)) x = y;\n" + " end\n" + "endmodule\n"}, + {// kMethodCallExtension inside if-statement headers + "module m;initial begin if (aa.bb(cc)) x = y;end endmodule", + "module m;\n" + " initial begin\n" + " if (aa.bb(cc)) x = y;\n" + " end\n" + "endmodule\n"}, + {// initial statement with object method call + "module m; initial a.b(a,b,c); endmodule\n", + "module m;\n" + " initial a.b(a, b, c);\n" + "endmodule\n"}, + {// initial statement with method call on indexed object + "module m; initial a[i].b(a,b,c); endmodule\n", + "module m;\n" + " initial a[i].b(a, b, c);\n" + "endmodule\n"}, + {// initial statement with method call on function returned object + "module m; initial a(d,e,f).b(a,b,c); endmodule\n", + "module m;\n" + " initial a(d, e, f).b(a, b, c);\n" + "endmodule\n"}, + {// initial statement with indexed access to function returned object + "module m; initial a(a,b,c)[i]; endmodule\n", + "module m;\n" + " initial a(a, b, c) [i];\n" + "endmodule\n"}, + {// method call with no arguments on an object + "module m; initial foo.bar();endmodule\n", + "module m;\n" + " initial foo.bar();\n" + "endmodule\n"}, + {// method call with one argument on an object + "module m; initial foo.bar(aa);endmodule\n", + "module m;\n" + " initial foo.bar(aa);\n" + "endmodule\n"}, + {// method call with two arguments on an object + "module m; initial foo.bar(aa,bb);endmodule\n", + "module m;\n" + " initial foo.bar(aa, bb);\n" + "endmodule\n"}, + {// method call with three arguments on an object + "module m; initial foo.bar(aa,bb,cc);endmodule\n", + "module m;\n" + " initial foo.bar(aa, bb, cc);\n" + "endmodule\n"}, + + { + // This tests for if-statements with null statements + "function foo;" + "if (zz) ; " + "if (yy) ; " + "endfunction", + "function foo;\n" + " if (zz);\n" + " if (yy);\n" + "endfunction\n", + }, + + { + // This tests for if-statements starting on their own line. + "function foo;" + "if (zz) begin " + "return 0;" + "end " + "if (yy) begin " + "return 1;" + "end " + "endfunction", + "function foo;\n" + " if (zz) begin\n" + " return 0;\n" + " end\n" + " if (yy) begin\n" + " return 1;\n" + " end\n" + "endfunction\n", + }, + + { + // This tests for if-statements with single statement bodies + "function foo;" + "if (zz) return 0;" + "if (yy) return 1;" + "endfunction", + "function foo;\n" + " if (zz) return 0;\n" + " if (yy) return 1;\n" + "endfunction\n", + }, + + { + // This tests for if-statement mixed with plain statements + "function foo;" + "a=b;" + "if (zz) return 0;" + "c=d;" + "endfunction", + "function foo;\n" + " a = b;\n" + " if (zz) return 0;\n" + " c = d;\n" + "endfunction\n", + }, + + { + // This tests for if-statement with forced break mixed with others + "function foo;" + "a=b;" + "if (zz)//\n return 0;" + "c=d;" + "endfunction", + "function foo;\n" + " a = b;\n" + " if (zz) //\n" + " return 0;\n" + " c = d;\n" + "endfunction\n", + }, + { + "function t;" + "if (r == t)" + "a.b(c);" + "endfunction", + "function t;\n" + " if (r == t) a.b(c);\n" + "endfunction\n", + }, + + {// This tests for for-statement with forced break mixed with others + "function f;" + "x=y;" + "for (int i=0; i<S*IPS; i++) #1ps a += $urandom();" + "return 2;" + "endfunction", + "function f;\n" + " x = y;\n" + " for (int i = 0; i < S * IPS; i++)\n" // doesn't fit, so indents + " #1ps a += $urandom();\n" + " return 2;\n" + "endfunction\n"}, + + { + // This tests for-statements with null statements + "function foo;" + "for(;;) ;\t" + "for(;;) ;\t" + "endfunction", + "function foo;\n" + " for (;;);\n" + " for (;;);\n" + "endfunction\n", + }, + + { + // This tests for if-else-statements with null statements + "function foo;" + "if (zz) ; else ;" + "if (yy) ; else ;" + "endfunction", + "function foo;\n" + " if (zz);\n" + " else;\n" + " if (yy);\n" + " else;\n" + "endfunction\n", + }, + + { + // This tests for end-else-begin. + "function foo;" + "if (zz) begin " + "return 0;" + "end " + "else " + "begin " + "return 1;" + "end " + "endfunction", + "function foo;\n" + " if (zz) begin\n" + " return 0;\n" + " end else begin\n" + " return 1;\n" + " end\n" + "endfunction\n", + }, + { + // This tests for end-else-if + "function foo;" + "if (zz) begin " + "return 0;" + "end " + "else " + "if(yy)begin " + "return 1;" + "end " + "endfunction", + "function foo;\n" + " if (zz) begin\n" + " return 0;\n" + " end else if (yy) begin\n" + " return 1;\n" + " end\n" + "endfunction\n", + }, + { + // This tests labeled end-else-if + "function foo;" + "if (zz) begin : label1 " + "return 0;" + "end : label1 " + "else if (yy) begin : label2 " + "return 1;" + "end : label2 " + "endfunction", + "function foo;\n" + " if (zz) begin : label1\n" + " return 0;\n" + " end : label1\n" + " else if (yy) begin : label2\n" + " return 1;\n" + " end : label2\n" + "endfunction\n", + }, + { + // This tests labeled end-else-if-else + "function foo;" + "if (zz) begin : label1 " + "return 0;" + "end : label1 " + "else if (yy) begin : label2 " + "return 1;" + "end : label2 " + "else begin : label3 " + "return 2;" + "end : label3 " + "endfunction", + "function foo;\n" + " if (zz) begin : label1\n" + " return 0;\n" + " end : label1\n" + " else if (yy) begin : label2\n" + " return 1;\n" + " end : label2\n" + " else begin : label3\n" + " return 2;\n" + " end : label3\n" + "endfunction\n", + }, + + { + // randomize function + "function r ;" + "if ( ! randomize (bar )) begin end " + "if ( ! obj.randomize (bar )) begin end " + "endfunction", + "function r;\n" + " if (!randomize(bar)) begin\n" + " end\n" + " if (!obj.randomize(bar)) begin\n" + " end\n" + "endfunction\n", + }, + { + // randomize-with call, with comments + "function f;" + "s = std::randomize() with {\n" + "// comment1\n" + "a == e;\n" + "// comment2\n" + "};" + "endfunction\n", + "function f;\n" + " s = std::randomize() with {\n" + " // comment1\n" + " a == e;\n" + " // comment2\n" + " };\n" + "endfunction\n", + }, + { + // randomize-with call, with comments, one joined + "function f;" + "s = std::randomize() with {\n" + "// comment1\n" + "a == e;// comment2\n" + "};" + "endfunction\n", + "function f;\n" + " s = std::randomize() with {\n" + " // comment1\n" + " a == e; // comment2\n" + " };\n" + "endfunction\n", + }, + { + // randomize-with call, with comment, and conditional + "function f;" + "s = std::randomize() with {\n" + "// comment\n" + "a == e;" + "if (x) {" + "a;" + "}" + "};" + "endfunction\n", + "function f;\n" + " s = std::randomize() with {\n" + " // comment\n" + " a == e;\n" + " if (x) {a;}\n" // TODO(fangism): consider expanding + " };\n" + "endfunction\n", + }, + + // module declaration test cases + {" module foo ; endmodule\n", + "module foo;\n" + "endmodule\n"}, + {" module foo ( ) ; endmodule\n", + "module foo ();\n" + "endmodule\n"}, + {" module foo ( .x ( x) ); endmodule\n", + "module foo (\n" + " .x(x)\n" + ");\n" + "endmodule\n"}, + {" module foo ( .x ( x) \n,\n . y " + " ( \ny) ); endmodule\n", + "module foo (\n" + " .x(x),\n" + " .y(y)\n" + ");\n" + "endmodule\n"}, + + // module instantiation test cases + {" module foo ; bar bq();endmodule\n", + "module foo;\n" + " bar bq ();\n" // single instance + "endmodule\n"}, + {" module foo ; bar bq(), bq2( );endmodule\n", + "module foo;\n" + " bar bq (), bq2 ();\n" // multiple instances, still fitting on one line + "endmodule\n"}, + {"module foo; bar #(.N(N)) bq (.bus(bus));endmodule\n", + // instance parameter and port fits on line + "module foo;\n" + " bar #(.N(N)) bq (.bus(bus));\n" + "endmodule\n"}, + {"module foo; bar #(.N(N),.M(M)) bq ();endmodule\n", // two named params + "module foo;\n" + " bar #(\n" + " .N(N),\n" + " .M(M)\n" + " ) bq ();\n" + "endmodule\n"}, + {"module foo; bar #(//comment\n.N(N),.M(M)) bq ();endmodule\n", + "module foo;\n" + " bar #( //comment\n" // EOL comment before first param + " .N(N),\n" + " .M(M)\n" + " ) bq ();\n" + "endmodule\n"}, + {"module foo; bar #(.N(N),//comment\n.M(M)) bq ();endmodule\n", + "module foo;\n" + " bar #(\n" + " .N(N), //comment\n" // EOL comment after first param + " .M(M)\n" + " ) bq ();\n" + "endmodule\n"}, + {"module foo; bar #(.N(N),.M(M)//comment\n) bq ();endmodule\n", + "module foo;\n" + " bar #(\n" + " .N(N),\n" + " .M(M) //comment\n" // EOL comment after last param + " ) bq ();\n" + "endmodule\n"}, + {" module foo ; bar bq(aa,bb,cc);endmodule\n", + "module foo;\n" + " bar bq (\n" + " aa,\n" + " bb,\n" + " cc\n" + " );\n" // multiple positional ports, one per line + "endmodule\n"}, + {" module foo ; bar bq(aa,\n" + "`ifdef BB\n" + "bb,\n" + "`endif\n" + "cc);endmodule\n", + "module foo;\n" + " bar bq (\n" + " aa,\n" + "`ifdef BB\n" + " bb,\n" // keep same indentation as outside conditional + "`endif\n" + " cc\n" + " );\n" // multiple positional ports, one per line + "endmodule\n"}, + {" module foo ; bar bq(.aa,.bb);endmodule\n", + "module foo;\n" + " bar bq (\n" + " .aa,\n" + " .bb\n" + " );\n" // multiple named ports, one per line + "endmodule\n"}, + {" module foo ; bar bq(.aa(aa),.bb(bb));endmodule\n", + "module foo;\n" + " bar bq (\n" + " .aa(aa),\n" + " .bb(bb)\n" + " );\n" // multiple named ports, one per line + "endmodule\n"}, + {" module foo ; bar bq(.aa(aa),\n" + "`ifdef ZZ\n" + ".zz( zz ),\n" + "`else\n" + ".yy( yy ),\n" + "`endif\n" + ".bb(bb)\n" + ");endmodule\n", + "module foo;\n" + " bar bq (\n" + " .aa(aa),\n" + "`ifdef ZZ\n" + " .zz(zz),\n" + "`else\n" + " .yy(yy),\n" + "`endif\n" + " .bb(bb)\n" + " );\n" // multiple named ports, one per line + "endmodule\n"}, + {" module foo ; bar#(NNNNNNNN)" + "bq(.aa(aaaaaa),.bb(bbbbbb));endmodule\n", + "module foo;\n" + " bar #(NNNNNNNN) bq (\n" + " .aa(aaaaaa),\n" + " .bb(bbbbbb)\n" + " );\n" + "endmodule\n"}, + {" module foo ; barrrrrrr " + "bq(.aaaaaa(aaaaaa),.bbbbbb(bbbbbb));endmodule\n", + "module foo;\n" + " barrrrrrr bq (\n" + " .aaaaaa(aaaaaa),\n" + " .bbbbbb(bbbbbb)\n" + " );\n" + "endmodule\n"}, + {"module foo; bar #(.NNNNN(NNNNN)) bq (.bussss(bussss));endmodule\n", + // instance parameter and port does not fit on line + "module foo;\n" + " bar #(\n" + " .NNNNN(NNNNN)\n" + " ) bq (\n" + " .bussss(bussss)\n" + " );\n" + "endmodule\n"}, + {"module foo; bar #(//\n.N(N)) bq (.bus(bus));endmodule\n", + "module foo;\n" + " bar #( //\n" // would fit on one line, but forced to expand by // + " .N(N)\n" + " ) bq (\n" + " .bus(bus)\n" + " );\n" + "endmodule\n"}, + {"module foo; bar #(\n" + "`ifdef MM\n" + ".M(M)\n" + "`else\n" + ".N(N)\n" + "`endif\n" + ") bq (.bus(bus));endmodule\n", + "module foo;\n" + " bar #(\n" + "`ifdef MM\n" + " .M(M)\n" + "`else\n" + " .N(N)\n" + "`endif\n" + " ) bq (\n" + " .bus(bus)\n" + " );\n" + "endmodule\n"}, + {"module foo; bar #(.N(N)//\n) bq (.bus(bus));endmodule\n", + "module foo;\n" + " bar #(\n" // would fit on one line, but forced to expand by // + " .N(N) //\n" + " ) bq (\n" + " .bus(bus)\n" + " );\n" + "endmodule\n"}, + {"module foo; bar #(.N(N)) bq (//\n.bus(bus));endmodule\n", + "module foo;\n" + " bar #(\n" // would fit on one line, but forced to expand by // + " .N(N)\n" + " ) bq ( //\n" + " .bus(bus)\n" + " );\n" + "endmodule\n"}, + {"module foo; bar #(.N(N)) bq (.bus(bus)//\n);endmodule\n", + "module foo;\n" + " bar #(\n" // would fit on one line, but forced to expand by // + " .N(N)\n" + " ) bq (\n" + " .bus(bus) //\n" + " );\n" + "endmodule\n"}, + {" module foo ; bar " + "bq(.aaa(aaa),.bbb(bbb),.ccc(ccc),.ddd(ddd));endmodule\n", + "module foo;\n" + " bar bq (\n" + " .aaa(aaa),\n" // ports don't fit on one line, so expanded + " .bbb(bbb),\n" + " .ccc(ccc),\n" + " .ddd(ddd)\n" + " );\n" + "endmodule\n"}, + {" module foo ; bar " + "bq(.aa(aa),.bb(bb),.cc(cc),.dd(dd));endmodule\n", + "module foo;\n" + " bar bq (\n" + " .aa(aa),\n" // one named port per line + " .bb(bb),\n" + " .cc(cc),\n" + " .dd(dd)\n" + " );\n" + "endmodule\n"}, + {" module foo ; bar " + "bq(.aa(aa),//\n.bb(bb),.cc(cc),.dd(dd));endmodule\n", + "module foo;\n" + " bar bq (\n" + " .aa(aa), //\n" // forced to expand by // + " .bb(bb),\n" + " .cc(cc),\n" + " .dd(dd)\n" + " );\n" + "endmodule\n"}, + {" module foo ; bar " + "bq(.aa(aa),.bb(bb),.cc(cc),.dd(dd)//\n);endmodule\n", + "module foo;\n" + " bar bq (\n" + " .aa(aa),\n" + " .bb(bb),\n" + " .cc(cc),\n" + " .dd(dd) //\n" // forced to expand by // + " );\n" + "endmodule\n"}, + {// gate instantiation test + "module m;" + "and\tx0(a, \t\tb,c);" + "or\nx1(a, \n b, d);" + "endmodule\n", + "module m;\n" + " and x0 (a, b, c);\n" + " or x1 (a, b, d);\n" + "endmodule\n"}, + {// ifdef inside port actuals + "module m; foo bar (\n" + "`ifdef BAZ\n" + "`endif\n" + ") ;endmodule\n", + "module m;\n" + " foo bar (\n" + "`ifdef BAZ\n" + "`endif\n" + " );\n" + "endmodule\n"}, + {// ifdef inside port actuals after a port connection + "module m; foo bar ( .a (a) ,\n" + "`ifdef BAZ\n" + "`endif\n" + ") ;endmodule\n", + "module m;\n" + " foo bar (\n" + " .a(a),\n" + "`ifdef BAZ\n" + "`endif\n" + " );\n" + "endmodule\n"}, + {// ifdef inside port actuals before a port connection + "module m; foo bar (\n" + "`ifdef BAZ\n" + "`endif\n" + ". b(b) ) ;endmodule\n", + "module m;\n" + " foo bar (\n" + "`ifdef BAZ\n" + "`endif\n" + " .b(b)\n" + " );\n" + "endmodule\n"}, + {// ifdef-conditional port connection + "module m; foo bar (\n" + "`ifdef BAZ\n" + ". c (\tc) \n" + "`endif\n" + " ) ;endmodule\n", + "module m;\n" + " foo bar (\n" + "`ifdef BAZ\n" + " .c(c)\n" + "`endif\n" + " );\n" + "endmodule\n"}, + {// ifndef-else-conditional port connection + "module m; foo bar (\n" + "`ifndef BAZ\n" + ". c (\tc) \n" + " `else\n" + " . d(d\t)\n" + " `endif\n" + " ) ;endmodule\n", + "module m;\n" + " foo bar (\n" + "`ifndef BAZ\n" + " .c(c)\n" + "`else\n" + " .d(d)\n" + "`endif\n" + " );\n" + "endmodule\n"}, + + {// comment following a delay in next line + "module t;\n" + "reg x;\n" + "initial begin\n" + "#20\n" + "//comment\n" + "x = 1;\n" + "x = 2;\n" + "end\n" + "endmodule\n", + "module t;\n" + " reg x;\n" + " initial begin\n" + " #20\n" + " //comment\n" + " x = 1;\n" + " x = 2;\n" + " end\n" + "endmodule\n"}, + {// comment following a delay in the same line + "module t;\n" + "reg x;\n" + "initial begin\n" + "#20 //comment\n" + "x = 1;\n" + "x = 2;\n" + "end\n" + "endmodule\n", + "module t;\n" + " reg x;\n" + " initial begin\n" + " #20 //comment\n" + " x = 1;\n" + " x = 2;\n" + " end\n" + "endmodule\n"}, + // Macro calls inside [...] + {"module foo;\nlogic [`BAR(1)\n+2] foo;\nendmodule", + "module foo;\n" + " logic [`BAR(1)\n" + "+2] foo;\n" + "endmodule\n"}, + {"module foo;\nlogic [`BAR(1)+2] foo;\nendmodule", + "module foo;\n" + " logic [`BAR(1)+2] foo;\n" + "endmodule\n"}, + {"module foo ();\n function bar();\n " + "logic [12:34] data[`AAAAAAAAAAAAAAAAAAAAAAAA(1) : " + "`BBBBBBBBBBBBBBBBBBBBBBBB(2) + 3];\n " + "endfunction\nendmodule", + "module foo ();\n" + " function bar();\n" + " logic [12:34] data[\n" + " `AAAAAAAAAAAAAAAAAAAAAAAA(1) :\n" + " `BBBBBBBBBBBBBBBBBBBBBBBB(2) + 3];\n" + " endfunction\n" + "endmodule\n"}, + { + // test that alternate top-syntax mode works + "// verilog_syntax: parse-as-module-body\n" + "`define FOO\n", + "// verilog_syntax: parse-as-module-body\n" + "`define FOO\n", + }, + { + // test alternate parsing mode in macro expansion + "class foo;\n" + "`MY_MACRO(\n" + " // verilog_syntax: parse-as-statements\n" + " // EOL comment\n" + " int count;\n" + " if(cfg.enable) begin\n" + " count = 1;\n" + " end,\n" + " utils_pkg::decrement())\n" + "endclass\n", + "class foo;\n" + " `MY_MACRO(\n" + " // verilog_syntax: parse-as-statements\n" + " // EOL comment\n" + " int count;\n" + " if (cfg.enable) begin\n" + " count = 1;\n" + " end, utils_pkg::decrement())\n" + "endclass\n", + }, + + // tests top-level data declarations + {"a;", // implicit type + "a;\n"}, + {"a\tb;", // explicit type + "a b;\n"}, + {"a;b;", + "a;\n" + "b;\n"}, + {"a ,b;", // implicit type + "a, b;\n"}, + /* TODO(b/149591599): implicit type data declarations in module body + {"module\tm ;a ;endmodule", + "module m;\n" + " a;\n" + "endmodule\n"}, + */ + {"package\tp ;a ;endpackage", // implicit type + "package p;\n" + " a;\n" + "endpackage\n"}, + {"package\tp ;a ,b ;endpackage", // implicit type + "package p;\n" + " a, b;\n" + "endpackage\n"}, + {"package\tp ;a ;b ;endpackage", // implicit type + "package p;\n" + " a;\n" + " b;\n" + "endpackage\n"}, + /* TODO(b/149591627) : implicit type data declarations in class body + {"class\tc ;a ;endclass", + "class c;\n" + " a;\n" + "endclass\n"}, + */ + {"function\tf ;a ;endfunction", // implicit type + "function f;\n" + " a;\n" + "endfunction\n"}, + {"function\tf ;a ;x ;endfunction", // implicit type + "function f;\n" + " a;\n" + " x;\n" + "endfunction\n"}, + /* TODO(b/149592527): multi-variable data declaration as block_item_decl + // same inside tasks + {"function\tf ;a \t,x ;endfunction", // implicit type + "function f;\n" + " a, x;\n" + "endfunction\n"}, + */ + {"task\tt ;a ;endtask", // implicit type + "task t;\n" + " a;\n" + "endtask\n"}, + {"task\tt ;a ;x ;endtask", // implicit type + "task t;\n" + " a;\n" + " x;\n" + "endtask\n"}, + + {// tests bind declaration + "bind foo bar baz ( . clk ( clk ) ) ;", + "bind foo bar baz (.clk(clk));\n"}, + {// tests bind declaration, with type params + "bind foo bar# ( . W ( W ) ) baz ( . clk ( clk ) ) ;", + "bind foo bar #(.W(W)) baz (.clk(clk));\n"}, + {// tests bind declarations + "bind foo bar baz ( ) ;" + "bind goo car caz ( );", + "bind foo bar baz ();\n" + "bind goo car caz ();\n"}, + + {"bind blah foo #( .MaxCount(MaxCount), .MaxDelta(MaxDelta)) bar (" + " .clk(clk), .rst(rst), .value(value) );", + "bind blah foo #(\n" + " .MaxCount(MaxCount),\n" + " .MaxDelta(MaxDelta)\n" + ") bar (\n" + " .clk (clk),\n" + " .rst (rst),\n" + " .value(value)\n" + ");\n"}, + {"bind foo bar baz(\\\n" + "`undef d\\\n" + "`undef d);", + "bind foo bar baz (\\\n" + " `undef d\\\n" + " `undef d\n" + ");\n"}, + { + "bind expaaaaaaaaaaand_meeee looooooooong_name# (" + ".W(W_CONST), .H(H_CONST), .D(D_CONST) )" + "instaaance_name (.in(iiiiiiiin), .out(ooooooout), .clk(ccccccclk));", + "bind expaaaaaaaaaaand_meeee\n" + " looooooooong_name #(\n" + " .W(W_CONST),\n" + " .H(H_CONST),\n" + " .D(D_CONST)\n" + ") instaaance_name (\n" + " .in (iiiiiiiin),\n" + " .out(ooooooout),\n" + " .clk(ccccccclk)\n" + ");\n", + }, + + { + "bind expand_inst name# (" + ".W(W_CONST), .H(H_CONST), .D(D_CONST) )" + "instaaance_name (.in(iiiiiiiin), .out(ooooooout), .clk(ccccccclk));", + "bind expand_inst name #(\n" + " .W(W_CONST),\n" + " .H(H_CONST),\n" + " .D(D_CONST)\n" + ") instaaance_name (\n" + " .in (iiiiiiiin),\n" + " .out(ooooooout),\n" + " .clk(ccccccclk)\n" + ");\n", + }, + + { + // tests import declaration + "import foo_pkg :: bar ;", + "import foo_pkg::bar;\n", + }, + { + // tests import declaration with wildcard + "import foo_pkg :: * ;", + "import foo_pkg::*;\n", + }, + { + // tests import declarations + "import foo_pkg :: *\t;" + "import goo_pkg\n:: thing ;", + "import foo_pkg::*;\n" + "import goo_pkg::thing;\n", + }, + // preserve spaces inside [] dimensions, but limit spaces around ':' to one + // and adjust everything else + {"foo[W-1:0]a[0:K-1];", // data declaration + "foo [W-1:0] a[0:K-1];\n"}, + {"foo[W-1 : 0]a[0 : K-1];", "foo [W-1 : 0] a[0 : K-1];\n"}, + {"foo[W - 1 : 0 ]a [ 0 : K - 1] ;", + "foo [W - 1 : 0] a[0 : K - 1];\n"}, + // remove spaces between [...] [...] in multi-dimension arrays + {"foo[K] [W]a;", // + "foo [K][W] a;\n"}, + {"foo b [K] [W] ;", // + "foo b[K][W];\n"}, + {"logic[K:1] [W:1]a;", // + "logic [K:1][W:1] a;\n"}, + {"logic b [K:1] [W:1] ;", // + "logic b[K:1][W:1];\n"}, + // spaces in bit slicing + { + // preserve 0 spaces + "always_ff @(posedge clk) begin " + "dummy <=\tfoo [ 7:2 ] ; " + "end", + "always_ff @(posedge clk) begin\n" + " dummy <= foo[7:2];\n" + "end\n", + }, + { + // preserve 1 space + "always_ff @(posedge clk) begin " + "dummy <=\tfoo [ 7 : 2 ] ; " + "end", + "always_ff @(posedge clk) begin\n" + " dummy <= foo[7 : 2];\n" + "end\n", + }, + { + // limit multiple spaces to 1 + "always_ff @(posedge clk) begin " + "dummy <=\tfoo [ 7 : 2 ] ; " + "end", + "always_ff @(posedge clk) begin\n" + " dummy <= foo[7 : 2];\n" + "end\n", + }, + { + "always_ff @(posedge clk) begin " + "dummy <=\tfoo [ 7 : 2 ] ; " + "end", + "always_ff @(posedge clk) begin\n" + " dummy <= foo[7 : 2];\n" + "end\n", + }, + { + // keep value on the left when symmetrizing + "always_ff @(posedge clk) begin " + "dummy <=\tfoo [ 7: 2 ] ; " + "end", + "always_ff @(posedge clk) begin\n" + " dummy <= foo[7:2];\n" + "end\n", + }, + { + "always_ff @(posedge clk) begin " + "dummy <=\tfoo [ 7: 2 ] ; " + "end", + "always_ff @(posedge clk) begin\n" + " dummy <= foo[7:2];\n" + "end\n", + }, + { + "always_ff @(posedge clk) begin " + "dummy <=\tfoo [ 7 :2 ] ; " + "end", + "always_ff @(posedge clk) begin\n" + " dummy <= foo[7 : 2];\n" + "end\n", + }, + { + "always_ff @(posedge clk) begin " + "dummy <=\tfoo [ 7 : 2 ] ; " + "end", + "always_ff @(posedge clk) begin\n" + " dummy <= foo[7 : 2];\n" + "end\n", + }, + { + // use value on the left, but limit to 1 space + "always_ff @(posedge clk) begin " + "dummy <=\tfoo [ 7 :2 ] ; " + "end", + "always_ff @(posedge clk) begin\n" + " dummy <= foo[7 : 2];\n" + "end\n", + }, + + // task test cases + {"task t ;endtask:t", // + "task t;\n" + "endtask : t\n"}, + {"task t ;# 10 ;# 5ns ; # 0.1 ; # 1step ;endtask", + "task t;\n" + " #10;\n" // no space in delay expression + " #5ns;\n" + " #0.1;\n" + " #1step;\n" + "endtask\n"}, + {"task t\n;a<=b ;c<=d ;endtask\n", + "task t;\n" + " a <= b;\n" + " c <= d;\n" + "endtask\n"}, + {"class c; virtual protected task\tt ( foo bar);" + "a.a<=b.b;\t\tc.c\n<= d.d; endtask endclass", + "class c;\n" + " virtual protected task t(foo bar);\n" + " a.a <= b.b;\n" + " c.c <= d.d;\n" + " endtask\n" + "endclass\n"}, + {"task t;\n// statement comment\nendtask\n", + "task t;\n" + " // statement comment\n" // indented + "endtask\n"}, + {"task t( );\n// statement comment\nendtask\n", + "task t();\n" + " // statement comment\n" // indented + "endtask\n"}, + {"task t( input x );\n" + "// statement comment\n" + "s();\n" + "// statement comment\n" + "endtask\n", + "task t(input x);\n" + " // statement comment\n" // indented + " s();\n" + " // statement comment\n" // indented + "endtask\n"}, + {"task fj;fork join fork join\tendtask", + "task fj;\n" + " fork\n" + " join\n" + " fork\n" + " join\n" + "endtask\n"}, + {"task fj;fork join_any fork join_any\tendtask", + "task fj;\n" + " fork\n" + " join_any\n" + " fork\n" + " join_any\n" + "endtask\n"}, + {"task fj;fork join_none fork join_none\tendtask", + "task fj;\n" + " fork\n" + " join_none\n" + " fork\n" + " join_none\n" + "endtask\n"}, + {"task fj;fork\n" + "//c1\njoin\n" + "//c2\n" + "fork \n" + "//c3\n" + "join\tendtask", + "task fj;\n" + " fork\n" + " //c1\n" + " join\n" + " //c2\n" + " fork\n" + " //c3\n" + " join\n" + "endtask\n"}, + {"task fj;\n" + "fork " + "begin " + "end " + "foo();" + "begin " + "end " + "join_any endtask", + "task fj;\n" + " fork\n" + " begin\n" + " end\n" + " foo();\n" + " begin\n" + " end\n" + " join_any\n" + "endtask\n"}, + { + // call and assertion statements + "task t ;Fire() ;assert ( x);assert(y );endtask", + "task t;\n" + " Fire();\n" + " assert (x);\n" + " assert (y);\n" + "endtask\n", + }, + { + // assertion statements with body clause + "task t ;Fire() ;assert ( x) fee ( );assert(y ) foo ( ) ;endtask", + "task t;\n" + " Fire();\n" + " assert (x) fee();\n" + " assert (y) foo();\n" + "endtask\n", + }, + { + // assertion statements with else clause + "task t ;Fire() ;assert ( x) else fee ( );" + "assert(y ) else foo ( ) ;endtask", + "task t;\n" + " Fire();\n" + " assert (x)\n" + " else fee();\n" + " assert (y)\n" + " else foo();\n" + "endtask\n", + }, + { + // assertion statements with else clause + "task t ;Fire() ;assert ( x) fa(); else fee ( );" + "assert(y ) fi(); else foo ( ) ;endtask", + "task t;\n" + " Fire();\n" + " assert (x) fa();\n" + " else fee();\n" + " assert (y) fi();\n" + " else foo();\n" + "endtask\n", + }, + { + // assume statements + "task t ;Fire() ;assume ( x);assume(y );endtask", + "task t;\n" + " Fire();\n" + " assume (x);\n" + " assume (y);\n" + "endtask\n", + }, + { + // cover statements + "task t ;Fire() ;cover ( x);cover(y );endtask", + "task t;\n" + " Fire();\n" + " cover (x);\n" + " cover (y);\n" + "endtask\n", + }, + { + // cover statements, with action + "task t ;Fire() ;cover ( x)g( );cover(y ) h();endtask", + "task t;\n" + " Fire();\n" + " cover (x) g();\n" + " cover (y) h();\n" + "endtask\n", + }, + { + // cover statements, with action block + "task t ;Fire() ;cover ( x) begin g( ); end " + "cover(y ) begin h(); end endtask", + "task t;\n" + " Fire();\n" + " cover (x) begin\n" + " g();\n" + " end\n" + " cover (y) begin\n" + " h();\n" + " end\n" + "endtask\n", + }, + {// shuffle calls + "task t; foo. shuffle ( );bar .shuffle( ); endtask", + "task t;\n" + " foo.shuffle();\n" + " bar.shuffle();\n" + "endtask\n"}, + {// wait statements (null) + "task t; wait (a==b);wait(c<d); endtask", + "task t;\n" + " wait (a == b);\n" + " wait (c < d);\n" + "endtask\n"}, + {// wait statements, single action statement + "task t; wait (a==b) p();wait(c<d) q(); endtask", + "task t;\n" + " wait (a == b) p();\n" + " wait (c < d) q();\n" + "endtask\n"}, + {// wait statements, block action statement + "task t; wait (a==b) begin p(); end " + "wait(c<d) begin q(); end endtask", + "task t;\n" + " wait (a == b) begin\n" + " p();\n" + " end\n" + " wait (c < d) begin\n" + " q();\n" + " end\n" + "endtask\n"}, + {// wait fork statements + "task t ; wait\tfork;wait fork ;endtask", + "task t;\n" + " wait fork;\n" + " wait fork;\n" + "endtask\n"}, + {// labeled single statements (prefix-style) + "task t;l1:x<=y ;endtask", + "task t;\n" + " l1 : x <= y;\n" + "endtask\n"}, + {// labeled block statements (prefix-style) + "task t;l1:begin end:l1 endtask", + "task t;\n" + " l1 : begin\n" + " end : l1\n" + "endtask\n"}, + {// labeled seq block statements + "task t;begin:l1 end:l1 endtask", + "task t;\n" + " begin : l1\n" + " end : l1\n" + "endtask\n"}, + {// labeled par block statements + "task t;fork:l1 join:l1 endtask", + "task t;\n" + " fork : l1\n" + " join : l1\n" + "endtask\n"}, + {// task with disable statements + "task t ;fork\tjoin\tdisable\tfork;endtask", + "task t;\n" + " fork\n" + " join\n" + " disable fork;\n" + "endtask\n"}, + {"task t ;fork\tjoin_any\tdisable\tfork ;endtask", + "task t;\n" + " fork\n" + " join_any\n" + " disable fork;\n" + "endtask\n"}, + {"task t ;disable\tbean_counter ;endtask", + "task t;\n" + " disable bean_counter;\n" + "endtask\n"}, + { + // task with if-statement + "task t;" + "if (r == t)" + "a.b(c);" + "endtask", + "task t;\n" + " if (r == t) a.b(c);\n" + "endtask\n", + }, + { + // task with system call inside if header + "task t;" + "if (!$cast(ssssssssssssssss,vvvvvvvvvv,gggggggg))begin end endtask:t", + "task t;\n" + " if (!$cast(\n" + " ssssssssssssssss,\n" + " vvvvvvvvvv,\n" + " gggggggg\n" + " )) begin\n" + " end\n" + "endtask : t\n", + }, + { + // task with nested subtask call and arguments passed by name + "task t;" + "if (!$cast(ssssssssssssssss, vvvvvvvvvv.gggggggg(" + ".ppppppp(ppppppp)," + ".yyyyy(\"xxxxxxxxxxxxx\")" + "))) begin " + "end " + "endtask : t", + "task t;\n" + " if (!$cast(\n" + " ssssssssssssssss,\n" + " vvvvvvvvvv.gggggggg(\n" + " .ppppppp(ppppppp),\n" + " .yyyyy(\"xxxxxxxxxxxxx\")\n" + " )\n" + " )) begin\n" + " end\n" + "endtask : t\n", + }, + + { + // assert property statements + "task t ;assert property( x);assert\tproperty(y );endtask", + "task t;\n" + " assert property (x);\n" + " assert property (y);\n" + "endtask\n", + }, + { + // assert property statements, with action + "task t ;assert property( x) j();assert\tproperty(y )k( );endtask", + "task t;\n" + " assert property (x) j();\n" + " assert property (y) k();\n" + "endtask\n", + }, + { + // assert property statements, with action block + "task t ;assert property( x) begin j();end " + " assert\tproperty(y )begin\tk( ); end endtask", + "task t;\n" + " assert property (x) begin\n" + " j();\n" + " end\n" + " assert property (y) begin\n" + " k();\n" + " end\n" + "endtask\n", + }, + { + // assert property statements, else with null + "task t ;assert property( x) else;assert\tproperty(y )else;endtask", + "task t;\n" + " assert property (x)\n" + " else;\n" + " assert property (y)\n" + " else;\n" + "endtask\n", + }, + { + // assert property statements, else with actions + "task t ;assert property( x) f(); else p(); " + "\tassert\tproperty(y ) g();else q( );endtask", + "task t;\n" + " assert property (x) f();\n" + " else p();\n" + " assert property (y) g();\n" + " else q();\n" + "endtask\n", + }, + { + // assert property statement, with action block, else statement + "task t ;assert property( x) begin j();end else\tk( ); endtask", + "task t;\n" + " assert property (x) begin\n" + " j();\n" + " end else k();\n" + "endtask\n", + }, + { + // assert property statement, with action statement, else block + "task t ;assert property( x) j(); else begin\tk( );end endtask", + "task t;\n" + " assert property (x) j();\n" + " else begin\n" + " k();\n" + " end\n" + "endtask\n", + }, + { + // assert property statement, with action block, else block + "task t ;assert property( x)begin j();end " + "else begin\tk( );end endtask", + "task t;\n" + " assert property (x) begin\n" + " j();\n" + " end else begin\n" + " k();\n" + " end\n" + "endtask\n", + }, + + { + // assume property statements + "task t ;assume property( x);assume\tproperty(y );endtask", + "task t;\n" + " assume property (x);\n" + " assume property (y);\n" + "endtask\n", + }, + { + // assume property statements, with action + "task t ;assume property( x) j();assume\tproperty(y )k( );endtask", + "task t;\n" + " assume property (x) j();\n" + " assume property (y) k();\n" + "endtask\n", + }, + { + // assume property statements, with action block + "task t ;assume property( x) begin j();end " + " assume\tproperty(y )begin\tk( ); end endtask", + "task t;\n" + " assume property (x) begin\n" + " j();\n" + " end\n" + " assume property (y) begin\n" + " k();\n" + " end\n" + "endtask\n", + }, + { + // assume property statements, else with null + "task t ;assume property( x) else;assume\tproperty(y )else;endtask", + "task t;\n" + " assume property (x)\n" + " else;\n" + " assume property (y)\n" + " else;\n" + "endtask\n", + }, + { + // assume property statements, else with actions + "task t ;assume property( x) f(); else p(); " + "\tassume\tproperty(y ) g();else q( );endtask", + "task t;\n" + " assume property (x) f();\n" + " else p();\n" + " assume property (y) g();\n" + " else q();\n" + "endtask\n", + }, + { + // assume property statement, with action block, else statement + "task t ;assume property( x) begin j();end else\tk( ); endtask", + "task t;\n" + " assume property (x) begin\n" + " j();\n" + " end else k();\n" + "endtask\n", + }, + { + // assume property statement, with action statement, else block + "task t ;assume property( x) j(); else begin\tk( );end endtask", + "task t;\n" + " assume property (x) j();\n" + " else begin\n" + " k();\n" + " end\n" + "endtask\n", + }, + { + // assume property statement, with action block, else block + "task t ;assume property( x)begin j();end " + "else begin\tk( );end endtask", + "task t;\n" + " assume property (x) begin\n" + " j();\n" + " end else begin\n" + " k();\n" + " end\n" + "endtask\n", + }, + + { + // expect property statements + "task t ;expect ( x);expect\t(y );endtask", + "task t;\n" + " expect (x);\n" + " expect (y);\n" + "endtask\n", + }, + { + // expect property statements, with action + "task t ;expect ( x) j();expect\t(y )k( );endtask", + "task t;\n" + " expect (x) j();\n" + " expect (y) k();\n" + "endtask\n", + }, + { + // expect property statements, with action block + "task t ;expect ( x) begin j();end " + " expect\t(y )begin\tk( ); end endtask", + "task t;\n" + " expect (x) begin\n" + " j();\n" + " end\n" + " expect (y) begin\n" + " k();\n" + " end\n" + "endtask\n", + }, + { + // expect property statements, else with null + "task t ;expect ( x) else;expect\t(y )else;endtask", + "task t;\n" + " expect (x)\n" + " else;\n" + " expect (y)\n" + " else;\n" + "endtask\n", + }, + { + // expect property statements, else with actions + "task t ;expect ( x) f(); else p(); " + "\texpect\t(y ) g();else q( );endtask", + "task t;\n" + " expect (x) f();\n" + " else p();\n" + " expect (y) g();\n" + " else q();\n" + "endtask\n", + }, + { + // expect property statement, with action block, else statement + "task t ;expect ( x) begin j();end else\tk( ); endtask", + "task t;\n" + " expect (x) begin\n" + " j();\n" + " end else k();\n" + "endtask\n", + }, + { + // expect property statement, with action statement, else block + "task t ;expect ( x) j(); else begin\tk( );end endtask", + "task t;\n" + " expect (x) j();\n" + " else begin\n" + " k();\n" + " end\n" + "endtask\n", + }, + { + // expect property statement, with action block, else block + "task t ;expect ( x)begin j();end " + "else begin\tk( );end endtask", + "task t;\n" + " expect (x) begin\n" + " j();\n" + " end else begin\n" + " k();\n" + " end\n" + "endtask\n", + }, + + { + // cover property statements + "task t ;cover property( x);cover\tproperty(y );endtask", + "task t;\n" + " cover property (x);\n" + " cover property (y);\n" + "endtask\n", + }, + { + // cover property statements, with action + "task t ;cover property( x) j();cover\tproperty(y )k( );endtask", + "task t;\n" + " cover property (x) j();\n" + " cover property (y) k();\n" + "endtask\n", + }, + { + // cover property statements, with action block + "task t ;cover property( x) begin j();end " + " cover\tproperty(y )begin\tk( ); end endtask", + "task t;\n" + " cover property (x) begin\n" + " j();\n" + " end\n" + " cover property (y) begin\n" + " k();\n" + " end\n" + "endtask\n", + }, + + { + // cover sequence statements + "task t ;cover sequence( x);cover\tsequence(y );endtask", + "task t;\n" + " cover sequence (x);\n" + " cover sequence (y);\n" + "endtask\n", + }, + { + // cover sequence statements, with action + "task t ;cover sequence( x) j();cover\tsequence(y )k( );endtask", + "task t;\n" + " cover sequence (x) j();\n" + " cover sequence (y) k();\n" + "endtask\n", + }, + { + // cover sequence statements, with action block + "task t ;cover sequence( x) begin j();end " + " cover\tsequence(y )begin\tk( ); end endtask", + "task t;\n" + " cover sequence (x) begin\n" + " j();\n" + " end\n" + " cover sequence (y) begin\n" + " k();\n" + " end\n" + "endtask\n", + }, + + {// module with disable statements + "module m;always begin :block disable m.block; end endmodule", + "module m;\n" + " always begin : block\n" + " disable m.block;\n" + " end\n" + "endmodule\n"}, + {"module m;always begin disable m.block; end endmodule", + "module m;\n" + " always begin\n" + " disable m.block;\n" + " end\n" + "endmodule\n"}, + + // property test cases + {"module mp ;property p1 ; a|->b;endproperty endmodule", + "module mp;\n" + " property p1;\n" + " a |-> b;\n" + " endproperty\n" + "endmodule\n"}, + {"module mp ;property p1 ; a|->b;endproperty:p1 endmodule", + "module mp;\n" + " property p1;\n" + " a |-> b;\n" + " endproperty : p1\n" // with end label + "endmodule\n"}, + {"module mp ;property p1 ; a|->## 1 b;endproperty endmodule", + "module mp;\n" + " property p1;\n" + " a |-> ##1 b;\n" // with delay + " endproperty\n" + "endmodule\n"}, + {"module mp ;property p1 ; a|->## [0: 1] b;endproperty endmodule", + "module mp;\n" + " property p1;\n" + " a |-> ##[0:1] b;\n" // prefer no spaces with delay range + " endproperty\n" + "endmodule\n"}, + {"module mp ;property p1 ; a|->## [0 : 1] b;endproperty endmodule", + "module mp;\n" + " property p1;\n" + " a |-> ##[0 : 1] b;\n" // limit to one space, symmetrize + " endproperty\n" + "endmodule\n"}, + {"module mp ;property p1 ; a## 1 b;endproperty endmodule", + "module mp;\n" + " property p1;\n" + " a ##1 b;\n" + " endproperty\n" + "endmodule\n"}, + {"module mp ;property p1 ; (a^c)## 1 b;endproperty endmodule", + "module mp;\n" + " property p1;\n" + " (a ^ c) ##1 b;\n" + " endproperty\n" + "endmodule\n"}, + + // covergroup test cases + {// Minimal case + "covergroup c; endgroup\n", + "covergroup c;\n" + "endgroup\n"}, + {// Minimal useful case + "covergroup c @ (posedge clk); coverpoint a; endgroup\n", + "covergroup c @(posedge clk);\n" + " coverpoint a;\n" + "endgroup\n"}, + {// Multiple coverpoints + "covergroup foo @(posedge clk); coverpoint a; coverpoint b; " + "coverpoint c; coverpoint d; endgroup\n", + "covergroup foo @(posedge clk);\n" + " coverpoint a;\n" + " coverpoint b;\n" + " coverpoint c;\n" + " coverpoint d;\n" + "endgroup\n"}, + {// Multiple bins + "covergroup memory @ (posedge ce); address :coverpoint addr {" + "bins low={0,127}; bins high={128,255};} endgroup\n", + "covergroup memory @(posedge ce);\n" + " address: coverpoint addr {\n" + " bins low = {0, 127};\n" + " bins high = {128, 255};\n" + " }\n" + "endgroup\n"}, + {// Custom sample() function + "covergroup c with function sample(bit i); endgroup\n", + "covergroup c with function sample (\n" + " bit i\n" // test cases are wrapped at 40 + ");\n" + "endgroup\n"}, + +}; + +TEST(FormatterEndToEndTest, FunctionTaskFormatterTestCases) { + RunFormatterTestCases40(kFunctionTaskFormatterTestCases); +} + +} // namespace +} // namespace formatter +} // namespace verilog
diff --git a/verible/verilog/formatting/formatter_issue_regression_test.cc b/verible/verilog/formatting/formatter_issue_regression_test.cc new file mode 100644 index 0000000..8f1fcef --- /dev/null +++ b/verible/verilog/formatting/formatter_issue_regression_test.cc
@@ -0,0 +1,319 @@ +// Copyright 2017-2026 The Verible Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Test cases in this file should be *insensitive* to wrapping penalties. +// Penalty-sensitive tests belong in formatter-tuning_test.cc. + +#include <sstream> +#include <string_view> + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "verible/common/util/logging.h" +#include "verible/verilog/formatting/format-style.h" +#include "verible/verilog/formatting/formatter-test-utils.h" +#include "verible/verilog/formatting/formatter.h" + +namespace verilog { +namespace formatter { +namespace { + +// Regression for https://github.com/chipsalliance/verible/issues/2547: +// A localparam initialized to a sum of long macros must converge: infix `+` +// stays with the following operand so re-format does not oscillate between +// `+\n`MACRO` and `+ `MACRO`. +TEST(FormatterEndToEndTest, LongMacroSumLocalparamConverges) { + static constexpr FormatterTestCase kTestCases[] = { + {"module m;\n" + " localparam N =\n" + " `MACRO_GEN3_SCRAMBLE_LFSR_REGOUT\n" + " + `MACRO_GEN3_SCRAMBLE_REGIN\n" + " + `MACRO_GEN3_SCRAMBLE_REGOUT\n" + " ;\n" + "endmodule\n", + "module m;\n" + " localparam N =\n" + " `MACRO_GEN3_SCRAMBLE_LFSR_REGOUT\n" + " + `MACRO_GEN3_SCRAMBLE_REGIN\n" + " + `MACRO_GEN3_SCRAMBLE_REGOUT;\n" + "endmodule\n"}, + // Already in pass-1 form must stay stable. + {"module m;\n" + " localparam N =\n" + " `MACRO_GEN3_SCRAMBLE_LFSR_REGOUT\n" + " + `MACRO_GEN3_SCRAMBLE_REGIN\n" + " + `MACRO_GEN3_SCRAMBLE_REGOUT;\n" + "endmodule\n", + "module m;\n" + " localparam N =\n" + " `MACRO_GEN3_SCRAMBLE_LFSR_REGOUT\n" + " + `MACRO_GEN3_SCRAMBLE_REGIN\n" + " + `MACRO_GEN3_SCRAMBLE_REGOUT;\n" + "endmodule\n"}, + }; + FormatStyle style; // default column_limit (100) + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Regression for https://github.com/chipsalliance/verible/issues/2544: +// Wrapping a $bits(...)'(...) cast may leave `MACRO at EOL, reclassifying +// MacroIdentifier as MacroIdItem. FormatEquivalent must accept that, and +// formatting must still pass verification. +TEST(FormatterEndToEndTest, MacroBeforeCloseParenFormatEquivalent) { + static constexpr std::string_view kInput = + "module m;\n" + " assign result_value = $bits(result_value)'( " + "compare_bytes(input_data[DATA_WIDTH_INT-1:0], " + "input_datak[STROBE_WIDTH_INT-1:0], `TOKEN_BYTE) );\n" + "endmodule\n"; + FormatStyle style; + std::ostringstream stream; + const auto status = FormatVerilog(kInput, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_THAT(stream.str(), testing::HasSubstr("`TOKEN_BYTE")); +} + +// Regression for https://github.com/chipsalliance/verible/issues/2542: +// Continuation EOL comments after a wrapped assign must keep a stable column +// across re-format (convergence). +TEST(FormatterEndToEndTest, ContinuationCommentAfterWrappedAssignConverges) { + static constexpr FormatterTestCase kTestCases[] = { + {// Comments originally column-aligned after a wrapped assign + "module m;\n" + " assign status_ur = !(status_sc || status_ca ||\n" + " status_crs); // Completions with a Reserved Completion\n" + " // Status value are treated as UR\n" + "endmodule\n", + "module m;\n" + " assign status_ur =\n" + " !(status_sc || status_ca || status_crs); // Completions with a " + "Reserved Completion\n" + " // Status value are " + "treated as UR\n" + "endmodule\n"}, + {// Previously mis-aligned continuation is not treated as a continuation + // (column delta > 1) and must still converge + "module m;\n" + " assign status_ur = !(status_sc || status_ca ||\n" + " status_crs); // Completions with a Reserved Completion\n" + " " + "// Status value are treated as UR\n" + "endmodule\n", + "module m;\n" + " assign status_ur =\n" + " !(status_sc || status_ca || status_crs); // Completions with a " + "Reserved Completion\n" + " // Status value are treated as UR\n" + "endmodule\n"}, + }; + FormatStyle style; // default column_limit (100) + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Regression for https://github.com/chipsalliance/verible/issues/2540: +// Trailing EOL comment after `end` before `else if` must not change whether +// the else-if assignment stays on one line across re-format (convergence). +TEST(FormatterEndToEndTest, EndElseIfWithEOLCommentConverges) { + static constexpr FormatterTestCase kTestCases[] = { + {// Comment on its own line between end and else if + "module m;\n" + " always_comb begin\n" + " case (state)\n" + " STATE_A: begin\n" + " if (cond_aaaa) next_state_value = STATE_B;\n" + " else if (cond_bbbb) begin\n" + " next_state_value = STATE_B;\n" + " end\n" + " // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" + " else if (cond_cccc) next_state_value = STATE_C;\n" + " end\n" + " endcase\n" + " end\n" + "endmodule\n", + "module m;\n" + " always_comb begin\n" + " case (state)\n" + " STATE_A: begin\n" + " if (cond_aaaa) next_state_value = STATE_B;\n" + " else if (cond_bbbb) begin\n" + " next_state_value = STATE_B;\n" + " end // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" + " else if (cond_cccc) next_state_value = STATE_C;\n" + " end\n" + " endcase\n" + " end\n" + "endmodule\n"}, + {// Same construct with comment already on the end line + "module m;\n" + " always_comb begin\n" + " case (state)\n" + " STATE_A: begin\n" + " if (cond_aaaa) next_state_value = STATE_B;\n" + " else if (cond_bbbb) begin\n" + " next_state_value = STATE_B;\n" + " end // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" + " else if (cond_cccc) next_state_value = STATE_C;\n" + " end\n" + " endcase\n" + " end\n" + "endmodule\n", + "module m;\n" + " always_comb begin\n" + " case (state)\n" + " STATE_A: begin\n" + " if (cond_aaaa) next_state_value = STATE_B;\n" + " else if (cond_bbbb) begin\n" + " next_state_value = STATE_B;\n" + " end // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" + " else if (cond_cccc) next_state_value = STATE_C;\n" + " end\n" + " endcase\n" + " end\n" + "endmodule\n"}, + }; + FormatStyle style; // default column_limit (100) + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Regression for https://github.com/chipsalliance/verible/issues/2008 +// (also https://github.com/chipsalliance/verible/issues/2474 and +// https://github.com/chipsalliance/verible/issues/2063): +// Non-ANSI "input wire signed" used to abort in the tree-unwrapper because +// the CST visited "signed" before "wire", which is the reverse of source +// order. +TEST(FormatterEndToEndTest, NonAnsiWireSignedModulePortDoesNotAbort) { + static constexpr FormatterTestCase kTestCases[] = { + {// Original issue #2008 sample + "module uut( sig1 );\n" + "\n" + "input wire signed [15:0] sig1;\n" + "\n" + "endmodule\n", + "module uut (\n" + " sig1\n" + ");\n" + "\n" + " input wire signed [15:0] sig1;\n" + "\n" + "endmodule\n"}, + {// Issue #2474 sample + "module myModule (\n" + " myinput\n" + ");\n" + "input wire signed [7:0] myInput;\n" + "endmodule\n", + "module myModule (\n" + " myinput\n" + ");\n" + " input wire signed [7:0] myInput;\n" + "endmodule\n"}, + {// Issue #2063 sample: signed wire with no packed dimensions + "module top(a);\n" + " input wire signed a;\n" + "endmodule\n", + "module top (\n" + " a\n" + ");\n" + " input wire signed a;\n" + "endmodule\n"}, + {// Same production with logic instead of wire + "module uut(sig1);\n" + "input logic signed [15:0] sig1;\n" + "endmodule\n", + "module uut (\n" + " sig1\n" + ");\n" + " input logic signed [15:0] sig1;\n" + "endmodule\n"}, + {// output / inout net types + "module uut(sig1, sig2);\n" + "output wire signed [15:0] sig1;\n" + "inout wire signed [7:0] sig2;\n" + "endmodule\n", + "module uut (\n" + " sig1,\n" + " sig2\n" + ");\n" + " output wire signed [15:0] sig1;\n" + " inout wire signed [7:0] sig2;\n" + "endmodule\n"}, + {// unsigned is the same production + "module uut(sig1);\n" + "input wire unsigned [15:0] sig1;\n" + "endmodule\n", + "module uut (\n" + " sig1\n" + ");\n" + " input wire unsigned [15:0] sig1;\n" + "endmodule\n"}, + {// ANSI form already worked; keep as a regression + "module uut(input wire signed [15:0] sig1);\n" + "endmodule\n", + "module uut (\n" + " input wire signed [15:0] sig1\n" + ");\n" + "endmodule\n"}, + {// Non-ANSI without signed still works + "module uut(sig1);\n" + "input wire [15:0] sig1;\n" + "endmodule\n", + "module uut (\n" + " sig1\n" + ");\n" + " input wire [15:0] sig1;\n" + "endmodule\n"}, + {// Non-ANSI signed without net type still works + "module uut(sig1);\n" + "input signed [15:0] sig1;\n" + "endmodule\n", + "module uut (\n" + " sig1\n" + ");\n" + " input signed [15:0] sig1;\n" + "endmodule\n"}, + }; + FormatStyle style; // default column_limit (100) + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} +} // namespace +} // namespace formatter +} // namespace verilog
diff --git a/verible/verilog/formatting/formatter_macro_test.cc b/verible/verilog/formatting/formatter_macro_test.cc new file mode 100644 index 0000000..25f4b90 --- /dev/null +++ b/verible/verilog/formatting/formatter_macro_test.cc
@@ -0,0 +1,555 @@ +// Copyright 2017-2026 The Verible Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Test cases in this file should be *insensitive* to wrapping penalties. +// Penalty-sensitive tests belong in formatter-tuning_test.cc. + +#include "gtest/gtest.h" +#include "verible/verilog/formatting/formatter-test-utils.h" + +namespace verilog { +namespace formatter { +namespace { + +static constexpr FormatterTestCase kMacroFormatterTestCases[] = { + // preprocessor test cases + {"`include \"path/to/file.vh\"\n", "`include \"path/to/file.vh\"\n"}, + {"`include `\"path/to/file.vh`\"\n", "`include `\"path/to/file.vh`\"\n"}, + {"`define FOO\n", "`define FOO\n"}, + {"`define FOO BAR\n", "`define FOO BAR\n"}, + {"`define FOO\n" + "`define BAR\n", + "`define FOO\n" + "`define BAR\n"}, + {"`define FOO_``BAR 1\n", "`define FOO_``BAR 1\n"}, + {"`define FOO_```BAR 1\n", "`define FOO_```BAR 1\n"}, + {"`define FOO ``BAR\n", "`define FOO ``BAR\n"}, + {"`define A``B``C 2\n", "`define A``B``C 2\n"}, + {"`define A(x)``y\n", "`define A(x) ``y\n"}, + {"`define FOO_``BAR\n", "`define FOO_``BAR\n"}, + {"`ifndef FOO\n" + "`endif // FOO\n", + "`ifndef FOO\n" + "`endif // FOO\n"}, + {"`ifndef FOO\n" + "`define BAR\n" + "`endif\n", + "`ifndef FOO\n" + "`define BAR\n" + "`endif\n"}, + {"`ifndef FOO\n" + "`define BAR\n\n" // one more blank line + "`endif\n", + "`ifndef FOO\n" + "`define BAR\n\n" + "`endif\n"}, + {"`define FOO \\\n" + " BAR\n", + "`define FOO \\\n" // TODO(b/72527558): right align '\'s to column limit + " BAR\n"}, + {"`define FOOOOOOOOOOOOOOOO \\\n" + " BAAAAAAAAAAAAAAAAR BAAAAAAAAAAAAAZ;\n", + "`define FOOOOOOOOOOOOOOOO \\\n" // macro text starts at '\' + " BAAAAAAAAAAAAAAAAR BAAAAAAAAAAAAAZ;\n"}, + {"`ifdef FOO\n" + " `fine()\n" + "`else\n" + " `error()\n" + "`endif\n", + "`ifdef FOO\n" + "`fine()\n" + "`else\n" + "`error()\n" + "`endif\n"}, + {"`ifdef FOO\n" + " `fine()\n" + "`else // trouble\n" + " `error()\n" + "`endif\n", + "`ifdef FOO\n" + "`fine()\n" + "`else // trouble\n" + "`error()\n" + "`endif\n"}, + {"`ifdef FOO\n" + " `fine()\n" + "`else /* trouble */\n" + " `error()\n" + "`endif\n", + "`ifdef FOO\n" + "`fine()\n" + "`else /* trouble */\n" + "`error()\n" + "`endif\n"}, + {" // lonely comment\n", "// lonely comment\n"}, + {" // first comment\n" + " // last comment\n", + "// first comment\n" + "// last comment\n"}, + {" // starting comment\n" + " `define FOO\n", + "// starting comment\n" + "`define FOO\n"}, + {" `define FOO\n" + " // trailing comment\n", + "`define FOO\n" + "// trailing comment\n"}, + {" `define FOO\n" + " // trailing comment 1\n" + " // trailing comment 2\n", + "`define FOO\n" + "// trailing comment 1\n" + "// trailing comment 2\n"}, + { + " `define FOO \\\n" // multiline macro definition + " 1\n", + "`define FOO \\\n" + " 1\n" // TODO(b/141517267): Reflowing macro definitions + }, + {"`define FOO \\\n" // multiline macro definition + " b\n", + "`define FOO \\\n" // no need to align '\' + " b\n"}, + {"`define FOO \\\n" // multiline macro definition + " a + \\\n" + " b\n", + "`define FOO \\\n" // preserve spacing before '\' + " a + \\\n" // to stay aligned with this one + " b\n"}, + {" // comment with backslash\\\n", "// comment with backslash\\\n"}, + {// macro with MacroArg tokens as arguments + "`FOOOOOO(\nbar1...\n,\nbar2...\n,\nbar3...\n,\nbar4\n)\n", + "`FOOOOOO(bar1..., bar2..., bar3...,\n" + " bar4)\n"}, + {// macro declaration exceeds line length limit + "`F_MACRO(looooooong_type if_it_fits_I_sits)\n", + "`F_MACRO(\n" + " looooooong_type if_it_fits_I_sits)\n"}, + {// macro call with not fitting arguments + "`MACRO_FFFFFFFFFFF(" + "type_a_aaaa,type_b_bbbbb," + "type_c_cccccc,type_d_dddddddd," + "type_e_eeeeeeee,type_f_ffff)\n", + "`MACRO_FFFFFFFFFFF(\n" + " type_a_aaaa, type_b_bbbbb,\n" + " type_c_cccccc, type_d_dddddddd,\n" + " type_e_eeeeeeee, type_f_ffff)\n"}, + {// nested macro call + "`MACRO_FFFFFFFFFFF( " + "`A(type_a_aaaa), `B(type_b_bbbbb), " + "`C(type_c_cccccc), `D(type_d_dddddddd), " + "`E(type_e_eeeeeeee), `F(type_f_ffff))\n", + "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa),\n" + " `B(type_b_bbbbb),\n" + " `C(type_c_cccccc),\n" + " `D(type_d_dddddddd),\n" + " `E(type_e_eeeeeeee),\n" + " `F(type_f_ffff))\n"}, + {// two-level nested macro call + "`MACRO_FFFFFFFFFFF( " + "`A(type_a_aaaa, `B(type_b_bbbbb)), " + "`C(type_c_cccccc, `D(type_d_dddddddd)), " + "`E(type_e_eeeeeeee, `F(type_f_ffff)))\n", + "`MACRO_FFFFFFFFFFF(\n" + " `A(type_a_aaaa, `B(type_b_bbbbb)),\n" + " `C(type_c_cccccc,\n" + " `D(type_d_dddddddd)),\n" + " `E(type_e_eeeeeeee,\n" + " `F(type_f_ffff)))\n"}, + {// three-level nested macro call + "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa," + "`B(type_b_bbbbb,`C(type_c_cccccc)))," + "`D(type_d_dddddddd,`E(type_e_eeeeeeee," + "`F(type_f_ffff))))\n", + "`MACRO_FFFFFFFFFFF(\n" + " `A(type_a_aaaa,\n" + " `B(type_b_bbbbb,\n" + " `C(type_c_cccccc))),\n" + " `D(type_d_dddddddd,\n" + " `E(type_e_eeeeeeee,\n" + " `F(type_f_ffff))))\n"}, + {// macro call with MacroArg tokens as arugments and with semicolon + "`FOOOOOO(\nbar1...\n,\nbar2...\n,\nbar3...\n,\nbar4\n);\n", + "`FOOOOOO(bar1..., bar2..., bar3...,\n" + " bar4);\n"}, + {// macro declaration exceeds line length limit and contains semicolon + "`F_MACRO(looooooong_type if_it_fits_I_sits);\n", + "`F_MACRO(\n" + " looooooong_type if_it_fits_I_sits);\n"}, + {// macro call with not fitting arguments and semicolon + "`MACRO_FFFFFFFFFFF(" + "type_a_aaaa,type_b_bbbbb," + "type_c_cccccc,type_d_dddddddd," + "type_e_eeeeeeee,type_f_ffff);\n", + "`MACRO_FFFFFFFFFFF(\n" + " type_a_aaaa, type_b_bbbbb,\n" + " type_c_cccccc, type_d_dddddddd,\n" + " type_e_eeeeeeee, type_f_ffff);\n"}, + {// nested macro call with semicolon + "`MACRO_FFFFFFFFFFF( " + "`A(type_a_aaaa), `B(type_b_bbbbb), " + "`C(type_c_cccccc), `D(type_d_dddddddd), " + "`E(type_e_eeeeeeee), `F(type_f_ffff));\n", + "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa),\n" + " `B(type_b_bbbbb),\n" + " `C(type_c_cccccc),\n" + " `D(type_d_dddddddd),\n" + " `E(type_e_eeeeeeee),\n" + " `F(type_f_ffff));\n"}, + {// two-level nested macro call with semicolon + "`MACRO_FFFFFFFFFFF( " + "`A(type_a_aaaa, `B(type_b_bbbbb)), " + "`C(type_c_cccccc, `D(type_d_dddddddd)), " + "`E(type_e_eeeeeeee, `F(type_f_ffff)));\n", + "`MACRO_FFFFFFFFFFF(\n" + " `A(type_a_aaaa, `B(type_b_bbbbb)),\n" + " `C(type_c_cccccc,\n" + " `D(type_d_dddddddd)),\n" + " `E(type_e_eeeeeeee,\n" + " `F(type_f_ffff)));\n"}, + {// three-level nested macro call with semicolon + "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa," + "`B(type_b_bbbbb,`C(type_c_cccccc)))," + "`D(type_d_dddddddd,`E(type_e_eeeeeeee," + "`F(type_f_ffff))));\n", + "`MACRO_FFFFFFFFFFF(\n" + " `A(type_a_aaaa,\n" + " `B(type_b_bbbbb,\n" + " `C(type_c_cccccc))),\n" + " `D(type_d_dddddddd,\n" + " `E(type_e_eeeeeeee,\n" + " `F(type_f_ffff))));\n"}, + {// macro call with no args + "`FOOOOOO()\n", "`FOOOOOO()\n"}, + {// macro call with no args and semicolon + "`FOOOOOO();\n", "`FOOOOOO();\n"}, + {// macro call with no args and semicolon separated by space + "`FOOOOOO() ;\n", "`FOOOOOO();\n"}, + {// macro call with comments in argument list + "`FOO(aa, //aa\nbb , // bb\ncc)\n", + "`FOO(aa, //aa\n" + " bb, // bb\n" + " cc)\n"}, + {// macro call with comment before first argument + "`FOO(//aa\naa, //bb\nbb , // cc\ncc)\n", + "`FOO( //aa\n" + " aa, //bb\n" + " bb, // cc\n" + " cc)\n"}, + {// macro call with argument including trailing EOL comment + "`FOO(aa, bb,//cc\ndd)\n", + "`FOO(aa, bb, //cc\n" + " dd)\n"}, + {// macro call with argument including EOL comment on own line + "`FOOOO(aa, bb,\n//cc\ndd)\n", + "`FOOOO(aa, bb,\n" + " //cc\n" + " dd)\n"}, + {" // leading comment\n" + " `define FOO \\\n" // multiline macro definition + "1\n" + " // trailing comment\n", + "// leading comment\n" + "`define FOO \\\n" + "1\n" // TODO(b/141517267): Reflowing macro definitions + "// trailing comment\n"}, + {// macro call after define + "`define FOO BAR\n" + " `FOO( bar )\n", + "`define FOO BAR\n" + "`FOO(bar)\n"}, + {// multiple argument macro call + " `FOO( bar , baz )\n", "`FOO(bar, baz)\n"}, + {// long macro call breaking + " `ASSERT_INIT(S, (D == 4 && K inside {0, 1}) ||" + " (D == 3 && K== 4))\n", + "`ASSERT_INIT(\n" + " S, (D == 4 && K inside {0, 1}) ||\n" + " (D == 3 && K == 4))\n"}, + {// long macro call breaking + " `AINIT(S, (D == 4 && K inside {0, 1}) ||" + " (D == 3 && K== 4))\n", + "`AINIT(S, (D == 4 && K inside {0, 1}) ||\n" + " (D == 3 && K == 4))\n"}, + {// long macro call breaking + " `ASSERT_INIT(S, D == 4 && K inside {0, 1})\n", + "`ASSERT_INIT(S,\n" + " D == 4 && K inside {0, 1})\n"}, + {// macro call in function + "function void foo( ); foo=`FOO( bar , baz ) ; endfunction\n", + "function void foo();\n" + " foo = `FOO(bar, baz);\n" + "endfunction\n"}, + {// nested macro call in function + "function void foo( ); foo=`FOO( `BAR ( baz ) ) ; endfunction\n", + "function void foo();\n" + " foo = `FOO(`BAR(baz));\n" + "endfunction\n"}, + {// macro call in class + "class foo; `FOO ( bar , baz ) ; endclass\n", + "class foo;\n" + " `FOO(bar, baz);\n" + "endclass\n"}, + {// nested macro call in class + "class foo; `FOO ( `BAR ( baz1 , baz2 ) ) ; endclass\n", + "class foo;\n" + " `FOO(`BAR(baz1, baz2));\n" + "endclass\n"}, + {// multi-line macro arg "aaaa..." should start on its own line, + // even if its first line would fit under the column limit + "`CHECK_FATAL(rd_tr,\n" + " aaaa == zzz;\n" + " ggg == vv::w;,\n" + " \"Failed to ..........\")\n", + "`CHECK_FATAL(rd_tr,\n" + " aaaa == zzz;\n" + " ggg == vv::w;,\n" + " \"Failed to ..........\")\n"}, + {// macro call nested with function call containing an ifdef + "`J(D(`ifdef e))\n", + "`J(D(\n" + " `ifdef e))\n"}, + + // `uvm macros indenting + { + // simple test case + "`uvm_object_utils_begin(aa)\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_object_utils_end\n", + "`uvm_object_utils_begin(aa)\n" + " `uvm_field_int(bb, UVM_DEFAULT)\n" + " `uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_object_utils_end\n", + }, + {// multiple uvm.*begin - uvm.*end ranges + "`uvm_object_utils_begin(aa)\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_object_utils_end\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_object_utils_begin(bb)\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_object_utils_end\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n", + "`uvm_object_utils_begin(aa)\n" + " `uvm_field_int(bb, UVM_DEFAULT)\n" + " `uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_object_utils_end\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_object_utils_begin(bb)\n" + " `uvm_field_int(bb, UVM_DEFAULT)\n" + " `uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_object_utils_end\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n"}, + { + // empty uvm.*begin - uvm.*end range + "`uvm_component_utils_begin(aa)\n" + "`uvm_component_utils_end\n", + "`uvm_component_utils_begin(aa)\n" + "`uvm_component_utils_end\n", + }, + { + // uvm_field_utils + "`uvm_field_utils_begin(aa)\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_field_utils_end\n", + "`uvm_field_utils_begin(aa)\n" + " `uvm_field_int(bb, UVM_DEFAULT)\n" + " `uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_field_utils_end\n", + }, + { + // uvm_component + "`uvm_component_utils_begin(aa)\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n", + "`uvm_component_utils_begin(aa)\n" + " `uvm_field_int(bb, UVM_DEFAULT)\n" + " `uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n", + }, + { + // nested uvm macros + "`uvm_field_int(l0, UVM_DEFAULT)\n" + "`uvm_component_utils_begin(l0)\n" + "`uvm_field_int(l1, UVM_DEFAULT)\n" + "`uvm_component_utils_begin(l1)\n" + "`uvm_field_int(l2, UVM_DEFAULT)\n" + "`uvm_component_utils_begin(l2)\n" + "`uvm_field_int(l3, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n" + "`uvm_field_int(l2, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n" + "`uvm_field_int(l1, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n" + "`uvm_field_int(l0, UVM_DEFAULT)\n", + "`uvm_field_int(l0, UVM_DEFAULT)\n" + "`uvm_component_utils_begin(l0)\n" + " `uvm_field_int(l1, UVM_DEFAULT)\n" + " `uvm_component_utils_begin(l1)\n" + " `uvm_field_int(l2, UVM_DEFAULT)\n" + " `uvm_component_utils_begin(l2)\n" + " `uvm_field_int(l3, UVM_DEFAULT)\n" + " `uvm_component_utils_end\n" + " `uvm_field_int(l2, UVM_DEFAULT)\n" + " `uvm_component_utils_end\n" + " `uvm_field_int(l1, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n" + "`uvm_field_int(l0, UVM_DEFAULT)\n", + }, + { + // non-uvm macro + "`my_macro_begin(aa)\n" + "`my_field(b)\n" + "`my_field(c)\n" + "`my_macro_end\n", + "`my_macro_begin(aa)\n" + "`my_field(b)\n" + "`my_field(c)\n" + "`my_macro_end\n", + }, + { + // unbalanced uvm macros: missing uvm.*end macro + "`uvm_component_utils_begin(aa)\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n", + "`uvm_component_utils_begin(aa)\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n", + }, + { + // unbalanced uvm macros: missing uvm.*begin macro + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n", + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n", + }, + {// unbalanced uvm macros: missing _begin macro between + // matching uvm.*begin-uvm.*end macros + "`uvm_component_utils_begin(aa)\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_component_utils_begin(aa)\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n", + "`uvm_component_utils_begin(aa)\n" + " `uvm_field_int(bb, UVM_DEFAULT)\n" + " `uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n" + "`uvm_field_int(bb, UVM_DEFAULT)\n" + "`uvm_component_utils_begin(aa)\n" + " `uvm_field_int(bb, UVM_DEFAULT)\n" + " `uvm_field_int(cc, UVM_DEFAULT)\n" + "`uvm_component_utils_end\n"}, + + // top-level directive test cases + {"`timescale 1ns/1ps\n", // + "`timescale 1ns / 1ps\n"}, + + // Multiple compiler directives should remain on separate lines + // (regression test for bug where they were merged onto one line) + {"`timescale 1 ps / 1 ps\n" + "`default_nettype none\n", + "`timescale 1 ps / 1 ps\n" + "`default_nettype none\n"}, + {"`resetall\n" + "`timescale 1ns/1ps\n" + "`default_nettype wire\n", + "`resetall\n" + "`timescale 1ns / 1ps\n" + "`default_nettype wire\n"}, + // Test with multiple different compiler directives + {"`resetall\n" + "`celldefine\n" + "`timescale 1ns/1ps\n" + "`default_nettype none\n", + "`resetall\n" + "`celldefine\n" + "`timescale 1ns / 1ps\n" + "`default_nettype none\n"}, + // Test with compiler directives before module + {"`timescale 1ps/1ps\n" + "`default_nettype none\n" + "module foo;endmodule\n", + "`timescale 1ps / 1ps\n" + "`default_nettype none\n" + "module foo;\nendmodule\n"}, + // Test with various compiler directives + {"`suppress_faults\n" + "`enable_portfaults\n" + "`delay_mode_distributed\n", + "`suppress_faults\n" + "`enable_portfaults\n" + "`delay_mode_distributed\n"}, + {"`default_decay_time 10\n" + "`default_trireg_strength 50\n", + "`default_decay_time 10\n" + "`default_trireg_strength 50\n"}, + // Alignment should ignore compiler directives; declarations align normally. + // Place directives at top-level between modules (valid SystemVerilog). + {"`timescale 1ns/1ps\n" + "module m;\n" + " logic a;\n" + " logic very_long_name;\n" + "endmodule\n" + "`default_nettype none\n" + "module n;\n" + " logic b;\n" + "endmodule\n", + "`timescale 1ns / 1ps\n" + "module m;\n" + " logic a;\n" + " logic very_long_name;\n" + "endmodule\n" + "`default_nettype none\n" + "module n;\n" + " logic b;\n" + "endmodule\n"}, + {"`begin_keywords \"1800-2017\"\n" + "module test;endmodule\n" + "`end_keywords\n", + "`begin_keywords \"1800-2017\"\n" + "module test;\nendmodule\n" + "`end_keywords\n"}, + +}; + +TEST(FormatterEndToEndTest, MacroFormatterTestCases) { + RunFormatterTestCases40(kMacroFormatterTestCases); +} + +} // namespace +} // namespace formatter +} // namespace verilog
diff --git a/verible/verilog/formatting/formatter_module_test.cc b/verible/verilog/formatting/formatter_module_test.cc new file mode 100644 index 0000000..4290e5e --- /dev/null +++ b/verible/verilog/formatting/formatter_module_test.cc
@@ -0,0 +1,3025 @@ +// Copyright 2017-2026 The Verible Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Test cases in this file should be *insensitive* to wrapping penalties. +// Penalty-sensitive tests belong in formatter-tuning_test.cc. + +#include "gtest/gtest.h" +#include "verible/verilog/formatting/formatter-test-utils.h" + +namespace verilog { +namespace formatter { +namespace { + +static constexpr FormatterTestCase kModuleFormatterTestCases[] = { + // parameter test cases + { + " parameter int foo=0 ;", + "parameter int foo = 0;\n", + }, + { + " parameter int foo=bar [ 0 ] ;", // index expression + "parameter int foo = bar[0];\n", + }, + { + " parameter int foo=bar [ a+b ] ;", // binary inside index expr + "parameter int foo = bar[a+b];\n", // allowed to be 0 spaces + // (preserved) + }, + { + " parameter int foo=bar [ a+ b ] ;", // binary inside index expr + "parameter int foo = bar[a+b];\n", // allowed to be 0 spaces + // (symmetrized) + }, + { + " parameter int foo=bar [ a +b ] ;", // compact binary inside + "parameter int foo = bar[a+b];\n", // index expression + }, + { + " parameter int foo=bar [ a +b ] ;", // compact binary inside + "parameter int foo = bar[a+b];\n", // index expression + }, + { + // with line continuations + " parameter \\\nint \\\nfoo=a+ \\\nb ;", + "parameter\\\n int\\\n foo = a +\\\n b;\n", + // TODO(fangism): should text following a line continuation hang-indent? + }, + // unary prefix expressions + { + " parameter int foo=- 1 ;", + "parameter int foo = -1;\n", + }, + { + " parameter int foo=+ 7 ;", + "parameter int foo = +7;\n", + }, + { + " parameter int foo=- J ;", + "parameter int foo = -J;\n", + }, + { + " parameter int foo=- ( y ) ;", + "parameter int foo = -(y);\n", + }, + { + " parameter int foo=- ( z*y ) ;", + "parameter int foo = -(z * y);\n", + }, + { + " parameter int foo=- z*- y ;", + "parameter int foo = -z * -y;\n", + }, + { + " parameter int foo=( - 2 ) ;", // + "parameter int foo = (-2);\n", + }, + { + " parameter int foo=$bar(- z,- y ) ;", + "parameter int foo = $bar(-z, -y);\n", + }, + {" parameter int a=b&~(c<<d);", "parameter int a = b & ~(c << d);\n"}, + {" parameter int a=~~~~b;", "parameter int a = ~~~~b;\n"}, + {" parameter int a = ~ ~ ~ ~ b;", "parameter int a = ~~~~b;\n"}, + {" parameter int a = ~--b;", "parameter int a = ~--b;\n"}, + {" parameter int a = ~ --b;", "parameter int a = ~--b;\n"}, + {" parameter int a = ~ ++ b;", "parameter int a = ~++b;\n"}, + {" parameter int a=--b- --c;", "parameter int a = --b - --c;\n"}, + // ^~ and ~^ are bitwise nor, but ^ ~ isn't + {" parameter int a=b^~(c<<d);", "parameter int a = b ^~ (c << d);\n"}, + {" parameter int a=b~^(c<<d);", "parameter int a = b ~^ (c << d);\n"}, + {" parameter int a=b^ ~ (c<<d);", "parameter int a = b ^ ~(c << d);\n"}, + {" parameter int a=b ^ ~(c<<d);", "parameter int a = b ^ ~(c << d);\n"}, + + {" parameter int a=b^~{c};", "parameter int a = b ^~ {c};\n"}, + {" parameter int a=b~^{c};", "parameter int a = b ~^ {c};\n"}, + {" parameter int a=b^ ~ {c};", "parameter int a = b ^ ~{c};\n"}, + {" parameter int a=b ^ ~{c};", "parameter int a = b ^ ~{c};\n"}, + + {" parameter int a={a}^{b};", "parameter int a = {a} ^ {b};\n"}, + {" parameter int a={b}^(c);", "parameter int a = {b} ^ (c);\n"}, + {" parameter int a=b[0]^ {c};", "parameter int a = b[0] ^ {c};\n"}, + {" parameter int a={c}^a[b];", "parameter int a = {c} ^ a[b];\n"}, + {" parameter int a=(c)^{a[b]};", "parameter int a = (c) ^ {a[b]};\n"}, + + {" parameter int a={^{a,^b},c};", "parameter int a = {^{a, ^b}, c};\n"}, + {" parameter int a=(a)^(^d[e]^{c});", + "parameter int a = (a) ^ (^d[e] ^ {c});\n"}, + {" parameter int a=(a)^(^d[e]^f[g]);", + "parameter int a = (a) ^ (^d[e] ^ f[g]);\n"}, + {" parameter int a=(b^(c^(d^e)));", + "parameter int a = (b ^ (c ^ (d ^ e)));\n"}, + {" parameter int a={b^{c^{d^e}}};", + "parameter int a = {b ^ {c ^ {d ^ e}}};\n"}, + {" parameter int a={b^{c[d^e]}};", + "parameter int a = {b ^ {c[d^e]}};\n"}, // allow 0 spaces inside "[d^e]" + {" parameter int a={(b^c),(d^^e)};", + "parameter int a = {(b ^ c), (d ^ ^e)};\n"}, + + {" parameter int a={(b[x]^{c[y]})};", + "parameter int a = {(b[x] ^ {c[y]})};\n"}, + {" parameter int a={d^^e[f] ^ (g)};", + "parameter int a = {d ^ ^e[f] ^ (g)};\n"}, + + // ~| is unary reduction NOR, |~ and | ~ aren't + {" parameter int a=b| ~(c<<d);", "parameter int a = b | ~(c << d);\n"}, + {" parameter int a=b|~(c<<d);", "parameter int a = b | ~(c << d);\n"}, + {" parameter int a=b| ~| ( c<<d);", "parameter int a = b | ~|(c << d);\n"}, + {" parameter int a=b| ~| ~| ( c<<d);", + "parameter int a = b | ~|~|(c << d);\n"}, + {" parameter int a=b| ~~~( c<<d);", + "parameter int a = b | ~~~(c << d);\n"}, + { + " parameter int foo=- - 1 ;", // double negative + "parameter int foo = - -1;\n", + }, + { + " parameter int ternary=1?2:3;", + "parameter int ternary = 1 ? 2 : 3;\n", + }, + { + " parameter int ternary=a?b:c;", + "parameter int ternary = a ? b : c;\n", + }, + { + " parameter int ternary=\"a\"?\"b\":\"c\";", + "parameter int ternary = \"a\" ? \"b\" : \"c\";\n", + }, + { + " parameter int t=`\"a`\"?`\"b`\":`\"c`\";", + "parameter int t = `\"a`\" ? `\"b`\" : `\"c`\";\n", + }, + { + " parameter int ternary=(a)?(b):(c);", + "parameter int ternary = (a) ? (b) : (c);\n", + }, + { + " parameter int ternary={a}?{b}:{c};", + "parameter int ternary = {a} ? {b} : {c};\n", + }, + { + " parameter int long_ternary=cond?long_option_t:long_option_f;", + "parameter int long_ternary = cond ?\n" + " long_option_t : long_option_f;\n", + }, + { + " parameter int break_two=cond\n" + "? a_really_long_option_number_one:a_really_long_option_number_two;", + "parameter int break_two = cond ?\n" + " a_really_long_option_number_one :\n" + " a_really_long_option_number_two;\n", + }, + { + " assign ternary=1?2:3;", + "assign ternary = 1 ? 2 : 3;\n", + }, + { + " assign ternary=a?b:c;", + "assign ternary = a ? b : c;\n", + }, + { + " assign ternary={a}?{b}:{c};", + "assign ternary = {a} ? {b} : {c};\n", + }, + { + " assign break_two=cond\n" + "? a_really_long_option_number_one:a_really_long_option_number_two;", + "assign break_two = cond ?\n" + " a_really_long_option_number_one :\n" + " a_really_long_option_number_two;\n", + }, + { + "assign prefetch_d =\n" + "lookup_grant_ic0 ? (lookup_addr_aligned + ADDR) :\n" + " addr_i;", + "assign prefetch_d = lookup_grant_ic0 ?\n" + " (lookup_addr_aligned + ADDR) :\n" + " addr_i;\n", + }, + { + "assign prefetch_d =\n" + "lookup_grant_ic0 ? (lookup_addr + 1) :\n" + " addr_i;", + "assign prefetch_d = lookup_grant_ic0 ?\n" + " (lookup_addr + 1) : addr_i;\n", + }, + { + "module test;\n" + " assign next = // EOL\n" + " foo ? '0 :\n" + " cnt;\n" + "endmodule\n", + "module test;\n" + " assign next = // EOL\n" + " foo ? '0 : cnt;\n" + "endmodule\n", + }, + { + "module test;\n" + " assign next = foo // EOL\n" + " ? '0 :\n" + " cnt;\n" + "endmodule\n", + "module test;\n" + " assign next = foo // EOL\n" + " ? '0 : cnt;\n" + "endmodule\n", + }, + { + "module test;\n" + " assign next = foo ? // EOL\n" + " '0 :\n" + " cnt;\n" + "endmodule\n", + "module test;\n" + " assign next = foo ? // EOL\n" + " '0 : cnt;\n" + "endmodule\n", + }, + { + "module test;\n" + " assign next = foo ? '0 // EOL\n" + " :\n" + " cnt;\n" + "endmodule\n", + "module test;\n" + " assign next = foo ? '0 // EOL\n" + " : cnt;\n" + "endmodule\n", + }, + { + "module test;\n" + " assign next = foo ? '0 : // EOL\n" + " cnt;\n" + "endmodule\n", + "module test;\n" + " assign next = foo ? '0 : // EOL\n" + " cnt;\n" + "endmodule\n", + }, + { + "module test;\n" + " assign next = foo ? '0 : // EOL\n" + " bar ? '1 : '0;\n" + "endmodule\n", + "module test;\n" + " assign next = foo ? '0 : // EOL\n" + " bar ? '1 : '0;\n" + "endmodule\n", + }, + { + "module test;\n" + " assign next = foo ? '0 : // EOL\n" + " bar // EOL2\n" + " ? '1 : '0;\n" + "endmodule\n", + "module test;\n" + " assign next = foo ? '0 : // EOL\n" + " bar // EOL2\n" + " ? '1 : '0;\n" + "endmodule\n", + }, + { + "module test;\n" + " assign next = foo ? '0 : // EOL\n" + " bar ? // EOL2\n" + " '1 : '0;\n" + "endmodule\n", + "module test;\n" + " assign next = foo ? '0 : // EOL\n" + " bar ? // EOL2\n" + " '1 : '0;\n" + "endmodule\n", + }, + { + "module test;\n" + " assign next = foo ? '0 : // EOL\n" + " bar ? '1 // EOL2\n" + " : '0;\n" + "endmodule\n", + "module test;\n" + " assign next = foo ? '0 : // EOL\n" + " bar ? '1 // EOL2\n" + " : '0;\n" + "endmodule\n", + }, + { + "module test;\n" + " assign next = foo ? '0 : // EOL\n" + " bar ? '1 : // EOL2\n" + " '0;\n" + "endmodule\n", + "module test;\n" + " assign next = foo ? '0 : // EOL\n" + " bar ? '1 : // EOL2\n" + " '0;\n" + "endmodule\n", + }, + { + "assign prefetch_d =\n" + "lookup_ic0 ? // EOL\n" + " (lookup_addr + 1) :// BOO\n" + " addr_i;", + "assign prefetch_d = lookup_ic0 ? // EOL\n" + " (lookup_addr + 1) : // BOO\n" + " addr_i;\n", + }, + { + "module test;\n" + " assign next = (foo) ? '0 : // clear \n" + " (bar) ? cnt + 1'b1 : // count \n" + " cnt;\n" + "endmodule\n", + "module test;\n" + " assign next = (foo) ? '0 : // clear \n" + " (bar) ? cnt + 1'b1 : // count \n" + " cnt;\n" + "endmodule\n", + }, + { + "module test;\n" + " assign next = // FOO\n" + " (foo) ? '0 : // clear \n" + " (bar) ? cnt + 1'b1 : // count \n" + " cnt;\n" + "endmodule\n", + "module test;\n" + " assign next = // FOO\n" + " (foo) ? '0 : // clear \n" + " (bar) ? cnt + 1'b1 : // count \n" + " cnt;\n" + "endmodule\n", + }, + { + "module test;\n" + " assign next = foo ? a_really_long_identifier : // EOL\n" + " cnt;\n" + "endmodule\n", + "module test;\n" + " assign next = foo ?\n" + " a_really_long_identifier : // EOL\n" + " cnt;\n" + "endmodule\n", + }, + { + "module test;\n" + " assign next = foo ? a_really_long_identifier : // EOL\n" + " another_really_long_identifier;\n" + "endmodule\n", + "module test;\n" + " assign next = foo ?\n" + " a_really_long_identifier : // EOL\n" + " another_really_long_identifier;\n" + "endmodule\n", + }, + { + "module test;\n" + " assign next = foo ? a_really_long_identifier : " + "another_really_long_identifier;\n" + "endmodule\n", + "module test;\n" + " assign next = foo ?\n" + " a_really_long_identifier :\n" + " another_really_long_identifier;\n" + "endmodule\n", + }, + { + "assign m = check ? {10'b0, foo} :\n" + " (bar && (baz == '0)) ? hello :\n" + " world ? temp1 : temp2;\n", + "assign m = check ? {10'b0, foo} :\n" + " (bar && (baz == '0)) ? hello :\n" + " world ? temp1 : temp2;\n", + }, + { + "assign {a, b} = !(c == d) ? {1'b0, e} :\n" + " ((e == f) && g) ?\n" + " {1'b0, f} : (h) ?\n" + " {1'b0, e} - 1'b1 :\n" + " {1'b0, e} + 1'b1;\n", + "assign {a, b} = !(c == d) ? {1'b0, e} :\n" + " ((e == f) && g) ? {1'b0, f} : (h) ?\n" + " {1'b0, e} - 1'b1 : {1'b0, e} + 1'b1;\n", + }, + { + "assign {aaaaaaaaaa, bbbbbbbbb} = {1'b0, cccccccccccccccccc[15:0]} +\n" + " {1'b0, ddddddddddddddddd[15:0]};\n", + "assign {aaaaaaaaaa, bbbbbbbbb} =\n" + " {1'b0, cccccccccccccccccc[15:0]} +\n" + " {1'b0, ddddddddddddddddd[15:0]};\n", + }, + { + "covergroup a(string b);\n" + "foobar: cross foo, bar {" + "ignore_bins baz = binsof(qux) intersect {1, 2, 3, 4, 5, 6, 7};" + "}\n" + "endgroup : a\n", + "covergroup a(string b);\n" + " foobar: cross foo, bar{\n" + " ignore_bins baz =\n" + " binsof (qux) intersect {\n" + " 1, 2, 3, 4, 5, 6, 7\n" + " };\n" + " }\n" + "endgroup : a\n", + }, + { + "assign {aa, bb} = {1'b0, cc} + {1'b0, dd};\n", + "assign {aa, bb} = {1'b0, cc} +\n" + " {1'b0, dd};\n", + }, + + // streaming operators + { + " parameter int b={ >> { a } } ;", + "parameter int b = {>>{a}};\n", + }, + { + " parameter int b={ >> { a , b, c } } ;", + "parameter int b = {>>{a, b, c}};\n", + }, + { + " parameter int b={ >> 4 { a } } ;", + "parameter int b = {>>4{a}};\n", + }, + { + " parameter int b={ >> byte { a } } ;", + "parameter int b = {>>byte{a}};\n", + }, + { + " parameter int b={ >> my_type_t { a } } ;", + "parameter int b = {>>my_type_t{a}};\n", + }, + { + " parameter int b={ >> `GET_TYPE { a } } ;", + "parameter int b = {>>`GET_TYPE{a}};\n", + }, + { + " parameter int b={ >> 4 {{ >> 2 { a } }} } ;", + "parameter int b = {>>4{{>>2{a}}}};\n", + }, + { + " parameter int b={ << { a } } ;", + "parameter int b = {<<{a}};\n", + }, + { + " parameter int b={ << { a , b, c } } ;", + "parameter int b = {<<{a, b, c}};\n", + }, + { + " parameter int b={ << 4 { a } } ;", + "parameter int b = {<<4{a}};\n", + }, + { + " parameter int b={ << byte { a } } ;", + "parameter int b = {<<byte{a}};\n", + }, + { + " parameter int b={ << my_type_t { a } } ;", + "parameter int b = {<<my_type_t{a}};\n", + }, + { + " parameter int b={ << `GET_TYPE { a } } ;", + "parameter int b = {<<`GET_TYPE{a}};\n", + }, + { + " parameter int b={ << 4 {{ << 2 { a } }} } ;", + "parameter int b = {<<4{{<<2{a}}}};\n", + }, + + // basic module test cases + {"module foo;endmodule:foo\n", + "module foo;\n" + "endmodule : foo\n"}, + {"module\nfoo\n;\nendmodule\n:\nfoo\n", + "module foo;\n" + "endmodule : foo\n"}, + {"module\tfoo\t;\tendmodule\t:\tfoo", + "module foo;\n" + "endmodule : foo\n"}, + {"module foo; // foo\n" + "endmodule:foo\n", + "module foo; // foo\n" + "endmodule : foo\n"}, + {"module foo;/* foo */endmodule:foo\n", + "module foo; /* foo */\n" + "endmodule : foo\n"}, + {"module pm #(\n" + "//comment\n" + ") (wire ww);\n" + "endmodule\n", + "module pm #(\n" + " //comment\n" // comment indented + ") (\n" + " wire ww\n" + ");\n" + "endmodule\n"}, + {"module pm ( ) ;\n" // empty ports list + "endmodule\n", + "module pm ();\n" + "endmodule\n"}, + {"module pm #(\n" + "//comment\n" + ") ( );\n" + "endmodule\n", + "module pm #(\n" + " //comment\n" // comment indented + ") ();\n" // (); grouped together + "endmodule\n"}, + {"`ifdef FOO\n" + " `ifndef BAR\n" + " `endif\n" + "`endif\n", + "`ifdef FOO\n" + "`ifndef BAR\n" + "`endif\n" + "`endif\n"}, + {"module foo(\n" + " `include \"ports.svh\"\n" + " ) ; endmodule\n", + "module foo (\n" + " `include \"ports.svh\"\n" + ");\n" + "endmodule\n"}, + {"module foo(\n" + " `define FOO\n" + "`undef\tFOO\n" + " ) ; endmodule\n", + "module foo (\n" + " `define FOO\n" + " `undef FOO\n" + ");\n" + "endmodule\n"}, + {"module foo( input x , output y ) ;endmodule:foo\n", + "module foo (\n" + " input x,\n" // aligned + " output y\n" + ");\n" + "endmodule : foo\n"}, + {"module foo(\n" + "// comment\n" + " input x , output y ) ;endmodule:foo\n", + "module foo (\n" + " // comment\n" + " input x,\n" // aligned + " output y\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input[2:0]x , output y [3:0] ) ;endmodule:foo\n", + // each port item should be on its own line + "module foo (\n" + " input [2:0] x,\n" // aligned + " output y[3:0]\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input wire x , output reg yy ) ;endmodule:foo\n", + "module foo (\n" + " input wire x,\n" // aligned + " output reg yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input wire x ,//c1\n" + "output reg yyy //c2\n" + " ) ;endmodule:foo\n", + "module foo (\n" + " input wire x, //c1\n" // aligned + " output reg yyy //c2\n" // aligned + ");\n" + "endmodule : foo\n"}, + {"module foo( input wire x ,/* c1 */\n" + "output reg yyy /* c2 */\n" + " ) ;endmodule:foo\n", + "module foo (\n" + " input wire x, /* c1 */\n" // aligned + " output reg yyy /* c2 */\n" // aligned + ");\n" + "endmodule : foo\n"}, + {"module foo(\n" + "// comment\n" + "input wire x ,//c1\n" + "output reg yyy //c2\n" + " ) ;endmodule:foo\n", + "module foo (\n" + " // comment\n" + " input wire x, //c1\n" // aligned + " output reg yyy //c2\n" // aligned + ");\n" + "endmodule : foo\n"}, + {"module foo(\n" + "/* comment */\n" + "input wire x ,/* c1 */\n" + "output reg yyy /* c2 */\n" + " ) ;endmodule:foo\n", + "module foo (\n" + " /* comment */\n" + " input wire x, /* c1 */\n" // aligned + " output reg yyy /* c2 */\n" // aligned + ");\n" + "endmodule : foo\n"}, + {"module foo( input wire x ,/* c1\n" + "c2\n" + "c3 */\n" + "output reg yyy /* c4 */\n" + " ) ;endmodule:foo\n", + "module foo (\n" + " input wire x, /* c1\n" + "c2\n" + "c3 */\n" // TODO: align multiline comments + " output reg yyy /* c4 */\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input wire x ,/* c1 */\n" + "output reg yyy,\n" + "output z // c2\n" + " ) ;endmodule:foo\n", + "module foo (\n" + " input wire x, /* c1 */\n" // aligned + " output reg yyy,\n" + " output z // c2\n" // aligned + ");\n" + "endmodule : foo\n"}, + {"module m(input logic [4:0] foo, // comment\n" + "input logic bar // comment\n" + " ) ;endmodule:m\n", + "module m (\n" + " input logic [4:0] foo, // comment\n" // aligned + " input logic bar // comment\n" // aligned + ");\n" + "endmodule : m\n"}, + {"module foo( input wire x , output yy ) ;endmodule:foo\n", + "module foo (\n" + " input wire x,\n" // aligned + " output yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input x , output reg yy ) ;endmodule:foo\n", + "module foo (\n" + " input x,\n" // aligned + " output reg yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input x , output reg[a:b]yy ) ;endmodule:foo\n", + "module foo (\n" + " input x,\n" // aligned + " output reg [a:b] yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input [a:b]x , output reg yy ) ;endmodule:foo\n", + "module foo (\n" + " input [a:b] x,\n" // aligned + " output reg yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input x , " + " output logic yy ) ;endmodule:foo\n", + "module foo (\n" + " input x,\n" // aligned + " output logic yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input [a:c]x , " + " output logic[a-b: c] yy ) ;endmodule:foo\n", + "module foo (\n" + " input [ a:c] x,\n" // aligned + " output logic [a-b:c] yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input [a:c]x , " + " output logic[a - b: c] yy ) ;endmodule:foo\n", + "module foo (\n" + " input [ a:c] x,\n" // aligned + " output logic [a - b:c] yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input [a:c]x , input zzz ," + " output logic[a - b: c] yy ) ;endmodule:foo\n", + "module foo (\n" + " input [ a:c] x,\n" // aligned []'s + " input zzz,\n" // aligned ids + " output logic [a - b:c] yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input [a:b]x , " + " output reg[e: f] yy ) ;endmodule:foo\n", + "module foo (\n" + " input [a:b] x,\n" // aligned + " output reg [e:f] yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input tri[aa: bb]x , " + " output reg[e: f] yy ) ;endmodule:foo\n", + "module foo (\n" + " input tri [aa:bb] x,\n" // aligned + " output reg [ e:f] yy\n" // TODO(b/70310743): align ':' + ");\n" + "endmodule : foo\n"}, + {"module foo( input [a:b][c:d]x , " + " output reg[e: f] yy ) ;endmodule:foo\n", + "module foo (\n" + " input [a:b][c:d] x,\n" // aligned + " output reg [e:f] yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input wire x [j:k], output reg yy ) ;endmodule:foo\n", + "module foo (\n" + " input wire x [j:k],\n" // aligned + " output reg yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input wire x , output reg yy [j:k]) ;endmodule:foo\n", + "module foo (\n" + " input wire x,\n" // aligned + " output reg yy[j:k]\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input wire x [p:q], output reg yy [j:k]) ;endmodule:foo\n", + "module foo (\n" + " input wire x [p:q],\n" // aligned + " output reg yy[j:k]\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input wire x [p:q][r:s], output reg yy [j:k]) " + ";endmodule:foo\n", + "module foo (\n" + " input wire x [p:q][r:s],\n" // aligned + " output reg yy[j:k]\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input wire x [p:q][rr:ss], output reg yy [jj:kk][m:n]) " + ";endmodule:foo\n", + "module foo (\n" + // TODO(b/70310743): align :'s + " input wire x [ p:q][rr:ss],\n" + " output reg yy[jj:kk][ m:n]\n" // aligned + ");\n" + "endmodule : foo\n"}, + {"module foo( input wire [p:q]x, output reg yy [j:k]) ;endmodule:foo\n", + "module foo (\n" + " input wire [p:q] x,\n" // aligned + " output reg yy[j:k]\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input wire x [p:q], output reg[j:k]yy) ;endmodule:foo\n", + "module foo (\n" + " input wire x [p:q],\n" // aligned + " output reg [j:k] yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input pkg::bar_t x , output reg yy) ;endmodule:foo\n", + "module foo (\n" + " input pkg::bar_t x,\n" // aligned + " output reg yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input wire x , output pkg::bar_t yy) ;endmodule:foo\n", + "module foo (\n" + " input wire x,\n" // aligned + " output pkg::bar_t yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input pkg::bar_t#(1) x , output reg yy) ;endmodule:foo\n", + "module foo (\n" // with parameterized port type + " input pkg::bar_t#(1) x,\n" + " output reg yy\n" // aligned + ");\n" + "endmodule : foo\n"}, + {"module foo( input signed x , output reg yy) ;endmodule:foo\n", + "module foo (\n" + " input signed x,\n" // aligned + " output reg yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input signed x , output reg [m:n] yy) ;endmodule:foo\n", + "module foo (\n" + " input signed x,\n" // aligned + " output reg [m:n] yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input int signed x , output reg [m:n] yy) ;endmodule:foo\n", + "module foo (\n" + " input int signed x,\n" // aligned + " output reg [m:n] yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo( input signed x , output pkg::bar_t yy) ;endmodule:foo\n", + "module foo (\n" + " input signed x,\n" // aligned + " output pkg::bar_t yy\n" + ");\n" + "endmodule : foo\n"}, + {"module somefunction (" + "logic clk, int a, int b);endmodule", + "module somefunction (\n" + " logic clk,\n" // direction missing + " int a,\n" // direction missing + " int b\n" // direction missing + ");\n" + "endmodule\n"}, + {"module somefunction (" + "logic clk, input int a, int b);endmodule", + "module somefunction (\n" + " logic clk,\n" // direction missing + " input int a,\n" + " int b\n" // direction missing + ");\n" + "endmodule\n"}, + {"module somefunction (" + "input logic clk, input int a, int b);endmodule", + "module somefunction (\n" + " input logic clk,\n" + " input int a,\n" + " int b\n" // direction missing + ");\n" + "endmodule\n"}, + {"module somefunction (" + "input clk, input int a, int b);endmodule", + "module somefunction (\n" + " input clk,\n" // type missing + " input int a,\n" + " int b\n" + ");\n" + "endmodule\n"}, + {"module somefunction (" + "input logic clk, input a, int b);endmodule", + "module somefunction (\n" + " input logic clk,\n" + " input a,\n" // type missing + " int b\n" // direction missing + ");\n" + "endmodule\n"}, + {"module t;\n" + " input bit i_bit;\n" + "input byte i_byte ;\n" + "input chandle i_chandle;\n" + "input event i_event;\n" + "input int i_int;\n" + "input integer i_inte;\n" + "input longint i_longint;\n" + "input real i_real;\n" + "input realtime i_realtime;\n" + "input shortint i_shortint;\n" + "input shortreal i_shortreal;\n" + "input string i_string;\n" + "input time i_time;\n" + " output bit o_bit;\n" + "output byte o_byte ; \n" + "output chandle o_chandle;\n" + "output event o_event;\n" + "output int o_int;\n" + "output integer o_inte;\n" + "output longint o_longint;\n" + "output real o_real;\n" + "output realtime o_realtime;\n" + "output shortint o_shortint;\n" + "output shortreal o_shortreal;\n" + "output string o_string;\n" + "output time o_time;\n" + "endmodule\n", + "module t;\n" + " input bit i_bit;\n" + " input byte i_byte;\n" + " input chandle i_chandle;\n" + " input event i_event;\n" + " input int i_int;\n" + " input integer i_inte;\n" + " input longint i_longint;\n" + " input real i_real;\n" + " input realtime i_realtime;\n" + " input shortint i_shortint;\n" + " input shortreal i_shortreal;\n" + " input string i_string;\n" + " input time i_time;\n" + " output bit o_bit;\n" + " output byte o_byte;\n" + " output chandle o_chandle;\n" + " output event o_event;\n" + " output int o_int;\n" + " output integer o_inte;\n" + " output longint o_longint;\n" + " output real o_real;\n" + " output realtime o_realtime;\n" + " output shortint o_shortint;\n" + " output shortreal o_shortreal;\n" + " output string o_string;\n" + " output time o_time;\n" + "endmodule\n"}, + {"module t (\n" + " input bit i_bit,\n" + "input byte i_byte ,\n" + "input chandle i_chandle,\n" + "input event i_event,\n" + "input int i_int,\n" + "input integer i_inte,\n" + "input longint i_longint,\n" + "input real i_real,\n" + "input realtime i_realtime,\n" + "input shortint i_shortint,\n" + "input shortreal i_shortreal,\n" + "input string i_string,\n" + "input time i_time,\n" + " output bit o_bit,\n" + "output byte o_byte , \n" + "output chandle o_chandle,\n" + "output event o_event,\n" + "output int o_int,\n" + "output integer o_inte,\n" + "output longint o_longint,\n" + "output real o_real,\n" + "output realtime o_realtime,\n" + "output shortint o_shortint,\n" + "output shortreal o_shortreal,\n" + "output string o_string,\n" + "output time o_time);\n" + "endmodule\n", + "module t (\n" + " input bit i_bit,\n" + " input byte i_byte,\n" + " input chandle i_chandle,\n" + " input event i_event,\n" + " input int i_int,\n" + " input integer i_inte,\n" + " input longint i_longint,\n" + " input real i_real,\n" + " input realtime i_realtime,\n" + " input shortint i_shortint,\n" + " input shortreal i_shortreal,\n" + " input string i_string,\n" + " input time i_time,\n" + " output bit o_bit,\n" + " output byte o_byte,\n" + " output chandle o_chandle,\n" + " output event o_event,\n" + " output int o_int,\n" + " output integer o_inte,\n" + " output longint o_longint,\n" + " output real o_real,\n" + " output realtime o_realtime,\n" + " output shortint o_shortint,\n" + " output shortreal o_shortreal,\n" + " output string o_string,\n" + " output time o_time\n" + ");\n" + "endmodule\n"}, + {"module m;foo bar(.baz({larry, moe, curly}));endmodule", + "module m;\n" + " foo bar (.baz({larry, moe, curly}));\n" + "endmodule\n"}, + {"module m;foo bar(.baz({larry,// expand this\n" + "moe, curly}));endmodule", + "module m;\n" + " foo bar (\n" + " .baz({\n" + " larry, // expand this\n" + " moe,\n" + " curly\n" + " })\n" + " );\n" + "endmodule\n"}, + {"parameter priv_reg_t impl_csr[] = {\n" + "// Machine mode mode CSR\n" + "MVENDORID, //\n" + "MARCHID, //\n" + "DSCRATCH0, //\n" + "DSCRATCH1 //\n" + "};", + "parameter priv_reg_t impl_csr[] = {\n" + " // Machine mode mode CSR\n" + " MVENDORID, //\n" + " MARCHID, //\n" + " DSCRATCH0, //\n" + " DSCRATCH1 //\n" + "};\n"}, + {"parameter priv_reg_t impl_csr[] = {\n" + "// Expand elements\n" + "MVENDORID,\n" + "MARCHID,\n" + "DSCRATCH0,\n" + "DSCRATCH1\n" + "};", + "parameter priv_reg_t impl_csr[] = {\n" + " // Expand elements\n" + " MVENDORID,\n" + " MARCHID,\n" + " DSCRATCH0,\n" + " DSCRATCH1\n" + "};\n"}, + /* TODO(b/158131099): to fix these, reinterpret 'b' as a kPortDeclaration + {"module somefunction (" + "input logic clk, input a, b);endmodule", + "module somefunction (\n" + " input logic clk,\n" + " input a,\n" // type missing + " b\n" // type and direction missing + ");\n" + "endmodule\n"}, + {"module somefunction (" + "input logic clk, int a, b);endmodule", + "module somefunction (\n" + " input logic clk,\n" + " int a,\n" // direction missing + " b\n" // type and direction missing + ");\n" + "endmodule\n"}, + */ + {"module foo(\n" + "//c1\n" + "input wire x , \n" + "//c2\n" + "output reg yy\n" + "//c3\n" + ") ;endmodule:foo\n", + "module foo (\n" + " //c1\n" + " input wire x,\n" // aligned, ignoring comments + " //c2\n" + " output reg yy\n" + " //c3\n" + ");\n" + "endmodule : foo\n"}, + {"module foo(\n" + "//c1\n" + "input wire x , \n" + "//c2a\n" // longer comment + "//c2b\n" + "output reg yy\n" + "//c3\n" + ") ;endmodule:foo\n", + "module foo (\n" + " //c1\n" + " input wire x,\n" // aligned, ignoring comments + " //c2a\n" // note: separated by 2 lines of comments + " //c2b\n" + " output reg yy\n" + " //c3\n" + ");\n" + "endmodule : foo\n"}, + {"module foo(\n" + "`ifdef FOO\n" + "input wire x , \n" + " `else\n" + "output reg yy\n" + " `endif\n" + ") ;endmodule:foo\n", + "module foo (\n" + "`ifdef FOO\n" + " input wire x,\n" // aligned, ignoring preprocessor conditionals + "`else\n" + " output reg yy\n" + "`endif\n" + ");\n" + "endmodule : foo\n"}, + {"module foo(\n" + "input w , \n" + "`define FOO BAR\n" + "input wire x , \n" + " `include \"stuff.svh\"\n" + "output reg yy\n" + " `undef FOO\n" + "output zz\n" + ") ;endmodule:foo\n", + "module foo (\n" + " input w,\n" // aligned, ignoring preprocessor directives + " `define FOO BAR\n" + " input wire x,\n" + " `include \"stuff.svh\"\n" + " output reg yy\n" + " `undef FOO\n" + " output zz\n" // aligned, ignoring preprocessor directives + ");\n" + "endmodule : foo\n"}, + {"module foo(\n" + "input wire x , \n \n" // blank line, separating alignment groups + "output reg yy\n" + ") ;endmodule:foo\n", + "module foo (\n" + " input wire x,\n" // not aligned, due to blank line separating groups + "\n" + " output reg yy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo(\n" + "input wire x1 [r:s],\n" + "input [p:q] x2 , \n \n" // blank line, separating alignment groups + "output reg [jj:kk]yy1,\n" + "output pkg::barr_t [mm:nn] yy2\n" + ") ;endmodule:foo\n", + "module foo (\n" + " input wire x1[r:s],\n" // aligned in this group, but not across + // groups + " input [p:q] x2,\n" + "\n" + " output reg [jj:kk] yy1,\n" + " output pkg::barr_t [mm:nn] yy2\n" + ");\n" + "endmodule : foo\n"}, + {"module foo(\n" // same as previous, with comments + " //c1\n" + "input wire x1 [r:s],\n" + "input [p:q] x2 , \n" + " //c2\n\n" // blank line, separating alignment groups + " //c3\n" + "output reg [jj:kk]yy1,\n" + " //c4\n" + "output pkg::barr_t [mm:nn] yy2\n" + ") ;endmodule:foo\n", + "module foo (\n" + " //c1\n" + " input wire x1[r:s],\n" // aligned in this group, but not across + // groups + " input [p:q] x2,\n" + " //c2\n" + "\n" + " //c3\n" + " output reg [jj:kk] yy1,\n" + " //c4\n" + " output pkg::barr_t [mm:nn] yy2\n" + ");\n" + "endmodule : foo\n"}, + + {// align null-statement (issue #824) + "class sample;" + "bit a;;" + "bit b;" + "endclass", + "class sample;\n" + " bit a;\n" + " ;\n" + " bit b;\n" + "endclass\n"}, + {"class sample;" + "bit a;;" + "endclass", + "class sample;\n" + " bit a;\n" + " ;\n" + "endclass\n"}, + {"class sample;" + "bit a;" + "bit b;;" + "endclass", + "class sample;\n" + " bit a;\n" + " bit b;\n" + " ;\n" + "endclass\n"}, + + {// aligning here just barely fits in the 40col limit + "module foo( input int signed x [a:b]," + "output reg [mm:nn] yy) ;endmodule:foo\n", + "module foo (\n" + // ---------------40col-----------------> + " input int signed x [a:b],\n" // aligned, still fits + " output reg [mm:nn] yy\n" + ");\n" + "endmodule : foo\n"}, + {// when aligning would result in exceeding column limit, don't align for + // now + "module foo( input int signed x [aa:bb]," + "output reg [mm:nn] yy) ;endmodule:foo\n", + "module foo (\n" + // ---------------40col-----------------> + // input int signed x [aa:bb],\n" + // output reg [mm:nn] yy\n" + " input int signed x [aa:bb],\n" // aligned, still fits + " output reg [mm:nn] yy\n" + ");\n" + "endmodule : foo\n"}, + {// when aligning would result in exceeding column limit, don't align for + // now + "module foo( input int signed x [aa:bb]," + "output reg [mm:nn] yyy) ;endmodule:foo\n", + "module foo (\n" + // ---------------40col-----------------> + // input int signed x [aa:bb],\n" // over limit, by comma + // output reg [mm:nn] yyy\n" + " input int signed x[aa:bb],\n" // aligned would be 41 columns + " output reg [mm:nn] yyy\n" + ");\n" + "endmodule : foo\n"}, + {// when aligning would result in exceeding column limit, don't align for + // now + "module foo( input int signed x [a:b],//c\n" + "output reg [m:n] yy) ;endmodule:foo\n", + "module foo (\n" + // ---------------40col----------------> + // input int signed x [a:b], //c\n" // over limit, by comment + // output reg [m:n] yy\n" + " input int signed x[a:b], //c\n" // aligned would be 42 columns + " output reg [m:n] yy\n" + ");\n" + "endmodule : foo\n"}, + {// aligning interfaces in port headers like types + // TODO(b/161181877): flush interface port type left (multi-column) + "module foo( input clk , inter.face yy) ;endmodule:foo\n", + "module foo (\n" + " input clk,\n" // aligned + " inter.face yy\n" + ");\n" + "endmodule : foo\n"}, + {// aligning interfaces in port headers like types + // TODO(b/161181877): flush interface port type left (multi-column) + "module foo( input wire clk , inter.face yy) ;endmodule:foo\n", + "module foo (\n" + " input wire clk,\n" // aligned + " inter.face yy\n" + ");\n" + "endmodule : foo\n"}, + + // module local variable/net declaration alignment test cases + {"module m;\n" + "logic a;\n" + "bit b;\n" + "endmodule\n", + "module m;\n" + " logic a;\n" + " bit b;\n" + "endmodule\n"}, + {"module m;\n" + "logic a;\n" + "bit b;\n" + "initial e=f;\n" // separates alignment groups + "wire c;\n" + "bit d;\n" + "endmodule\n", + "module m;\n" + " logic a;\n" + " bit b;\n" + " initial e = f;\n" // separates alignment groups + " wire c;\n" + " bit d;\n" + "endmodule\n"}, + {"module m;\n" + "// hello a\n" + "logic a;\n" + "// hello b\n" + "bit b;\n" + "endmodule\n", + "module m;\n" + " // hello a\n" + " logic a;\n" + " // hello b\n" + " bit b;\n" // aligned across comments + "endmodule\n"}, + {"module m;\n" + "// hello a\n" + "logic a;\n" + "\n" // extra blank line + "// hello b\n" + "bit b;\n" + "endmodule\n", + "module m;\n" + " // hello a\n" + " logic a;\n" + "\n" // extra blank line + " // hello b\n" // aligned across blank lines + " bit b;\n" // aligned across comments + "endmodule\n"}, + {"module m;\n" + "logic [x:y]a;\n" // packed dimensions + "bit b;\n" + "endmodule\n", + "module m;\n" + " logic [x:y] a;\n" + " bit b;\n" + "endmodule\n"}, + {"module m;\n" + "logic a;\n" + "bit [pp:qq]b;\n" // packed dimensions + "endmodule\n", + "module m;\n" + " logic a;\n" + " bit [pp:qq] b;\n" + "endmodule\n"}, + {"module m;\n" + "logic [x:y]a;\n" // packed dimensions + "bit [pp:qq]b;\n" // packed dimensions + "endmodule\n", + "module m;\n" + " logic [ x:y] a;\n" + " bit [pp:qq] b;\n" + "endmodule\n"}, + {"module m;\n" + "logic [x:y]a;\n" // packed dimensions + "wire [pp:qq] [e:f]b;\n" // packed dimensions, 2D + "endmodule\n", + "module m;\n" + " logic [ x:y] a;\n" + " wire [pp:qq][e:f] b;\n" + "endmodule\n"}, + {"module m;\n" + "logic a [x:y];\n" // unpacked dimensions + "bit bbb;\n" + "endmodule\n", + "module m;\n" + " logic a [x:y];\n" + " bit bbb;\n" + "endmodule\n"}, + {"module m;\n" + "logic aaa ;\n" + "wire w [yy:zz];\n" // unpacked dimensions + "endmodule\n", + "module m;\n" + " logic aaa;\n" + " wire w [yy:zz];\n" + "endmodule\n"}, + {"module m;\n" + "logic aaa [s:t] ;\n" // unpacked dimensions + "wire w [yy:zz];\n" // unpacked dimensions + "endmodule\n", + "module m;\n" + " logic aaa[ s:t];\n" + " wire w [yy:zz];\n" + "endmodule\n"}, + {"module m;\n" + "logic aaa [s:t] ;\n" // unpacked dimensions + "wire w [yy:zz][u:v];\n" // unpacked dimensions, 2D + "endmodule\n", + "module m;\n" + " logic aaa[ s:t];\n" + " wire w [yy:zz] [u:v];\n" + // TODO(b/165323560): unwanted space between unpacked dimensions of 'w' + "endmodule\n"}, + {"module m;\n" + "qqq::rrr s;\n" // user-defined type + "wire [pp:qq]w;\n" // packed dimensions + "endmodule\n", + "module m;\n" + " qqq::rrr s;\n" + " wire [pp:qq] w;\n" + "endmodule\n"}, + {"module m;\n" + "qqq#(rr) s;\n" // parameterized type + "wire [pp:qq]w;\n" // packed dimensions + "endmodule\n", + "module m;\n" + " qqq #(rr) s;\n" + " wire [pp:qq] w;\n" + "endmodule\n"}, + {"module m;\n" + "logic a;\n" + "bit b;\n" + "my_module my_inst( );\n" // module instance separates alignment groups + "wire c;\n" + "bit d;\n" + "endmodule\n", + "module m;\n" + " logic a;\n" // these two are aligned + " bit b;\n" + " my_module my_inst ();\n" // module instance separates alignment groups + " wire c;\n" // these two are aligned + " bit d;\n" + "endmodule\n"}, + {"module m;\n" + "logic aaa = expr1;\n" + "bit b = expr2;\n" + "endmodule\n", + "module m;\n" + " logic aaa = expr1;\n" + " bit b = expr2;\n" // no alignment at '=' yet + "endmodule\n"}, + {"(* foo='{\"bar_.*\"} *)\n" // funny attribute + "module mattr;\n" + "(* attr1=\"value1\" *)\n" // attribute ignored + "ex_input_pins_t ex_input_pins;\n" + "(* attr2=\"value2\" *)\n" // attribute ignored + "ex_output_pins_t ex_output_pins;\n" + "(* attr3=\"value3\" *)\n" // attribute ignored + "ex wrap_ex ( );\n" + "endmodule\n", + "(* foo='{\"bar_.*\"} *)\n" + "module mattr;\n" + " (* attr1=\"value1\" *)\n" // indented + " ex_input_pins_t ex_input_pins;\n" // aligned + " (* attr2=\"value2\" *)\n" // indented + " ex_output_pins_t ex_output_pins;\n" + " (* attr3=\"value3\" *)\n" // indented + " ex wrap_ex ();\n" + "endmodule\n"}, + {"module mattr;\n" + "ex_input_pins_t ex_input_pins;\n" + "ex_output_pins_t ex_output_pins;\n" + "(* package_definition=\"ex_pkg\" *)\n" // attribute ignored + "ex wrap_ex (\n" + ".clk(ex_input_pins.clk),\n" + ".rst(ex_input_pins.rst),\n" + ".in(ex_input_pins.in)\n" + ");\n" + "endmodule\n", + "module mattr;\n" + " ex_input_pins_t ex_input_pins;\n" // aligned + " ex_output_pins_t ex_output_pins;\n" + " (* package_definition=\"ex_pkg\" *)\n" // indented + " ex wrap_ex (\n" + " .clk(ex_input_pins.clk),\n" + " .rst(ex_input_pins.rst),\n" + " .in (ex_input_pins.in)\n" // aligned + " );\n" + "endmodule\n"}, + {"module test;\n" + "bind entropy_src tlul_assert #(.EndpointType(\"Device\"))\n" + "tlul_assert_device (.clk_i, .rst_ni, .h2d(tl_i), .d2h(tl_o));\n" + "endmodule\n", + "module test;\n" + " bind entropy_src tlul_assert #(\n" + " .EndpointType(\"Device\")\n" + " ) tlul_assert_device (\n" + " .clk_i,\n" + " .rst_ni,\n" + " .h2d(tl_i),\n" + " .d2h(tl_o)\n" + " );\n" + "endmodule\n"}, + {"module test;\n" + "bind entropy_src tlul_assert #(.EndpointType(\"Device\"))\n" + "tlul_assert_device (.clk_i, .rst_ni,\n\n .h2d(tl_i),\n\n .d2h(tl_o));\n" + "endmodule\n", + "module test;\n" + " bind entropy_src tlul_assert #(\n" + " .EndpointType(\"Device\")\n" + " ) tlul_assert_device (\n" + " .clk_i,\n" + " .rst_ni,\n" + "\n" + " .h2d(tl_i),\n" + "\n" + " .d2h(tl_o)\n" + " );\n" + "endmodule\n"}, + {"bind expand_me long_name #(.W(W_CONST), .D(D_CONST)) instaaance_name (" + ".in(iiiiiiiin),\n\n .out(ooooooout),\n .clk(ccccccclk),\n\n" + ".in1234 (in),\n //c1\n .out1234(out),\n .clk1234(clk),);", + "bind expand_me long_name #(\n" + " .W(W_CONST),\n" + " .D(D_CONST)\n" + ") instaaance_name (\n" + " .in(iiiiiiiin),\n" + "\n" + " .out(ooooooout),\n" + " .clk(ccccccclk),\n" + "\n" + " .in1234 (in),\n" + " //c1\n" + " .out1234(out),\n" + " .clk1234(clk),\n" + ");\n"}, + {"initial // clock generation\n begin\n clk = 0;\n forever begin\n" + "#4ns clk = !clk;\n end\n end\n", + "initial // clock generation\n" + " begin\n" + " clk = 0;\n" + " forever begin\n" + " #4ns clk = !clk;\n" + " end\n" + " end\n"}, + {"module foo #(int x,int y) ;endmodule:foo\n", // parameters + "module foo #(\n" + " int x,\n" + " int y\n" + ");\n" // each parameter on its own line + "endmodule : foo\n"}, + {"module foo #(int x)(input y) ;endmodule:foo\n", + // parameter and port + "module foo #(\n" + " int x\n" + ") (\n" + " input y\n" + ");\n" // each paramater and port item should be on its own line + "endmodule : foo\n"}, + {"module foo #(parameter int x,parameter int y) ;endmodule:foo\n", + // parameters don't fit (also should be on its own line) + "module foo #(\n" + " parameter int x,\n" + " parameter int y\n" + ");\n" + "endmodule : foo\n"}, + {"module foo #(parameter int xxxx,parameter int yyyy) ;endmodule:foo\n", + // parameters don't fit + "module foo #(\n" + " parameter int xxxx,\n" + " parameter int yyyy\n" + ");\n" + "endmodule : foo\n"}, + {"module foo #(parameter int x = $clog2 (N) ,parameter int y ) " + ";endmodule:foo\n", + // parameters don't fit + "module foo #(\n" + " parameter int x = $clog2(N),\n" // no space after $clog2 + " parameter int y\n" + ");\n" + "endmodule : foo\n"}, + {"module foo #(//comment\n" + "parameter bar =1,\n" + "localparam baz =2" + ") ();" + "endmodule", + "module foo #( //comment\n" + " parameter bar = 1,\n" + " localparam baz = 2\n" + ") ();\n" + "endmodule\n"}, + {"module foo #(" + "parameter bar =1,//comment\n" + "localparam baz =2" + ") ();" + "endmodule", + "module foo #(\n" + " parameter bar = 1, //comment\n" + " localparam baz = 2\n" + ") ();\n" + "endmodule\n"}, + {"module foo #(" + "parameter bar =1," + "localparam baz =2//comment\n" + ") ();" + "endmodule", + "module foo #(\n" + " parameter bar = 1,\n" + " localparam baz = 2 //comment\n" + ") ();\n" + "endmodule\n"}, + {"module foo #(" + "parameter bar =1//comment\n" + ",localparam baz =2\n" + ") ();" + "endmodule", + "module foo #(\n" + " parameter bar = 1 //comment\n" + " , localparam baz = 2\n" + ") ();\n" + "endmodule\n"}, + {"module foo;" + // fit in one line + "parameter int i = '{\n" + "1,\n" + "2,\n" + "3\n" + "};\n" + "endmodule", + "module foo;\n" + " parameter int i = '{1, 2, 3};\n" + "endmodule\n"}, + {"module foo;" + // too long for one line, expand + "localparam logic [63:0] RC[24] = '{\n" + "64'h 1,\n" + "64'h 2,\n" + "64'h 3\n" + "};\n" + "endmodule", + "module foo;\n" + " localparam logic [63:0] RC[24] = '{\n" + " 64'h1,\n" + " 64'h2,\n" + " 64'h3\n" + " };\n" + "endmodule\n"}, + {"module foo;" + "parameter int i = '{\n" + // force expansion + "1, //\n" + "2,\n" + "3\n" + "};\n" + "endmodule", + "module foo;\n" + " parameter int i = '{\n" + " 1, //\n" + " 2,\n" + " 3\n" + " };\n" + "endmodule\n"}, + {"module foo;" + "localparam logic [63:0] RC[24] = '{\n" + "64'h 0000_0000_0000_0001, // 0\n" + "64'h 0000_0000_0000_8082, // 1\n" + "64'h 8000_0000_8000_8008 // 23\n" + "};\n" + "endmodule", + "module foo;\n" + " localparam logic [63:0] RC[24] = '{\n" + " 64'h0000_0000_0000_0001, // 0\n" + " 64'h0000_0000_0000_8082, // 1\n" + " 64'h8000_0000_8000_8008 // 23\n" + " };\n" + "endmodule\n"}, + {"module foo;" + // nest two patterns + "parameter logic [11:0] i = '{\n" + "'{1,2,3},\n" + "'{1,2,3}\n" + "};\n" + "endmodule", + "module foo;\n" + " parameter logic [11:0] i = '{\n" + " '{1, 2, 3},\n" + " '{1, 2, 3}\n" + " };\n" + "endmodule\n"}, + {"module foo;" + // nest two patterns, expand interior + "parameter logic [11:0] i = '{\n" + "'{1, //\n" + " 2,3},\n" + "'{1,2,3}\n" + "};\n" + "endmodule", + "module foo;\n" + " parameter logic [11:0] i = '{\n" + " '{\n" + " 1, //\n" + " 2,\n" + " 3\n" + " },\n" + " '{1, 2, 3}\n" + " };\n" + "endmodule\n"}, + {"module foo;" + // nest two patterns, expand both + "parameter nest [2] i = '{\n" + "'{first : 32'h0000_0001,\n" + " second : 32'h0000_0011,\n" + " third: 32'h0000_0111},\n" + "'{first : 32'h1000_0001,\n" + " second : 32'h1000_0011,\n" + " third: 32'h1000_0111}\n" + "};\n" + "endmodule", + "module foo;\n" + " parameter nest [2] i = '{\n" + " '{\n" + " first : 32'h0000_0001,\n" + " second : 32'h0000_0011,\n" + " third: 32'h0000_0111\n" + " },\n" + " '{\n" + " first : 32'h1000_0001,\n" + " second : 32'h1000_0011,\n" + " third: 32'h1000_0111\n" + " }\n" + " };\n" + "endmodule\n"}, + {"module foo;" + // nest three patterns + "parameter logic [11:0] i = '{\n" + "'{'{1,2,3},4}\n" + "};\n" + "endmodule", + "module foo;\n" + " parameter logic [11:0] i = '{\n" + " '{'{1, 2, 3}, 4}\n" + " };\n" + "endmodule\n"}, + {"module foo;" + // nest three patterns, expand interior + "parameter logic [11:0] i = '{\n" + "'{\n" + "'{first : 32'h0000_0001,\n" + " second : 32'h0000_0011,\n" + " third: 32'h0000_0111},\n" + " 4},\n" + " 5,\n" + " '{1,2,3}\n" + "};\n" + "endmodule", + "module foo;\n" + " parameter logic [11:0] i = '{\n" + " '{\n" + " '{\n" + " first : 32'h0000_0001,\n" + " second : 32'h0000_0011,\n" + " third: 32'h0000_0111\n" + " },\n" + " 4\n" + " },\n" + " 5,\n" + " '{1, 2, 3}\n" + " };\n" + "endmodule\n"}, + {"module top;" + "foo#( \"test\" ) foo( );" + "bar#( \"test\" ,5) bar( );" + "endmodule\n", + "module top;\n" + " foo #(\"test\") foo ();\n" // module instantiation, string arg + " bar #(\"test\", 5) bar ();\n" + "endmodule\n"}, + {"module top;" + "foo#( `\"test`\" ) foo( );" + "bar#( `\"test`\" ,5) bar( );" + "endmodule\n", + "module top;\n" + " foo #(`\"test`\") foo ();\n" // module instantiation, eval string arg + " bar #(`\"test`\", 5) bar ();\n" + "endmodule\n"}, + {"`ifdef FOO\n" + " module bar;endmodule\n" + "`endif\n", + "`ifdef FOO\n" + "module bar;\n" + "endmodule\n" + "`endif\n"}, + {"`ifdef FOO\n" + " module bar;endmodule\n" + "`else module baz;endmodule\n" + "`endif\n", + "`ifdef FOO\n" + "module bar;\n" + "endmodule\n" + "`else\n" + "module baz;\n" + "endmodule\n" + "`endif\n"}, + {"`ifdef FOO\n" + " module bar;endmodule\n" + "`else /* glue me */ module baz;endmodule\n" + "`endif\n", + "`ifdef FOO\n" + "module bar;\n" + "endmodule\n" + "`else /* glue me */\n" + "module baz;\n" + "endmodule\n" + "`endif\n"}, + {"`ifdef FOO\n" + " module bar;endmodule\n" + "`else// different unit\n" + " module baz;endmodule\n" + "`endif\n", + "`ifdef FOO\n" + "module bar;\n" + "endmodule\n" + "`else // different unit\n" + "module baz;\n" + "endmodule\n" + "`endif\n"}, + + // unary: + - ! ~ & | ^ ~& ~| ~^ ^~ + {"module m;foo bar(.x(-{a,b}));endmodule", + "module m;\n" + " foo bar (.x(-{a, b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x(!{a,b}));endmodule", + "module m;\n" + " foo bar (.x(!{a, b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x(~{a,b}));endmodule", + "module m;\n" + " foo bar (.x(~{a, b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x(&{a,b}));endmodule", + "module m;\n" + " foo bar (.x(&{a, b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x(|{a,b}));endmodule", + "module m;\n" + " foo bar (.x(|{a, b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x(^{a,b}));endmodule", + "module m;\n" + " foo bar (.x(^{a, b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x(~&{a,b}));endmodule", + "module m;\n" + " foo bar (.x(~&{a, b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x(~|{a,b}));endmodule", + "module m;\n" + " foo bar (.x(~|{a, b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x(~^{a,b}));endmodule", + "module m;\n" + " foo bar (.x(~^{a, b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x(^~{a,b}));endmodule", + "module m;\n" + " foo bar (.x(^~{a, b}));\n" + "endmodule\n"}, + + // binary: + - * / % & | ^ ^~ ~^ && || + {"module m;foo bar(.x(a+b));endmodule", + "module m;\n" + " foo bar (.x(a + b));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a-b));endmodule", + "module m;\n" + " foo bar (.x(a - b));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a*b));endmodule", + "module m;\n" + " foo bar (.x(a * b));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a/b));endmodule", + "module m;\n" + " foo bar (.x(a / b));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a%b));endmodule", + "module m;\n" + " foo bar (.x(a % b));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a&b));endmodule", + "module m;\n" + " foo bar (.x(a & b));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a|b));endmodule", + "module m;\n" + " foo bar (.x(a | b));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a^b));endmodule", + "module m;\n" + " foo bar (.x(a ^ b));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a^~b));endmodule", + "module m;\n" + " foo bar (.x(a ^~ b));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a~^b));endmodule", + "module m;\n" + " foo bar (.x(a ~^ b));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a&&b));endmodule", + "module m;\n" + " foo bar (.x(a && b));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a||b));endmodule", + "module m;\n" + " foo bar (.x(a || b));\n" + "endmodule\n"}, + + // {a} op {b} + {"module m;foo bar(.x({a}+{b}));endmodule", + "module m;\n" + " foo bar (.x({a} + {b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x({a}-{b}));endmodule", + "module m;\n" + " foo bar (.x({a} - {b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x({a}*{b}));endmodule", + "module m;\n" + " foo bar (.x({a} * {b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x({a}/{b}));endmodule", + "module m;\n" + " foo bar (.x({a} / {b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x({a}%{b}));endmodule", + "module m;\n" + " foo bar (.x({a} % {b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x({a}&{b}));endmodule", + "module m;\n" + " foo bar (.x({a} & {b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x({a}|{b}));endmodule", + "module m;\n" + " foo bar (.x({a} | {b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x({a}^{b}));endmodule", + "module m;\n" + " foo bar (.x({a} ^ {b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x({a}^~{b}));endmodule", + "module m;\n" + " foo bar (.x({a} ^~ {b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x({a}~^{b}));endmodule", + "module m;\n" + " foo bar (.x({a} ~^ {b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x({a}&&{b}));endmodule", + "module m;\n" + " foo bar (.x({a} && {b}));\n" + "endmodule\n"}, + {"module m;foo bar(.x({a}||{b}));endmodule", + "module m;\n" + " foo bar (.x({a} || {b}));\n" + "endmodule\n"}, + + // (a) op (b) + {"module m;foo bar(.x((a)+(b)));endmodule", + "module m;\n" + " foo bar (.x((a) + (b)));\n" + "endmodule\n"}, + {"module m;foo bar(.x((a)-(b)));endmodule", + "module m;\n" + " foo bar (.x((a) - (b)));\n" + "endmodule\n"}, + {"module m;foo bar(.x((a)*(b)));endmodule", + "module m;\n" + " foo bar (.x((a) * (b)));\n" + "endmodule\n"}, + {"module m;foo bar(.x((a)/(b)));endmodule", + "module m;\n" + " foo bar (.x((a) / (b)));\n" + "endmodule\n"}, + {"module m;foo bar(.x((a)%(b)));endmodule", + "module m;\n" + " foo bar (.x((a) % (b)));\n" + "endmodule\n"}, + {"module m;foo bar(.x((a)&(b)));endmodule", + "module m;\n" + " foo bar (.x((a) & (b)));\n" + "endmodule\n"}, + {"module m;foo bar(.x((a)|(b)));endmodule", + "module m;\n" + " foo bar (.x((a) | (b)));\n" + "endmodule\n"}, + {"module m;foo bar(.x((a)^(b)));endmodule", + "module m;\n" + " foo bar (.x((a) ^ (b)));\n" + "endmodule\n"}, + {"module m;foo bar(.x((a)^~(b)));endmodule", + "module m;\n" + " foo bar (.x((a) ^~ (b)));\n" + "endmodule\n"}, + {"module m;foo bar(.x((a)~^(b)));endmodule", + "module m;\n" + " foo bar (.x((a) ~^ (b)));\n" + "endmodule\n"}, + {"module m;foo bar(.x((a)&&(b)));endmodule", + "module m;\n" + " foo bar (.x((a) && (b)));\n" + "endmodule\n"}, + {"module m;foo bar(.x((a)||(b)));endmodule", + "module m;\n" + " foo bar (.x((a) || (b)));\n" + "endmodule\n"}, + + // a[b] op c + {"module m;foo bar(.x(a[b]+c));endmodule", + "module m;\n" + " foo bar (.x(a[b] + c));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a[b]-c));endmodule", + "module m;\n" + " foo bar (.x(a[b] - c));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a[b]*c));endmodule", + "module m;\n" + " foo bar (.x(a[b] * c));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a[b]/c));endmodule", + "module m;\n" + " foo bar (.x(a[b] / c));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a[b]%c));endmodule", + "module m;\n" + " foo bar (.x(a[b] % c));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a[b]&c));endmodule", + "module m;\n" + " foo bar (.x(a[b] & c));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a[b]|c));endmodule", + "module m;\n" + " foo bar (.x(a[b] | c));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a[b]^c));endmodule", + "module m;\n" + " foo bar (.x(a[b] ^ c));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a[b]^~c));endmodule", + "module m;\n" + " foo bar (.x(a[b] ^~ c));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a[b]~^c));endmodule", + "module m;\n" + " foo bar (.x(a[b] ~^ c));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a[b]&&c));endmodule", + "module m;\n" + " foo bar (.x(a[b] && c));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a[b]||c));endmodule", + "module m;\n" + " foo bar (.x(a[b] || c));\n" + "endmodule\n"}, + + // misc + {"module m;foo bar(.x(a[1:0]^b[2:1]));endmodule", + "module m;\n" + " foo bar (.x(a[1:0] ^ b[2:1]));\n" + "endmodule\n"}, + + {"module m;foo bar(.x(a[b] | b[c]));endmodule", + "module m;\n" + " foo bar (.x(a[b] | b[c]));\n" + "endmodule\n"}, + {"module m;foo bar(.x(a[b] & b[c]));endmodule", + "module m;\n" + " foo bar (.x(a[b] & b[c]));\n" + "endmodule\n"}, + + {"module m;foo bar(.x((a^c)^(b^ ~c)));endmodule", + "module m;\n" + " foo bar (.x((a ^ c) ^ (b ^ ~c)));\n" + "endmodule\n"}, + {"module m;foo bar(.x((a^c)^(b^~c)));endmodule", + "module m;\n" + " foo bar (.x((a ^ c) ^ (b ^~ c)));\n" + "endmodule\n"}, + {"module m;foo bar(.x((a^{c,d})^(b^^{c,d})));endmodule", + "module m;\n" + " foo bar (\n" + " .x((a ^ {c, d}) ^ (b ^ ^{c, d}))\n" + " );\n" + "endmodule\n"}, + + {// module items mixed with preprocessor conditionals and comments + " module foo;\n" + "// comment1\n" + " `ifdef SIM\n" + "// comment2\n" + " `elsif SYN\n" + " // comment3\n" + " `else\n" + "// comment4\n" + " `endif\n" + "// comment5\n" + " endmodule", + "module foo;\n" + " // comment1\n" + "`ifdef SIM\n" + " // comment2\n" + "`elsif SYN\n" + " // comment3\n" + "`else\n" + " // comment4\n" + "`endif\n" + " // comment5\n" + "endmodule\n"}, + {" module bar;wire foo;reg bear;endmodule\n", + "module bar;\n" + " wire foo;\n" + " reg bear;\n" // aligned + "endmodule\n"}, + {" module bar;initial\nbegin a<=b . c ; end endmodule\n", + "module bar;\n" + " initial begin\n" + " a <= b.c;\n" + " end\n" + "endmodule\n"}, + {"module foo ();\nif (1) begin\n$finish(\n" + " 1 ); $finish ();\n end\nendmodule", + "module foo ();\n" + " if (1) begin\n" + " $finish(1);\n" + " $finish();\n" + " end\n" + "endmodule\n"}, + {" module bar;for(genvar i = 0 ; i<N ; ++ i ) begin end endmodule\n", + "module bar;\n" + " for (genvar i = 0; i < N; ++i) begin\n" + " end\n" + "endmodule\n"}, + {" module bar;for(genvar i = 0 ; i!=N ; i ++ ) begin " + "foo f;end endmodule\n", + "module bar;\n" + " for (genvar i = 0; i != N; i++) begin\n" + " foo f;\n" + " end\n" + "endmodule\n"}, + { + "module block_generate;\n" + "`ASSERT(blah)\n" + "generate endgenerate endmodule\n", + "module block_generate;\n" + " `ASSERT(blah)\n" + " generate\n" + " endgenerate\n" + "endmodule\n", + }, + { + "module conditional_generate;\n" + "if(foo) ; \t" // null action + "endmodule\n", + "module conditional_generate;\n" + " if (foo);\n" + "endmodule\n", + }, + { + "module conditional_generate;\n" + "if(foo[a*b+c]) ; \t" // null action + "endmodule\n", + "module conditional_generate;\n" + " if (foo[a*b+c]);\n" // allow compact expressions inside [] + "endmodule\n", + }, + { + "module conditional_generate;\n" + "if(foo)begin\n" + "`ASSERT()\n" + "`COVER()\n" + " end\n" + "endmodule\n", + "module conditional_generate;\n" + " if (foo) begin\n" + " `ASSERT()\n" + " `COVER()\n" + " end\n" + "endmodule\n", + }, + { + "module conditional_generate;\n" + "`ASSERT()\n" + "if(foo)begin\n" + " end\n" + "`COVER()\n" + "endmodule\n", + "module conditional_generate;\n" + " `ASSERT()\n" + " if (foo) begin\n" + " end\n" + " `COVER()\n" + "endmodule\n", + }, + { + "module conditional_generate;\n" + "if(foo)begin\n" + " // comment1\n" + " // comment2\n" + " end\n" + "endmodule\n", + "module conditional_generate;\n" + " if (foo) begin\n" + " // comment1\n" + " // comment2\n" + " end\n" + "endmodule\n", + }, + { + "module m ;" + "for(genvar i=0; ;)\n; " // null generate statement + "for(genvar j=0 ;; )\n; " // null generate statement + "endmodule", + "module m;\n" + " for (genvar i = 0;;);\n" + " for (genvar j = 0;;);\n" + "endmodule\n", + }, + { + "module m ;" + "for (genvar f = 0; f < N; f++) begin " + "assign x = y; assign y = z;" + "end endmodule", + "module m;\n" + " for (genvar f = 0; f < N; f++) begin\n" + " assign x = y;\n" + " assign y = z;\n" + " end\n" + "endmodule\n", + }, + { + // standalone genvar statement + "module m ;" + "genvar f;" + "for(f=0; f<N; f ++ )begin " + "end endmodule", + "module m;\n" + " genvar f;\n" + " for (f = 0; f < N; f++) begin\n" + " end\n" + "endmodule\n", + }, + { + // multiple arguments to genvar statement + "module m ;" + "genvar f, g;" + "for(f=0; f<N; f ++ )begin " + "end for(g=N; g>0; g -- )begin " + "end endmodule", + "module m;\n" + " genvar f, g;\n" + " for (f = 0; f < N; f++) begin\n" + " end\n" + " for (g = N; g > 0; g--) begin\n" + " end\n" + "endmodule\n", + }, + { + // multiple genvar statements + "module m ;" + "genvar f;" + "genvar g;" + "for(f=0; f<N; f ++ )begin " + "end for(g=N; g>0; g -- )begin " + "end endmodule", + "module m;\n" + " genvar f;\n" + " genvar g;\n" + " for (f = 0; f < N; f++) begin\n" + " end\n" + " for (g = N; g > 0; g--) begin\n" + " end\n" + "endmodule\n", + }, + { + "module event_control ;" + "always@ ( posedge clk )z<=y;" + "endmodule\n", + "module event_control;\n" + " always @(posedge clk) z <= y;\n" + "endmodule\n", + }, + { + "module always_if ;" + "always@ ( posedge clk ) if (expr) z<=y;" + "endmodule\n", + "module always_if;\n" + " always @(posedge clk)\n" // doesn't fit + " if (expr)\n" + " z <= y;\n" + "endmodule\n", + }, + { + "module always_if ;" + "always@* if (expr) z<=y;" + "endmodule\n", + "module always_if;\n" + " always @* if (expr) z <= y;\n" // fits + "endmodule\n", + }, + { + "module \talways_if_else ;" + "always@* if (expr) z<=y; else g<=0;" + "endmodule\n", + "module always_if_else;\n" + " always @*\n" + " if (expr) z <= y;\n" // fits + " else g <= 0;\n" // fits + "endmodule\n", + }, + { + "module \talways_if_else_if ;" + "always@* if (expr) z<=y; else if (w) g<=0;" + "endmodule\n", + "module always_if_else_if;\n" + " always @*\n" + " if (expr) z <= y;\n" // fits + " else if (w) g <= 0;\n" // fits + "endmodule\n", + }, + { + "module \talways_if_else_if_else ;" + "always@* if (expr) z<=y; else if (w) g<=0;else h<=1;" + "endmodule\n", + "module always_if_else_if_else;\n" + " always @*\n" + " if (expr) z <= y;\n" // fits + " else if (w) g <= 0;\n" // fits + " else h <= 1;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(b, c)" + " for (;;)\ts = y;" + "endmodule", + "module m;\n" + " always @(b, c) for (;;) s = y;\n" // fits + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " for (i=0;i<k;++i)\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " for (i = 0; i < k; ++i)\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " repeat (jj+kk)\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " repeat (jj + kk)\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " foreach(jj[kk])\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " foreach (jj[kk])\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " while(jj[kk])\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " while (jj[kk])\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " do s=y;while(jj[kk]);\t" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " do\n" + " s = y;\n" + " while (jj[kk]);\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk) \n" + " case(jj)\tS:s = y;endcase\t" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " case (jj)\n" + " S: s = y;\n" + " endcase\n" + "endmodule\n", + }, + + { + "module always_if ;" + "always@ ( posedge clk ) if (expr) z<=y;" + "endmodule\n", + "module always_if;\n" + " always @(posedge clk)\n" // doesn't fit + " if (expr)\n" + " z <= y;\n" + "endmodule\n", + }, + { + "module always_if ;" + "always@* if (expr) z<=y;" + "endmodule\n", + "module always_if;\n" + " always @* if (expr) z <= y;\n" // fits + "endmodule\n", + }, + { + "module \talways_if_else ;" + "always@* if (expr) z<=y; else g<=0;" + "endmodule\n", + "module always_if_else;\n" + " always @*\n" + " if (expr) z <= y;\n" // fits + " else g <= 0;\n" // fits + "endmodule\n", + }, + { + "module \talways_if_else_if ;" + "always@* if (expr) z<=y; else if (w) g<=0;" + "endmodule\n", + "module always_if_else_if;\n" + " always @*\n" + " if (expr) z <= y;\n" // fits + " else if (w) g <= 0;\n" // fits + "endmodule\n", + }, + { + "module \talways_if_else_if_else ;" + "always@* if (expr) z<=y; else if (w) g<=0;else h<=1;" + "endmodule\n", + "module always_if_else_if_else;\n" + " always @*\n" + " if (expr) z <= y;\n" // fits + " else if (w) g <= 0;\n" // fits + " else h <= 1;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(b, c)" + " for (;;)\ts = y;" + "endmodule", + "module m;\n" + " always @(b, c) for (;;) s = y;\n" // fits + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " for (i=0;i<k;++i)\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " for (i = 0; i < k; ++i)\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " repeat (jj+kk)\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " repeat (jj + kk)\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " foreach(jj[kk])\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " foreach (jj[kk])\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " while(jj[kk])\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " while (jj[kk])\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " do s=y;while(jj[kk]);\t" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " do\n" + " s = y;\n" + " while (jj[kk]);\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk) \n" + " case(jj)\tS:s = y;endcase\t" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " case (jj)\n" + " S: s = y;\n" + " endcase\n" + "endmodule\n", + }, + + { + "module always_if ;" + "always@ ( posedge clk ) if (expr) z<=y;" + "endmodule\n", + "module always_if;\n" + " always @(posedge clk)\n" // doesn't fit + " if (expr)\n" + " z <= y;\n" + "endmodule\n", + }, + { + "module always_if ;" + "always@* if (expr) z<=y;" + "endmodule\n", + "module always_if;\n" + " always @* if (expr) z <= y;\n" // fits + "endmodule\n", + }, + { + "module \talways_if_else ;" + "always@* if (expr) z<=y; else g<=0;" + "endmodule\n", + "module always_if_else;\n" + " always @*\n" + " if (expr) z <= y;\n" // fits + " else g <= 0;\n" // fits + "endmodule\n", + }, + { + "module \talways_if_else_if ;" + "always@* if (expr) z<=y; else if (w) g<=0;" + "endmodule\n", + "module always_if_else_if;\n" + " always @*\n" + " if (expr) z <= y;\n" // fits + " else if (w) g <= 0;\n" // fits + "endmodule\n", + }, + { + "module \talways_if_else_if_else ;" + "always@* if (expr) z<=y; else if (w) g<=0;else h<=1;" + "endmodule\n", + "module always_if_else_if_else;\n" + " always @*\n" + " if (expr) z <= y;\n" // fits + " else if (w) g <= 0;\n" // fits + " else h <= 1;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(b, c)" + " for (;;)\ts = y;" + "endmodule", + "module m;\n" + " always @(b, c) for (;;) s = y;\n" // fits + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " for (i=0;i<k;++i)\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " for (i = 0; i < k; ++i)\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " repeat (jj+kk)\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " repeat (jj + kk)\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " foreach(jj[kk])\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " foreach (jj[kk])\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " while(jj[kk])\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " while (jj[kk])\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " do s=y;while(jj[kk]);\t" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " do\n" + " s = y;\n" + " while (jj[kk]);\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk) \n" + " case(jj)\tS:s = y;endcase\t" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " case (jj)\n" + " S: s = y;\n" + " endcase\n" + "endmodule\n", + }, + + { + "module always_if ;" + "always@ ( posedge clk ) if (expr) z<=y;" + "endmodule\n", + "module always_if;\n" + " always @(posedge clk)\n" // doesn't fit + " if (expr)\n" + " z <= y;\n" + "endmodule\n", + }, + { + "module always_if ;" + "always@* if (expr) z<=y;" + "endmodule\n", + "module always_if;\n" + " always @* if (expr) z <= y;\n" // fits + "endmodule\n", + }, + { + "module \talways_if_else ;" + "always@* if (expr) z<=y; else g<=0;" + "endmodule\n", + "module always_if_else;\n" + " always @*\n" + " if (expr) z <= y;\n" // fits + " else g <= 0;\n" // fits + "endmodule\n", + }, + { + "module \talways_if_else_if ;" + "always@* if (expr) z<=y; else if (w) g<=0;" + "endmodule\n", + "module always_if_else_if;\n" + " always @*\n" + " if (expr) z <= y;\n" // fits + " else if (w) g <= 0;\n" // fits + "endmodule\n", + }, + { + "module \talways_if_else_if_else ;" + "always@* if (expr) z<=y; else if (w) g<=0;else h<=1;" + "endmodule\n", + "module always_if_else_if_else;\n" + " always @*\n" + " if (expr) z <= y;\n" // fits + " else if (w) g <= 0;\n" // fits + " else h <= 1;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(b, c)" + " for (;;)\ts = y;" + "endmodule", + "module m;\n" + " always @(b, c) for (;;) s = y;\n" // fits + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " for (i=0;i<k;++i)\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " for (i = 0; i < k; ++i)\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " repeat (jj+kk)\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " repeat (jj + kk)\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " foreach(jj[kk])\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " foreach (jj[kk])\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " while(jj[kk])\ts = y;" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " while (jj[kk])\n" + " s = y;\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk)" + " do s=y;while(jj[kk]);\t" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " do\n" + " s = y;\n" + " while (jj[kk]);\n" + "endmodule\n", + }, + { + "module m;\n" + "always @(posedge clk) \n" + " case(jj)\tS:s = y;endcase\t" + "endmodule", + "module m;\n" + " always @(posedge clk)\n" + " case (jj)\n" + " S: s = y;\n" + " endcase\n" + "endmodule\n", + }, + + { + // begin/end with labels + "module m ;initial begin:yyy\tend:yyy endmodule", + "module m;\n" + " initial begin : yyy\n" + " end : yyy\n" + "endmodule\n", + }, + { + // conditional generate begin/end with labels + "module m ;if\n( 1) begin:yyy\tend:yyy endmodule", + "module m;\n" + " if (1) begin : yyy\n" + " end : yyy\n" + "endmodule\n", + }, + { + // begin/end with labels, nested + "module m ;initial begin:yyy if(1)begin:zzz " + "end:zzz\tend:yyy endmodule", + "module m;\n" + " initial begin : yyy\n" + " if (1) begin : zzz\n" + " end : zzz\n" + " end : yyy\n" + "endmodule\n", + }, + { + "module m ;initial begin # 1 x<=y ;end endmodule", + "module m;\n" + " initial begin\n" + " #1 x <= y;\n" + " end\n" + "endmodule\n", + }, + { + "module m ;initial begin x<=y ; y<=z;end endmodule", + "module m;\n" + " initial begin\n" + " x <= y;\n" + " y <= z;\n" + " end\n" + "endmodule\n", + }, + { + "module m ;initial begin # 10 x<=y ; # 20 y<=z;end endmodule", + "module m;\n" + " initial begin\n" + " #10 x <= y;\n" + " #20 y <= z;\n" + " end\n" + "endmodule\n", + }, + { + // qualified variables + "module m ;initial begin automatic int a; " + " static byte s=0;end endmodule", + "module m;\n" + " initial begin\n" + " automatic int a;\n" + " static byte s = 0;\n" // aligned + " end\n" + "endmodule\n", + }, + { + "module m ;initial begin automatic int a,b; " + " static byte s,t;end endmodule", + "module m;\n" + " initial begin\n" + " automatic int a, b;\n" + " static byte s, t;\n" + " end\n" + "endmodule\n", + }, + { + "module m ;initial begin static byte a=1,b=0;end endmodule", + "module m;\n" + " initial begin\n" + " static byte a = 1, b = 0;\n" + " end\n" + "endmodule\n", + }, + { + "module m ;initial begin const int a=0;end endmodule", + "module m;\n" + " initial begin\n" + " const int a = 0;\n" + " end\n" + "endmodule\n", + }, + { + "module m ;initial begin automatic const int a=0;end endmodule", + "module m;\n" + " initial begin\n" + " automatic const int a = 0;\n" + " end\n" + "endmodule\n", + }, + { + "module m ;initial begin const var automatic int a=0;end endmodule", + "module m;\n" + " initial begin\n" + " const var automatic int a = 0;\n" + " end\n" + "endmodule\n", + }, + { + "module m ;initial begin static byte s ={<<{a}};end endmodule", + "module m;\n" + " initial begin\n" + " static byte s = {<<{a}};\n" + " end\n" + "endmodule\n", + }, + { + "module m ;initial begin static int s ={>>4{a}};end endmodule", + "module m;\n" + " initial begin\n" + " static int s = {>>4{a}};\n" + " end\n" + "endmodule\n", + }, + { + "module m; final assert (expr ) ;endmodule", + "module m;\n" + " final assert (expr);\n" + "endmodule\n", + }, + { + "module m; final begin\tassert (expr ) ;end endmodule", + "module m;\n" + " final begin\n" + " assert (expr);\n" + " end\n" + "endmodule\n", + }, + { + "module m; final assume (expr ) ;endmodule", + "module m;\n" + " final assume (expr);\n" + "endmodule\n", + }, + { + "module m; final cover (expr ) ;endmodule", + "module m;\n" + " final cover (expr);\n" + "endmodule\n", + }, + { + // two consecutive clocking declarations in modules + " module mcd ; " + "clocking cb @( posedge clk);\t\tendclocking " + "clocking cb2 @ (posedge clk\n); endclocking endmodule", + "module mcd;\n" + " clocking cb @(posedge clk);\n" + " endclocking\n" + " clocking cb2 @(posedge clk);\n" + " endclocking\n" + "endmodule\n", + }, + { + // two consecutive clocking declarations in modules, with end labels + " module mcd ; " + "clocking cb @( posedge clk);\t\tendclocking: cb " + "clocking cb2 @ (posedge clk\n); endclocking :cb2 endmodule", + "module mcd;\n" + " clocking cb @(posedge clk);\n" + " endclocking : cb\n" + " clocking cb2 @(posedge clk);\n" + " endclocking : cb2\n" + "endmodule\n", + }, + { + // clocking declarations with ports in modules + " module mcd ; " + "clocking cb @ (posedge clk\n); input a; output b; endclocking " + "endmodule", + "module mcd;\n" + " clocking cb @(posedge clk);\n" + " input a;\n" + " output b;\n" + " endclocking\n" + "endmodule\n", + }, + { + // DPI import declarations in modules + "module mdi;" + "import \"DPI-C\" function int add(\n) ;" + "import \"DPI-C\"\t\tfunction int\nsleep( input int secs );" + "import \"DPI-C\"\t\tfunction int\nwake( input int secs, output bit " + "[2:0] z);" + "endmodule", + "module mdi;\n" + " import \"DPI-C\" function int add();\n" + " import \"DPI-C\" function int sleep(\n" + " input int secs\n" + " );\n" + " import \"DPI-C\" function int wake(\n" + " input int secs,\n" + " output bit [2:0] z\n" + " );\n" + "endmodule\n", + }, + { + // DPI export declarations in modules + "module m;" + "export \"DPI-C\" function get;" + "export \"DPI-C\" function mhpmcounter_get;\n" + "export \"DPI-C\"\t\tfunction int\nwake( input int secs, output bit " + "[2:0] z);" + "endmodule", + "module m;\n" + " export \"DPI-C\" function get;\n" + " export \"DPI-C\"\n" + " function mhpmcounter_get;\n" // doesn't fit in 40-col + " export \"DPI-C\" function int wake(\n" + " input int secs,\n" + " output bit [2:0] z\n" + " );\n" + "endmodule\n", + }, + {// Two consecutive EOL comments in kDPIImportItem + "import \"DPI-C\" context function void foo(\n" + " input bit first,\n" + " // c3\n" + " // c3+\n" + " input bit second\n" + ");\n", + "import \"DPI-C\" context\n" + " function void foo(\n" + " input bit first,\n" + " // c3\n" + " // c3+\n" + " input bit second\n" + ");\n"}, + {"export \"\" t;\n", "export \"\" t;\n"}, + {"import \"DPI-C\" context function void func(input bit impl_i," + "input bit op_i," + "input bit [5:0] mode_i," + "input bit [3:0][31:0] iv_i," + "input bit [2:0] key_len_i," + "input bit [7:0][31:0] key_i," + "input bit [7:0] data_i[]," + "output bit [7:0] data_o[]);", + "import \"DPI-C\" context\n" + " function void func(\n" + " input bit impl_i,\n" + " input bit op_i,\n" + " input bit [5:0] mode_i,\n" + " input bit [3:0][31:0] iv_i,\n" + " input bit [2:0] key_len_i,\n" + " input bit [7:0][31:0] key_i,\n" + " input bit [7:0] data_i [],\n" + " output bit [7:0] data_o []\n" + ");\n"}, + {// module with system task call w or w/o parentheses + "module m; initial begin #10 $display(\"foo\"); $display(\"bar\");" + "end endmodule", + "module m;\n" + " initial begin\n" + " #10 $display(\"foo\");\n" + " $display(\"bar\");\n" + " end\n" + "endmodule\n"}, + {// module with system task call + "module m; initial begin #10 $display; $display;" + "end endmodule", + "module m;\n" + " initial begin\n" + " #10 $display;\n" + " $display;\n" + " end\n" + "endmodule\n"}, + +}; + +TEST(FormatterEndToEndTest, ModuleFormatterTestCases) { + RunFormatterTestCases40(kModuleFormatterTestCases); +} + +} // namespace +} // namespace formatter +} // namespace verilog
diff --git a/verible/verilog/formatting/formatter_test.cc b/verible/verilog/formatting/formatter_test.cc index 02853d2..4b50ab9 100644 --- a/verible/verilog/formatting/formatter_test.cc +++ b/verible/verilog/formatting/formatter_test.cc
@@ -1,4 +1,4 @@ -// Copyright 2017-2020 The Verible Authors. +// Copyright 2017-2026 The Verible Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -13,42 +13,24 @@ // limitations under the License. // Test cases in this file should be *insensitive* to wrapping penalties. -// Penalty-sensitive tests belong in formatter_tuning_test.cc. -// Methods for keeping tests penalty insensitive: -// * Short lines and partitions. Lines that fit need no wrapping. -// * Forced line breaks using //comments (reduce decision-making) +// Penalty-sensitive tests belong in formatter-tuning_test.cc. +// Thematic end-to-end cases live in sibling formatter_*_test.cc files. +// New GitHub-issue regressions belong in formatter_issue_regression_test.cc. #include "verible/verilog/formatting/formatter.h" -#include <cctype> -#include <cstddef> #include <memory> #include <sstream> -#include <string> #include <string_view> -#include <vector> #include "absl/log/die_if_null.h" #include "absl/status/status.h" -#include "absl/strings/match.h" -#include "absl/strings/str_split.h" -#include "gmock/gmock.h" #include "gtest/gtest.h" -#include "verible/common/formatting/align.h" -#include "verible/common/formatting/basic-format-style.h" -#include "verible/common/strings/display-utils.h" -#include "verible/common/strings/position.h" #include "verible/common/text/text-structure.h" -#include "verible/common/util/interval.h" #include "verible/common/util/logging.h" #include "verible/verilog/analysis/verilog-analyzer.h" #include "verible/verilog/formatting/format-style.h" - -#undef EXPECT_OK -#define EXPECT_OK(value) EXPECT_TRUE((value).ok()) - -#undef ASSERT_OK -#define ASSERT_OK(value) ASSERT_TRUE((value).ok()) +#include "verible/verilog/formatting/formatter-test-utils.h" namespace verilog { namespace formatter { @@ -63,12 +45,7 @@ static constexpr VerilogPreprocess::Config kDefaultPreprocess; using absl::StatusCode; -using testing::HasSubstr; -using verible::AlignmentPolicy; -using verible::IndentationStyle; -using verible::LineNumberSet; -// Tests that clean output passes. TEST(VerifyFormattingTest, NoError) { const std::string_view code("class c;endclass\n"); const std::unique_ptr<VerilogAnalyzer> analyzer = @@ -114,15 +91,6 @@ EXPECT_EQ(status.code(), StatusCode::kDataLoss); } -struct FormatterTestCase { - std::string_view input; - std::string_view expected; -}; - -static const LineNumberSet kEnableAllLines; - -// Test that the expected output is produced with the formatter using a custom -// FormatStyle. TEST(FormatterTest, FormatCustomStyleTest) { static constexpr FormatterTestCase kTestCases[] = { {"", ""}, @@ -146,21107 +114,18 @@ } } -static constexpr FormatterTestCase kFormatterTestCases[] = { +// Small smoke subset; thematic cases live in sibling formatter_*_test.cc files. +static constexpr FormatterTestCase kSmokeFormatterTestCases[] = { {"", ""}, {"\n", "\n"}, {"\n\n", "\n\n"}, {"\t//comment\n", "//comment\n"}, {"\t/*comment*/\n", "/*comment*/\n"}, {"\t/*multi-line\ncomment*/\n", "/*multi-line\ncomment*/\n"}, - // preprocessor test cases - {"`include \"path/to/file.vh\"\n", "`include \"path/to/file.vh\"\n"}, - {"`include `\"path/to/file.vh`\"\n", "`include `\"path/to/file.vh`\"\n"}, - {"`define FOO\n", "`define FOO\n"}, - {"`define FOO BAR\n", "`define FOO BAR\n"}, - {"`define FOO\n" - "`define BAR\n", - "`define FOO\n" - "`define BAR\n"}, - {"`define FOO_``BAR 1\n", "`define FOO_``BAR 1\n"}, - {"`define FOO_```BAR 1\n", "`define FOO_```BAR 1\n"}, - {"`define FOO ``BAR\n", "`define FOO ``BAR\n"}, - {"`define A``B``C 2\n", "`define A``B``C 2\n"}, - {"`define A(x)``y\n", "`define A(x) ``y\n"}, - {"`define FOO_``BAR\n", "`define FOO_``BAR\n"}, - {"`ifndef FOO\n" - "`endif // FOO\n", - "`ifndef FOO\n" - "`endif // FOO\n"}, - {"`ifndef FOO\n" - "`define BAR\n" - "`endif\n", - "`ifndef FOO\n" - "`define BAR\n" - "`endif\n"}, - {"`ifndef FOO\n" - "`define BAR\n\n" // one more blank line - "`endif\n", - "`ifndef FOO\n" - "`define BAR\n\n" - "`endif\n"}, - {"`define FOO \\\n" - " BAR\n", - "`define FOO \\\n" // TODO(b/72527558): right align '\'s to column limit - " BAR\n"}, - {"`define FOOOOOOOOOOOOOOOO \\\n" - " BAAAAAAAAAAAAAAAAR BAAAAAAAAAAAAAZ;\n", - "`define FOOOOOOOOOOOOOOOO \\\n" // macro text starts at '\' - " BAAAAAAAAAAAAAAAAR BAAAAAAAAAAAAAZ;\n"}, - {"`ifdef FOO\n" - " `fine()\n" - "`else\n" - " `error()\n" - "`endif\n", - "`ifdef FOO\n" - "`fine()\n" - "`else\n" - "`error()\n" - "`endif\n"}, - {"`ifdef FOO\n" - " `fine()\n" - "`else // trouble\n" - " `error()\n" - "`endif\n", - "`ifdef FOO\n" - "`fine()\n" - "`else // trouble\n" - "`error()\n" - "`endif\n"}, - {"`ifdef FOO\n" - " `fine()\n" - "`else /* trouble */\n" - " `error()\n" - "`endif\n", - "`ifdef FOO\n" - "`fine()\n" - "`else /* trouble */\n" - "`error()\n" - "`endif\n"}, - {" // lonely comment\n", "// lonely comment\n"}, - {" // first comment\n" - " // last comment\n", - "// first comment\n" - "// last comment\n"}, - {" // starting comment\n" - " `define FOO\n", - "// starting comment\n" - "`define FOO\n"}, - {" `define FOO\n" - " // trailing comment\n", - "`define FOO\n" - "// trailing comment\n"}, - {" `define FOO\n" - " // trailing comment 1\n" - " // trailing comment 2\n", - "`define FOO\n" - "// trailing comment 1\n" - "// trailing comment 2\n"}, - { - " `define FOO \\\n" // multiline macro definition - " 1\n", - "`define FOO \\\n" - " 1\n" // TODO(b/141517267): Reflowing macro definitions - }, - {"`define FOO \\\n" // multiline macro definition - " b\n", - "`define FOO \\\n" // no need to align '\' - " b\n"}, - {"`define FOO \\\n" // multiline macro definition - " a + \\\n" - " b\n", - "`define FOO \\\n" // preserve spacing before '\' - " a + \\\n" // to stay aligned with this one - " b\n"}, - {" // comment with backslash\\\n", "// comment with backslash\\\n"}, - {// macro with MacroArg tokens as arguments - "`FOOOOOO(\nbar1...\n,\nbar2...\n,\nbar3...\n,\nbar4\n)\n", - "`FOOOOOO(bar1..., bar2..., bar3...,\n" - " bar4)\n"}, - {// macro declaration exceeds line length limit - "`F_MACRO(looooooong_type if_it_fits_I_sits)\n", - "`F_MACRO(\n" - " looooooong_type if_it_fits_I_sits)\n"}, - {// macro call with not fitting arguments - "`MACRO_FFFFFFFFFFF(" - "type_a_aaaa,type_b_bbbbb," - "type_c_cccccc,type_d_dddddddd," - "type_e_eeeeeeee,type_f_ffff)\n", - "`MACRO_FFFFFFFFFFF(\n" - " type_a_aaaa, type_b_bbbbb,\n" - " type_c_cccccc, type_d_dddddddd,\n" - " type_e_eeeeeeee, type_f_ffff)\n"}, - {// nested macro call - "`MACRO_FFFFFFFFFFF( " - "`A(type_a_aaaa), `B(type_b_bbbbb), " - "`C(type_c_cccccc), `D(type_d_dddddddd), " - "`E(type_e_eeeeeeee), `F(type_f_ffff))\n", - "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa),\n" - " `B(type_b_bbbbb),\n" - " `C(type_c_cccccc),\n" - " `D(type_d_dddddddd),\n" - " `E(type_e_eeeeeeee),\n" - " `F(type_f_ffff))\n"}, - {// two-level nested macro call - "`MACRO_FFFFFFFFFFF( " - "`A(type_a_aaaa, `B(type_b_bbbbb)), " - "`C(type_c_cccccc, `D(type_d_dddddddd)), " - "`E(type_e_eeeeeeee, `F(type_f_ffff)))\n", - "`MACRO_FFFFFFFFFFF(\n" - " `A(type_a_aaaa, `B(type_b_bbbbb)),\n" - " `C(type_c_cccccc,\n" - " `D(type_d_dddddddd)),\n" - " `E(type_e_eeeeeeee,\n" - " `F(type_f_ffff)))\n"}, - {// three-level nested macro call - "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa," - "`B(type_b_bbbbb,`C(type_c_cccccc)))," - "`D(type_d_dddddddd,`E(type_e_eeeeeeee," - "`F(type_f_ffff))))\n", - "`MACRO_FFFFFFFFFFF(\n" - " `A(type_a_aaaa,\n" - " `B(type_b_bbbbb,\n" - " `C(type_c_cccccc))),\n" - " `D(type_d_dddddddd,\n" - " `E(type_e_eeeeeeee,\n" - " `F(type_f_ffff))))\n"}, - {// macro call with MacroArg tokens as arugments and with semicolon - "`FOOOOOO(\nbar1...\n,\nbar2...\n,\nbar3...\n,\nbar4\n);\n", - "`FOOOOOO(bar1..., bar2..., bar3...,\n" - " bar4);\n"}, - {// macro declaration exceeds line length limit and contains semicolon - "`F_MACRO(looooooong_type if_it_fits_I_sits);\n", - "`F_MACRO(\n" - " looooooong_type if_it_fits_I_sits);\n"}, - {// macro call with not fitting arguments and semicolon - "`MACRO_FFFFFFFFFFF(" - "type_a_aaaa,type_b_bbbbb," - "type_c_cccccc,type_d_dddddddd," - "type_e_eeeeeeee,type_f_ffff);\n", - "`MACRO_FFFFFFFFFFF(\n" - " type_a_aaaa, type_b_bbbbb,\n" - " type_c_cccccc, type_d_dddddddd,\n" - " type_e_eeeeeeee, type_f_ffff);\n"}, - {// nested macro call with semicolon - "`MACRO_FFFFFFFFFFF( " - "`A(type_a_aaaa), `B(type_b_bbbbb), " - "`C(type_c_cccccc), `D(type_d_dddddddd), " - "`E(type_e_eeeeeeee), `F(type_f_ffff));\n", - "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa),\n" - " `B(type_b_bbbbb),\n" - " `C(type_c_cccccc),\n" - " `D(type_d_dddddddd),\n" - " `E(type_e_eeeeeeee),\n" - " `F(type_f_ffff));\n"}, - {// two-level nested macro call with semicolon - "`MACRO_FFFFFFFFFFF( " - "`A(type_a_aaaa, `B(type_b_bbbbb)), " - "`C(type_c_cccccc, `D(type_d_dddddddd)), " - "`E(type_e_eeeeeeee, `F(type_f_ffff)));\n", - "`MACRO_FFFFFFFFFFF(\n" - " `A(type_a_aaaa, `B(type_b_bbbbb)),\n" - " `C(type_c_cccccc,\n" - " `D(type_d_dddddddd)),\n" - " `E(type_e_eeeeeeee,\n" - " `F(type_f_ffff)));\n"}, - {// three-level nested macro call with semicolon - "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa," - "`B(type_b_bbbbb,`C(type_c_cccccc)))," - "`D(type_d_dddddddd,`E(type_e_eeeeeeee," - "`F(type_f_ffff))));\n", - "`MACRO_FFFFFFFFFFF(\n" - " `A(type_a_aaaa,\n" - " `B(type_b_bbbbb,\n" - " `C(type_c_cccccc))),\n" - " `D(type_d_dddddddd,\n" - " `E(type_e_eeeeeeee,\n" - " `F(type_f_ffff))));\n"}, - {// macro call with no args - "`FOOOOOO()\n", "`FOOOOOO()\n"}, - {// macro call with no args and semicolon - "`FOOOOOO();\n", "`FOOOOOO();\n"}, - {// macro call with no args and semicolon separated by space - "`FOOOOOO() ;\n", "`FOOOOOO();\n"}, - {// macro call with comments in argument list - "`FOO(aa, //aa\nbb , // bb\ncc)\n", - "`FOO(aa, //aa\n" - " bb, // bb\n" - " cc)\n"}, - {// macro call with comment before first argument - "`FOO(//aa\naa, //bb\nbb , // cc\ncc)\n", - "`FOO( //aa\n" - " aa, //bb\n" - " bb, // cc\n" - " cc)\n"}, - {// macro call with argument including trailing EOL comment - "`FOO(aa, bb,//cc\ndd)\n", - "`FOO(aa, bb, //cc\n" - " dd)\n"}, - {// macro call with argument including EOL comment on own line - "`FOOOO(aa, bb,\n//cc\ndd)\n", - "`FOOOO(aa, bb,\n" - " //cc\n" - " dd)\n"}, - {" // leading comment\n" - " `define FOO \\\n" // multiline macro definition - "1\n" - " // trailing comment\n", - "// leading comment\n" - "`define FOO \\\n" - "1\n" // TODO(b/141517267): Reflowing macro definitions - "// trailing comment\n"}, - {// macro call after define - "`define FOO BAR\n" - " `FOO( bar )\n", - "`define FOO BAR\n" - "`FOO(bar)\n"}, - {// multiple argument macro call - " `FOO( bar , baz )\n", "`FOO(bar, baz)\n"}, - {// long macro call breaking - " `ASSERT_INIT(S, (D == 4 && K inside {0, 1}) ||" - " (D == 3 && K== 4))\n", - "`ASSERT_INIT(\n" - " S, (D == 4 && K inside {0, 1}) ||\n" - " (D == 3 && K == 4))\n"}, - {// long macro call breaking - " `AINIT(S, (D == 4 && K inside {0, 1}) ||" - " (D == 3 && K== 4))\n", - "`AINIT(S, (D == 4 && K inside {0, 1}) ||\n" - " (D == 3 && K == 4))\n"}, - {// long macro call breaking - " `ASSERT_INIT(S, D == 4 && K inside {0, 1})\n", - "`ASSERT_INIT(S,\n" - " D == 4 && K inside {0, 1})\n"}, - {// macro call in function - "function void foo( ); foo=`FOO( bar , baz ) ; endfunction\n", - "function void foo();\n" - " foo = `FOO(bar, baz);\n" - "endfunction\n"}, - {// nested macro call in function - "function void foo( ); foo=`FOO( `BAR ( baz ) ) ; endfunction\n", - "function void foo();\n" - " foo = `FOO(`BAR(baz));\n" - "endfunction\n"}, - {// macro call in class - "class foo; `FOO ( bar , baz ) ; endclass\n", - "class foo;\n" - " `FOO(bar, baz);\n" - "endclass\n"}, - {// nested macro call in class - "class foo; `FOO ( `BAR ( baz1 , baz2 ) ) ; endclass\n", - "class foo;\n" - " `FOO(`BAR(baz1, baz2));\n" - "endclass\n"}, - {// multi-line macro arg "aaaa..." should start on its own line, - // even if its first line would fit under the column limit - "`CHECK_FATAL(rd_tr,\n" - " aaaa == zzz;\n" - " ggg == vv::w;,\n" - " \"Failed to ..........\")\n", - "`CHECK_FATAL(rd_tr,\n" - " aaaa == zzz;\n" - " ggg == vv::w;,\n" - " \"Failed to ..........\")\n"}, - {// macro call nested with function call containing an ifdef - "`J(D(`ifdef e))\n", - "`J(D(\n" - " `ifdef e))\n"}, - - // `uvm macros indenting - { - // simple test case - "`uvm_object_utils_begin(aa)\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_object_utils_end\n", - "`uvm_object_utils_begin(aa)\n" - " `uvm_field_int(bb, UVM_DEFAULT)\n" - " `uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_object_utils_end\n", - }, - {// multiple uvm.*begin - uvm.*end ranges - "`uvm_object_utils_begin(aa)\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_object_utils_end\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_object_utils_begin(bb)\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_object_utils_end\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n", - "`uvm_object_utils_begin(aa)\n" - " `uvm_field_int(bb, UVM_DEFAULT)\n" - " `uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_object_utils_end\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_object_utils_begin(bb)\n" - " `uvm_field_int(bb, UVM_DEFAULT)\n" - " `uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_object_utils_end\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n"}, - { - // empty uvm.*begin - uvm.*end range - "`uvm_component_utils_begin(aa)\n" - "`uvm_component_utils_end\n", - "`uvm_component_utils_begin(aa)\n" - "`uvm_component_utils_end\n", - }, - { - // uvm_field_utils - "`uvm_field_utils_begin(aa)\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_field_utils_end\n", - "`uvm_field_utils_begin(aa)\n" - " `uvm_field_int(bb, UVM_DEFAULT)\n" - " `uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_field_utils_end\n", - }, - { - // uvm_component - "`uvm_component_utils_begin(aa)\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n", - "`uvm_component_utils_begin(aa)\n" - " `uvm_field_int(bb, UVM_DEFAULT)\n" - " `uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n", - }, - { - // nested uvm macros - "`uvm_field_int(l0, UVM_DEFAULT)\n" - "`uvm_component_utils_begin(l0)\n" - "`uvm_field_int(l1, UVM_DEFAULT)\n" - "`uvm_component_utils_begin(l1)\n" - "`uvm_field_int(l2, UVM_DEFAULT)\n" - "`uvm_component_utils_begin(l2)\n" - "`uvm_field_int(l3, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n" - "`uvm_field_int(l2, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n" - "`uvm_field_int(l1, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n" - "`uvm_field_int(l0, UVM_DEFAULT)\n", - "`uvm_field_int(l0, UVM_DEFAULT)\n" - "`uvm_component_utils_begin(l0)\n" - " `uvm_field_int(l1, UVM_DEFAULT)\n" - " `uvm_component_utils_begin(l1)\n" - " `uvm_field_int(l2, UVM_DEFAULT)\n" - " `uvm_component_utils_begin(l2)\n" - " `uvm_field_int(l3, UVM_DEFAULT)\n" - " `uvm_component_utils_end\n" - " `uvm_field_int(l2, UVM_DEFAULT)\n" - " `uvm_component_utils_end\n" - " `uvm_field_int(l1, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n" - "`uvm_field_int(l0, UVM_DEFAULT)\n", - }, - { - // non-uvm macro - "`my_macro_begin(aa)\n" - "`my_field(b)\n" - "`my_field(c)\n" - "`my_macro_end\n", - "`my_macro_begin(aa)\n" - "`my_field(b)\n" - "`my_field(c)\n" - "`my_macro_end\n", - }, - { - // unbalanced uvm macros: missing uvm.*end macro - "`uvm_component_utils_begin(aa)\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n", - "`uvm_component_utils_begin(aa)\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n", - }, - { - // unbalanced uvm macros: missing uvm.*begin macro - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n", - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n", - }, - {// unbalanced uvm macros: missing _begin macro between - // matching uvm.*begin-uvm.*end macros - "`uvm_component_utils_begin(aa)\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_component_utils_begin(aa)\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n", - "`uvm_component_utils_begin(aa)\n" - " `uvm_field_int(bb, UVM_DEFAULT)\n" - " `uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n" - "`uvm_field_int(bb, UVM_DEFAULT)\n" - "`uvm_component_utils_begin(aa)\n" - " `uvm_field_int(bb, UVM_DEFAULT)\n" - " `uvm_field_int(cc, UVM_DEFAULT)\n" - "`uvm_component_utils_end\n"}, - - // top-level directive test cases - {"`timescale 1ns/1ps\n", // - "`timescale 1ns / 1ps\n"}, - - // Multiple compiler directives should remain on separate lines - // (regression test for bug where they were merged onto one line) - {"`timescale 1 ps / 1 ps\n" - "`default_nettype none\n", - "`timescale 1 ps / 1 ps\n" - "`default_nettype none\n"}, - {"`resetall\n" - "`timescale 1ns/1ps\n" - "`default_nettype wire\n", - "`resetall\n" - "`timescale 1ns / 1ps\n" - "`default_nettype wire\n"}, - // Test with multiple different compiler directives - {"`resetall\n" - "`celldefine\n" - "`timescale 1ns/1ps\n" - "`default_nettype none\n", - "`resetall\n" - "`celldefine\n" - "`timescale 1ns / 1ps\n" - "`default_nettype none\n"}, - // Test with compiler directives before module - {"`timescale 1ps/1ps\n" - "`default_nettype none\n" - "module foo;endmodule\n", - "`timescale 1ps / 1ps\n" - "`default_nettype none\n" - "module foo;\nendmodule\n"}, - // Test with various compiler directives - {"`suppress_faults\n" - "`enable_portfaults\n" - "`delay_mode_distributed\n", - "`suppress_faults\n" - "`enable_portfaults\n" - "`delay_mode_distributed\n"}, - {"`default_decay_time 10\n" - "`default_trireg_strength 50\n", - "`default_decay_time 10\n" - "`default_trireg_strength 50\n"}, - // Alignment should ignore compiler directives; declarations align normally. - // Place directives at top-level between modules (valid SystemVerilog). - {"`timescale 1ns/1ps\n" - "module m;\n" - " logic a;\n" - " logic very_long_name;\n" - "endmodule\n" - "`default_nettype none\n" - "module n;\n" - " logic b;\n" - "endmodule\n", - "`timescale 1ns / 1ps\n" - "module m;\n" - " logic a;\n" - " logic very_long_name;\n" - "endmodule\n" - "`default_nettype none\n" - "module n;\n" - " logic b;\n" - "endmodule\n"}, - {"`begin_keywords \"1800-2017\"\n" - "module test;endmodule\n" - "`end_keywords\n", - "`begin_keywords \"1800-2017\"\n" - "module test;\nendmodule\n" - "`end_keywords\n"}, - - // parameter test cases - { - " parameter int foo=0 ;", - "parameter int foo = 0;\n", - }, - { - " parameter int foo=bar [ 0 ] ;", // index expression - "parameter int foo = bar[0];\n", - }, - { - " parameter int foo=bar [ a+b ] ;", // binary inside index expr - "parameter int foo = bar[a+b];\n", // allowed to be 0 spaces - // (preserved) - }, - { - " parameter int foo=bar [ a+ b ] ;", // binary inside index expr - "parameter int foo = bar[a+b];\n", // allowed to be 0 spaces - // (symmetrized) - }, - { - " parameter int foo=bar [ a +b ] ;", // compact binary inside - "parameter int foo = bar[a+b];\n", // index expression - }, - { - " parameter int foo=bar [ a +b ] ;", // compact binary inside - "parameter int foo = bar[a+b];\n", // index expression - }, - { - // with line continuations - " parameter \\\nint \\\nfoo=a+ \\\nb ;", - "parameter\\\n int\\\n foo = a +\\\n b;\n", - // TODO(fangism): should text following a line continuation hang-indent? - }, - // unary prefix expressions - { - " parameter int foo=- 1 ;", - "parameter int foo = -1;\n", - }, - { - " parameter int foo=+ 7 ;", - "parameter int foo = +7;\n", - }, - { - " parameter int foo=- J ;", - "parameter int foo = -J;\n", - }, - { - " parameter int foo=- ( y ) ;", - "parameter int foo = -(y);\n", - }, - { - " parameter int foo=- ( z*y ) ;", - "parameter int foo = -(z * y);\n", - }, - { - " parameter int foo=- z*- y ;", - "parameter int foo = -z * -y;\n", - }, - { - " parameter int foo=( - 2 ) ;", // - "parameter int foo = (-2);\n", - }, - { - " parameter int foo=$bar(- z,- y ) ;", - "parameter int foo = $bar(-z, -y);\n", - }, - {" parameter int a=b&~(c<<d);", "parameter int a = b & ~(c << d);\n"}, - {" parameter int a=~~~~b;", "parameter int a = ~~~~b;\n"}, - {" parameter int a = ~ ~ ~ ~ b;", "parameter int a = ~~~~b;\n"}, - {" parameter int a = ~--b;", "parameter int a = ~--b;\n"}, - {" parameter int a = ~ --b;", "parameter int a = ~--b;\n"}, - {" parameter int a = ~ ++ b;", "parameter int a = ~++b;\n"}, - {" parameter int a=--b- --c;", "parameter int a = --b - --c;\n"}, - // ^~ and ~^ are bitwise nor, but ^ ~ isn't - {" parameter int a=b^~(c<<d);", "parameter int a = b ^~ (c << d);\n"}, - {" parameter int a=b~^(c<<d);", "parameter int a = b ~^ (c << d);\n"}, - {" parameter int a=b^ ~ (c<<d);", "parameter int a = b ^ ~(c << d);\n"}, - {" parameter int a=b ^ ~(c<<d);", "parameter int a = b ^ ~(c << d);\n"}, - - {" parameter int a=b^~{c};", "parameter int a = b ^~ {c};\n"}, - {" parameter int a=b~^{c};", "parameter int a = b ~^ {c};\n"}, - {" parameter int a=b^ ~ {c};", "parameter int a = b ^ ~{c};\n"}, - {" parameter int a=b ^ ~{c};", "parameter int a = b ^ ~{c};\n"}, - - {" parameter int a={a}^{b};", "parameter int a = {a} ^ {b};\n"}, - {" parameter int a={b}^(c);", "parameter int a = {b} ^ (c);\n"}, - {" parameter int a=b[0]^ {c};", "parameter int a = b[0] ^ {c};\n"}, - {" parameter int a={c}^a[b];", "parameter int a = {c} ^ a[b];\n"}, - {" parameter int a=(c)^{a[b]};", "parameter int a = (c) ^ {a[b]};\n"}, - - {" parameter int a={^{a,^b},c};", "parameter int a = {^{a, ^b}, c};\n"}, - {" parameter int a=(a)^(^d[e]^{c});", - "parameter int a = (a) ^ (^d[e] ^ {c});\n"}, - {" parameter int a=(a)^(^d[e]^f[g]);", - "parameter int a = (a) ^ (^d[e] ^ f[g]);\n"}, - {" parameter int a=(b^(c^(d^e)));", - "parameter int a = (b ^ (c ^ (d ^ e)));\n"}, - {" parameter int a={b^{c^{d^e}}};", - "parameter int a = {b ^ {c ^ {d ^ e}}};\n"}, - {" parameter int a={b^{c[d^e]}};", - "parameter int a = {b ^ {c[d^e]}};\n"}, // allow 0 spaces inside "[d^e]" - {" parameter int a={(b^c),(d^^e)};", - "parameter int a = {(b ^ c), (d ^ ^e)};\n"}, - - {" parameter int a={(b[x]^{c[y]})};", - "parameter int a = {(b[x] ^ {c[y]})};\n"}, - {" parameter int a={d^^e[f] ^ (g)};", - "parameter int a = {d ^ ^e[f] ^ (g)};\n"}, - - // ~| is unary reduction NOR, |~ and | ~ aren't - {" parameter int a=b| ~(c<<d);", "parameter int a = b | ~(c << d);\n"}, - {" parameter int a=b|~(c<<d);", "parameter int a = b | ~(c << d);\n"}, - {" parameter int a=b| ~| ( c<<d);", "parameter int a = b | ~|(c << d);\n"}, - {" parameter int a=b| ~| ~| ( c<<d);", - "parameter int a = b | ~|~|(c << d);\n"}, - {" parameter int a=b| ~~~( c<<d);", - "parameter int a = b | ~~~(c << d);\n"}, - { - " parameter int foo=- - 1 ;", // double negative - "parameter int foo = - -1;\n", - }, - { - " parameter int ternary=1?2:3;", - "parameter int ternary = 1 ? 2 : 3;\n", - }, - { - " parameter int ternary=a?b:c;", - "parameter int ternary = a ? b : c;\n", - }, - { - " parameter int ternary=\"a\"?\"b\":\"c\";", - "parameter int ternary = \"a\" ? \"b\" : \"c\";\n", - }, - { - " parameter int t=`\"a`\"?`\"b`\":`\"c`\";", - "parameter int t = `\"a`\" ? `\"b`\" : `\"c`\";\n", - }, - { - " parameter int ternary=(a)?(b):(c);", - "parameter int ternary = (a) ? (b) : (c);\n", - }, - { - " parameter int ternary={a}?{b}:{c};", - "parameter int ternary = {a} ? {b} : {c};\n", - }, - { - " parameter int long_ternary=cond?long_option_t:long_option_f;", - "parameter int long_ternary = cond ?\n" - " long_option_t : long_option_f;\n", - }, - { - " parameter int break_two=cond\n" - "? a_really_long_option_number_one:a_really_long_option_number_two;", - "parameter int break_two = cond ?\n" - " a_really_long_option_number_one :\n" - " a_really_long_option_number_two;\n", - }, - { - " assign ternary=1?2:3;", - "assign ternary = 1 ? 2 : 3;\n", - }, - { - " assign ternary=a?b:c;", - "assign ternary = a ? b : c;\n", - }, - { - " assign ternary={a}?{b}:{c};", - "assign ternary = {a} ? {b} : {c};\n", - }, - { - " assign break_two=cond\n" - "? a_really_long_option_number_one:a_really_long_option_number_two;", - "assign break_two = cond ?\n" - " a_really_long_option_number_one :\n" - " a_really_long_option_number_two;\n", - }, - { - "assign prefetch_d =\n" - "lookup_grant_ic0 ? (lookup_addr_aligned + ADDR) :\n" - " addr_i;", - "assign prefetch_d = lookup_grant_ic0 ?\n" - " (lookup_addr_aligned + ADDR) :\n" - " addr_i;\n", - }, - { - "assign prefetch_d =\n" - "lookup_grant_ic0 ? (lookup_addr + 1) :\n" - " addr_i;", - "assign prefetch_d = lookup_grant_ic0 ?\n" - " (lookup_addr + 1) : addr_i;\n", - }, - { - "module test;\n" - " assign next = // EOL\n" - " foo ? '0 :\n" - " cnt;\n" - "endmodule\n", - "module test;\n" - " assign next = // EOL\n" - " foo ? '0 : cnt;\n" - "endmodule\n", - }, - { - "module test;\n" - " assign next = foo // EOL\n" - " ? '0 :\n" - " cnt;\n" - "endmodule\n", - "module test;\n" - " assign next = foo // EOL\n" - " ? '0 : cnt;\n" - "endmodule\n", - }, - { - "module test;\n" - " assign next = foo ? // EOL\n" - " '0 :\n" - " cnt;\n" - "endmodule\n", - "module test;\n" - " assign next = foo ? // EOL\n" - " '0 : cnt;\n" - "endmodule\n", - }, - { - "module test;\n" - " assign next = foo ? '0 // EOL\n" - " :\n" - " cnt;\n" - "endmodule\n", - "module test;\n" - " assign next = foo ? '0 // EOL\n" - " : cnt;\n" - "endmodule\n", - }, - { - "module test;\n" - " assign next = foo ? '0 : // EOL\n" - " cnt;\n" - "endmodule\n", - "module test;\n" - " assign next = foo ? '0 : // EOL\n" - " cnt;\n" - "endmodule\n", - }, - { - "module test;\n" - " assign next = foo ? '0 : // EOL\n" - " bar ? '1 : '0;\n" - "endmodule\n", - "module test;\n" - " assign next = foo ? '0 : // EOL\n" - " bar ? '1 : '0;\n" - "endmodule\n", - }, - { - "module test;\n" - " assign next = foo ? '0 : // EOL\n" - " bar // EOL2\n" - " ? '1 : '0;\n" - "endmodule\n", - "module test;\n" - " assign next = foo ? '0 : // EOL\n" - " bar // EOL2\n" - " ? '1 : '0;\n" - "endmodule\n", - }, - { - "module test;\n" - " assign next = foo ? '0 : // EOL\n" - " bar ? // EOL2\n" - " '1 : '0;\n" - "endmodule\n", - "module test;\n" - " assign next = foo ? '0 : // EOL\n" - " bar ? // EOL2\n" - " '1 : '0;\n" - "endmodule\n", - }, - { - "module test;\n" - " assign next = foo ? '0 : // EOL\n" - " bar ? '1 // EOL2\n" - " : '0;\n" - "endmodule\n", - "module test;\n" - " assign next = foo ? '0 : // EOL\n" - " bar ? '1 // EOL2\n" - " : '0;\n" - "endmodule\n", - }, - { - "module test;\n" - " assign next = foo ? '0 : // EOL\n" - " bar ? '1 : // EOL2\n" - " '0;\n" - "endmodule\n", - "module test;\n" - " assign next = foo ? '0 : // EOL\n" - " bar ? '1 : // EOL2\n" - " '0;\n" - "endmodule\n", - }, - { - "assign prefetch_d =\n" - "lookup_ic0 ? // EOL\n" - " (lookup_addr + 1) :// BOO\n" - " addr_i;", - "assign prefetch_d = lookup_ic0 ? // EOL\n" - " (lookup_addr + 1) : // BOO\n" - " addr_i;\n", - }, - { - "module test;\n" - " assign next = (foo) ? '0 : // clear \n" - " (bar) ? cnt + 1'b1 : // count \n" - " cnt;\n" - "endmodule\n", - "module test;\n" - " assign next = (foo) ? '0 : // clear \n" - " (bar) ? cnt + 1'b1 : // count \n" - " cnt;\n" - "endmodule\n", - }, - { - "module test;\n" - " assign next = // FOO\n" - " (foo) ? '0 : // clear \n" - " (bar) ? cnt + 1'b1 : // count \n" - " cnt;\n" - "endmodule\n", - "module test;\n" - " assign next = // FOO\n" - " (foo) ? '0 : // clear \n" - " (bar) ? cnt + 1'b1 : // count \n" - " cnt;\n" - "endmodule\n", - }, - { - "module test;\n" - " assign next = foo ? a_really_long_identifier : // EOL\n" - " cnt;\n" - "endmodule\n", - "module test;\n" - " assign next = foo ?\n" - " a_really_long_identifier : // EOL\n" - " cnt;\n" - "endmodule\n", - }, - { - "module test;\n" - " assign next = foo ? a_really_long_identifier : // EOL\n" - " another_really_long_identifier;\n" - "endmodule\n", - "module test;\n" - " assign next = foo ?\n" - " a_really_long_identifier : // EOL\n" - " another_really_long_identifier;\n" - "endmodule\n", - }, - { - "module test;\n" - " assign next = foo ? a_really_long_identifier : " - "another_really_long_identifier;\n" - "endmodule\n", - "module test;\n" - " assign next = foo ?\n" - " a_really_long_identifier :\n" - " another_really_long_identifier;\n" - "endmodule\n", - }, - { - "assign m = check ? {10'b0, foo} :\n" - " (bar && (baz == '0)) ? hello :\n" - " world ? temp1 : temp2;\n", - "assign m = check ? {10'b0, foo} :\n" - " (bar && (baz == '0)) ? hello :\n" - " world ? temp1 : temp2;\n", - }, - { - "assign {a, b} = !(c == d) ? {1'b0, e} :\n" - " ((e == f) && g) ?\n" - " {1'b0, f} : (h) ?\n" - " {1'b0, e} - 1'b1 :\n" - " {1'b0, e} + 1'b1;\n", - "assign {a, b} = !(c == d) ? {1'b0, e} :\n" - " ((e == f) && g) ? {1'b0, f} : (h) ?\n" - " {1'b0, e} - 1'b1 : {1'b0, e} + 1'b1;\n", - }, - { - "assign {aaaaaaaaaa, bbbbbbbbb} = {1'b0, cccccccccccccccccc[15:0]} +\n" - " {1'b0, ddddddddddddddddd[15:0]};\n", - "assign {aaaaaaaaaa, bbbbbbbbb} =\n" - " {1'b0, cccccccccccccccccc[15:0]} +\n" - " {1'b0, ddddddddddddddddd[15:0]};\n", - }, - { - "covergroup a(string b);\n" - "foobar: cross foo, bar {" - "ignore_bins baz = binsof(qux) intersect {1, 2, 3, 4, 5, 6, 7};" - "}\n" - "endgroup : a\n", - "covergroup a(string b);\n" - " foobar: cross foo, bar{\n" - " ignore_bins baz =\n" - " binsof (qux) intersect {\n" - " 1, 2, 3, 4, 5, 6, 7\n" - " };\n" - " }\n" - "endgroup : a\n", - }, - { - "assign {aa, bb} = {1'b0, cc} + {1'b0, dd};\n", - "assign {aa, bb} = {1'b0, cc} +\n" - " {1'b0, dd};\n", - }, - - // streaming operators - { - " parameter int b={ >> { a } } ;", - "parameter int b = {>>{a}};\n", - }, - { - " parameter int b={ >> { a , b, c } } ;", - "parameter int b = {>>{a, b, c}};\n", - }, - { - " parameter int b={ >> 4 { a } } ;", - "parameter int b = {>>4{a}};\n", - }, - { - " parameter int b={ >> byte { a } } ;", - "parameter int b = {>>byte{a}};\n", - }, - { - " parameter int b={ >> my_type_t { a } } ;", - "parameter int b = {>>my_type_t{a}};\n", - }, - { - " parameter int b={ >> `GET_TYPE { a } } ;", - "parameter int b = {>>`GET_TYPE{a}};\n", - }, - { - " parameter int b={ >> 4 {{ >> 2 { a } }} } ;", - "parameter int b = {>>4{{>>2{a}}}};\n", - }, - { - " parameter int b={ << { a } } ;", - "parameter int b = {<<{a}};\n", - }, - { - " parameter int b={ << { a , b, c } } ;", - "parameter int b = {<<{a, b, c}};\n", - }, - { - " parameter int b={ << 4 { a } } ;", - "parameter int b = {<<4{a}};\n", - }, - { - " parameter int b={ << byte { a } } ;", - "parameter int b = {<<byte{a}};\n", - }, - { - " parameter int b={ << my_type_t { a } } ;", - "parameter int b = {<<my_type_t{a}};\n", - }, - { - " parameter int b={ << `GET_TYPE { a } } ;", - "parameter int b = {<<`GET_TYPE{a}};\n", - }, - { - " parameter int b={ << 4 {{ << 2 { a } }} } ;", - "parameter int b = {<<4{{<<2{a}}}};\n", - }, - - // basic module test cases - {"module foo;endmodule:foo\n", - "module foo;\n" - "endmodule : foo\n"}, - {"module\nfoo\n;\nendmodule\n:\nfoo\n", - "module foo;\n" - "endmodule : foo\n"}, - {"module\tfoo\t;\tendmodule\t:\tfoo", - "module foo;\n" - "endmodule : foo\n"}, - {"module foo; // foo\n" - "endmodule:foo\n", - "module foo; // foo\n" - "endmodule : foo\n"}, - {"module foo;/* foo */endmodule:foo\n", - "module foo; /* foo */\n" - "endmodule : foo\n"}, - {"module pm #(\n" - "//comment\n" - ") (wire ww);\n" - "endmodule\n", - "module pm #(\n" - " //comment\n" // comment indented - ") (\n" - " wire ww\n" - ");\n" - "endmodule\n"}, - {"module pm ( ) ;\n" // empty ports list - "endmodule\n", - "module pm ();\n" - "endmodule\n"}, - {"module pm #(\n" - "//comment\n" - ") ( );\n" - "endmodule\n", - "module pm #(\n" - " //comment\n" // comment indented - ") ();\n" // (); grouped together - "endmodule\n"}, - {"`ifdef FOO\n" - " `ifndef BAR\n" - " `endif\n" - "`endif\n", - "`ifdef FOO\n" - "`ifndef BAR\n" - "`endif\n" - "`endif\n"}, - {"module foo(\n" - " `include \"ports.svh\"\n" - " ) ; endmodule\n", - "module foo (\n" - " `include \"ports.svh\"\n" - ");\n" - "endmodule\n"}, - {"module foo(\n" - " `define FOO\n" - "`undef\tFOO\n" - " ) ; endmodule\n", - "module foo (\n" - " `define FOO\n" - " `undef FOO\n" - ");\n" - "endmodule\n"}, - {"module foo( input x , output y ) ;endmodule:foo\n", - "module foo (\n" - " input x,\n" // aligned - " output y\n" - ");\n" - "endmodule : foo\n"}, - {"module foo(\n" - "// comment\n" - " input x , output y ) ;endmodule:foo\n", - "module foo (\n" - " // comment\n" - " input x,\n" // aligned - " output y\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input[2:0]x , output y [3:0] ) ;endmodule:foo\n", - // each port item should be on its own line - "module foo (\n" - " input [2:0] x,\n" // aligned - " output y[3:0]\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input wire x , output reg yy ) ;endmodule:foo\n", - "module foo (\n" - " input wire x,\n" // aligned - " output reg yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input wire x ,//c1\n" - "output reg yyy //c2\n" - " ) ;endmodule:foo\n", - "module foo (\n" - " input wire x, //c1\n" // aligned - " output reg yyy //c2\n" // aligned - ");\n" - "endmodule : foo\n"}, - {"module foo( input wire x ,/* c1 */\n" - "output reg yyy /* c2 */\n" - " ) ;endmodule:foo\n", - "module foo (\n" - " input wire x, /* c1 */\n" // aligned - " output reg yyy /* c2 */\n" // aligned - ");\n" - "endmodule : foo\n"}, - {"module foo(\n" - "// comment\n" - "input wire x ,//c1\n" - "output reg yyy //c2\n" - " ) ;endmodule:foo\n", - "module foo (\n" - " // comment\n" - " input wire x, //c1\n" // aligned - " output reg yyy //c2\n" // aligned - ");\n" - "endmodule : foo\n"}, - {"module foo(\n" - "/* comment */\n" - "input wire x ,/* c1 */\n" - "output reg yyy /* c2 */\n" - " ) ;endmodule:foo\n", - "module foo (\n" - " /* comment */\n" - " input wire x, /* c1 */\n" // aligned - " output reg yyy /* c2 */\n" // aligned - ");\n" - "endmodule : foo\n"}, - {"module foo( input wire x ,/* c1\n" - "c2\n" - "c3 */\n" - "output reg yyy /* c4 */\n" - " ) ;endmodule:foo\n", - "module foo (\n" - " input wire x, /* c1\n" - "c2\n" - "c3 */\n" // TODO: align multiline comments - " output reg yyy /* c4 */\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input wire x ,/* c1 */\n" - "output reg yyy,\n" - "output z // c2\n" - " ) ;endmodule:foo\n", - "module foo (\n" - " input wire x, /* c1 */\n" // aligned - " output reg yyy,\n" - " output z // c2\n" // aligned - ");\n" - "endmodule : foo\n"}, - {"module m(input logic [4:0] foo, // comment\n" - "input logic bar // comment\n" - " ) ;endmodule:m\n", - "module m (\n" - " input logic [4:0] foo, // comment\n" // aligned - " input logic bar // comment\n" // aligned - ");\n" - "endmodule : m\n"}, - {"module foo( input wire x , output yy ) ;endmodule:foo\n", - "module foo (\n" - " input wire x,\n" // aligned - " output yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input x , output reg yy ) ;endmodule:foo\n", - "module foo (\n" - " input x,\n" // aligned - " output reg yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input x , output reg[a:b]yy ) ;endmodule:foo\n", - "module foo (\n" - " input x,\n" // aligned - " output reg [a:b] yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input [a:b]x , output reg yy ) ;endmodule:foo\n", - "module foo (\n" - " input [a:b] x,\n" // aligned - " output reg yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input x , " - " output logic yy ) ;endmodule:foo\n", - "module foo (\n" - " input x,\n" // aligned - " output logic yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input [a:c]x , " - " output logic[a-b: c] yy ) ;endmodule:foo\n", - "module foo (\n" - " input [ a:c] x,\n" // aligned - " output logic [a-b:c] yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input [a:c]x , " - " output logic[a - b: c] yy ) ;endmodule:foo\n", - "module foo (\n" - " input [ a:c] x,\n" // aligned - " output logic [a - b:c] yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input [a:c]x , input zzz ," - " output logic[a - b: c] yy ) ;endmodule:foo\n", - "module foo (\n" - " input [ a:c] x,\n" // aligned []'s - " input zzz,\n" // aligned ids - " output logic [a - b:c] yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input [a:b]x , " - " output reg[e: f] yy ) ;endmodule:foo\n", - "module foo (\n" - " input [a:b] x,\n" // aligned - " output reg [e:f] yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input tri[aa: bb]x , " - " output reg[e: f] yy ) ;endmodule:foo\n", - "module foo (\n" - " input tri [aa:bb] x,\n" // aligned - " output reg [ e:f] yy\n" // TODO(b/70310743): align ':' - ");\n" - "endmodule : foo\n"}, - {"module foo( input [a:b][c:d]x , " - " output reg[e: f] yy ) ;endmodule:foo\n", - "module foo (\n" - " input [a:b][c:d] x,\n" // aligned - " output reg [e:f] yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input wire x [j:k], output reg yy ) ;endmodule:foo\n", - "module foo (\n" - " input wire x [j:k],\n" // aligned - " output reg yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input wire x , output reg yy [j:k]) ;endmodule:foo\n", - "module foo (\n" - " input wire x,\n" // aligned - " output reg yy[j:k]\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input wire x [p:q], output reg yy [j:k]) ;endmodule:foo\n", - "module foo (\n" - " input wire x [p:q],\n" // aligned - " output reg yy[j:k]\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input wire x [p:q][r:s], output reg yy [j:k]) " - ";endmodule:foo\n", - "module foo (\n" - " input wire x [p:q][r:s],\n" // aligned - " output reg yy[j:k]\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input wire x [p:q][rr:ss], output reg yy [jj:kk][m:n]) " - ";endmodule:foo\n", - "module foo (\n" - // TODO(b/70310743): align :'s - " input wire x [ p:q][rr:ss],\n" - " output reg yy[jj:kk][ m:n]\n" // aligned - ");\n" - "endmodule : foo\n"}, - {"module foo( input wire [p:q]x, output reg yy [j:k]) ;endmodule:foo\n", - "module foo (\n" - " input wire [p:q] x,\n" // aligned - " output reg yy[j:k]\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input wire x [p:q], output reg[j:k]yy) ;endmodule:foo\n", - "module foo (\n" - " input wire x [p:q],\n" // aligned - " output reg [j:k] yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input pkg::bar_t x , output reg yy) ;endmodule:foo\n", - "module foo (\n" - " input pkg::bar_t x,\n" // aligned - " output reg yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input wire x , output pkg::bar_t yy) ;endmodule:foo\n", - "module foo (\n" - " input wire x,\n" // aligned - " output pkg::bar_t yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input pkg::bar_t#(1) x , output reg yy) ;endmodule:foo\n", - "module foo (\n" // with parameterized port type - " input pkg::bar_t#(1) x,\n" - " output reg yy\n" // aligned - ");\n" - "endmodule : foo\n"}, - {"module foo( input signed x , output reg yy) ;endmodule:foo\n", - "module foo (\n" - " input signed x,\n" // aligned - " output reg yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input signed x , output reg [m:n] yy) ;endmodule:foo\n", - "module foo (\n" - " input signed x,\n" // aligned - " output reg [m:n] yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input int signed x , output reg [m:n] yy) ;endmodule:foo\n", - "module foo (\n" - " input int signed x,\n" // aligned - " output reg [m:n] yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo( input signed x , output pkg::bar_t yy) ;endmodule:foo\n", - "module foo (\n" - " input signed x,\n" // aligned - " output pkg::bar_t yy\n" - ");\n" - "endmodule : foo\n"}, - {"module somefunction (" - "logic clk, int a, int b);endmodule", - "module somefunction (\n" - " logic clk,\n" // direction missing - " int a,\n" // direction missing - " int b\n" // direction missing - ");\n" - "endmodule\n"}, - {"module somefunction (" - "logic clk, input int a, int b);endmodule", - "module somefunction (\n" - " logic clk,\n" // direction missing - " input int a,\n" - " int b\n" // direction missing - ");\n" - "endmodule\n"}, - {"module somefunction (" - "input logic clk, input int a, int b);endmodule", - "module somefunction (\n" - " input logic clk,\n" - " input int a,\n" - " int b\n" // direction missing - ");\n" - "endmodule\n"}, - {"module somefunction (" - "input clk, input int a, int b);endmodule", - "module somefunction (\n" - " input clk,\n" // type missing - " input int a,\n" - " int b\n" - ");\n" - "endmodule\n"}, - {"module somefunction (" - "input logic clk, input a, int b);endmodule", - "module somefunction (\n" - " input logic clk,\n" - " input a,\n" // type missing - " int b\n" // direction missing - ");\n" - "endmodule\n"}, - {"module t;\n" - " input bit i_bit;\n" - "input byte i_byte ;\n" - "input chandle i_chandle;\n" - "input event i_event;\n" - "input int i_int;\n" - "input integer i_inte;\n" - "input longint i_longint;\n" - "input real i_real;\n" - "input realtime i_realtime;\n" - "input shortint i_shortint;\n" - "input shortreal i_shortreal;\n" - "input string i_string;\n" - "input time i_time;\n" - " output bit o_bit;\n" - "output byte o_byte ; \n" - "output chandle o_chandle;\n" - "output event o_event;\n" - "output int o_int;\n" - "output integer o_inte;\n" - "output longint o_longint;\n" - "output real o_real;\n" - "output realtime o_realtime;\n" - "output shortint o_shortint;\n" - "output shortreal o_shortreal;\n" - "output string o_string;\n" - "output time o_time;\n" - "endmodule\n", - "module t;\n" - " input bit i_bit;\n" - " input byte i_byte;\n" - " input chandle i_chandle;\n" - " input event i_event;\n" - " input int i_int;\n" - " input integer i_inte;\n" - " input longint i_longint;\n" - " input real i_real;\n" - " input realtime i_realtime;\n" - " input shortint i_shortint;\n" - " input shortreal i_shortreal;\n" - " input string i_string;\n" - " input time i_time;\n" - " output bit o_bit;\n" - " output byte o_byte;\n" - " output chandle o_chandle;\n" - " output event o_event;\n" - " output int o_int;\n" - " output integer o_inte;\n" - " output longint o_longint;\n" - " output real o_real;\n" - " output realtime o_realtime;\n" - " output shortint o_shortint;\n" - " output shortreal o_shortreal;\n" - " output string o_string;\n" - " output time o_time;\n" - "endmodule\n"}, - {"module t (\n" - " input bit i_bit,\n" - "input byte i_byte ,\n" - "input chandle i_chandle,\n" - "input event i_event,\n" - "input int i_int,\n" - "input integer i_inte,\n" - "input longint i_longint,\n" - "input real i_real,\n" - "input realtime i_realtime,\n" - "input shortint i_shortint,\n" - "input shortreal i_shortreal,\n" - "input string i_string,\n" - "input time i_time,\n" - " output bit o_bit,\n" - "output byte o_byte , \n" - "output chandle o_chandle,\n" - "output event o_event,\n" - "output int o_int,\n" - "output integer o_inte,\n" - "output longint o_longint,\n" - "output real o_real,\n" - "output realtime o_realtime,\n" - "output shortint o_shortint,\n" - "output shortreal o_shortreal,\n" - "output string o_string,\n" - "output time o_time);\n" - "endmodule\n", - "module t (\n" - " input bit i_bit,\n" - " input byte i_byte,\n" - " input chandle i_chandle,\n" - " input event i_event,\n" - " input int i_int,\n" - " input integer i_inte,\n" - " input longint i_longint,\n" - " input real i_real,\n" - " input realtime i_realtime,\n" - " input shortint i_shortint,\n" - " input shortreal i_shortreal,\n" - " input string i_string,\n" - " input time i_time,\n" - " output bit o_bit,\n" - " output byte o_byte,\n" - " output chandle o_chandle,\n" - " output event o_event,\n" - " output int o_int,\n" - " output integer o_inte,\n" - " output longint o_longint,\n" - " output real o_real,\n" - " output realtime o_realtime,\n" - " output shortint o_shortint,\n" - " output shortreal o_shortreal,\n" - " output string o_string,\n" - " output time o_time\n" - ");\n" - "endmodule\n"}, - {"module m;foo bar(.baz({larry, moe, curly}));endmodule", - "module m;\n" - " foo bar (.baz({larry, moe, curly}));\n" - "endmodule\n"}, - {"module m;foo bar(.baz({larry,// expand this\n" - "moe, curly}));endmodule", - "module m;\n" - " foo bar (\n" - " .baz({\n" - " larry, // expand this\n" - " moe,\n" - " curly\n" - " })\n" - " );\n" - "endmodule\n"}, - {"parameter priv_reg_t impl_csr[] = {\n" - "// Machine mode mode CSR\n" - "MVENDORID, //\n" - "MARCHID, //\n" - "DSCRATCH0, //\n" - "DSCRATCH1 //\n" - "};", - "parameter priv_reg_t impl_csr[] = {\n" - " // Machine mode mode CSR\n" - " MVENDORID, //\n" - " MARCHID, //\n" - " DSCRATCH0, //\n" - " DSCRATCH1 //\n" - "};\n"}, - {"parameter priv_reg_t impl_csr[] = {\n" - "// Expand elements\n" - "MVENDORID,\n" - "MARCHID,\n" - "DSCRATCH0,\n" - "DSCRATCH1\n" - "};", - "parameter priv_reg_t impl_csr[] = {\n" - " // Expand elements\n" - " MVENDORID,\n" - " MARCHID,\n" - " DSCRATCH0,\n" - " DSCRATCH1\n" - "};\n"}, - /* TODO(b/158131099): to fix these, reinterpret 'b' as a kPortDeclaration - {"module somefunction (" - "input logic clk, input a, b);endmodule", - "module somefunction (\n" - " input logic clk,\n" - " input a,\n" // type missing - " b\n" // type and direction missing - ");\n" - "endmodule\n"}, - {"module somefunction (" - "input logic clk, int a, b);endmodule", - "module somefunction (\n" - " input logic clk,\n" - " int a,\n" // direction missing - " b\n" // type and direction missing - ");\n" - "endmodule\n"}, - */ - {"module foo(\n" - "//c1\n" - "input wire x , \n" - "//c2\n" - "output reg yy\n" - "//c3\n" - ") ;endmodule:foo\n", - "module foo (\n" - " //c1\n" - " input wire x,\n" // aligned, ignoring comments - " //c2\n" - " output reg yy\n" - " //c3\n" - ");\n" - "endmodule : foo\n"}, - {"module foo(\n" - "//c1\n" - "input wire x , \n" - "//c2a\n" // longer comment - "//c2b\n" - "output reg yy\n" - "//c3\n" - ") ;endmodule:foo\n", - "module foo (\n" - " //c1\n" - " input wire x,\n" // aligned, ignoring comments - " //c2a\n" // note: separated by 2 lines of comments - " //c2b\n" - " output reg yy\n" - " //c3\n" - ");\n" - "endmodule : foo\n"}, - {"module foo(\n" - "`ifdef FOO\n" - "input wire x , \n" - " `else\n" - "output reg yy\n" - " `endif\n" - ") ;endmodule:foo\n", - "module foo (\n" - "`ifdef FOO\n" - " input wire x,\n" // aligned, ignoring preprocessor conditionals - "`else\n" - " output reg yy\n" - "`endif\n" - ");\n" - "endmodule : foo\n"}, - {"module foo(\n" - "input w , \n" - "`define FOO BAR\n" - "input wire x , \n" - " `include \"stuff.svh\"\n" - "output reg yy\n" - " `undef FOO\n" - "output zz\n" - ") ;endmodule:foo\n", - "module foo (\n" - " input w,\n" // aligned, ignoring preprocessor directives - " `define FOO BAR\n" - " input wire x,\n" - " `include \"stuff.svh\"\n" - " output reg yy\n" - " `undef FOO\n" - " output zz\n" // aligned, ignoring preprocessor directives - ");\n" - "endmodule : foo\n"}, - {"module foo(\n" - "input wire x , \n \n" // blank line, separating alignment groups - "output reg yy\n" - ") ;endmodule:foo\n", - "module foo (\n" - " input wire x,\n" // not aligned, due to blank line separating groups - "\n" - " output reg yy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo(\n" - "input wire x1 [r:s],\n" - "input [p:q] x2 , \n \n" // blank line, separating alignment groups - "output reg [jj:kk]yy1,\n" - "output pkg::barr_t [mm:nn] yy2\n" - ") ;endmodule:foo\n", - "module foo (\n" - " input wire x1[r:s],\n" // aligned in this group, but not across - // groups - " input [p:q] x2,\n" - "\n" - " output reg [jj:kk] yy1,\n" - " output pkg::barr_t [mm:nn] yy2\n" - ");\n" - "endmodule : foo\n"}, - {"module foo(\n" // same as previous, with comments - " //c1\n" - "input wire x1 [r:s],\n" - "input [p:q] x2 , \n" - " //c2\n\n" // blank line, separating alignment groups - " //c3\n" - "output reg [jj:kk]yy1,\n" - " //c4\n" - "output pkg::barr_t [mm:nn] yy2\n" - ") ;endmodule:foo\n", - "module foo (\n" - " //c1\n" - " input wire x1[r:s],\n" // aligned in this group, but not across - // groups - " input [p:q] x2,\n" - " //c2\n" - "\n" - " //c3\n" - " output reg [jj:kk] yy1,\n" - " //c4\n" - " output pkg::barr_t [mm:nn] yy2\n" - ");\n" - "endmodule : foo\n"}, - - {// align null-statement (issue #824) - "class sample;" - "bit a;;" - "bit b;" - "endclass", - "class sample;\n" - " bit a;\n" - " ;\n" - " bit b;\n" - "endclass\n"}, - {"class sample;" - "bit a;;" - "endclass", - "class sample;\n" - " bit a;\n" - " ;\n" - "endclass\n"}, - {"class sample;" - "bit a;" - "bit b;;" - "endclass", - "class sample;\n" - " bit a;\n" - " bit b;\n" - " ;\n" - "endclass\n"}, - - {// aligning here just barely fits in the 40col limit - "module foo( input int signed x [a:b]," - "output reg [mm:nn] yy) ;endmodule:foo\n", - "module foo (\n" - // ---------------40col-----------------> - " input int signed x [a:b],\n" // aligned, still fits - " output reg [mm:nn] yy\n" - ");\n" - "endmodule : foo\n"}, - {// when aligning would result in exceeding column limit, don't align for - // now - "module foo( input int signed x [aa:bb]," - "output reg [mm:nn] yy) ;endmodule:foo\n", - "module foo (\n" - // ---------------40col-----------------> - // input int signed x [aa:bb],\n" - // output reg [mm:nn] yy\n" - " input int signed x [aa:bb],\n" // aligned, still fits - " output reg [mm:nn] yy\n" - ");\n" - "endmodule : foo\n"}, - {// when aligning would result in exceeding column limit, don't align for - // now - "module foo( input int signed x [aa:bb]," - "output reg [mm:nn] yyy) ;endmodule:foo\n", - "module foo (\n" - // ---------------40col-----------------> - // input int signed x [aa:bb],\n" // over limit, by comma - // output reg [mm:nn] yyy\n" - " input int signed x[aa:bb],\n" // aligned would be 41 columns - " output reg [mm:nn] yyy\n" - ");\n" - "endmodule : foo\n"}, - {// when aligning would result in exceeding column limit, don't align for - // now - "module foo( input int signed x [a:b],//c\n" - "output reg [m:n] yy) ;endmodule:foo\n", - "module foo (\n" - // ---------------40col----------------> - // input int signed x [a:b], //c\n" // over limit, by comment - // output reg [m:n] yy\n" - " input int signed x[a:b], //c\n" // aligned would be 42 columns - " output reg [m:n] yy\n" - ");\n" - "endmodule : foo\n"}, - {// aligning interfaces in port headers like types - // TODO(b/161181877): flush interface port type left (multi-column) - "module foo( input clk , inter.face yy) ;endmodule:foo\n", - "module foo (\n" - " input clk,\n" // aligned - " inter.face yy\n" - ");\n" - "endmodule : foo\n"}, - {// aligning interfaces in port headers like types - // TODO(b/161181877): flush interface port type left (multi-column) - "module foo( input wire clk , inter.face yy) ;endmodule:foo\n", - "module foo (\n" - " input wire clk,\n" // aligned - " inter.face yy\n" - ");\n" - "endmodule : foo\n"}, - - // module local variable/net declaration alignment test cases - {"module m;\n" - "logic a;\n" - "bit b;\n" - "endmodule\n", - "module m;\n" - " logic a;\n" - " bit b;\n" - "endmodule\n"}, - {"module m;\n" - "logic a;\n" - "bit b;\n" - "initial e=f;\n" // separates alignment groups - "wire c;\n" - "bit d;\n" - "endmodule\n", - "module m;\n" - " logic a;\n" - " bit b;\n" - " initial e = f;\n" // separates alignment groups - " wire c;\n" - " bit d;\n" - "endmodule\n"}, - {"module m;\n" - "// hello a\n" - "logic a;\n" - "// hello b\n" - "bit b;\n" - "endmodule\n", - "module m;\n" - " // hello a\n" - " logic a;\n" - " // hello b\n" - " bit b;\n" // aligned across comments - "endmodule\n"}, - {"module m;\n" - "// hello a\n" - "logic a;\n" - "\n" // extra blank line - "// hello b\n" - "bit b;\n" - "endmodule\n", - "module m;\n" - " // hello a\n" - " logic a;\n" - "\n" // extra blank line - " // hello b\n" // aligned across blank lines - " bit b;\n" // aligned across comments - "endmodule\n"}, - {"module m;\n" - "logic [x:y]a;\n" // packed dimensions - "bit b;\n" - "endmodule\n", - "module m;\n" - " logic [x:y] a;\n" - " bit b;\n" - "endmodule\n"}, - {"module m;\n" - "logic a;\n" - "bit [pp:qq]b;\n" // packed dimensions - "endmodule\n", - "module m;\n" - " logic a;\n" - " bit [pp:qq] b;\n" - "endmodule\n"}, - {"module m;\n" - "logic [x:y]a;\n" // packed dimensions - "bit [pp:qq]b;\n" // packed dimensions - "endmodule\n", - "module m;\n" - " logic [ x:y] a;\n" - " bit [pp:qq] b;\n" - "endmodule\n"}, - {"module m;\n" - "logic [x:y]a;\n" // packed dimensions - "wire [pp:qq] [e:f]b;\n" // packed dimensions, 2D - "endmodule\n", - "module m;\n" - " logic [ x:y] a;\n" - " wire [pp:qq][e:f] b;\n" - "endmodule\n"}, - {"module m;\n" - "logic a [x:y];\n" // unpacked dimensions - "bit bbb;\n" - "endmodule\n", - "module m;\n" - " logic a [x:y];\n" - " bit bbb;\n" - "endmodule\n"}, - {"module m;\n" - "logic aaa ;\n" - "wire w [yy:zz];\n" // unpacked dimensions - "endmodule\n", - "module m;\n" - " logic aaa;\n" - " wire w [yy:zz];\n" - "endmodule\n"}, - {"module m;\n" - "logic aaa [s:t] ;\n" // unpacked dimensions - "wire w [yy:zz];\n" // unpacked dimensions - "endmodule\n", - "module m;\n" - " logic aaa[ s:t];\n" - " wire w [yy:zz];\n" - "endmodule\n"}, - {"module m;\n" - "logic aaa [s:t] ;\n" // unpacked dimensions - "wire w [yy:zz][u:v];\n" // unpacked dimensions, 2D - "endmodule\n", - "module m;\n" - " logic aaa[ s:t];\n" - " wire w [yy:zz] [u:v];\n" - // TODO(b/165323560): unwanted space between unpacked dimensions of 'w' - "endmodule\n"}, - {"module m;\n" - "qqq::rrr s;\n" // user-defined type - "wire [pp:qq]w;\n" // packed dimensions - "endmodule\n", - "module m;\n" - " qqq::rrr s;\n" - " wire [pp:qq] w;\n" - "endmodule\n"}, - {"module m;\n" - "qqq#(rr) s;\n" // parameterized type - "wire [pp:qq]w;\n" // packed dimensions - "endmodule\n", - "module m;\n" - " qqq #(rr) s;\n" - " wire [pp:qq] w;\n" - "endmodule\n"}, - {"module m;\n" - "logic a;\n" - "bit b;\n" - "my_module my_inst( );\n" // module instance separates alignment groups - "wire c;\n" - "bit d;\n" - "endmodule\n", - "module m;\n" - " logic a;\n" // these two are aligned - " bit b;\n" - " my_module my_inst ();\n" // module instance separates alignment groups - " wire c;\n" // these two are aligned - " bit d;\n" - "endmodule\n"}, - {"module m;\n" - "logic aaa = expr1;\n" - "bit b = expr2;\n" - "endmodule\n", - "module m;\n" - " logic aaa = expr1;\n" - " bit b = expr2;\n" // no alignment at '=' yet - "endmodule\n"}, - {"(* foo='{\"bar_.*\"} *)\n" // funny attribute - "module mattr;\n" - "(* attr1=\"value1\" *)\n" // attribute ignored - "ex_input_pins_t ex_input_pins;\n" - "(* attr2=\"value2\" *)\n" // attribute ignored - "ex_output_pins_t ex_output_pins;\n" - "(* attr3=\"value3\" *)\n" // attribute ignored - "ex wrap_ex ( );\n" - "endmodule\n", - "(* foo='{\"bar_.*\"} *)\n" - "module mattr;\n" - " (* attr1=\"value1\" *)\n" // indented - " ex_input_pins_t ex_input_pins;\n" // aligned - " (* attr2=\"value2\" *)\n" // indented - " ex_output_pins_t ex_output_pins;\n" - " (* attr3=\"value3\" *)\n" // indented - " ex wrap_ex ();\n" - "endmodule\n"}, - {"module mattr;\n" - "ex_input_pins_t ex_input_pins;\n" - "ex_output_pins_t ex_output_pins;\n" - "(* package_definition=\"ex_pkg\" *)\n" // attribute ignored - "ex wrap_ex (\n" - ".clk(ex_input_pins.clk),\n" - ".rst(ex_input_pins.rst),\n" - ".in(ex_input_pins.in)\n" - ");\n" - "endmodule\n", - "module mattr;\n" - " ex_input_pins_t ex_input_pins;\n" // aligned - " ex_output_pins_t ex_output_pins;\n" - " (* package_definition=\"ex_pkg\" *)\n" // indented - " ex wrap_ex (\n" - " .clk(ex_input_pins.clk),\n" - " .rst(ex_input_pins.rst),\n" - " .in (ex_input_pins.in)\n" // aligned - " );\n" - "endmodule\n"}, - {"module test;\n" - "bind entropy_src tlul_assert #(.EndpointType(\"Device\"))\n" - "tlul_assert_device (.clk_i, .rst_ni, .h2d(tl_i), .d2h(tl_o));\n" - "endmodule\n", - "module test;\n" - " bind entropy_src tlul_assert #(\n" - " .EndpointType(\"Device\")\n" - " ) tlul_assert_device (\n" - " .clk_i,\n" - " .rst_ni,\n" - " .h2d(tl_i),\n" - " .d2h(tl_o)\n" - " );\n" - "endmodule\n"}, - {"module test;\n" - "bind entropy_src tlul_assert #(.EndpointType(\"Device\"))\n" - "tlul_assert_device (.clk_i, .rst_ni,\n\n .h2d(tl_i),\n\n .d2h(tl_o));\n" - "endmodule\n", - "module test;\n" - " bind entropy_src tlul_assert #(\n" - " .EndpointType(\"Device\")\n" - " ) tlul_assert_device (\n" - " .clk_i,\n" - " .rst_ni,\n" - "\n" - " .h2d(tl_i),\n" - "\n" - " .d2h(tl_o)\n" - " );\n" - "endmodule\n"}, - {"bind expand_me long_name #(.W(W_CONST), .D(D_CONST)) instaaance_name (" - ".in(iiiiiiiin),\n\n .out(ooooooout),\n .clk(ccccccclk),\n\n" - ".in1234 (in),\n //c1\n .out1234(out),\n .clk1234(clk),);", - "bind expand_me long_name #(\n" - " .W(W_CONST),\n" - " .D(D_CONST)\n" - ") instaaance_name (\n" - " .in(iiiiiiiin),\n" - "\n" - " .out(ooooooout),\n" - " .clk(ccccccclk),\n" - "\n" - " .in1234 (in),\n" - " //c1\n" - " .out1234(out),\n" - " .clk1234(clk),\n" - ");\n"}, - {"initial // clock generation\n begin\n clk = 0;\n forever begin\n" - "#4ns clk = !clk;\n end\n end\n", - "initial // clock generation\n" - " begin\n" - " clk = 0;\n" - " forever begin\n" - " #4ns clk = !clk;\n" - " end\n" - " end\n"}, - {"module foo #(int x,int y) ;endmodule:foo\n", // parameters - "module foo #(\n" - " int x,\n" - " int y\n" - ");\n" // each parameter on its own line - "endmodule : foo\n"}, - {"module foo #(int x)(input y) ;endmodule:foo\n", - // parameter and port - "module foo #(\n" - " int x\n" - ") (\n" - " input y\n" - ");\n" // each paramater and port item should be on its own line - "endmodule : foo\n"}, - {"module foo #(parameter int x,parameter int y) ;endmodule:foo\n", - // parameters don't fit (also should be on its own line) - "module foo #(\n" - " parameter int x,\n" - " parameter int y\n" - ");\n" - "endmodule : foo\n"}, - {"module foo #(parameter int xxxx,parameter int yyyy) ;endmodule:foo\n", - // parameters don't fit - "module foo #(\n" - " parameter int xxxx,\n" - " parameter int yyyy\n" - ");\n" - "endmodule : foo\n"}, - {"module foo #(parameter int x = $clog2 (N) ,parameter int y ) " - ";endmodule:foo\n", - // parameters don't fit - "module foo #(\n" - " parameter int x = $clog2(N),\n" // no space after $clog2 - " parameter int y\n" - ");\n" - "endmodule : foo\n"}, - {"module foo #(//comment\n" - "parameter bar =1,\n" - "localparam baz =2" - ") ();" - "endmodule", - "module foo #( //comment\n" - " parameter bar = 1,\n" - " localparam baz = 2\n" - ") ();\n" - "endmodule\n"}, - {"module foo #(" - "parameter bar =1,//comment\n" - "localparam baz =2" - ") ();" - "endmodule", - "module foo #(\n" - " parameter bar = 1, //comment\n" - " localparam baz = 2\n" - ") ();\n" - "endmodule\n"}, - {"module foo #(" - "parameter bar =1," - "localparam baz =2//comment\n" - ") ();" - "endmodule", - "module foo #(\n" - " parameter bar = 1,\n" - " localparam baz = 2 //comment\n" - ") ();\n" - "endmodule\n"}, - {"module foo #(" - "parameter bar =1//comment\n" - ",localparam baz =2\n" - ") ();" - "endmodule", - "module foo #(\n" - " parameter bar = 1 //comment\n" - " , localparam baz = 2\n" - ") ();\n" - "endmodule\n"}, - {"module foo;" - // fit in one line - "parameter int i = '{\n" - "1,\n" - "2,\n" - "3\n" - "};\n" - "endmodule", - "module foo;\n" - " parameter int i = '{1, 2, 3};\n" - "endmodule\n"}, - {"module foo;" - // too long for one line, expand - "localparam logic [63:0] RC[24] = '{\n" - "64'h 1,\n" - "64'h 2,\n" - "64'h 3\n" - "};\n" - "endmodule", - "module foo;\n" - " localparam logic [63:0] RC[24] = '{\n" - " 64'h1,\n" - " 64'h2,\n" - " 64'h3\n" - " };\n" - "endmodule\n"}, - {"module foo;" - "parameter int i = '{\n" - // force expansion - "1, //\n" - "2,\n" - "3\n" - "};\n" - "endmodule", - "module foo;\n" - " parameter int i = '{\n" - " 1, //\n" - " 2,\n" - " 3\n" - " };\n" - "endmodule\n"}, - {"module foo;" - "localparam logic [63:0] RC[24] = '{\n" - "64'h 0000_0000_0000_0001, // 0\n" - "64'h 0000_0000_0000_8082, // 1\n" - "64'h 8000_0000_8000_8008 // 23\n" - "};\n" - "endmodule", - "module foo;\n" - " localparam logic [63:0] RC[24] = '{\n" - " 64'h0000_0000_0000_0001, // 0\n" - " 64'h0000_0000_0000_8082, // 1\n" - " 64'h8000_0000_8000_8008 // 23\n" - " };\n" - "endmodule\n"}, - {"module foo;" - // nest two patterns - "parameter logic [11:0] i = '{\n" - "'{1,2,3},\n" - "'{1,2,3}\n" - "};\n" - "endmodule", - "module foo;\n" - " parameter logic [11:0] i = '{\n" - " '{1, 2, 3},\n" - " '{1, 2, 3}\n" - " };\n" - "endmodule\n"}, - {"module foo;" - // nest two patterns, expand interior - "parameter logic [11:0] i = '{\n" - "'{1, //\n" - " 2,3},\n" - "'{1,2,3}\n" - "};\n" - "endmodule", - "module foo;\n" - " parameter logic [11:0] i = '{\n" - " '{\n" - " 1, //\n" - " 2,\n" - " 3\n" - " },\n" - " '{1, 2, 3}\n" - " };\n" - "endmodule\n"}, - {"module foo;" - // nest two patterns, expand both - "parameter nest [2] i = '{\n" - "'{first : 32'h0000_0001,\n" - " second : 32'h0000_0011,\n" - " third: 32'h0000_0111},\n" - "'{first : 32'h1000_0001,\n" - " second : 32'h1000_0011,\n" - " third: 32'h1000_0111}\n" - "};\n" - "endmodule", - "module foo;\n" - " parameter nest [2] i = '{\n" - " '{\n" - " first : 32'h0000_0001,\n" - " second : 32'h0000_0011,\n" - " third: 32'h0000_0111\n" - " },\n" - " '{\n" - " first : 32'h1000_0001,\n" - " second : 32'h1000_0011,\n" - " third: 32'h1000_0111\n" - " }\n" - " };\n" - "endmodule\n"}, - {"module foo;" - // nest three patterns - "parameter logic [11:0] i = '{\n" - "'{'{1,2,3},4}\n" - "};\n" - "endmodule", - "module foo;\n" - " parameter logic [11:0] i = '{\n" - " '{'{1, 2, 3}, 4}\n" - " };\n" - "endmodule\n"}, - {"module foo;" - // nest three patterns, expand interior - "parameter logic [11:0] i = '{\n" - "'{\n" - "'{first : 32'h0000_0001,\n" - " second : 32'h0000_0011,\n" - " third: 32'h0000_0111},\n" - " 4},\n" - " 5,\n" - " '{1,2,3}\n" - "};\n" - "endmodule", - "module foo;\n" - " parameter logic [11:0] i = '{\n" - " '{\n" - " '{\n" - " first : 32'h0000_0001,\n" - " second : 32'h0000_0011,\n" - " third: 32'h0000_0111\n" - " },\n" - " 4\n" - " },\n" - " 5,\n" - " '{1, 2, 3}\n" - " };\n" - "endmodule\n"}, - {"module top;" - "foo#( \"test\" ) foo( );" - "bar#( \"test\" ,5) bar( );" - "endmodule\n", - "module top;\n" - " foo #(\"test\") foo ();\n" // module instantiation, string arg - " bar #(\"test\", 5) bar ();\n" - "endmodule\n"}, - {"module top;" - "foo#( `\"test`\" ) foo( );" - "bar#( `\"test`\" ,5) bar( );" - "endmodule\n", - "module top;\n" - " foo #(`\"test`\") foo ();\n" // module instantiation, eval string arg - " bar #(`\"test`\", 5) bar ();\n" - "endmodule\n"}, - {"`ifdef FOO\n" - " module bar;endmodule\n" - "`endif\n", - "`ifdef FOO\n" - "module bar;\n" - "endmodule\n" - "`endif\n"}, - {"`ifdef FOO\n" - " module bar;endmodule\n" - "`else module baz;endmodule\n" - "`endif\n", - "`ifdef FOO\n" - "module bar;\n" - "endmodule\n" - "`else\n" - "module baz;\n" - "endmodule\n" - "`endif\n"}, - {"`ifdef FOO\n" - " module bar;endmodule\n" - "`else /* glue me */ module baz;endmodule\n" - "`endif\n", - "`ifdef FOO\n" - "module bar;\n" - "endmodule\n" - "`else /* glue me */\n" - "module baz;\n" - "endmodule\n" - "`endif\n"}, - {"`ifdef FOO\n" - " module bar;endmodule\n" - "`else// different unit\n" - " module baz;endmodule\n" - "`endif\n", - "`ifdef FOO\n" - "module bar;\n" - "endmodule\n" - "`else // different unit\n" - "module baz;\n" - "endmodule\n" - "`endif\n"}, - - // unary: + - ! ~ & | ^ ~& ~| ~^ ^~ - {"module m;foo bar(.x(-{a,b}));endmodule", - "module m;\n" - " foo bar (.x(-{a, b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x(!{a,b}));endmodule", - "module m;\n" - " foo bar (.x(!{a, b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x(~{a,b}));endmodule", - "module m;\n" - " foo bar (.x(~{a, b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x(&{a,b}));endmodule", - "module m;\n" - " foo bar (.x(&{a, b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x(|{a,b}));endmodule", - "module m;\n" - " foo bar (.x(|{a, b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x(^{a,b}));endmodule", - "module m;\n" - " foo bar (.x(^{a, b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x(~&{a,b}));endmodule", - "module m;\n" - " foo bar (.x(~&{a, b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x(~|{a,b}));endmodule", - "module m;\n" - " foo bar (.x(~|{a, b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x(~^{a,b}));endmodule", - "module m;\n" - " foo bar (.x(~^{a, b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x(^~{a,b}));endmodule", - "module m;\n" - " foo bar (.x(^~{a, b}));\n" - "endmodule\n"}, - - // binary: + - * / % & | ^ ^~ ~^ && || - {"module m;foo bar(.x(a+b));endmodule", - "module m;\n" - " foo bar (.x(a + b));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a-b));endmodule", - "module m;\n" - " foo bar (.x(a - b));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a*b));endmodule", - "module m;\n" - " foo bar (.x(a * b));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a/b));endmodule", - "module m;\n" - " foo bar (.x(a / b));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a%b));endmodule", - "module m;\n" - " foo bar (.x(a % b));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a&b));endmodule", - "module m;\n" - " foo bar (.x(a & b));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a|b));endmodule", - "module m;\n" - " foo bar (.x(a | b));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a^b));endmodule", - "module m;\n" - " foo bar (.x(a ^ b));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a^~b));endmodule", - "module m;\n" - " foo bar (.x(a ^~ b));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a~^b));endmodule", - "module m;\n" - " foo bar (.x(a ~^ b));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a&&b));endmodule", - "module m;\n" - " foo bar (.x(a && b));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a||b));endmodule", - "module m;\n" - " foo bar (.x(a || b));\n" - "endmodule\n"}, - - // {a} op {b} - {"module m;foo bar(.x({a}+{b}));endmodule", - "module m;\n" - " foo bar (.x({a} + {b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x({a}-{b}));endmodule", - "module m;\n" - " foo bar (.x({a} - {b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x({a}*{b}));endmodule", - "module m;\n" - " foo bar (.x({a} * {b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x({a}/{b}));endmodule", - "module m;\n" - " foo bar (.x({a} / {b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x({a}%{b}));endmodule", - "module m;\n" - " foo bar (.x({a} % {b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x({a}&{b}));endmodule", - "module m;\n" - " foo bar (.x({a} & {b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x({a}|{b}));endmodule", - "module m;\n" - " foo bar (.x({a} | {b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x({a}^{b}));endmodule", - "module m;\n" - " foo bar (.x({a} ^ {b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x({a}^~{b}));endmodule", - "module m;\n" - " foo bar (.x({a} ^~ {b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x({a}~^{b}));endmodule", - "module m;\n" - " foo bar (.x({a} ~^ {b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x({a}&&{b}));endmodule", - "module m;\n" - " foo bar (.x({a} && {b}));\n" - "endmodule\n"}, - {"module m;foo bar(.x({a}||{b}));endmodule", - "module m;\n" - " foo bar (.x({a} || {b}));\n" - "endmodule\n"}, - - // (a) op (b) - {"module m;foo bar(.x((a)+(b)));endmodule", - "module m;\n" - " foo bar (.x((a) + (b)));\n" - "endmodule\n"}, - {"module m;foo bar(.x((a)-(b)));endmodule", - "module m;\n" - " foo bar (.x((a) - (b)));\n" - "endmodule\n"}, - {"module m;foo bar(.x((a)*(b)));endmodule", - "module m;\n" - " foo bar (.x((a) * (b)));\n" - "endmodule\n"}, - {"module m;foo bar(.x((a)/(b)));endmodule", - "module m;\n" - " foo bar (.x((a) / (b)));\n" - "endmodule\n"}, - {"module m;foo bar(.x((a)%(b)));endmodule", - "module m;\n" - " foo bar (.x((a) % (b)));\n" - "endmodule\n"}, - {"module m;foo bar(.x((a)&(b)));endmodule", - "module m;\n" - " foo bar (.x((a) & (b)));\n" - "endmodule\n"}, - {"module m;foo bar(.x((a)|(b)));endmodule", - "module m;\n" - " foo bar (.x((a) | (b)));\n" - "endmodule\n"}, - {"module m;foo bar(.x((a)^(b)));endmodule", - "module m;\n" - " foo bar (.x((a) ^ (b)));\n" - "endmodule\n"}, - {"module m;foo bar(.x((a)^~(b)));endmodule", - "module m;\n" - " foo bar (.x((a) ^~ (b)));\n" - "endmodule\n"}, - {"module m;foo bar(.x((a)~^(b)));endmodule", - "module m;\n" - " foo bar (.x((a) ~^ (b)));\n" - "endmodule\n"}, - {"module m;foo bar(.x((a)&&(b)));endmodule", - "module m;\n" - " foo bar (.x((a) && (b)));\n" - "endmodule\n"}, - {"module m;foo bar(.x((a)||(b)));endmodule", - "module m;\n" - " foo bar (.x((a) || (b)));\n" - "endmodule\n"}, - - // a[b] op c - {"module m;foo bar(.x(a[b]+c));endmodule", - "module m;\n" - " foo bar (.x(a[b] + c));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a[b]-c));endmodule", - "module m;\n" - " foo bar (.x(a[b] - c));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a[b]*c));endmodule", - "module m;\n" - " foo bar (.x(a[b] * c));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a[b]/c));endmodule", - "module m;\n" - " foo bar (.x(a[b] / c));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a[b]%c));endmodule", - "module m;\n" - " foo bar (.x(a[b] % c));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a[b]&c));endmodule", - "module m;\n" - " foo bar (.x(a[b] & c));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a[b]|c));endmodule", - "module m;\n" - " foo bar (.x(a[b] | c));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a[b]^c));endmodule", - "module m;\n" - " foo bar (.x(a[b] ^ c));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a[b]^~c));endmodule", - "module m;\n" - " foo bar (.x(a[b] ^~ c));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a[b]~^c));endmodule", - "module m;\n" - " foo bar (.x(a[b] ~^ c));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a[b]&&c));endmodule", - "module m;\n" - " foo bar (.x(a[b] && c));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a[b]||c));endmodule", - "module m;\n" - " foo bar (.x(a[b] || c));\n" - "endmodule\n"}, - - // misc - {"module m;foo bar(.x(a[1:0]^b[2:1]));endmodule", - "module m;\n" - " foo bar (.x(a[1:0] ^ b[2:1]));\n" - "endmodule\n"}, - - {"module m;foo bar(.x(a[b] | b[c]));endmodule", - "module m;\n" - " foo bar (.x(a[b] | b[c]));\n" - "endmodule\n"}, - {"module m;foo bar(.x(a[b] & b[c]));endmodule", - "module m;\n" - " foo bar (.x(a[b] & b[c]));\n" - "endmodule\n"}, - - {"module m;foo bar(.x((a^c)^(b^ ~c)));endmodule", - "module m;\n" - " foo bar (.x((a ^ c) ^ (b ^ ~c)));\n" - "endmodule\n"}, - {"module m;foo bar(.x((a^c)^(b^~c)));endmodule", - "module m;\n" - " foo bar (.x((a ^ c) ^ (b ^~ c)));\n" - "endmodule\n"}, - {"module m;foo bar(.x((a^{c,d})^(b^^{c,d})));endmodule", - "module m;\n" - " foo bar (\n" - " .x((a ^ {c, d}) ^ (b ^ ^{c, d}))\n" - " );\n" - "endmodule\n"}, - - {// module items mixed with preprocessor conditionals and comments - " module foo;\n" - "// comment1\n" - " `ifdef SIM\n" - "// comment2\n" - " `elsif SYN\n" - " // comment3\n" - " `else\n" - "// comment4\n" - " `endif\n" - "// comment5\n" - " endmodule", - "module foo;\n" - " // comment1\n" - "`ifdef SIM\n" - " // comment2\n" - "`elsif SYN\n" - " // comment3\n" - "`else\n" - " // comment4\n" - "`endif\n" - " // comment5\n" - "endmodule\n"}, - {" module bar;wire foo;reg bear;endmodule\n", - "module bar;\n" - " wire foo;\n" - " reg bear;\n" // aligned - "endmodule\n"}, - {" module bar;initial\nbegin a<=b . c ; end endmodule\n", - "module bar;\n" - " initial begin\n" - " a <= b.c;\n" - " end\n" - "endmodule\n"}, - {"module foo ();\nif (1) begin\n$finish(\n" - " 1 ); $finish ();\n end\nendmodule", - "module foo ();\n" - " if (1) begin\n" - " $finish(1);\n" - " $finish();\n" - " end\n" - "endmodule\n"}, - {" module bar;for(genvar i = 0 ; i<N ; ++ i ) begin end endmodule\n", - "module bar;\n" - " for (genvar i = 0; i < N; ++i) begin\n" - " end\n" - "endmodule\n"}, - {" module bar;for(genvar i = 0 ; i!=N ; i ++ ) begin " - "foo f;end endmodule\n", - "module bar;\n" - " for (genvar i = 0; i != N; i++) begin\n" - " foo f;\n" - " end\n" - "endmodule\n"}, - { - "module block_generate;\n" - "`ASSERT(blah)\n" - "generate endgenerate endmodule\n", - "module block_generate;\n" - " `ASSERT(blah)\n" - " generate\n" - " endgenerate\n" - "endmodule\n", - }, - { - "module conditional_generate;\n" - "if(foo) ; \t" // null action - "endmodule\n", - "module conditional_generate;\n" - " if (foo);\n" - "endmodule\n", - }, - { - "module conditional_generate;\n" - "if(foo[a*b+c]) ; \t" // null action - "endmodule\n", - "module conditional_generate;\n" - " if (foo[a*b+c]);\n" // allow compact expressions inside [] - "endmodule\n", - }, - { - "module conditional_generate;\n" - "if(foo)begin\n" - "`ASSERT()\n" - "`COVER()\n" - " end\n" - "endmodule\n", - "module conditional_generate;\n" - " if (foo) begin\n" - " `ASSERT()\n" - " `COVER()\n" - " end\n" - "endmodule\n", - }, - { - "module conditional_generate;\n" - "`ASSERT()\n" - "if(foo)begin\n" - " end\n" - "`COVER()\n" - "endmodule\n", - "module conditional_generate;\n" - " `ASSERT()\n" - " if (foo) begin\n" - " end\n" - " `COVER()\n" - "endmodule\n", - }, - { - "module conditional_generate;\n" - "if(foo)begin\n" - " // comment1\n" - " // comment2\n" - " end\n" - "endmodule\n", - "module conditional_generate;\n" - " if (foo) begin\n" - " // comment1\n" - " // comment2\n" - " end\n" - "endmodule\n", - }, - { - "module m ;" - "for(genvar i=0; ;)\n; " // null generate statement - "for(genvar j=0 ;; )\n; " // null generate statement - "endmodule", - "module m;\n" - " for (genvar i = 0;;);\n" - " for (genvar j = 0;;);\n" - "endmodule\n", - }, - { - "module m ;" - "for (genvar f = 0; f < N; f++) begin " - "assign x = y; assign y = z;" - "end endmodule", - "module m;\n" - " for (genvar f = 0; f < N; f++) begin\n" - " assign x = y;\n" - " assign y = z;\n" - " end\n" - "endmodule\n", - }, - { - // standalone genvar statement - "module m ;" - "genvar f;" - "for(f=0; f<N; f ++ )begin " - "end endmodule", - "module m;\n" - " genvar f;\n" - " for (f = 0; f < N; f++) begin\n" - " end\n" - "endmodule\n", - }, - { - // multiple arguments to genvar statement - "module m ;" - "genvar f, g;" - "for(f=0; f<N; f ++ )begin " - "end for(g=N; g>0; g -- )begin " - "end endmodule", - "module m;\n" - " genvar f, g;\n" - " for (f = 0; f < N; f++) begin\n" - " end\n" - " for (g = N; g > 0; g--) begin\n" - " end\n" - "endmodule\n", - }, - { - // multiple genvar statements - "module m ;" - "genvar f;" - "genvar g;" - "for(f=0; f<N; f ++ )begin " - "end for(g=N; g>0; g -- )begin " - "end endmodule", - "module m;\n" - " genvar f;\n" - " genvar g;\n" - " for (f = 0; f < N; f++) begin\n" - " end\n" - " for (g = N; g > 0; g--) begin\n" - " end\n" - "endmodule\n", - }, - { - "module event_control ;" - "always@ ( posedge clk )z<=y;" - "endmodule\n", - "module event_control;\n" - " always @(posedge clk) z <= y;\n" - "endmodule\n", - }, - { - "module always_if ;" - "always@ ( posedge clk ) if (expr) z<=y;" - "endmodule\n", - "module always_if;\n" - " always @(posedge clk)\n" // doesn't fit - " if (expr)\n" - " z <= y;\n" - "endmodule\n", - }, - { - "module always_if ;" - "always@* if (expr) z<=y;" - "endmodule\n", - "module always_if;\n" - " always @* if (expr) z <= y;\n" // fits - "endmodule\n", - }, - { - "module \talways_if_else ;" - "always@* if (expr) z<=y; else g<=0;" - "endmodule\n", - "module always_if_else;\n" - " always @*\n" - " if (expr) z <= y;\n" // fits - " else g <= 0;\n" // fits - "endmodule\n", - }, - { - "module \talways_if_else_if ;" - "always@* if (expr) z<=y; else if (w) g<=0;" - "endmodule\n", - "module always_if_else_if;\n" - " always @*\n" - " if (expr) z <= y;\n" // fits - " else if (w) g <= 0;\n" // fits - "endmodule\n", - }, - { - "module \talways_if_else_if_else ;" - "always@* if (expr) z<=y; else if (w) g<=0;else h<=1;" - "endmodule\n", - "module always_if_else_if_else;\n" - " always @*\n" - " if (expr) z <= y;\n" // fits - " else if (w) g <= 0;\n" // fits - " else h <= 1;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(b, c)" - " for (;;)\ts = y;" - "endmodule", - "module m;\n" - " always @(b, c) for (;;) s = y;\n" // fits - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " for (i=0;i<k;++i)\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " for (i = 0; i < k; ++i)\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " repeat (jj+kk)\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " repeat (jj + kk)\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " foreach(jj[kk])\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " foreach (jj[kk])\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " while(jj[kk])\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " while (jj[kk])\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " do s=y;while(jj[kk]);\t" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " do\n" - " s = y;\n" - " while (jj[kk]);\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk) \n" - " case(jj)\tS:s = y;endcase\t" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " case (jj)\n" - " S: s = y;\n" - " endcase\n" - "endmodule\n", - }, - - { - "module always_if ;" - "always@ ( posedge clk ) if (expr) z<=y;" - "endmodule\n", - "module always_if;\n" - " always @(posedge clk)\n" // doesn't fit - " if (expr)\n" - " z <= y;\n" - "endmodule\n", - }, - { - "module always_if ;" - "always@* if (expr) z<=y;" - "endmodule\n", - "module always_if;\n" - " always @* if (expr) z <= y;\n" // fits - "endmodule\n", - }, - { - "module \talways_if_else ;" - "always@* if (expr) z<=y; else g<=0;" - "endmodule\n", - "module always_if_else;\n" - " always @*\n" - " if (expr) z <= y;\n" // fits - " else g <= 0;\n" // fits - "endmodule\n", - }, - { - "module \talways_if_else_if ;" - "always@* if (expr) z<=y; else if (w) g<=0;" - "endmodule\n", - "module always_if_else_if;\n" - " always @*\n" - " if (expr) z <= y;\n" // fits - " else if (w) g <= 0;\n" // fits - "endmodule\n", - }, - { - "module \talways_if_else_if_else ;" - "always@* if (expr) z<=y; else if (w) g<=0;else h<=1;" - "endmodule\n", - "module always_if_else_if_else;\n" - " always @*\n" - " if (expr) z <= y;\n" // fits - " else if (w) g <= 0;\n" // fits - " else h <= 1;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(b, c)" - " for (;;)\ts = y;" - "endmodule", - "module m;\n" - " always @(b, c) for (;;) s = y;\n" // fits - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " for (i=0;i<k;++i)\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " for (i = 0; i < k; ++i)\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " repeat (jj+kk)\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " repeat (jj + kk)\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " foreach(jj[kk])\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " foreach (jj[kk])\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " while(jj[kk])\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " while (jj[kk])\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " do s=y;while(jj[kk]);\t" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " do\n" - " s = y;\n" - " while (jj[kk]);\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk) \n" - " case(jj)\tS:s = y;endcase\t" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " case (jj)\n" - " S: s = y;\n" - " endcase\n" - "endmodule\n", - }, - - { - "module always_if ;" - "always@ ( posedge clk ) if (expr) z<=y;" - "endmodule\n", - "module always_if;\n" - " always @(posedge clk)\n" // doesn't fit - " if (expr)\n" - " z <= y;\n" - "endmodule\n", - }, - { - "module always_if ;" - "always@* if (expr) z<=y;" - "endmodule\n", - "module always_if;\n" - " always @* if (expr) z <= y;\n" // fits - "endmodule\n", - }, - { - "module \talways_if_else ;" - "always@* if (expr) z<=y; else g<=0;" - "endmodule\n", - "module always_if_else;\n" - " always @*\n" - " if (expr) z <= y;\n" // fits - " else g <= 0;\n" // fits - "endmodule\n", - }, - { - "module \talways_if_else_if ;" - "always@* if (expr) z<=y; else if (w) g<=0;" - "endmodule\n", - "module always_if_else_if;\n" - " always @*\n" - " if (expr) z <= y;\n" // fits - " else if (w) g <= 0;\n" // fits - "endmodule\n", - }, - { - "module \talways_if_else_if_else ;" - "always@* if (expr) z<=y; else if (w) g<=0;else h<=1;" - "endmodule\n", - "module always_if_else_if_else;\n" - " always @*\n" - " if (expr) z <= y;\n" // fits - " else if (w) g <= 0;\n" // fits - " else h <= 1;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(b, c)" - " for (;;)\ts = y;" - "endmodule", - "module m;\n" - " always @(b, c) for (;;) s = y;\n" // fits - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " for (i=0;i<k;++i)\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " for (i = 0; i < k; ++i)\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " repeat (jj+kk)\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " repeat (jj + kk)\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " foreach(jj[kk])\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " foreach (jj[kk])\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " while(jj[kk])\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " while (jj[kk])\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " do s=y;while(jj[kk]);\t" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " do\n" - " s = y;\n" - " while (jj[kk]);\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk) \n" - " case(jj)\tS:s = y;endcase\t" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " case (jj)\n" - " S: s = y;\n" - " endcase\n" - "endmodule\n", - }, - - { - "module always_if ;" - "always@ ( posedge clk ) if (expr) z<=y;" - "endmodule\n", - "module always_if;\n" - " always @(posedge clk)\n" // doesn't fit - " if (expr)\n" - " z <= y;\n" - "endmodule\n", - }, - { - "module always_if ;" - "always@* if (expr) z<=y;" - "endmodule\n", - "module always_if;\n" - " always @* if (expr) z <= y;\n" // fits - "endmodule\n", - }, - { - "module \talways_if_else ;" - "always@* if (expr) z<=y; else g<=0;" - "endmodule\n", - "module always_if_else;\n" - " always @*\n" - " if (expr) z <= y;\n" // fits - " else g <= 0;\n" // fits - "endmodule\n", - }, - { - "module \talways_if_else_if ;" - "always@* if (expr) z<=y; else if (w) g<=0;" - "endmodule\n", - "module always_if_else_if;\n" - " always @*\n" - " if (expr) z <= y;\n" // fits - " else if (w) g <= 0;\n" // fits - "endmodule\n", - }, - { - "module \talways_if_else_if_else ;" - "always@* if (expr) z<=y; else if (w) g<=0;else h<=1;" - "endmodule\n", - "module always_if_else_if_else;\n" - " always @*\n" - " if (expr) z <= y;\n" // fits - " else if (w) g <= 0;\n" // fits - " else h <= 1;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(b, c)" - " for (;;)\ts = y;" - "endmodule", - "module m;\n" - " always @(b, c) for (;;) s = y;\n" // fits - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " for (i=0;i<k;++i)\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " for (i = 0; i < k; ++i)\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " repeat (jj+kk)\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " repeat (jj + kk)\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " foreach(jj[kk])\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " foreach (jj[kk])\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " while(jj[kk])\ts = y;" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " while (jj[kk])\n" - " s = y;\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk)" - " do s=y;while(jj[kk]);\t" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " do\n" - " s = y;\n" - " while (jj[kk]);\n" - "endmodule\n", - }, - { - "module m;\n" - "always @(posedge clk) \n" - " case(jj)\tS:s = y;endcase\t" - "endmodule", - "module m;\n" - " always @(posedge clk)\n" - " case (jj)\n" - " S: s = y;\n" - " endcase\n" - "endmodule\n", - }, - - { - // begin/end with labels - "module m ;initial begin:yyy\tend:yyy endmodule", - "module m;\n" - " initial begin : yyy\n" - " end : yyy\n" - "endmodule\n", - }, - { - // conditional generate begin/end with labels - "module m ;if\n( 1) begin:yyy\tend:yyy endmodule", - "module m;\n" - " if (1) begin : yyy\n" - " end : yyy\n" - "endmodule\n", - }, - { - // begin/end with labels, nested - "module m ;initial begin:yyy if(1)begin:zzz " - "end:zzz\tend:yyy endmodule", - "module m;\n" - " initial begin : yyy\n" - " if (1) begin : zzz\n" - " end : zzz\n" - " end : yyy\n" - "endmodule\n", - }, - { - "module m ;initial begin # 1 x<=y ;end endmodule", - "module m;\n" - " initial begin\n" - " #1 x <= y;\n" - " end\n" - "endmodule\n", - }, - { - "module m ;initial begin x<=y ; y<=z;end endmodule", - "module m;\n" - " initial begin\n" - " x <= y;\n" - " y <= z;\n" - " end\n" - "endmodule\n", - }, - { - "module m ;initial begin # 10 x<=y ; # 20 y<=z;end endmodule", - "module m;\n" - " initial begin\n" - " #10 x <= y;\n" - " #20 y <= z;\n" - " end\n" - "endmodule\n", - }, - { - // qualified variables - "module m ;initial begin automatic int a; " - " static byte s=0;end endmodule", - "module m;\n" - " initial begin\n" - " automatic int a;\n" - " static byte s = 0;\n" // aligned - " end\n" - "endmodule\n", - }, - { - "module m ;initial begin automatic int a,b; " - " static byte s,t;end endmodule", - "module m;\n" - " initial begin\n" - " automatic int a, b;\n" - " static byte s, t;\n" - " end\n" - "endmodule\n", - }, - { - "module m ;initial begin static byte a=1,b=0;end endmodule", - "module m;\n" - " initial begin\n" - " static byte a = 1, b = 0;\n" - " end\n" - "endmodule\n", - }, - { - "module m ;initial begin const int a=0;end endmodule", - "module m;\n" - " initial begin\n" - " const int a = 0;\n" - " end\n" - "endmodule\n", - }, - { - "module m ;initial begin automatic const int a=0;end endmodule", - "module m;\n" - " initial begin\n" - " automatic const int a = 0;\n" - " end\n" - "endmodule\n", - }, - { - "module m ;initial begin const var automatic int a=0;end endmodule", - "module m;\n" - " initial begin\n" - " const var automatic int a = 0;\n" - " end\n" - "endmodule\n", - }, - { - "module m ;initial begin static byte s ={<<{a}};end endmodule", - "module m;\n" - " initial begin\n" - " static byte s = {<<{a}};\n" - " end\n" - "endmodule\n", - }, - { - "module m ;initial begin static int s ={>>4{a}};end endmodule", - "module m;\n" - " initial begin\n" - " static int s = {>>4{a}};\n" - " end\n" - "endmodule\n", - }, - { - "module m; final assert (expr ) ;endmodule", - "module m;\n" - " final assert (expr);\n" - "endmodule\n", - }, - { - "module m; final begin\tassert (expr ) ;end endmodule", - "module m;\n" - " final begin\n" - " assert (expr);\n" - " end\n" - "endmodule\n", - }, - { - "module m; final assume (expr ) ;endmodule", - "module m;\n" - " final assume (expr);\n" - "endmodule\n", - }, - { - "module m; final cover (expr ) ;endmodule", - "module m;\n" - " final cover (expr);\n" - "endmodule\n", - }, - { - // two consecutive clocking declarations in modules - " module mcd ; " - "clocking cb @( posedge clk);\t\tendclocking " - "clocking cb2 @ (posedge clk\n); endclocking endmodule", - "module mcd;\n" - " clocking cb @(posedge clk);\n" - " endclocking\n" - " clocking cb2 @(posedge clk);\n" - " endclocking\n" - "endmodule\n", - }, - { - // two consecutive clocking declarations in modules, with end labels - " module mcd ; " - "clocking cb @( posedge clk);\t\tendclocking: cb " - "clocking cb2 @ (posedge clk\n); endclocking :cb2 endmodule", - "module mcd;\n" - " clocking cb @(posedge clk);\n" - " endclocking : cb\n" - " clocking cb2 @(posedge clk);\n" - " endclocking : cb2\n" - "endmodule\n", - }, - { - // clocking declarations with ports in modules - " module mcd ; " - "clocking cb @ (posedge clk\n); input a; output b; endclocking " - "endmodule", - "module mcd;\n" - " clocking cb @(posedge clk);\n" - " input a;\n" - " output b;\n" - " endclocking\n" - "endmodule\n", - }, - { - // DPI import declarations in modules - "module mdi;" - "import \"DPI-C\" function int add(\n) ;" - "import \"DPI-C\"\t\tfunction int\nsleep( input int secs );" - "import \"DPI-C\"\t\tfunction int\nwake( input int secs, output bit " - "[2:0] z);" - "endmodule", - "module mdi;\n" - " import \"DPI-C\" function int add();\n" - " import \"DPI-C\" function int sleep(\n" - " input int secs\n" - " );\n" - " import \"DPI-C\" function int wake(\n" - " input int secs,\n" - " output bit [2:0] z\n" - " );\n" - "endmodule\n", - }, - { - // DPI export declarations in modules - "module m;" - "export \"DPI-C\" function get;" - "export \"DPI-C\" function mhpmcounter_get;\n" - "export \"DPI-C\"\t\tfunction int\nwake( input int secs, output bit " - "[2:0] z);" - "endmodule", - "module m;\n" - " export \"DPI-C\" function get;\n" - " export \"DPI-C\"\n" - " function mhpmcounter_get;\n" // doesn't fit in 40-col - " export \"DPI-C\" function int wake(\n" - " input int secs,\n" - " output bit [2:0] z\n" - " );\n" - "endmodule\n", - }, - {// Two consecutive EOL comments in kDPIImportItem - "import \"DPI-C\" context function void foo(\n" - " input bit first,\n" - " // c3\n" - " // c3+\n" - " input bit second\n" - ");\n", - "import \"DPI-C\" context\n" - " function void foo(\n" - " input bit first,\n" - " // c3\n" - " // c3+\n" - " input bit second\n" - ");\n"}, - {"export \"\" t;\n", "export \"\" t;\n"}, - {"import \"DPI-C\" context function void func(input bit impl_i," - "input bit op_i," - "input bit [5:0] mode_i," - "input bit [3:0][31:0] iv_i," - "input bit [2:0] key_len_i," - "input bit [7:0][31:0] key_i," - "input bit [7:0] data_i[]," - "output bit [7:0] data_o[]);", - "import \"DPI-C\" context\n" - " function void func(\n" - " input bit impl_i,\n" - " input bit op_i,\n" - " input bit [5:0] mode_i,\n" - " input bit [3:0][31:0] iv_i,\n" - " input bit [2:0] key_len_i,\n" - " input bit [7:0][31:0] key_i,\n" - " input bit [7:0] data_i [],\n" - " output bit [7:0] data_o []\n" - ");\n"}, - {// module with system task call w or w/o parentheses - "module m; initial begin #10 $display(\"foo\"); $display(\"bar\");" - "end endmodule", - "module m;\n" - " initial begin\n" - " #10 $display(\"foo\");\n" - " $display(\"bar\");\n" - " end\n" - "endmodule\n"}, - {// module with system task call - "module m; initial begin #10 $display; $display;" - "end endmodule", - "module m;\n" - " initial begin\n" - " #10 $display;\n" - " $display;\n" - " end\n" - "endmodule\n"}, - - // interface test cases - {// two interface declarations - " interface if1 ; endinterface\t\t" - "interface if2; endinterface ", - "interface if1;\n" - "endinterface\n" - "interface if2;\n" - "endinterface\n"}, - {// two interface declarations, end labels - " interface if1 ; endinterface:if1\t\t" - "interface if2; endinterface : if2 ", - "interface if1;\n" - "endinterface : if1\n" - "interface if2;\n" - "endinterface : if2\n"}, - {// interface declaration with parameters - " interface if1#( parameter int W= 8 );endinterface\t\t", - "interface if1 #(\n" - " parameter int W = 8\n" - ");\n" - "endinterface\n"}, - {// interface declaration with ports (empty) - " interface if1()\n;endinterface\t\t", - "interface if1 ();\n" - "endinterface\n"}, - {// interface declaration with parameter comment only, empty ports - " interface if1#( \n" - "//param\n" - ")();endinterface\t\t", - "interface if1 #(\n" - " //param\n" - ") ();\n" - "endinterface\n"}, - {// interface declaration with parameter, empty ports - " interface if1#( parameter int W= 8 )();endinterface\t\t", - "interface if1 #(\n" - " parameter int W = 8\n" - ") ();\n" - "endinterface\n"}, - {// interface declaration with ports - " interface if1( input\tlogic z)\n;endinterface\t\t", - "interface if1 (\n" - " input logic z\n" - ");\n" - "endinterface\n"}, - {// interface declaration with multiple ports - " interface if1( input\tlogic z, output logic a)\n;endinterface\t\t", - "interface if1 (\n" - " input logic z,\n" // should be one-per-line, even it it fits - " output logic a\n" // aligned - ");\n" - "endinterface\n"}, - {// interface declaration with parameters and ports - " interface if1#( parameter int W= 8 )(input logic z);endinterface\t\t", - // doesn't fit on one line - "interface if1 #(\n" - " parameter int W = 8\n" - ") (\n" - " input logic z\n" - ");\n" - "endinterface\n"}, - { - // interface with modport declarations - "interface\tfoo_if ;" - "modport mp1\t( output a, input b);" - "modport\tmp2 (output c,input d );\t" - "endinterface", - "interface foo_if;\n" - " modport mp1(output a, input b);\n" - " modport mp2(output c, input d);\n" - "endinterface\n", - }, - { - // interface with long modport port names - "interface\tfoo_if ;" - "modport mp1\t( output a_long_output, input detailed_input_name);" - "endinterface", - "interface foo_if;\n" - " modport mp1(\n" - " output a_long_output,\n" - " input detailed_input_name\n" - " );\n" - "endinterface\n", - }, - { - // interface with modport declaration with multiple ports - "interface\tfoo_if ;" - "modport mp1\t( output a_long_output, input detailed_input_name);" - "endinterface", - "interface foo_if;\n" - " modport mp1(\n" - " output a_long_output,\n" - " input detailed_input_name\n" - " );\n" - "endinterface\n", - }, - { - // interface with modport TF port declaration - "interface\tfoo_if ;" - "modport mp1\t( output a, input b, import c);" - "endinterface", - "interface foo_if;\n" - " modport mp1(\n" - " output a,\n" - " input b,\n" - " import c\n" - " );\n" - "endinterface\n", - }, - { - // interface with complex modport ports list - "interface\tfoo_if ;" - "modport producer\t(input ready,\toutput data, valid, user," - " strobe, keep, last,\timport producer_reset, producer_tick);" - "modport consumer\t(input data, valid, user, strobe, keep, last," - " output ready,\timport consumer_reset, consumer_tick, consume);" - "endinterface", - "interface foo_if;\n" - " modport producer(\n" - " input ready,\n" - " output data, valid, user, strobe,\n" - " keep, last,\n" - " import producer_reset,\n" - " producer_tick\n" - " );\n" - " modport consumer(\n" - " input data, valid, user, strobe,\n" - " keep, last,\n" - " output ready,\n" - " import consumer_reset,\n" - " consumer_tick, consume\n" - " );\n" - "endinterface\n", - }, - { - // interface with modports and comments inside - "interface foo_if;\n" - " modport mp1(\n" - " // Our output\n" - " output a,\n" - " /* Inputs */\n" - " input b1, b_f /*last*/," - " import c\n" - " );\n" - "endinterface\n", - "interface foo_if;\n" - " modport mp1(\n" - " // Our output\n" - " output a,\n" - " /* Inputs */\n" - " input b1, b_f /*last*/,\n" - " import c\n" - " );\n" - "endinterface\n", - }, - - // class test cases - {"class action;int xyz;endclass : action\n", - "class action;\n" - " int xyz;\n" - "endclass : action\n"}, - {"class action extends mypkg :: inaction;endclass : action\n", - "class action extends mypkg::inaction;\n" // tests for spacing around :: - "endclass : action\n"}, - {"class c;function new;endfunction endclass", - "class c;\n" - " function new;\n" - " endfunction\n" - "endclass\n"}, - {"class c;function new ( );endfunction endclass", - "class c;\n" - " function new();\n" - " endfunction\n" - "endclass\n"}, - {"class c;function new ( string s );endfunction endclass", - "class c;\n" - " function new(string s);\n" - " endfunction\n" - "endclass\n"}, - {"class c;function new ( string s ,int i );endfunction endclass", - "class c;\n" - " function new(string s, int i);\n" - " endfunction\n" - "endclass\n"}, - {"class c;function void f;endfunction endclass", - "class c;\n" - " function void f;\n" - " endfunction\n" - "endclass\n"}, - {"class c;virtual function void f;endfunction endclass", - "class c;\n" - " virtual function void f;\n" - " endfunction\n" - "endclass\n"}, - {"class c;function int f ( );endfunction endclass", - "class c;\n" - " function int f();\n" - " endfunction\n" - "endclass\n"}, - {"class c;function int f ( int ii );endfunction endclass", - "class c;\n" - " function int f(int ii);\n" - " endfunction\n" - "endclass\n"}, - {"class c;function int f ( int ii ,bit bb );endfunction endclass", - "class c;\n" - " function int f(int ii, bit bb);\n" - " endfunction\n" - "endclass\n"}, - {"class c;task t ;endtask endclass", - "class c;\n" - " task t;\n" - " endtask\n" - "endclass\n"}, - {"class c;task t ( int ii ,bit bb );endtask endclass", - "class c;\n" - " task t(int ii, bit bb);\n" - " endtask\n" - "endclass\n"}, - {"class c; task automatic repeated_assigner;" - "repeat (count) y = w;" // single statement body - "endtask endclass", - "class c;\n" - " task automatic repeated_assigner;\n" - " repeat (count) y = w;\n" - " endtask\n" - "endclass\n"}, - {"class c; task automatic delayed_assigner;" - "# 100 y = w;" // delayed assignment - "endtask endclass", - "class c;\n" - " task automatic delayed_assigner;\n" - " #100 y = w;\n" - " endtask\n" - "endclass\n"}, - {"class c; task automatic labeled_assigner;" - "lbl : y = w;" // delayed assignment - "endtask endclass", - "class c;\n" - " task automatic labeled_assigner;\n" - " lbl : y = w;\n" // TODO(fangism): no space before ':' - " endtask\n" - "endclass\n"}, - // task with macro call - {"module m1;\ntask automatic t1();\n" - "t2(`R1(1)+ 8);endtask : t1\nendmodule", - "module m1;\n" - " task automatic t1();\n" - " t2(`R1(1) + 8);\n" - " endtask : t1\n" - "endmodule\n"}, - - // tasks with control statements - {"class c; task automatic waiter;" - "if (count == 0) begin #0; return;end " - "endtask endclass", - "class c;\n" - " task automatic waiter;\n" - " if (count == 0) begin\n" - " #0;\n" - " return;\n" - " end\n" - " endtask\n" - "endclass\n"}, - {"class c; task automatic heartbreaker;" - "if( c)if( d) break ;" - "endtask endclass", - "class c;\n" - " task automatic heartbreaker;\n" - " if (c) if (d) break;\n" - " endtask\n" - "endclass\n"}, - {"class c; task automatic waiter;" - "repeat (count) @(posedge clk);" - "endtask endclass", - "class c;\n" - " task automatic waiter;\n" - " repeat (count) @(posedge clk);\n" - " endtask\n" - "endclass\n"}, - {"class c; task automatic repeat_assigner;" - "repeat( r )\ny = w;" - "repeat( q )\ny = 1;" - "endtask endclass", - "class c;\n" - " task automatic repeat_assigner;\n" - " repeat (r) y = w;\n" - " repeat (q) y = 1;\n" - " endtask\n" - "endclass\n"}, - {"class c; task automatic event_control_assigner;" - "@ ( posedge clk )\ny = w;" - "@ ( negedge clk )\nz = w;" - "endtask endclass", - "class c;\n" - " task automatic event_control_assigner;\n" - " @(posedge clk) y = w;\n" - " @(negedge clk) z = w;\n" - " endtask\n" - "endclass\n"}, - { - // classes with surrrounding comments - // vertical spacing preserved - "\n// pre-c\n\n" - " class c ;\n" - "// c stuff\n" - "endclass\n" - " // pre-d\n" - "\n\nclass d ;\n" - " // d stuff\n" - "endclass\n" - "\n// the end\n", - "\n// pre-c\n\n" - "class c;\n" - " // c stuff\n" - "endclass\n" - "// pre-d\n\n\n" - "class d;\n" - " // d stuff\n" - "endclass\n\n" - "// the end\n", - }, - {// class with comments around task/function declarations - "class c; // c is for cookie\n" - " // f is for false\n" - "\tfunction f(integer size) ; endfunction\n" - " // t is for true\n" - "task t();endtask\n" - " // class is about to end\n" - "endclass", - "class c; // c is for cookie\n" - " // f is for false\n" - " function f(integer size);\n" - " endfunction\n" - " // t is for true\n" - " task t();\n" - " endtask\n" - " // class is about to end\n" - "endclass\n"}, - - // interface class test cases - {"interface class Foo;\nendclass\n", - "interface class Foo;\n" - "endclass\n"}, - {"interface class Foo ; endclass\n", - "interface class Foo;\n" - "endclass\n"}, - {"interface class Foo extends Bar , Baz ;\nendclass\n", - "interface class Foo extends Bar, Baz;\n" - "endclass\n"}, - {"interface class Foo;\n pure virtual task foo ( ) ; \nendclass\n", - "interface class Foo;\n" - " pure virtual task foo();\n" - "endclass\n"}, - - // class property alignment test cases - {"class c;\n" - "int foo ;\n" - "byte bar;\n" - "endclass : c\n", - "class c;\n" - " int foo;\n" - " byte bar;\n" - "endclass : c\n"}, - {"class c;\n" - "int foo;\n" - "const bit b;\n" - "endclass : c\n", - "class c;\n" - " int foo;\n" - " const bit b;\n" - "endclass : c\n"}, - {"class c;\n" - "rand logic l;\n" - "int foo;\n" - "endclass : c\n", - "class c;\n" - " rand logic l;\n" - " int foo;\n" - "endclass : c\n"}, - {"class c;\n" - "rand logic l;\n" - "const static int foo;\n" // more qualifiers - "endclass : c\n", - "class c;\n" - " rand logic l;\n" - " const static int foo;\n" - "endclass : c\n"}, - {"class c;\n" - "static local int foo;\n" - "const bit b;\n" - "endclass : c\n", - "class c;\n" - " static local int foo;\n" - " const bit b;\n" - "endclass : c\n"}, - {// example with queue - "class c;\n" - "int foo [$] ;\n" - "int foo_bar ;\n" - "endclass : c\n", - "class c;\n" - " int foo [$];\n" - " int foo_bar;\n" - "endclass : c\n"}, - {// subcolumns - "class cc;\n" - "rand bit [A-1:0] foo;\n" - "rand bit [A-1:0][2] bar;\n" - "int foobar[X+1:Y];\n" - "int baz[42];\n" - "rand bit qux[Z];\n" - "rand bit [1:0] quux[3:0];\n" - "rand bit [A:BB][42] quuz[7];\n" - "endclass\n", - "class cc;\n" - " rand bit [A-1: 0] foo;\n" - " rand bit [A-1: 0][ 2] bar;\n" - " int foobar[X+1:Y];\n" - " int baz [ 42];\n" - " rand bit qux [ Z];\n" - " rand bit [ 1: 0] quux [ 3:0];\n" - " rand bit [ A:BB][42] quuz [ 7];\n" - "endclass\n"}, - {"class cc;\n" - "int qux[2];\n" - "int quux[SIZE-1+SHIFT:SHIFT];\n" - "int quuz[SOME_CONSTANT];\n" - "endclass\n", - "class cc;\n" - " int qux [ 2];\n" - " int quux[SIZE-1+SHIFT:SHIFT];\n" - " int quuz[ SOME_CONSTANT];\n" - "endclass\n"}, - {// aligns over comments (ignored) - "class c;\n" - "// foo is...\n" - "int foo;\n" - "// b is...\n" - "const bit b;\n" - " // llama is...\n" - "logic llama;\n" - "endclass : c\n", - "class c;\n" - " // foo is...\n" - " int foo;\n" - " // b is...\n" - " const bit b;\n" - " // llama is...\n" - " logic llama;\n" - "endclass : c\n"}, - {// aligns over comments (ignored), even with blank lines - "class c;\n" - "// foo is...\n" - "int foo;\n" - "\n" - "// b is...\n" - "const bit b;\n" - "\n" - " // llama is...\n" - "logic llama;\n" - "endclass : c\n", - "class c;\n" - " // foo is...\n" - " int foo;\n" - "\n" - " // b is...\n" - " const bit b;\n" - "\n" - " // llama is...\n" - " logic llama;\n" - "endclass : c\n"}, - {"class c;\n" - "rand logic l;\n" - "int [1:0] foo;\n" - "endclass : c\n", - "class c;\n" - " rand logic l;\n" - " int [1:0] foo;\n" - "endclass : c\n"}, - {// non-data-declarations break up groups - "class c;\n" - "rand logic l;\n" - "int foo;\n" - "`uvm_bar_foo()\n" - "logic k;\n" - "rand int bar;\n" - "endclass : c\n", - "class c;\n" - " rand logic l;\n" - " int foo;\n" - " `uvm_bar_foo()\n" // separates alignment groups above/below - " logic k;\n" - " rand int bar;\n" - "endclass : c\n"}, - {// non-data-declarations break up groups - "class c;\n" - "logic k;\n" - "rand int bar;\n" - "function void f();\n" - "endfunction\n" - "rand logic l;\n" - "int foo;\n" - "endclass : c\n", - "class c;\n" - " logic k;\n" - " rand int bar;\n" - " function void f();\n" // function declaration breaks groups - " endfunction\n" - " rand logic l;\n" - " int foo;\n" - "endclass : c\n"}, - {// align single-value initializers at the '=' - "class c;\n" - "const logic foo=0;\n" - "const bit b=1;\n" - "endclass : c\n", - "class c;\n" - " const logic foo = 0;\n" - " const bit b = 1;\n" - "endclass : c\n"}, - {// align single-value initializers at the '=', over non-initialized - "class c;\n" - "const logic foo=0;\n" - "rand int iidrv;\n" - "const bit b=1;\n" - "endclass : c\n", - "class c;\n" - " const logic foo = 0;\n" - " rand int iidrv;\n" // no initializer, but align across this - " const bit b = 1;\n" - "endclass : c\n"}, - - // constraint test cases - { - "class foo; constraint c1_c{ } endclass", - "class foo;\n" - " constraint c1_c {}\n" - "endclass\n", - }, - { - "class foo; constraint c1_c{ } constraint c2_c{ } endclass", - "class foo;\n" - " constraint c1_c {}\n" - " constraint c2_c {}\n" - "endclass\n", - }, - { - "class foo; constraint c1_c{soft z==y;unique{baz};}endclass", - "class foo;\n" - " constraint c1_c {\n" - " soft z == y;\n" - " unique {baz};\n" - " }\n" - "endclass\n", - }, - { - "class foo; constraint c1_c{ //comment1\n" - "//comment2\n" - "//comment3\n" - "} endclass", - "class foo;\n" - " constraint c1_c { //comment1\n" - " //comment2\n" - " //comment3\n" - " }\n" - "endclass\n", - }, - - {"class foo;constraint c { " - "timer_enable dist { [ 8'h0 : 8'hfe ] :/ 90 , 8'hff :/ 10 }; " - "} endclass\n", - "class foo;\n" - " constraint c {\n" - " timer_enable dist {\n" - " [8'h0 : 8'hfe] :/ 90,\n" - " 8'hff :/ 10\n" // aligned - " };\n" - " }\n" - "endclass\n"}, - - { - "class Foo; constraint if_c { if (z) { soft x == y; } } endclass\n", - "class Foo;\n" - " constraint if_c {\n" - " if (z) {\n" - " soft x == y;\n" - " }\n" - " }\n" - "endclass\n", - }, - { - "class Foo; constraint if_c { if (z) {\n" - "//comment-a\n" - "soft x == y;\n" - "//comment-b\n" - "} } endclass\n", - "class Foo;\n" - " constraint if_c {\n" - " if (z) {\n" - " //comment-a\n" // properly indented - " soft x == y;\n" - " //comment-b\n" // properly indented - " }\n" - " }\n" - "endclass\n", - }, - { - "class c; " - "constraint c_has_config_error {" - "if (yyy) {zzzz == 1;} else {yyyyyyy == 0;}} " - "endclass", - "class c;\n" - " constraint c_has_config_error {\n" - " if (yyy) {\n" - " zzzz == 1;\n" - " } else {\n" - " yyyyyyy == 0;\n" - " }\n" - " }\n" - "endclass\n", - }, - // distributions: colon alignment - {"class c;\n" - "constraint co {\n" - "d dist {\n" - "[1:2]:/2,\n" - "[11:33]:/22,\n" - "[111:444]:/8,\n" - "[1:42]:/10,\n" - "[11:12]:/3\n" - "};\n" - "}\n" - "endclass\n", - "class c;\n" - " constraint co {\n" - " d dist {\n" - " [ 1 : 2] :/ 2,\n" - " [ 11 : 33] :/ 22,\n" - " [111 : 444] :/ 8,\n" - " [ 1 : 42] :/ 10,\n" - " [ 11 : 12] :/ 3\n" - " };\n" - " }\n" - "endclass\n"}, - // distributions: subcolumns - {"class foo;\n" - "constraint bar {\n" - "baz dist {\n" - "[1:2]:/2,\n" - "QUX[3:0]:/10,\n" - "[11:33]:/22,\n" - "ID_LONGER_THAN_RANGES:/3,\n" - "[111:QUUZ[Z]]:/8,\n" - "[X[4:0]:Y[8:Z-2]]:/8\n" - "};\n" - "}\n" - "endclass\n", - "class foo;\n" - " constraint bar {\n" - " baz dist {\n" - " [ 1 : 2] :/ 2,\n" - " QUX[3:0] :/ 10,\n" - " [ 11 : 33] :/ 22,\n" - " ID_LONGER_THAN_RANGES :/ 3,\n" - " [ 111 : QUUZ[Z]] :/ 8,\n" - " [X[4:0] : Y[8:Z-2]] :/ 8\n" - " };\n" - " }\n" - "endclass\n"}, - // class with empty parameter list - {"class foo #(); endclass", - "class foo #();\n" - "endclass\n"}, - // class with empty parameter list, with comment - {"class foo #( \n" - "// comment\n" - "); endclass", - "class foo #(\n" - " // comment\n" - ");\n" - "endclass\n"}, - // class with empty parameter list, extends - {"class foo #()extends bar ; endclass", - "class foo #() extends bar;\n" - "endclass\n"}, - // class extends from type with named parameters - {"class foo extends bar #(.N(N), .M(M)); endclass", - "class foo extends bar #(\n" - " .N(N),\n" - " .M(M)\n" - ");\n" - "endclass\n"}, - - // class with one parameter list - {"class foo #(type a = b); endclass", - "class foo #(\n" - " type a = b\n" - ");\n" - "endclass\n"}, - - // class with multiple paramter list - {"class foo #(type a = b, type c = d, type e = f); endclass", - "class foo #(\n" - " type a = b,\n" - " type c = d,\n" - " type e = f\n" - ");\n" - "endclass\n"}, - - // class with data members - {"class i_love_data ;const\ninteger sizer\t;endclass", - "class i_love_data;\n" - " const integer sizer;\n" - "endclass\n"}, - {"class i_love_data ;const\ninteger sizer=3\t;endclass", - "class i_love_data;\n" - " const integer sizer = 3;\n" - "endclass\n"}, - {"class i_love_data ;protected\nint count \t;endclass", - "class i_love_data;\n" - " protected int count;\n" - "endclass\n"}, - {"class i_love_data ;\t\nint counter\n ;int countess \t;endclass", - "class i_love_data;\n" - " int counter;\n" - " int countess;\n" - "endclass\n"}, - {"class i_love_params ;foo#( . bar) baz\t;endclass", - "class i_love_params;\n" - " foo #(.bar) baz;\n" - "endclass\n"}, - {"class i_love_params ;foo#( . bar ( bah )) baz\t;endclass", - "class i_love_params;\n" - " foo #(.bar(bah)) baz;\n" - "endclass\n"}, - {"class i_love_params ;foo#( . bar ( bah\n)," - ".\ncat( dog) ) baz\t;endclass", - "class i_love_params;\n" - " foo #(\n" - " .bar(bah),\n" - " .cat(dog)\n" - " ) baz;\n" - "endclass\n"}, - {"class i_love_params ;foo#( . bar) baz1,baz2\t;endclass", - "class i_love_params;\n" - " foo #(.bar) baz1, baz2;\n" - "endclass\n"}, - {"class i_love_params ;foo#( . bar) baz\t;baz#(.foo)bar;endclass", - "class i_love_params;\n" - " foo #(.bar) baz;\n" - " baz #(.foo) bar;\n" - "endclass\n"}, - {"class i_love_params // comment\n" - ";\n" - "foo#(\n" - ".foobar(quuuuux) // comment\n" - ", .cat(dog)\n" - ") baz // comment\n" - ";endclass\n", - "class i_love_params // comment\n" - ";\n" - " foo #(\n" - " .foobar(quuuuux) // comment\n" - " , .cat (dog)\n" - " ) baz // comment\n" - " ;\n" - "endclass\n"}, - - // typedef test cases - {"typedef enum logic\t{ A=0, B=1 }foo_t;", - "typedef enum logic {\n" - " A = 0,\n" - " B = 1\n" - "} foo_t;\n"}, - {"typedef enum uint8_t\t{ kA=8'b0, kB=8'b1 }foo_t;", - "typedef enum uint8_t {\n" // uint8_t is user-defined - " kA = 8'b0,\n" - " kB = 8'b1\n" - "} foo_t;\n"}, - {// With comments on same line as enum value - "typedef enum logic\t{ A=0, // foo\n" - "B,// bar\n" - "`ifndef DO_PANIC\n" - "C=42,// answer\n" - "`endif\n" - "D=3 // baz\n" - "}foo_t;", - "typedef enum logic {\n" - " A = 0, // foo\n" - " B, // bar\n" - "`ifndef DO_PANIC\n" - " C = 42, // answer\n" - "`endif\n" - " D = 3 // baz\n" - "} foo_t;\n"}, - {// with scalar dimensions - "typedef enum logic[2]\t{ A=0, B=1 }foo_t;", - "typedef enum logic [2] {\n" - " A = 0,\n" - " B = 1\n" - "} foo_t;\n"}, - {// with range dimensions - "typedef enum logic[1:0]\t{ A=0, B=1 }foo_t;", - "typedef enum logic [1:0] {\n" - " A = 0,\n" - " B = 1\n" - "} foo_t;\n"}, - {"typedef foo_pkg::baz_t#(.L(L), .W(W)) bar_t;\n", - "typedef foo_pkg::baz_t#(\n" - " .L(L),\n" - " .W(W)\n" - ") bar_t;\n"}, - // By default (class_parameter_space == false), no space before '#' - {"typedef dv_base_env_cov #(.CFG_T(tl_agent_env_cfg)) tl_agent_env_cov;\n", - "typedef dv_base_env_cov#(\n" - " .CFG_T(tl_agent_env_cfg)\n" - ") tl_agent_env_cov;\n"}, - {"typedef dv_base_env_cov#(.CFG_T(tl_agent_env_cfg)) tl_agent_env_cov;\n", - "typedef dv_base_env_cov#(\n" - " .CFG_T(tl_agent_env_cfg)\n" - ") tl_agent_env_cov;\n"}, - // single short parameter stays on one line - {"typedef my_class #(.P(P)) my_class_t;\n", - "typedef my_class#(.P(P)) my_class_t;\n"}, - - // let declarations each stay on their own line - {"module t;\n" - "let OFF = 4;\n" - "let UNIQUE = 32;\n" - "let PP(a) = 30 + a;\n" - "endmodule\n", - "module t;\n" - " let OFF = 4;\n" - " let UNIQUE = 32;\n" - " let PP(a) = 30 + a;\n" - "endmodule\n"}, - - // let declarations each stay on their own line - {"module t;\n" - "let OFF = 4;\n" - "let UNIQUE = 32;\n" - "let PP(a) = 30 + a;\n" - "endmodule\n", - "module t;\n" - " let OFF = 4;\n" - " let UNIQUE = 32;\n" - " let PP(a) = 30 + a;\n" - "endmodule\n"}, - - // package test cases - {"package fedex;localparam int www=3 ;endpackage : fedex\n", - "package fedex;\n" - " localparam int www = 3;\n" - "endpackage : fedex\n"}, - {"package typey ;" - "typedef enum int{ A=0, B=1 }foo_t;" - "typedef enum{ C=0, D=1 }bar_t;" - "endpackage:typey\n", - "package typey;\n" - " typedef enum int {\n" - " A = 0,\n" - " B = 1\n" - " } foo_t;\n" - " typedef enum {\n" - " C = 0,\n" - " D = 1\n" - " } bar_t;\n" - "endpackage : typey\n"}, - {// net type declarations - "package foo_pkg;" - "nettype shortreal\t\tfoo ;" - "nettype\nbar[1:0 ] baz with\tquux ;" - "endpackage", - "package foo_pkg;\n" - " nettype shortreal foo;\n" - " nettype bar [1:0] baz with quux;\n" - "endpackage\n"}, - {"package foo_pkg; \n" - "// function description.......\n" - "function automatic void bar();" - "endfunction " - "endpackage\n", - "package foo_pkg;\n" - " // function description.......\n" - " function automatic void bar();\n" - " endfunction\n" - "endpackage\n"}, - {"package foo_pkg; \n" - "// function description.......\n" - "function void bar(string name=\"x\" ) ;" - "endfunction " - "endpackage\n", - "package foo_pkg;\n" - " // function description.......\n" - " function void bar(string name = \"x\");\n" - " endfunction\n" - "endpackage\n"}, - {" package foo_pkg; \n" - "// class description.............\n" - "class classy;" - "endclass " - "endpackage\n", - "package foo_pkg;\n" - " // class description.............\n" - " class classy;\n" - " endclass\n" - "endpackage\n"}, - {"package\tfoo_pkg; \n" - "// class description.............\n" - "class classy; \n" - "// function description.......\n" - "function\nautomatic void bar( );" - "endfunction " - "endclass\t" - "endpackage\n", - "package foo_pkg;\n" - " // class description.............\n" - " class classy;\n" - " // function description.......\n" - " function automatic void bar();\n" - " endfunction\n" - " endclass\n" - "endpackage\n"}, - {"package fedex;\n" - " import \"asdf\" context function void bar(\n" - " input bit [2:1] aaaa, // EOL COMMENT\n" - " // another\n" - " input bit foo\n" - " );\n" - "endpackage\n", - "package fedex;\n" - " import \"asdf\" context\n" - " function void bar(\n" - " input\n bit [2:1] aaaa, // EOL COMMENT\n" - " // another\n" - " input bit foo\n" - " );\n" - "endpackage\n"}, - - // function test cases - {"function f ;endfunction", "function f;\nendfunction\n"}, - {"function f ;endfunction: f", "function f;\nendfunction : f\n"}, - {"function f ( );endfunction", "function f();\nendfunction\n"}, - {"function f (input bit x);endfunction", - "function f(input bit x);\nendfunction\n"}, - {"function f (input bit x,logic y );endfunction", - "function f(input bit x, logic y);\nendfunction\n"}, - {"function f;\n// statement comment\nendfunction\n", - "function f;\n" - " // statement comment\n" // indented - "endfunction\n"}, - {"function f();\n// statement comment\nendfunction\n", - "function f();\n" - " // statement comment\n" // indented - "endfunction\n"}, - {"function f(input int x);\n" - "// statement comment\n" - "f=x;\n" - "// statement comment\n" - "endfunction\n", - "function f(input int x);\n" - " // statement comment\n" // indented - " f = x;\n" - " // statement comment\n" // indented - "endfunction\n"}, - {// line breaks around assignments - "function f;a=b;c+=d;endfunction", - "function f;\n" - " a = b;\n" - " c += d;\n" - "endfunction\n"}, - {"function f;a&=b;c=d;endfunction", - "function f;\n" - " a &= b;\n" - " c = d;\n" - "endfunction\n"}, - {"function f;a<<=b;c=b;d>>>=b;endfunction", - "function f;\n" - " a <<= b;\n" - " c = b;\n" - " d >>>= b;\n" - "endfunction\n"}, - {// port declaration exceeds line length limit - "function f (loooong_type if_it_fits_I_sits);endfunction", - "function f(\n" - " loooong_type if_it_fits_I_sits);\n" - "endfunction\n"}, - {"function\nvoid\tspace;a=( b+c )\n;endfunction :space\n", - "function void space;\n" - " a = (b + c);\n" - "endfunction : space\n"}, - {"function\nvoid\twarranty;return to_sender\n;endfunction :warranty\n", - "function void warranty;\n" - " return to_sender;\n" - "endfunction : warranty\n"}, - {// if statement that fits on one line - "function if_i_fits_i_sits;" - "if(x)y=x;" - "endfunction", - "function if_i_fits_i_sits;\n" - " if (x) y = x;\n" - "endfunction\n"}, - {// for loop - "function\nvoid\twarranty;for(j=0; j<k; --k)begin " - "++j\n;end endfunction :warranty\n", - "function void warranty;\n" - " for (j = 0; j < k; --k) begin\n" - " ++j;\n" - " end\n" - "endfunction : warranty\n"}, - {// for loop that needs wrapping - "function\nvoid\twarranty;for(jjjjj=0; jjjjj<kkkkk; --kkkkk)begin " - "++j\n;end endfunction :warranty\n", - "function void warranty;\n" - " for (\n" - " jjjjj = 0; jjjjj < kkkkk; --kkkkk\n" - " ) begin\n" - " ++j;\n" - " end\n" - "endfunction : warranty\n"}, - {// for loop that needs more wrapping - "function\nvoid\twarranty;" - "for(jjjjjjjj=0; jjjjjjjj<kkkkkkkk; --kkkkkkkk)begin " - "++j\n;end endfunction :warranty\n", - "function void warranty;\n" - " for (\n" - " jjjjjjjj = 0;\n" - " jjjjjjjj < kkkkkkkk;\n" - " --kkkkkkkk\n" - " ) begin\n" - " ++j;\n" - " end\n" - "endfunction : warranty\n"}, - {// for loop that fits on one line - "function loop_fits;" - "for(x=0;x<N;++x) y=x;" - "endfunction", - "function loop_fits;\n" - " for (x = 0; x < N; ++x) y = x;\n" - "endfunction\n"}, - {// for loop that would fit on one line, but is force-split with //comment - "function loop_fits;" - "for(x=0;x<N;++x) //\n y=x;" - "endfunction", - "function loop_fits;\n" - " for (x = 0; x < N; ++x) //\n" - " y = x;\n" - "endfunction\n"}, - {// for loop with function call in initializer - "function void looper(); " - "for (int i=f(n); i>=0; i -- ) begin end " - "endfunction", - "function void looper();\n" - " for (int i = f(n); i >= 0; i--) begin\n" - " end\n" - "endfunction\n"}, - {// for loop with function call in condition - "function void looper(); " - "for (int i=0; i<f(m); i -- ) begin end " - "endfunction", - "function void looper();\n" - " for (int i = 0; i < f(m); i--) begin\n" - " end\n" - "endfunction\n"}, - {// for loop with an attribute instance in the initializer. - // Regression: this used to abort with a CHECK failure while reshaping - // the kForSpec partitions when an attribute appears in the header. - "module m; initial for(int i=0(* a *);i<4;i++) x=i; endmodule", - "module m;\n" - " initial\n" - " for (int i = 0 (* a *); i < 4; i++)\n" - " x = i;\n" - "endmodule\n"}, - {// forever loop - "function\nvoid\tforevah;forever begin " - "++k\n;end endfunction\n", - "function void forevah;\n" - " forever begin\n" - " ++k;\n" - " end\n" - "endfunction\n"}, - {// forever loop - "function\nvoid\tforevah;forever " - "++k\n;endfunction\n", - "function void forevah;\n" - " forever ++k;\n" - "endfunction\n"}, - {// forever loop, forced break - "function\nvoid\tforevah;forever //\n" - "++k\n;endfunction\n", - "function void forevah;\n" - " forever //\n" - " ++k;\n" - "endfunction\n"}, - {// repeat loop - "function\nvoid\tpete;repeat(3) begin " - "++k\n;end endfunction\n", - "function void pete;\n" - " repeat (3) begin\n" - " ++k;\n" - " end\n" - "endfunction\n"}, - {// repeat loop - "function\nvoid\tpete;repeat(3) " - "++k\n;endfunction\n", - "function void pete;\n" - " repeat (3)++k;\n" // TODO(fangism): space before ++ - "endfunction\n"}, - {// repeat loop, forced break - "function\nvoid\tpete;repeat(3)//\n" - "++k\n;endfunction\n", - "function void pete;\n" - " repeat (3) //\n" - " ++k;\n" - "endfunction\n"}, - {// while loop - "function\nvoid\twily;while( coyote ) begin " - "++super_genius\n;end endfunction\n", - "function void wily;\n" - " while (coyote) begin\n" - " ++super_genius;\n" - " end\n" - "endfunction\n"}, - {// while loop - "function\nvoid\twily;while( coyote ) " - "++ super_genius\n; endfunction\n", - "function void wily;\n" - " while (coyote)++super_genius;\n" // TODO(fangism): space before ++ - "endfunction\n"}, - {// while loop, forced break - "function\nvoid\twily;while( coyote ) //\n " - "++ super_genius\n; endfunction\n", - "function void wily;\n" - " while (coyote) //\n" - " ++super_genius;\n" - "endfunction\n"}, - {// do-while loop - "function\nvoid\tdonot;do begin " - "++s\n;end while( z);endfunction\n", - "function void donot;\n" - " do begin\n" - " ++s;\n" - " end while (z);\n" - "endfunction\n"}, - {// do-while loop, single statement - "function\nvoid\tdonot;do " - "++s\n; while( z);endfunction\n", - "function void donot;\n" - " do ++s; while (z);\n" - "endfunction\n"}, - {// do-while loop, single statement, forced break - "function\nvoid\tdonot;do " - "++s\n;//\n while( z);endfunction\n", - "function void donot;\n" - " do\n" - " ++s; //\n" - " while (z);\n" - "endfunction\n"}, - {// foreach loop - "function\nvoid\tforeacher;foreach( m [n] ) begin " - "++m\n;end endfunction\n", - "function void foreacher;\n" - " foreach (m[n]) begin\n" - " ++m;\n" - " end\n" - "endfunction\n"}, - {// spaces in condition expression - "function f; return {a}? {b} :{ c };endfunction", - "function f;\n" - " return {a} ? {b} : {c};\n" - "endfunction\n"}, - {"task t;endtask", - "task t;\n" - "endtask\n"}, - {"task t ( );endtask", - "task t();\n" - "endtask\n"}, - {"task t (input bit drill ) ;endtask", - "task t(input bit drill);\n" - "endtask\n"}, - {"task t; ## 100 ;endtask", - "task t;\n" - " ##100;\n" - "endtask\n"}, - {"task t; ## (1+1) ;endtask", // delay expression - "task t;\n" - " ##(1 + 1);\n" - "endtask\n"}, - {"task t; ## delay_value ;endtask", - "task t;\n" - " ##delay_value;\n" - "endtask\n"}, - {"task t; ## `DELAY_VALUE ;endtask", - "task t;\n" - " ##`DELAY_VALUE;\n" - "endtask\n"}, - {"task t;\n" - "`uvm_error( foo,bar);\n" - "endtask\n", - "task t;\n" - " `uvm_error(foo, bar);\n" - "endtask\n"}, - {"task t;\n" - "`uvm_error(foo,bar)\n" - ";\n" // null statement - "endtask\n", - "task t;\n" - " `uvm_error(foo, bar)\n" - " ;\n" - "endtask\n"}, - {"task t;\n" - "if(expr)begin\t\n" - "`uvm_error(foo,bar);\n" - "end\n" - "endtask\n", - "task t;\n" - " if (expr) begin\n" - " `uvm_error(foo, bar);\n" - " end\n" - "endtask\n"}, - {"task\nrabbit;$kill(the,\nrabbit)\n;endtask: rabbit\n", - "task rabbit;\n" - " $kill(the, rabbit);\n" - "endtask : rabbit\n"}, - {"function int foo( );if( a )a+=1 ; endfunction", - "function int foo();\n" - " if (a) a += 1;\n" - "endfunction\n"}, - {"function void foo( );foo=`MACRO(b,c) ; endfunction", - "function void foo();\n" - " foo = `MACRO(b, c);\n" - "endfunction\n"}, - {"module foo;if \t (bar)begin assign a=1; end endmodule", - "module foo;\n" - " if (bar) begin\n" - " assign a = 1;\n" - " end\n" - "endmodule\n"}, - {"module proc_cont_assigner;\n" - "always begin\n" - "assign x1 = y1;\n" - "deassign x2 ;\n" - "force x3=y3;\n" - "release x4 ;\n" - "end\n" - "endmodule\n", - "module proc_cont_assigner;\n" - " always begin\n" - " assign x1 = y1;\n" - " deassign x2;\n" - " force x3 = y3;\n" - " release x4;\n" - " end\n" - "endmodule\n"}, - {"module g_test( );\n" - "\tinitial begin:main_test \t" - "for(int i=0;i<k;i++)begin " - "case(i )\n" - " 6'd0 :release in[0]; \n" - " endcase " - " \t\tend \t" - "\t end:main_test\n" - "endmodule:g_test\n", - "module g_test ();\n" - " initial begin : main_test\n" - " for (int i = 0; i < k; i++) begin\n" - " case (i)\n" - " 6'd0: release in[0];\n" - " endcase\n" - " end\n" - " end : main_test\n" - "endmodule : g_test\n"}, - {// conditional generate (case) - "module mc; case(s)a : bb c ; d : ee f; endcase endmodule", - "module mc;\n" - " case (s)\n" - " a: bb c;\n" - " d: ee f;\n" - " endcase\n" - "endmodule\n"}, - {// conditional generate (case), with comments - "module mc; case(s)\n//comment a\na:bb c;\n//comment b\n endcase " - "endmodule", - "module mc;\n" - " case (s)\n" - " //comment a\n" // indented to case-item level - " a: bb c;\n" - " //comment b\n" // indented to case-item level - " endcase\n" - "endmodule\n"}, - - {// "default:", not "default :" - "function f; case (x) default: x=y; endcase endfunction\n", - "function f;\n" - " case (x)\n" - " default: x = y;\n" - " endcase\n" - "endfunction\n"}, - {// default with null statement: "default: ;", not "default :;" - "function f; case (x) default :; endcase endfunction\n", - "function f;\n" - " case (x)\n" - " default: ;\n" - " endcase\n" - "endfunction\n"}, - {// case statement - "function f; case (x) State0 : a=b; State1 : begin a=b; end " - "endcase endfunction\n", - "function f;\n" - " case (x)\n" - " State0: a = b;\n" - " State1: begin\n" - " a = b;\n" - " end\n" - " endcase\n" - "endfunction\n"}, - {// case statement, interleaved with comments - "function f; case (x) \n//c1\nState0 : a=b;//c2\n//c3\n State1 : " - "a=b;//c4\n//c5\n " - "endcase endfunction\n", - "function f;\n" - " case (x)\n" - " //c1\n" - " State0: a = b; //c2\n" - " //c3\n" - " State1: a = b; //c4\n" - " //c5\n" - " endcase\n" - "endfunction\n"}, - {// case inside statement, comments - "function f; case (x)inside \n//comment\n" - "[0:1]:x=y; \n" - " //comment\n" - "endcase endfunction\n", - "function f;\n" - " case (x) inside\n" - " //comment\n" - " [0 : 1]: x = y;\n" - " //comment\n" - " endcase\n" - "endfunction\n"}, - {// case inside statement - "function f; case (x)inside k1 : return b; k2 : begin return b; end " - "endcase endfunction\n", - "function f;\n" - " case (x) inside\n" - " k1: return b;\n" - " k2: begin\n" - " return b;\n" - " end\n" - " endcase\n" - "endfunction\n"}, - {// case inside statement, with ranges - "function f; case (x) inside[a:b] : return b; [c:d] : return b; " - "default :return z;" - "endcase endfunction\n", - "function f;\n" - " case (x) inside\n" - " [a : b]: return b;\n" - " [c : d]: return b;\n" - " default: return z;\n" - " endcase\n" - "endfunction\n"}, - {// case pattern statement - "function f;" - "case (y) matches " - ".foo : return 0;" - ".*\t: return 1;" - "endcase " - "case (z) matches " - ".foo\t\t: return 0;" - ".* : return 1;" - "endcase " - "endfunction", - "function f;\n" - " case (y) matches\n" - " .foo: return 0;\n" - " .*: return 1;\n" - " endcase\n" - " case (z) matches\n" - " .foo: return 0;\n" - " .*: return 1;\n" - " endcase\n" - "endfunction\n"}, - {// keep short case items on one line - "function f; case (x)k1 : if( b )break; default :return 2;" - "endcase endfunction\n", - "function f;\n" - " case (x)\n" - " k1: if (b) break;\n" // aligned - " default: return 2;\n" - " endcase\n" - "endfunction\n"}, - {// keep short default items on one line - "function f; case (x)k1 :break; default :if( c )return 2;" - "endcase endfunction\n", - "function f;\n" - " case (x)\n" - " k1: break;\n" // aligned - " default: if (c) return 2;\n" - " endcase\n" - "endfunction\n"}, - {// keep short case inside items on one line - "function f; case (x)inside k1 : if( b )return c; k2 : return a;" - "endcase endfunction\n", - "function f;\n" - " case (x) inside\n" - " k1: if (b) return c;\n" - " k2: return a;\n" - " endcase\n" - "endfunction\n"}, - {// keep short case pattern items on one line - "function f;" - "case (y) matches " - ".foo :if( n )return 0;" - ".*\t: return 1;" - "endcase " - "endfunction", - "function f;\n" - " case (y) matches\n" - " .foo: if (n) return 0;\n" - " .*: return 1;\n" - " endcase\n" - "endfunction\n"}, - {// randcase - "function f; randcase k1 : return c; k2 : return a;" - "endcase endfunction\n", - "function f;\n" - " randcase\n" - " k1: return c;\n" - " k2: return a;\n" - " endcase\n" - "endfunction\n"}, - - // This tests checks for not breaking around hierarchy operators. - {"function\nvoid\twarranty;" - "foo.bar = fancyfunction(aaaaaaaa.bbbbbbb," - " ccccccccc.ddddddddd) ;" - "endfunction :warranty\n", - "function void warranty;\n" - " foo.bar = fancyfunction(\n" - " aaaaaaaa.bbbbbbb,\n" - " ccccccccc.ddddddddd\n" - " );\n" - "endfunction : warranty\n"}, - - // Group of tests testing partitioning of arguments inside function calls - {// function with function call inside if statement header - "function foo;if(aa(bb,cc));endfunction\n", - "function foo;\n" - " if (aa(bb, cc));\n" - "endfunction\n"}, - {// function with function call inside if statement header and with - // begin-end block - "function foo;if (aa(bb,cc,dd,ee))begin end endfunction\n", - "function foo;\n" - " if (aa(bb, cc, dd, ee)) begin\n" - " end\n" - "endfunction\n"}, - {// function with kMethodCallExtension inside if statement header and with - // begin-end block - "function foo;if (aa.bb(cc,dd,ee))begin end endfunction\n", - "function foo;\n" - " if (aa.bb(cc, dd, ee)) begin\n" - " end\n" - "endfunction\n"}, - {// nested kMethodCallExtension calls - one level - "function foo;aa.bb(cc.dd(a1), ee.ff(a2));endfunction\n", - "function foo;\n" - " aa.bb(cc.dd(a1), ee.ff(a2));\n" - "endfunction\n"}, - {// nested kMethodCallExtension calls - two level - "function foo;aa.bb(cc.dd(a1.b1(a2), b1), ee.ff(c1, d1));endfunction\n", - "function foo;\n" - " aa.bb(cc.dd(a1.b1(a2), b1), ee.ff(\n" - " c1, d1));\n" - "endfunction\n"}, - - {// simple initial statement with function call - "module m;initial aa(bb,cc,dd,ee);endmodule\n", - "module m;\n" - " initial aa(bb, cc, dd, ee);\n" - "endmodule\n"}, - {// expressions and function calls inside if-statement headers - "module m;initial begin if(aa(bb)==cc(dd))a=b;if (xx()) b = a;end " - "endmodule\n", - "module m;\n" - " initial begin\n" - " if (aa(bb) == cc(dd)) a = b;\n" - " if (xx()) b = a;\n" - " end\n" - "endmodule\n"}, - {// fuction with two arguments inside if-statement headers - "module\nm;initial\nbegin\nif(aa(bb,cc))x=y;end\nendmodule\n", - "module m;\n" - " initial begin\n" - " if (aa(bb, cc)) x = y;\n" - " end\n" - "endmodule\n"}, - {// kMethodCallExtension inside if-statement headers - "module m;initial begin if (aa.bb(cc)) x = y;end endmodule", - "module m;\n" - " initial begin\n" - " if (aa.bb(cc)) x = y;\n" - " end\n" - "endmodule\n"}, - {// initial statement with object method call - "module m; initial a.b(a,b,c); endmodule\n", - "module m;\n" - " initial a.b(a, b, c);\n" - "endmodule\n"}, - {// initial statement with method call on indexed object - "module m; initial a[i].b(a,b,c); endmodule\n", - "module m;\n" - " initial a[i].b(a, b, c);\n" - "endmodule\n"}, - {// initial statement with method call on function returned object - "module m; initial a(d,e,f).b(a,b,c); endmodule\n", - "module m;\n" - " initial a(d, e, f).b(a, b, c);\n" - "endmodule\n"}, - {// initial statement with indexed access to function returned object - "module m; initial a(a,b,c)[i]; endmodule\n", - "module m;\n" - " initial a(a, b, c) [i];\n" - "endmodule\n"}, - {// method call with no arguments on an object - "module m; initial foo.bar();endmodule\n", - "module m;\n" - " initial foo.bar();\n" - "endmodule\n"}, - {// method call with one argument on an object - "module m; initial foo.bar(aa);endmodule\n", - "module m;\n" - " initial foo.bar(aa);\n" - "endmodule\n"}, - {// method call with two arguments on an object - "module m; initial foo.bar(aa,bb);endmodule\n", - "module m;\n" - " initial foo.bar(aa, bb);\n" - "endmodule\n"}, - {// method call with three arguments on an object - "module m; initial foo.bar(aa,bb,cc);endmodule\n", - "module m;\n" - " initial foo.bar(aa, bb, cc);\n" - "endmodule\n"}, - - { - // This tests for if-statements with null statements - "function foo;" - "if (zz) ; " - "if (yy) ; " - "endfunction", - "function foo;\n" - " if (zz);\n" - " if (yy);\n" - "endfunction\n", - }, - - { - // This tests for if-statements starting on their own line. - "function foo;" - "if (zz) begin " - "return 0;" - "end " - "if (yy) begin " - "return 1;" - "end " - "endfunction", - "function foo;\n" - " if (zz) begin\n" - " return 0;\n" - " end\n" - " if (yy) begin\n" - " return 1;\n" - " end\n" - "endfunction\n", - }, - - { - // This tests for if-statements with single statement bodies - "function foo;" - "if (zz) return 0;" - "if (yy) return 1;" - "endfunction", - "function foo;\n" - " if (zz) return 0;\n" - " if (yy) return 1;\n" - "endfunction\n", - }, - - { - // This tests for if-statement mixed with plain statements - "function foo;" - "a=b;" - "if (zz) return 0;" - "c=d;" - "endfunction", - "function foo;\n" - " a = b;\n" - " if (zz) return 0;\n" - " c = d;\n" - "endfunction\n", - }, - - { - // This tests for if-statement with forced break mixed with others - "function foo;" - "a=b;" - "if (zz)//\n return 0;" - "c=d;" - "endfunction", - "function foo;\n" - " a = b;\n" - " if (zz) //\n" - " return 0;\n" - " c = d;\n" - "endfunction\n", - }, - { - "function t;" - "if (r == t)" - "a.b(c);" - "endfunction", - "function t;\n" - " if (r == t) a.b(c);\n" - "endfunction\n", - }, - - {// This tests for for-statement with forced break mixed with others - "function f;" - "x=y;" - "for (int i=0; i<S*IPS; i++) #1ps a += $urandom();" - "return 2;" - "endfunction", - "function f;\n" - " x = y;\n" - " for (int i = 0; i < S * IPS; i++)\n" // doesn't fit, so indents - " #1ps a += $urandom();\n" - " return 2;\n" - "endfunction\n"}, - - { - // This tests for-statements with null statements - "function foo;" - "for(;;) ;\t" - "for(;;) ;\t" - "endfunction", - "function foo;\n" - " for (;;);\n" - " for (;;);\n" - "endfunction\n", - }, - - { - // This tests for if-else-statements with null statements - "function foo;" - "if (zz) ; else ;" - "if (yy) ; else ;" - "endfunction", - "function foo;\n" - " if (zz);\n" - " else;\n" - " if (yy);\n" - " else;\n" - "endfunction\n", - }, - - { - // This tests for end-else-begin. - "function foo;" - "if (zz) begin " - "return 0;" - "end " - "else " - "begin " - "return 1;" - "end " - "endfunction", - "function foo;\n" - " if (zz) begin\n" - " return 0;\n" - " end else begin\n" - " return 1;\n" - " end\n" - "endfunction\n", - }, - { - // This tests for end-else-if - "function foo;" - "if (zz) begin " - "return 0;" - "end " - "else " - "if(yy)begin " - "return 1;" - "end " - "endfunction", - "function foo;\n" - " if (zz) begin\n" - " return 0;\n" - " end else if (yy) begin\n" - " return 1;\n" - " end\n" - "endfunction\n", - }, - { - // This tests labeled end-else-if - "function foo;" - "if (zz) begin : label1 " - "return 0;" - "end : label1 " - "else if (yy) begin : label2 " - "return 1;" - "end : label2 " - "endfunction", - "function foo;\n" - " if (zz) begin : label1\n" - " return 0;\n" - " end : label1\n" - " else if (yy) begin : label2\n" - " return 1;\n" - " end : label2\n" - "endfunction\n", - }, - { - // This tests labeled end-else-if-else - "function foo;" - "if (zz) begin : label1 " - "return 0;" - "end : label1 " - "else if (yy) begin : label2 " - "return 1;" - "end : label2 " - "else begin : label3 " - "return 2;" - "end : label3 " - "endfunction", - "function foo;\n" - " if (zz) begin : label1\n" - " return 0;\n" - " end : label1\n" - " else if (yy) begin : label2\n" - " return 1;\n" - " end : label2\n" - " else begin : label3\n" - " return 2;\n" - " end : label3\n" - "endfunction\n", - }, - - { - // randomize function - "function r ;" - "if ( ! randomize (bar )) begin end " - "if ( ! obj.randomize (bar )) begin end " - "endfunction", - "function r;\n" - " if (!randomize(bar)) begin\n" - " end\n" - " if (!obj.randomize(bar)) begin\n" - " end\n" - "endfunction\n", - }, - { - // randomize-with call, with comments - "function f;" - "s = std::randomize() with {\n" - "// comment1\n" - "a == e;\n" - "// comment2\n" - "};" - "endfunction\n", - "function f;\n" - " s = std::randomize() with {\n" - " // comment1\n" - " a == e;\n" - " // comment2\n" - " };\n" - "endfunction\n", - }, - { - // randomize-with call, with comments, one joined - "function f;" - "s = std::randomize() with {\n" - "// comment1\n" - "a == e;// comment2\n" - "};" - "endfunction\n", - "function f;\n" - " s = std::randomize() with {\n" - " // comment1\n" - " a == e; // comment2\n" - " };\n" - "endfunction\n", - }, - { - // randomize-with call, with comment, and conditional - "function f;" - "s = std::randomize() with {\n" - "// comment\n" - "a == e;" - "if (x) {" - "a;" - "}" - "};" - "endfunction\n", - "function f;\n" - " s = std::randomize() with {\n" - " // comment\n" - " a == e;\n" - " if (x) {a;}\n" // TODO(fangism): consider expanding - " };\n" - "endfunction\n", - }, - - // module declaration test cases - {" module foo ; endmodule\n", - "module foo;\n" - "endmodule\n"}, - {" module foo ( ) ; endmodule\n", - "module foo ();\n" - "endmodule\n"}, - {" module foo ( .x ( x) ); endmodule\n", - "module foo (\n" - " .x(x)\n" - ");\n" - "endmodule\n"}, - {" module foo ( .x ( x) \n,\n . y " - " ( \ny) ); endmodule\n", - "module foo (\n" - " .x(x),\n" - " .y(y)\n" - ");\n" - "endmodule\n"}, - - // module instantiation test cases - {" module foo ; bar bq();endmodule\n", - "module foo;\n" - " bar bq ();\n" // single instance - "endmodule\n"}, - {" module foo ; bar bq(), bq2( );endmodule\n", - "module foo;\n" - " bar bq (), bq2 ();\n" // multiple instances, still fitting on one line - "endmodule\n"}, - {"module foo; bar #(.N(N)) bq (.bus(bus));endmodule\n", - // instance parameter and port fits on line - "module foo;\n" - " bar #(.N(N)) bq (.bus(bus));\n" - "endmodule\n"}, - {"module foo; bar #(.N(N),.M(M)) bq ();endmodule\n", // two named params - "module foo;\n" - " bar #(\n" - " .N(N),\n" - " .M(M)\n" - " ) bq ();\n" - "endmodule\n"}, - {"module foo; bar #(//comment\n.N(N),.M(M)) bq ();endmodule\n", - "module foo;\n" - " bar #( //comment\n" // EOL comment before first param - " .N(N),\n" - " .M(M)\n" - " ) bq ();\n" - "endmodule\n"}, - {"module foo; bar #(.N(N),//comment\n.M(M)) bq ();endmodule\n", - "module foo;\n" - " bar #(\n" - " .N(N), //comment\n" // EOL comment after first param - " .M(M)\n" - " ) bq ();\n" - "endmodule\n"}, - {"module foo; bar #(.N(N),.M(M)//comment\n) bq ();endmodule\n", - "module foo;\n" - " bar #(\n" - " .N(N),\n" - " .M(M) //comment\n" // EOL comment after last param - " ) bq ();\n" - "endmodule\n"}, - {" module foo ; bar bq(aa,bb,cc);endmodule\n", - "module foo;\n" - " bar bq (\n" - " aa,\n" - " bb,\n" - " cc\n" - " );\n" // multiple positional ports, one per line - "endmodule\n"}, - {" module foo ; bar bq(aa,\n" - "`ifdef BB\n" - "bb,\n" - "`endif\n" - "cc);endmodule\n", - "module foo;\n" - " bar bq (\n" - " aa,\n" - "`ifdef BB\n" - " bb,\n" // keep same indentation as outside conditional - "`endif\n" - " cc\n" - " );\n" // multiple positional ports, one per line - "endmodule\n"}, - {" module foo ; bar bq(.aa,.bb);endmodule\n", - "module foo;\n" - " bar bq (\n" - " .aa,\n" - " .bb\n" - " );\n" // multiple named ports, one per line - "endmodule\n"}, - {" module foo ; bar bq(.aa(aa),.bb(bb));endmodule\n", - "module foo;\n" - " bar bq (\n" - " .aa(aa),\n" - " .bb(bb)\n" - " );\n" // multiple named ports, one per line - "endmodule\n"}, - {" module foo ; bar bq(.aa(aa),\n" - "`ifdef ZZ\n" - ".zz( zz ),\n" - "`else\n" - ".yy( yy ),\n" - "`endif\n" - ".bb(bb)\n" - ");endmodule\n", - "module foo;\n" - " bar bq (\n" - " .aa(aa),\n" - "`ifdef ZZ\n" - " .zz(zz),\n" - "`else\n" - " .yy(yy),\n" - "`endif\n" - " .bb(bb)\n" - " );\n" // multiple named ports, one per line - "endmodule\n"}, - {" module foo ; bar#(NNNNNNNN)" - "bq(.aa(aaaaaa),.bb(bbbbbb));endmodule\n", - "module foo;\n" - " bar #(NNNNNNNN) bq (\n" - " .aa(aaaaaa),\n" - " .bb(bbbbbb)\n" - " );\n" - "endmodule\n"}, - {" module foo ; barrrrrrr " - "bq(.aaaaaa(aaaaaa),.bbbbbb(bbbbbb));endmodule\n", - "module foo;\n" - " barrrrrrr bq (\n" - " .aaaaaa(aaaaaa),\n" - " .bbbbbb(bbbbbb)\n" - " );\n" - "endmodule\n"}, - {"module foo; bar #(.NNNNN(NNNNN)) bq (.bussss(bussss));endmodule\n", - // instance parameter and port does not fit on line - "module foo;\n" - " bar #(\n" - " .NNNNN(NNNNN)\n" - " ) bq (\n" - " .bussss(bussss)\n" - " );\n" - "endmodule\n"}, - {"module foo; bar #(//\n.N(N)) bq (.bus(bus));endmodule\n", - "module foo;\n" - " bar #( //\n" // would fit on one line, but forced to expand by // - " .N(N)\n" - " ) bq (\n" - " .bus(bus)\n" - " );\n" - "endmodule\n"}, - {"module foo; bar #(\n" - "`ifdef MM\n" - ".M(M)\n" - "`else\n" - ".N(N)\n" - "`endif\n" - ") bq (.bus(bus));endmodule\n", - "module foo;\n" - " bar #(\n" - "`ifdef MM\n" - " .M(M)\n" - "`else\n" - " .N(N)\n" - "`endif\n" - " ) bq (\n" - " .bus(bus)\n" - " );\n" - "endmodule\n"}, - {"module foo; bar #(.N(N)//\n) bq (.bus(bus));endmodule\n", - "module foo;\n" - " bar #(\n" // would fit on one line, but forced to expand by // - " .N(N) //\n" - " ) bq (\n" - " .bus(bus)\n" - " );\n" - "endmodule\n"}, - {"module foo; bar #(.N(N)) bq (//\n.bus(bus));endmodule\n", - "module foo;\n" - " bar #(\n" // would fit on one line, but forced to expand by // - " .N(N)\n" - " ) bq ( //\n" - " .bus(bus)\n" - " );\n" - "endmodule\n"}, - {"module foo; bar #(.N(N)) bq (.bus(bus)//\n);endmodule\n", - "module foo;\n" - " bar #(\n" // would fit on one line, but forced to expand by // - " .N(N)\n" - " ) bq (\n" - " .bus(bus) //\n" - " );\n" - "endmodule\n"}, - {" module foo ; bar " - "bq(.aaa(aaa),.bbb(bbb),.ccc(ccc),.ddd(ddd));endmodule\n", - "module foo;\n" - " bar bq (\n" - " .aaa(aaa),\n" // ports don't fit on one line, so expanded - " .bbb(bbb),\n" - " .ccc(ccc),\n" - " .ddd(ddd)\n" - " );\n" - "endmodule\n"}, - {" module foo ; bar " - "bq(.aa(aa),.bb(bb),.cc(cc),.dd(dd));endmodule\n", - "module foo;\n" - " bar bq (\n" - " .aa(aa),\n" // one named port per line - " .bb(bb),\n" - " .cc(cc),\n" - " .dd(dd)\n" - " );\n" - "endmodule\n"}, - {" module foo ; bar " - "bq(.aa(aa),//\n.bb(bb),.cc(cc),.dd(dd));endmodule\n", - "module foo;\n" - " bar bq (\n" - " .aa(aa), //\n" // forced to expand by // - " .bb(bb),\n" - " .cc(cc),\n" - " .dd(dd)\n" - " );\n" - "endmodule\n"}, - {" module foo ; bar " - "bq(.aa(aa),.bb(bb),.cc(cc),.dd(dd)//\n);endmodule\n", - "module foo;\n" - " bar bq (\n" - " .aa(aa),\n" - " .bb(bb),\n" - " .cc(cc),\n" - " .dd(dd) //\n" // forced to expand by // - " );\n" - "endmodule\n"}, - {// gate instantiation test - "module m;" - "and\tx0(a, \t\tb,c);" - "or\nx1(a, \n b, d);" - "endmodule\n", - "module m;\n" - " and x0 (a, b, c);\n" - " or x1 (a, b, d);\n" - "endmodule\n"}, - {// ifdef inside port actuals - "module m; foo bar (\n" - "`ifdef BAZ\n" - "`endif\n" - ") ;endmodule\n", - "module m;\n" - " foo bar (\n" - "`ifdef BAZ\n" - "`endif\n" - " );\n" - "endmodule\n"}, - {// ifdef inside port actuals after a port connection - "module m; foo bar ( .a (a) ,\n" - "`ifdef BAZ\n" - "`endif\n" - ") ;endmodule\n", - "module m;\n" - " foo bar (\n" - " .a(a),\n" - "`ifdef BAZ\n" - "`endif\n" - " );\n" - "endmodule\n"}, - {// ifdef inside port actuals before a port connection - "module m; foo bar (\n" - "`ifdef BAZ\n" - "`endif\n" - ". b(b) ) ;endmodule\n", - "module m;\n" - " foo bar (\n" - "`ifdef BAZ\n" - "`endif\n" - " .b(b)\n" - " );\n" - "endmodule\n"}, - {// ifdef-conditional port connection - "module m; foo bar (\n" - "`ifdef BAZ\n" - ". c (\tc) \n" - "`endif\n" - " ) ;endmodule\n", - "module m;\n" - " foo bar (\n" - "`ifdef BAZ\n" - " .c(c)\n" - "`endif\n" - " );\n" - "endmodule\n"}, - {// ifndef-else-conditional port connection - "module m; foo bar (\n" - "`ifndef BAZ\n" - ". c (\tc) \n" - " `else\n" - " . d(d\t)\n" - " `endif\n" - " ) ;endmodule\n", - "module m;\n" - " foo bar (\n" - "`ifndef BAZ\n" - " .c(c)\n" - "`else\n" - " .d(d)\n" - "`endif\n" - " );\n" - "endmodule\n"}, - - {// comment following a delay in next line - "module t;\n" - "reg x;\n" - "initial begin\n" - "#20\n" - "//comment\n" - "x = 1;\n" - "x = 2;\n" - "end\n" - "endmodule\n", - "module t;\n" - " reg x;\n" - " initial begin\n" - " #20\n" - " //comment\n" - " x = 1;\n" - " x = 2;\n" - " end\n" - "endmodule\n"}, - {// comment following a delay in the same line - "module t;\n" - "reg x;\n" - "initial begin\n" - "#20 //comment\n" - "x = 1;\n" - "x = 2;\n" - "end\n" - "endmodule\n", - "module t;\n" - " reg x;\n" - " initial begin\n" - " #20 //comment\n" - " x = 1;\n" - " x = 2;\n" - " end\n" - "endmodule\n"}, - // Macro calls inside [...] - {"module foo;\nlogic [`BAR(1)\n+2] foo;\nendmodule", - "module foo;\n" - " logic [`BAR(1)\n" - "+2] foo;\n" - "endmodule\n"}, - {"module foo;\nlogic [`BAR(1)+2] foo;\nendmodule", - "module foo;\n" - " logic [`BAR(1)+2] foo;\n" - "endmodule\n"}, - {"module foo ();\n function bar();\n " - "logic [12:34] data[`AAAAAAAAAAAAAAAAAAAAAAAA(1) : " - "`BBBBBBBBBBBBBBBBBBBBBBBB(2) + 3];\n " - "endfunction\nendmodule", - "module foo ();\n" - " function bar();\n" - " logic [12:34] data[\n" - " `AAAAAAAAAAAAAAAAAAAAAAAA(1) :\n" - " `BBBBBBBBBBBBBBBBBBBBBBBB(2) + 3];\n" - " endfunction\n" - "endmodule\n"}, - { - // test that alternate top-syntax mode works - "// verilog_syntax: parse-as-module-body\n" - "`define FOO\n", - "// verilog_syntax: parse-as-module-body\n" - "`define FOO\n", - }, - { - // test alternate parsing mode in macro expansion - "class foo;\n" - "`MY_MACRO(\n" - " // verilog_syntax: parse-as-statements\n" - " // EOL comment\n" - " int count;\n" - " if(cfg.enable) begin\n" - " count = 1;\n" - " end,\n" - " utils_pkg::decrement())\n" - "endclass\n", - "class foo;\n" - " `MY_MACRO(\n" - " // verilog_syntax: parse-as-statements\n" - " // EOL comment\n" - " int count;\n" - " if (cfg.enable) begin\n" - " count = 1;\n" - " end, utils_pkg::decrement())\n" - "endclass\n", - }, - - // tests top-level data declarations - {"a;", // implicit type - "a;\n"}, - {"a\tb;", // explicit type - "a b;\n"}, - {"a;b;", - "a;\n" - "b;\n"}, - {"a ,b;", // implicit type - "a, b;\n"}, - /* TODO(b/149591599): implicit type data declarations in module body - {"module\tm ;a ;endmodule", - "module m;\n" - " a;\n" - "endmodule\n"}, - */ - {"package\tp ;a ;endpackage", // implicit type - "package p;\n" - " a;\n" - "endpackage\n"}, - {"package\tp ;a ,b ;endpackage", // implicit type - "package p;\n" - " a, b;\n" - "endpackage\n"}, - {"package\tp ;a ;b ;endpackage", // implicit type - "package p;\n" - " a;\n" - " b;\n" - "endpackage\n"}, - /* TODO(b/149591627) : implicit type data declarations in class body - {"class\tc ;a ;endclass", - "class c;\n" - " a;\n" - "endclass\n"}, - */ - {"function\tf ;a ;endfunction", // implicit type - "function f;\n" - " a;\n" - "endfunction\n"}, - {"function\tf ;a ;x ;endfunction", // implicit type - "function f;\n" - " a;\n" - " x;\n" - "endfunction\n"}, - /* TODO(b/149592527): multi-variable data declaration as block_item_decl - // same inside tasks - {"function\tf ;a \t,x ;endfunction", // implicit type - "function f;\n" - " a, x;\n" - "endfunction\n"}, - */ - {"task\tt ;a ;endtask", // implicit type - "task t;\n" - " a;\n" - "endtask\n"}, - {"task\tt ;a ;x ;endtask", // implicit type - "task t;\n" - " a;\n" - " x;\n" - "endtask\n"}, - - {// tests bind declaration - "bind foo bar baz ( . clk ( clk ) ) ;", - "bind foo bar baz (.clk(clk));\n"}, - {// tests bind declaration, with type params - "bind foo bar# ( . W ( W ) ) baz ( . clk ( clk ) ) ;", - "bind foo bar #(.W(W)) baz (.clk(clk));\n"}, - {// tests bind declarations - "bind foo bar baz ( ) ;" - "bind goo car caz ( );", - "bind foo bar baz ();\n" - "bind goo car caz ();\n"}, - - {"bind blah foo #( .MaxCount(MaxCount), .MaxDelta(MaxDelta)) bar (" - " .clk(clk), .rst(rst), .value(value) );", - "bind blah foo #(\n" - " .MaxCount(MaxCount),\n" - " .MaxDelta(MaxDelta)\n" - ") bar (\n" - " .clk (clk),\n" - " .rst (rst),\n" - " .value(value)\n" - ");\n"}, - {"bind foo bar baz(\\\n" - "`undef d\\\n" - "`undef d);", - "bind foo bar baz (\\\n" - " `undef d\\\n" - " `undef d\n" - ");\n"}, - { - "bind expaaaaaaaaaaand_meeee looooooooong_name# (" - ".W(W_CONST), .H(H_CONST), .D(D_CONST) )" - "instaaance_name (.in(iiiiiiiin), .out(ooooooout), .clk(ccccccclk));", - "bind expaaaaaaaaaaand_meeee\n" - " looooooooong_name #(\n" - " .W(W_CONST),\n" - " .H(H_CONST),\n" - " .D(D_CONST)\n" - ") instaaance_name (\n" - " .in (iiiiiiiin),\n" - " .out(ooooooout),\n" - " .clk(ccccccclk)\n" - ");\n", - }, - - { - "bind expand_inst name# (" - ".W(W_CONST), .H(H_CONST), .D(D_CONST) )" - "instaaance_name (.in(iiiiiiiin), .out(ooooooout), .clk(ccccccclk));", - "bind expand_inst name #(\n" - " .W(W_CONST),\n" - " .H(H_CONST),\n" - " .D(D_CONST)\n" - ") instaaance_name (\n" - " .in (iiiiiiiin),\n" - " .out(ooooooout),\n" - " .clk(ccccccclk)\n" - ");\n", - }, - - { - // tests import declaration - "import foo_pkg :: bar ;", - "import foo_pkg::bar;\n", - }, - { - // tests import declaration with wildcard - "import foo_pkg :: * ;", - "import foo_pkg::*;\n", - }, - { - // tests import declarations - "import foo_pkg :: *\t;" - "import goo_pkg\n:: thing ;", - "import foo_pkg::*;\n" - "import goo_pkg::thing;\n", - }, - // preserve spaces inside [] dimensions, but limit spaces around ':' to one - // and adjust everything else - {"foo[W-1:0]a[0:K-1];", // data declaration - "foo [W-1:0] a[0:K-1];\n"}, - {"foo[W-1 : 0]a[0 : K-1];", "foo [W-1 : 0] a[0 : K-1];\n"}, - {"foo[W - 1 : 0 ]a [ 0 : K - 1] ;", - "foo [W - 1 : 0] a[0 : K - 1];\n"}, - // remove spaces between [...] [...] in multi-dimension arrays - {"foo[K] [W]a;", // - "foo [K][W] a;\n"}, - {"foo b [K] [W] ;", // - "foo b[K][W];\n"}, - {"logic[K:1] [W:1]a;", // - "logic [K:1][W:1] a;\n"}, - {"logic b [K:1] [W:1] ;", // - "logic b[K:1][W:1];\n"}, - // spaces in bit slicing - { - // preserve 0 spaces - "always_ff @(posedge clk) begin " - "dummy <=\tfoo [ 7:2 ] ; " - "end", - "always_ff @(posedge clk) begin\n" - " dummy <= foo[7:2];\n" - "end\n", - }, - { - // preserve 1 space - "always_ff @(posedge clk) begin " - "dummy <=\tfoo [ 7 : 2 ] ; " - "end", - "always_ff @(posedge clk) begin\n" - " dummy <= foo[7 : 2];\n" - "end\n", - }, - { - // limit multiple spaces to 1 - "always_ff @(posedge clk) begin " - "dummy <=\tfoo [ 7 : 2 ] ; " - "end", - "always_ff @(posedge clk) begin\n" - " dummy <= foo[7 : 2];\n" - "end\n", - }, - { - "always_ff @(posedge clk) begin " - "dummy <=\tfoo [ 7 : 2 ] ; " - "end", - "always_ff @(posedge clk) begin\n" - " dummy <= foo[7 : 2];\n" - "end\n", - }, - { - // keep value on the left when symmetrizing - "always_ff @(posedge clk) begin " - "dummy <=\tfoo [ 7: 2 ] ; " - "end", - "always_ff @(posedge clk) begin\n" - " dummy <= foo[7:2];\n" - "end\n", - }, - { - "always_ff @(posedge clk) begin " - "dummy <=\tfoo [ 7: 2 ] ; " - "end", - "always_ff @(posedge clk) begin\n" - " dummy <= foo[7:2];\n" - "end\n", - }, - { - "always_ff @(posedge clk) begin " - "dummy <=\tfoo [ 7 :2 ] ; " - "end", - "always_ff @(posedge clk) begin\n" - " dummy <= foo[7 : 2];\n" - "end\n", - }, - { - "always_ff @(posedge clk) begin " - "dummy <=\tfoo [ 7 : 2 ] ; " - "end", - "always_ff @(posedge clk) begin\n" - " dummy <= foo[7 : 2];\n" - "end\n", - }, - { - // use value on the left, but limit to 1 space - "always_ff @(posedge clk) begin " - "dummy <=\tfoo [ 7 :2 ] ; " - "end", - "always_ff @(posedge clk) begin\n" - " dummy <= foo[7 : 2];\n" - "end\n", - }, - - // task test cases - {"task t ;endtask:t", // - "task t;\n" - "endtask : t\n"}, - {"task t ;# 10 ;# 5ns ; # 0.1 ; # 1step ;endtask", - "task t;\n" - " #10;\n" // no space in delay expression - " #5ns;\n" - " #0.1;\n" - " #1step;\n" - "endtask\n"}, - {"task t\n;a<=b ;c<=d ;endtask\n", - "task t;\n" - " a <= b;\n" - " c <= d;\n" - "endtask\n"}, - {"class c; virtual protected task\tt ( foo bar);" - "a.a<=b.b;\t\tc.c\n<= d.d; endtask endclass", - "class c;\n" - " virtual protected task t(foo bar);\n" - " a.a <= b.b;\n" - " c.c <= d.d;\n" - " endtask\n" - "endclass\n"}, - {"task t;\n// statement comment\nendtask\n", - "task t;\n" - " // statement comment\n" // indented - "endtask\n"}, - {"task t( );\n// statement comment\nendtask\n", - "task t();\n" - " // statement comment\n" // indented - "endtask\n"}, - {"task t( input x );\n" - "// statement comment\n" - "s();\n" - "// statement comment\n" - "endtask\n", - "task t(input x);\n" - " // statement comment\n" // indented - " s();\n" - " // statement comment\n" // indented - "endtask\n"}, - {"task fj;fork join fork join\tendtask", - "task fj;\n" - " fork\n" - " join\n" - " fork\n" - " join\n" - "endtask\n"}, - {"task fj;fork join_any fork join_any\tendtask", - "task fj;\n" - " fork\n" - " join_any\n" - " fork\n" - " join_any\n" - "endtask\n"}, - {"task fj;fork join_none fork join_none\tendtask", - "task fj;\n" - " fork\n" - " join_none\n" - " fork\n" - " join_none\n" - "endtask\n"}, - {"task fj;fork\n" - "//c1\njoin\n" - "//c2\n" - "fork \n" - "//c3\n" - "join\tendtask", - "task fj;\n" - " fork\n" - " //c1\n" - " join\n" - " //c2\n" - " fork\n" - " //c3\n" - " join\n" - "endtask\n"}, - {"task fj;\n" - "fork " - "begin " - "end " - "foo();" - "begin " - "end " - "join_any endtask", - "task fj;\n" - " fork\n" - " begin\n" - " end\n" - " foo();\n" - " begin\n" - " end\n" - " join_any\n" - "endtask\n"}, - { - // call and assertion statements - "task t ;Fire() ;assert ( x);assert(y );endtask", - "task t;\n" - " Fire();\n" - " assert (x);\n" - " assert (y);\n" - "endtask\n", - }, - { - // assertion statements with body clause - "task t ;Fire() ;assert ( x) fee ( );assert(y ) foo ( ) ;endtask", - "task t;\n" - " Fire();\n" - " assert (x) fee();\n" - " assert (y) foo();\n" - "endtask\n", - }, - { - // assertion statements with else clause - "task t ;Fire() ;assert ( x) else fee ( );" - "assert(y ) else foo ( ) ;endtask", - "task t;\n" - " Fire();\n" - " assert (x)\n" - " else fee();\n" - " assert (y)\n" - " else foo();\n" - "endtask\n", - }, - { - // assertion statements with else clause - "task t ;Fire() ;assert ( x) fa(); else fee ( );" - "assert(y ) fi(); else foo ( ) ;endtask", - "task t;\n" - " Fire();\n" - " assert (x) fa();\n" - " else fee();\n" - " assert (y) fi();\n" - " else foo();\n" - "endtask\n", - }, - { - // assume statements - "task t ;Fire() ;assume ( x);assume(y );endtask", - "task t;\n" - " Fire();\n" - " assume (x);\n" - " assume (y);\n" - "endtask\n", - }, - { - // cover statements - "task t ;Fire() ;cover ( x);cover(y );endtask", - "task t;\n" - " Fire();\n" - " cover (x);\n" - " cover (y);\n" - "endtask\n", - }, - { - // cover statements, with action - "task t ;Fire() ;cover ( x)g( );cover(y ) h();endtask", - "task t;\n" - " Fire();\n" - " cover (x) g();\n" - " cover (y) h();\n" - "endtask\n", - }, - { - // cover statements, with action block - "task t ;Fire() ;cover ( x) begin g( ); end " - "cover(y ) begin h(); end endtask", - "task t;\n" - " Fire();\n" - " cover (x) begin\n" - " g();\n" - " end\n" - " cover (y) begin\n" - " h();\n" - " end\n" - "endtask\n", - }, - {// shuffle calls - "task t; foo. shuffle ( );bar .shuffle( ); endtask", - "task t;\n" - " foo.shuffle();\n" - " bar.shuffle();\n" - "endtask\n"}, - {// wait statements (null) - "task t; wait (a==b);wait(c<d); endtask", - "task t;\n" - " wait (a == b);\n" - " wait (c < d);\n" - "endtask\n"}, - {// wait statements, single action statement - "task t; wait (a==b) p();wait(c<d) q(); endtask", - "task t;\n" - " wait (a == b) p();\n" - " wait (c < d) q();\n" - "endtask\n"}, - {// wait statements, block action statement - "task t; wait (a==b) begin p(); end " - "wait(c<d) begin q(); end endtask", - "task t;\n" - " wait (a == b) begin\n" - " p();\n" - " end\n" - " wait (c < d) begin\n" - " q();\n" - " end\n" - "endtask\n"}, - {// wait fork statements - "task t ; wait\tfork;wait fork ;endtask", - "task t;\n" - " wait fork;\n" - " wait fork;\n" - "endtask\n"}, - {// labeled single statements (prefix-style) - "task t;l1:x<=y ;endtask", - "task t;\n" - " l1 : x <= y;\n" - "endtask\n"}, - {// labeled block statements (prefix-style) - "task t;l1:begin end:l1 endtask", - "task t;\n" - " l1 : begin\n" - " end : l1\n" - "endtask\n"}, - {// labeled seq block statements - "task t;begin:l1 end:l1 endtask", - "task t;\n" - " begin : l1\n" - " end : l1\n" - "endtask\n"}, - {// labeled par block statements - "task t;fork:l1 join:l1 endtask", - "task t;\n" - " fork : l1\n" - " join : l1\n" - "endtask\n"}, - {// task with disable statements - "task t ;fork\tjoin\tdisable\tfork;endtask", - "task t;\n" - " fork\n" - " join\n" - " disable fork;\n" - "endtask\n"}, - {"task t ;fork\tjoin_any\tdisable\tfork ;endtask", - "task t;\n" - " fork\n" - " join_any\n" - " disable fork;\n" - "endtask\n"}, - {"task t ;disable\tbean_counter ;endtask", - "task t;\n" - " disable bean_counter;\n" - "endtask\n"}, - { - // task with if-statement - "task t;" - "if (r == t)" - "a.b(c);" - "endtask", - "task t;\n" - " if (r == t) a.b(c);\n" - "endtask\n", - }, - { - // task with system call inside if header - "task t;" - "if (!$cast(ssssssssssssssss,vvvvvvvvvv,gggggggg))begin end endtask:t", - "task t;\n" - " if (!$cast(\n" - " ssssssssssssssss,\n" - " vvvvvvvvvv,\n" - " gggggggg\n" - " )) begin\n" - " end\n" - "endtask : t\n", - }, - { - // task with nested subtask call and arguments passed by name - "task t;" - "if (!$cast(ssssssssssssssss, vvvvvvvvvv.gggggggg(" - ".ppppppp(ppppppp)," - ".yyyyy(\"xxxxxxxxxxxxx\")" - "))) begin " - "end " - "endtask : t", - "task t;\n" - " if (!$cast(\n" - " ssssssssssssssss,\n" - " vvvvvvvvvv.gggggggg(\n" - " .ppppppp(ppppppp),\n" - " .yyyyy(\"xxxxxxxxxxxxx\")\n" - " )\n" - " )) begin\n" - " end\n" - "endtask : t\n", - }, - - { - // assert property statements - "task t ;assert property( x);assert\tproperty(y );endtask", - "task t;\n" - " assert property (x);\n" - " assert property (y);\n" - "endtask\n", - }, - { - // assert property statements, with action - "task t ;assert property( x) j();assert\tproperty(y )k( );endtask", - "task t;\n" - " assert property (x) j();\n" - " assert property (y) k();\n" - "endtask\n", - }, - { - // assert property statements, with action block - "task t ;assert property( x) begin j();end " - " assert\tproperty(y )begin\tk( ); end endtask", - "task t;\n" - " assert property (x) begin\n" - " j();\n" - " end\n" - " assert property (y) begin\n" - " k();\n" - " end\n" - "endtask\n", - }, - { - // assert property statements, else with null - "task t ;assert property( x) else;assert\tproperty(y )else;endtask", - "task t;\n" - " assert property (x)\n" - " else;\n" - " assert property (y)\n" - " else;\n" - "endtask\n", - }, - { - // assert property statements, else with actions - "task t ;assert property( x) f(); else p(); " - "\tassert\tproperty(y ) g();else q( );endtask", - "task t;\n" - " assert property (x) f();\n" - " else p();\n" - " assert property (y) g();\n" - " else q();\n" - "endtask\n", - }, - { - // assert property statement, with action block, else statement - "task t ;assert property( x) begin j();end else\tk( ); endtask", - "task t;\n" - " assert property (x) begin\n" - " j();\n" - " end else k();\n" - "endtask\n", - }, - { - // assert property statement, with action statement, else block - "task t ;assert property( x) j(); else begin\tk( );end endtask", - "task t;\n" - " assert property (x) j();\n" - " else begin\n" - " k();\n" - " end\n" - "endtask\n", - }, - { - // assert property statement, with action block, else block - "task t ;assert property( x)begin j();end " - "else begin\tk( );end endtask", - "task t;\n" - " assert property (x) begin\n" - " j();\n" - " end else begin\n" - " k();\n" - " end\n" - "endtask\n", - }, - - { - // assume property statements - "task t ;assume property( x);assume\tproperty(y );endtask", - "task t;\n" - " assume property (x);\n" - " assume property (y);\n" - "endtask\n", - }, - { - // assume property statements, with action - "task t ;assume property( x) j();assume\tproperty(y )k( );endtask", - "task t;\n" - " assume property (x) j();\n" - " assume property (y) k();\n" - "endtask\n", - }, - { - // assume property statements, with action block - "task t ;assume property( x) begin j();end " - " assume\tproperty(y )begin\tk( ); end endtask", - "task t;\n" - " assume property (x) begin\n" - " j();\n" - " end\n" - " assume property (y) begin\n" - " k();\n" - " end\n" - "endtask\n", - }, - { - // assume property statements, else with null - "task t ;assume property( x) else;assume\tproperty(y )else;endtask", - "task t;\n" - " assume property (x)\n" - " else;\n" - " assume property (y)\n" - " else;\n" - "endtask\n", - }, - { - // assume property statements, else with actions - "task t ;assume property( x) f(); else p(); " - "\tassume\tproperty(y ) g();else q( );endtask", - "task t;\n" - " assume property (x) f();\n" - " else p();\n" - " assume property (y) g();\n" - " else q();\n" - "endtask\n", - }, - { - // assume property statement, with action block, else statement - "task t ;assume property( x) begin j();end else\tk( ); endtask", - "task t;\n" - " assume property (x) begin\n" - " j();\n" - " end else k();\n" - "endtask\n", - }, - { - // assume property statement, with action statement, else block - "task t ;assume property( x) j(); else begin\tk( );end endtask", - "task t;\n" - " assume property (x) j();\n" - " else begin\n" - " k();\n" - " end\n" - "endtask\n", - }, - { - // assume property statement, with action block, else block - "task t ;assume property( x)begin j();end " - "else begin\tk( );end endtask", - "task t;\n" - " assume property (x) begin\n" - " j();\n" - " end else begin\n" - " k();\n" - " end\n" - "endtask\n", - }, - - { - // expect property statements - "task t ;expect ( x);expect\t(y );endtask", - "task t;\n" - " expect (x);\n" - " expect (y);\n" - "endtask\n", - }, - { - // expect property statements, with action - "task t ;expect ( x) j();expect\t(y )k( );endtask", - "task t;\n" - " expect (x) j();\n" - " expect (y) k();\n" - "endtask\n", - }, - { - // expect property statements, with action block - "task t ;expect ( x) begin j();end " - " expect\t(y )begin\tk( ); end endtask", - "task t;\n" - " expect (x) begin\n" - " j();\n" - " end\n" - " expect (y) begin\n" - " k();\n" - " end\n" - "endtask\n", - }, - { - // expect property statements, else with null - "task t ;expect ( x) else;expect\t(y )else;endtask", - "task t;\n" - " expect (x)\n" - " else;\n" - " expect (y)\n" - " else;\n" - "endtask\n", - }, - { - // expect property statements, else with actions - "task t ;expect ( x) f(); else p(); " - "\texpect\t(y ) g();else q( );endtask", - "task t;\n" - " expect (x) f();\n" - " else p();\n" - " expect (y) g();\n" - " else q();\n" - "endtask\n", - }, - { - // expect property statement, with action block, else statement - "task t ;expect ( x) begin j();end else\tk( ); endtask", - "task t;\n" - " expect (x) begin\n" - " j();\n" - " end else k();\n" - "endtask\n", - }, - { - // expect property statement, with action statement, else block - "task t ;expect ( x) j(); else begin\tk( );end endtask", - "task t;\n" - " expect (x) j();\n" - " else begin\n" - " k();\n" - " end\n" - "endtask\n", - }, - { - // expect property statement, with action block, else block - "task t ;expect ( x)begin j();end " - "else begin\tk( );end endtask", - "task t;\n" - " expect (x) begin\n" - " j();\n" - " end else begin\n" - " k();\n" - " end\n" - "endtask\n", - }, - - { - // cover property statements - "task t ;cover property( x);cover\tproperty(y );endtask", - "task t;\n" - " cover property (x);\n" - " cover property (y);\n" - "endtask\n", - }, - { - // cover property statements, with action - "task t ;cover property( x) j();cover\tproperty(y )k( );endtask", - "task t;\n" - " cover property (x) j();\n" - " cover property (y) k();\n" - "endtask\n", - }, - { - // cover property statements, with action block - "task t ;cover property( x) begin j();end " - " cover\tproperty(y )begin\tk( ); end endtask", - "task t;\n" - " cover property (x) begin\n" - " j();\n" - " end\n" - " cover property (y) begin\n" - " k();\n" - " end\n" - "endtask\n", - }, - - { - // cover sequence statements - "task t ;cover sequence( x);cover\tsequence(y );endtask", - "task t;\n" - " cover sequence (x);\n" - " cover sequence (y);\n" - "endtask\n", - }, - { - // cover sequence statements, with action - "task t ;cover sequence( x) j();cover\tsequence(y )k( );endtask", - "task t;\n" - " cover sequence (x) j();\n" - " cover sequence (y) k();\n" - "endtask\n", - }, - { - // cover sequence statements, with action block - "task t ;cover sequence( x) begin j();end " - " cover\tsequence(y )begin\tk( ); end endtask", - "task t;\n" - " cover sequence (x) begin\n" - " j();\n" - " end\n" - " cover sequence (y) begin\n" - " k();\n" - " end\n" - "endtask\n", - }, - - {// module with disable statements - "module m;always begin :block disable m.block; end endmodule", - "module m;\n" - " always begin : block\n" - " disable m.block;\n" - " end\n" - "endmodule\n"}, - {"module m;always begin disable m.block; end endmodule", - "module m;\n" - " always begin\n" - " disable m.block;\n" - " end\n" - "endmodule\n"}, - - // property test cases - {"module mp ;property p1 ; a|->b;endproperty endmodule", - "module mp;\n" - " property p1;\n" - " a |-> b;\n" - " endproperty\n" - "endmodule\n"}, - {"module mp ;property p1 ; a|->b;endproperty:p1 endmodule", - "module mp;\n" - " property p1;\n" - " a |-> b;\n" - " endproperty : p1\n" // with end label - "endmodule\n"}, - {"module mp ;property p1 ; a|->## 1 b;endproperty endmodule", - "module mp;\n" - " property p1;\n" - " a |-> ##1 b;\n" // with delay - " endproperty\n" - "endmodule\n"}, - {"module mp ;property p1 ; a|->## [0: 1] b;endproperty endmodule", - "module mp;\n" - " property p1;\n" - " a |-> ##[0:1] b;\n" // prefer no spaces with delay range - " endproperty\n" - "endmodule\n"}, - {"module mp ;property p1 ; a|->## [0 : 1] b;endproperty endmodule", - "module mp;\n" - " property p1;\n" - " a |-> ##[0 : 1] b;\n" // limit to one space, symmetrize - " endproperty\n" - "endmodule\n"}, - {"module mp ;property p1 ; a## 1 b;endproperty endmodule", - "module mp;\n" - " property p1;\n" - " a ##1 b;\n" - " endproperty\n" - "endmodule\n"}, - {"module mp ;property p1 ; (a^c)## 1 b;endproperty endmodule", - "module mp;\n" - " property p1;\n" - " (a ^ c) ##1 b;\n" - " endproperty\n" - "endmodule\n"}, - - // covergroup test cases - {// Minimal case - "covergroup c; endgroup\n", - "covergroup c;\n" - "endgroup\n"}, - {// Minimal useful case - "covergroup c @ (posedge clk); coverpoint a; endgroup\n", - "covergroup c @(posedge clk);\n" - " coverpoint a;\n" - "endgroup\n"}, - {// Multiple coverpoints - "covergroup foo @(posedge clk); coverpoint a; coverpoint b; " - "coverpoint c; coverpoint d; endgroup\n", - "covergroup foo @(posedge clk);\n" - " coverpoint a;\n" - " coverpoint b;\n" - " coverpoint c;\n" - " coverpoint d;\n" - "endgroup\n"}, - {// Multiple bins - "covergroup memory @ (posedge ce); address :coverpoint addr {" - "bins low={0,127}; bins high={128,255};} endgroup\n", - "covergroup memory @(posedge ce);\n" - " address: coverpoint addr {\n" - " bins low = {0, 127};\n" - " bins high = {128, 255};\n" - " }\n" - "endgroup\n"}, - {// Custom sample() function - "covergroup c with function sample(bit i); endgroup\n", - "covergroup c with function sample (\n" - " bit i\n" // test cases are wrapped at 40 - ");\n" - "endgroup\n"}, - - // comment-controlled formatter disabling - {"// verilog_format: off\n" // disables whole file - " `include \t\t \"path/to/file.vh\"\n", - "// verilog_format: off\n" - " `include \t\t \"path/to/file.vh\"\n"}, // keeps bad spacing - {"/* verilog_format: off */\n" // disables whole file - " `include \t\t \"path/to/file.svh\" \n", - "/* verilog_format: off */\n" - " `include \t\t \"path/to/file.svh\" \n"}, // keeps bad spacing - {"// verilog_format: on\n" // already enabled, no effect - " `include \t \"path/to/file.svh\" \t\n", - "// verilog_format: on\n" - "`include \"path/to/file.svh\"\n"}, - {"// verilog_format: off\n" - "// verilog_format: on\n" // re-enable right away - " `include \t\t \"path/to/file.svh\" \n", - "// verilog_format: off\n" - "// verilog_format: on\n" - "`include \"path/to/file.svh\"\n"}, - {"/* aaa *//* bbb */\n" // not formatting controls - " `include \t\t \"path/to/file.svh\" \n", // should format - "/* aaa */ /* bbb */\n" // currently inserts 2 spaces - "`include \"path/to/file.svh\"\n"}, - {"/* verilog_format: off *//* verilog_format: on */\n" // re-enable - " `include \t\t \"path/to/file.svh\" \n", - // Note that this case normally wouldn't fit in 40 columns, - // but disabling formatting lets it overflow. - "/* verilog_format: off *//* verilog_format: on */\n" - "`include \"path/to/file.svh\"\n"}, - {"// verilog_format: off\n" - " `include \t\t \"path/to/fileA.svh\" // verilog_format: on\n" - " `include \t\t \"path/to/fileB.svh\" \n", - // re-enable formatting with comment trailing other tokens - "// verilog_format: off\n" - " `include \t\t \"path/to/fileA.svh\" // verilog_format: on\n" - "`include \"path/to/fileB.svh\"\n"}, - {" `include \t\t \"path/to/file1.vh\" \n" // format this - "// verilog_format: off\n" // start disabling - " `include \t\t \"path/to/file2.vh\" \n" - "\t\t\n" - " `include \t\t \"path/to/file3.vh\" \n" - "// verilog_format: on\n" // stop disabling - " `include \t\t \"path/to/file4.vh\" \n", // format this - "`include \"path/to/file1.vh\"\n" - "// verilog_format: off\n" // start disabling - " `include \t\t \"path/to/file2.vh\" \n" - "\t\t\n" - " `include \t\t \"path/to/file3.vh\" \n" - "// verilog_format: on\n" // stop disabling - "`include \"path/to/file4.vh\"\n"}, - {// disabling formatting on a module (to end of file) - "// verilog_format: off\n" - "module m;endmodule\n", - "// verilog_format: off\n" - "module m;endmodule\n"}, - {// disabling formatting on a module (to end of file) - "// verilog_format: off\n" - "module m;\n" - "unindented instantiation;\n" - "endmodule\n", - "// verilog_format: off\n" - "module m;\n" - "unindented instantiation;\n" - "endmodule\n"}, - {// disabling formatting inside a port declaration list disables alignment, - // but falls back to standard compaction. - "module align_off(\n" - "input w ,\n" - " // verilog_format: off\n" - "input wire [y:z] wwww,\n" - " // verilog_format: on\n" - "output reg xx\n" - ");\n" - "endmodule", - "module align_off (\n" - " input w ,\n" // preserved because group is partially disabled - " // verilog_format: off\n" - "input wire [y:z] wwww,\n" // not compacted - " // verilog_format: on\n" - " output reg xx\n" // preserved because group is partially disabled - ");\n" - "endmodule\n"}, - - {// multiple tokens with EOL comment - "module please; // don't break before the comment\n" - "endmodule\n", - "module please\n" - " ; // don't break before the comment\n" - "endmodule\n"}, - {// one token with EOL comment - "module please;\n" - "endmodule // don't break before the comment\n", - "module please;\n" - "endmodule // don't break before the comment\n"}, - { - // line with only an EOL comment - "module wild;\n" - "// a really long comment on its own line to be left alone\n" - "endmodule", - "module wild;\n" - " // a really long comment on its own line to be left alone\n" - "endmodule\n", - }, - { - // primitive declaration - "primitive primitive1(o, s, r);output o;reg o;input s;input r;table 1 " - "? :" - " ? : 0; ? 1 : 0 : -; endtable endprimitive", - "primitive primitive1(o, s, r);\n" - " output o;\n" - " reg o;\n" - " input s;\n" - " input r;\n" - " table\n" - " 1 ? : ? : 0;\n" - " ? 1 : 0 : -;\n" - " endtable\n" - "endprimitive\n", - }, - { - // one-input combinatorial UDP - "primitive primitive1 ( o,i ) ;output o;input i;" - " table 1 : 0 ; 0 : 1 ; endtable endprimitive", - "primitive primitive1(o, i);\n" - " output o;\n" - " input i;\n" - " table\n" - " 1 : 0;\n" - " 0 : 1;\n" - " endtable\n" - "endprimitive\n", - }, - { - // two-input combinatorial UDP - "primitive primitive2(o, s, r);output o;input s;input r;" - "table 1 ? : 0;? 1 : -; endtable endprimitive", - "primitive primitive2(o, s, r);\n" - " output o;\n" - " input s;\n" - " input r;\n" - " table\n" - " 1 ? : 0;\n" - " ? 1 : -;\n" - " endtable\n" - "endprimitive\n", - }, - { - // ten-input combinatorial UDP - "primitive comb10(o, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9);" - "output o;input i0, i1, i2, i3, i4, i5, i6, i7, i8, i9;" - "table 0 ? ? ? ? ? ? ? ? 0 : 0;1 ? ? ? ? ? ? ? ? 0 : 1;" - "1 ? ? ? ? ? ? ? ? 1 : 1;0 ? ? ? ? ? ? ? ? 1 : 0;endtable endprimitive", - "primitive comb10(o, i0, i1, i2, i3, i4,\n" - " i5, i6, i7, i8, i9);\n" - " output o;\n" - " input i0, i1, i2, i3, i4, i5, i6, i7,\n" - " i8, i9;\n" - " table\n" - " 0 ? ? ? ? ? ? ? ? 0 : 0;\n" - " 1 ? ? ? ? ? ? ? ? 0 : 1;\n" - " 1 ? ? ? ? ? ? ? ? 1 : 1;\n" - " 0 ? ? ? ? ? ? ? ? 1 : 0;\n" - " endtable\n" - "endprimitive\n", - }, - { - // sequential level-sensitive UDP - "primitive level_seq(o, c, d);output o;reg o;" - " input c;input d;table\n" - "// C D state O\n" - "0 ? : ? : -; // No Change\n" - "? 0 : 0 : 0; // Unknown\n" - "endtable endprimitive", - "primitive level_seq(o, c, d);\n" - " output o;\n" - " reg o;\n" - " input c;\n" - " input d;\n" - " table\n" - " // C D state O\n" - " 0 ? : ? : -; // No Change\n" - " ? 0 : 0 : 0; // Unknown\n" - " endtable\n" - "endprimitive\n", - }, - { - // sequential edge-sensitive UDP - "primitive edge_seq(o, c, d);output o;reg o;input c;input d;" - "table (01) 0 : ? : 0;(01) 1 : ? : 1;(0?) 1 : 1 : 1;(0?) 0 : 0 : " - "0;\n" - "// ignore negative c\n" - "(?0) ? : ? : -;\n" - "// ignore changes on steady c\n" - "? (?\?) : ? : -; endtable endprimitive", - "primitive edge_seq(o, c, d);\n" - " output o;\n" - " reg o;\n" - " input c;\n" - " input d;\n" - " table\n" - " (01) 0 : ? : 0;\n" - " (01) 1 : ? : 1;\n" - " (0?) 1 : 1 : 1;\n" - " (0?) 0 : 0 : 0;\n" - " // ignore negative c\n" - " (?0) ? : ? : -;\n" - " // ignore changes on steady c\n" - " ? (?\?) : ? : -;\n" - " endtable\n" - "endprimitive\n", - }, - { - // mixed sequential UDP - "primitive mixed(o, clk, j, k, preset, clear);output o;reg o;" - "input c;input j, k;input preset, clear;table " - "? ?? 01:?:1 ; // preset logic\n" - "? ?? *1:1:1 ;? ?? 10:?:0 ; // clear logic\n" - "? ?? 1*:0:0 ;r 00 00:0:1 ; // normal\n" - "r 00 11:?:- ;r 01 11:?:0 ;r 10 11:?:1 ;r 11 11:0:1 ;" - "r 11 11:1:0 ;f ?? ??:?:- ;b *? ??:?:- ;" - " // j and k\n" - "b ?* ??:?:- ;endtable endprimitive\n", - "primitive mixed(o, clk, j, k, preset,\n" - " clear);\n" - " output o;\n" - " reg o;\n" - " input c;\n" - " input j, k;\n" - " input preset, clear;\n" - " table\n" - " ? ? ? 0 1 : ? : 1; // preset logic\n" - " ? ? ? * 1 : 1 : 1;\n" - " ? ? ? 1 0 : ? : 0; // clear logic\n" - " ? ? ? 1 * : 0 : 0;\n" - " r 0 0 0 0 : 0 : 1; // normal\n" - " r 0 0 1 1 : ? : -;\n" - " r 0 1 1 1 : ? : 0;\n" - " r 1 0 1 1 : ? : 1;\n" - " r 1 1 1 1 : 0 : 1;\n" - " r 1 1 1 1 : 1 : 0;\n" - " f ? ? ? ? : ? : -;\n" - " b * ? ? ? : ? : -; // j and k\n" - " b ? * ? ? : ? : -;\n" - " endtable\n" - "endprimitive\n", - }, - // un-lexed multiline macro arg token - { - " task S ; " - "`ppgJH3JoxhwyTmZ2dgPiuMQzpRAWiSs(" - "{xYtxuh6.FIMcVPEWfhtoI2FSe, xYtxuh6.ZVL5XASVGLYz32} == " - "SqRgavM[15:2];\n" - "JgQLBG == 4'h0;, \"foo\" )\n" - "endtask\n", - "task S;\n" - " `ppgJH3JoxhwyTmZ2dgPiuMQzpRAWiSs(\n" - " {xYtxuh6.FIMcVPEWfhtoI2FSe, xYtxuh6.ZVL5XASVGLYz32} == " - "SqRgavM[15:2];\n" - "JgQLBG == 4'h0;,\n" - " \"foo\")\n" - "endtask\n", - }, - - // module instantiation named ports tabular alignment - //{// module instantiation with no port, only comments - // "module m;\n" - // "foo bar(\n" - // "\t//comment1\n" - // "//comment2\n" - // ");\n" - // "endmodule\n", - // "module m;\n" - // " foo bar (\n" - // " //comment1\n" - // " //comment2\n" - // " );\n" - // "endmodule\n" - //}, - {// all named ports - "module m;\n" - "foo bar(.a(a), .aa(aa), .aaa(aaa));\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a),\n" - " .aa (aa),\n" - " .aaa(aaa)\n" - " );\n" - "endmodule\n"}, - {// named ports left unconnected - "module m;\n" - "foo bar(.a(), .aa(), .aaa());\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (),\n" - " .aa (),\n" - " .aaa()\n" - " );\n" - "endmodule\n"}, - {// multiple named ports groups separated by blank line - "module m;\n" - "foo bar(.a(a), .aaa(aaa),\n\n .b(b), .bbbbbb(bbbbb));\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a),\n" - " .aaa(aaa),\n" - "\n" - " .b (b),\n" - " .bbbbbb(bbbbb)\n" - " );\n" - "endmodule\n"}, - {// named ports with concatenation - "module m;\n" - "foo bar(.a(a), .aaa({a,b,c}));\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a),\n" - " .aaa({a, b, c})\n" - " );\n" - "endmodule\n"}, - {// name ports with slices - "module m;\n" - "foo bar(.a(a), .aaa(q[r:s]));\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a),\n" - " .aaa(q[r:s])\n" - " );\n" - "endmodule\n"}, - {// named ports with pre-proc directives - "module m;\n" - "foo bar(.a(a), `ifdef MACRO .aa(aa), `endif .aaa(aaa));\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a),\n" - "`ifdef MACRO\n" - " .aa (aa),\n" - "`endif\n" - " .aaa(aaa)\n" - " );\n" - "endmodule\n"}, - {// named ports with macros - "module m;\n" - "foo bar(.a(a), .aa(aa[`RANGE]), .aaa(aaa));\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a),\n" - " .aa (aa[`RANGE]),\n" - " .aaa(aaa)\n" - " );\n" - "endmodule\n"}, - {"module m;\n" - "foo bar(.a(a), .AA, .aaa(aaa));\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a),\n" - " .AA,\n" - " .aaa(aaa)\n" - " );\n" - "endmodule\n"}, - {// name ports with comments - "module m;\n" - "foo bar(.a(a), .aa(aa)/*comment*/, .aaa(aaa));\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a),\n" - " .aa (aa) /*comment*/,\n" - " .aaa(aaa)\n" - " );\n" - "endmodule\n"}, - {"module m;\n" - "foo bar(.a(a),//comment1\n .aaa(aaa)//comment2\n);\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a), //comment1\n" - " .aaa(aaa) //comment2\n" - " );\n" - "endmodule\n"}, - {"module m;\n" - "foo bar(.a(a),\n" - " //.aa(aa),\n" - ".aaa(aaa));\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a),\n" - " //.aa(aa),\n" - " .aaa(aaa)\n" - " );\n" - "endmodule\n"}, - {"module m;\n" - "foo bar(\n" - ".a(a) //comment1\n" - ", .aaa(aaa) //comment2\n" - ") //comment3\n" - ";\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a) //comment1\n" - " , .aaa(aaa) //comment2\n" - " ) //comment3\n" - " ;\n" - "endmodule\n"}, - {// module instantiation with all implicit connections - "module m;\n" - "foo bar(.a, .aa, .aaaaa);\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a,\n" - " .aa,\n" - " .aaaaa\n" - " );\n" - "endmodule\n"}, - {// named ports corssed with implicit connections - "module m;\n" - "foo bar(.a(a), .aa, .aaaaa(aaaaa));\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a),\n" - " .aa,\n" - " .aaaaa(aaaaa)\n" - " );\n" - "endmodule\n"}, - {// named ports corssed with wildcard connections - "module m;\n" - "foo bar(.a(a), .aaa(aaa), .*);\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a),\n" - " .aaa(aaa),\n" - " .*\n" - " );\n" - "endmodule\n"}, - {"module m;\n" - "foo bar(.a(a), .aa(aa), .* , .aaa(aaa));\n" - "endmodule\n", - "module m;\n" - " foo bar (\n" - " .a (a),\n" - " .aa (aa),\n" - " .*,\n" - " .aaa(aaa)\n" - " );\n" - "endmodule\n"}, - - // Parameterized data types, declarations inside #() tabular alignment - {// parameterized module with 'list_of_param_assignments' - "module foo #(A = 2, AA = 22, AAA = 222);\n" - "endmodule\n", - "module foo #(\n" - " A = 2,\n" - " AA = 22,\n" - " AAA = 222\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'parameter_declaration' - "module foo #(parameter int a = 2, parameter int aa = 22);\n" - "endmodule\n", - "module foo #(\n" - " parameter int a = 2,\n" - " parameter int aa = 22\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'parameter_declaration' and comments - "module foo #(//comment\nparameter int a = 2, parameter int aa = 22);\n" - "endmodule\n", - "module foo #( //comment\n" - " parameter int a = 2,\n" - " parameter int aa = 22\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'parameter_declaration' and trailing comments - "module foo #(parameter int a = 2,//comment\n parameter int aa = 22);\n" - "endmodule\n", - "module foo #(\n" - " parameter int a = 2, //comment\n" - " parameter int aa = 22\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'parameter_declaration' and pre-proc - "module foo #(parameter int a = 2,\n" - "`ifdef MACRO parameter int aa = 22, `endif\n" - "parameter int aaa = 222);\n" - "endmodule\n", - "module foo #(\n" - " parameter int a = 2,\n" - "`ifdef MACRO\n" - " parameter int aa = 22,\n" - "`endif\n" - " parameter int aaa = 222\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'parameter_declaration' and packed dimensions - "module foo #(parameter logic [3:0] a = 2, parameter logic [30:0] aa = " - "22);\n" - "endmodule\n", - "module foo #(\n" - " parameter logic [ 3:0] a = 2,\n" - " parameter logic [30:0] aa = 22\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'parameter_declaration' and unpacked - // dimensions - "module foo #(parameter logic a[3:0] = 2, parameter logic aa [30:0] = " - "22);\n" - "endmodule\n", - "module foo #(\n" - " parameter logic a [ 3:0] = 2,\n" - " parameter logic aa[30:0] = 22\n" - ");\n" - "endmodule\n"}, - - {// parameterized module with 'local_parameter_declaration' - "module foo #(localparam int a = 2, localparam int aa = 22);\n" - "endmodule\n", - "module foo #(\n" - " localparam int a = 2,\n" - " localparam int aa = 22\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'local_parameter_declaration' and comments - "module foo #(//comment\nlocalparam int a = 2, localparam int aa = 22);\n" - "endmodule\n", - "module foo #( //comment\n" - " localparam int a = 2,\n" - " localparam int aa = 22\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'local_parameter_declaration' and trailing - // comments - "module foo #(localparam int a = 2,//comment\n localparam int aa = 22);\n" - "endmodule\n", - "module foo #(\n" - " localparam int a = 2, //comment\n" - " localparam int aa = 22\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'local_parameter_declaration' and pre-proc - "module foo #(localparam int a = 2,\n" - "`ifdef MACRO localparam int aa = 22, `endif\n" - "localparam int aaa = 222);\n" - "endmodule\n", - "module foo #(\n" - " localparam int a = 2,\n" - "`ifdef MACRO\n" - " localparam int aa = 22,\n" - "`endif\n" - " localparam int aaa = 222\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'local_parameter_declaration' and packed - // dimensions - "module foo #(localparam logic [3:0] a = 2, localparam logic [30:0] aa = " - "22);\n" - "endmodule\n", - "module foo #(\n" - " localparam logic [ 3:0] a = 2,\n" - " localparam logic [30:0] aa = 22\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'local_parameter_declaration' and unpacked - // dimensions - "module foo #(localparam logic a[3:0] = 2, localparam logic aa [30:0] = " - "22);\n" - "endmodule\n", - "module foo #(\n" - " localparam logic a [ 3:0] = 2,\n" - " localparam logic aa[30:0] = 22\n" - ");\n" - "endmodule\n"}, - - {// parameterized module with 'data_type list_of_param_assignments' - "module foo #( int a = 2, real aa = 22, longint aaa = 222);\n" - "endmodule\n", - "module foo #(\n" - " int a = 2,\n" - " real aa = 22,\n" - " longint aaa = 222\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'data_type list_of_param_assignments' and - // comments - "module foo #(//comment\nint a = 2, shortreal aa = 22, longint aaa = " - "222);\n" - "endmodule\n", - "module foo #( //comment\n" - " int a = 2,\n" - " shortreal aa = 22,\n" - " longint aaa = 222\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'data_type list_of_param_assignments' and - // trailing comments - "module foo #(int a = 2, shortreal aa = 22,//comment\n longint aaa = " - "222);\n" - "endmodule\n", - "module foo #(\n" - " int a = 2,\n" - " shortreal aa = 22, //comment\n" - " longint aaa = 222\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'data_type list_of_param_assignments' and - // pre-proc - "module foo #(int a = 2,\n" - "`ifdef MACRO shortreal aa = 22, `endif\n" - " longint aaa = 222);\n" - "endmodule\n", - "module foo #(\n" - " int a = 2,\n" - "`ifdef MACRO\n" - " shortreal aa = 22,\n" - "`endif\n" - " longint aaa = 222\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'data_type list_of_param_assignments' and - // packed dimensions - "module foo #(bit [1:0] a = 2, reg [12:0] aa = 22, logic [123:0] aaa = " - "222);\n" - "endmodule\n", - "module foo #(\n" - " bit [ 1:0] a = 2,\n" - " reg [ 12:0] aa = 22,\n" - " logic [123:0] aaa = 222\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'data_type list_of_param_assignments' and - // unpacked dimensions - "module foo #(bit a[1:0] = 2, reg aa[12:0] = 22, logic aaa [123:0] = " - "222);\n" - "endmodule\n", - "module foo #(\n" - " bit a [ 1:0] = 2,\n" - " reg aa [ 12:0] = 22,\n" - " logic aaa[123:0] = 222\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'type list_of_type_assignments' - "module foo #(type T = int, type TT = bit, type TTT= C#(logic) );\n" - "endmodule\n", - "module foo #(\n" - " type T = int,\n" - " type TT = bit,\n" - " type TTT = C#(logic)\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'type list_of_type_assignments' and comments - "module foo #(//comment\ntype T = int, type TT = bit, type TTT= C#(logic) " - ");\n" - "endmodule\n", - "module foo #( //comment\n" - " type T = int,\n" - " type TT = bit,\n" - " type TTT = C#(logic)\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'data_type list_of_param_assignments' and - // trailing comments - "module foo #(type T = int, type TT = bit, //comment\n type TTT= " - "C#(logic) );\n" - "endmodule\n", - "module foo #(\n" - " type T = int,\n" - " type TT = bit, //comment\n" - " type TTT = C#(logic)\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'data_type list_of_param_assignments' and - // pre-proc - "module foo #(type T = int,\n" - "`ifdef MACRO type TT = bit, `endif\n" - " type TTT= C#(logic));\n" - "endmodule\n", - "module foo #(\n" - " type T = int,\n" - "`ifdef MACRO\n" - " type TT = bit,\n" - "`endif\n" - " type TTT = C#(logic)\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'data_type list_of_param_assignments' and - // packed dimensions - "module foo #(type T = int [3:0], type TT = bit [250:0]);\n" - "endmodule\n", - "module foo #(\n" - " type T = int [ 3:0],\n" - " type TT = bit [250:0]\n" - ");\n" - "endmodule\n"}, - {"module foo #(type T = int, " - "A = 2, int AA = 22, parameter AAA = 222, parameter longint AAAA = 2222, " - "localparam AAAAA = 22222, localparam real AAAAAA = 222222" - ");\n" - "endmodule\n", - "module foo #(\n" - " type T = int,\n" - " A = 2,\n" - " int AA = 22,\n" - " parameter AAA = 222,\n" - " parameter longint AAAA = 2222,\n" - " localparam AAAAA = 22222,\n" - " localparam real AAAAAA = 222222\n" - ");\n" - "endmodule\n"}, - {// parameterized module with built-in data type - "module foo #(int a = 2, real abc = 2234);\n" - "endmodule\n", - "module foo #(\n" - " int a = 2,\n" - " real abc = 2234\n" - ");\n" - "endmodule\n"}, - {// parameterized module with type - "module foo #(type TYPE1 = int, type TYPE2 = boo);\n" - "endmodule\n", - "module foo #(\n" - " type TYPE1 = int,\n" - " type TYPE2 = boo\n" - ");\n" - "endmodule\n"}, - {"module foo#(localparam type TYPE1 = int, type TYPE22 = bool, parameter " - " type TYPE333 = real);\n" - "endmodule\n", - "module foo #(\n" - " localparam type TYPE1 = int,\n" - " type TYPE22 = bool,\n" - " parameter type TYPE333 = real\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'data_type list_of_param_assignments' and 1D - // packed dimensions - "module foo #(parameter type T = int [3:0], type TT = bit [123:0]);\n" - "endmodule\n", - "module foo #(\n" - " parameter type T = int [ 3:0],\n" - " type TT = bit [123:0]\n" - ");\n" - "endmodule\n"}, - {// parameterized module with 'data_type list_of_param_assignments' and 2D - // packed dimensions - "module foo #(type T = int [3:0][123:0], type TT = bit [123:0][1:0]);\n" - "endmodule\n", - "module foo #(\n" - " type T = int [ 3:0][123:0],\n" - " type TT = bit [123:0][ 1:0]\n" - ");\n" - "endmodule\n"}, - {// parametrized module with user defined data types - "module foo #(type T = my_type1_t, type TT = my_pkg::my_type2_t);\n" - "endmodule\n", - "module foo #(\n" - " type T = my_type1_t,\n" - " type TT = my_pkg::my_type2_t\n" - ");\n" - "endmodule\n"}, - - {// parameterized class with 'list_of_param_assignments' - "class foo #(A = 2, AA = 22, AAA = 222);\n" - "endclass\n", - "class foo #(\n" - " A = 2,\n" - " AA = 22,\n" - " AAA = 222\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'parameter_declaration' - "class foo #(parameter int a = 2, parameter int aa = 22);\n" - "endclass\n", - "class foo #(\n" - " parameter int a = 2,\n" - " parameter int aa = 22\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'parameter_declaration' and comments - "class foo #(//comment\nparameter int a = 2, parameter int aa = 22);\n" - "endclass\n", - "class foo #( //comment\n" - " parameter int a = 2,\n" - " parameter int aa = 22\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'parameter_declaration' and trailing comments - "class foo #(parameter int a = 2,//comment\n parameter int aa = 22);\n" - "endclass\n", - "class foo #(\n" - " parameter int a = 2, //comment\n" - " parameter int aa = 22\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'parameter_declaration' and pre-proc - "class foo #(parameter int a = 2,\n" - "`ifdef MACRO parameter int aa = 22, `endif\n" - "parameter int aaa = 222);\n" - "endclass\n", - "class foo #(\n" - " parameter int a = 2,\n" - "`ifdef MACRO\n" - " parameter int aa = 22,\n" - "`endif\n" - " parameter int aaa = 222\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'parameter_declaration' and packed dimensions - "class foo #(parameter logic [3:0] a = 2, parameter logic [30:0] aa = " - "22);\n" - "endclass\n", - "class foo #(\n" - " parameter logic [ 3:0] a = 2,\n" - " parameter logic [30:0] aa = 22\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'parameter_declaration' and unpacked dimensions - "class foo #(parameter logic a[3:0] = 2, parameter logic aa [30:0] = " - "22);\n" - "endclass\n", - "class foo #(\n" - " parameter logic a [ 3:0] = 2,\n" - " parameter logic aa[30:0] = 22\n" - ");\n" - "endclass\n"}, - - {// parameterized class with 'local_parameter_declaration' - "class foo #(localparam int a = 2, localparam int aa = 22);\n" - "endclass\n", - "class foo #(\n" - " localparam int a = 2,\n" - " localparam int aa = 22\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'local_parameter_declaration' and comments - "class foo #(//comment\nlocalparam int a = 2, localparam int aa = 22);\n" - "endclass\n", - "class foo #( //comment\n" - " localparam int a = 2,\n" - " localparam int aa = 22\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'local_parameter_declaration' and trailing - // comments - "class foo #(localparam int a = 2,//comment\n localparam int aa = 22);\n" - "endclass\n", - "class foo #(\n" - " localparam int a = 2, //comment\n" - " localparam int aa = 22\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'local_parameter_declaration' and pre-proc - "class foo #(localparam int a = 2,\n" - "`ifdef MACRO localparam int aa = 22, `endif\n" - "localparam int aaa = 222);\n" - "endclass\n", - "class foo #(\n" - " localparam int a = 2,\n" - "`ifdef MACRO\n" - " localparam int aa = 22,\n" - "`endif\n" - " localparam int aaa = 222\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'local_parameter_declaration' and packed - // dimensions - "class foo #(localparam logic [3:0] a = 2, localparam logic [30:0] aa = " - "22);\n" - "endclass\n", - "class foo #(\n" - " localparam logic [ 3:0] a = 2,\n" - " localparam logic [30:0] aa = 22\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'local_parameter_declaration' and unpacked - // dimensions - "class foo #(localparam logic a[3:0] = 2, localparam logic aa [30:0] = " - "22);\n" - "endclass\n", - "class foo #(\n" - " localparam logic a [ 3:0] = 2,\n" - " localparam logic aa[30:0] = 22\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'data_type list_of_param_assignments' - "class foo #( int a = 2, real aa = 22, longint aaa = 222);\n" - "endclass\n", - "class foo #(\n" - " int a = 2,\n" - " real aa = 22,\n" - " longint aaa = 222\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'data_type list_of_param_assignments' and - // comments - "class foo #(//comment\nint a = 2, shortreal aa = 22, longint aaa = " - "222);\n" - "endclass\n", - "class foo #( //comment\n" - " int a = 2,\n" - " shortreal aa = 22,\n" - " longint aaa = 222\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'data_type list_of_param_assignments' and - // trailing comments - "class foo #(int a = 2, shortreal aa = 22,//comment\n longint aaa = " - "222);\n" - "endclass\n", - "class foo #(\n" - " int a = 2,\n" - " shortreal aa = 22, //comment\n" - " longint aaa = 222\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'data_type list_of_param_assignments' and - // pre-proc - "class foo #(int a = 2,\n" - "`ifdef MACRO shortreal aa = 22, `endif\n" - " longint aaa = 222);\n" - "endclass\n", - "class foo #(\n" - " int a = 2,\n" - "`ifdef MACRO\n" - " shortreal aa = 22,\n" - "`endif\n" - " longint aaa = 222\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'data_type list_of_param_assignments' and - // packed dimensions - "class foo #(bit [1:0] a = 2, reg [12:0] aa = 22, logic [123:0] aaa = " - "222);\n" - "endclass\n", - "class foo #(\n" - " bit [ 1:0] a = 2,\n" - " reg [ 12:0] aa = 22,\n" - " logic [123:0] aaa = 222\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'data_type list_of_param_assignments' and - // unpacked dimensions - "class foo #(bit a[1:0] = 2, reg aa[12:0] = 22, logic aaa [123:0] = " - "222);\n" - "endclass\n", - "class foo #(\n" - " bit a [ 1:0] = 2,\n" - " reg aa [ 12:0] = 22,\n" - " logic aaa[123:0] = 222\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'type list_of_type_assignments' - "class foo #(type T = int, type TT = bit, type TTT= C#(logic) );\n" - "endclass\n", - "class foo #(\n" - " type T = int,\n" - " type TT = bit,\n" - " type TTT = C#(logic)\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'type list_of_type_assignments' and comments - "class foo #(//comment\ntype T = int, type TT = bit, type TTT= C#(logic) " - ");\n" - "endclass\n", - "class foo #( //comment\n" - " type T = int,\n" - " type TT = bit,\n" - " type TTT = C#(logic)\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'data_type list_of_param_assignments' and - // trailing comments - "class foo #(type T = int, type TT = bit, //comment\n type TTT= C#(logic) " - ");\n" - "endclass\n", - "class foo #(\n" - " type T = int,\n" - " type TT = bit, //comment\n" - " type TTT = C#(logic)\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'data_type list_of_param_assignments' and - // pre-proc - "class foo #(type T = int,\n" - "`ifdef MACRO type TT = bit, `endif\n" - " type TTT= C#(logic));\n" - "endclass\n", - "class foo #(\n" - " type T = int,\n" - "`ifdef MACRO\n" - " type TT = bit,\n" - "`endif\n" - " type TTT = C#(logic)\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'data_type list_of_param_assignments' and - // packed dimensions - "class foo #(type T = int [3:0], type TT = bit [250:0]);\n" - "endclass\n", - "class foo #(\n" - " type T = int [ 3:0],\n" - " type TT = bit [250:0]\n" - ");\n" - "endclass\n"}, - {"class foo #(type T = int, " - "A = 2, int AA = 22, parameter AAA = 222, parameter longint AAAA = 2222, " - "localparam AAAAA = 22222, localparam real AAAAAA = 222222" - ");\n" - "endclass\n", - "class foo #(\n" - " type T = int,\n" - " A = 2,\n" - " int AA = 22,\n" - " parameter AAA = 222,\n" - " parameter longint AAAA = 2222,\n" - " localparam AAAAA = 22222,\n" - " localparam real AAAAAA = 222222\n" - ");\n" - "endclass\n"}, - {// parameterized class with built-in data type - "class foo #(int a = 2, real abc = 2234);\n" - "endclass\n", - "class foo #(\n" - " int a = 2,\n" - " real abc = 2234\n" - ");\n" - "endclass\n"}, - {// parameterized class with type - "class foo #(type TYPE1 = int, type TYPE2 = boo);\n" - "endclass\n", - "class foo #(\n" - " type TYPE1 = int,\n" - " type TYPE2 = boo\n" - ");\n" - "endclass\n"}, - {"class foo#(localparam type TYPE1 = int, type TYPE22 = bool, parameter " - "type TYPE333 = real);\n" - "endclass\n", - "class foo #(\n" - " localparam type TYPE1 = int,\n" - " type TYPE22 = bool,\n" - " parameter type TYPE333 = real\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'data_type list_of_param_assignments' and 1D - // packed dimensions - "class foo #(parameter type T = int [3:0], type TT = bit [123:0]);\n" - "endclass\n", - "class foo #(\n" - " parameter type T = int [ 3:0],\n" - " type TT = bit [123:0]\n" - ");\n" - "endclass\n"}, - {// parameterized class with 'data_type list_of_param_assignments' and 2D - // packed dimensions - "class foo #(type T = int [3:0][123:0], type TT = bit [123:0][1:0]);\n" - "endclass\n", - "class foo #(\n" - " type T = int [ 3:0][123:0],\n" - " type TT = bit [123:0][ 1:0]\n" - ");\n" - "endclass\n"}, - {// parametrized class with user defined data types - "class foo #(type T = my_type1_t, type TT = my_pkg::my_type2_t);\n" - "endclass\n", - "class foo #(\n" - " type T = my_type1_t,\n" - " type TT = my_pkg::my_type2_t\n" - ");\n" - "endclass\n"}, - - {// parameterized interface with 'local_parameter_declaration' - "interface foo #(localparam int a = 2, localparam int aa = 22);\n" - "endinterface\n", - "interface foo #(\n" - " localparam int a = 2,\n" - " localparam int aa = 22\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'local_parameter_declaration' and comments - "interface foo #(//comment\nlocalparam int a = 2, localparam int aa = " - "22);\n" - "endinterface\n", - "interface foo #( //comment\n" - " localparam int a = 2,\n" - " localparam int aa = 22\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'local_parameter_declaration' and trailing - // comments - "interface foo #(localparam int a = 2,//comment\n localparam int aa = " - "22);\n" - "endinterface\n", - "interface foo #(\n" - " localparam int a = 2, //comment\n" - " localparam int aa = 22\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'local_parameter_declaration' and pre-proc - "interface foo #(localparam int a = 2,\n" - "`ifdef MACRO localparam int aa = 22, `endif\n" - "localparam int aaa = 222);\n" - "endinterface\n", - "interface foo #(\n" - " localparam int a = 2,\n" - "`ifdef MACRO\n" - " localparam int aa = 22,\n" - "`endif\n" - " localparam int aaa = 222\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'local_parameter_declaration' and packed - // dimensions - "interface foo #(localparam logic [3:0] a = 2, localparam logic [30:0] aa " - "= 22);\n" - "endinterface\n", - "interface foo #(\n" - " localparam logic [ 3:0] a = 2,\n" - " localparam logic [30:0] aa = 22\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'local_parameter_declaration' and unpacked - // dimensions - "interface foo #(localparam logic a[3:0] = 2, localparam logic aa [30:0] " - "= 22);\n" - "endinterface\n", - "interface foo #(\n" - " localparam logic a [ 3:0] = 2,\n" - " localparam logic aa[30:0] = 22\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'data_type list_of_param_assignments' - "interface foo #( int a = 2, real aa = 22, longint aaa = 222);\n" - "endinterface\n", - "interface foo #(\n" - " int a = 2,\n" - " real aa = 22,\n" - " longint aaa = 222\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'data_type list_of_param_assignments' and - // comments - "interface foo #(//comment\nint a = 2, shortreal aa = 22, longint aaa = " - "222);\n" - "endinterface\n", - "interface foo #( //comment\n" - " int a = 2,\n" - " shortreal aa = 22,\n" - " longint aaa = 222\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'data_type list_of_param_assignments' and - // trailing comments - "interface foo #(int a = 2, shortreal aa = 22,//comment\n longint aaa = " - "222);\n" - "endinterface\n", - "interface foo #(\n" - " int a = 2,\n" - " shortreal aa = 22, //comment\n" - " longint aaa = 222\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'data_type list_of_param_assignments' and - // pre-proc - "interface foo #(int a = 2,\n" - "`ifdef MACRO shortreal aa = 22, `endif\n" - " longint aaa = 222);\n" - "endinterface\n", - "interface foo #(\n" - " int a = 2,\n" - "`ifdef MACRO\n" - " shortreal aa = 22,\n" - "`endif\n" - " longint aaa = 222\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'data_type list_of_param_assignments' and - // packed dimensions - "interface foo #(bit [1:0] a = 2, reg [12:0] aa = 22, logic [123:0] aaa " - "= 222);\n" - "endinterface\n", - "interface foo #(\n" - " bit [ 1:0] a = 2,\n" - " reg [ 12:0] aa = 22,\n" - " logic [123:0] aaa = 222\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'data_type list_of_param_assignments' and - // unpacked dimensions - "interface foo #(bit a[1:0] = 2, reg aa[12:0] = 22, logic aaa [123:0] " - "= 222);\n" - "endinterface\n", - "interface foo #(\n" - " bit a [ 1:0] = 2,\n" - " reg aa [ 12:0] = 22,\n" - " logic aaa[123:0] = 222\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'type list_of_type_assignments' - "interface foo #(type T = int, type TT = bit, type TTT= C#(logic) );\n" - "endinterface\n", - "interface foo #(\n" - " type T = int,\n" - " type TT = bit,\n" - " type TTT = C#(logic)\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'type list_of_type_assignments' and - // comments - "interface foo #(//comment\ntype T = int, type TT = bit, type TTT= " - "C#(logic) );\n" - "endinterface\n", - "interface foo #( //comment\n" - " type T = int,\n" - " type TT = bit,\n" - " type TTT = C#(logic)\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'data_type list_of_param_assignments' and - // trailing comments - "interface foo #(type T = int, type TT = bit, //comment\n type TTT= " - "C#(logic) );\n" - "endinterface\n", - "interface foo #(\n" - " type T = int,\n" - " type TT = bit, //comment\n" - " type TTT = C#(logic)\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'data_type list_of_param_assignments' and - // pre-proc - "interface foo #(type T = int,\n" - "`ifdef MACRO type TT = bit, `endif\n" - " type TTT= C#(logic));\n" - "endinterface\n", - "interface foo #(\n" - " type T = int,\n" - "`ifdef MACRO\n" - " type TT = bit,\n" - "`endif\n" - " type TTT = C#(logic)\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'data_type list_of_param_assignments' and - // packed dimensions - "interface foo #(type T = int [3:0], type TT = bit [250:0]);\n" - "endinterface\n", - "interface foo #(\n" - " type T = int [ 3:0],\n" - " type TT = bit [250:0]\n" - ");\n" - "endinterface\n"}, - {"interface foo #(type T = int, " - "A = 2, int AA = 22, parameter AAA = 222, parameter longint AAAA = 2222, " - "localparam AAAAA = 22222, localparam real AAAAAA = 222222" - ");\n" - "endinterface\n", - "interface foo #(\n" - " type T = int,\n" - " A = 2,\n" - " int AA = 22,\n" - " parameter AAA = 222,\n" - " parameter longint AAAA = 2222,\n" - " localparam AAAAA = 22222,\n" - " localparam real AAAAAA = 222222\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with built-in data type - "interface foo #(int a = 2, real abc = 2234);\n" - "endinterface\n", - "interface foo #(\n" - " int a = 2,\n" - " real abc = 2234\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with type - "interface foo #(type TYPE1 = int, type TYPE2 = boo);\n" - "endinterface\n", - "interface foo #(\n" - " type TYPE1 = int,\n" - " type TYPE2 = boo\n" - ");\n" - "endinterface\n"}, - {"interface foo#(localparam type TYPE1 = int, type TYPE22 = bool, " - "parameter type TYPE333 = real);\n" - "endinterface\n", - "interface foo #(\n" - " localparam type TYPE1 = int,\n" - " type TYPE22 = bool,\n" - " parameter type TYPE333 = real\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'data_type list_of_param_assignments' and - // 1D packed dimensions - "interface foo #(parameter type T = int [3:0], type TT = bit [123:0]);\n" - "endinterface\n", - "interface foo #(\n" - " parameter type T = int [ 3:0],\n" - " type TT = bit [123:0]\n" - ");\n" - "endinterface\n"}, - {// parameterized interface with 'data_type list_of_param_assignments' and - // 2D packed dimensions - "interface foo #(type T = int [3:0][123:0], type TT = bit [123:0][1:0]);\n" - "endinterface\n", - "interface foo #(\n" - " type T = int [ 3:0][123:0],\n" - " type TT = bit [123:0][ 1:0]\n" - ");\n" - "endinterface\n"}, - {// parametrized interface with user defined data types - "interface foo #(type T = my_type1_t, type TT = my_pkg::my_type2_t);\n" - "endinterface\n", - "interface foo #(\n" - " type T = my_type1_t,\n" - " type TT = my_pkg::my_type2_t\n" - ");\n" - "endinterface\n"}, - {// wildcard import package at module header - "module foo import bar::*; (baz); endmodule\n", - "module foo\n" - " import bar::*;\n" - "(\n" - " baz\n" - ");\n" - "endmodule\n"}, - {// import package at module header - "module foo import bar::baz; (qux); endmodule\n", - "module foo\n" - " import bar::baz;\n" - "(\n" - " qux\n" - ");\n" - "endmodule\n"}, - {// wildcard import multiple packages at module header - "module foo import bar::*,baz::*; (qux); endmodule\n", - "module foo\n" - " import bar::*, baz::*;\n" - "(\n" - " qux\n" - ");\n" - "endmodule\n"}, - {// separate package import declarations in module header - "module foo import bar::*,baz::*; import q_pkg::qux; (qux); endmodule\n", - "module foo\n" - " import bar::*, baz::*;\n" - " import q_pkg::qux;\n" - "(\n" - " qux\n" - ");\n" - "endmodule\n"}, - {// import package at module header - "module foo import bar::baz; #(int p = 3)(qux); endmodule\n", - "module foo\n" - " import bar::baz;\n" - "#(\n" - " int p = 3\n" - ") (\n" - " qux\n" - ");\n" - "endmodule\n"}, - // Space between return keyword and return value - {"function int foo(logic [31:0] data); return{<<8{data}}; endfunction", - "function int foo(logic [31:0] data);\n" - " return {<<8{data}};\n" - "endfunction\n"}, - {"function int f;return(1);endfunction", - "function int f;\n" - " return (1);\n" - "endfunction\n"}, - {"function int f;return-1;endfunction", - "function int f;\n" - " return -1;\n" - "endfunction\n"}, - {"function int f ;return ! x\n;endfunction", - "function int f;\n" - " return !x;\n" - "endfunction\n"}, - {"function int f ;return ~ x\n;endfunction", - "function int f;\n" - " return ~x;\n" - "endfunction\n"}, - {"function int f ;return $x\n;endfunction", - "function int f;\n" - " return $x;\n" - "endfunction\n"}, - // String initializers - {"string a[] = {\n\"a\"\n};\n", "string a[] = {\"a\"};\n"}, - {"string abc[] = {\n\"a\",\n\"b\",\n\"c\"\n};\n", - "string abc[] = {\"a\", \"b\", \"c\"};\n"}, - {"string abc[] = {\n" - "\"a\",//\n" - "\"b\", \"c\"\n" - "};\n", - "string abc[] = {\"a\", //\n" - " \"b\",\n" - " \"c\"};\n"}, - {"string abc[] = {//\n" - "\"a\", \"b\", \"c\"" - "};\n", - "string abc[] = { //\n" - " \"a\",\n" - " \"b\",\n" - " \"c\"\n" - "};\n"}, - {"string abc[] = {\n" - "\"a\", \"b\", \"c\"//\n" - "};\n", - "string abc[] = {\"a\",\n" - " \"b\",\n" - " \"c\" //\n" - " };\n"}, - {"string abc[] = {//\n" - "\"a\",//\n" - "\"b\", \"c\"//\n" - "};\n", - "string abc[] = { //\n" - " \"a\", //\n" - " \"b\",\n" - " \"c\" //\n" - "};\n"}, - {"string abc[] = {\n" - "\"a\",\n" - "// comment\n" - "// comment\n" - "\"b\",\n" - "\"c\"\n" - "};\n", - "string abc[] = {\"a\",\n" - " // comment\n" - " // comment\n" - " \"b\",\n" - " \"c\"};\n"}, - {"string numbers[] = {\"one\", \"two\", \"three\", \"four\"};\n", - "string numbers[] = {\"one\",\n" - " \"two\",\n" - " \"three\",\n" - " \"four\"};\n"}, - {"string numbers[] = {\"one\", \"two\", THREE, \"four\"};\n", - "string numbers[] = {\n" - " \"one\", \"two\", THREE, \"four\"\n" - "};\n"}, - {"string numbers[] = {\"one\", {\"two\", \"three\"}, \"four\"};\n", - "string numbers[] = {\n" - " \"one\", {\"two\", \"three\"}, \"four\"\n" - "};\n"}, - {"string numbers[] = {\"one\", {\"two\", //\n" - "\"three\"}, \"four\"};\n", - "string numbers[] = {\n" - " \"one\",\n" - " {\n" - " \"two\", //\n" - " \"three\"\n" - " },\n" - " \"four\"\n" - "};\n"}, - {"string years[] = {\"two_thousand_nineteen\", \"two_thousand_twenty\",\n" - "\"two_thousand_twenty_one\"};\n", - // line with 3rd string would exceed column limit in unwrapped style - "string years[] = {\n" - " \"two_thousand_nineteen\",\n" - " \"two_thousand_twenty\",\n" - " \"two_thousand_twenty_one\"\n" - "};\n"}, - {"class class_name;\n" - "var_type var_name = new(\"the_string\");\n" - "endclass\n", - "class class_name;\n" - " var_type var_name = new(\"the_string\");\n" - "endclass\n"}, - - //{ // parameterized class with 'parameter_declaration' and MACRO - // "class foo #(parameter int a = 2,\n" - // "parameter int aaa = `MACRO);\n" - // "endclass\n", - // "class foo #(\n" - // " parameter int a = 2,\n" - // " parameter int aaa = `MACRO\n" - // ");\n" - // "endclass\n" - //}, - // Struct/Union alignment - {"typedef struct {\n" - "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n" - "} type_t;", - "typedef struct {\n" - " bit [3:0] first;\n" - " bit [31:0] second;\n" - " generic_type_name_t third;\n" - "} type_t;\n"}, - {"typedef union soft packed {\n" - "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n" - "} type_t;", - "typedef union soft packed {\n" - " bit [3:0] first;\n" - " bit [31:0] second;\n" - " generic_type_name_t third;\n" - "} type_t;\n"}, - {"typedef union soft {\n" - "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n" - "} type_t;", - "typedef union soft {\n" - " bit [3:0] first;\n" - " bit [31:0] second;\n" - " generic_type_name_t third;\n" - "} type_t;\n"}, - {"typedef struct {\n" - "// comment\n" - "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n" - "} type_t;", - "typedef struct {\n" - " // comment\n" - " bit [3:0] first;\n" - " bit [31:0] second;\n" - " generic_type_name_t third;\n" - "} type_t;\n"}, - {"typedef struct {\n" - "// comment 0\n" - "bit [31:0] first; // a\n" - "bit [31:0] second; // b\n" - "bit third; // c\n" - "uint fourth; // d\n" - "\n" - "// comment 1\n" - "int fifth;\n" - "// comment 2.1\n" - "// comment 2.2\n" - "uint sixth;\n" - "} timing_cfg_t;", - "typedef struct {\n" - " // comment 0\n" - " bit [31:0] first; // a\n" - " bit [31:0] second; // b\n" - " bit third; // c\n" - " uint fourth; // d\n" - "\n" - " // comment 1\n" - " int fifth;\n" - " // comment 2.1\n" - " // comment 2.2\n" - " uint sixth;\n" - "} timing_cfg_t;\n"}, - {"typedef struct {\n" - "// comment\n" - "rand int r;\n" - "int a;\n" - "int aa = 0;\n" - "int aaa = 1; // comment\n" - "foo#(bar) z;\n" - "int [x:y] zz; // comment\n" - "int zzz[a:b];\n" - "} type_t;", - "typedef struct {\n" - " // comment\n" - " rand int r;\n" - " int a;\n" - " int aa = 0;\n" - " int aaa = 1; // comment\n" - " foo #(bar) z;\n" - " int [x:y] zz; // comment\n" - " int zzz[a:b];\n" - "} type_t;\n"}, - {"typedef struct packed {\n" - "struct packed { bit q; logic qq; logic qqq; } a_few_qs;\n" - "struct packed {\n" - "logic [1:0] q;\n" - "} one_q;\n" - "int q;\n" - "uint qq;\n" - "} nested_qs_t;", - "typedef struct packed {\n" - " struct packed {\n" - " bit q;\n" - " logic qq;\n" - " logic qqq;\n" - " } a_few_qs;\n" - " struct packed {logic [1:0] q;} one_q;\n" - " int q;\n" - " uint qq;\n" - "} nested_qs_t;\n"}, - {"typedef struct packed {\n" - "struct packed { bit q; logic qq; logic qqq; } a_few_qs;\n" - "struct packed {\n" - "// comment\n" - "logic [1:0] q;\n" - "} one_q;\n" - "int q;\n" - "uint qq;\n" - "} nested_qs_t;", - "typedef struct packed {\n" - " struct packed {\n" - " bit q;\n" - " logic qq;\n" - " logic qqq;\n" - " } a_few_qs;\n" - " struct packed {\n" - " // comment\n" - " logic [1:0] q;\n" - " } one_q;\n" - " int q;\n" - " uint qq;\n" - "} nested_qs_t;\n"}, - {"typedef struct {bit [3:0] first;\n" - "`ifdef MACRO\n" - "bit [31:0] second; generic_type_name_t third;\n" - "`endif\n" - "} type_t;\n", - "typedef struct {\n" - " bit [3:0] first;\n" - "`ifdef MACRO\n" - " bit [31:0] second;\n" - " generic_type_name_t third;\n" - "`endif\n" - "} type_t;\n"}, - {"typedef struct {\n" - "bit [3:0] first // c\n" - "; bit [31:0] second" - "// c\n" - "; generic_type_name_t third // c\n" - ";} type_t;\n", - "typedef struct {\n" - " bit [3:0] first // c\n" - ";\n" - " bit [31:0] second // c\n" - ";\n" - " generic_type_name_t third // c\n" - ";\n" - "} type_t;\n"}, - {"struct {logic test1; // c\n" - "logic test2;} test3;\n", - "struct {\n" - " logic test1; // c\n" - " logic test2;\n" - "} test3;\n"}, - {"struct {\n" - " /* t */ logic test1; /* t */\n" - "/* t */ logic test2; }test3;\n", - "struct {\n" - " /* t */ logic test1; /* t */\n" - " /* t */ logic test2;\n" - "} test3;\n"}, - // Continuation comment alignment - {"`define BAR 1 // A\n" - "module foo(); // B\n" - "wire baz; // C\n" - "endmodule:foo // D\n", - "`define BAR 1 // A\n" - "module foo (); // B\n" - " wire baz; // C\n" - "endmodule : foo // D\n"}, - {"`define BAR 1 // A\n" - "module foo(); // B\n" - " // B.1\n" - " // B.2\n" - "wire baz; // C\n" - " // C.1\n" - " // C.2\n" - "endmodule:foo // D\n" - " // D.1\n" - " // D.2\n", - "`define BAR 1 // A\n" - "module foo (); // B\n" - " // B.1\n" - " // B.2\n" - " wire baz; // C\n" - " // C.1\n" - " // C.2\n" - "endmodule : foo // D\n" - " // D.1\n" - " // D.2\n"}, - {"// W\n" - "`define BAR 1 // A\n" - " // X\n" - "module foo(); // B\n" - " // B.1\n" - " // B.2\n" - " // Y\n" - "wire baz; // C\n" - " // C.1\n" - " // C.2\n" - " // Z\n" - "endmodule:foo // D\n" - " // D.1\n" - " // D.2\n", - "// W\n" - "`define BAR 1 // A\n" - "// X\n" - "module foo (); // B\n" - " // B.1\n" - " // B.2\n" - " // Y\n" - " wire baz; // C\n" - " // C.1\n" - " // C.2\n" - " // Z\n" - "endmodule : foo // D\n" - " // D.1\n" - " // D.2\n"}, - {"module foo( // A\n" - " // A.1\n" - "// X\n" - "input wire i1 [a:b], // B\n" - " // B.1\n" - "input [c:d] i2, // C\n" - " // C.1\n" - "\n" - "// Y\n" - "output reg o1 // D\n" - " // D.1\n" - ");endmodule:foo\n", - "module foo ( // A\n" - " // A.1\n" - " // X\n" - " input wire i1[a:b], // B\n" - " // B.1\n" - " input [c:d] i2, // C\n" - " // C.1\n" - "\n" - " // Y\n" - " output reg o1 // D\n" - " // D.1\n" - ");\n" - "endmodule : foo\n"}, - // user defined type alignment - { - "module foo();\n" - " logic [5:0][5:0] net_c;\n" - " messy_type_name [1:0] net_e;\n" - "endmodule\n", - "module foo ();\n" - " logic [5:0][5:0] net_c;\n" - " messy_type_name [1:0] net_e;\n" - "endmodule\n", - }, - // Continuation comment's original starting column is allowed to differ from - // starting comment's original starting column at most by 1. - // Starting column of comments B and C will change after formatting. - // TODO: refine the column alignment depending on current vs previous line. - // https://github.com/chipsalliance/verible/pull/858#discussion_r672844015 - {"module foo (); // A\n" // Starting comment; already on correct column - " // A.1\n" // A's column + 1 - " // A.2\n" // A's column - 1 - "wire baz; // B\n" // Starting comment; will be moved left - " // B.1\n" // B's column - 1 - " // B.2\n" // B's column + 1 - " // B.3\n" // B's column - "endmodule:foo // C\n" // Starting comment; will be moved right - " // C.1\n" // C's column + 1 - " // C.2\n", // C's column - 1 - "module foo (); // A\n" - " // A.1\n" - " // A.2\n" - " wire baz; // B\n" - " // B.1\n" - " // B.2\n" - " // B.3\n" - "endmodule : foo // C\n" - " // C.1\n" - " // C.2\n"}, - {"module foo\n" - "#(\n" - " parameter type baz_t = struct packed { `BAZ(); }\n" - ")\n" - "();\n" - "endmodule\n", - "module foo #(\n" - " parameter type\n" - " baz_t = struct packed {\n" - " `BAZ();\n" - " }\n" - ") ();\n" - "endmodule\n"}, - // The same as the previous test case, but without a semicolon at the macro - // call - {"module foo\n" - "#(\n" - " parameter type baz_t = struct packed { `BAZ() }\n" - ")\n" - "();\n" - "endmodule\n", - "module foo #(\n" - " parameter type\n" - " baz_t = struct packed {\n" - " `BAZ()\n" - " }\n" - ") ();\n" - "endmodule\n"}, - // Check that comments with too large starting column difference are not - // aligned as continuation comments. - // Check that starting comments are not linked with a comment in - // comment-only line above them, even when the starting column is the same. - // All comments in this test case are aligned independently, i.e. none are - // "continuation comments". - {" // comment1\n" // A's column, but is above it - "module foo (); // A\n" - " // comment2\n" // A's column + 2 - " // comment3\n" // A's column - 2 - "wire baz; // B\n" - " // comment4\n" // B's column - 2 - " // comment5\n" // B's column + 2 - " // comment6\n" // B's column, but not directly under B - "endmodule:foo // C\n" - " // comment7\n" // C's column + 2 - " // comment8\n", // C's column, but not directly under B - "// comment1\n" - "module foo (); // A\n" - " // comment2\n" - " // comment3\n" - " wire baz; // B\n" - " // comment4\n" - " // comment5\n" - " // comment6\n" - "endmodule : foo // C\n" - "// comment7\n" - "// comment8\n"}, - // Continuation comment alignment when a line with the starting comment is - // wrapped. - {"module foo(output logic very_very_very_very_long_name // A\n" - " // A.1\n" - "); endmodule\n", - "module foo (\n" - " output logic\n" - " very_very_very_very_long_name // A\n" - " // A.1\n" - ");\n" - "endmodule\n"}, - - // Attachment of ',' to elements in enum list (with and without comments) - {"typedef enum {\n" - " first , // c1\n" - " second\n" - "} e;\n", - "typedef enum {\n" - " first, // c1\n" - " second\n" - "} e;\n"}, - {"typedef enum {\n" - " first ,\n" - " // c1\n" - " second\n" - "} e;\n", - "typedef enum {\n" - " first,\n" - " // c1\n" - " second\n" - "} e;\n"}, - {"typedef enum {\n" - " first // c1\n" - " , second\n" - "} e;\n", - "typedef enum {\n" - " first // c1\n" - " , second\n" - "} e;\n"}, - {"typedef enum {\n" - " first\n" - " // c1\n" - " , second\n" - "} e;\n", - "typedef enum {\n" - " first\n" - " // c1\n" - " , second\n" - "} e;\n"}, - {"typedef enum {\n" - " first // c1\n" - " , // c2\n" - " second\n" - "} e;\n", - "typedef enum {\n" - " first // c1\n" - " , // c2\n" - " second\n" - "} e;\n"}, - {"typedef enum {\n" - " first\n" - " // c1\n" - " ,\n" - " // c2\n" - " second\n" - "} e;\n", - "typedef enum {\n" - " first\n" - " // c1\n" - " , // c2\n" - " second\n" - "} e;\n"}, - {"typedef enum {\n" - " first\n" - " // c1\n" - " , // c2\n" - " // c3\n" - " second\n" - "} e;\n", - "typedef enum {\n" - " first\n" - " // c1\n" - " , // c2\n" - " // c3\n" - " second\n" - "} e;\n"}, - {"typedef enum {\n" - " // c1\n" - " first\n" - " // c2\n" - " , // c3\n" - " // c4\n" - " second\n" - " // c5\n" - "} e;\n", - "typedef enum {\n" - " // c1\n" - " first\n" - " // c2\n" - " , // c3\n" - " // c4\n" - " second\n" - " // c5\n" - "} e;\n"}, - {"typedef enum {\n" - " // c1\n" - " // c1+\n" - " first // c2\n" - " // c2+\n" - " , // c3\n" - " // c3+\n" - " // c4\n" - " // c4+\n" - " second // c5\n" - " // c5+\n" - "} e;\n", - "typedef enum {\n" - " // c1\n" - " // c1+\n" - " first // c2\n" - " // c2+\n" - " , // c3\n" - " // c3+\n" - " // c4\n" - " // c4+\n" - " second // c5\n" - " // c5+\n" - "} e;\n"}, - {"typedef enum {\n" - " first , /* c1 */\n" - " second\n" - "} e;\n", - "typedef enum {\n" - " first, /* c1 */\n" - " second\n" - "} e;\n"}, - {"typedef enum {\n" - " first ,\n" - " /* c1 */\n" - " second\n" - "} e;\n", - "typedef enum {\n" - " first,\n" - " /* c1 */\n" - " second\n" - "} e;\n"}, - {"typedef enum {\n" - " first /* c1 */\n" - " , second\n" - "} e;\n", - "typedef enum {\n" - " first /* c1 */\n" - " , second\n" - "} e;\n"}, - {"typedef enum {\n" - " first\n" - " /* c1 */\n" - " , second\n" - "} e;\n", - "typedef enum {\n" - " first\n" - " /* c1 */\n" - " , second\n" - "} e;\n"}, - {"typedef enum {\n" - " first /* c1 */\n" - " , /* c2 */\n" - " second\n" - "} e;\n", - "typedef enum {\n" - " first /* c1 */\n" - " , /* c2 */\n" - " second\n" - "} e;\n"}, - {"typedef enum {\n" - " first\n" - " /* c1 */\n" - " ,\n" - " /* c2 */\n" - " second\n" - "} e;\n", - "typedef enum {\n" - " first\n" - " /* c1 */\n" - " ,\n" - " /* c2 */\n" - " second\n" - "} e;\n"}, - {"typedef enum {\n" - " /* c1 */\n" - " first\n" - " /* c2 */\n" - " , /* c3 */\n" - " /* c4 */\n" - " second\n" - " /* c5 */\n" - "} e;\n", - "typedef enum {\n" - " /* c1 */\n" - " first\n" - " /* c2 */\n" - " , /* c3 */\n" - " /* c4 */\n" - " second\n" - " /* c5 */\n" - "} e;\n"}, - {"typedef enum {\n" - " /* c1 */\n" - " /* c1+ */\n" - " first /* c2 */\n" - " /* c2+ */\n" - " , /* c3 */\n" - " /* c3+ */\n" - " /* c4 */\n" - " /* c4+ */\n" - " second /* c5 */\n" - " /* c5+ */\n" - "} e;\n", - "typedef enum {\n" - " /* c1 */\n" - " /* c1+ */\n" - " first /* c2 */\n" - " /* c2+ */\n" - " , /* c3 */\n" - " /* c3+ */\n" - " /* c4 */\n" - " /* c4+ */\n" - " second /* c5 */\n" - " /* c5+ */\n" - "} e;\n"}, - {"module m;\n" - "typedef enum {\n" - " first,\n" - " second\n" - "} // c\n" - "e;\n" - "endmodule\n", - "module m;\n" - " typedef enum {\n" - " first,\n" - " second\n" - " } // c\n" - " e;\n" - "endmodule\n"}, - // Attachment of ';' preceded by EOL comment - {"module m;\n" - "typedef enum {\n" - " first,\n" - " second\n" - "} e // c\n" - ";\n" - "endmodule\n", - "module m;\n" - " typedef enum {\n" - " first,\n" - " second\n" - " } e // c\n" - " ;\n" - "endmodule\n"}, - {"module m;\n" - "typedef enum {\n" - " first,\n" - " second\n" - "} // c1\n" - "e // c2\n" - ";\n" - "endmodule\n", - "module m;\n" - " typedef enum {\n" - " first,\n" - " second\n" - " } // c1\n" - " e // c2\n" - " ;\n" - "endmodule\n"}, - {"assign foo = bar\n" - "// comment\n" - ";\n", - "assign foo = bar\n" - " // comment\n" - " ;\n"}, - {"assign foo = bar // comment\n" - ";\n", - "assign foo = bar // comment\n" - ";\n"}, - - // Attachment of ',' to elements in PortActualList (with and without - // comments) - {"module foo;\n" - " bar foobar(\n" - " .first(1) // c1\n" - " ,\n" - " .second(2) // c2\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " .first (1) // c1\n" - " , .second(2) // c2\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " .first(1) // c1\n" - " , .second(2) // c2\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " .first (1) // c1\n" - " , .second(2) // c2\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " .first(1)\n" - " // c1\n" - " ,\n" - " .second(2)\n" - " // c2\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " .first (1)\n" - " // c1\n" - " , .second(2)\n" - " // c2\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " .first(1)\n" - " // c1\n" - " , .second(2)\n" - " // c2\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " .first (1)\n" - " // c1\n" - " , .second(2)\n" - " // c2\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " .first(1)\n" - " // c1\n" - " , // c2\n" - " .second(2)\n" - " // c3\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " .first (1)\n" - " // c1\n" - " , // c2\n" - " .second(2)\n" - " // c3\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " // c1\n" - " // c1+\n" - " .first(1) // c2\n" - " // c2+\n" - " , // c3\n" - " // c3+\n" - " .second(2) // c4\n" - " // c4+\n" - " // c5\n" - " // c5+\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " // c1\n" - " // c1+\n" - " .first (1) // c2\n" - " // c2+\n" - " , // c3\n" - " // c3+\n" - " .second(2) // c4\n" - " // c4+\n" - " // c5\n" - " // c5+\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " .first(1) /* c1 */\n" - " ,\n" - " .second(2) /* c2 */\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " .first (1) /* c1 */\n" - " , .second(2) /* c2 */\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " /* c1 */ .first(1),\n" - " /* c2 */ .second(2)\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " /* c1 */.first (1),\n" - " /* c2 */.second(2)\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " .first(1) /* c1 */\n" - " , .second(2) /* c2 */\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " .first (1) /* c1 */\n" - " , .second(2) /* c2 */\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " /* c1 */.first(1)\n" - " /* c2 */, .second(2)\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " /* c1 */ .first (1)\n" - " /* c2 */, .second(2)\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " .first(1)\n" - " /* c1 */\n" - " ,\n" - " .second(2)\n" - " /* c2 */\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " .first (1)\n" - " /* c1 */\n" - " , .second(2)\n" - " /* c2 */\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " .first(1)\n" - " /* c1 */\n" - " , .second(2)\n" - " /* c2 */\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " .first (1)\n" - " /* c1 */\n" - " , .second(2)\n" - " /* c2 */\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " .first(1)\n" - " /* c1 */\n" - " , /* c2 */\n" - " .second(2)\n" - " /* c3 */\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " .first (1)\n" - " /* c1 */\n" - " , /* c2 */\n" - " .second(2)\n" - " /* c3 */\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " .first(1)\n" - " /* c1 */\n" - " , /* c2 */\n" - " .second(2)\n" - " /* c3 */\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " .first (1)\n" - " /* c1 */\n" - " , /* c2 */\n" - " .second(2)\n" - " /* c3 */\n" - " );\n" - "endmodule\n"}, - {"module foo;\n" - " bar foobar(\n" - " /* c1 */\n" - " /* c1+ */\n" - " .first(1) /* c2 */\n" - " /* c2+ */\n" - " , /* c3 */\n" - " /* c3+ */\n" - " .second(2) /* c4 */\n" - " /* c4+ */\n" - " /* c5 */\n" - " /* c5+ */\n" - " );\n" - "endmodule\n", - "module foo;\n" - " bar foobar (\n" - " /* c1 */\n" - " /* c1+ */\n" - " .first (1) /* c2 */\n" - " /* c2+ */\n" - " , /* c3 */\n" - " /* c3+ */\n" - " .second(2) /* c4 */\n" - " /* c4+ */\n" - " /* c5 */\n" - " /* c5+ */\n" - " );\n" - "endmodule\n"}, - - // Attachment of ',' to elements in ActualNamedParameterList (with and - // without comments) - {"module foo;\n" - " bar#(\n" - " .first(1) // c1\n" - " ,\n" - " .second(2) // c2\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " .first (1) // c1\n" - " , .second(2) // c2\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " .first(1) // c1\n" - " , .second(2) // c2\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " .first (1) // c1\n" - " , .second(2) // c2\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " .first(1)\n" - " // c1\n" - " ,\n" - " .second(2)\n" - " // c2\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " .first (1)\n" - " // c1\n" - " , .second(2)\n" - " // c2\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " .first(1)\n" - " // c1\n" - " , .second(2)\n" - " // c2\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " .first (1)\n" - " // c1\n" - " , .second(2)\n" - " // c2\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " .first(1)\n" - " // c1\n" - " , // c2\n" - " .second(2)\n" - " // c3\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " .first (1)\n" - " // c1\n" - " , // c2\n" - " .second(2)\n" - " // c3\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " // c1\n" - " // c1+\n" - " .first(1) // c2\n" - " // c2+\n" - " , // c3\n" - " // c3+\n" - " .second(2) // c4\n" - " // c4+\n" - " // c5\n" - " // c5+\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " // c1\n" - " // c1+\n" - " .first (1) // c2\n" - " // c2+\n" - " , // c3\n" - " // c3+\n" - " .second(2) // c4\n" - " // c4+\n" - " // c5\n" - " // c5+\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " .first(1) /* c1 */\n" - " ,\n" - " .second(2) /* c2 */\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " .first (1) /* c1 */\n" - " , .second(2) /* c2 */\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " /* c1 */ .first(1),\n" - " /* c2 */ .second(2)\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " /* c1 */.first (1),\n" - " /* c2 */.second(2)\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " .first(1) /* c1 */\n" - " , .second(2) /* c2 */\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " .first (1) /* c1 */\n" - " , .second(2) /* c2 */\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " /* c1 */.first(1)\n" - " /* c2 */, .second(2)\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " /* c1 */ .first (1)\n" - " /* c2 */, .second(2)\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " .first(1)\n" - " /* c1 */\n" - " ,\n" - " .second(2)\n" - " /* c2 */\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " .first (1)\n" - " /* c1 */\n" - " , .second(2)\n" - " /* c2 */\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " .first(1)\n" - " /* c1 */\n" - " , .second(2)\n" - " /* c2 */\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " .first (1)\n" - " /* c1 */\n" - " , .second(2)\n" - " /* c2 */\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " .first(1)\n" - " /* c1 */\n" - " , /* c2 */\n" - " .second(2)\n" - " /* c3 */\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " .first (1)\n" - " /* c1 */\n" - " , /* c2 */\n" - " .second(2)\n" - " /* c3 */\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " .first(1)\n" - " /* c1 */\n" - " , /* c2 */\n" - " .second(2)\n" - " /* c3 */\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " .first (1)\n" - " /* c1 */\n" - " , /* c2 */\n" - " .second(2)\n" - " /* c3 */\n" - " ) baz ();\n" - "endmodule\n"}, - {"module foo;\n" - " bar#(\n" - " /* c1 */\n" - " /* c1+ */\n" - " .first(1) /* c2 */\n" - " /* c2+ */\n" - " , /* c3 */\n" - " /* c3+ */\n" - " .second(2) /* c4 */\n" - " /* c4+ */\n" - " /* c5 */\n" - " /* c5+ */\n" - " ) baz ();\n" - "endmodule\n", - "module foo;\n" - " bar #(\n" - " /* c1 */\n" - " /* c1+ */\n" - " .first (1) /* c2 */\n" - " /* c2+ */\n" - " , /* c3 */\n" - " /* c3+ */\n" - " .second(2) /* c4 */\n" - " /* c4+ */\n" - " /* c5 */\n" - " /* c5+ */\n" - " ) baz ();\n" - "endmodule\n"}, - - // ":" and "'{" in a single line - {"assign foo[2] =\n" - "'{\n" - "bar: 1'b1, // c\n" - "baz: 1'b0, // c\n" - "foobar: CONSTANT,\n" - "qux:\n" - "{\n" - "a, // c\n" - "b\n" - "}\n" - "};\n", - "assign foo[2] = '{\n" - " bar: 1'b1, // c\n" - " baz: 1'b0, // c\n" - " foobar: CONSTANT,\n" - " qux: {\n" - " a, // c\n" - " b\n" - " }\n" - " };\n"}, - {"assign a = (b) ? '{c: d[e], f: '1} : g;\n", - "assign a = (b) ?\n" - " '{c: d[e], f: '1}\n" - " : g;\n"}, - - // ----------------------------------------------------------------- - // Comments around `else`. - // Check whether `else` partition is found correctly and that actual code is - // not appended to EOL comments. - - // generate if - - {"module zx;\n" - "if (x) assign z=y;\n" - "// eol-c\n" - "else if (r) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " // eol-c\n" - " else if (r) assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "// eol-c\n" - "// eol-c\n" - "else if (r) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " // eol-c\n" - " // eol-c\n" - " else if (r) assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "else // eol-c\n" - "if (r) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " else // eol-c\n" - " if (r) assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "else\n" - "// eol-c\n" - "if (r) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " else\n" - " // eol-c\n" - " if (r)\n" - " assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "// eol-c\n" - "else // eol-c\n" - "if (r) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " // eol-c\n" - " else // eol-c\n" - " if (r) assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "else // eol-c\n" - "// eol-c\n" - "if (r) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " else // eol-c\n" - " // eol-c\n" - " if (r)\n" - " assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "// eol-c\n" - "else // eol-c\n" - "// eol-c\n" - "if (r) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " // eol-c\n" - " else // eol-c\n" - " // eol-c\n" - " if (r)\n" - " assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "// eol-c\n" - "else // eol-c\n" - "// eol-c\n" - "if\n" - "// eol-c\n" - "(r) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " // eol-c\n" - " else // eol-c\n" - " // eol-c\n" - " if\n" - " // eol-c\n" - " (r)\n" - " assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "// eol-c\n" - "// eol-c\n" - "else // eol-c\n" - "// eol-c\n" - "// eol-c\n" - "if\n" - "// eol-c\n" - "// eol-c\n" - "(r) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " // eol-c\n" - " // eol-c\n" - " else // eol-c\n" - " // eol-c\n" - " // eol-c\n" - " if\n" - " // eol-c\n" - " // eol-c\n" - " (r)\n" - " assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - - // generate if with function call - - {"module zx;\n" - "if (x) assign z=y;\n" - "// eol-c\n" - "else if (foo(x) == bar(1, 2)) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " // eol-c\n" - " else if (foo(x) == bar(1, 2))\n" - " assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "// eol-c\n" - "// eol-c\n" - "else if (foo(x) == bar(1, 2)) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " // eol-c\n" - " // eol-c\n" - " else if (foo(x) == bar(1, 2))\n" - " assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "else // eol-c\n" - "if (foo(x) == bar(1, 2)) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " else // eol-c\n" - " if (foo(x) == bar(1, 2)) assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "else\n" - "// eol-c\n" - "if (foo(x) == bar(1, 2)) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " else\n" - " // eol-c\n" - " if (foo(\n" - " x\n" - " ) == bar(\n" - " 1, 2\n" - " ))\n" - " assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "// eol-c\n" - "else // eol-c\n" - "if (foo(x) == bar(1, 2)) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " // eol-c\n" - " else // eol-c\n" - " if (foo(x) == bar(1, 2)) assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "else // eol-c\n" - "// eol-c\n" - "if (foo(x) == bar(1, 2)) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " else // eol-c\n" - " // eol-c\n" - " if (foo(\n" - " x\n" - " ) == bar(\n" - " 1, 2\n" - " ))\n" - " assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "// eol-c\n" - "else // eol-c\n" - "// eol-c\n" - "if (foo(x) == bar(1, 2)) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " // eol-c\n" - " else // eol-c\n" - " // eol-c\n" - " if (foo(\n" - " x\n" - " ) == bar(\n" - " 1, 2\n" - " ))\n" - " assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "// eol-c\n" - "else // eol-c\n" - "// eol-c\n" - "if\n" - "// eol-c\n" - "(foo(x) == bar(1, 2)) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " // eol-c\n" - " else // eol-c\n" - " // eol-c\n" - " if\n" - " // eol-c\n" - " (foo(\n" - " x\n" - " ) == bar(\n" - " 1, 2\n" - " ))\n" - " assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - {"module zx;\n" - "if (x) assign z=y;\n" - "// eol-c\n" - "// eol-c\n" - "else // eol-c\n" - "// eol-c\n" - "// eol-c\n" - "if\n" - "// eol-c\n" - "// eol-c\n" - "(foo(x) == bar(1, 2)) assign z=w;\n" - "else assign x=y;\n" - "endmodule\n", - "module zx;\n" - " if (x) assign z = y;\n" - " // eol-c\n" - " // eol-c\n" - " else // eol-c\n" - " // eol-c\n" - " // eol-c\n" - " if\n" - " // eol-c\n" - " // eol-c\n" - " (foo(\n" - " x\n" - " ) == bar(\n" - " 1, 2\n" - " ))\n" - " assign z = w;\n" - " else assign x = y;\n" - "endmodule\n"}, - - // else begin - - {"module zx;\n" - "always begin\n" - "if (a) b<=1;\n" - "// eol-c\n" - "else begin b<=2;\n" - "end\n" - "end\n" - "endmodule\n", - "module zx;\n" - " always begin\n" - " if (a) b <= 1;\n" - " // eol-c\n" - " else begin\n" - " b <= 2;\n" - " end\n" - " end\n" - "endmodule\n"}, - {"module zx;\n" - "always begin\n" - "if (a) b<=1;\n" - "// eol-c\n" - "// eol-c\n" - "else begin b<=2;\n" - "end\n" - "end\n" - "endmodule\n", - "module zx;\n" - " always begin\n" - " if (a) b <= 1;\n" - " // eol-c\n" - " // eol-c\n" - " else begin\n" - " b <= 2;\n" - " end\n" - " end\n" - "endmodule\n"}, - {"module zx;\n" - "always begin\n" - "if (a) b<=1;\n" - "else // eol-c\n" - "begin b<=2;\n" - "end\n" - "end\n" - "endmodule\n", - "module zx;\n" - " always begin\n" - " if (a) b <= 1;\n" - " else // eol-c\n" - " begin\n" - " b <= 2;\n" - " end\n" - " end\n" - "endmodule\n"}, - {"module zx;\n" - "always begin\n" - "if (a) b<=1;\n" - "else\n" - "// eol-c\n" - "begin b<=2;\n" - "end\n" - "end\n" - "endmodule\n", - "module zx;\n" - " always begin\n" - " if (a) b <= 1;\n" - " else\n" - " // eol-c\n" - " begin\n" - " b <= 2;\n" - " end\n" - " end\n" - "endmodule\n"}, - {"module zx;\n" - "always begin\n" - "if (a) b<=1;\n" - "// eol-c\n" - "else // eol-c\n" - "begin b<=2;\n" - "end\n" - "end\n" - "endmodule\n", - "module zx;\n" - " always begin\n" - " if (a) b <= 1;\n" - " // eol-c\n" - " else // eol-c\n" - " begin\n" - " b <= 2;\n" - " end\n" - " end\n" - "endmodule\n"}, - {"module zx;\n" - "always begin\n" - "if (a) b<=1;\n" - "else // eol-c\n" - "// eol-c\n" - "begin b<=2;\n" - "end\n" - "end\n" - "endmodule\n", - "module zx;\n" - " always begin\n" - " if (a) b <= 1;\n" - " else // eol-c\n" - " // eol-c\n" - " begin\n" - " b <= 2;\n" - " end\n" - " end\n" - "endmodule\n"}, - - // else if - - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "// eol-c\n" - "else if (set) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " // eol-c\n" - " else if (set) assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "// eol-c\n" - "// eol-c\n" - "else if (set) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " // eol-c\n" - " // eol-c\n" - " else if (set) assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "else // eol-c\n" - "if (set) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " else // eol-c\n" - " if (set) assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "else\n" - "// eol-c\n" - "if (set) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " else\n" - " // eol-c\n" - " if (set)\n" - " assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "// eol-c\n" - "else // eol-c\n" - "if (set) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " // eol-c\n" - " else // eol-c\n" - " if (set) assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "else // eol-c\n" - "// eol-c\n" - "if (set) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " else // eol-c\n" - " // eol-c\n" - " if (set)\n" - " assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "// eol-c\n" - "else // eol-c\n" - "// eol-c\n" - "if (set) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " // eol-c\n" - " else // eol-c\n" - " // eol-c\n" - " if (set)\n" - " assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "// eol-c\n" - "else // eol-c\n" - "// eol-c\n" - "if\n" - "// eol-c\n" - "(set) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " // eol-c\n" - " else // eol-c\n" - " // eol-c\n" - " if\n" - " // eol-c\n" - " (set)\n" - " assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "// eol-c\n" - "// eol-c\n" - "else // eol-c\n" - "// eol-c\n" - "// eol-c\n" - "if\n" - "// eol-c\n" - "// eol-c\n" - "(set) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " // eol-c\n" - " // eol-c\n" - " else // eol-c\n" - " // eol-c\n" - " // eol-c\n" - " if\n" - " // eol-c\n" - " // eol-c\n" - " (set)\n" - " assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - - // else if with function call - - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "// eol-c\n" - "else if (foo(clr, set, 1)) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " // eol-c\n" - " else if (foo(clr, set, 1))\n" - " assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "// eol-c\n" - "// eol-c\n" - "else if (foo(clr, set, 1)) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " // eol-c\n" - " // eol-c\n" - " else if (foo(clr, set, 1))\n" - " assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "else // eol-c\n" - "if (foo(clr, set, 1)) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " else // eol-c\n" - " if (foo(clr, set, 1)) assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "else\n" - "// eol-c\n" - "if (foo(clr, set, 1)) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " else\n" - " // eol-c\n" - " if (foo(\n" - " clr, set, 1\n" - " ))\n" - " assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "// eol-c\n" - "else // eol-c\n" - "if (foo(clr, set, 1)) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " // eol-c\n" - " else // eol-c\n" - " if (foo(clr, set, 1)) assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "else // eol-c\n" - "// eol-c\n" - "if (foo(clr, set, 1)) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " else // eol-c\n" - " // eol-c\n" - " if (foo(\n" - " clr, set, 1\n" - " ))\n" - " assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "// eol-c\n" - "else // eol-c\n" - "// eol-c\n" - "if (foo(clr, set, 1)) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " // eol-c\n" - " else // eol-c\n" - " // eol-c\n" - " if (foo(\n" - " clr, set, 1\n" - " ))\n" - " assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "// eol-c\n" - "else // eol-c\n" - "// eol-c\n" - "if\n" - "// eol-c\n" - "(foo(clr, set, 1)) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " // eol-c\n" - " else // eol-c\n" - " // eol-c\n" - " if\n" - " // eol-c\n" - " (foo(\n" - " clr, set, 1\n" - " ))\n" - " assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - {"module zx;\n" - "always @(clr or set)\n" - "if (clr) assign q=0;\n" - "// eol-c\n" - "// eol-c\n" - "else // eol-c\n" - "// eol-c\n" - "// eol-c\n" - "if\n" - "// eol-c\n" - "// eol-c\n" - "(foo(clr, set, 1)) assign q=1;\n" - "else deassign q;\n" - "endmodule\n", - "module zx;\n" - " always @(clr or set)\n" - " if (clr) assign q = 0;\n" - " // eol-c\n" - " // eol-c\n" - " else // eol-c\n" - " // eol-c\n" - " // eol-c\n" - " if\n" - " // eol-c\n" - " // eol-c\n" - " (foo(\n" - " clr, set, 1\n" - " ))\n" - " assign q = 1;\n" - " else deassign q;\n" - "endmodule\n"}, - - // ----------------------------------------------------------------- - // Comments around and inside macro calls. - - // between identifier and '(', no args - - {"// verilog_syntax: parse-as-module-body", - "// verilog_syntax: parse-as-module-body\n"}, - {"// verilog_syntax: parse-as-statements", - "// verilog_syntax: parse-as-statements\n"}, - {"// verilog_syntax: parse-as-class-body", - "// verilog_syntax: parse-as-class-body\n"}, - {"// verilog_syntax: parse-as-package-body", - "// verilog_syntax: parse-as-package-body\n"}, - {"// verilog_syntax: parse-as-library-map", - "// verilog_syntax: parse-as-library-map\n"}, - {"// verilog_syntax: does-not-exist-mode", - "// verilog_syntax: does-not-exist-mode\n"}, - {"// verilog_syntax: parse-as-module-body\n", - "// verilog_syntax: parse-as-module-body\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "// comment", - "// verilog_syntax: parse-as-module-body\n" - "// comment\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c */ ();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c */ ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ /* c2 */ ();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ /* c2 */ ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c */\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c */\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ /* c2 */\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ /* c2 */\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ // c2\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ // c2\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c */ ();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c */ ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */ /* c2 */ ();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */ /* c2 */ ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c */\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c */\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */ /* c2 */\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */ /* c2 */\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "// c\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " // c\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */ // c2\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */ // c2\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */\n" - "/* c2 */\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */\n" - " /* c2 */\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "// c1\n" - "// c2\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " // c1\n" - " // c2\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - "/* c2 */ ();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */ ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - "/* c2 */ ();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " /* c2 */ ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - "/* c2 */\n" - "/* c3 */ ();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */\n" - " /* c3 */ ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - "/* c2 */\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - "/* c2 */\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " /* c2 */\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - "// c2\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " // c2\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - "// c2\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " // c2\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " ();\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - "// c2\n" - "// c3\n" - "();\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " // c2\n" - " // c3\n" - " ();\n"}, - - // between identifier and '(', with arg - - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c */ (arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c */ (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ /* c2 */ (arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ /* c2 */ (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c */\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c */\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ /* c2 */\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ /* c2 */\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ // c2\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ // c2\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c */ (arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c */ (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */ /* c2 */ (arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */ /* c2 */ (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c */\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c */\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */ /* c2 */\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */ /* c2 */\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "// c\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " // c\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */ // c2\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */ // c2\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */\n" - "/* c2 */\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */\n" - " /* c2 */\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "// c1\n" - "// c2\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " // c1\n" - " // c2\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - "/* c2 */ (arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */ (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - "/* c2 */ (arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " /* c2 */ (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - "/* c2 */\n" - "/* c3 */ (arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */\n" - " /* c3 */ (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - "/* c2 */\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - "/* c2 */\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " /* c2 */\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - "// c2\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " // c2\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - "// c2\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " // c2\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " (arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - "// c2\n" - "// c3\n" - "(arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " // c2\n" - " // c3\n" - " (arg);\n"}, - - // after '(', no args - - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */ /* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */ /* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */ /* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */ /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(// c\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( // c\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */ // c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */ // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c1 */ /* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c1 */ /* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " /* c */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c1 */ /* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " /* c1 */ /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "// c\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " // c\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c1 */ // c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " /* c1 */ // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c1 */\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " /* c1 */\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "// c1\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " // c1\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */\n" - "/* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */\n" - "/* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(// c1\n" - "/* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( // c1\n" - "/* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */\n" - "/* c2 */\n" - "/* c3 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */\n" - " /* c2 */\n" - "/* c3 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(// c1\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( // c1\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(// c1\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( // c1\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(// c1\n" - "// c2\n" - "// c3\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( // c1\n" - " // c2\n" - " // c3\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */ /* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */ /* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */ /* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */ /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */ // c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */ // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ /* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ /* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ /* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */ /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "// c\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " // c\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ // c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */ // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "// c1\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " // c1\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - "/* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "/* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - "/* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */\n" - "/* c3 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */\n" - "/* c3 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "// c2\n" - "// c3\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " // c2\n" - " // c3\n" - ");\n"}, - - // after '(', with arg - - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */ /* c2 */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */ /* c2 */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */ /* c2 */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */ /* c2 */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(// c\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( // c\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */ // c2\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */ // c2\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " /* c */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c1 */ /* c2 */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " /* c1 */ /* c2 */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " /* c */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c1 */ /* c2 */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " /* c1 */ /* c2 */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "// c\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " // c\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c1 */ // c2\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " /* c1 */ // c2\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "/* c1 */\n" - "/* c2 */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " /* c1 */\n" - " /* c2 */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - "// c1\n" - "// c2\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(\n" - " // c1\n" - " // c2\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */\n" - "/* c2 */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */\n" - " /* c2 */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(// c1\n" - "/* c2 */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( // c1\n" - " /* c2 */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */\n" - "/* c2 */\n" - "/* c3 */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */\n" - " /* c2 */\n" - " /* c3 */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */\n" - "/* c2 */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */\n" - " /* c2 */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(// c1\n" - "/* c2 */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( // c1\n" - " /* c2 */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */\n" - "// c2\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */\n" - " // c2\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(// c1\n" - "// c2\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( // c1\n" - " // c2\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(// c1\n" - "// c2\n" - "// c3\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz( // c1\n" - " // c2\n" - " // c3\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */ /* c2 */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */ /* c2 */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */ /* c2 */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */ /* c2 */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */ // c2\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */ // c2\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ /* c2 */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */ /* c2 */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ /* c2 */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */ /* c2 */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "// c\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " // c\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ // c2\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */ // c2\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */\n" - "/* c2 */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */\n" - " /* c2 */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "// c1\n" - "// c2\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " // c1\n" - " // c2\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "/* c2 */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " /* c2 */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */\n" - "/* c3 */arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */\n" - " /* c3 */ arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "/* c2 */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " /* c2 */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "// c2\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " // c2\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "// c2\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " // c2\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " arg);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "// c2\n" - "// c3\n" - "arg);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " // c2\n" - " // c3\n" - " arg);\n"}, - - // after single arg - - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg/* c */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg /* c */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg/* c1 */ /* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg /* c1 */ /* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg/* c */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg /* c */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg/* c1 */ /* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg /* c1 */ /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg// c\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg // c\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg/* c1 */ // c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg /* c1 */ // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - "/* c */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - "/* c */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - "/* c1 */ /* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - "/* c1 */ /* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - "/* c */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - " /* c */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - "/* c1 */ /* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - " /* c1 */ /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - "// c\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - " // c\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - "/* c1 */ // c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - " /* c1 */ // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - "/* c1 */\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - " /* c1 */\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - "// c1\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg\n" - " // c1\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg/* c1 */\n" - "/* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg /* c1 */\n" - "/* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg// c1\n" - "/* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg // c1\n" - "/* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg/* c1 */\n" - "/* c2 */\n" - "/* c3 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg /* c1 */\n" - " /* c2 */\n" - "/* c3 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg/* c1 */\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg /* c1 */\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg// c1\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg // c1\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg/* c1 */\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg /* c1 */\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg// c1\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg // c1\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg// c1\n" - "// c2\n" - "// c3\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg // c1\n" - " // c2\n" - " // c3\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg/* c */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg /* c */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg/* c1 */ /* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg /* c1 */ /* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg/* c */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg /* c */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg/* c1 */ /* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg /* c1 */ /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg// c\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg // c\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg/* c1 */ // c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg /* c1 */ // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - "/* c */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - "/* c */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - "/* c1 */ /* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - "/* c1 */ /* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - "/* c */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - " /* c */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - "/* c1 */ /* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - " /* c1 */ /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - "// c\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - " // c\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - "/* c1 */ // c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - " /* c1 */ // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - "/* c1 */\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - " /* c1 */\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - "// c1\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg\n" - " // c1\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg/* c1 */\n" - "/* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg /* c1 */\n" - "/* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg// c1\n" - "/* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg // c1\n" - "/* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg/* c1 */\n" - "/* c2 */\n" - "/* c3 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg /* c1 */\n" - " /* c2 */\n" - "/* c3 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg/* c1 */\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg /* c1 */\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg// c1\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg // c1\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg/* c1 */\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg /* c1 */\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg// c1\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg // c1\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg// c1\n" - "// c2\n" - "// c3\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg // c1\n" - " // c2\n" - " // c3\n" - ");\n"}, - - // before colon - - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1/* c */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 /* c */, arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1/* c1 */ /* c2 */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 /* c1 */ /* c2 */,\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1/* c */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 /* c */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1/* c1 */ /* c2 */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 /* c1 */ /* c2 */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1// c\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 // c\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1/* c1 */ // c2\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 /* c1 */ // c2\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - "/* c */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - " /* c */, arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - "/* c1 */ /* c2 */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - " /* c1 */ /* c2 */, arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - "/* c */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - " /* c */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - "/* c1 */ /* c2 */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - " /* c1 */ /* c2 */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - "// c\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - " // c\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - "/* c1 */ // c2\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - " /* c1 */ // c2\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - "/* c1 */\n" - "/* c2 */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - " /* c1 */\n" - " /* c2 */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - "// c1\n" - "// c2\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1\n" - " // c1\n" - " // c2\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1/* c1 */\n" - "/* c2 */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 /* c1 */\n" - " /* c2 */, arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1// c1\n" - "/* c2 */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 // c1\n" - " /* c2 */, arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1/* c1 */\n" - "/* c2 */\n" - "/* c3 */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 /* c1 */\n" - " /* c2 */\n" - " /* c3 */, arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1/* c1 */\n" - "/* c2 */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 /* c1 */\n" - " /* c2 */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1// c1\n" - "/* c2 */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 // c1\n" - " /* c2 */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1/* c1 */\n" - "// c2\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 /* c1 */\n" - " // c2\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1// c1\n" - "// c2\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 // c1\n" - " // c2\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1// c1\n" - "// c2\n" - "// c3\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1 // c1\n" - " // c2\n" - " // c3\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1/* c */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 /* c */, arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1/* c1 */ /* c2 */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 /* c1 */ /* c2 */,\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1/* c */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 /* c */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1/* c1 */ /* c2 */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 /* c1 */ /* c2 */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1// c\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 // c\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1/* c1 */ // c2\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 /* c1 */ // c2\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - "/* c */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - " /* c */, arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - "/* c1 */ /* c2 */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - " /* c1 */ /* c2 */, arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - "/* c */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - " /* c */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - "/* c1 */ /* c2 */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - " /* c1 */ /* c2 */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - "// c\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - " // c\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - "/* c1 */ // c2\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - " /* c1 */ // c2\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - "/* c1 */\n" - "/* c2 */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - " /* c1 */\n" - " /* c2 */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - "// c1\n" - "// c2\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1\n" - " // c1\n" - " // c2\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1/* c1 */\n" - "/* c2 */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 /* c1 */\n" - " /* c2 */, arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1// c1\n" - "/* c2 */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 // c1\n" - " /* c2 */, arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1/* c1 */\n" - "/* c2 */\n" - "/* c3 */, arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 /* c1 */\n" - " /* c2 */\n" - " /* c3 */, arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1/* c1 */\n" - "/* c2 */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 /* c1 */\n" - " /* c2 */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1// c1\n" - "/* c2 */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 // c1\n" - " /* c2 */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1/* c1 */\n" - "// c2\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 /* c1 */\n" - " // c2\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1// c1\n" - "// c2\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 // c1\n" - " // c2\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " , arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1// c1\n" - "// c2\n" - "// c3\n" - ", arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1 // c1\n" - " // c2\n" - " // c3\n" - " , arg2);\n"}, - - // after colon - - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,/* c */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, /* c */ arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,/* c1 */ /* c2 */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, /* c1 */ /* c2 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,/* c */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, /* c */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,/* c1 */ /* c2 */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, /* c1 */ /* c2 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,// c\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, // c\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,/* c1 */ // c2\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, /* c1 */ // c2\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - "/* c */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - " /* c */ arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - "/* c1 */ /* c2 */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - " /* c1 */ /* c2 */ arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - "/* c */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - " /* c */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - "/* c1 */ /* c2 */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - " /* c1 */ /* c2 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - "// c\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - " // c\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - "/* c1 */ // c2\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - " /* c1 */ // c2\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - "/* c1 */\n" - "/* c2 */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - " /* c1 */\n" - " /* c2 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - "// c1\n" - "// c2\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - " // c1\n" - " // c2\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,/* c1 */\n" - "/* c2 */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, /* c1 */\n" - " /* c2 */ arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,// c1\n" - "/* c2 */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, // c1\n" - " /* c2 */ arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,/* c1 */\n" - "/* c2 */\n" - "/* c3 */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, /* c1 */\n" - " /* c2 */\n" - " /* c3 */ arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,/* c1 */\n" - "/* c2 */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, /* c1 */\n" - " /* c2 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,// c1\n" - "/* c2 */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, // c1\n" - " /* c2 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,/* c1 */\n" - "// c2\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, /* c1 */\n" - " // c2\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,// c1\n" - "// c2\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, // c1\n" - " // c2\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,// c1\n" - "// c2\n" - "// c3\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, // c1\n" - " // c2\n" - " // c3\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,/* c */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, /* c */ arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,/* c1 */ /* c2 */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, /* c1 */ /* c2 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,/* c */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, /* c */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,/* c1 */ /* c2 */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, /* c1 */ /* c2 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,// c\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, // c\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,/* c1 */ // c2\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, /* c1 */ // c2\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - "/* c */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - " /* c */ arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - "/* c1 */ /* c2 */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - " /* c1 */ /* c2 */ arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - "/* c */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - " /* c */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - "/* c1 */ /* c2 */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - " /* c1 */ /* c2 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - "// c\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - " // c\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - "/* c1 */ // c2\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - " /* c1 */ // c2\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - "/* c1 */\n" - "/* c2 */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - " /* c1 */\n" - " /* c2 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - "// c1\n" - "// c2\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - " // c1\n" - " // c2\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,/* c1 */\n" - "/* c2 */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, /* c1 */\n" - " /* c2 */ arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,// c1\n" - "/* c2 */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, // c1\n" - " /* c2 */ arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,/* c1 */\n" - "/* c2 */\n" - "/* c3 */arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, /* c1 */\n" - " /* c2 */\n" - " /* c3 */ arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,/* c1 */\n" - "/* c2 */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, /* c1 */\n" - " /* c2 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,// c1\n" - "/* c2 */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, // c1\n" - " /* c2 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,/* c1 */\n" - "// c2\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, /* c1 */\n" - " // c2\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,// c1\n" - "// c2\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, // c1\n" - " // c2\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " arg2);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,// c1\n" - "// c2\n" - "// c3\n" - "arg2);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, // c1\n" - " // c2\n" - " // c3\n" - " arg2);\n"}, - - // after last arg - - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,/* c */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2, /* c */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,/* c1 */ /* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - " arg2, /* c1 */ /* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,/* c */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2, /* c */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,/* c1 */ /* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1,\n" - " arg2, /* c1 */ /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,// c\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2, // c\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,/* c1 */ // c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2, /* c1 */ // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - "/* c */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - "/* c */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - "/* c1 */ /* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - "/* c1 */ /* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - "/* c */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - " /* c */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - "/* c1 */ /* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - " /* c1 */ /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - "// c\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - " // c\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - "/* c1 */ // c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - " /* c1 */ // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - "/* c1 */\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - " /* c1 */\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - "// c1\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,\n" - " // c1\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,/* c1 */\n" - "/* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2, /* c1 */\n" - "/* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,// c1\n" - "/* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2, // c1\n" - "/* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,/* c1 */\n" - "/* c2 */\n" - "/* c3 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2, /* c1 */\n" - " /* c2 */\n" - "/* c3 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,/* c1 */\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2, /* c1 */\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,// c1\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2, // c1\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,/* c1 */\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2, /* c1 */\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,// c1\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2, // c1\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2, /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2,// c1\n" - "// c2\n" - "// c3\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg1, arg2, // c1\n" - " // c2\n" - " // c3\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,/* c */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2, /* c */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,/* c1 */ /* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - " arg2, /* c1 */ /* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,/* c */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2, /* c */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,/* c1 */ /* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1,\n" - " arg2, /* c1 */ /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,// c\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2, // c\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,/* c1 */ // c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2, /* c1 */ // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - "/* c */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - "/* c */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - "/* c1 */ /* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - "/* c1 */ /* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - "/* c */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - " /* c */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - "/* c1 */ /* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - " /* c1 */ /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - "// c\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - " // c\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - "/* c1 */ // c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - " /* c1 */ // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - "/* c1 */\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - " /* c1 */\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - "// c1\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,\n" - " // c1\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,/* c1 */\n" - "/* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2, /* c1 */\n" - "/* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,// c1\n" - "/* c2 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2, // c1\n" - "/* c2 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,/* c1 */\n" - "/* c2 */\n" - "/* c3 */);\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2, /* c1 */\n" - " /* c2 */\n" - "/* c3 */);\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,/* c1 */\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2, /* c1 */\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,// c1\n" - "/* c2 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2, // c1\n" - " /* c2 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,/* c1 */\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2, /* c1 */\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,// c1\n" - "// c2\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2, // c1\n" - " // c2\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2, /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - ");\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2,// c1\n" - "// c2\n" - "// c3\n" - ");\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg1, arg2, // c1\n" - " // c2\n" - " // c3\n" - ");\n"}, - - // after ')', no args - - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()/* c */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() /* c */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()/* c1 */ /* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() /* c1 */ /* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()/* c */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() /* c */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()/* c1 */ /* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() /* c1 */ /* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()// c\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() // c\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()/* c1 */ // c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() /* c1 */ // c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "/* c */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "/* c */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "/* c1 */ /* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "/* c1 */ /* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "/* c */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "/* c */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "/* c1 */ /* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "/* c1 */ /* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "// c\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "// c\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "/* c1 */ // c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "/* c1 */ // c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "// c1\n" - "// c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()\n" - "// c1\n" - "// c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()/* c1 */\n" - "/* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() /* c1 */\n" - "/* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()// c1\n" - "/* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() // c1\n" - "/* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()/* c1 */\n" - "/* c2 */\n" - "/* c3 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() /* c1 */\n" - "/* c2 */\n" - "/* c3 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()/* c1 */\n" - "/* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() /* c1 */\n" - "/* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()// c1\n" - "/* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() // c1\n" - "/* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()/* c1 */\n" - "// c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() /* c1 */\n" - "// c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()// c1\n" - "// c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() // c1\n" - "// c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz()// c1\n" - "// c2\n" - "// c3\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz() // c1\n" - "// c2\n" - "// c3\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()/* c */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() /* c */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()/* c1 */ /* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() /* c1 */ /* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()/* c */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() /* c */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()/* c1 */ /* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() /* c1 */ /* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()// c\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() // c\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()/* c1 */ // c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() /* c1 */ // c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "/* c */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "/* c */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "/* c1 */ /* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "/* c1 */ /* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "/* c */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "/* c */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "/* c1 */ /* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "/* c1 */ /* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "// c\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "// c\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "/* c1 */ // c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "/* c1 */ // c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "// c1\n" - "// c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()\n" - "// c1\n" - "// c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()/* c1 */\n" - "/* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() /* c1 */\n" - "/* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()// c1\n" - "/* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() // c1\n" - "/* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()/* c1 */\n" - "/* c2 */\n" - "/* c3 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() /* c1 */\n" - "/* c2 */\n" - "/* c3 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()/* c1 */\n" - "/* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() /* c1 */\n" - "/* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()// c1\n" - "/* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() // c1\n" - "/* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()/* c1 */\n" - "// c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() /* c1 */\n" - "// c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()// c1\n" - "// c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() // c1\n" - "// c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ()// c1\n" - "// c2\n" - "// c3\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ() // c1\n" - "// c2\n" - "// c3\n" - ";\n"}, - - // after ')', with arg - - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)/* c */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) /* c */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)/* c1 */ /* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) /* c1 */ /* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)/* c */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) /* c */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)/* c1 */ /* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) /* c1 */ /* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)// c\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) // c\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)/* c1 */ // c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) /* c1 */ // c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "/* c */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "/* c */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "/* c1 */ /* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "/* c1 */ /* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "/* c */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "/* c */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "/* c1 */ /* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "/* c1 */ /* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "// c\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) // c\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "/* c1 */ // c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "/* c1 */ // c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "// c1\n" - "// c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)\n" - "// c1\n" - "// c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)/* c1 */\n" - "/* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) /* c1 */\n" - "/* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)// c1\n" - "/* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) // c1\n" - "/* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)/* c1 */\n" - "/* c2 */\n" - "/* c3 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) /* c1 */\n" - "/* c2 */\n" - "/* c3 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)/* c1 */\n" - "/* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) /* c1 */\n" - "/* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)// c1\n" - "/* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) // c1\n" - "/* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)/* c1 */\n" - "// c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) /* c1 */\n" - "// c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)// c1\n" - "// c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) // c1\n" - "// c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg)// c1\n" - "// c2\n" - "// c3\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg) // c1\n" - "// c2\n" - "// c3\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)/* c */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) /* c */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)/* c1 */ /* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) /* c1 */ /* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)/* c */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) /* c */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)/* c1 */ /* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) /* c1 */ /* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)// c\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) // c\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)/* c1 */ // c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) /* c1 */ // c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "/* c */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "/* c */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "/* c1 */ /* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "/* c1 */ /* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "/* c */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "/* c */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "/* c1 */ /* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "/* c1 */ /* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "// c\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "// c\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "/* c1 */ // c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "/* c1 */ // c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "// c1\n" - "// c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)\n" - "// c1\n" - "// c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)/* c1 */\n" - "/* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) /* c1 */\n" - "/* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)// c1\n" - "/* c2 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) // c1\n" - "/* c2 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)/* c1 */\n" - "/* c2 */\n" - "/* c3 */;\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) /* c1 */\n" - "/* c2 */\n" - "/* c3 */;\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)/* c1 */\n" - "/* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) /* c1 */\n" - "/* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)// c1\n" - "/* c2 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) // c1\n" - "/* c2 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)/* c1 */\n" - "// c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) /* c1 */\n" - "// c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)// c1\n" - "// c2\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) // c1\n" - "// c2\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ";\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg)// c1\n" - "// c2\n" - "// c3\n" - ";\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg) // c1\n" - "// c2\n" - "// c3\n" - ";\n"}, - - // after ';', no args - - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); /* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); /* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();// c\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); // c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); /* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "// c\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "// c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "/* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "/* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();\n" - "// c1\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();// c1 c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); // c1 c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();/* c1 */\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); /* c1 */\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); // c1\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz();// c1\n" - "// c2\n" - "// c3\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(); // c1\n" - "// c2\n" - "// c3\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); /* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); /* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();// c\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); // c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); /* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "// c\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "// c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "/* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "/* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();\n" - "// c1\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();/* c1 */\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); /* c1 */\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); // c1\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ();// c1\n" - "// c2\n" - "// c3\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(); // c1\n" - "// c2\n" - "// c3\n"}, - - // after ';', with arg - - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); /* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); /* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);// c\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); // c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); /* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "// c\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "// c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "/* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "/* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);\n" - "// c1\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);// c1 c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); // c1 c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);/* c1 */\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); /* c1 */\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); // c1\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg);// c1\n" - "// c2\n" - "// c3\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz(arg); // c1\n" - "// c2\n" - "// c3\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); /* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); /* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);// c\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); // c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); /* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "// c\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "// c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "/* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "/* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);\n" - "// c1\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);/* c1 */\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); /* c1 */\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); // c1\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg);// c1\n" - "// c2\n" - "// c3\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(arg); // c1\n" - "// c2\n" - "// c3\n"}, - - // everywhere, no args - - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c */(/* c */)/* c */;/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c */\n" - " ( /* c */) /* c */; /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */ /* c2 */(/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ " - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ /* c2 */\n" - " ( /* c1 */ /* c2 */) /* c1 */ /* c2 */; /* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c */\n" - "(/* c */\n" - ")/* c */\n" - ";/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c */\n" - " ( /* c */\n" - " ) /* c */\n" - "; /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */ /* c2 */\n" - "(/* c1 */ /* c2 */\n" - ")/* c1 */ /* c2 */\n" - ";/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ /* c2 */\n" - " ( /* c1 */ /* c2 */\n" - " ) /* c1 */ /* c2 */\n" - "; /* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz// c\n" - "(// c\n" - ")// c\n" - ";// c\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c\n" - " ( // c\n" - " ) // c\n" - "; // c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */ // c2\n" - "(/* c1 */ // c2\n" - ")/* c1 */ // c2\n" - ";/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ // c2\n" - " ( /* c1 */ // c2\n" - " ) /* c1 */ // c2\n" - "; /* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c */(\n" - "/* c */)\n" - "/* c */;\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c */ (\n" - " /* c */)\n" - "/* c */;\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */ /* c2 */(\n" - "/* c1 */ /* c2 */)\n" - "/* c1 */ /* c2 */;\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */ /* c2 */ (\n" - " /* c1 */ /* c2 */)\n" - "/* c1 */ /* c2 */;\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c */\n" - "(\n" - "/* c */\n" - ")\n" - "/* c */\n" - ";\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c */\n" - " (\n" - " /* c */\n" - " )\n" - "/* c */\n" - ";\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */ /* c2 */\n" - "(\n" - "/* c1 */ /* c2 */\n" - ")\n" - "/* c1 */ /* c2 */\n" - ";\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */ /* c2 */\n" - " (\n" - " /* c1 */ /* c2 */\n" - " )\n" - "/* c1 */ /* c2 */\n" - ";\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "// c\n" - "(\n" - "// c\n" - ")\n" - "// c\n" - ";\n" - "// c\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " // c\n" - " (\n" - " // c\n" - " )\n" - "// c\n" - ";\n" - "// c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */ // c2\n" - "(\n" - "/* c1 */ // c2\n" - ")\n" - "/* c1 */ // c2\n" - ";\n" - "/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */ // c2\n" - " (\n" - " /* c1 */ // c2\n" - " )\n" - "/* c1 */ // c2\n" - ";\n" - "/* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */\n" - "/* c2 */\n" - "(\n" - "/* c1 */\n" - "/* c2 */\n" - ")\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n" - "/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */\n" - " /* c2 */\n" - " (\n" - " /* c1 */\n" - " /* c2 */\n" - " )\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n" - "/* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "// c1\n" - "// c2\n" - "(\n" - "// c1\n" - "// c2\n" - ")\n" - "// c1\n" - "// c2\n" - ";\n" - "// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " // c1\n" - " // c2\n" - " (\n" - " // c1\n" - " // c2\n" - " )\n" - "// c1\n" - "// c2\n" - ";\n" - "// c1\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */\n" - "/* c2 */(/* c1 */\n" - "/* c2 */)/* c1 */\n" - "/* c2 */;/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */ ( /* c1 */\n" - " /* c2 */) /* c1 */\n" - "/* c2 */; /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz// c1\n" - "/* c2 */(// c1\n" - "/* c2 */)// c1\n" - "/* c2 */;// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " /* c2 */ ( // c1\n" - " /* c2 */) // c1\n" - "/* c2 */; // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */\n" - "/* c2 */\n" - "/* c3 */(/* c1 */\n" - "/* c2 */\n" - "/* c3 */)/* c1 */\n" - "/* c2 */\n" - "/* c3 */;/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */\n" - " /* c3 */ ( /* c1 */\n" - " /* c2 */\n" - " /* c3 */) /* c1 */\n" - "/* c2 */\n" - "/* c3 */; /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */\n" - "/* c2 */\n" - "(/* c1 */\n" - "/* c2 */\n" - ")/* c1 */\n" - "/* c2 */\n" - ";/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */\n" - " ( /* c1 */\n" - " /* c2 */\n" - " ) /* c1 */\n" - "/* c2 */\n" - "; /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz// c1\n" - "/* c2 */\n" - "(// c1\n" - "/* c2 */\n" - ")// c1\n" - "/* c2 */\n" - ";// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " /* c2 */\n" - " ( // c1\n" - " /* c2 */\n" - " ) // c1\n" - "/* c2 */\n" - "; // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */\n" - "// c2\n" - "(/* c1 */\n" - "// c2\n" - ")/* c1 */\n" - "// c2\n" - ";/* c1 */\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " // c2\n" - " ( /* c1 */\n" - " // c2\n" - " ) /* c1 */\n" - "// c2\n" - "; /* c1 */\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz// c1\n" - "// c2\n" - "(// c1\n" - "// c2\n" - ")// c1\n" - "// c2\n" - ";// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " // c2\n" - " ( // c1\n" - " // c2\n" - " ) // c1\n" - " // c2\n" - "; // c1\n" - " // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "(/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ")/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ";/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " ( /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " ) /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "; /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz// c1\n" - "// c2\n" - "// c3\n" - "(// c1\n" - "// c2\n" - "// c3\n" - ")// c1\n" - "// c2\n" - "// c3\n" - ";// c1\n" - "// c2\n" - "// c3\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " // c2\n" - " // c3\n" - " ( // c1\n" - " // c2\n" - " // c3\n" - " ) // c1\n" - " // c2\n" - " // c3\n" - "; // c1\n" - " // c2\n" - " // c3\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c */)/* c */;/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c */) /* c */; /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */ /* c2 */) /* c1 */ /* c2 */; /* c1 */ /* c2 " - "*/\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c */\n" - ")/* c */\n" - ";/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c */\n" - ") /* c */\n" - "; /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */ /* c2 */\n" - ")/* c1 */ /* c2 */\n" - ";/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */ /* c2 */\n" - ") /* c1 */ /* c2 */\n" - "; /* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c\n" - ")// c\n" - ";// c\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c\n" - ") // c\n" - "; // c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */ // c2\n" - ")/* c1 */ // c2\n" - ";/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */ // c2\n" - ") /* c1 */ // c2\n" - "; /* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c */)\n" - "/* c */;\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c */)\n" - "/* c */;\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ /* c2 */)\n" - "/* c1 */ /* c2 */;\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ /* c2 */)\n" - "/* c1 */ /* c2 */;\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c */\n" - ")\n" - "/* c */\n" - ";\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c */\n" - ")\n" - "/* c */\n" - ";\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ /* c2 */\n" - ")\n" - "/* c1 */ /* c2 */\n" - ";\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */ /* c2 */\n" - ")\n" - "/* c1 */ /* c2 */\n" - ";\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "// c\n" - ")\n" - "// c\n" - ";\n" - "// c\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " // c\n" - ")\n" - "// c\n" - ";\n" - "// c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ // c2\n" - ")\n" - "/* c1 */ // c2\n" - ";\n" - "/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */ // c2\n" - ")\n" - "/* c1 */ // c2\n" - ";\n" - "/* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */\n" - "/* c2 */\n" - ")\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n" - "/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */\n" - " /* c2 */\n" - ")\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n" - "/* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "// c1\n" - "// c2\n" - ")\n" - "// c1\n" - "// c2\n" - ";\n" - "// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " // c1\n" - " // c2\n" - ")\n" - "// c1\n" - "// c2\n" - ";\n" - "// c1\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */)/* c1 */\n" - "/* c2 */;/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - "/* c2 */) /* c1 */\n" - "/* c2 */; /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "/* c2 */)// c1\n" - "/* c2 */;// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - "/* c2 */) // c1\n" - "/* c2 */; // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */\n" - "/* c3 */)/* c1 */\n" - "/* c2 */\n" - "/* c3 */;/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */\n" - "/* c3 */) /* c1 */\n" - "/* c2 */\n" - "/* c3 */; /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */\n" - ")/* c1 */\n" - "/* c2 */\n" - ";/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */\n" - ") /* c1 */\n" - "/* c2 */\n" - "; /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "/* c2 */\n" - ")// c1\n" - "/* c2 */\n" - ";// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " /* c2 */\n" - ") // c1\n" - "/* c2 */\n" - "; // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "// c2\n" - ")/* c1 */\n" - "// c2\n" - ";/* c1 */\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " // c2\n" - ") /* c1 */\n" - "// c2\n" - "; /* c1 */\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "// c2\n" - ")// c1\n" - "// c2\n" - ";// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " // c2\n" - ") // c1\n" - " // c2\n" - "; // c1\n" - " // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ")/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ";/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - ") /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "; /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "// c2\n" - "// c3\n" - ")// c1\n" - "// c2\n" - "// c3\n" - ";// c1\n" - "// c2\n" - "// c3\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " // c2\n" - " // c3\n" - ") // c1\n" - " // c2\n" - " // c3\n" - "; // c1\n" - " // c2\n" - " // c3\n"}, - - // everywhere, with args - - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c */(/* c */arg1/* c */,/* c */arg2/* c */)/* c */;/* c " - "*/\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c */ ( /* c */\n" - " arg1 /* c */, /* c */\n" - " arg2 /* c */) /* c */; /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */ /* c2 */(/* c1 */ /* c2 */arg1/* c1 */ /* c2 */,/* c1 " - "*/ /* c2 */arg2/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ /* c2 */ ( /* c1 */ /* c2 */\n" - " arg1 /* c1 */ /* c2 */, /* c1 */ /* c2 */\n" - " arg2 /* c1 */ /* c2 */) /* c1 */ /* c2 */; /* c1 */ /* c2 " - "*/\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c */\n" - "(/* c */\n" - "arg1/* c */\n" - ",/* c */\n" - "arg2/* c */\n" - ")/* c */\n" - ";/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c */\n" - " ( /* c */\n" - " arg1 /* c */\n" - " , /* c */\n" - " arg2 /* c */\n" - " ) /* c */\n" - "; /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */ /* c2 */\n" - "(/* c1 */ /* c2 */\n" - "arg1/* c1 */ /* c2 */\n" - ",/* c1 */ /* c2 */\n" - "arg2/* c1 */ /* c2 */\n" - ")/* c1 */ /* c2 */\n" - ";/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ /* c2 */\n" - " ( /* c1 */ /* c2 */\n" - " arg1 /* c1 */ /* c2 */\n" - " , /* c1 */ /* c2 */\n" - " arg2 /* c1 */ /* c2 */\n" - " ) /* c1 */ /* c2 */\n" - "; /* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz// c\n" - "(// c\n" - "arg1// c\n" - ",// c\n" - "arg2// c\n" - ")// c\n" - ";// c\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c\n" - " ( // c\n" - " arg1 // c\n" - " , // c\n" - " arg2 // c\n" - " ) // c\n" - "; // c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */ // c2\n" - "(/* c1 */ // c2\n" - "arg1/* c1 */ // c2\n" - ",/* c1 */ // c2\n" - "arg2/* c1 */ // c2\n" - ")/* c1 */ // c2\n" - ";/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */ // c2\n" - " ( /* c1 */ // c2\n" - " arg1 /* c1 */ // c2\n" - " , /* c1 */ // c2\n" - " arg2 /* c1 */ // c2\n" - " ) /* c1 */ // c2\n" - "; /* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c */(\n" - "/* c */arg1\n" - "/* c */,\n" - "/* c */arg2\n" - "/* c */)\n" - "/* c */;\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c */ (\n" - " /* c */ arg1\n" - " /* c */,\n" - " /* c */ arg2\n" - " /* c */)\n" - "/* c */;\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */ /* c2 */(\n" - "/* c1 */ /* c2 */arg1\n" - "/* c1 */ /* c2 */,\n" - "/* c1 */ /* c2 */arg2\n" - "/* c1 */ /* c2 */)\n" - "/* c1 */ /* c2 */;\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */ /* c2 */ (\n" - " /* c1 */ /* c2 */ arg1\n" - " /* c1 */ /* c2 */,\n" - " /* c1 */ /* c2 */ arg2\n" - " /* c1 */ /* c2 */)\n" - "/* c1 */ /* c2 */;\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c */\n" - "(\n" - "/* c */\n" - "arg1\n" - "/* c */\n" - ",\n" - "/* c */\n" - "arg2\n" - "/* c */\n" - ")\n" - "/* c */\n" - ";\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c */\n" - " (\n" - " /* c */\n" - " arg1\n" - " /* c */\n" - " ,\n" - " /* c */\n" - " arg2\n" - " /* c */\n" - " )\n" - "/* c */\n" - ";\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */ /* c2 */\n" - "(\n" - "/* c1 */ /* c2 */\n" - "arg1\n" - "/* c1 */ /* c2 */\n" - ",\n" - "/* c1 */ /* c2 */\n" - "arg2\n" - "/* c1 */ /* c2 */\n" - ")\n" - "/* c1 */ /* c2 */\n" - ";\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */ /* c2 */\n" - " (\n" - " /* c1 */ /* c2 */\n" - " arg1\n" - " /* c1 */ /* c2 */\n" - " ,\n" - " /* c1 */ /* c2 */\n" - " arg2\n" - " /* c1 */ /* c2 */\n" - " )\n" - "/* c1 */ /* c2 */\n" - ";\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "// c\n" - "(\n" - "// c\n" - "arg1\n" - "// c\n" - ",\n" - "// c\n" - "arg2\n" - "// c\n" - ")\n" - "// c\n" - ";\n" - "// c\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " // c\n" - " (\n" - " // c\n" - " arg1\n" - " // c\n" - " ,\n" - " // c\n" - " arg2\n" - " // c\n" - " )\n" - "// c\n" - ";\n" - "// c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */ // c2\n" - "(\n" - "/* c1 */ // c2\n" - "arg1\n" - "/* c1 */ // c2\n" - ",\n" - "/* c1 */ // c2\n" - "arg2\n" - "/* c1 */ // c2\n" - ")\n" - "/* c1 */ // c2\n" - ";\n" - "/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */ // c2\n" - " (\n" - " /* c1 */ // c2\n" - " arg1\n" - " /* c1 */ // c2\n" - " ,\n" - " /* c1 */ // c2\n" - " arg2\n" - " /* c1 */ // c2\n" - " )\n" - "/* c1 */ // c2\n" - ";\n" - "/* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "/* c1 */\n" - "/* c2 */\n" - "(\n" - "/* c1 */\n" - "/* c2 */\n" - "arg1\n" - "/* c1 */\n" - "/* c2 */\n" - ",\n" - "/* c1 */\n" - "/* c2 */\n" - "arg2\n" - "/* c1 */\n" - "/* c2 */\n" - ")\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n" - "/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " /* c1 */\n" - " /* c2 */\n" - " (\n" - " /* c1 */\n" - " /* c2 */\n" - " arg1\n" - " /* c1 */\n" - " /* c2 */\n" - " ,\n" - " /* c1 */\n" - " /* c2 */\n" - " arg2\n" - " /* c1 */\n" - " /* c2 */\n" - " )\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n" - "/* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - "// c1\n" - "// c2\n" - "(\n" - "// c1\n" - "// c2\n" - "arg1\n" - "// c1\n" - "// c2\n" - ",\n" - "// c1\n" - "// c2\n" - "arg2\n" - "// c1\n" - "// c2\n" - ")\n" - "// c1\n" - "// c2\n" - ";\n" - "// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz\n" - " // c1\n" - " // c2\n" - " (\n" - " // c1\n" - " // c2\n" - " arg1\n" - " // c1\n" - " // c2\n" - " ,\n" - " // c1\n" - " // c2\n" - " arg2\n" - " // c1\n" - " // c2\n" - " )\n" - "// c1\n" - "// c2\n" - ";\n" - "// c1\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */\n" - "/* c2 */(/* c1 */\n" - "/* c2 */arg1/* c1 */\n" - "/* c2 */,/* c1 */\n" - "/* c2 */arg2/* c1 */\n" - "/* c2 */)/* c1 */\n" - "/* c2 */;/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */ ( /* c1 */\n" - " /* c2 */ arg1 /* c1 */\n" - " /* c2 */, /* c1 */\n" - " /* c2 */ arg2 /* c1 */\n" - " /* c2 */) /* c1 */\n" - "/* c2 */; /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz// c1\n" - "/* c2 */(// c1\n" - "/* c2 */arg1// c1\n" - "/* c2 */,// c1\n" - "/* c2 */arg2// c1\n" - "/* c2 */)// c1\n" - "/* c2 */;// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " /* c2 */ ( // c1\n" - " /* c2 */ arg1 // c1\n" - " /* c2 */, // c1\n" - " /* c2 */ arg2 // c1\n" - " /* c2 */) // c1\n" - "/* c2 */; // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */\n" - "/* c2 */\n" - "/* c3 */(/* c1 */\n" - "/* c2 */\n" - "/* c3 */arg1/* c1 */\n" - "/* c2 */\n" - "/* c3 */,/* c1 */\n" - "/* c2 */\n" - "/* c3 */arg2/* c1 */\n" - "/* c2 */\n" - "/* c3 */)/* c1 */\n" - "/* c2 */\n" - "/* c3 */;/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */\n" - " /* c3 */ ( /* c1 */\n" - " /* c2 */\n" - " /* c3 */ arg1 /* c1 */\n" - " /* c2 */\n" - " /* c3 */, /* c1 */\n" - " /* c2 */\n" - " /* c3 */ arg2 /* c1 */\n" - " /* c2 */\n" - " /* c3 */) /* c1 */\n" - "/* c2 */\n" - "/* c3 */; /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */\n" - "/* c2 */\n" - "(/* c1 */\n" - "/* c2 */\n" - "arg1/* c1 */\n" - "/* c2 */\n" - ",/* c1 */\n" - "/* c2 */\n" - "arg2/* c1 */\n" - "/* c2 */\n" - ")/* c1 */\n" - "/* c2 */\n" - ";/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */\n" - " ( /* c1 */\n" - " /* c2 */\n" - " arg1 /* c1 */\n" - " /* c2 */\n" - " , /* c1 */\n" - " /* c2 */\n" - " arg2 /* c1 */\n" - " /* c2 */\n" - " ) /* c1 */\n" - "/* c2 */\n" - "; /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz// c1\n" - "/* c2 */\n" - "(// c1\n" - "/* c2 */\n" - "arg1// c1\n" - "/* c2 */\n" - ",// c1\n" - "/* c2 */\n" - "arg2// c1\n" - "/* c2 */\n" - ")// c1\n" - "/* c2 */\n" - ";// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " /* c2 */\n" - " ( // c1\n" - " /* c2 */\n" - " arg1 // c1\n" - " /* c2 */\n" - " , // c1\n" - " /* c2 */\n" - " arg2 // c1\n" - " /* c2 */\n" - " ) // c1\n" - "/* c2 */\n" - "; // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */\n" - "// c2\n" - "(/* c1 */\n" - "// c2\n" - "arg1/* c1 */\n" - "// c2\n" - ",/* c1 */\n" - "// c2\n" - "arg2/* c1 */\n" - "// c2\n" - ")/* c1 */\n" - "// c2\n" - ";/* c1 */\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " // c2\n" - " ( /* c1 */\n" - " // c2\n" - " arg1 /* c1 */\n" - " // c2\n" - " , /* c1 */\n" - " // c2\n" - " arg2 /* c1 */\n" - " // c2\n" - " ) /* c1 */\n" - "// c2\n" - "; /* c1 */\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz// c1\n" - "// c2\n" - "(// c1\n" - "// c2\n" - "arg1// c1\n" - "// c2\n" - ",// c1\n" - "// c2\n" - "arg2// c1\n" - "// c2\n" - ")// c1\n" - "// c2\n" - ";// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " // c2\n" - " ( // c1\n" - " // c2\n" - " arg1 // c1\n" - " // c2\n" - " , // c1\n" - " // c2\n" - " arg2 // c1\n" - " // c2\n" - " ) // c1\n" - " // c2\n" - "; // c1\n" - " // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "(/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "arg1/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ",/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "arg2/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ")/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ";/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " ( /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " arg1 /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " , /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " arg2 /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " ) /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "; /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "$foobarbaz// c1\n" - "// c2\n" - "// c3\n" - "(// c1\n" - "// c2\n" - "// c3\n" - "arg1// c1\n" - "// c2\n" - "// c3\n" - ",// c1\n" - "// c2\n" - "// c3\n" - "arg2// c1\n" - "// c2\n" - "// c3\n" - ")// c1\n" - "// c2\n" - "// c3\n" - ";// c1\n" - "// c2\n" - "// c3\n", - "// verilog_syntax: parse-as-module-body\n" - "$foobarbaz // c1\n" - " // c2\n" - " // c3\n" - " ( // c1\n" - " // c2\n" - " // c3\n" - " arg1 // c1\n" - " // c2\n" - " // c3\n" - " , // c1\n" - " // c2\n" - " // c3\n" - " arg2 // c1\n" - " // c2\n" - " // c3\n" - " ) // c1\n" - " // c2\n" - " // c3\n" - "; // c1\n" - " // c2\n" - " // c3\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c */arg1/* c */,/* c */arg2/* c */)/* c */;/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c */\n" - " arg1 /* c */, /* c */\n" - " arg2 /* c */) /* c */; /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */ /* c2 */arg1/* c1 */ /* c2 */,/* c1 */ /* c2 " - "*/arg2/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */ /* c2 */\n" - " arg1 /* c1 */ /* c2 */, /* c1 */ /* c2 */\n" - " arg2 /* c1 */ /* c2 */) /* c1 */ /* c2 */; /* c1 */ /* c2 " - "*/\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c */\n" - "arg1/* c */\n" - ",/* c */\n" - "arg2/* c */\n" - ")/* c */\n" - ";/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c */\n" - " arg1 /* c */\n" - " , /* c */\n" - " arg2 /* c */\n" - ") /* c */\n" - "; /* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */ /* c2 */\n" - "arg1/* c1 */ /* c2 */\n" - ",/* c1 */ /* c2 */\n" - "arg2/* c1 */ /* c2 */\n" - ")/* c1 */ /* c2 */\n" - ";/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */ /* c2 */\n" - " arg1 /* c1 */ /* c2 */\n" - " , /* c1 */ /* c2 */\n" - " arg2 /* c1 */ /* c2 */\n" - ") /* c1 */ /* c2 */\n" - "; /* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c\n" - "arg1// c\n" - ",// c\n" - "arg2// c\n" - ")// c\n" - ";// c\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c\n" - " arg1 // c\n" - " , // c\n" - " arg2 // c\n" - ") // c\n" - "; // c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */ // c2\n" - "arg1/* c1 */ // c2\n" - ",/* c1 */ // c2\n" - "arg2/* c1 */ // c2\n" - ")/* c1 */ // c2\n" - ";/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */ // c2\n" - " arg1 /* c1 */ // c2\n" - " , /* c1 */ // c2\n" - " arg2 /* c1 */ // c2\n" - ") /* c1 */ // c2\n" - "; /* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c */arg1\n" - "/* c */,\n" - "/* c */arg2\n" - "/* c */)\n" - "/* c */;\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c */ arg1\n" - " /* c */,\n" - " /* c */ arg2\n" - "/* c */)\n" - "/* c */;\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ /* c2 */arg1\n" - "/* c1 */ /* c2 */,\n" - "/* c1 */ /* c2 */arg2\n" - "/* c1 */ /* c2 */)\n" - "/* c1 */ /* c2 */;\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */ /* c2 */ arg1\n" - " /* c1 */ /* c2 */,\n" - " /* c1 */ /* c2 */ arg2\n" - "/* c1 */ /* c2 */)\n" - "/* c1 */ /* c2 */;\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c */\n" - "arg1\n" - "/* c */\n" - ",\n" - "/* c */\n" - "arg2\n" - "/* c */\n" - ")\n" - "/* c */\n" - ";\n" - "/* c */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c */\n" - " arg1\n" - " /* c */\n" - " ,\n" - " /* c */\n" - " arg2\n" - " /* c */\n" - ")\n" - "/* c */\n" - ";\n" - "/* c */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ /* c2 */\n" - "arg1\n" - "/* c1 */ /* c2 */\n" - ",\n" - "/* c1 */ /* c2 */\n" - "arg2\n" - "/* c1 */ /* c2 */\n" - ")\n" - "/* c1 */ /* c2 */\n" - ";\n" - "/* c1 */ /* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */ /* c2 */\n" - " arg1\n" - " /* c1 */ /* c2 */\n" - " ,\n" - " /* c1 */ /* c2 */\n" - " arg2\n" - " /* c1 */ /* c2 */\n" - ")\n" - "/* c1 */ /* c2 */\n" - ";\n" - "/* c1 */ /* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "// c\n" - "arg1\n" - "// c\n" - ",\n" - "// c\n" - "arg2\n" - "// c\n" - ")\n" - "// c\n" - ";\n" - "// c\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " // c\n" - " arg1\n" - " // c\n" - " ,\n" - " // c\n" - " arg2\n" - " // c\n" - ")\n" - "// c\n" - ";\n" - "// c\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */ // c2\n" - "arg1\n" - "/* c1 */ // c2\n" - ",\n" - "/* c1 */ // c2\n" - "arg2\n" - "/* c1 */ // c2\n" - ")\n" - "/* c1 */ // c2\n" - ";\n" - "/* c1 */ // c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */ // c2\n" - " arg1\n" - " /* c1 */ // c2\n" - " ,\n" - " /* c1 */ // c2\n" - " arg2\n" - " /* c1 */ // c2\n" - ")\n" - "/* c1 */ // c2\n" - ";\n" - "/* c1 */ // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "/* c1 */\n" - "/* c2 */\n" - "arg1\n" - "/* c1 */\n" - "/* c2 */\n" - ",\n" - "/* c1 */\n" - "/* c2 */\n" - "arg2\n" - "/* c1 */\n" - "/* c2 */\n" - ")\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n" - "/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " /* c1 */\n" - " /* c2 */\n" - " arg1\n" - " /* c1 */\n" - " /* c2 */\n" - " ,\n" - " /* c1 */\n" - " /* c2 */\n" - " arg2\n" - " /* c1 */\n" - " /* c2 */\n" - ")\n" - "/* c1 */\n" - "/* c2 */\n" - ";\n" - "/* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - "// c1\n" - "// c2\n" - "arg1\n" - "// c1\n" - "// c2\n" - ",\n" - "// c1\n" - "// c2\n" - "arg2\n" - "// c1\n" - "// c2\n" - ")\n" - "// c1\n" - "// c2\n" - ";\n" - "// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(\n" - " // c1\n" - " // c2\n" - " arg1\n" - " // c1\n" - " // c2\n" - " ,\n" - " // c1\n" - " // c2\n" - " arg2\n" - " // c1\n" - " // c2\n" - ")\n" - "// c1\n" - "// c2\n" - ";\n" - "// c1\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */arg1/* c1 */\n" - "/* c2 */,/* c1 */\n" - "/* c2 */arg2/* c1 */\n" - "/* c2 */)/* c1 */\n" - "/* c2 */;/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */ arg1 /* c1 */\n" - " /* c2 */, /* c1 */\n" - " /* c2 */ arg2 /* c1 */\n" - "/* c2 */) /* c1 */\n" - "/* c2 */; /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "/* c2 */arg1// c1\n" - "/* c2 */,// c1\n" - "/* c2 */arg2// c1\n" - "/* c2 */)// c1\n" - "/* c2 */;// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " /* c2 */ arg1 // c1\n" - " /* c2 */, // c1\n" - " /* c2 */ arg2 // c1\n" - "/* c2 */) // c1\n" - "/* c2 */; // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */\n" - "/* c3 */arg1/* c1 */\n" - "/* c2 */\n" - "/* c3 */,/* c1 */\n" - "/* c2 */\n" - "/* c3 */arg2/* c1 */\n" - "/* c2 */\n" - "/* c3 */)/* c1 */\n" - "/* c2 */\n" - "/* c3 */;/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */\n" - " /* c3 */ arg1 /* c1 */\n" - " /* c2 */\n" - " /* c3 */, /* c1 */\n" - " /* c2 */\n" - " /* c3 */ arg2 /* c1 */\n" - " /* c2 */\n" - "/* c3 */) /* c1 */\n" - "/* c2 */\n" - "/* c3 */; /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */\n" - "arg1/* c1 */\n" - "/* c2 */\n" - ",/* c1 */\n" - "/* c2 */\n" - "arg2/* c1 */\n" - "/* c2 */\n" - ")/* c1 */\n" - "/* c2 */\n" - ";/* c1 */\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */\n" - " arg1 /* c1 */\n" - " /* c2 */\n" - " , /* c1 */\n" - " /* c2 */\n" - " arg2 /* c1 */\n" - " /* c2 */\n" - ") /* c1 */\n" - "/* c2 */\n" - "; /* c1 */\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "/* c2 */\n" - "arg1// c1\n" - "/* c2 */\n" - ",// c1\n" - "/* c2 */\n" - "arg2// c1\n" - "/* c2 */\n" - ")// c1\n" - "/* c2 */\n" - ";// c1\n" - "/* c2 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " /* c2 */\n" - " arg1 // c1\n" - " /* c2 */\n" - " , // c1\n" - " /* c2 */\n" - " arg2 // c1\n" - " /* c2 */\n" - ") // c1\n" - "/* c2 */\n" - "; // c1\n" - "/* c2 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "// c2\n" - "arg1/* c1 */\n" - "// c2\n" - ",/* c1 */\n" - "// c2\n" - "arg2/* c1 */\n" - "// c2\n" - ")/* c1 */\n" - "// c2\n" - ";/* c1 */\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " // c2\n" - " arg1 /* c1 */\n" - " // c2\n" - " , /* c1 */\n" - " // c2\n" - " arg2 /* c1 */\n" - " // c2\n" - ") /* c1 */\n" - "// c2\n" - "; /* c1 */\n" - "// c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "// c2\n" - "arg1// c1\n" - "// c2\n" - ",// c1\n" - "// c2\n" - "arg2// c1\n" - "// c2\n" - ")// c1\n" - "// c2\n" - ";// c1\n" - "// c2\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " // c2\n" - " arg1 // c1\n" - " // c2\n" - " , // c1\n" - " // c2\n" - " arg2 // c1\n" - " // c2\n" - ") // c1\n" - " // c2\n" - "; // c1\n" - " // c2\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "arg1/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ",/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "arg2/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ")/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - ";/* c1 */\n" - "/* c2 */\n" - "/* c3 */\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " arg1 /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " , /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - " arg2 /* c1 */\n" - " /* c2 */\n" - " /* c3 */\n" - ") /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n" - "; /* c1 */\n" - "/* c2 */\n" - "/* c3 */\n"}, - {"// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ(// c1\n" - "// c2\n" - "// c3\n" - "arg1// c1\n" - "// c2\n" - "// c3\n" - ",// c1\n" - "// c2\n" - "// c3\n" - "arg2// c1\n" - "// c2\n" - "// c3\n" - ")// c1\n" - "// c2\n" - "// c3\n" - ";// c1\n" - "// c2\n" - "// c3\n", - "// verilog_syntax: parse-as-module-body\n" - "`FOOBARBAZ( // c1\n" - " // c2\n" - " // c3\n" - " arg1 // c1\n" - " // c2\n" - " // c3\n" - " , // c1\n" - " // c2\n" - " // c3\n" - " arg2 // c1\n" - " // c2\n" - " // c3\n" - ") // c1\n" - " // c2\n" - " // c3\n" - "; // c1\n" - " // c2\n" - " // c3\n"}, - {"module indent();\n" - " reg a;\n" - " reg [32:0] b;\n" - " wire c;\n" - " wire d = e ? kFoo : kBar;\n" - "endmodule\n", - "module indent ();\n" - " reg a;\n" - " reg [32:0] b;\n" - " wire c;\n" - " wire d = e ? kFoo : kBar;\n" - "endmodule\n"}, - - {"class C; T1 b; logic [$] a; T1 [$] c; endclass\n", - "class C;\n" - " T1 b;\n" - " logic [$] a;\n" - " T1 [$] c;\n" - "endclass\n"}, - {"class C;\n" - " T1 b; //test\n" - " logic [$] a; //test\n" - " T1 [$] c; //test\n" - "endclass\n", - "class C;\n" - " T1 b; //test\n" - " logic [$] a; //test\n" - " T1 [$] c; //test\n" - "endclass\n"}, - {"class C;\n" - " T1\n" - " b;\n" - " logic\n" - " [$]\n" - " a;\n" - " T1\n" - " [$]\n" - " c;\n" - "endclass\n", - "class C;\n" - " T1 b;\n" - " logic [$] a;\n" - " T1 [$] c;\n" - "endclass\n"}, - {"class C;\n" - " logic/*t*/ [0 : 1] /*t*/\n" - " a;/*t*/\n" - " T1/*t*/[0 : 1]/*t*/\n" - " c;/*t*/\n" - "endclass\n", - "class C;\n" - " logic/*t*/ [0 : 1] /*t*/ a; /*t*/\n" - " T1/*t*/ [0 : 1] /*t*/ c; /*t*/\n" - "endclass\n"}, - {"always @(*/*t*/) begin\n" - "end\n", - "always @(* /*t*/) begin\n" - "end\n"}, - {"always @(/*t*/*) begin\n" - "end\n", - "always @( /*t*/ *) begin\n" - "end\n"}, - {"always @(/*t*/*/*t*/) begin\n" - "end\n", - "always @( /*t*/ * /*t*/) begin\n" - "end\n"}, - {"always @(*) begin\n" - "end\n", - "always @(*) begin\n" - "end\n"}, - {"always @(* ) begin\n" - "end\n", - "always @(*) begin\n" - "end\n"}, - {"always @( *) begin\n" - "end\n", - "always @(*) begin\n" - "end\n"}, - {"always @( * ) begin\n" - "end\n", - "always @(*) begin\n" - "end\n"}, - {"always @( /*t*/ * /*t*/ ) begin\n" - "end\n", - "always @( /*t*/ * /*t*/) begin\n" - "end\n"}, - { - // Don't touch verilog_format:off region #1538 - R"( -module testcode; - // verilog_format: off - assign a = b - & c; - // verilog_format: on - assign e = d; -endmodule -)", - R"( -module testcode; - // verilog_format: off - assign a = b - & c; - // verilog_format: on - assign e = d; -endmodule -)", - - }, - - // ----------------------------------------------------------------- }; -// Tests that formatter produces expected results, end-to-end. -TEST(FormatterEndToEndTest, VerilogFormatTest) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - for (const auto &test_case : kFormatterTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, AutoInferAlignment) { - static constexpr FormatterTestCase kTestCases[] = { - {"", ""}, - {"\n", "\n"}, - {"class cc ;\n" - "endclass:cc\n", - "class cc;\n" - "endclass : cc\n"}, - - // module port declarations - {"module pd(\n" - "input wire foo,\n" - "output reg bar\n" - ");\n" - "endmodule:pd\n", - "module pd (\n" - " input wire foo,\n" // flush-left vs. align are similar enough, - " output reg bar\n" // so automatic policy will align. - ");\n" - "endmodule : pd\n"}, - {"module pd(\n" - "input foo_pkg::baz_t foo,\n" - "output reg bar\n" - ");\n" - "endmodule:pd\n", - "module pd (\n" - " input foo_pkg::baz_t foo,\n" // alignment would add too many spaces - " output reg bar\n" // so infer intent to flush-left. - ");\n" - "endmodule : pd\n"}, - {"module pd(\n" - "input foo_pkg::baz_t foo,\n" - "output reg bar\n" // user injects 4 excess spaces here ... - ");\n" - "endmodule:pd\n", - "module pd (\n" - " input foo_pkg::baz_t foo,\n" - " output reg bar\n" // ... and triggers alignment. - ");\n" - "endmodule : pd\n"}, - {"module pd(\n" - "`ifdef FAA\n" // inside preprocessing conditional - "input baaaz_t foo,\n" - "output reg bar\n" // user injects 4 excess spaces here ... - "`endif\n" - ");\n" - "endmodule:pd\n", - "module pd (\n" - "`ifdef FAA\n" - " input baaaz_t foo,\n" - " output reg bar\n" // ... and triggers alignment. - "`endif\n" - ");\n" - "endmodule : pd\n"}, - {"module pd(\n" - "`ifdef FAA\n" // inside preprocessing conditional - "input baaaz_t foo,\n" - "`else\n" - "output reg bar\n" // user injects 4 excess spaces here ... - "`endif\n" - ");\n" - "endmodule:pd\n", - "module pd (\n" - "`ifdef FAA\n" - " input baaaz_t foo,\n" // aligned - "`else\n" // aligned across preprocessing directives - " output reg bar\n" // ... and triggers alignment. - "`endif\n" - ");\n" - "endmodule : pd\n"}, - {"module pd(\n" - "input logic [31:0] bus,\n" - "input logic [7:0] bus2,\n" - "`ifdef FAA\n" // inside preprocessing conditional - "input baaaz_t foo,\n" - "`else\n" - "output reg bar,\n" // user injects 4 excess spaces here ... - "`endif\n" - "output out_t zout1,\n" - "output out_t zout2\n" - ");\n" - "endmodule:pd\n", - "module pd (\n" - " input logic [31:0] bus,\n" // treated as one large group - " input logic [ 7:0] bus2,\n" - "`ifdef FAA\n" - " input baaaz_t foo,\n" // aligned - "`else\n" // aligned across preprocessing directives - " output reg bar,\n" // ... and triggers alignment. - "`endif\n" - " output out_t zout1,\n" - " output out_t zout2\n" - ");\n" - "endmodule : pd\n"}, - {"module pd(\n" - "input logic [7:0] bus2,\n" - "`ifndef FAA\n" // inside preprocessing conditional - "input logic [31:0] bus,\n" - "input baaaz_t foo,\n" - "`elsif BLA\n" - "output reg bar,\n" // user injects 4 excess spaces here ... - "output out_t zout1,\n" - "`endif\n" - "output out_t zout2\n" - ");\n" - "endmodule:pd\n", - "module pd (\n" - " input logic [ 7:0] bus2,\n" - "`ifndef FAA\n" - " input logic [31:0] bus,\n" // treated as one large group - " input baaaz_t foo,\n" // aligned - "`elsif BLA\n" // aligned across preprocessing directives - " output reg bar,\n" // ... and triggers alignment. - " output out_t zout1,\n" - "`endif\n" - " output out_t zout2\n" - ");\n" - "endmodule : pd\n"}, - {// data declaration and net declaration in ports - "module m(\n" - "logic [x:y]a ,\n" // packed dimensions, induce alignment - "wire [pp:qq] [e:f]b\n" // packed dimensions, 2D - ") ;\n" - "endmodule\n", - "module m (\n" - " logic [ x:y] a,\n" - " wire [pp:qq][e:f] b\n" - ");\n" - "endmodule\n"}, - {// used-defined data declarations in ports - "module m(\n" - "a::bb [x:y]a ,\n" // packed dimensions, induce alignment - "c#(d,e) [pp:qq] [e:f]b\n" // packed dimensions, 2D - ") ;\n" - "endmodule\n", - "module m (\n" - " a::bb [ x:y] a,\n" - " c#(d, e) [pp:qq][e:f] b\n" - ");\n" - "endmodule\n"}, - - // named parameter arguments - {"module mm ;\n" - "foo #(\n" - ".a(a),\n" - ".bb(bb)\n" - ")bar( );\n" - "endmodule:mm\n", - "module mm;\n" - " foo #(\n" - " .a (a),\n" // align doesn't add too many spaces, so align - " .bb(bb)\n" - " ) bar ();\n" - "endmodule : mm\n"}, - {"module mm ;\n" - "foo #(\n" - ".a(a),\n" - ".bbcccc(bb)\n" - ")bar( );\n" - "endmodule:mm\n", - "module mm;\n" - " foo #(\n" - " .a(a),\n" // align would add too many spaces, so flush-left - " .bbcccc(bb)\n" - " ) bar ();\n" - "endmodule : mm\n"}, - {"module mm ;\n" - "foo #(\n" - ".a(a ),\n" // user manually triggers alignment with excess spaces - ".bbcccc(bb)\n" - ")bar( );\n" - "endmodule:mm\n", - "module mm;\n" - " foo #(\n" - " .a (a),\n" // induced alignment - " .bbcccc(bb)\n" - " ) bar ();\n" - "endmodule : mm\n"}, - {"module mm ;\n" - "foo #(\n" - "//c1\n" // with comments (indented but not aligned) - ".a(a ),\n" // user manually triggers alignment with excess spaces - "//c2\n" - ".bbcccc(bb)\n" - "//c3\n" - ")bar( );\n" - "endmodule:mm\n", - "module mm;\n" - " foo #(\n" - " //c1\n" - " .a (a),\n" // induced alignment - " //c2\n" - " .bbcccc(bb)\n" - " //c3\n" - " ) bar ();\n" - "endmodule : mm\n"}, - {"module mm ;\n" - "foo #(\n" - ".a( (1 +2)),\n" // excess spaces, testing extra parentheses - ".bbcccc((c*d)+(e*f))\n" - ")bar( );\n" - "endmodule:mm\n", - "module mm;\n" - " foo #(\n" - " .a ((1 + 2)),\n" // induced alignment - " .bbcccc((c * d) + (e * f))\n" - " ) bar ();\n" - "endmodule : mm\n"}, - - // named port connections - {"module mm ;\n" - "foo bar(\n" - ".a(a),\n" - ".bb(bb)\n" - ");\n" - "endmodule:mm\n", - "module mm;\n" - " foo bar (\n" - " .a (a),\n" // align doesn't add too many spaces, so align - " .bb(bb)\n" - " );\n" - "endmodule : mm\n"}, - {"module mm ;\n" - "foo bar(\n" - ".a(a),\n" - ".bbbbbb(bb)\n" - ");\n" - "endmodule:mm\n", - "module mm;\n" - " foo bar (\n" - " .a(a),\n" // align would add too many spaces, so flush-left - " .bbbbbb(bb)\n" - " );\n" - "endmodule : mm\n"}, - {"module mm ;\n" - "foo bar(\n" - ".a (a),\n" // user manually triggers alignment with excess spaces - ".bbbbbb(bb)\n" - ");\n" - "endmodule:mm\n", - "module mm;\n" - " foo bar (\n" - " .a (a),\n" // alignment fixed - " .bbbbbb(bb)\n" - " );\n" - "endmodule : mm\n"}, - - // net variable declarations - {"module nn;\n" - "wire wwwww;\n" - "logic lll;\n" - "endmodule : nn\n", - "module nn;\n" - " wire wwwww;\n" // alignment adds few spaces, so align - " logic lll;\n" - "endmodule : nn\n"}, - {"module nn;\n" - "wire wwwww;\n" - "foo_pkg::baz_t lll;\n" - "endmodule : nn\n", - "module nn;\n" - " wire wwwww;\n" // alignment adds too many spaces, so flush-left - " foo_pkg::baz_t lll;\n" - "endmodule : nn\n"}, - {"module nn;\n" - "wire wwwww;\n" // user injects spaces to trigger alignment - "foo_pkg::baz_t lll;\n" - "endmodule : nn\n", - "module nn;\n" - " wire wwwww;\n" // ... and gets alignment - " foo_pkg::baz_t lll;\n" - "endmodule : nn\n"}, - {// data/net declarations as generate items (conditional) - "module nn;\n" - "if (cc)begin:fff\n" - "wire wwwww;\n" - "logic lll;\n" - "end:fff\n" - "endmodule : nn\n", - "module nn;\n" - " if (cc) begin : fff\n" - " wire wwwww;\n" // alignment adds few spaces, so align - " logic lll;\n" - " end : fff\n" - "endmodule : nn\n"}, - - // continuous assignments - {"module m_assign;\n" - "assign foo = 1'b1;\n" // alignment adds few spaces, so align - "assign baar = 1'b0;\n" - "endmodule\n", - "module m_assign;\n" - " assign foo = 1'b1;\n" // aligned - " assign baar = 1'b0;\n" - "endmodule\n"}, - {"module m_assign;\n" - "assign foo = 1'b1;\n" // alignment adds too many spaces, so - // flush-left - "assign baaaaaar = 1'b0;\n" - "endmodule\n", - "module m_assign;\n" - " assign foo = 1'b1;\n" // flush-left - " assign baaaaaar = 1'b0;\n" - "endmodule\n"}, - {"module m_assign;\n" - "assign foo = 1'b1;\n" // induce alignment with excess spaces - "assign baaaaaar = 1'b0;\n" - "endmodule\n", - "module m_assign;\n" - " assign foo = 1'b1;\n" // aligned - " assign baaaaaar = 1'b0;\n" - "endmodule\n"}, - {// currently, does not assign across ifdefs - "module m_assign;\n" - "`ifdef FOO\n" - "assign foo = 1'b1;\n" // induce alignment with excess spaces - "assign baaaaaar = 1'b0;\n" - "`else\n" - "assign zooo = 2'b11;\n" - "assign yoo = 2'b00;\n" - "`endif\n" - "endmodule\n", - "module m_assign;\n" - "`ifdef FOO\n" - " assign foo = 1'b1;\n" // aligned - " assign baaaaaar = 1'b0;\n" - "`else\n" // aligned separately above/below - " assign zooo = 2'b11;\n" // aligned - " assign yoo = 2'b00;\n" // aligned - "`endif\n" - "endmodule\n"}, - {// mixed net declaration and continuous assignment, both groups aligned - "module m_assign;\n" - "wire wwwww;\n" // induce alignment - "foo_pkg::baz_t lll;\n" - "assign foo = 1'b1;\n" // induce alignment - "assign baaaaaar = 1'b0;\n" - "endmodule\n", - "module m_assign;\n" - " wire wwwww;\n" // aligned - " foo_pkg::baz_t lll;\n" - " assign foo = 1'b1;\n" // aligned - " assign baaaaaar = 1'b0;\n" - "endmodule\n"}, - {// continuous assignments as generate items (conditional) - "module m_assign;\n" - "if (xy) begin\n" - "assign foo = 1'b0;\n" // align: adds few spaces - "assign baaar = 1'b1;\n" - "end else begin\n" - "assign goo = 1'b1;\n" // induce alignment with excess spaces - "assign zaaaaaar = 1'b0;\n" - "end\n" - "endmodule\n", - "module m_assign;\n" - " if (xy) begin\n" - " assign foo = 1'b0;\n" // aligned - " assign baaar = 1'b1;\n" - " end else begin\n" - " assign goo = 1'b1;\n" // induce alignment with excess spaces - " assign zaaaaaar = 1'b0;\n" - " end\n" - "endmodule\n"}, - {// continuous assignments as generate items (loop) - "module m_assign;\n" - "for(genvar i=0; i<k; ++i ) begin\n" - "assign foo = 1'b0;\n" // align: adds few spaces - "assign baaar = 1'b1;\n" - "end\n" - "endmodule\n", - "module m_assign;\n" - " for (genvar i = 0; i < k; ++i) begin\n" - " assign foo = 1'b0;\n" // aligned - " assign baaar = 1'b1;\n" - " end\n" - "endmodule\n"}, - {// continuous assignments as generate items (case) - "module m_assign;\n" - "case (c)\n" - "jk:begin\n" - "assign foo = 1'b0;\n" // align: adds few spaces - "assign baaar = 1'b1;\n" - "end\n" - "endcase\n" - "endmodule\n", - "module m_assign;\n" - " case (c)\n" - " jk: begin\n" - " assign foo = 1'b0;\n" // aligned - " assign baaar = 1'b1;\n" - " end\n" - " endcase\n" - "endmodule\n"}, - {// continuous assignment with comment - "module m;\n" - "// comment1\n" - "assign aaaaa = (bbbbb != ccccc) &\n" - "// comment2\n" - "(ddddd | (eeeee & ffffff));\n" - "endmodule\n", - "module m;\n" - " // comment1\n" - " assign aaaaa = (bbbbb != ccccc) &\n" - " // comment2\n" - " (ddddd | (eeeee & ffffff));\n" - "endmodule\n"}, - - // net/variable assignments: blocking and nonblocking - {"module ma ;\n" - "initial begin\n" - "aa = b;\n" - "c = 1'b0;\n" - "end\n" - "endmodule\n", - "module ma;\n" - " initial begin\n" - " aa = b;\n" - " c = 1'b0;\n" // only one space to align - " end\n" - "endmodule\n"}, - {"function void fa ;\n" - "c = 1'b0;\n" - "aa = b;\n" - "endfunction\n", - "function void fa;\n" - " c = 1'b0;\n" // only one space to align - " aa = b;\n" - "endfunction\n"}, - {"task ta ; \n" - "aa = b;\n" - "c = 1'b0;\n" - "endtask\n", - "task ta;\n" - " aa = b;\n" - " c = 1'b0;\n" // only one space to align - "endtask\n"}, - {"module ma ;\n" - "always@( posedge clk) begin\n" - "aaa <= b;\n" - "c <= 1'b0;\n" - "end\n" - "endmodule\n", - "module ma;\n" - " always @(posedge clk) begin\n" - " aaa <= b;\n" - " c <= 1'b0;\n" // only two spaces to align - " end\n" - "endmodule\n"}, - {"function int fa ;\n" - "c <= 1'b0;\n" - "aa <= b;\n" - "return 0 ;\n" - "endfunction\n", - "function int fa;\n" - " c <= 1'b0;\n" // only one space to align - " aa <= b;\n" - " return 0;\n" - "endfunction\n"}, - {"task ta ; \n" - "$display (\"hello\" );\n" - "aa <= b;\n" - "c <= 1'b0;\n" - "endtask\n", - "task ta;\n" - " $display(\"hello\");\n" - " aa <= b;\n" - " c <= 1'b0;\n" // only one space to align - "endtask\n"}, - {// mixed blocking and nonblocking assignments - "module ma ;\n" - "always@( posedge clk) begin\n" - "aaaaa = b;\n" - "ccc = 1'b0;\n" - "aaa <= b;\n" - "c <= 1'b0;\n" - "end\n" - "endmodule\n", - "module ma;\n" - " always @(posedge clk) begin\n" - " aaaaa = b;\n" - " ccc = 1'b0;\n" // only two spaces to align - " aaa <= b;\n" - " c <= 1'b0;\n" // only two spaces to align (separate group) - " end\n" - "endmodule\n"}, - {"task ta ; \n" - "aa <= b;\n" - "c <= 1'b0;\n" - "$display (\"hello\" );\n" // separates above/below alignment groups - "zzaa <= b;\n" - "zzc <= 1'b0;\n" - "endtask\n", - "task ta;\n" - " aa <= b;\n" - " c <= 1'b0;\n" // only one space to align - " $display(\"hello\");\n" - " zzaa <= b;\n" - " zzc <= 1'b0;\n" // only one space to align - "endtask\n"}, - {"task ta ; \n" - "$display (\"hello\" );\n" - "aaaaa <= b;\n" - "c <= 1'b0;\n" // need too many spaces to align - "endtask\n", - "task ta;\n" - " $display(\"hello\");\n" - " aaaaa <= b;\n" - " c <= 1'b0;\n" // so keep flush-left - "endtask\n"}, - {"function void fa ; \n" - "$display (\"hello\" );\n" - "aaaaa = b;\n" - "c = 1'b0;\n" // need too many spaces to align - "endfunction\n", - "function void fa;\n" - " $display(\"hello\");\n" - " aaaaa = b;\n" - " c = 1'b0;\n" // so keep flush-left - "endfunction\n"}, - {"module ma ;\n" - "always@( posedge clk) begin\n" - "aaaxx <= b;\n" - "c <= 1'b0;\n" // need too many spaces to align - "end\n" - "endmodule\n", - "module ma;\n" - " always @(posedge clk) begin\n" - " aaaxx <= b;\n" - " c <= 1'b0;\n" // so keep flush-left - " end\n" - "endmodule\n"}, - {"module ma ;\n" - "always@( posedge clk) begin\n" - "aaaxx <= b ;\n" // inject 4 spaces to induce alignment - "c <= 1'b0;\n" - "end\n" - "endmodule\n", - "module ma;\n" - " always @(posedge clk) begin\n" - " aaaxx <= b;\n" - " c <= 1'b0;\n" // induced alignment - " end\n" - "endmodule\n"}, - {"module ma ;\n" - "always@( posedge clk) begin\n" - "aaaxx <= b ;\n" // inject 4 spaces to induce alignment - "//comment\n" - "c <= 1'b0;\n" - "end\n" - "endmodule\n", - "module ma;\n" - " always @(posedge clk) begin\n" - " aaaxx <= b;\n" - " //comment\n" // ignored within alignment group - " c <= 1'b0;\n" // induced alignment - " end\n" - "endmodule\n"}, - - // local variable declarations as statements - {"task tt ;\n" - "int foo;\n" // only 2 spaces needed to align - "bar_t baz;\n" - "endtask\n", - "task tt;\n" - " int foo;\n" // aligned - " bar_t baz;\n" - "endtask\n"}, - {"function ff ;\n" - "bar_t baz;\n" - "int foo;\n" // only 2 spaces needed to align - "endfunction\n", - "function ff;\n" - " bar_t baz;\n" - " int foo;\n" // aligned - "endfunction\n"}, - {"task tt ;\n" - "int foo;\n" // too many spaces needed to align - "baaaar_t baz;\n" - "endtask\n", - "task tt;\n" - " int foo;\n" // so flush-left - " baaaar_t baz;\n" - "endtask\n"}, - {"function ff ;\n" - "baaaar_t baz;\n" - "int foo;\n" // too many spaces needed to align - "endfunction\n", - "function ff;\n" - " baaaar_t baz;\n" - " int foo;\n" // so flush-left - "endfunction\n"}, - {"task tt ;\n" - "int foo;\n" // injected spaces to induce alignment - "baaaar_t baz;\n" - "endtask\n", - "task tt;\n" - " int foo;\n" // aligned - " baaaar_t baz;\n" - "endtask\n"}, - {"function ff ;\n" - "baaaar_t baz ;\n" // injected spaces to induce alignment - "int foo;\n" - "endfunction\n", - "function ff;\n" - " baaaar_t baz;\n" - " int foo;\n" // so aligned - "endfunction\n"}, - - // formal parameters - {"module pp #(\n" - "int W,\n" - "type T\n" - ") ();\n" - "endmodule : pp\n", - "module pp #(\n" - " int W,\n" // alignment adds few spaces, so do it - " type T\n" - ") ();\n" - "endmodule : pp\n"}, - {"module pp #(\n" - "int W,\n" - "int[xx:yy] T\n" - ") ();\n" - "endmodule : pp\n", - "module pp #(\n" - " int W,\n" // alignment adds many spaces, so flush-left - " int [xx:yy] T\n" - ") ();\n" - "endmodule : pp\n"}, - {"module pp #(\n" - "int W,\n" - "int[xx:yy] T\n" // user injected spaces intentionally - ") ();\n" - "endmodule : pp\n", - "module pp #(\n" - " int W,\n" // ... trigger alignment - " int [xx:yy] T\n" - ") ();\n" - "endmodule : pp\n"}, - - // class member variables - {"class cc ;\n" - "int my_int;\n" - "bar_t my_bar;\n" - "endclass:cc\n", - "class cc;\n" - " int my_int;\n" // align doesn't add too many spaces, so align - " bar_t my_bar;\n" - "endclass : cc\n"}, - {"class cc ;\n" - "int my_int;\n" - "foo_pkg::bar_t my_bar;\n" - "endclass:cc\n", - "class cc;\n" - " int my_int;\n" // align would add too many spaces, so flush-left - " foo_pkg::bar_t my_bar;\n" - "endclass : cc\n"}, - {"class cc ;\n" - "int my_int;\n" // intentional excessive spaces, trigger alignment - "foo_pkg::bar_t my_bar;\n" - "endclass:cc\n", - "class cc;\n" - " int my_int;\n" - " foo_pkg::bar_t my_bar;\n" - "endclass : cc\n"}, - {"class cc ;\n" - "int my_int;\n" // unable to infer user's intent, so preserve - "foo_pkg::bar_t my_bar;\n" - "endclass:cc\n", - "class cc;\n" - " int my_int;\n" // ... but still indent - " foo_pkg::bar_t my_bar;\n" - "endclass : cc\n"}, - - // case item test cases - {// small difference between flush-left and align, so align - "function f; case (x)kZZZZ :if( b )break; default :return 2;" - "endcase endfunction\n", - "function f;\n" - " case (x)\n" - " kZZZZ: if (b) break;\n" // aligned, only adds 2 spaces - " default: return 2;\n" - " endcase\n" - "endfunction\n"}, - {// small error relative to flush-left, so flush-left - "function f; case (x)kZ :if( b )break; default :return 2;" - "endcase endfunction\n", - "function f;\n" - " case (x)\n" - " kZ: if (b) break;\n" // flush-left - " default: return 2;\n" - " endcase\n" - "endfunction\n"}, - {// intentional spacing error (delta=4) induces alignment - "function f; case (x)kZ :if( b )break; default :return 2;" - "endcase endfunction\n", - "function f;\n" - " case (x)\n" - " kZ: if (b) break;\n" - " default: return 2;\n" - " endcase\n" - "endfunction\n"}, - {// induced alignment, with ignored comments - "function f; case (x)kZ :if( b )break; \n//c1\n kXX: g = f; " - "\n//c2\ndefault :return 2;" - "endcase endfunction\n", - "function f;\n" - " case (x)\n" - " kZ: if (b) break;\n" - " //c1\n" - " kXX: g = f;\n" - " //c2\n" - " default: return 2;\n" - " endcase\n" - "endfunction\n"}, - {// induced alignment, ignore multiline case item in the middle - "function f; case (x)" - "kZ :if( b )break; " - "kYY :return 2;" // excess spaces induce alignment - " kXXXXXXXXX: begin end" // multi-line, ignored - " kWWWWW: cc = 23;\n" - " kVVV: cd = 24;\n" - "endcase endfunction\n", - "function f;\n" - " case (x)\n" - " kZ: if (b) break;\n" - " kYY: return 2;\n" - " kXXXXXXXXX: begin\n" // separates above/below groups - " end\n" - " kWWWWW: cc = 23;\n" - " kVVV: cd = 24;\n" // aligned - " endcase\n" - "endfunction\n"}, - {// induced alignment, ignore multiline case item in the middle - "function f; case (x)" - "kZ :if( b )break; " - "kYY :return 2;" // excess spaces induce alignment - " kXXXXXXXXX: if(w)begin end" // multi-line, ignored - " kWWWWW: cc = 23;\n" - " kVVV: cd = 24;\n" - "endcase endfunction\n", - "function f;\n" - " case (x)\n" - " kZ: if (b) break;\n" - " kYY: return 2;\n" - " kXXXXXXXXX:\n" // TODO(fangism): allow this to merge with if() - // else indent the following two lines - " if (w) begin\n" // separates above/below groups - " end\n" - " kWWWWW: cc = 23;\n" - " kVVV: cd = 24;\n" // aligned - " endcase\n" - "endfunction\n"}, - {// induced alignment, ignore multiline case item in the middle - "task t; case (x)" - "kZ :if( b )break; " - "kYY :return 2;" // excess spaces induce alignment - " kXXXXXXXXX: fork join" // multi-line, ignored - " kWWWWW: cc = 23;\n" - " kVVV: cd = 24;\n" - "endcase endtask\n", - "task t;\n" - " case (x)\n" - " kZ: if (b) break;\n" - " kYY: return 2;\n" - " kXXXXXXXXX:\n" // TODO(fangism): allow this to merge with fork - // else indent the following two lines - " fork\n" // separates above/below groups - " join\n" - " kWWWWW: cc = 23;\n" - " kVVV: cd = 24;\n" // aligned - " endcase\n" - "endtask\n"}, - {// case-inside: small difference between flush-left and align, so align - "function f; case (x)inside [0:3] :yy=zzz; [4:11] :yy=zz;" - "endcase endfunction\n", - "function f;\n" - " case (x) inside\n" - " [0 : 3]: yy = zzz;\n" // aligned, only adds 1 spaces - " [4 : 11]: yy = zz;\n" - " endcase\n" - "endfunction\n"}, - {// case-inside: align with comments - "function f; case (x)inside \n//c1\n[0:3] :yy=zzz;\n//c2\n" - " [4:11] :yy=zz;\n//c3\n" - "endcase endfunction\n", - "function f;\n" - " case (x) inside\n" - " //c1\n" - " [0 : 3]: yy = zzz;\n" // aligned, only adds 1 spaces - " //c2\n" - " [4 : 11]: yy = zz;\n" - " //c3\n" - " endcase\n" - "endfunction\n"}, - {// case-inside: flush left - "function f; case (x)inside [0:3] :yy=zzz; [4:999999] :yy=zz;" - "endcase endfunction\n", - "function f;\n" - " case (x) inside\n" - " [0 : 3]: yy = zzz;\n" // flush-left - " [4 : 999999]: yy = zz;\n" - " endcase\n" - "endfunction\n"}, - {// case-inside: induce alignment - "function f; case (x)inside [0:3 ] :yy=zzz; [4:999999] :yy=zz;" - "endcase endfunction\n", - "function f;\n" - " case (x) inside\n" - " [0 : 3]: yy = zzz;\n" // aligned - " [4 : 999999]: yy = zz;\n" - " endcase\n" - "endfunction\n"}, - {// case-generate: align would add few spaces, so align - "module mc ; case (x)kZ : gg h(); kXYY :j kk();" - "endcase endmodule\n", - "module mc;\n" - " case (x)\n" - " kZ: gg h ();\n" // align - " kXYY: j kk ();\n" - " endcase\n" - "endmodule\n"}, - {// case-generate + comment: align would add few spaces, so align - "module mc ; case (x)kZ : gg h(); \n//c1\n kXYY :j kk();" - "endcase endmodule\n", - "module mc;\n" - " case (x)\n" - " kZ: gg h ();\n" // align - " //c1\n" - " kXYY: j kk ();\n" - " endcase\n" - "endmodule\n"}, - {// case-generate: align would add too many space, so flush-left - "module mc ; case (x)kZ : gg h(); kXYYYY :j kk();" - "endcase endmodule\n", - "module mc;\n" - " case (x)\n" - " kZ: gg h ();\n" // flush-left - " kXYYYY: j kk ();\n" - " endcase\n" - "endmodule\n"}, - {// case-generate: inject spaces to induce alignment - "module mc ; case (x)kZ : gg h(); kXYYYY : j kk();" - "endcase endmodule\n", - "module mc;\n" - " case (x)\n" - " kZ: gg h ();\n" // align - " kXYYYY: j kk ();\n" - " endcase\n" - "endmodule\n"}, - {// randcase: align (small difference from flush-left) - "task trc ;randcase 10: x = 1; 1: x = 3; endcase endtask", - "task trc;\n" - " randcase\n" - " 10: x = 1;\n" - " 1: x = 3;\n" // aligned - " endcase\n" - "endtask\n"}, - {// randcase: inferred flush-left - "task trc ;randcase 10000: x = 1; 1: x = 3; endcase endtask", - "task trc;\n" - " randcase\n" - " 10000: x = 1;\n" - " 1: x = 3;\n" - " endcase\n" - "endtask\n"}, - {// randcase: induce alignment - "task trc ;randcase 10000: x = 1 ; 1: x = 3; endcase endtask", - "task trc;\n" - " randcase\n" - " 10000: x = 1;\n" - " 1: x = 3;\n" // aligned - " endcase\n" - "endtask\n"}, - - // distributions - {"class foo;\n" - "constraint c { " - "timer_enable dist {\n" - "8'hfe := 9 , \n" - "12'hfff := 1 }; " - "} endclass\n", - "class foo;\n" - " constraint c {\n" - " timer_enable dist {\n" - " 8'hfe := 9,\n" // only two spaces needed to align - " 12'hfff := 1\n" // so align - " };\n" - " }\n" - "endclass\n"}, - {"class foo;\n" - "constraint c { " - "timer_enable dist {\n" - "[ 8'h0 : 8'hfe ] :/ 9 , \n" - "8'hff :/ 1 }; " // takes many spaces to align this, so... - "} endclass\n", - "class foo;\n" - " constraint c {\n" - " timer_enable dist {\n" - " [8'h0 : 8'hfe] :/ 9,\n" - " 8'hff :/ 1\n" // flush-left - " };\n" - " }\n" - "endclass\n"}, - {"class foo;\n" - "constraint c { " - "timer_enable dist {\n" - "[ 8'h0 : 8'hfe ] :/ 9 , \n" - "8'hff :/ 1 }; " // inject excess spaces to trigger alignment - "} endclass\n", - "class foo;\n" - " constraint c {\n" - " timer_enable dist {\n" - " [8'h0 : 8'hfe] :/ 9,\n" - " 8'hff :/ 1\n" // aligned - " };\n" - " }\n" - "endclass\n"}, - {"class foo;\n" - "constraint c { " - "timer_enable dist {\n" - "//comment1\n" - "[ 8'h0 : 8'hfe ] :/ 9 , \n" - "//comment2\n" - "8'hff :/ 1 \n" - "//comment3\n" - "}; " // inject excess spaces to trigger alignment - "} endclass\n", - "class foo;\n" - " constraint c {\n" - " timer_enable dist {\n" - " //comment1\n" - " [8'h0 : 8'hfe] :/ 9,\n" - " //comment2\n" // align across comment - " 8'hff :/ 1\n" // aligned - " //comment3\n" - " };\n" - " }\n" - "endclass\n"}, - {"module foo ();\n" - " always @(posedge bar) begin\n" - " if (1==1) begin\n" - " ham();\n" - " end else if (2==2) begin\n" - " jam();\n" - " end else begin\n" - " spam();\n" - " end\n" - " end\n" - "endmodule\n", - "module foo ();\n" - " always @(posedge bar) begin\n" - " if (1 == 1) begin\n" - " ham();\n" - " end else if (2 == 2) begin\n" - " jam();\n" - " end else begin\n" - " spam();\n" - " end\n" - " end\n" - "endmodule\n"}, - }; - // Use a fixed style. - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - // Override some settings to test auto-inferred alignment. - style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kInferUserIntent); - - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} // NOLINT(readability/fn_size) - -static constexpr FormatterTestCase kFormatterWideTestCases[] = { - // specify blocks - {"module specify_tests ;\n" - "specify\n" // empty list - "endspecify\n" - "endmodule", - "module specify_tests;\n" - " specify\n" - " endspecify\n" - "endmodule\n"}, - {"module specify_tests ;\n" - "specify\n" - "$recrem (posedge R, posedge C,\n" - "t1, t2);\n" - "endspecify\n" - "endmodule", - "module specify_tests;\n" - " specify\n" - " $recrem(posedge R, posedge C, t1, t2);\n" - " endspecify\n" - "endmodule\n"}, - {"module specify_tests ;\n" - "specify\n" - "// TODO: add this\n" - "endspecify \n" - "endmodule", - "module specify_tests;\n" - " specify\n" - " // TODO: add this\n" - " endspecify\n" - "endmodule\n"}, - {"module specify_tests ;\n" - "specify \n" - " //c1\n" - "$setup ( posedge A, posedge B,\n" - "t1);//c2\n" - " //c3\n" - "$hold ( posedge B , posedge A,t2); //c4\n" - "\t//c5\n" - "endspecify\n" - "endmodule", - "module specify_tests;\n" - " specify\n" - " //c1\n" - " $setup(posedge A, posedge B, t1); //c2\n" - " //c3\n" - " $hold(posedge B, posedge A, t2); //c4\n" - " //c5\n" - " endspecify\n" - "endmodule\n"}, - {"module specify_tests ;\n" - "specify \n" - "$setup ( posedge A, posedge B,\n" - "t1);\n" - "$hold ( posedge B , posedge A,t2);\n" - "endspecify\n" - "endmodule", - "module specify_tests;\n" - " specify\n" - " $setup(posedge A, posedge B, t1);\n" - " $hold(posedge B, posedge A, t2);\n" - " endspecify\n" - "endmodule\n"}, - {"module specify_tests ;\n" - "specify \n" - " `ifdef CCC\n" - "$setup ( posedge A, posedge B,\n" - "t1);\n" - " `else\n" - "$hold ( posedge B , posedge A,t2); \n" - "\t`endif\n" - "endspecify\n" - "endmodule", - "module specify_tests;\n" - " specify\n" - "`ifdef CCC\n" - " $setup(posedge A, posedge B, t1);\n" - "`else\n" - " $hold(posedge B, posedge A, t2);\n" - "`endif\n" - " endspecify\n" - "endmodule\n"}, -}; - -// These tests just need a larger column limit to fit on one line. -TEST(FormatterEndToEndTest, VerilogFormatWideTest) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 60; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - for (const auto &test_case : kFormatterWideTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, DisableModulePortDeclarations) { - static constexpr FormatterTestCase kTestCases[] = { - {"", ""}, - {"\n", "\n"}, - {"\n\n", "\n\n"}, - {"module m ;\t\n" - " endmodule\n", - "module m;\n" - "endmodule\n"}, - {"module m( ) ;\n" - " endmodule\n", - "module m ();\n" // empty ports formatted compactly - "endmodule\n"}, - {// for a single port, the alignment handler doesn't even consider it a - // group so it falls back to standard flush-left behavior. - "module m ( input clk )\t;\n" - " endmodule\n", - "module m (\n" - " input clk\n" - ");\n" - "endmodule\n"}, - {// example with two ports - "module m (\n" - "input clk,\n" - "output bar\n" - ")\t;\n" - " endmodule\n", - "module m (\n" - " input clk,\n" // indented, but internal pre-existing spacing - // preserved - " output bar\n" - ");\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.port_declarations_alignment = verible::AlignmentPolicy::kPreserve; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, DisableModuleInstantiations) { - static constexpr FormatterTestCase kTestCases[] = { - {"", ""}, - {"\n", "\n"}, - {"\n\n", "\n\n"}, - {"module m ;\t\n" - " endmodule\n", - "module m;\n" - "endmodule\n"}, - {"module m ;\t\n" - "foo bar();" - " endmodule\n", - "module m;\n" - " foo bar ();\n" // indentation still takes effect - "endmodule\n"}, - {"module m ;\t\n" - "logic xyz;" - "wire\tabc;" - " endmodule\n", - "module m;\n" - " logic xyz;\n" // indentation still takes effect - " wire abc;\n" // aligned too - "endmodule\n"}, - {" function f ;\t\n" - " endfunction\n", - "function f;\n" - "endfunction\n"}, - {" function f ;\t" - "foo bar,baz; " - " endfunction\n", - "function f;\n" - " foo bar, baz;\n" - "endfunction\n"}, - {" task t ;\t" - "foo bar,baz; " - " endtask\n", - "task t;\n" - " foo bar, baz;\n" - "endtask\n"}, - {"module m ;\t\n" - "foo bar( .baz(baz) );" - " endmodule\n", - "module m;\n" - " foo bar (.baz(baz));\n" // indentation still takes effect - "endmodule\n"}, - {"module m ;\t\n" - "foo bar(\n" - " .baz (baz ),\n" // example of user-manual alignment - " .blaaa(blaaa)\n" - ");" - " endmodule\n", - "module m;\n" - " foo bar (\n" // indentation still takes effect - " .baz (baz ),\n" // named port connections preserved - " .blaaa(blaaa)\n" // named port connections preserved - " );\n" // this indentation is fixed - "endmodule\n"}, - {"module m ;\t\n" - "foo #( .baz(baz) ) bar();" // named parameters - " endmodule\n", - "module m;\n" - " foo #(.baz(baz)) bar ();\n" // indentation still takes effect - "endmodule\n"}, - {"module m ;\t\n" - "foo #(\n" - " .baz (baz ),\n" // example of user-manual alignment - " .blaaa(blaaa)\n" - ") bar( );" - " endmodule\n", - "module m;\n" - " foo #(\n" // indentation still takes effect - " .baz (baz ),\n" // named parameter arguments preserved - " .blaaa(blaaa)\n" // named parameter arguments preserved - " ) bar ();\n" // this indentation is fixed - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - // Testing preservation of spaces - style.named_parameter_alignment = AlignmentPolicy::kPreserve; - style.named_port_alignment = AlignmentPolicy::kPreserve; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, DisableTryWrapLongLines) { - static constexpr FormatterTestCase kTestCases[] = { - {"", ""}, - {"\n", "\n"}, - {"\n\n", "\n\n"}, - {"module m ;\t\n" - " endmodule\n", - "module m;\n" - "endmodule\n"}, - {"module m( ) ;\n" - " endmodule\n", - "module m ();\n" - "endmodule\n"}, - {"module m( ) ;\n" - "initial assign a = b;\n" - " endmodule\n", - "module m ();\n" - " initial assign a = b;\n" - "endmodule\n"}, - {"module m( ) ;\n" - "initial assign a = {never +gonna +give +you +up,\n" - "never + gonna +Let +you +down};\n" - " endmodule\n", - "module m ();\n" - " initial\n" - " assign a = {\n" - " never + gonna + give + you + up,\n" - " never + gonna + Let + you + down\n" - " };\n" - "endmodule\n"}, - {"module m( ) ;\n" - "initial assign a = {never +gonna +give +you +up+\n" // over 40 columns, - // give up - "never + gonna +Let +you +down};\n" - " endmodule\n", - "module m ();\n" - " initial\n" - " assign a = {\n" - " never +gonna +give +you +up+\n" // indented properly, but - "never + gonna +Let +you +down\n" // preserved original - " };\n" - "endmodule\n"}, - {// The if-header is a single leaf partition, and does not fit, - // so its original spacing should be preserved. - // We deliberately insert weird spacing to show that it is preserved. - "function f;\n" - "if ((xxx.aaaa >= bbbbbbbbbbbbbbb) &&\n" - " ((ccc.ddd + eee.ffffff * g) <=\n" - " (hhhhhhhhhhhhhhh+iiiiiiiiiiiiiiiiiiii))) begin\n" - "end\n" - "endfunction\n", - "function f;\n" - " if ((xxx.aaaa >= bbbbbbbbbbbbbbb) &&\n" // indentation fixed - " ((ccc.ddd + eee.ffffff * g) <=\n" - " (hhhhhhhhhhhhhhh+iiiiiiiiiiiiiiiiiiii))) begin\n" - " end\n" // indentation fixed - "endfunction\n"}, - - // Make sure indentation still works with wrapping disabled, - // and leaf partitions fit on one line. - {"function void f();\n" - "for (int i = N; i > 0; i--) begin\n" - "end\n" - "endfunction\n", - "function void f();\n" - " for (int i = N; i > 0; i--) begin\n" - " end\n" - "endfunction\n"}, - {"function void f();" - "if(i > 0 ) begin end " - "endfunction", - "function void f();\n" - " if (i > 0) begin\n" - " end\n" - "endfunction\n"}, - {"function void f();" // newlines absent from input - "for (int i=N; i>0; i--) begin end " - "endfunction", - "function void f();\n" - " for (int i = N; i > 0; i--) begin\n" // spacing corrected - " end\n" - "endfunction\n"}, - {"module m( );\n" - " always_ff @ ( posedge ( clk ) ) begin\n" - "out <= rst_clk ? 0 : in ;\n" - "end\n" - "endmodule : simple\n", - "module m ();\n" - " always_ff @(posedge (clk)) begin\n" - " out <= rst_clk ? 0 : in;\n" - " end\n" - "endmodule : simple\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.try_wrap_long_lines = false; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, ModulePortDeclarationsIndentNotWrap) { - static constexpr FormatterTestCase kTestCases[] = { - {"", ""}, - {"\n", "\n"}, - {"\n\n", "\n\n"}, - {"module m ;\t\n" - " endmodule\n", - "module m;\n" - "endmodule\n"}, - {"module m( ) ;\n" - " endmodule\n", - "module m ();\n" // empty ports formatted compactly - "endmodule\n"}, - {// single port example - "module m ( input clk )\t;\n" - " endmodule\n", - "module m (\n" - " input clk\n" // 2 spaces - ");\n" - "endmodule\n"}, - {// example with two ports - "module m (\n" - "input clk,\n" - "output bar\n" - ")\t;\n" - " endmodule\n", - "module m (\n" - " input clk,\n" // indented 2 spaces, and aligned - " output bar\n" - ");\n" - "endmodule\n"}, - {// interface example - "interface handshake (\n" - "wire req,\n" - "wire ack\n" - ")\t;\n" - " endinterface\n", - "interface handshake (\n" - " wire req,\n" // indented 2 spaces - " wire ack\n" - ");\n" - "endinterface\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - // Indent 2 spaces instead of wrapping 4 spaces. - style.port_declarations_indentation = IndentationStyle::kIndent; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, NamedPortConnectionsIndentNotWrap) { - static constexpr FormatterTestCase kTestCases[] = { - {"", ""}, - {"\n", "\n"}, - {"\n\n", "\n\n"}, - {"module m ;\t\n" - " endmodule\n", - "module m;\n" - "endmodule\n"}, - {"module m( ) ;\n" - " endmodule\n", - "module m ();\n" // empty ports formatted compactly - "endmodule\n"}, - {// single port example - "module m ;\n" - "foo bar( .clk( clk ) )\t;\n" - " endmodule\n", - "module m;\n" - " foo bar (.clk(clk));\n" - "endmodule\n"}, - {// two port example - "module m ;\n" - "foo bar( .clk2( clk ),.data (data) )\t;\n" - " endmodule\n", - "module m;\n" - " foo bar (\n" - " .clk2(clk),\n" // indent only +2 spaces - " .data(data)\n" - " );\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - // Indent 2 spaces instead of wrapping 4 spaces. - style.named_port_indentation = IndentationStyle::kIndent; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, WrapEndElseStatements) { - static constexpr FormatterTestCase kTestCases[] = { - {"module foo ();\n" - " always @(posedge bar) begin\n" - " if (1==1) begin\n" - " ham();\n" - " end else if (2==2) begin\n" - " jam();\n" - " end else begin\n" - " spam();\n" - " end\n" - " end\n" - "endmodule\n", - "module foo ();\n" - " always @(posedge bar) begin\n" - " if (1 == 1) begin\n" - " ham();\n" - " end\n" - " else if (2 == 2) begin\n" - " jam();\n" - " end\n" - " else begin\n" - " spam();\n" - " end\n" - " end\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.wrap_end_else_clauses = true; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, FormalParametersIndentNotWrap) { - static constexpr FormatterTestCase kTestCases[] = { - {"", ""}, - {"\n", "\n"}, - {"\n\n", "\n\n"}, - {"module m ;\t\n" - " endmodule\n", - "module m;\n" - "endmodule\n"}, - {"module m #( ) ;\n" // empty parameters - " endmodule\n", - "module m #();\n" - "endmodule\n"}, - {// single parameter example - "module m #( int W = 2)\t;\n" - " endmodule\n", - "module m #(\n" - " int W = 2\n" // indented 2 spaces - ");\n" - "endmodule\n"}, - {// module with two parameters - "module m #(\n" - "int W = 2,\n" - "int L = 4\n" - ")\t;\n" - " endmodule\n", - "module m #(\n" - " int W = 2,\n" // indented 2 spaces - " int L = 4\n" - ");\n" - "endmodule\n"}, - {// interface with two parameters - "interface m #(\n" - "int W = 2,\n" - "int L = 4\n" - ")\t;\n" - " endinterface\n", - "interface m #(\n" - " int W = 2,\n" // indented 2 spaces - " int L = 4\n" - ");\n" - "endinterface\n"}, - {// class with two parameters - "class c #(\n" - "int W = 2,\n" - "int L = 4\n" - ")\t;\n" - " endclass\n", - "class c #(\n" - " int W = 2,\n" // indented 2 spaces - " int L = 4\n" - ");\n" - "endclass\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - // Indent 2 spaces instead of wrapping 4 spaces. - style.formal_parameters_indentation = IndentationStyle::kIndent; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, NamedParametersIndentNotWrap) { - static constexpr FormatterTestCase kTestCases[] = { - {"", ""}, - {"\n", "\n"}, - {"\n\n", "\n\n"}, - {"module m ;\t\n" - " endmodule\n", - "module m;\n" - "endmodule\n"}, - {"module m #( ) ;\n" // empty parameters - " endmodule\n", - "module m #();\n" - "endmodule\n"}, - {"module m ;\t\n" - " foo #()bar();\n" - " endmodule\n", - "module m;\n" - " foo #() bar ();\n" - "endmodule\n"}, - {// one named parameter - "module m ;\n" - "foo #(.W(1)) bar();\n" - " endmodule\n", - "module m;\n" - " foo #(.W(1)) bar ();\n" - "endmodule\n"}, - {// two named parameters - "module m ;\n" - "foo #(.W(1), .L(2)) bar();\n" - " endmodule\n", - "module m;\n" - " foo #(\n" - " .W(1),\n" // indent +2 spaces only - " .L(2)\n" - " ) bar ();\n" - "endmodule\n"}, - {// class data member with two parameters - "class c ;\n" - " foo_pkg::bar_t#(\n" - ".W(2),.L(4)" - ") baz;\n" - " endclass\n", - "class c;\n" - " foo_pkg::bar_t #(\n" - " .W(2),\n" // indent +2 spaces only - " .L(4)\n" - " ) baz;\n" - "endclass\n"}, - {// typedef with two parameters - "typedef \n" - " foo_pkg::bar_t #(" - ".W(2),.L(4)" - ") baz;\n", - "typedef foo_pkg::bar_t#(\n" - " .W(2),\n" // indent +2 spaces only - " .L(4)\n" - ") baz;\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - // Indent 2 spaces instead of wrapping 4 spaces. - style.named_parameter_indentation = IndentationStyle::kIndent; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -struct SelectLinesTestCase { - std::string_view input; - LineNumberSet lines; // explicit set of lines to enable formatting - std::string_view expected; -}; - -// Tests that formatter honors selected line numbers. -TEST(FormatterEndToEndTest, SelectLines) { - const SelectLinesTestCase kTestCases[] = { - {"", {}, ""}, - {"", {{1, 2}}, ""}, - {// expect all three lines for format - " parameter int foo_line1 = 0 ;\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n", - {}, - "parameter int foo_line1 = 0;\n" - "parameter int foo_line2 = 0;\n" - "parameter int foo_line3 = 0;\n"}, - {// expect only one line to format - " parameter int foo_line1 = 0 ;\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n", - {{1, 2}}, - "parameter int foo_line1 = 0;\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n"}, - {// expect only one line to format - " parameter int foo_line1 = 0 ;\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n", - {{2, 3}}, - " parameter int foo_line1 = 0 ;\n" - "parameter int foo_line2 = 0;\n" - " parameter int foo_line3 = 0 ;\n"}, - {// expect only one line to format - " parameter int foo_line1 = 0 ;\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n", - {{3, 4}}, - " parameter int foo_line1 = 0 ;\n" - " parameter int foo_line2 = 0 ;\n" - "parameter int foo_line3 = 0;\n"}, - {// expect to format two lines - " parameter int foo_line1 = 0 ;\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n", - {{1, 3}}, - "parameter int foo_line1 = 0;\n" - "parameter int foo_line2 = 0;\n" - " parameter int foo_line3 = 0 ;\n"}, - {// expect to format two lines - " parameter int foo_line1 = 0 ;\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n", - {{2, 4}}, - " parameter int foo_line1 = 0 ;\n" - "parameter int foo_line2 = 0;\n" - "parameter int foo_line3 = 0;\n"}, - {// expect to format two lines - " parameter int foo_line1 = 0 ;\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n", - {{1, 2}, {3, 4}}, - "parameter int foo_line1 = 0;\n" - " parameter int foo_line2 = 0 ;\n" - "parameter int foo_line3 = 0;\n"}, - {// expect to format all lines - " parameter int foo_line1 = 0 ;\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n", - {{1, 4}}, - "parameter int foo_line1 = 0;\n" - "parameter int foo_line2 = 0;\n" - "parameter int foo_line3 = 0;\n"}, - {// expect to format no lines (line numbers out of bounds) - " parameter int foo_line1 = 0 ;\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n", - {{4, 6}}, - " parameter int foo_line1 = 0 ;\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n"}, - {// expect to format all lines - "// verilog_format: on\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n" - " parameter int foo_line4 = 0 ;\n", - {}, - "// verilog_format: on\n" - "parameter int foo_line2 = 0;\n" - "parameter int foo_line3 = 0;\n" - "parameter int foo_line4 = 0;\n"}, - {// expect to format no lines - "// verilog_format: off\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n" - " parameter int foo_line4 = 0 ;\n", - {}, - "// verilog_format: off\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n" - " parameter int foo_line4 = 0 ;\n"}, - {// expect to format some lines - "// verilog_format: on\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n" - " parameter int foo_line4 = 0 ;\n", - {{3, 5}}, - "// verilog_format: on\n" - " parameter int foo_line2 = 0 ;\n" - "parameter int foo_line3 = 0;\n" // disable lines 3,4 - "parameter int foo_line4 = 0;\n"}, - {// enable all lines, but respect format-off - " parameter int foo_line1 = 0 ;\n" - " parameter int foo_line2 = 0 ;\n" - "// verilog_format: off\n" - " parameter int foo_line4 = 0 ;\n", - {{1, 5}}, - "parameter int foo_line1 = 0;\n" - "parameter int foo_line2 = 0;\n" - "// verilog_format: off\n" - " parameter int foo_line4 = 0 ;\n"}, - {// enable all lines, but respect format-off - " parameter int foo_line1 = 0 ;\n" - "// verilog_format: off\n" - " parameter int foo_line3 = 0 ;\n" - "// verilog_format: on\n" - " parameter int foo_line5 = 0 ;\n", - {{1, 6}}, - "parameter int foo_line1 = 0;\n" - "// verilog_format: off\n" - " parameter int foo_line3 = 0 ;\n" - "// verilog_format: on\n" - "parameter int foo_line5 = 0;\n"}, - {// enable all lines, but respect format-off - "// verilog_format: off\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n" - "// verilog_format: on\n" - " parameter int foo_line5 = 0 ;\n", - {{1, 6}}, - "// verilog_format: off\n" - " parameter int foo_line2 = 0 ;\n" - " parameter int foo_line3 = 0 ;\n" - "// verilog_format: on\n" - "parameter int foo_line5 = 0;\n"}, - {"module m;\n" - " if (foo) begin:l1\n" - " if (foo) begin:l2\n" - " always_comb\n" // normally this line and next would fit together - " d<=#1ps x_lat\t;\n" // only format this line, 5 - " end : l2\n" - " end : l1\n" - "endmodule\n", - {{5, 6}}, - "module m;\n" - " if (foo) begin:l1\n" - " if (foo) begin:l2\n" - " always_comb\n" // incremental mode prevents joining next line - " d <= #1ps x_lat;\n" // only this line changed - " end : l2\n" - " end : l1\n" - "endmodule\n"}, - - // Next three test cases: one whole-file, two incremental - {"module m(\n" - " input wire f,\n" - " input foo::bar ggg\n" - ");\n" - "endmodule:m\n", - {}, // format all lines - "module m (\n" - " input wire f,\n" - " input foo::bar ggg\n" - ");\n" - "endmodule : m\n"}, - {"module m(\n" - " input wire f,\n" - " input foo::bar ggg\n" // "new line", formatted incrementally - ");\n" - "endmodule:m\n", - {{3, 4}}, // format incrementally - "module m(\n" - " input wire f,\n" - " input foo::bar ggg\n" // "new line" remains untouched - ");\n" - "endmodule:m\n"}, - {"module m(\n" - " input wire f,\n" // "new line", formatted incrementally - " input foo::bar ggg\n" - ");\n" - "endmodule:m\n", - {{2, 3}}, // format incrementally - "module m(\n" - " input wire f,\n" // "new line" indented, but other spaces kept - " input foo::bar ggg\n" - ");\n" - "endmodule:m\n"}, - }; - // Use a fixed style. - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = FormatVerilog(test_case.input, "<filename>", style, - stream, test_case.lines); - EXPECT_OK(status) << status.message() << '\n' - << "Lines: " << test_case.lines; - EXPECT_EQ(stream.str(), test_case.expected) - << "code:\n" - << test_case.input << "\nlines: " << test_case.lines; - } -} - -// These tests verify the mode where horizontal spacing is discarded while -// vertical spacing is preserved. -TEST(FormatterEndToEndTest, PreserveVSpacesOnly) { - static constexpr FormatterTestCase kTestCases[] = { - // {input, expected}, - // No tokens cases: still preserve vertical spacing, but not horizontal - {"", ""}, - {" ", ""}, - {"\n", "\n"}, - {"\n\n", "\n\n"}, - {" \n", "\n"}, - {"\n ", "\n"}, - {" \n ", "\n"}, - {" \n \t\t\n\t ", "\n\n"}, - - // The remaining cases have at least one non-whitespace token. - - // single comment - {"//\n", "//\n"}, - {"// \n", "// \n"}, // trailing spaces inside comment untouched - {"\n//\n", "\n//\n"}, - {"\n\n//\n", "\n\n//\n"}, - {"\n//\n\n", "\n//\n\n"}, - {" //\n", "//\n"}, // spaces before comment discarded - {" \n //\n", "\n//\n"}, - {" \n //\n \n ", "\n//\n\n"}, // trailing spaces discarded - - // multi-comment - {"//\n//\n", "//\n//\n"}, - {"\n//\n\n//\n\n", "\n//\n\n//\n\n"}, - {"\n//\n\n//\n", "\n//\n\n//\n"}, // blank line between comments - - // Module cases with token partition boundary (before 'endmodule'). - {"module foo;endmodule\n", "module foo;\nendmodule\n"}, - {"module foo;\nendmodule\n", "module foo;\nendmodule\n"}, - {"module foo;\n\nendmodule\n", "module foo;\n\nendmodule\n"}, - {"\nmodule foo;endmodule\n", "\nmodule foo;\nendmodule\n"}, - {"\nmodule foo ; endmodule\n", "\nmodule foo;\nendmodule\n"}, - {"\nmodule\nfoo\n;endmodule\n", "\nmodule foo;\nendmodule\n"}, - {"\nmodule foo;endmodule\n\n\n", "\nmodule foo;\nendmodule\n\n\n"}, - {"\n\n\nmodule foo;endmodule\n", "\n\n\nmodule foo;\nendmodule\n"}, - {"\nmodule\nfoo\n;\n\n\nendmodule\n", "\nmodule foo;\n\n\nendmodule\n"}, - - // Module cases with one indented item, various original vertical spacing - {"module foo;wire w;endmodule\n", "module foo;\n wire w;\nendmodule\n"}, - {" module foo ;wire w ;endmodule \n ", - "module foo;\n wire w;\nendmodule\n"}, - {"\nmodule\nfoo\n;\nwire\nw\n;endmodule\n\n", - "\nmodule foo;\n wire w;\nendmodule\n\n"}, - {"\n\nmodule\nfoo\n;\n\n\nwire\nw\n;\n\nendmodule\n\n", - "\n\nmodule foo;\n\n\n wire w;\n\nendmodule\n\n"}, - - // The following cases show that some horizontal whitespace is discarded, - // while vertical spacing is preserved on partition boundaries. - {" module foo\t \t; endmodule \n", - "module foo;\nendmodule\n"}, - {"\t\n module foo\t\t; endmodule \n", - "\nmodule foo;\nendmodule\n"}, - - // Module with comments intermingled. - { - "//1\nmodule foo;//2\nwire w;//3\n//4\nendmodule\n", - "//1\nmodule foo; //2\n wire w; //3\n //4\nendmodule\n" - // TODO(fangism): whether or not //4 should be indented is - // questionable (in similar cases below too). - }, - {// now with extra blank lines - "//1\n\nmodule foo;//2\n\nwire w;//3\n\n//4\n\nendmodule\n\n", - "//1\n\nmodule foo; //2\n\n wire w; //3\n\n //4\n\nendmodule\n\n"}, - - { - // module with comments-only in some empty blocks, properly indented - " // humble module\n" - " module foo (// non-port comment\n" - "// port comment 1\n" - "// port comment 2\n" - ");// header trailing comment\n" - "// item comment 1\n" - "// item comment 2\n" - "endmodule\n", - "// humble module\n" - "module foo ( // non-port comment\n" - " // port comment 1\n" - " // port comment 2\n" - "); // header trailing comment\n" - " // item comment 1\n" - " // item comment 2\n" - "endmodule\n", - }, - - { - // module with comments around non-empty blocks - " // humble module\n" - " module foo (// non-port comment\n" - "// port comment 1\n" - "input logic f \n" - "// port comment 2\n" - ");// header trailing comment\n" - "// item comment 1\n" - "wire w ; \n" - "// item comment 2\n" - "endmodule\n", - "// humble module\n" - "module foo ( // non-port comment\n" - " // port comment 1\n" - " input logic f\n" - " // port comment 2\n" - "); // header trailing comment\n" - " // item comment 1\n" - " wire w;\n" - " // item comment 2\n" - "endmodule\n", - }, - }; - FormatStyle style; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -static constexpr FormatterTestCase kFormatterTestCasesElseStatements[] = { - {"module m;" - "task static t; if (r == t) a.b(c); else d.e(f); endtask;" - "endmodule", - "module m;\n" - " task static t;\n" - " if (r == t) a.b(c);\n" - " else d.e(f);\n" - " endtask\n" - " ;\n" // possibly unintended stray ';' - "endmodule\n"}, - {"module m;" - "task static t; if (r == t) begin a.b(c); end else begin d.e(f); end " - "endtask;" - "endmodule", - "module m;\n" - " task static t;\n" - " if (r == t) begin\n" - " a.b(c);\n" - " end else begin\n" - " d.e(f);\n" - " end\n" - " endtask\n" - " ;\n" // stray ';' - "endmodule\n"}, - {"module m;initial begin if(a==b)" - "c.d(e);else\n" - "f.g(h);end endmodule", - "module m;\n" - " initial begin\n" - " if (a == b) c.d(e);\n" - " else f.g(h);\n" - " end\n" - "endmodule\n"}, - {" module m; always_comb begin \n" - " if ( a ) b = 16'hdead ; \n" - " else if ( c ) d= 16 'hbeef ; \n" - " else if (e) f=16'hca_fe ; \n" - "end \n endmodule\n", - "module m;\n" - " always_comb begin\n" - " if (a) b = 16'hdead;\n" - " else if (c) d = 16'hbeef;\n" - " else if (e) f = 16'hca_fe;\n" - " end\n" - "endmodule\n"}, - {"module foo();\n" - "always_comb begin\n" - "value = function_name(.long_parameter(8'hA), .parameter_three(foobar));\n" - "end\n" - "endmodule : foo\n", - "module foo ();\n" - " always_comb begin\n" - " value = function_name(\n" - " .long_parameter(8'hA),\n" - " .parameter_three(foobar)\n" - " );\n" - " end\n" - "endmodule : foo\n"}, - {"module foo();\n" - "always_comb begin\n" - "value = function_name(.a(1), .b(2));\n" - "end\n" - "endmodule : foo\n", - "module foo ();\n" - " always_comb begin\n" - " value = function_name(.a(1), .b(2));\n" - " end\n" - "endmodule : foo\n"}, - {"module foo ();\n" - "always_comb begin\n" - "value = function_name(8'hA, foobar, signal_1234); end\n" - "always_comb begin\n" - "value = function_name(8'hA, foobar); end\n" - "endmodule : foo\n", - "module foo ();\n" - " always_comb begin\n" - " value = function_name(8'hA, foobar,\n" - " signal_1234);\n" - " end\n" - " always_comb begin\n" - " value = function_name(8'hA, foobar);\n" - " end\n" - "endmodule : foo\n"}, - {"module foo ();\n" - "always_comb begin\n" - "value = function_name(8'hA, foobar, signal_1234);\n" - "value = function_name(8'hA, foobar, signal_1234); end\n" - "endmodule : foo\n", - "module foo ();\n" - " always_comb begin\n" - " value = function_name(8'hA, foobar,\n" - " signal_1234);\n" - " value = function_name(8'hA, foobar,\n" - " signal_1234);\n" - " end\n" - "endmodule : foo\n"}, - {"always_comb begin\n" - "value = " - "f(long_parameter_exceeding_col_limit, foo, bar); end\n", - "always_comb begin\n" - " value = f(\n" - " long_parameter_exceeding_col_limit,\n" - " foo,\n" - " bar\n" - " );\n" - "end\n"}, - {"module foo();\n" - "always_comb begin\n" - "value = function_name(8'hA, .parameter_three(foobar));\n" - "end\n" - "endmodule : foo\n", - "module foo ();\n" - " always_comb begin\n" - " value = function_name(\n" - " 8'hA,\n" - " .parameter_three(foobar)\n" - " );\n" - " end\n" - "endmodule : foo\n"}, - {"module foo ();\n" - "always_comb begin\n" - "value = function_name(8'hA, 8'hB, 8'hC, .parameter_four(foo), " - ".par_five(bar));\n" - "end\n" - "endmodule : foo\n", - "module foo ();\n" - " always_comb begin\n" - " value = function_name(\n" - " 8'hA,\n" - " 8'hB,\n" - " 8'hC,\n" - " .parameter_four(foo),\n" - " .par_five(bar)\n" - " );\n" - " end\n" - "endmodule : foo\n"}, - {"class dv_base_mem; function void configure(); \nbegin\n" - "value = func(8'hA, foobar, signal_1234);\n" - "value = new(8'hA, foobar, signal_1234); end\n" - "endfunction : configure endclass\n", - "class dv_base_mem;\n" - " function void configure();\n" - " begin\n" - " value = func(8'hA, foobar,\n" - " signal_1234);\n" - " value = new(8'hA, foobar,\n" - " signal_1234);\n" - " end\n" - " endfunction : configure\n" - "endclass\n"}, - {"module m; initial begin\n" - " if (a||b) c = 1'b1;\n" - "d = 1'b1; if (e)\n" - "begin f = 1'b0; end else begin\n" - " g = h;\n" - " end \n" - " i = 1'b1; " - "end endmodule\n", - "module m;\n" - " initial begin\n" - " if (a || b) c = 1'b1;\n" - " d = 1'b1;\n" - " if (e) begin\n" - " f = 1'b0;\n" - " end else begin\n" - " g = h;\n" - " end\n" - " i = 1'b1;\n" - " end\n" - "endmodule\n"}, - {"module m; initial begin\n" - "if (a&&b&&c) begin\n" - " d = 1'b1;\n" - " if (e) begin\n" - " f = ff;\n" - " end else if ( g ) begin\n" - " h = hh;\n" - "end else if (i) begin\n" - " j = (kk == ll) ? mm :\n" - " gg;\n" - " end else if ( qq ) begin\n" - " if ( xx ||yy ) begin d0 = 1'b0; d1 = " - "1'b1;\n" - " end else if (oo) begin aa = bb; cc = dd;" - " if (zz) zx = xz; else ba = ab;" - " end else \n begin vv = tt ; \n" - " end end " - "end \n else if (uu)\nbegin\n\na=b;if (aa) b = c;\n" - "\nelse if \n (bb) \n\nc =d ;\n\n\n\n\n " - " else e\n\n = h;\n\n" - "end \n else \n begin if(x)y=a;else\nbegin\n" - "\n\n\na=y; if (a) b = c;\n\n\n\nelse\n\n\nd=e;end \n" - "end\n" - "end endmodule\n", - "module m;\n" - " initial begin\n" - " if (a && b && c) begin\n" - " d = 1'b1;\n" - " if (e) begin\n" - " f = ff;\n" - " end else if (g) begin\n" - " h = hh;\n" - " end else if (i) begin\n" - " j = (kk == ll) ? mm : gg;\n" - " end else if (qq) begin\n" - " if (xx || yy) begin\n" - " d0 = 1'b0;\n" - " d1 = 1'b1;\n" - " end else if (oo) begin\n" - " aa = bb;\n" - " cc = dd;\n" - " if (zz) zx = xz;\n" - " else ba = ab;\n" - " end else begin\n" - " vv = tt;\n" - " end\n" - " end\n" - " end else if (uu) begin\n\n" - " a = b;\n" - " if (aa) b = c;\n\n" - " else if (bb) c = d;\n\n\n\n\n" - " else e = h;\n\n" - " end else begin\n" - " if (x) y = a;\n" - " else begin\n\n\n\n" - " a = y;\n" - " if (a) b = c;\n\n\n\n" - " else d = e;\n" - " end\n" - " end\n" - " end\n" - "endmodule\n"}}; - -TEST(FormatterEndToEndTest, FormatElseStatements) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - for (const auto &test_case : kFormatterTestCasesElseStatements) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, ConstraintExpressions) { - static constexpr FormatterTestCase kTestCases[] = { - {"", ""}, - - // class members - {"class Foo; constraint if_c { if (zzzzzzzzzzzzzzzzzzzzz)" - "{ soft xxxxxxxxxxxxxxxxxxxxxx == yyyyyyyyyyyyyyyyyyy; } } endclass", - "class Foo;\n" - " constraint if_c {\n" - " if (zzzzzzzzzzzzzzzzzzzzz) {\n" - " soft xxxxxxxxxxxxxxxxxxxxxx == yyyyyyyyyyyyyyyyyyy;\n" - " }\n" - " }\n" - "endclass\n"}, - - // constraints with if-constraint expressions - {"constraint xx { if (a) b; }\n", "constraint xx {if (a) b;}\n"}, - - {"constraint xx { if (a) {b;} }\n", - "constraint xx {\n" - " if (a) {\n" - " b;\n" - " }\n" - "}\n"}, - - // multi item constraint - {"constraint yy { a == b;c==d;}", - "constraint yy {\n" - " a == b;\n" - " c == d;\n" - "}\n"}, - - // one-line constraints - {"constraint only_vec_instr_c {soft only_vec_instr == 0;}", - "constraint only_vec_instr_c {soft only_vec_instr == 0;}\n"}, - - {"constraint\nnum_trans_c\n\n\n{\n\n\nnum_trans inside{[800:1000]};}", - "constraint num_trans_c {num_trans inside {[800 : 1000]};}\n"}, - - // if-vs-concatenation expression - {"constraint c_operation{ if(fixed_operation_en){" - "aes_operation == fixed_operation" - ";}}", - "constraint c_operation {\n" - " if (fixed_operation_en) {\n" - " aes_operation == fixed_operation;\n" - " }\n" - "}\n"}, - - {"constraint c_operation{ if(fixed_operation_en){" - "aes_operation == fixed_operation" - "};}", - "constraint c_operation {\n" - " if (fixed_operation_en)\n" - " {aes_operation == fixed_operation};\n" - "}\n"}, - - // concatenation expression - {"constraint c_iv {if (fixed_iv_en) {aes_iv == fixed_iv};}", - "constraint c_iv {\n" - " if (fixed_iv_en)\n" - " {aes_iv == fixed_iv};\n" - "}\n"}, - - // looooong test - {"constraint xx {" - "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa==" - "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;" - "ccccccccccccccccccccccc==dddddddddddddddddddddd;}", - "constraint xx {\n" - " if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" - " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == " - "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;\n" - " ccccccccccccccccccccccc == dddddddddddddddddddddd;\n" - "}\n"}, - }; - FormatStyle style; - style.column_limit = - 100; // smaller column_limit forces expansion of constraint blocks - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.port_declarations_alignment = verible::AlignmentPolicy::kPreserve; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -static constexpr FormatterTestCase kFormatterTestCasesEnumDeclarations[] = { - // Inferring user intent: not too many spaces to be added: align. - {"typedef enum { kA=1, kAB=2, kABC=3} x;", - "typedef enum {\n" - " kA = 1,\n" - " kAB = 2,\n" - " kABC = 3\n} x;\n"}, - - // Lots of spaces would've to be be added - keep flush - {"typedef enum { kA=1, kAB=2, kABCDEFGHIJKLMN=3} x;", - "typedef enum {\n" - " kA = 1,\n" - " kAB = 2,\n" - " kABCDEFGHIJKLMN = 3\n} x;\n"}, - - // Source spaces indicate alignment wish. - {"typedef enum { kA =1, kAB=2, kABCDEFGHIJKLMN=3} x;", - "typedef enum {\n" - " kA = 1,\n" - " kAB = 2,\n" - " kABCDEFGHIJKLMN = 3\n} x;\n"}, - - // An empty line groups into several sections, to be aligned independently - {"typedef enum { kA=1, kAB=2, \n\n kABC=3} x;", - "typedef enum {\n" - " kA = 1,\n" - " kAB = 2,\n" - "\n" - " kABC = 3\n} x;\n"}, - - // Lines with comments don't interrupt alignment - {"typedef enum { kA=1,\n" - "// hello world\n" - "kAB=2, kABC=3} x;", - "typedef enum {\n" - " kA = 1,\n" - " // hello world\n" - " kAB = 2,\n" - " kABC = 3\n} x;\n"}, - - // Generally, comment locations are preserved, and full line comments - // indented to enum name level. - {"typedef enum { kA=1,// value kA\n" - "// hello world\n" - "kAB=2,// value kAB\n" - "kABC=3// value kABC\n" - "} x;", - "typedef enum {\n" - " kA = 1, // value kA\n" - " // hello world\n" - " kAB = 2, // value kAB\n" - " kABC = 3 // value kABC" - "\n} x;\n"}, - - {"typedef enum { kA=1,// value kA\n" - "kAB=2,\n" - "kABC=3// value kABC\n" - "} x;", - "typedef enum {\n" - " kA = 1, // value kA\n" - " kAB = 2,\n" - " kABC = 3 // value kABC" - "\n} x;\n"}, - - // Numeric constants are currently flushed left, but maybe todo - // align right in the future ? - {"typedef enum { kA=1, kAB=10, kABC=100} x;", - "typedef enum {\n" - " kA = 1,\n" - " kAB = 10,\n" - " kABC = 100\n} x;\n"}, -}; - -TEST(FormatterEndToEndTest, FormatAlignEnumDeclarations) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.enum_assignment_statement_alignment = AlignmentPolicy::kInferUserIntent; - for (const auto &test_case : kFormatterTestCasesEnumDeclarations) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, DiagnosticShowFullTree) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - for (const auto &test_case : kFormatterTestCases) { - std::ostringstream stream, debug_stream; - ExecutionControl control; - control.stream = &debug_stream; - control.show_token_partition_tree = true; - const auto status = FormatVerilog(test_case.input, "<filename>", style, - stream, kEnableAllLines, control); - EXPECT_EQ(status.code(), StatusCode::kCancelled); - EXPECT_TRUE( - absl::StartsWith(debug_stream.str(), "Full token partition tree")); - } -} - -TEST(FormatterEndToEndTest, DiagnosticLargestPartitions) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - for (const auto &test_case : kFormatterTestCases) { - std::ostringstream stream, debug_stream; - ExecutionControl control; - control.stream = &debug_stream; - control.show_largest_token_partitions = 2; - const auto status = FormatVerilog(test_case.input, "<filename>", style, - stream, kEnableAllLines, control); - EXPECT_EQ(status.code(), StatusCode::kCancelled); - EXPECT_TRUE(absl::StartsWith(debug_stream.str(), "Showing the ")) - << "got: " << debug_stream.str(); - } -} - -TEST(FormatterEndToEndTest, DiagnosticEquallyOptimalWrappings) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - for (const auto &test_case : kFormatterTestCases) { - std::ostringstream stream, debug_stream; - ExecutionControl control; - control.stream = &debug_stream; - control.show_equally_optimal_wrappings = true; - const auto status = FormatVerilog(test_case.input, "<filename>", style, - stream, kEnableAllLines, control); - EXPECT_OK(status) << status.message(); - if (!debug_stream.str().empty()) { - EXPECT_TRUE(absl::StartsWith(debug_stream.str(), "Showing the ")) - << "got: " << debug_stream.str(); - // Cannot guarantee among unit tests that there will be >1 solution. - } - } -} - -// Test that hitting search space limit results in correct error status. -TEST(FormatterEndToEndTest, UnfinishedLineWrapSearching) { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - - const std::string_view code("parameter int x = 1+1;\n"); - - std::ostringstream stream, debug_stream; - ExecutionControl control; - control.max_search_states = 2; // Cause search to abort early. - control.stream = &debug_stream; - const auto status = FormatVerilog(code, "<filename>", style, stream, - kEnableAllLines, control); - EXPECT_EQ(status.code(), StatusCode::kResourceExhausted); - EXPECT_TRUE(absl::StartsWith(status.message(), "***")); -} - -static constexpr FormatterTestCase kOnelineFormatBaselineTestCases[] = { - // Reference - following test cases should not be affected by the switch - {// Minimal useful case - "covergroup c @ (posedge clk); coverpoint a; endgroup\n", - "covergroup c @(posedge clk);\n" - " coverpoint a;\n" - "endgroup\n"}, - {// Multiple coverpoints - "covergroup foo @(posedge clk); coverpoint a; coverpoint b; " - "coverpoint c; coverpoint d; endgroup\n", - "covergroup foo @(posedge clk);\n" - " coverpoint a;\n" - " coverpoint b;\n" - " coverpoint c;\n" - " coverpoint d;\n" - "endgroup\n"}, - {// Multiple bins - "covergroup memory @ (posedge ce); address :coverpoint addr {" - "bins low={LOW}; bins high={HIGH};} endgroup\n", - "covergroup memory @(posedge ce);\n" - " address: coverpoint addr {\n" - " bins low = {LOW};\n" - " bins high = {HIGH};\n" - " }\n" - "endgroup\n"}, - {// Multiple bins with multiple elements - "covergroup memory @ (posedge ce); address :coverpoint addr {" - "bins low={0,127}; bins high={128,255};} endgroup\n", - "covergroup memory @(posedge ce);\n" - " address: coverpoint addr {\n" - " bins low = {0, 127};\n" - " bins high = {128, 255};\n" - " }\n" - "endgroup\n"}, -}; - -// Tests that constructs that could be formatted as one-liners are formatted -// correctly. This is the baseline test with default style, test cases should -// not be affected by the setting. -TEST(FormatterEndToEndTest, OnelineFormatBaselineTest) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.expand_coverpoints = false; - for (const auto &test_case : kOnelineFormatBaselineTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } - // Test again with the switch, should not affect formatting - style.expand_coverpoints = true; - for (const auto &test_case : kOnelineFormatBaselineTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Following two test sets are affected by the expand_coverponits switch -// They should contain corresponding test cases -static constexpr FormatterTestCase kOnelineFormatReferenceTestCases[] = { - {// Coverpoint that could fit on one line - "covergroup memory @ (posedge ce); a :coverpoint d {" - "bins l={0};} endgroup\n", - "covergroup memory @(posedge ce);\n" - " a: coverpoint d {bins l = {0};}\n" - "endgroup\n"}, - {// Fit with a reference - "covergroup memory @ (posedge ce); a :coverpoint d {" - "bins l={LOW};} endgroup\n", - "covergroup memory @(posedge ce);\n" - " a: coverpoint d {bins l = {LOW};}\n" - "endgroup\n"}, - {// Fit with multiple elements - "covergroup memory @ (posedge ce); a :coverpoint d {" - "bins l={0,8};} endgroup\n", - "covergroup memory @(posedge ce);\n" - " a: coverpoint d {bins l = {0, 8};}\n" - "endgroup\n"}, -}; - -static constexpr FormatterTestCase kOnelineFormatExpandTestCases[] = { - {// Coverpoint that could fit on one line - "covergroup memory @ (posedge ce); a :coverpoint d {" - "bins l={0};} endgroup\n", - "covergroup memory @(posedge ce);\n" - " a: coverpoint d {\n" - " bins l = {0};\n" - " }\n" - "endgroup\n"}, - {// Fit with a reference - "covergroup memory @ (posedge ce); a :coverpoint d {" - "bins l={LOW};} endgroup\n", - "covergroup memory @(posedge ce);\n" - " a: coverpoint d {\n" - " bins l = {LOW};\n" - " }\n" - "endgroup\n"}, - {// Fit with multiple elements - "covergroup memory @ (posedge ce); a :coverpoint d {" - "bins l={0,8};} endgroup\n", - "covergroup memory @(posedge ce);\n" - " a: coverpoint d {\n" - " bins l = {0, 8};\n" - " }\n" - "endgroup\n"}, -}; - -TEST(FormatterEndToEndTest, OnelineFormatReferenceTest) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.expand_coverpoints = false; - - for (const auto &test_case : kOnelineFormatReferenceTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Tests that constructs that could be formatted as one-liners are expanded -// correctly. This is the baseline test with default style -TEST(FormatterEndToEndTest, OnelineFormatExpandTest) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.expand_coverpoints = true; - - for (const auto &test_case : kOnelineFormatExpandTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -struct DimensionsAlignmentTestCase { - std::string_view input; - std::string_view expected[4]; -}; - -static constexpr DimensionsAlignmentTestCase - kPortDeclarationDimensionsAlignmentTestCases[] = { - {"import \"DPI-C\" context function void func(\n" - "input bit foo,\n" - "input bit [2] foobar,\n" - "input bit [24:16] bar,\n" - "input bit [2:0][31:0] baz,\n" - "input bit [4][24:0][16:0] foobarbaz[],\n" - "input bit [FOOBAZ][31:24] qux[16],\n" - "input bit [16] quux[8:2][16][32],\n" - "output bit [2:0][2:0][2:0] quuz[8][16:12]\n" - ");\n", - { - "import \"DPI-C\" context function void func(\n" - " input bit foo,\n" - " input bit [ 2] foobar,\n" - " input bit [ 24:16] bar,\n" - " input bit [ 2:0][ 31:0] baz,\n" - " input bit [ 4][ 24:0][16:0] foobarbaz[ ],\n" - " input bit [FOOBAZ][31:24] qux [ 16],\n" - " input bit [ 16] quux [8:2][ 16][32],\n" - " output bit [ 2:0][ 2:0][ 2:0] quuz [ 8][16:12]\n" - ");\n", - "import \"DPI-C\" context function void func(\n" - " input bit foo,\n" - " input bit [ 2] foobar,\n" - " input bit [ 24:16] bar,\n" - " input bit [ 2:0][ 31:0] baz,\n" - " input bit [ 4][ 24:0][16:0] foobarbaz [ ],\n" - " input bit [FOOBAZ][31:24] qux [ 16],\n" - " input bit [ 16] quux [8:2][16][ 32],\n" - " output bit [ 2:0][ 2:0][ 2:0] quuz [ 8][16:12]\n" - ");\n", - "import \"DPI-C\" context function void func(\n" - " input bit foo,\n" - " input bit [ 2] foobar,\n" - " input bit [24:16] bar,\n" - " input bit [ 2:0][ 31:0] baz,\n" - " input bit [ 4][ 24:0][ 16:0] foobarbaz[ ],\n" - " input bit [FOOBAZ][31:24] qux [ 16],\n" - " input bit [ 16] quux [8:2][ 16][32],\n" - " output bit [2:0][ 2:0][ 2:0] quuz [ 8][16:12]\n" - ");\n", - "import \"DPI-C\" context function void func(\n" - " input bit foo,\n" - " input bit [ 2] foobar,\n" - " input bit [24:16] bar,\n" - " input bit [ 2:0][ 31:0] baz,\n" - " input bit [ 4][ 24:0][ 16:0] foobarbaz [ ],\n" - " input bit [FOOBAZ][31:24] qux [ 16],\n" - " input bit [ 16] quux [8:2][16][ 32],\n" - " output bit [2:0][ 2:0][ 2:0] quuz [ 8][16:12]\n" - ");\n", - }}, - {"module m(\n" - "output bit [2:0][2:0][2:0] quuz[8][16:12],\n" - "input bit [16] quux[8:2][16][32],\n" - "input bit [FOOBAZ][31:24] qux[16],\n" - "input bit [4][24:0][16:0] foobaz[],\n" - "input bit [2:0][31:0] baz,\n" - "input bit [24:16] bar,\n" - "input bit [2] foobar,\n" - "input bit foo\n" - "); endmodule:m\n", - { - "module m (\n" - " output bit [ 2:0][ 2:0][ 2:0] quuz [ 8][16:12],\n" - " input bit [ 16] quux [8:2][ 16][32],\n" - " input bit [FOOBAZ][31:24] qux [ 16],\n" - " input bit [ 4][ 24:0][16:0] foobaz[ ],\n" - " input bit [ 2:0][ 31:0] baz,\n" - " input bit [ 24:16] bar,\n" - " input bit [ 2] foobar,\n" - " input bit foo\n" - ");\n" - "endmodule : m\n", - "module m (\n" - " output bit [ 2:0][ 2:0][ 2:0] quuz [ 8][16:12],\n" - " input bit [ 16] quux [8:2][16][ 32],\n" - " input bit [FOOBAZ][31:24] qux [ 16],\n" - " input bit [ 4][ 24:0][16:0] foobaz [ ],\n" - " input bit [ 2:0][ 31:0] baz,\n" - " input bit [ 24:16] bar,\n" - " input bit [ 2] foobar,\n" - " input bit foo\n" - ");\n" - "endmodule : m\n", - "module m (\n" - " output bit [2:0][ 2:0][ 2:0] quuz [ 8][16:12],\n" - " input bit [ 16] quux [8:2][ 16][32],\n" - " input bit [FOOBAZ][31:24] qux [ 16],\n" - " input bit [ 4][ 24:0][ 16:0] foobaz[ ],\n" - " input bit [ 2:0][ 31:0] baz,\n" - " input bit [24:16] bar,\n" - " input bit [ 2] foobar,\n" - " input bit foo\n" - ");\n" - "endmodule : m\n", - "module m (\n" - " output bit [2:0][ 2:0][ 2:0] quuz [ 8][16:12],\n" - " input bit [ 16] quux [8:2][16][ 32],\n" - " input bit [FOOBAZ][31:24] qux [ 16],\n" - " input bit [ 4][ 24:0][ 16:0] foobaz [ ],\n" - " input bit [ 2:0][ 31:0] baz,\n" - " input bit [24:16] bar,\n" - " input bit [ 2] foobar,\n" - " input bit foo\n" - ");\n" - "endmodule : m\n", - }}, -}; - -TEST(FormatterEndToEndTest, PortDeclarationDimensionsAlignmentTest) { - FormatStyle style; - style.column_limit = 64; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - - // All combinations of port_declaration_right_align_{un,}packed_dimensions - static const bool right_align_combinations[][2] = { - {false, false}, {false, true}, {true, false}, {true, true}}; - - for (const auto &test_case : kPortDeclarationDimensionsAlignmentTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - size_t expected_index = 0; - for (const auto &right_align : right_align_combinations) { - VLOG(1) << "style variant:\n" - << "port_declarations_right_align_packed_dimensions: " - << right_align[0] << "\n" - << "port_declarations_right_align_unpacked_dimensions: " - << right_align[1] << "\n"; - style.port_declarations_right_align_packed_dimensions = right_align[0]; - style.port_declarations_right_align_unpacked_dimensions = right_align[1]; - - std::ostringstream stream; - - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected[expected_index++]) - << "code:\n" - << test_case.input; - } - } -} - -// TODO(fangism): directed tests using style variations - -static constexpr FormatterTestCase kNestedFunctionsTestCases40ColumnsLimit[] = { - {"module foo;" - "`uvm_info(`gfn, $sformatf(\n" - "\"\\n base_vseq: generate %0d pulse in channel %0d\", cfg.num_pulses, " - "i), UVM_DEBUG)\n" - "endmodule", - "module foo;\n" - " `uvm_info(\n" - " `gfn,\n" - " $sformatf(\n" - " \"\\n base_vseq: generate %0d pulse in channel %0d\",\n" - " cfg.num_pulses, i), UVM_DEBUG)\n" - "endmodule\n"}, - {"module foo;`uvm_info(`gfn, $sformatf(" - "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\"," - "cfg.convert2string()), UVM_LOW)\n" - "endmodule", - "module foo;\n" - " `uvm_info(\n" - " `gfn,\n" - " $sformatf(\n" - " \"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\",\n" - " cfg.convert2string()),\n" - " UVM_LOW)\n" // FIXME: Wrapped by SearchLineWraps - "endmodule\n"}, -}; - -TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases40ColumnsLimit) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - - for (const auto &test_case : kNestedFunctionsTestCases40ColumnsLimit) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -static constexpr FormatterTestCase kNestedFunctionsTestCases60ColumnsLimit[] = { - {"module foo;" - "`uvm_info(`gfn, $sformatf(\n" - "\"\\n base_vseq: generate %0d pulse in channel %0d\", cfg.num_pulses, " - "i), UVM_DEBUG)\n" - "endmodule", - "module foo;\n" - " `uvm_info(\n" - " `gfn,\n" - " $sformatf(\n" - " \"\\n base_vseq: generate %0d pulse in channel %0d\",\n" - " cfg.num_pulses, i), UVM_DEBUG)\n" - "endmodule\n"}, - {"module foo;`uvm_info(`gfn, $sformatf(" - "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\"," - "cfg.convert2string()), UVM_LOW)\n" - "endmodule", - "module foo;\n" - " `uvm_info(\n" - " `gfn,\n" - " $sformatf(\n" - " \"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\",\n" - " cfg.convert2string()), UVM_LOW)\n" - "endmodule\n"}, -}; - -TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases60ColumnsLimit) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 60; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - - for (const auto &test_case : kNestedFunctionsTestCases60ColumnsLimit) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -static constexpr FormatterTestCase kNestedFunctionsTestCases80ColumnsLimit[] = { - {"module foo;" - "`uvm_info(`gfn, $sformatf(\n" - "\"\\n base_vseq: generate %0d pulse in channel %0d\", cfg.num_pulses, " - "i), UVM_DEBUG)\n" - "endmodule", - "module foo;\n" - " `uvm_info(`gfn, $sformatf(\"\\n base_vseq: generate %0d pulse in " - "channel %0d\",\n" - " cfg.num_pulses, i), UVM_DEBUG)\n" - "endmodule\n"}, - {"module foo;`uvm_info(`gfn, $sformatf(" - "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\"," - "cfg.convert2string()), UVM_LOW)\n" - "endmodule", - "module foo;\n" - " `uvm_info(`gfn, $sformatf(\n" - " \"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE " - "|----\\n %s\",\n" - " cfg.convert2string()), UVM_LOW)\nendmodule\n"}, - {"module x;" - "`uvm_fatal(`gfn, $sformatf(" - "\"The data 0x%0h written to the signature address is formatted " - "incorrectly.\"," - "signature_data))\n" - "endmodule", - "module x;\n" - " `uvm_fatal(\n" - " `gfn,\n" - " $sformatf(\n" - " \"The data 0x%0h written to the signature address is formatted " - "incorrectly.\",\n" - " signature_data))\n" - "endmodule\n"}, -}; - -TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases80ColumnsLimit) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 80; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - - for (const auto &test_case : kNestedFunctionsTestCases80ColumnsLimit) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -static constexpr FormatterTestCase kNestedFunctionsTestCases100ColumnsLimit[] = - { - {"module foo;" - "`uvm_info(`gfn, $sformatf(\n" - "\"\\n base_vseq: generate %0d pulse in channel %0d\", " - "cfg.num_pulses, i), UVM_DEBUG)\n" - "endmodule", - "module foo;\n" - " `uvm_info(`gfn, $sformatf(\"\\n base_vseq: generate %0d pulse in " - "channel %0d\", cfg.num_pulses, i),\n" - " UVM_DEBUG)\n" - "endmodule\n"}, - {"module foo;`uvm_info(`gfn, $sformatf(" - "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\"," - "cfg.convert2string()), UVM_LOW)\n" - "endmodule", - "module foo;\n" - " `uvm_info(`gfn, $sformatf(\"\\n\\n\\t ----| STARTING AES MAIN " - "SEQUENCE |----\\n %s\",\n" - " cfg.convert2string()), UVM_LOW)\n" - "endmodule\n"}, - {"module x;" - "`uvm_fatal(`gfn, $sformatf(" - "\"The data 0x%0h written to the signature address is formatted " - "incorrectly.\"," - "signature_data))\n" - "endmodule", - "module x;\n" - " `uvm_fatal(`gfn, $sformatf(\n" - " \"The data 0x%0h written to the signature " - "address is formatted incorrectly.\",\n" - " signature_data))\n" - "endmodule\n"}, - {// nested modules, three-levels - "module x; module y; module z;" - "`uvm_fatal(`gfn, $sformatf(" - "\"The data 0x%0h written to the signature address is formatted " - "incorrectly.\"," - "signature_data))\n" - "endmodule endmodule endmodule", - "module x;\n" - " module y;\n" - " module z;\n" - " `uvm_fatal(`gfn,\n" - " $sformatf(\n" - " \"The data 0x%0h written to the signature " - "address is formatted incorrectly.\",\n" - " signature_data))\n" - " endmodule\n" - " endmodule\n" - "endmodule\n"}, -}; - -TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases100ColumnsLimit) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 100; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - - for (const auto &test_case : kNestedFunctionsTestCases100ColumnsLimit) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -static constexpr FormatterTestCase noCompactIndexingAndSelectionsTestCases[]{ - {"module m1 ();\n" - " assign s1 = msg[1 : 2 + 3];\n" - " assign s2 = {<<8{msg[1 : 2 + 3]}};\n" - "endmodule\n", - "module m1 ();\n" - " assign s1 = msg[1 : 2 + 3];\n" - " assign s2 = {<< 8{msg[1 : 2 + 3]}};\n" - "endmodule\n"}}; - -TEST(FormatterEndToEndTest, compactIndexingAndSelectionsTestCases) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 100; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.compact_indexing_and_selections = false; - - for (const auto &test_case : noCompactIndexingAndSelectionsTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -static constexpr FormatterTestCase - kSpaceBeforeHashInUnqualifiedTypedefTestCases[] = { - // unqualified parameterized type keeps a space before '#' - {"typedef dv_base_env_cov #(.CFG_T(tl_agent_env_cfg)) " - "tl_agent_env_cov;\n", - "typedef dv_base_env_cov #(\n" - " .CFG_T(tl_agent_env_cfg)\n" - ") tl_agent_env_cov;\n"}, - // ... and is inserted when absent - {"typedef dv_base_env_cov#(.CFG_T(tl_agent_env_cfg)) " - "tl_agent_env_cov;\n", - "typedef dv_base_env_cov #(\n" - " .CFG_T(tl_agent_env_cfg)\n" - ") tl_agent_env_cov;\n"}, - // single short parameter stays on one line - {"typedef my_class #(.P(P)) my_class_t;\n", - "typedef my_class #(.P(P)) my_class_t;\n"}, - // package-qualified types are unaffected (no space before '#') - {"typedef foo_pkg::baz_t#(.L(L), .W(W)) bar_t;\n", - "typedef foo_pkg::baz_t#(\n" - " .L(L),\n" - " .W(W)\n" - ") bar_t;\n"}, -}; - -TEST(FormatterEndToEndTest, SpaceBeforeHashInUnqualifiedTypedefTestCases) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.class_parameter_space = true; - - for (const auto &test_case : kSpaceBeforeHashInUnqualifiedTypedefTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -static constexpr FormatterTestCase kFunctionCallsWithComments[] = { - {// no comments - "module foo;\n" - "`uvm_info(`gfn, \"xx\",\n" - "cfg.num_pulses, i, UVM_DEBUG)\n" - "endmodule", - "module foo;\n" - " `uvm_info(`gfn, \"xx\", cfg.num_pulses, i, UVM_DEBUG)\n" - "endmodule\n"}, - {// one comment - "module foo;\n" - "`uvm_info(`gfn, \"xx\", // yy\n" - "cfg.num_pulses, i, UVM_DEBUG)\n" - "endmodule", - "module foo;\n" - " `uvm_info(`gfn, \"xx\", // yy\n" - " cfg.num_pulses, i, UVM_DEBUG)\n" - "endmodule\n"}, - {// two comments - "module foo;\n" - "`uvm_info(`gfn, \"xx\", " - " cfg.num_pulses, // xx\n" - " i, UVM_DEBUG)// uuu\n" - "endmodule", - "module foo;\n" - " `uvm_info(`gfn, \"xx\", cfg.num_pulses, // xx\n" - " i, UVM_DEBUG) // uuu\n" - "endmodule\n"}, - - {// nested function calls with comments - "module foo;" - "`uvm_info(`gfn, $sformatf(\"\\n base_vseq: generate %0d" - " pulse in channel %0d\", cfg.num_pulses, // comment\n" - " i), UVM_DEBUG)\n" - "endmodule", - "module foo;\n" - " `uvm_info(`gfn, $sformatf(\"\\n base_vseq: generate %0d pulse in " - "channel %0d\",\n" - " cfg.num_pulses, // comment\n" - " i), UVM_DEBUG)\n" - "endmodule\n"}, -}; - -TEST(FormatterEndToEndTest, FunctionCallsWithComments) { - // Use a fixed style. - FormatStyle style; - style.column_limit = 100; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - - for (const auto &test_case : kFunctionCallsWithComments) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - // Require these test cases to be valid. - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Extracts the first non-whitespace token and prepends it with number of -// of newlines seen in front of it. So "\n \n\n foo" -> "3foo" -std::string NLCountAndfirstWord(std::string_view str) { - std::string result; - int newline_count = 0; - std::string_view::const_iterator begin = str.begin(); - for (/**/; begin < str.end(); ++begin) { - if (!isspace(*begin)) break; - newline_count += (*begin == '\n'); - } - // Emit number of newlines seen up to first token. - result.append(1, - static_cast<char>(newline_count + '0')); // single digit itoa - std::string_view::const_iterator end_str = begin; - for (/**/; end_str < str.end() && !isspace(*end_str); ++end_str) { - } - result.append(begin, end_str); - return result; -} - -// Similar to NLCountAndfirstWord() but looking at the last token and trailing -// newlines. -std::string lastWordAndNLCount(std::string_view str) { - std::string result; - int newline_count = 0; - std::string_view::const_iterator back = str.end() - 1; - for (/**/; back >= str.begin(); --back) { - if (!isspace(*back)) break; - newline_count += (*back == '\n'); - } - - std::string_view::const_iterator start_str = back; - for (/**/; start_str >= str.begin() && !isspace(*start_str); --start_str) { - } - result.append(&*(start_str + 1), back - start_str); - // Emit number of newlines seen following last token. - result.append(1, - static_cast<char>(newline_count + '0')); // single digit itoa - return result; -} - -// Testing the tester... -TEST(FormatterTestInternal, TokenExtractorAndLineCounterTestFixtureTest) { - std::string_view str = "\n \nhello world \n \n"; - ASSERT_EQ(NLCountAndfirstWord(str), "2hello"); - ASSERT_EQ(NLCountAndfirstWord(str.substr(1)), "1hello"); - ASSERT_EQ(NLCountAndfirstWord(str.substr(3)), "0hello"); - - ASSERT_EQ(lastWordAndNLCount(str), "world2"); - ASSERT_EQ(lastWordAndNLCount(str.substr(0, str.length() - 1)), "world1"); - ASSERT_EQ(lastWordAndNLCount(str.substr(0, str.length() - 2)), "world1"); - ASSERT_EQ(lastWordAndNLCount(str.substr(0, str.length() - 3)), "world0"); - - str = "aworld \n \n"; // Make sure to not overshoot begin. - ASSERT_EQ(lastWordAndNLCount(str.substr(1)), "world2"); -} - -TEST(FormatterEndToEndTest, RangeFormattingOnlyEmittingRelevantLines) { - // Including some empty lines to make sure the formatting - static constexpr std::string_view unformatted = - R"( module foo (// non-port comment - - // some comment - - input logic a, input logic b,input bit [2] -foobar, input bit [4] foobaz, - input bit [2] quux - - - ); endmodule -)"; - - std::vector<std::string_view> lines = absl::StrSplit(unformatted, '\n'); - const int kLineCount = lines.size(); - - FormatStyle style; - - // Go through all possible sub-ranges, format these, and compare that the - // output of the range output is contained inside the full format given the - // same sub-range. - for (int start_line = 0; start_line < kLineCount; ++start_line) { - for (int end_line = start_line; end_line < kLineCount; ++end_line) { - // Line numbers are 1-index based. - const verible::Interval<int> range = {start_line + 1, end_line + 1}; - - // Format full text for reference - std::ostringstream full_format; - absl::Status status = - FormatVerilog(unformatted, "<filename>", style, full_format, {range}); - EXPECT_OK(status) << status.message(); - - // To test: range formatted. - std::string range_formatted; - status = FormatVerilogRange(unformatted, "<filename>", style, - &range_formatted, range); - EXPECT_OK(status) << status.message(); - if (range.empty()) { // Nothing to format: expect empty output. - EXPECT_TRUE(range_formatted.empty()); - continue; - } - - // Area we cover in the input (include the final newline); - const auto source_begin = lines[start_line].begin(); - const auto source_end = lines[end_line - 1].end() + 1; // include \n - const std::string_view range_unformatted(&*source_begin, - source_end - source_begin); - - // To compare that we indeed formatted the requested reqgion, we make - // sure that the first and last token (simplified: non-whitespace word) - // in the input of the range to be formatted is - // exactly the first and last token that comes out of the range - // formatted snippet. - // - // While the whitespace might be different at the beginning and end - // due to formatting, the number of _newlines_ at the beginning and end - // should be the same, so we include the newline count in the comparison. - - EXPECT_EQ(NLCountAndfirstWord(range_unformatted), - NLCountAndfirstWord(range_formatted)) - << "'" << range_unformatted << "' vs. '" << range_formatted << "'"; - - // ... same for the last word. - EXPECT_EQ(lastWordAndNLCount(range_unformatted), - lastWordAndNLCount(range_formatted)) - << "'" << range_unformatted << "' vs. '" << range_formatted << "'"; - - EXPECT_LE(range_formatted.length(), full_format.str().length()); - EXPECT_THAT(full_format.str(), HasSubstr(range_formatted)); - } - } -} - -// Creates a string_view spanning a whole string literal. -// Works correctly with strings containing null bytes. -template <std::size_t N> -constexpr std::string_view string_view_from_literal(const char (&s)[N]) { - return std::string_view(s, N - 1); -} - -// The following regressions have been found by a fuzzer, so the input might -// look a bit 'funny'. Nevertheless, they expose real bugs in the code. - -[[maybe_unused]] void TestForNonCrash(std::string_view input) { - using verible::EscapeString; - FormatStyle style; - std::ostringstream stream; - const auto status = FormatVerilog(input, "<filename>", style, stream); - // If we are here, we did at least not crash, which is all we desire for - // the fuzzer tests. - // Other issues that are reported correctly (probably due to strange inputs - // generated by the fuzzer) are ok, so we just log them here FYI. - if (!status.ok()) { - LOG(INFO) << "No crash, but format failed for other reason: " - << status.message() << "\nEscaped input: \"" - << EscapeString(input) << "\""; - } -} - -#if 0 -// https://github.com/chipsalliance/verible/issues/1381 -TEST(FormatterEndToEndTest, FuzzingRegression_1381) { - TestForNonCrash(string_view_from_literal("P#(\0\0//\0//\0,);")); - TestForNonCrash(string_view_from_literal("P#(\0\0//\0,,//\0,")); -} -#endif - -// https://github.com/chipsalliance/verible/issues/1384 -TEST(FormatterEndToEndTest, FuzzingRegression_UseAfterFree_1384) { - TestForNonCrash("`c(`c(//););"); -} - -// https://github.com/chipsalliance/verible/issues/1386 -TEST(FormatterEndToEndTest, FuzzingRegressionHierachyInvariant) { - // Original sample input from fuzzer - TestForNonCrash(string_view_from_literal("`c(`c()\0;);")); - // Lexically correct variant (`\0` -> `\n`) - TestForNonCrash(string_view_from_literal("`c(`c()\n;);")); - // Lexically correct variant (`\0` removed) - TestForNonCrash(string_view_from_literal("`c(`c(););")); -} - -// Possibly same ? https://github.com/chipsalliance/verible/issues/1386 -TEST(FormatterEndToEndTest, FuzzingRegression_outofmemory) { - TestForNonCrash(string_view_from_literal("`f(1'O`f())\n")); -} - -TEST(FormatterEndToEndTest, AlignmentGroupBoundaryNone) { - // Default behavior: separator comments and blank lines do NOT break groups. - static constexpr FormatterTestCase kTestCases[] = { - {// Separator comment does not break alignment group - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "// ============\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - " // ============\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.alignment_group_boundary = AlignmentGroupBoundary::kNone; - style.assignment_statement_alignment = AlignmentPolicy::kAlign; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, AlignmentGroupBoundarySeparatorComments) { - static constexpr FormatterTestCase kTestCases[] = { - {// Separator comment breaks alignment group - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "// ============\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - " // ============\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - {// Dashes separator also breaks - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "// ------------\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - " // ------------\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - {// Captioned divider (text between separator runs) also breaks - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "// ------ section heading ------\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - " // ------ section heading ------\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - {// Leading-only divider run with trailing caption text - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "// ==== Registers\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - " // ==== Registers\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - {// No space after // also works - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "//============\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - " //============\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - {// Slash separator (/////) also works - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "//////////\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - " //////////\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - {// Regular comment does NOT break alignment - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "// Title text\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - " // Title text\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - {// Multi-line comment block with separators - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "// ============\n" - "// Title\n" - "// ============\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - " // ============\n" - " // Title\n" - " // ============\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - {// Short repeated body (3 chars) does NOT break - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "// ---\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - " // ---\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - {// Declarations also respect separator comments - "module m;\n" - "logic a;\n" - "logic [7:0] b;\n" - "// ============\n" - "logic c_long_name;\n" - "logic d;\n" - "endmodule\n", - "module m;\n" - " logic a;\n" - " logic [7:0] b;\n" - " // ============\n" - " logic c_long_name;\n" - " logic d;\n" - "endmodule\n"}, - {// Statements in always blocks - "module m;\n" - "always_comb begin\n" - "aaaaa = b;\n" - "c = 1'b0;\n" - "// ============\n" - "dd = eee;\n" - "ffffff = g;\n" - "end\n" - "endmodule\n", - "module m;\n" - " always_comb begin\n" - " aaaaa = b;\n" - " c = 1'b0;\n" - " // ============\n" - " dd = eee;\n" - " ffffff = g;\n" - " end\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.alignment_group_boundary = AlignmentGroupBoundary::kSeparatorComments; - style.assignment_statement_alignment = AlignmentPolicy::kAlign; - style.module_net_variable_alignment = AlignmentPolicy::kAlign; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, AlignmentGroupBoundaryBlankLines) { - static constexpr FormatterTestCase kTestCases[] = { - {// Blank line breaks alignment group - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - "\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - {// No blank line: single alignment group - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - {// Single item before blank line (not enough for alignment) - "module m;\n" - "assign foo = 1'b1;\n" - "\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - "\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - {// Separator comment does NOT break (only blank lines) - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "// ============\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - " // ============\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.alignment_group_boundary = AlignmentGroupBoundary::kBlankLines; - style.assignment_statement_alignment = AlignmentPolicy::kAlign; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, - AlignmentGroupBoundaryBlankLinesAndSeparatorComments) { - static constexpr FormatterTestCase kTestCases[] = { - {// Both blank line and separator break groups - "module m;\n" - "assign foo = 1'b1;\n" - "assign baar = 1'b0;\n" - "\n" - "assign baaaaz = 1'b1;\n" - "assign c = 1'b0;\n" - "// ============\n" - "assign dd = 1'b1;\n" - "assign eee = 1'b0;\n" - "endmodule\n", - "module m;\n" - " assign foo = 1'b1;\n" - " assign baar = 1'b0;\n" - "\n" - " assign baaaaz = 1'b1;\n" - " assign c = 1'b0;\n" - " // ============\n" - " assign dd = 1'b1;\n" - " assign eee = 1'b0;\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.alignment_group_boundary = - AlignmentGroupBoundary::kBlankLinesAndSeparatorComments; - style.assignment_statement_alignment = AlignmentPolicy::kAlign; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Regression for https://github.com/chipsalliance/verible/issues/2547: -// A localparam initialized to a sum of long macros must converge: infix `+` -// stays with the following operand so re-format does not oscillate between -// `+\n`MACRO` and `+ `MACRO`. -TEST(FormatterEndToEndTest, LongMacroSumLocalparamConverges) { - static constexpr FormatterTestCase kTestCases[] = { - {"module m;\n" - " localparam N =\n" - " `MACRO_GEN3_SCRAMBLE_LFSR_REGOUT\n" - " + `MACRO_GEN3_SCRAMBLE_REGIN\n" - " + `MACRO_GEN3_SCRAMBLE_REGOUT\n" - " ;\n" - "endmodule\n", - "module m;\n" - " localparam N =\n" - " `MACRO_GEN3_SCRAMBLE_LFSR_REGOUT\n" - " + `MACRO_GEN3_SCRAMBLE_REGIN\n" - " + `MACRO_GEN3_SCRAMBLE_REGOUT;\n" - "endmodule\n"}, - // Already in pass-1 form must stay stable. - {"module m;\n" - " localparam N =\n" - " `MACRO_GEN3_SCRAMBLE_LFSR_REGOUT\n" - " + `MACRO_GEN3_SCRAMBLE_REGIN\n" - " + `MACRO_GEN3_SCRAMBLE_REGOUT;\n" - "endmodule\n", - "module m;\n" - " localparam N =\n" - " `MACRO_GEN3_SCRAMBLE_LFSR_REGOUT\n" - " + `MACRO_GEN3_SCRAMBLE_REGIN\n" - " + `MACRO_GEN3_SCRAMBLE_REGOUT;\n" - "endmodule\n"}, - }; - FormatStyle style; // default column_limit (100) - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Regression for https://github.com/chipsalliance/verible/issues/2544: -// Wrapping a $bits(...)'(...) cast may leave `MACRO at EOL, reclassifying -// MacroIdentifier as MacroIdItem. FormatEquivalent must accept that, and -// formatting must still pass verification. -TEST(FormatterEndToEndTest, MacroBeforeCloseParenFormatEquivalent) { - static constexpr std::string_view kInput = - "module m;\n" - " assign result_value = $bits(result_value)'( " - "compare_bytes(input_data[DATA_WIDTH_INT-1:0], " - "input_datak[STROBE_WIDTH_INT-1:0], `TOKEN_BYTE) );\n" - "endmodule\n"; - FormatStyle style; - std::ostringstream stream; - const auto status = FormatVerilog(kInput, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_THAT(stream.str(), testing::HasSubstr("`TOKEN_BYTE")); -} - -// Regression for https://github.com/chipsalliance/verible/issues/2542: -// Continuation EOL comments after a wrapped assign must keep a stable column -// across re-format (convergence). -TEST(FormatterEndToEndTest, ContinuationCommentAfterWrappedAssignConverges) { - static constexpr FormatterTestCase kTestCases[] = { - {// Comments originally column-aligned after a wrapped assign - "module m;\n" - " assign status_ur = !(status_sc || status_ca ||\n" - " status_crs); // Completions with a Reserved Completion\n" - " // Status value are treated as UR\n" - "endmodule\n", - "module m;\n" - " assign status_ur =\n" - " !(status_sc || status_ca || status_crs); // Completions with a " - "Reserved Completion\n" - " // Status value are " - "treated as UR\n" - "endmodule\n"}, - {// Previously mis-aligned continuation is not treated as a continuation - // (column delta > 1) and must still converge - "module m;\n" - " assign status_ur = !(status_sc || status_ca ||\n" - " status_crs); // Completions with a Reserved Completion\n" - " " - "// Status value are treated as UR\n" - "endmodule\n", - "module m;\n" - " assign status_ur =\n" - " !(status_sc || status_ca || status_crs); // Completions with a " - "Reserved Completion\n" - " // Status value are treated as UR\n" - "endmodule\n"}, - }; - FormatStyle style; // default column_limit (100) - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Regression for https://github.com/chipsalliance/verible/issues/2540: -// Trailing EOL comment after `end` before `else if` must not change whether -// the else-if assignment stays on one line across re-format (convergence). -TEST(FormatterEndToEndTest, EndElseIfWithEOLCommentConverges) { - static constexpr FormatterTestCase kTestCases[] = { - {// Comment on its own line between end and else if - "module m;\n" - " always_comb begin\n" - " case (state)\n" - " STATE_A: begin\n" - " if (cond_aaaa) next_state_value = STATE_B;\n" - " else if (cond_bbbb) begin\n" - " next_state_value = STATE_B;\n" - " end\n" - " // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" - " else if (cond_cccc) next_state_value = STATE_C;\n" - " end\n" - " endcase\n" - " end\n" - "endmodule\n", - "module m;\n" - " always_comb begin\n" - " case (state)\n" - " STATE_A: begin\n" - " if (cond_aaaa) next_state_value = STATE_B;\n" - " else if (cond_bbbb) begin\n" - " next_state_value = STATE_B;\n" - " end // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" - " else if (cond_cccc) next_state_value = STATE_C;\n" - " end\n" - " endcase\n" - " end\n" - "endmodule\n"}, - {// Same construct with comment already on the end line - "module m;\n" - " always_comb begin\n" - " case (state)\n" - " STATE_A: begin\n" - " if (cond_aaaa) next_state_value = STATE_B;\n" - " else if (cond_bbbb) begin\n" - " next_state_value = STATE_B;\n" - " end // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" - " else if (cond_cccc) next_state_value = STATE_C;\n" - " end\n" - " endcase\n" - " end\n" - "endmodule\n", - "module m;\n" - " always_comb begin\n" - " case (state)\n" - " STATE_A: begin\n" - " if (cond_aaaa) next_state_value = STATE_B;\n" - " else if (cond_bbbb) begin\n" - " next_state_value = STATE_B;\n" - " end // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" - " else if (cond_cccc) next_state_value = STATE_C;\n" - " end\n" - " endcase\n" - " end\n" - "endmodule\n"}, - }; - FormatStyle style; // default column_limit (100) - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify kAlign behavior for body-level param/localparam declarations -// in module and package bodies. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBasics) { - static constexpr FormatterTestCase kTestCases[] = { - {// localparam alignment in module body - "module m;\n" - "localparam foo = 4'b0000;\n" - "localparam barr = 4'b0010;\n" - "localparam baaaaz = 4'b0111;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 4'b0000;\n" - " localparam barr = 4'b0010;\n" - " localparam baaaaz = 4'b0111;\n" - "endmodule\n"}, - {// localparam alignment in package body - "package p;\n" - "localparam foo = 4'b0000;\n" - "localparam barr = 4'b0010;\n" - "localparam baaaaz = 4'b0111;\n" - "endpackage\n", - "package p;\n" - " localparam foo = 4'b0000;\n" - " localparam barr = 4'b0010;\n" - " localparam baaaaz = 4'b0111;\n" - "endpackage\n"}, - {// parameter alignment in module body - "module m;\n" - "parameter int foo = 1;\n" - "parameter int barr = 2;\n" - "endmodule\n", - "module m;\n" - " parameter int foo = 1;\n" - " parameter int barr = 2;\n" - "endmodule\n"}, - {// parameter alignment in package body - "package p;\n" - "parameter int foo = 1;\n" - "parameter int barrrr = 2;\n" - "endpackage\n", - "package p;\n" - " parameter int foo = 1;\n" - " parameter int barrrr = 2;\n" - "endpackage\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify kFlushLeft behavior: body-level param/localparam declarations -// are not aligned. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentFlushLeft) { - static constexpr FormatterTestCase kTestCases[] = { - {// module body: parameters are not aligned - "module m;\n" - "localparam foo = 4'b0000;\n" - "localparam barr = 4'b0010;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 4'b0000;\n" - " localparam barr = 4'b0010;\n" - "endmodule\n"}, - {// package context: flush-left - "package p;\n" - "localparam foo = 4'b0000;\n" - "localparam barr = 4'b0010;\n" - "endpackage\n", - "package p;\n" - " localparam foo = 4'b0000;\n" - " localparam barr = 4'b0010;\n" - "endpackage\n"}, - {// generate context: flush-left - "module m;\n" - "generate\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "endgenerate\n" - "endmodule\n", - "module m;\n" - " generate\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " endgenerate\n" - "endmodule\n"}, - {// parameter in module body: flush-left - "module m;\n" - "parameter int W = 8;\n" - "parameter int HHHH = 2;\n" - "endmodule\n", - "module m;\n" - " parameter int W = 8;\n" - " parameter int HHHH = 2;\n" - "endmodule\n"}, - {// mixed parameter and localparam: flush-left, no alignment - "module m;\n" - "parameter int W = 8;\n" - "localparam L = 4;\n" - "parameter int H = 2;\n" - "endmodule\n", - "module m;\n" - " parameter int W = 8;\n" - " localparam L = 4;\n" - " parameter int H = 2;\n" - "endmodule\n"}, - {// interface context: flush-left - "interface my_if;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "endinterface\n", - "interface my_if;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - "endinterface\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify kPreserve behavior: body-level param/localparam declarations -// maintain their existing spacing. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentPreserve) { - static constexpr FormatterTestCase kTestCases[] = { - {// module body: existing spacing is kept - "module m;\n" - "localparam foo = 4'b0000;\n" - "localparam barr = 4'b0010;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 4'b0000;\n" - " localparam barr = 4'b0010;\n" - "endmodule\n"}, - {// package: existing flush-left spacing preserved - "package p;\n" - "localparam foo = 4'b0000;\n" - "localparam barr = 4'b0010;\n" - "endpackage\n", - "package p;\n" - " localparam foo = 4'b0000;\n" - " localparam barr = 4'b0010;\n" - "endpackage\n"}, - {// generate: existing aligned spacing preserved - "module m;\n" - "generate\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "endgenerate\n" - "endmodule\n", - "module m;\n" - " generate\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " endgenerate\n" - "endmodule\n"}, - {// parameter flush-left preserved - "module m;\n" - "parameter int W = 8;\n" - "parameter int HHHH = 2;\n" - "endmodule\n", - "module m;\n" - " parameter int W = 8;\n" - " parameter int HHHH = 2;\n" - "endmodule\n"}, - {// parameter pre-aligned preserved - "module m;\n" - "parameter int W = 8;\n" - "parameter int HHHH = 2;\n" - "endmodule\n", - "module m;\n" - " parameter int W = 8;\n" - " parameter int HHHH = 2;\n" - "endmodule\n"}, - {// interface pre-aligned preserved - "interface my_if;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "endinterface\n", - "interface my_if;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - "endinterface\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kPreserve; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify kAlign behavior for param/localparam declarations across -// interface, generate, and module body contexts, including mixed -// param/localparam and packed dimension alignment. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentContexts) { - static constexpr FormatterTestCase kTestCases[] = { - {// interface body localparam alignment - "interface my_if;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "endinterface\n", - "interface my_if;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - "endinterface\n"}, - {// interface body parameter alignment - "interface my_if;\n" - "parameter int X = 1;\n" - "parameter int Y_LONG = 2;\n" - "endinterface\n", - "interface my_if;\n" - " parameter int X = 1;\n" - " parameter int Y_LONG = 2;\n" - "endinterface\n"}, - {// generate block localparam alignment - "module m;\n" - "generate\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "endgenerate\n" - "endmodule\n", - "module m;\n" - " generate\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " endgenerate\n" - "endmodule\n"}, - {// generate block parameter alignment - "module m;\n" - "generate\n" - "parameter int A = 1;\n" - "parameter int BB = 2;\n" - "endgenerate\n" - "endmodule\n", - "module m;\n" - " generate\n" - " parameter int A = 1;\n" - " parameter int BB = 2;\n" - " endgenerate\n" - "endmodule\n"}, - {// mixed param and net declarations form separate alignment groups - "module m;\n" - "localparam X = 1;\n" - "localparam YYY = 2;\n" - "logic clk;\n" - "logic rst_n;\n" - "localparam ZZ = 3;\n" - "endmodule\n", - "module m;\n" - " localparam X = 1;\n" - " localparam YYY = 2;\n" - " logic clk;\n" - " logic rst_n;\n" - " localparam ZZ = 3;\n" - "endmodule\n"}, - {// mixed parameter and localparam in same block - "module m;\n" - "parameter int W = 8;\n" - "localparam L = 4;\n" - "parameter int H = 2;\n" - "endmodule\n", - "module m;\n" - " parameter int W = 8;\n" - " localparam L = 4;\n" - " parameter int H = 2;\n" - "endmodule\n"}, - {// packed dimensions are aligned - "module m;\n" - "parameter bit [7:0] X = 0;\n" - "parameter bit [31:0] YYYY = 1;\n" - "endmodule\n", - "module m;\n" - " parameter bit [ 7:0] X = 0;\n" - " parameter bit [31:0] YYYY = 1;\n" - "endmodule\n"}, - {// multi-identifier comma-separated params are not split (no-crash) - "module m;\n" - "parameter int a=1, b=2, ccc=3;\n" - "localparam d=4, e=5;\n" - "endmodule\n", - "module m;\n" - " parameter int a = 1, b = 2, ccc = 3;\n" - " localparam d = 4, e = 5;\n" - "endmodule\n"}, - {// parameter type declarations do not crash - "module m;\n" - "parameter type T = int;\n" - "parameter type TT_LONG = bit;\n" - "endmodule\n", - "module m;\n" - " parameter type T = int;\n" - " parameter type TT_LONG = bit;\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify kInferUserIntent behavior: body-level param/localparam -// declarations infer alignment intent from existing spacing. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentInferUserIntent) { - static constexpr FormatterTestCase kTestCases[] = { - {// flush-left localparams with small spacing diff: infer aligns - "module m;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - "endmodule\n"}, - {// pre-aligned localparams: infer preserves alignment - "module m;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "localparam baaaaz = 3;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " localparam baaaaz = 3;\n" - "endmodule\n"}, - {// flush-left params in package with small spacing diff: infer aligns - "package p;\n" - "localparam X = 1;\n" - "localparam YY = 2;\n" - "endpackage\n", - "package p;\n" - " localparam X = 1;\n" - " localparam YY = 2;\n" - "endpackage\n"}, - {// mixed param/localparam flush-left: infer keeps flush-left - "module m;\n" - "parameter int W = 8;\n" - "localparam L = 4;\n" - "endmodule\n", - "module m;\n" - " parameter int W = 8;\n" - " localparam L = 4;\n" - "endmodule\n"}, - {// interface flush-left with small diff: infer aligns - "interface my_if;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "endinterface\n", - "interface my_if;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - "endinterface\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify boundary behavior for param declarations with -// kBlankLinesAndSeparatorComments: both blank lines and separator comments -// break alignment groups. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBoundary) { - static constexpr FormatterTestCase kTestCases[] = { - {// separator comment breaks param alignment group - "module m;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "// ============\n" - "localparam baaaaz = 1;\n" - "localparam c = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " // ============\n" - " localparam baaaaz = 1;\n" - " localparam c = 2;\n" - "endmodule\n"}, - {// blank line breaks param alignment group - "module m;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "\n" - "localparam baaaaz = 1;\n" - "localparam c = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - "\n" - " localparam baaaaz = 1;\n" - " localparam c = 2;\n" - "endmodule\n"}, - {// no separator: single alignment group (all aligned together) - "module m;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "localparam baaaaz = 1;\n" - "localparam c = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " localparam baaaaz = 1;\n" - " localparam c = 2;\n" - "endmodule\n"}, - {// regular comment does NOT break alignment group - "module m;\n" - "localparam foo = 1;\n" - "// regular comment\n" - "localparam barr = 2;\n" - "localparam baaaaz = 1;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " // regular comment\n" - " localparam barr = 2;\n" - " localparam baaaaz = 1;\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - style.alignment_group_boundary = - AlignmentGroupBoundary::kBlankLinesAndSeparatorComments; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify edge cases: unpacked dimensions, signed/unsigned, implicit types, -// complex types, single declarations, deeply nested generate blocks. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentEdgeCases) { - // Use column_limit = 80 to avoid unintended line wrapping inside - // deeply nested generate blocks (generate-if, generate-for), which - // would interfere with verifying alignment behavior. - static constexpr FormatterTestCase kTestCases[] = { - {// unpacked dimension alignment - "module m;\n" - "parameter bit X [7:0] = 0;\n" - "parameter bit YYYY [15:0] = 1;\n" - "endmodule\n", - "module m;\n" - " parameter bit X [ 7:0] = 0;\n" - " parameter bit YYYY[15:0] = 1;\n" - "endmodule\n"}, - {// param declarations with only type and default value (no idim) - "module m;\n" - "parameter int X = 0;\n" - "parameter int YYYY = 0;\n" - "endmodule\n", - "module m;\n" - " parameter int X = 0;\n" - " parameter int YYYY = 0;\n" - "endmodule\n"}, - {// signed modifier with packed dimensions - "module m;\n" - "parameter bit signed [7:0] X = 0;\n" - "parameter bit signed [31:0] YYYY = 1;\n" - "endmodule\n", - "module m;\n" - " parameter bit signed [ 7:0] X = 0;\n" - " parameter bit signed [31:0] YYYY = 1;\n" - "endmodule\n"}, - {// param with complex type (struct/typedef) — does not crash - "module m;\n" - "parameter foo_t X = foo_t'(0);\n" - "parameter foo_t Y_LONG = foo_t'(0);\n" - "endmodule\n", - "module m;\n" - " parameter foo_t X = foo_t'(0);\n" - " parameter foo_t Y_LONG = foo_t'(0);\n" - "endmodule\n"}, - {// single param declaration (not enough for alignment group) - "module m;\n" - "localparam X = 1;\n" - "endmodule\n", - "module m;\n" - " localparam X = 1;\n" - "endmodule\n"}, - {// params inside generate-if block - "module m;\n" - "generate\n" - "if (1) begin : blk\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "end\n" - "endgenerate\n" - "endmodule\n", - "module m;\n" - " generate\n" - " if (1) begin : blk\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " end\n" - " endgenerate\n" - "endmodule\n"}, - {// unsigned keyword with packed dimensions (complement to signed) - "module m;\n" - "parameter bit unsigned [7:0] X = 0;\n" - "parameter bit unsigned [31:0] YYYY = 1;\n" - "endmodule\n", - "module m;\n" - " parameter bit unsigned [ 7:0] X = 0;\n" - " parameter bit unsigned [31:0] YYYY = 1;\n" - "endmodule\n"}, - {// parameter with implicit type (no explicit type keyword) - "module m;\n" - "parameter X = 32;\n" - "parameter Y_LONG = 64;\n" - "endmodule\n", - "module m;\n" - " parameter X = 32;\n" - " parameter Y_LONG = 64;\n" - "endmodule\n"}, - {// params inside generate-for block - "module m;\n" - "generate\n" - "for (i = 0; i < 2; i++) begin : blk\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "end\n" - "endgenerate\n" - "endmodule\n", - "module m;\n" - " generate\n" - " for (i = 0; i < 2; i++) begin : blk\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " end\n" - " endgenerate\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 80; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify parameter declarations inside generate-case blocks are aligned. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentGenerateCase) { - // Params inside generate-case need wider column limit to avoid wrapping the - // case label / begin block line. - static constexpr FormatterTestCase kTestCases[] = { - {// params inside generate-case block - "module m #(P = 0);\n" - "generate\n" - "case (P)\n" - "0: begin : blk\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "end\n" - "endcase\n" - "endgenerate\n" - "endmodule\n", - "module m #(\n" - " P = 0\n" - ");\n" - " generate\n" - " case (P)\n" - " 0: begin : blk\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " end\n" - " endcase\n" - " endgenerate\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 80; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, FormalAndBodyParamAlignmentIndependence) { - // Verify that --formal_parameters_alignment and - // --parameter_declaration_alignment act independently: setting formal params - // to kFlushLeft should not affect body-level param alignment, and vice versa. - static constexpr FormatterTestCase kTestCases[] = { - {// formal flush-left + body align: only body params align - "module m #(\n" - "int W = 2,\n" - "int LLLL = 4\n" - ");\n" - "localparam foo = 0;\n" - "localparam barrrr = 0;\n" - "endmodule\n", - "module m #(\n" - " int W = 2,\n" - " int LLLL = 4\n" - ");\n" - " localparam foo = 0;\n" - " localparam barrrr = 0;\n" - "endmodule\n"}, - {// formal align + body flush-left: only formal params align - "module m #(\n" - "int W = 2,\n" - "int LLLL = 4\n" - ");\n" - "localparam foo = 0;\n" - "localparam barrrr = 0;\n" - "endmodule\n", - "module m #(\n" - " int W = 2,\n" - " int LLLL = 4\n" - ");\n" - " localparam foo = 0;\n" - " localparam barrrr = 0;\n" - "endmodule\n"}, - {// both flush-left: no alignment anywhere - "module m #(\n" - "int W = 2,\n" - "int LLLL = 4\n" - ");\n" - "localparam foo = 0;\n" - "localparam barrrr = 0;\n" - "endmodule\n", - "module m #(\n" - " int W = 2,\n" - " int LLLL = 4\n" - ");\n" - " localparam foo = 0;\n" - " localparam barrrr = 0;\n" - "endmodule\n"}, - {// both align: both formal and body params aligned - "module m #(\n" - "int W = 2,\n" - "int LLLL = 4\n" - ");\n" - "localparam foo = 0;\n" - "localparam barrrr = 0;\n" - "endmodule\n", - "module m #(\n" - " int W = 2,\n" - " int LLLL = 4\n" - ");\n" - " localparam foo = 0;\n" - " localparam barrrr = 0;\n" - "endmodule\n"}, - }; - // First case: formal kFlushLeft, body kAlign - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - style.formal_parameters_alignment = AlignmentPolicy::kFlushLeft; - const auto &tc = kTestCases[0]; - VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>"; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } - // Second case: formal kAlign, body kFlushLeft - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft; - style.formal_parameters_alignment = AlignmentPolicy::kAlign; - const auto &tc = kTestCases[1]; - VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>"; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } - // Third case: both kFlushLeft - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft; - style.formal_parameters_alignment = AlignmentPolicy::kFlushLeft; - const auto &tc = kTestCases[2]; - VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>"; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } - // Fourth case: both kAlign - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - style.formal_parameters_alignment = AlignmentPolicy::kAlign; - const auto &tc = kTestCases[3]; - VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>"; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } -} - -TEST(FormatterEndToEndTest, ClassBodyParamNotAffected) { - // Verify that class body parameter/localparam declarations are NOT affected - // by --parameter_declaration_alignment, which targets only module/generate/ - // package/interface body-level params. - static constexpr FormatterTestCase kTestCases[] = { - {// class body params are not affected - "class c;\n" - "parameter int X = 1;\n" - "parameter int YYYY = 2;\n" - "localparam foo = 3;\n" - "localparam barrrr = 4;\n" - "endclass\n", - "class c;\n" - " parameter int X = 1;\n" - " parameter int YYYY = 2;\n" - " localparam foo = 3;\n" - " localparam barrrr = 4;\n" - "endclass\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, PackageBodyVariableAlignment) { - // Verify that moving kPackageItemList to kTabularAlignment in tree-unwrapper - // enables net/variable declaration alignment in package bodies via - // module_net_variable_alignment. - static constexpr FormatterTestCase kTestCases[] = { - {// net/variable declaration alignment in package body - "package p;\n" - "logic [7:0] a;\n" - "logic [31:0] bb;\n" - "endpackage\n", - "package p;\n" - " logic [ 7:0] a;\n" - " logic [31:0] bb;\n" - "endpackage\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.module_net_variable_alignment = AlignmentPolicy::kAlign; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentApplyToAll) { - // Verify that ApplyToAllAlignmentPolicies affects - // parameter_declaration_alignment for all four alignment policies. - static constexpr FormatterTestCase kTestCases[] = { - {// kAlign aligns identifiers and = signs across declarations - "module m;\n" - "localparam foo = 1;\n" - "localparam barrrr = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barrrr = 2;\n" - "endmodule\n"}, - {// kFlushLeft: declarations remain flush-left - "module m;\n" - "localparam foo = 1;\n" - "localparam barrrr = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barrrr = 2;\n" - "endmodule\n"}, - {// kPreserve: existing spacing is kept - "module m;\n" - "localparam foo = 1;\n" - "localparam barrrr = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barrrr = 2;\n" - "endmodule\n"}, - {// kInferUserIntent: large identifier width difference (3 cols) - // suggests flush-left intent, no alignment. - "module m;\n" - "localparam foo = 1;\n" - "localparam barrrr = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barrrr = 2;\n" - "endmodule\n"}, - }; - // kAlign - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kAlign); - const auto &tc = kTestCases[0]; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } - // kFlushLeft - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kFlushLeft); - const auto &tc = kTestCases[1]; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } - // kPreserve - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kPreserve); - const auto &tc = kTestCases[2]; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } - // kInferUserIntent - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kInferUserIntent); - const auto &tc = kTestCases[3]; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } -} - -// Verify that alignment_group_boundary=kBlankLines treats only blank lines -// (not separator comments) as boundary breaks for param declarations. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBoundaryBlankLines) { - static constexpr FormatterTestCase kTestCases[] = { - {// Only blank line breaks group; separator comment does not - "module m;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "\n" - "localparam baaaaz = 1;\n" - "localparam c = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - "\n" - " localparam baaaaz = 1;\n" - " localparam c = 2;\n" - "endmodule\n"}, - {// Separator comment does NOT break group with kBlankLines - "module m;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "// ============\n" - "localparam baaaaz = 1;\n" - "localparam c = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " // ============\n" - " localparam baaaaz = 1;\n" - " localparam c = 2;\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - style.alignment_group_boundary = AlignmentGroupBoundary::kBlankLines; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify that alignment_group_boundary=kNone keeps all param declarations -// in a single alignment group regardless of blank lines or comments. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBoundaryNone) { - static constexpr FormatterTestCase kTestCases[] = { - {// Blank line does NOT break group with kNone - "module m;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "\n" - "localparam baaaaz = 1;\n" - "localparam c = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - "\n" - " localparam baaaaz = 1;\n" - " localparam c = 2;\n" - "endmodule\n"}, - {// Separator comment does NOT break group with kNone - "module m;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "// ============\n" - "localparam baaaaz = 1;\n" - "localparam c = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " // ============\n" - " localparam baaaaz = 1;\n" - " localparam c = 2;\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - style.alignment_group_boundary = AlignmentGroupBoundary::kNone; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify that alignment_group_boundary=kSeparatorComments treats only -// separator comments (not blank lines) as boundary breaks for param -// declarations. -TEST(FormatterEndToEndTest, - ParamDeclarationAlignmentBoundarySeparatorComments) { - static constexpr FormatterTestCase kTestCases[] = { - {// Separator comment breaks alignment group - "module m;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "// ============\n" - "localparam baaaaz = 1;\n" - "localparam c = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " // ============\n" - " localparam baaaaz = 1;\n" - " localparam c = 2;\n" - "endmodule\n"}, - {// Blank line does NOT break group with kSeparatorComments - "module m;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "\n" - "localparam baaaaz = 1;\n" - "localparam c = 2;\n" - "endmodule\n", - "module m;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - "\n" - " localparam baaaaz = 1;\n" - " localparam c = 2;\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - style.alignment_group_boundary = AlignmentGroupBoundary::kSeparatorComments; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify that class body parameter/localparam declarations are NOT affected -// by --parameter_declaration_alignment for the kFlushLeft, kPreserve, -// and kInferUserIntent policies (kAlign is covered in -// ClassBodyParamNotAffected). -TEST(FormatterEndToEndTest, ClassBodyParamNotAffectedOtherPolicies) { - static constexpr FormatterTestCase kTestCases[] = { - {// kFlushLeft: class body params remain flush-left - "class c;\n" - "parameter int X = 1;\n" - "parameter int YYYY = 2;\n" - "localparam foo = 3;\n" - "localparam barrrr = 4;\n" - "endclass\n", - "class c;\n" - " parameter int X = 1;\n" - " parameter int YYYY = 2;\n" - " localparam foo = 3;\n" - " localparam barrrr = 4;\n" - "endclass\n"}, - {// kPreserve: parameter_declaration_alignment does not apply to class - // bodies; whitespace is normalized by default formatting. - "class c;\n" - "parameter int X = 1;\n" - "parameter int YYYY = 2;\n" - "endclass\n", - "class c;\n" - " parameter int X = 1;\n" - " parameter int YYYY = 2;\n" - "endclass\n"}, - {// kInferUserIntent: class body params infer flush-left - "class c;\n" - "parameter int X = 1;\n" - "parameter int YYYY = 2;\n" - "endclass\n", - "class c;\n" - " parameter int X = 1;\n" - " parameter int YYYY = 2;\n" - "endclass\n"}, - }; - // kFlushLeft - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft; - const auto &tc = kTestCases[0]; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } - // kPreserve - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kPreserve; - const auto &tc = kTestCases[1]; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } - // kInferUserIntent - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent; - const auto &tc = kTestCases[2]; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } -} - -// Verify formal_parameters_alignment and parameter_declaration_alignment -// independence for kPreserve and kInferUserIntent combinations. -TEST(FormatterEndToEndTest, - FormalAndBodyParamAlignmentIndependenceOtherPolicies) { - static constexpr FormatterTestCase kTestCases[] = { - {// formal kPreserve + body kAlign: only body params aligned - "module m #(\n" - "int W = 2,\n" - "int LLLL = 4\n" - ");\n" - "localparam foo = 0;\n" - "localparam barrrr = 0;\n" - "endmodule\n", - "module m #(\n" - " int W = 2,\n" - " int LLLL = 4\n" - ");\n" - " localparam foo = 0;\n" - " localparam barrrr = 0;\n" - "endmodule\n"}, - {// formal kAlign + body kPreserve: only formal params aligned - "module m #(\n" - "int W = 2,\n" - "int LLLL = 4\n" - ");\n" - "localparam foo = 0;\n" - "localparam barrrr = 0;\n" - "endmodule\n", - "module m #(\n" - " int W = 2,\n" - " int LLLL = 4\n" - ");\n" - " localparam foo = 0;\n" - " localparam barrrr = 0;\n" - "endmodule\n"}, - {// formal kInferUserIntent + body kAlign: only body params aligned - "module m #(\n" - "int W = 2,\n" - "int LLLL = 4\n" - ");\n" - "localparam foo = 0;\n" - "localparam barrrr = 0;\n" - "endmodule\n", - "module m #(\n" - " int W = 2,\n" - " int LLLL = 4\n" - ");\n" - " localparam foo = 0;\n" - " localparam barrrr = 0;\n" - "endmodule\n"}, - }; - // formal kPreserve + body kAlign - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - style.formal_parameters_alignment = AlignmentPolicy::kPreserve; - const auto &tc = kTestCases[0]; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } - // formal kAlign + body kPreserve - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kPreserve; - style.formal_parameters_alignment = AlignmentPolicy::kAlign; - const auto &tc = kTestCases[1]; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } - // formal kInferUserIntent + body kAlign - { - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - style.formal_parameters_alignment = AlignmentPolicy::kInferUserIntent; - const auto &tc = kTestCases[2]; - std::ostringstream stream; - const auto status = FormatVerilog(tc.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input; - } -} - -// Verify parameter declarations with string, real, and function-call default -// value types to exercise the ColumnSchemaScanner on non-standard type tokens. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentTypeVariants) { - static constexpr FormatterTestCase kTestCases[] = { - {// parameter real type - "module m;\n" - "parameter real X = 1.0;\n" - "parameter real Y_LONG = 2.0;\n" - "endmodule\n", - "module m;\n" - " parameter real X = 1.0;\n" - " parameter real Y_LONG = 2.0;\n" - "endmodule\n"}, - {// parameter string type - "module m;\n" - "parameter string s = \"hello\";\n" - "parameter string long_s = \"world\";\n" - "endmodule\n", - "module m;\n" - " parameter string s = \"hello\";\n" - " parameter string long_s = \"world\";\n" - "endmodule\n"}, - {// parameter with function call in default value - "module m;\n" - "parameter int W = func(1, 2);\n" - "parameter int H_LONG = other(3);\n" - "endmodule\n", - "module m;\n" - " parameter int W = func(1, 2);\n" - " parameter int H_LONG = other(3);\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify parameter_declaration_alignment kInferUserIntent in package bodies. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentPackageInfer) { - static constexpr FormatterTestCase kTestCases[] = { - {// flush-left params with small diff: infer aligns - "package p;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "endpackage\n", - "package p;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - "endpackage\n"}, - {// pre-aligned params: infer preserves - "package p;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "localparam baaaaz = 3;\n" - "endpackage\n", - "package p;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " localparam baaaaz = 3;\n" - "endpackage\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify parameter_declaration_alignment boundary behavior in package bodies. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentPackageBoundary) { - static constexpr FormatterTestCase kTestCases[] = { - {// blank line breaks alignment group in package - "package p;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "\n" - "localparam baaaaz = 1;\n" - "localparam c = 2;\n" - "endpackage\n", - "package p;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - "\n" - " localparam baaaaz = 1;\n" - " localparam c = 2;\n" - "endpackage\n"}, - {// separator comment breaks alignment group in package - "package p;\n" - "localparam foo = 1;\n" - "localparam barr = 2;\n" - "// ============\n" - "localparam baaaaz = 1;\n" - "localparam c = 2;\n" - "endpackage\n", - "package p;\n" - " localparam foo = 1;\n" - " localparam barr = 2;\n" - " // ============\n" - " localparam baaaaz = 1;\n" - " localparam c = 2;\n" - "endpackage\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - style.alignment_group_boundary = - AlignmentGroupBoundary::kBlankLinesAndSeparatorComments; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify the most common default scenario: both formal_parameters_alignment -// and parameter_declaration_alignment set to kInferUserIntent. -TEST(FormatterEndToEndTest, BothParamAlignmentsInferUserIntent) { - static constexpr FormatterTestCase kTestCases[] = { - {// both flush-left with small diff: infer aligns both formal and body - "module m #(\n" - "int W = 2,\n" - "int LL = 4\n" - ");\n" - "localparam foo = 0;\n" - "localparam barr = 0;\n" - "endmodule\n", - "module m #(\n" - " int W = 2,\n" - " int LL = 4\n" - ");\n" - " localparam foo = 0;\n" - " localparam barr = 0;\n" - "endmodule\n"}, - {// both infer: pre-aligned formal, pre-aligned body preserved - "module m #(\n" - "int W = 2,\n" - "int LLLL = 4\n" - ");\n" - "localparam foo = 0;\n" - "localparam barrrr = 0;\n" - "endmodule\n", - "module m #(\n" - " int W = 2,\n" - " int LLLL = 4\n" - ");\n" - " localparam foo = 0;\n" - " localparam barrrr = 0;\n" - "endmodule\n"}, - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent; - style.formal_parameters_alignment = AlignmentPolicy::kInferUserIntent; - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } -} - -// Verify that a large multi-line comment block between parameter -// declarations does not crash the formatter. The tree-unwrapper may -// produce a partition structure where the comment tokens are absorbed -// into the following parameter partition, which the alignment code -// must handle gracefully by skipping alignment for that row. -TEST(FormatterEndToEndTest, ParamDeclarationAlignmentCommentBlockNoCrash) { - // These inputs contain large multi-line comment blocks between - // parameter/localparam declarations. The formatter must not crash - // (SIGABRT). Output correctness is secondary; the formatter may - // fall back to preserving the original input when the partition - // structure prevents safe alignment. - const char *kInputs[] = { - "module m;\n" - "parameter int W = 8;\n" - "// Multi-line comment block\n" - "// that spans across\n" - "//\n" - "// several lines\n" - "// of explanatory text\n" - "//\n" - "// It contains enough\n" - "// lines to trigger\n" - "// the partition structure\n" - "// edge case where\n" - "// comment tokens are\n" - "// absorbed into the\n" - "// following parameter\n" - "// partition.\n" - "//\n" - "localparam int H = 2;\n" - "endmodule\n", - "package p;\n" - "parameter int X = 1;\n" - "// Long comment block\n" - "// with many lines\n" - "//\n" - "// of text\n" - "//\n" - "localparam int Y = 2;\n" - "endpackage\n", - }; - FormatStyle style; - style.column_limit = 40; - style.indentation_spaces = 2; - style.wrap_spaces = 4; - style.parameter_declaration_alignment = AlignmentPolicy::kAlign; - for (const char *input : kInputs) { - VLOG(1) << "code-to-format:\n" << input << "<EOF>"; - std::ostringstream stream; - const auto status = FormatVerilog(input, "<filename>", style, stream); - // The primary requirement is that the formatter does not crash - // (SIGABRT). Gtest will report failure if the process aborts. - // The partition structure may cause output format differences; - // the important thing is the formatter handled it gracefully. - } -} - -// Regression for https://github.com/chipsalliance/verible/issues/2008 -// (also https://github.com/chipsalliance/verible/issues/2474 and -// https://github.com/chipsalliance/verible/issues/2063): -// Non-ANSI "input wire signed" used to abort in the tree-unwrapper because -// the CST visited "signed" before "wire", which is the reverse of source -// order. -TEST(FormatterEndToEndTest, NonAnsiWireSignedModulePortDoesNotAbort) { - static constexpr FormatterTestCase kTestCases[] = { - {// Original issue #2008 sample - "module uut( sig1 );\n" - "\n" - "input wire signed [15:0] sig1;\n" - "\n" - "endmodule\n", - "module uut (\n" - " sig1\n" - ");\n" - "\n" - " input wire signed [15:0] sig1;\n" - "\n" - "endmodule\n"}, - {// Issue #2474 sample - "module myModule (\n" - " myinput\n" - ");\n" - "input wire signed [7:0] myInput;\n" - "endmodule\n", - "module myModule (\n" - " myinput\n" - ");\n" - " input wire signed [7:0] myInput;\n" - "endmodule\n"}, - {// Issue #2063 sample: signed wire with no packed dimensions - "module top(a);\n" - " input wire signed a;\n" - "endmodule\n", - "module top (\n" - " a\n" - ");\n" - " input wire signed a;\n" - "endmodule\n"}, - {// Same production with logic instead of wire - "module uut(sig1);\n" - "input logic signed [15:0] sig1;\n" - "endmodule\n", - "module uut (\n" - " sig1\n" - ");\n" - " input logic signed [15:0] sig1;\n" - "endmodule\n"}, - {// output / inout net types - "module uut(sig1, sig2);\n" - "output wire signed [15:0] sig1;\n" - "inout wire signed [7:0] sig2;\n" - "endmodule\n", - "module uut (\n" - " sig1,\n" - " sig2\n" - ");\n" - " output wire signed [15:0] sig1;\n" - " inout wire signed [7:0] sig2;\n" - "endmodule\n"}, - {// unsigned is the same production - "module uut(sig1);\n" - "input wire unsigned [15:0] sig1;\n" - "endmodule\n", - "module uut (\n" - " sig1\n" - ");\n" - " input wire unsigned [15:0] sig1;\n" - "endmodule\n"}, - {// ANSI form already worked; keep as a regression - "module uut(input wire signed [15:0] sig1);\n" - "endmodule\n", - "module uut (\n" - " input wire signed [15:0] sig1\n" - ");\n" - "endmodule\n"}, - {// Non-ANSI without signed still works - "module uut(sig1);\n" - "input wire [15:0] sig1;\n" - "endmodule\n", - "module uut (\n" - " sig1\n" - ");\n" - " input wire [15:0] sig1;\n" - "endmodule\n"}, - {// Non-ANSI signed without net type still works - "module uut(sig1);\n" - "input signed [15:0] sig1;\n" - "endmodule\n", - "module uut (\n" - " sig1\n" - ");\n" - " input signed [15:0] sig1;\n" - "endmodule\n"}, - }; - FormatStyle style; // default column_limit (100) - for (const auto &test_case : kTestCases) { - VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; - std::ostringstream stream; - const auto status = - FormatVerilog(test_case.input, "<filename>", style, stream); - EXPECT_OK(status) << status.message(); - EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; - } +TEST(FormatterEndToEndTest, SmokeFormatterTestCases) { + RunFormatterTestCases40(kSmokeFormatterTestCases); } // Regression for https://github.com/chipsalliance/verible/issues/2605:
diff --git a/verible/verilog/formatting/formatter_wrap_style_test.cc b/verible/verilog/formatting/formatter_wrap_style_test.cc new file mode 100644 index 0000000..b61fe42 --- /dev/null +++ b/verible/verilog/formatting/formatter_wrap_style_test.cc
@@ -0,0 +1,3405 @@ +// Copyright 2017-2026 The Verible Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Test cases in this file should be *insensitive* to wrapping penalties. +// Penalty-sensitive tests belong in formatter-tuning_test.cc. + +#include <cctype> +#include <cstddef> +#include <sstream> +#include <string> +#include <string_view> +#include <vector> + +#include "absl/status/status.h" +#include "absl/strings/match.h" +#include "absl/strings/str_split.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "verible/common/formatting/align.h" +#include "verible/common/formatting/basic-format-style.h" +#include "verible/common/strings/display-utils.h" +#include "verible/common/strings/position.h" +#include "verible/common/util/interval.h" +#include "verible/common/util/logging.h" +#include "verible/verilog/formatting/format-style.h" +#include "verible/verilog/formatting/formatter-test-utils.h" +#include "verible/verilog/formatting/formatter.h" + +namespace verilog { +namespace formatter { +namespace { + +using absl::StatusCode; +using testing::HasSubstr; +using verible::AlignmentPolicy; +using verible::IndentationStyle; +using verible::LineNumberSet; + +// Empty LineNumberSet means format all lines. +static const LineNumberSet kEnableAllLines; + +// Small case set for diagnostic/control-path tests that previously iterated +// the monolithic kFormatterTestCases table. +static constexpr FormatterTestCase kDiagnosticFormatterTestCases[] = { + {"", ""}, + {"\n", "\n"}, + {"module m;wire w;endmodule\n", + "module m;\n" + " wire w;\n" + "endmodule\n"}, + {"class cc ;\n" + "endclass:cc\n", + "class cc;\n" + "endclass : cc\n"}, +}; + +TEST(FormatterEndToEndTest, AutoInferAlignment) { + static constexpr FormatterTestCase kTestCases[] = { + {"", ""}, + {"\n", "\n"}, + {"class cc ;\n" + "endclass:cc\n", + "class cc;\n" + "endclass : cc\n"}, + + // module port declarations + {"module pd(\n" + "input wire foo,\n" + "output reg bar\n" + ");\n" + "endmodule:pd\n", + "module pd (\n" + " input wire foo,\n" // flush-left vs. align are similar enough, + " output reg bar\n" // so automatic policy will align. + ");\n" + "endmodule : pd\n"}, + {"module pd(\n" + "input foo_pkg::baz_t foo,\n" + "output reg bar\n" + ");\n" + "endmodule:pd\n", + "module pd (\n" + " input foo_pkg::baz_t foo,\n" // alignment would add too many spaces + " output reg bar\n" // so infer intent to flush-left. + ");\n" + "endmodule : pd\n"}, + {"module pd(\n" + "input foo_pkg::baz_t foo,\n" + "output reg bar\n" // user injects 4 excess spaces here ... + ");\n" + "endmodule:pd\n", + "module pd (\n" + " input foo_pkg::baz_t foo,\n" + " output reg bar\n" // ... and triggers alignment. + ");\n" + "endmodule : pd\n"}, + {"module pd(\n" + "`ifdef FAA\n" // inside preprocessing conditional + "input baaaz_t foo,\n" + "output reg bar\n" // user injects 4 excess spaces here ... + "`endif\n" + ");\n" + "endmodule:pd\n", + "module pd (\n" + "`ifdef FAA\n" + " input baaaz_t foo,\n" + " output reg bar\n" // ... and triggers alignment. + "`endif\n" + ");\n" + "endmodule : pd\n"}, + {"module pd(\n" + "`ifdef FAA\n" // inside preprocessing conditional + "input baaaz_t foo,\n" + "`else\n" + "output reg bar\n" // user injects 4 excess spaces here ... + "`endif\n" + ");\n" + "endmodule:pd\n", + "module pd (\n" + "`ifdef FAA\n" + " input baaaz_t foo,\n" // aligned + "`else\n" // aligned across preprocessing directives + " output reg bar\n" // ... and triggers alignment. + "`endif\n" + ");\n" + "endmodule : pd\n"}, + {"module pd(\n" + "input logic [31:0] bus,\n" + "input logic [7:0] bus2,\n" + "`ifdef FAA\n" // inside preprocessing conditional + "input baaaz_t foo,\n" + "`else\n" + "output reg bar,\n" // user injects 4 excess spaces here ... + "`endif\n" + "output out_t zout1,\n" + "output out_t zout2\n" + ");\n" + "endmodule:pd\n", + "module pd (\n" + " input logic [31:0] bus,\n" // treated as one large group + " input logic [ 7:0] bus2,\n" + "`ifdef FAA\n" + " input baaaz_t foo,\n" // aligned + "`else\n" // aligned across preprocessing directives + " output reg bar,\n" // ... and triggers alignment. + "`endif\n" + " output out_t zout1,\n" + " output out_t zout2\n" + ");\n" + "endmodule : pd\n"}, + {"module pd(\n" + "input logic [7:0] bus2,\n" + "`ifndef FAA\n" // inside preprocessing conditional + "input logic [31:0] bus,\n" + "input baaaz_t foo,\n" + "`elsif BLA\n" + "output reg bar,\n" // user injects 4 excess spaces here ... + "output out_t zout1,\n" + "`endif\n" + "output out_t zout2\n" + ");\n" + "endmodule:pd\n", + "module pd (\n" + " input logic [ 7:0] bus2,\n" + "`ifndef FAA\n" + " input logic [31:0] bus,\n" // treated as one large group + " input baaaz_t foo,\n" // aligned + "`elsif BLA\n" // aligned across preprocessing directives + " output reg bar,\n" // ... and triggers alignment. + " output out_t zout1,\n" + "`endif\n" + " output out_t zout2\n" + ");\n" + "endmodule : pd\n"}, + {// data declaration and net declaration in ports + "module m(\n" + "logic [x:y]a ,\n" // packed dimensions, induce alignment + "wire [pp:qq] [e:f]b\n" // packed dimensions, 2D + ") ;\n" + "endmodule\n", + "module m (\n" + " logic [ x:y] a,\n" + " wire [pp:qq][e:f] b\n" + ");\n" + "endmodule\n"}, + {// used-defined data declarations in ports + "module m(\n" + "a::bb [x:y]a ,\n" // packed dimensions, induce alignment + "c#(d,e) [pp:qq] [e:f]b\n" // packed dimensions, 2D + ") ;\n" + "endmodule\n", + "module m (\n" + " a::bb [ x:y] a,\n" + " c#(d, e) [pp:qq][e:f] b\n" + ");\n" + "endmodule\n"}, + + // named parameter arguments + {"module mm ;\n" + "foo #(\n" + ".a(a),\n" + ".bb(bb)\n" + ")bar( );\n" + "endmodule:mm\n", + "module mm;\n" + " foo #(\n" + " .a (a),\n" // align doesn't add too many spaces, so align + " .bb(bb)\n" + " ) bar ();\n" + "endmodule : mm\n"}, + {"module mm ;\n" + "foo #(\n" + ".a(a),\n" + ".bbcccc(bb)\n" + ")bar( );\n" + "endmodule:mm\n", + "module mm;\n" + " foo #(\n" + " .a(a),\n" // align would add too many spaces, so flush-left + " .bbcccc(bb)\n" + " ) bar ();\n" + "endmodule : mm\n"}, + {"module mm ;\n" + "foo #(\n" + ".a(a ),\n" // user manually triggers alignment with excess spaces + ".bbcccc(bb)\n" + ")bar( );\n" + "endmodule:mm\n", + "module mm;\n" + " foo #(\n" + " .a (a),\n" // induced alignment + " .bbcccc(bb)\n" + " ) bar ();\n" + "endmodule : mm\n"}, + {"module mm ;\n" + "foo #(\n" + "//c1\n" // with comments (indented but not aligned) + ".a(a ),\n" // user manually triggers alignment with excess spaces + "//c2\n" + ".bbcccc(bb)\n" + "//c3\n" + ")bar( );\n" + "endmodule:mm\n", + "module mm;\n" + " foo #(\n" + " //c1\n" + " .a (a),\n" // induced alignment + " //c2\n" + " .bbcccc(bb)\n" + " //c3\n" + " ) bar ();\n" + "endmodule : mm\n"}, + {"module mm ;\n" + "foo #(\n" + ".a( (1 +2)),\n" // excess spaces, testing extra parentheses + ".bbcccc((c*d)+(e*f))\n" + ")bar( );\n" + "endmodule:mm\n", + "module mm;\n" + " foo #(\n" + " .a ((1 + 2)),\n" // induced alignment + " .bbcccc((c * d) + (e * f))\n" + " ) bar ();\n" + "endmodule : mm\n"}, + + // named port connections + {"module mm ;\n" + "foo bar(\n" + ".a(a),\n" + ".bb(bb)\n" + ");\n" + "endmodule:mm\n", + "module mm;\n" + " foo bar (\n" + " .a (a),\n" // align doesn't add too many spaces, so align + " .bb(bb)\n" + " );\n" + "endmodule : mm\n"}, + {"module mm ;\n" + "foo bar(\n" + ".a(a),\n" + ".bbbbbb(bb)\n" + ");\n" + "endmodule:mm\n", + "module mm;\n" + " foo bar (\n" + " .a(a),\n" // align would add too many spaces, so flush-left + " .bbbbbb(bb)\n" + " );\n" + "endmodule : mm\n"}, + {"module mm ;\n" + "foo bar(\n" + ".a (a),\n" // user manually triggers alignment with excess spaces + ".bbbbbb(bb)\n" + ");\n" + "endmodule:mm\n", + "module mm;\n" + " foo bar (\n" + " .a (a),\n" // alignment fixed + " .bbbbbb(bb)\n" + " );\n" + "endmodule : mm\n"}, + + // net variable declarations + {"module nn;\n" + "wire wwwww;\n" + "logic lll;\n" + "endmodule : nn\n", + "module nn;\n" + " wire wwwww;\n" // alignment adds few spaces, so align + " logic lll;\n" + "endmodule : nn\n"}, + {"module nn;\n" + "wire wwwww;\n" + "foo_pkg::baz_t lll;\n" + "endmodule : nn\n", + "module nn;\n" + " wire wwwww;\n" // alignment adds too many spaces, so flush-left + " foo_pkg::baz_t lll;\n" + "endmodule : nn\n"}, + {"module nn;\n" + "wire wwwww;\n" // user injects spaces to trigger alignment + "foo_pkg::baz_t lll;\n" + "endmodule : nn\n", + "module nn;\n" + " wire wwwww;\n" // ... and gets alignment + " foo_pkg::baz_t lll;\n" + "endmodule : nn\n"}, + {// data/net declarations as generate items (conditional) + "module nn;\n" + "if (cc)begin:fff\n" + "wire wwwww;\n" + "logic lll;\n" + "end:fff\n" + "endmodule : nn\n", + "module nn;\n" + " if (cc) begin : fff\n" + " wire wwwww;\n" // alignment adds few spaces, so align + " logic lll;\n" + " end : fff\n" + "endmodule : nn\n"}, + + // continuous assignments + {"module m_assign;\n" + "assign foo = 1'b1;\n" // alignment adds few spaces, so align + "assign baar = 1'b0;\n" + "endmodule\n", + "module m_assign;\n" + " assign foo = 1'b1;\n" // aligned + " assign baar = 1'b0;\n" + "endmodule\n"}, + {"module m_assign;\n" + "assign foo = 1'b1;\n" // alignment adds too many spaces, so + // flush-left + "assign baaaaaar = 1'b0;\n" + "endmodule\n", + "module m_assign;\n" + " assign foo = 1'b1;\n" // flush-left + " assign baaaaaar = 1'b0;\n" + "endmodule\n"}, + {"module m_assign;\n" + "assign foo = 1'b1;\n" // induce alignment with excess spaces + "assign baaaaaar = 1'b0;\n" + "endmodule\n", + "module m_assign;\n" + " assign foo = 1'b1;\n" // aligned + " assign baaaaaar = 1'b0;\n" + "endmodule\n"}, + {// currently, does not assign across ifdefs + "module m_assign;\n" + "`ifdef FOO\n" + "assign foo = 1'b1;\n" // induce alignment with excess spaces + "assign baaaaaar = 1'b0;\n" + "`else\n" + "assign zooo = 2'b11;\n" + "assign yoo = 2'b00;\n" + "`endif\n" + "endmodule\n", + "module m_assign;\n" + "`ifdef FOO\n" + " assign foo = 1'b1;\n" // aligned + " assign baaaaaar = 1'b0;\n" + "`else\n" // aligned separately above/below + " assign zooo = 2'b11;\n" // aligned + " assign yoo = 2'b00;\n" // aligned + "`endif\n" + "endmodule\n"}, + {// mixed net declaration and continuous assignment, both groups aligned + "module m_assign;\n" + "wire wwwww;\n" // induce alignment + "foo_pkg::baz_t lll;\n" + "assign foo = 1'b1;\n" // induce alignment + "assign baaaaaar = 1'b0;\n" + "endmodule\n", + "module m_assign;\n" + " wire wwwww;\n" // aligned + " foo_pkg::baz_t lll;\n" + " assign foo = 1'b1;\n" // aligned + " assign baaaaaar = 1'b0;\n" + "endmodule\n"}, + {// continuous assignments as generate items (conditional) + "module m_assign;\n" + "if (xy) begin\n" + "assign foo = 1'b0;\n" // align: adds few spaces + "assign baaar = 1'b1;\n" + "end else begin\n" + "assign goo = 1'b1;\n" // induce alignment with excess spaces + "assign zaaaaaar = 1'b0;\n" + "end\n" + "endmodule\n", + "module m_assign;\n" + " if (xy) begin\n" + " assign foo = 1'b0;\n" // aligned + " assign baaar = 1'b1;\n" + " end else begin\n" + " assign goo = 1'b1;\n" // induce alignment with excess spaces + " assign zaaaaaar = 1'b0;\n" + " end\n" + "endmodule\n"}, + {// continuous assignments as generate items (loop) + "module m_assign;\n" + "for(genvar i=0; i<k; ++i ) begin\n" + "assign foo = 1'b0;\n" // align: adds few spaces + "assign baaar = 1'b1;\n" + "end\n" + "endmodule\n", + "module m_assign;\n" + " for (genvar i = 0; i < k; ++i) begin\n" + " assign foo = 1'b0;\n" // aligned + " assign baaar = 1'b1;\n" + " end\n" + "endmodule\n"}, + {// continuous assignments as generate items (case) + "module m_assign;\n" + "case (c)\n" + "jk:begin\n" + "assign foo = 1'b0;\n" // align: adds few spaces + "assign baaar = 1'b1;\n" + "end\n" + "endcase\n" + "endmodule\n", + "module m_assign;\n" + " case (c)\n" + " jk: begin\n" + " assign foo = 1'b0;\n" // aligned + " assign baaar = 1'b1;\n" + " end\n" + " endcase\n" + "endmodule\n"}, + {// continuous assignment with comment + "module m;\n" + "// comment1\n" + "assign aaaaa = (bbbbb != ccccc) &\n" + "// comment2\n" + "(ddddd | (eeeee & ffffff));\n" + "endmodule\n", + "module m;\n" + " // comment1\n" + " assign aaaaa = (bbbbb != ccccc) &\n" + " // comment2\n" + " (ddddd | (eeeee & ffffff));\n" + "endmodule\n"}, + + // net/variable assignments: blocking and nonblocking + {"module ma ;\n" + "initial begin\n" + "aa = b;\n" + "c = 1'b0;\n" + "end\n" + "endmodule\n", + "module ma;\n" + " initial begin\n" + " aa = b;\n" + " c = 1'b0;\n" // only one space to align + " end\n" + "endmodule\n"}, + {"function void fa ;\n" + "c = 1'b0;\n" + "aa = b;\n" + "endfunction\n", + "function void fa;\n" + " c = 1'b0;\n" // only one space to align + " aa = b;\n" + "endfunction\n"}, + {"task ta ; \n" + "aa = b;\n" + "c = 1'b0;\n" + "endtask\n", + "task ta;\n" + " aa = b;\n" + " c = 1'b0;\n" // only one space to align + "endtask\n"}, + {"module ma ;\n" + "always@( posedge clk) begin\n" + "aaa <= b;\n" + "c <= 1'b0;\n" + "end\n" + "endmodule\n", + "module ma;\n" + " always @(posedge clk) begin\n" + " aaa <= b;\n" + " c <= 1'b0;\n" // only two spaces to align + " end\n" + "endmodule\n"}, + {"function int fa ;\n" + "c <= 1'b0;\n" + "aa <= b;\n" + "return 0 ;\n" + "endfunction\n", + "function int fa;\n" + " c <= 1'b0;\n" // only one space to align + " aa <= b;\n" + " return 0;\n" + "endfunction\n"}, + {"task ta ; \n" + "$display (\"hello\" );\n" + "aa <= b;\n" + "c <= 1'b0;\n" + "endtask\n", + "task ta;\n" + " $display(\"hello\");\n" + " aa <= b;\n" + " c <= 1'b0;\n" // only one space to align + "endtask\n"}, + {// mixed blocking and nonblocking assignments + "module ma ;\n" + "always@( posedge clk) begin\n" + "aaaaa = b;\n" + "ccc = 1'b0;\n" + "aaa <= b;\n" + "c <= 1'b0;\n" + "end\n" + "endmodule\n", + "module ma;\n" + " always @(posedge clk) begin\n" + " aaaaa = b;\n" + " ccc = 1'b0;\n" // only two spaces to align + " aaa <= b;\n" + " c <= 1'b0;\n" // only two spaces to align (separate group) + " end\n" + "endmodule\n"}, + {"task ta ; \n" + "aa <= b;\n" + "c <= 1'b0;\n" + "$display (\"hello\" );\n" // separates above/below alignment groups + "zzaa <= b;\n" + "zzc <= 1'b0;\n" + "endtask\n", + "task ta;\n" + " aa <= b;\n" + " c <= 1'b0;\n" // only one space to align + " $display(\"hello\");\n" + " zzaa <= b;\n" + " zzc <= 1'b0;\n" // only one space to align + "endtask\n"}, + {"task ta ; \n" + "$display (\"hello\" );\n" + "aaaaa <= b;\n" + "c <= 1'b0;\n" // need too many spaces to align + "endtask\n", + "task ta;\n" + " $display(\"hello\");\n" + " aaaaa <= b;\n" + " c <= 1'b0;\n" // so keep flush-left + "endtask\n"}, + {"function void fa ; \n" + "$display (\"hello\" );\n" + "aaaaa = b;\n" + "c = 1'b0;\n" // need too many spaces to align + "endfunction\n", + "function void fa;\n" + " $display(\"hello\");\n" + " aaaaa = b;\n" + " c = 1'b0;\n" // so keep flush-left + "endfunction\n"}, + {"module ma ;\n" + "always@( posedge clk) begin\n" + "aaaxx <= b;\n" + "c <= 1'b0;\n" // need too many spaces to align + "end\n" + "endmodule\n", + "module ma;\n" + " always @(posedge clk) begin\n" + " aaaxx <= b;\n" + " c <= 1'b0;\n" // so keep flush-left + " end\n" + "endmodule\n"}, + {"module ma ;\n" + "always@( posedge clk) begin\n" + "aaaxx <= b ;\n" // inject 4 spaces to induce alignment + "c <= 1'b0;\n" + "end\n" + "endmodule\n", + "module ma;\n" + " always @(posedge clk) begin\n" + " aaaxx <= b;\n" + " c <= 1'b0;\n" // induced alignment + " end\n" + "endmodule\n"}, + {"module ma ;\n" + "always@( posedge clk) begin\n" + "aaaxx <= b ;\n" // inject 4 spaces to induce alignment + "//comment\n" + "c <= 1'b0;\n" + "end\n" + "endmodule\n", + "module ma;\n" + " always @(posedge clk) begin\n" + " aaaxx <= b;\n" + " //comment\n" // ignored within alignment group + " c <= 1'b0;\n" // induced alignment + " end\n" + "endmodule\n"}, + + // local variable declarations as statements + {"task tt ;\n" + "int foo;\n" // only 2 spaces needed to align + "bar_t baz;\n" + "endtask\n", + "task tt;\n" + " int foo;\n" // aligned + " bar_t baz;\n" + "endtask\n"}, + {"function ff ;\n" + "bar_t baz;\n" + "int foo;\n" // only 2 spaces needed to align + "endfunction\n", + "function ff;\n" + " bar_t baz;\n" + " int foo;\n" // aligned + "endfunction\n"}, + {"task tt ;\n" + "int foo;\n" // too many spaces needed to align + "baaaar_t baz;\n" + "endtask\n", + "task tt;\n" + " int foo;\n" // so flush-left + " baaaar_t baz;\n" + "endtask\n"}, + {"function ff ;\n" + "baaaar_t baz;\n" + "int foo;\n" // too many spaces needed to align + "endfunction\n", + "function ff;\n" + " baaaar_t baz;\n" + " int foo;\n" // so flush-left + "endfunction\n"}, + {"task tt ;\n" + "int foo;\n" // injected spaces to induce alignment + "baaaar_t baz;\n" + "endtask\n", + "task tt;\n" + " int foo;\n" // aligned + " baaaar_t baz;\n" + "endtask\n"}, + {"function ff ;\n" + "baaaar_t baz ;\n" // injected spaces to induce alignment + "int foo;\n" + "endfunction\n", + "function ff;\n" + " baaaar_t baz;\n" + " int foo;\n" // so aligned + "endfunction\n"}, + + // formal parameters + {"module pp #(\n" + "int W,\n" + "type T\n" + ") ();\n" + "endmodule : pp\n", + "module pp #(\n" + " int W,\n" // alignment adds few spaces, so do it + " type T\n" + ") ();\n" + "endmodule : pp\n"}, + {"module pp #(\n" + "int W,\n" + "int[xx:yy] T\n" + ") ();\n" + "endmodule : pp\n", + "module pp #(\n" + " int W,\n" // alignment adds many spaces, so flush-left + " int [xx:yy] T\n" + ") ();\n" + "endmodule : pp\n"}, + {"module pp #(\n" + "int W,\n" + "int[xx:yy] T\n" // user injected spaces intentionally + ") ();\n" + "endmodule : pp\n", + "module pp #(\n" + " int W,\n" // ... trigger alignment + " int [xx:yy] T\n" + ") ();\n" + "endmodule : pp\n"}, + + // class member variables + {"class cc ;\n" + "int my_int;\n" + "bar_t my_bar;\n" + "endclass:cc\n", + "class cc;\n" + " int my_int;\n" // align doesn't add too many spaces, so align + " bar_t my_bar;\n" + "endclass : cc\n"}, + {"class cc ;\n" + "int my_int;\n" + "foo_pkg::bar_t my_bar;\n" + "endclass:cc\n", + "class cc;\n" + " int my_int;\n" // align would add too many spaces, so flush-left + " foo_pkg::bar_t my_bar;\n" + "endclass : cc\n"}, + {"class cc ;\n" + "int my_int;\n" // intentional excessive spaces, trigger alignment + "foo_pkg::bar_t my_bar;\n" + "endclass:cc\n", + "class cc;\n" + " int my_int;\n" + " foo_pkg::bar_t my_bar;\n" + "endclass : cc\n"}, + {"class cc ;\n" + "int my_int;\n" // unable to infer user's intent, so preserve + "foo_pkg::bar_t my_bar;\n" + "endclass:cc\n", + "class cc;\n" + " int my_int;\n" // ... but still indent + " foo_pkg::bar_t my_bar;\n" + "endclass : cc\n"}, + + // case item test cases + {// small difference between flush-left and align, so align + "function f; case (x)kZZZZ :if( b )break; default :return 2;" + "endcase endfunction\n", + "function f;\n" + " case (x)\n" + " kZZZZ: if (b) break;\n" // aligned, only adds 2 spaces + " default: return 2;\n" + " endcase\n" + "endfunction\n"}, + {// small error relative to flush-left, so flush-left + "function f; case (x)kZ :if( b )break; default :return 2;" + "endcase endfunction\n", + "function f;\n" + " case (x)\n" + " kZ: if (b) break;\n" // flush-left + " default: return 2;\n" + " endcase\n" + "endfunction\n"}, + {// intentional spacing error (delta=4) induces alignment + "function f; case (x)kZ :if( b )break; default :return 2;" + "endcase endfunction\n", + "function f;\n" + " case (x)\n" + " kZ: if (b) break;\n" + " default: return 2;\n" + " endcase\n" + "endfunction\n"}, + {// induced alignment, with ignored comments + "function f; case (x)kZ :if( b )break; \n//c1\n kXX: g = f; " + "\n//c2\ndefault :return 2;" + "endcase endfunction\n", + "function f;\n" + " case (x)\n" + " kZ: if (b) break;\n" + " //c1\n" + " kXX: g = f;\n" + " //c2\n" + " default: return 2;\n" + " endcase\n" + "endfunction\n"}, + {// induced alignment, ignore multiline case item in the middle + "function f; case (x)" + "kZ :if( b )break; " + "kYY :return 2;" // excess spaces induce alignment + " kXXXXXXXXX: begin end" // multi-line, ignored + " kWWWWW: cc = 23;\n" + " kVVV: cd = 24;\n" + "endcase endfunction\n", + "function f;\n" + " case (x)\n" + " kZ: if (b) break;\n" + " kYY: return 2;\n" + " kXXXXXXXXX: begin\n" // separates above/below groups + " end\n" + " kWWWWW: cc = 23;\n" + " kVVV: cd = 24;\n" // aligned + " endcase\n" + "endfunction\n"}, + {// induced alignment, ignore multiline case item in the middle + "function f; case (x)" + "kZ :if( b )break; " + "kYY :return 2;" // excess spaces induce alignment + " kXXXXXXXXX: if(w)begin end" // multi-line, ignored + " kWWWWW: cc = 23;\n" + " kVVV: cd = 24;\n" + "endcase endfunction\n", + "function f;\n" + " case (x)\n" + " kZ: if (b) break;\n" + " kYY: return 2;\n" + " kXXXXXXXXX:\n" // TODO(fangism): allow this to merge with if() + // else indent the following two lines + " if (w) begin\n" // separates above/below groups + " end\n" + " kWWWWW: cc = 23;\n" + " kVVV: cd = 24;\n" // aligned + " endcase\n" + "endfunction\n"}, + {// induced alignment, ignore multiline case item in the middle + "task t; case (x)" + "kZ :if( b )break; " + "kYY :return 2;" // excess spaces induce alignment + " kXXXXXXXXX: fork join" // multi-line, ignored + " kWWWWW: cc = 23;\n" + " kVVV: cd = 24;\n" + "endcase endtask\n", + "task t;\n" + " case (x)\n" + " kZ: if (b) break;\n" + " kYY: return 2;\n" + " kXXXXXXXXX:\n" // TODO(fangism): allow this to merge with fork + // else indent the following two lines + " fork\n" // separates above/below groups + " join\n" + " kWWWWW: cc = 23;\n" + " kVVV: cd = 24;\n" // aligned + " endcase\n" + "endtask\n"}, + {// case-inside: small difference between flush-left and align, so align + "function f; case (x)inside [0:3] :yy=zzz; [4:11] :yy=zz;" + "endcase endfunction\n", + "function f;\n" + " case (x) inside\n" + " [0 : 3]: yy = zzz;\n" // aligned, only adds 1 spaces + " [4 : 11]: yy = zz;\n" + " endcase\n" + "endfunction\n"}, + {// case-inside: align with comments + "function f; case (x)inside \n//c1\n[0:3] :yy=zzz;\n//c2\n" + " [4:11] :yy=zz;\n//c3\n" + "endcase endfunction\n", + "function f;\n" + " case (x) inside\n" + " //c1\n" + " [0 : 3]: yy = zzz;\n" // aligned, only adds 1 spaces + " //c2\n" + " [4 : 11]: yy = zz;\n" + " //c3\n" + " endcase\n" + "endfunction\n"}, + {// case-inside: flush left + "function f; case (x)inside [0:3] :yy=zzz; [4:999999] :yy=zz;" + "endcase endfunction\n", + "function f;\n" + " case (x) inside\n" + " [0 : 3]: yy = zzz;\n" // flush-left + " [4 : 999999]: yy = zz;\n" + " endcase\n" + "endfunction\n"}, + {// case-inside: induce alignment + "function f; case (x)inside [0:3 ] :yy=zzz; [4:999999] :yy=zz;" + "endcase endfunction\n", + "function f;\n" + " case (x) inside\n" + " [0 : 3]: yy = zzz;\n" // aligned + " [4 : 999999]: yy = zz;\n" + " endcase\n" + "endfunction\n"}, + {// case-generate: align would add few spaces, so align + "module mc ; case (x)kZ : gg h(); kXYY :j kk();" + "endcase endmodule\n", + "module mc;\n" + " case (x)\n" + " kZ: gg h ();\n" // align + " kXYY: j kk ();\n" + " endcase\n" + "endmodule\n"}, + {// case-generate + comment: align would add few spaces, so align + "module mc ; case (x)kZ : gg h(); \n//c1\n kXYY :j kk();" + "endcase endmodule\n", + "module mc;\n" + " case (x)\n" + " kZ: gg h ();\n" // align + " //c1\n" + " kXYY: j kk ();\n" + " endcase\n" + "endmodule\n"}, + {// case-generate: align would add too many space, so flush-left + "module mc ; case (x)kZ : gg h(); kXYYYY :j kk();" + "endcase endmodule\n", + "module mc;\n" + " case (x)\n" + " kZ: gg h ();\n" // flush-left + " kXYYYY: j kk ();\n" + " endcase\n" + "endmodule\n"}, + {// case-generate: inject spaces to induce alignment + "module mc ; case (x)kZ : gg h(); kXYYYY : j kk();" + "endcase endmodule\n", + "module mc;\n" + " case (x)\n" + " kZ: gg h ();\n" // align + " kXYYYY: j kk ();\n" + " endcase\n" + "endmodule\n"}, + {// randcase: align (small difference from flush-left) + "task trc ;randcase 10: x = 1; 1: x = 3; endcase endtask", + "task trc;\n" + " randcase\n" + " 10: x = 1;\n" + " 1: x = 3;\n" // aligned + " endcase\n" + "endtask\n"}, + {// randcase: inferred flush-left + "task trc ;randcase 10000: x = 1; 1: x = 3; endcase endtask", + "task trc;\n" + " randcase\n" + " 10000: x = 1;\n" + " 1: x = 3;\n" + " endcase\n" + "endtask\n"}, + {// randcase: induce alignment + "task trc ;randcase 10000: x = 1 ; 1: x = 3; endcase endtask", + "task trc;\n" + " randcase\n" + " 10000: x = 1;\n" + " 1: x = 3;\n" // aligned + " endcase\n" + "endtask\n"}, + + // distributions + {"class foo;\n" + "constraint c { " + "timer_enable dist {\n" + "8'hfe := 9 , \n" + "12'hfff := 1 }; " + "} endclass\n", + "class foo;\n" + " constraint c {\n" + " timer_enable dist {\n" + " 8'hfe := 9,\n" // only two spaces needed to align + " 12'hfff := 1\n" // so align + " };\n" + " }\n" + "endclass\n"}, + {"class foo;\n" + "constraint c { " + "timer_enable dist {\n" + "[ 8'h0 : 8'hfe ] :/ 9 , \n" + "8'hff :/ 1 }; " // takes many spaces to align this, so... + "} endclass\n", + "class foo;\n" + " constraint c {\n" + " timer_enable dist {\n" + " [8'h0 : 8'hfe] :/ 9,\n" + " 8'hff :/ 1\n" // flush-left + " };\n" + " }\n" + "endclass\n"}, + {"class foo;\n" + "constraint c { " + "timer_enable dist {\n" + "[ 8'h0 : 8'hfe ] :/ 9 , \n" + "8'hff :/ 1 }; " // inject excess spaces to trigger alignment + "} endclass\n", + "class foo;\n" + " constraint c {\n" + " timer_enable dist {\n" + " [8'h0 : 8'hfe] :/ 9,\n" + " 8'hff :/ 1\n" // aligned + " };\n" + " }\n" + "endclass\n"}, + {"class foo;\n" + "constraint c { " + "timer_enable dist {\n" + "//comment1\n" + "[ 8'h0 : 8'hfe ] :/ 9 , \n" + "//comment2\n" + "8'hff :/ 1 \n" + "//comment3\n" + "}; " // inject excess spaces to trigger alignment + "} endclass\n", + "class foo;\n" + " constraint c {\n" + " timer_enable dist {\n" + " //comment1\n" + " [8'h0 : 8'hfe] :/ 9,\n" + " //comment2\n" // align across comment + " 8'hff :/ 1\n" // aligned + " //comment3\n" + " };\n" + " }\n" + "endclass\n"}, + {"module foo ();\n" + " always @(posedge bar) begin\n" + " if (1==1) begin\n" + " ham();\n" + " end else if (2==2) begin\n" + " jam();\n" + " end else begin\n" + " spam();\n" + " end\n" + " end\n" + "endmodule\n", + "module foo ();\n" + " always @(posedge bar) begin\n" + " if (1 == 1) begin\n" + " ham();\n" + " end else if (2 == 2) begin\n" + " jam();\n" + " end else begin\n" + " spam();\n" + " end\n" + " end\n" + "endmodule\n"}, + }; + // Use a fixed style. + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + // Override some settings to test auto-inferred alignment. + style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kInferUserIntent); + + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} // NOLINT(readability/fn_size) + +static constexpr FormatterTestCase kFormatterWideTestCases[] = { + // specify blocks + {"module specify_tests ;\n" + "specify\n" // empty list + "endspecify\n" + "endmodule", + "module specify_tests;\n" + " specify\n" + " endspecify\n" + "endmodule\n"}, + {"module specify_tests ;\n" + "specify\n" + "$recrem (posedge R, posedge C,\n" + "t1, t2);\n" + "endspecify\n" + "endmodule", + "module specify_tests;\n" + " specify\n" + " $recrem(posedge R, posedge C, t1, t2);\n" + " endspecify\n" + "endmodule\n"}, + {"module specify_tests ;\n" + "specify\n" + "// TODO: add this\n" + "endspecify \n" + "endmodule", + "module specify_tests;\n" + " specify\n" + " // TODO: add this\n" + " endspecify\n" + "endmodule\n"}, + {"module specify_tests ;\n" + "specify \n" + " //c1\n" + "$setup ( posedge A, posedge B,\n" + "t1);//c2\n" + " //c3\n" + "$hold ( posedge B , posedge A,t2); //c4\n" + "\t//c5\n" + "endspecify\n" + "endmodule", + "module specify_tests;\n" + " specify\n" + " //c1\n" + " $setup(posedge A, posedge B, t1); //c2\n" + " //c3\n" + " $hold(posedge B, posedge A, t2); //c4\n" + " //c5\n" + " endspecify\n" + "endmodule\n"}, + {"module specify_tests ;\n" + "specify \n" + "$setup ( posedge A, posedge B,\n" + "t1);\n" + "$hold ( posedge B , posedge A,t2);\n" + "endspecify\n" + "endmodule", + "module specify_tests;\n" + " specify\n" + " $setup(posedge A, posedge B, t1);\n" + " $hold(posedge B, posedge A, t2);\n" + " endspecify\n" + "endmodule\n"}, + {"module specify_tests ;\n" + "specify \n" + " `ifdef CCC\n" + "$setup ( posedge A, posedge B,\n" + "t1);\n" + " `else\n" + "$hold ( posedge B , posedge A,t2); \n" + "\t`endif\n" + "endspecify\n" + "endmodule", + "module specify_tests;\n" + " specify\n" + "`ifdef CCC\n" + " $setup(posedge A, posedge B, t1);\n" + "`else\n" + " $hold(posedge B, posedge A, t2);\n" + "`endif\n" + " endspecify\n" + "endmodule\n"}, +}; + +// These tests just need a larger column limit to fit on one line. +TEST(FormatterEndToEndTest, VerilogFormatWideTest) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 60; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + for (const auto &test_case : kFormatterWideTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, DisableModulePortDeclarations) { + static constexpr FormatterTestCase kTestCases[] = { + {"", ""}, + {"\n", "\n"}, + {"\n\n", "\n\n"}, + {"module m ;\t\n" + " endmodule\n", + "module m;\n" + "endmodule\n"}, + {"module m( ) ;\n" + " endmodule\n", + "module m ();\n" // empty ports formatted compactly + "endmodule\n"}, + {// for a single port, the alignment handler doesn't even consider it a + // group so it falls back to standard flush-left behavior. + "module m ( input clk )\t;\n" + " endmodule\n", + "module m (\n" + " input clk\n" + ");\n" + "endmodule\n"}, + {// example with two ports + "module m (\n" + "input clk,\n" + "output bar\n" + ")\t;\n" + " endmodule\n", + "module m (\n" + " input clk,\n" // indented, but internal pre-existing spacing + // preserved + " output bar\n" + ");\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.port_declarations_alignment = verible::AlignmentPolicy::kPreserve; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, DisableModuleInstantiations) { + static constexpr FormatterTestCase kTestCases[] = { + {"", ""}, + {"\n", "\n"}, + {"\n\n", "\n\n"}, + {"module m ;\t\n" + " endmodule\n", + "module m;\n" + "endmodule\n"}, + {"module m ;\t\n" + "foo bar();" + " endmodule\n", + "module m;\n" + " foo bar ();\n" // indentation still takes effect + "endmodule\n"}, + {"module m ;\t\n" + "logic xyz;" + "wire\tabc;" + " endmodule\n", + "module m;\n" + " logic xyz;\n" // indentation still takes effect + " wire abc;\n" // aligned too + "endmodule\n"}, + {" function f ;\t\n" + " endfunction\n", + "function f;\n" + "endfunction\n"}, + {" function f ;\t" + "foo bar,baz; " + " endfunction\n", + "function f;\n" + " foo bar, baz;\n" + "endfunction\n"}, + {" task t ;\t" + "foo bar,baz; " + " endtask\n", + "task t;\n" + " foo bar, baz;\n" + "endtask\n"}, + {"module m ;\t\n" + "foo bar( .baz(baz) );" + " endmodule\n", + "module m;\n" + " foo bar (.baz(baz));\n" // indentation still takes effect + "endmodule\n"}, + {"module m ;\t\n" + "foo bar(\n" + " .baz (baz ),\n" // example of user-manual alignment + " .blaaa(blaaa)\n" + ");" + " endmodule\n", + "module m;\n" + " foo bar (\n" // indentation still takes effect + " .baz (baz ),\n" // named port connections preserved + " .blaaa(blaaa)\n" // named port connections preserved + " );\n" // this indentation is fixed + "endmodule\n"}, + {"module m ;\t\n" + "foo #( .baz(baz) ) bar();" // named parameters + " endmodule\n", + "module m;\n" + " foo #(.baz(baz)) bar ();\n" // indentation still takes effect + "endmodule\n"}, + {"module m ;\t\n" + "foo #(\n" + " .baz (baz ),\n" // example of user-manual alignment + " .blaaa(blaaa)\n" + ") bar( );" + " endmodule\n", + "module m;\n" + " foo #(\n" // indentation still takes effect + " .baz (baz ),\n" // named parameter arguments preserved + " .blaaa(blaaa)\n" // named parameter arguments preserved + " ) bar ();\n" // this indentation is fixed + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + // Testing preservation of spaces + style.named_parameter_alignment = AlignmentPolicy::kPreserve; + style.named_port_alignment = AlignmentPolicy::kPreserve; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, DisableTryWrapLongLines) { + static constexpr FormatterTestCase kTestCases[] = { + {"", ""}, + {"\n", "\n"}, + {"\n\n", "\n\n"}, + {"module m ;\t\n" + " endmodule\n", + "module m;\n" + "endmodule\n"}, + {"module m( ) ;\n" + " endmodule\n", + "module m ();\n" + "endmodule\n"}, + {"module m( ) ;\n" + "initial assign a = b;\n" + " endmodule\n", + "module m ();\n" + " initial assign a = b;\n" + "endmodule\n"}, + {"module m( ) ;\n" + "initial assign a = {never +gonna +give +you +up,\n" + "never + gonna +Let +you +down};\n" + " endmodule\n", + "module m ();\n" + " initial\n" + " assign a = {\n" + " never + gonna + give + you + up,\n" + " never + gonna + Let + you + down\n" + " };\n" + "endmodule\n"}, + {"module m( ) ;\n" + "initial assign a = {never +gonna +give +you +up+\n" // over 40 columns, + // give up + "never + gonna +Let +you +down};\n" + " endmodule\n", + "module m ();\n" + " initial\n" + " assign a = {\n" + " never +gonna +give +you +up+\n" // indented properly, but + "never + gonna +Let +you +down\n" // preserved original + " };\n" + "endmodule\n"}, + {// The if-header is a single leaf partition, and does not fit, + // so its original spacing should be preserved. + // We deliberately insert weird spacing to show that it is preserved. + "function f;\n" + "if ((xxx.aaaa >= bbbbbbbbbbbbbbb) &&\n" + " ((ccc.ddd + eee.ffffff * g) <=\n" + " (hhhhhhhhhhhhhhh+iiiiiiiiiiiiiiiiiiii))) begin\n" + "end\n" + "endfunction\n", + "function f;\n" + " if ((xxx.aaaa >= bbbbbbbbbbbbbbb) &&\n" // indentation fixed + " ((ccc.ddd + eee.ffffff * g) <=\n" + " (hhhhhhhhhhhhhhh+iiiiiiiiiiiiiiiiiiii))) begin\n" + " end\n" // indentation fixed + "endfunction\n"}, + + // Make sure indentation still works with wrapping disabled, + // and leaf partitions fit on one line. + {"function void f();\n" + "for (int i = N; i > 0; i--) begin\n" + "end\n" + "endfunction\n", + "function void f();\n" + " for (int i = N; i > 0; i--) begin\n" + " end\n" + "endfunction\n"}, + {"function void f();" + "if(i > 0 ) begin end " + "endfunction", + "function void f();\n" + " if (i > 0) begin\n" + " end\n" + "endfunction\n"}, + {"function void f();" // newlines absent from input + "for (int i=N; i>0; i--) begin end " + "endfunction", + "function void f();\n" + " for (int i = N; i > 0; i--) begin\n" // spacing corrected + " end\n" + "endfunction\n"}, + {"module m( );\n" + " always_ff @ ( posedge ( clk ) ) begin\n" + "out <= rst_clk ? 0 : in ;\n" + "end\n" + "endmodule : simple\n", + "module m ();\n" + " always_ff @(posedge (clk)) begin\n" + " out <= rst_clk ? 0 : in;\n" + " end\n" + "endmodule : simple\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.try_wrap_long_lines = false; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, ModulePortDeclarationsIndentNotWrap) { + static constexpr FormatterTestCase kTestCases[] = { + {"", ""}, + {"\n", "\n"}, + {"\n\n", "\n\n"}, + {"module m ;\t\n" + " endmodule\n", + "module m;\n" + "endmodule\n"}, + {"module m( ) ;\n" + " endmodule\n", + "module m ();\n" // empty ports formatted compactly + "endmodule\n"}, + {// single port example + "module m ( input clk )\t;\n" + " endmodule\n", + "module m (\n" + " input clk\n" // 2 spaces + ");\n" + "endmodule\n"}, + {// example with two ports + "module m (\n" + "input clk,\n" + "output bar\n" + ")\t;\n" + " endmodule\n", + "module m (\n" + " input clk,\n" // indented 2 spaces, and aligned + " output bar\n" + ");\n" + "endmodule\n"}, + {// interface example + "interface handshake (\n" + "wire req,\n" + "wire ack\n" + ")\t;\n" + " endinterface\n", + "interface handshake (\n" + " wire req,\n" // indented 2 spaces + " wire ack\n" + ");\n" + "endinterface\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + // Indent 2 spaces instead of wrapping 4 spaces. + style.port_declarations_indentation = IndentationStyle::kIndent; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, NamedPortConnectionsIndentNotWrap) { + static constexpr FormatterTestCase kTestCases[] = { + {"", ""}, + {"\n", "\n"}, + {"\n\n", "\n\n"}, + {"module m ;\t\n" + " endmodule\n", + "module m;\n" + "endmodule\n"}, + {"module m( ) ;\n" + " endmodule\n", + "module m ();\n" // empty ports formatted compactly + "endmodule\n"}, + {// single port example + "module m ;\n" + "foo bar( .clk( clk ) )\t;\n" + " endmodule\n", + "module m;\n" + " foo bar (.clk(clk));\n" + "endmodule\n"}, + {// two port example + "module m ;\n" + "foo bar( .clk2( clk ),.data (data) )\t;\n" + " endmodule\n", + "module m;\n" + " foo bar (\n" + " .clk2(clk),\n" // indent only +2 spaces + " .data(data)\n" + " );\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + // Indent 2 spaces instead of wrapping 4 spaces. + style.named_port_indentation = IndentationStyle::kIndent; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, WrapEndElseStatements) { + static constexpr FormatterTestCase kTestCases[] = { + {"module foo ();\n" + " always @(posedge bar) begin\n" + " if (1==1) begin\n" + " ham();\n" + " end else if (2==2) begin\n" + " jam();\n" + " end else begin\n" + " spam();\n" + " end\n" + " end\n" + "endmodule\n", + "module foo ();\n" + " always @(posedge bar) begin\n" + " if (1 == 1) begin\n" + " ham();\n" + " end\n" + " else if (2 == 2) begin\n" + " jam();\n" + " end\n" + " else begin\n" + " spam();\n" + " end\n" + " end\n" + "endmodule\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.wrap_end_else_clauses = true; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, FormalParametersIndentNotWrap) { + static constexpr FormatterTestCase kTestCases[] = { + {"", ""}, + {"\n", "\n"}, + {"\n\n", "\n\n"}, + {"module m ;\t\n" + " endmodule\n", + "module m;\n" + "endmodule\n"}, + {"module m #( ) ;\n" // empty parameters + " endmodule\n", + "module m #();\n" + "endmodule\n"}, + {// single parameter example + "module m #( int W = 2)\t;\n" + " endmodule\n", + "module m #(\n" + " int W = 2\n" // indented 2 spaces + ");\n" + "endmodule\n"}, + {// module with two parameters + "module m #(\n" + "int W = 2,\n" + "int L = 4\n" + ")\t;\n" + " endmodule\n", + "module m #(\n" + " int W = 2,\n" // indented 2 spaces + " int L = 4\n" + ");\n" + "endmodule\n"}, + {// interface with two parameters + "interface m #(\n" + "int W = 2,\n" + "int L = 4\n" + ")\t;\n" + " endinterface\n", + "interface m #(\n" + " int W = 2,\n" // indented 2 spaces + " int L = 4\n" + ");\n" + "endinterface\n"}, + {// class with two parameters + "class c #(\n" + "int W = 2,\n" + "int L = 4\n" + ")\t;\n" + " endclass\n", + "class c #(\n" + " int W = 2,\n" // indented 2 spaces + " int L = 4\n" + ");\n" + "endclass\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + // Indent 2 spaces instead of wrapping 4 spaces. + style.formal_parameters_indentation = IndentationStyle::kIndent; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, NamedParametersIndentNotWrap) { + static constexpr FormatterTestCase kTestCases[] = { + {"", ""}, + {"\n", "\n"}, + {"\n\n", "\n\n"}, + {"module m ;\t\n" + " endmodule\n", + "module m;\n" + "endmodule\n"}, + {"module m #( ) ;\n" // empty parameters + " endmodule\n", + "module m #();\n" + "endmodule\n"}, + {"module m ;\t\n" + " foo #()bar();\n" + " endmodule\n", + "module m;\n" + " foo #() bar ();\n" + "endmodule\n"}, + {// one named parameter + "module m ;\n" + "foo #(.W(1)) bar();\n" + " endmodule\n", + "module m;\n" + " foo #(.W(1)) bar ();\n" + "endmodule\n"}, + {// two named parameters + "module m ;\n" + "foo #(.W(1), .L(2)) bar();\n" + " endmodule\n", + "module m;\n" + " foo #(\n" + " .W(1),\n" // indent +2 spaces only + " .L(2)\n" + " ) bar ();\n" + "endmodule\n"}, + {// class data member with two parameters + "class c ;\n" + " foo_pkg::bar_t#(\n" + ".W(2),.L(4)" + ") baz;\n" + " endclass\n", + "class c;\n" + " foo_pkg::bar_t #(\n" + " .W(2),\n" // indent +2 spaces only + " .L(4)\n" + " ) baz;\n" + "endclass\n"}, + {// typedef with two parameters + "typedef \n" + " foo_pkg::bar_t #(" + ".W(2),.L(4)" + ") baz;\n", + "typedef foo_pkg::bar_t#(\n" + " .W(2),\n" // indent +2 spaces only + " .L(4)\n" + ") baz;\n"}, + }; + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + // Indent 2 spaces instead of wrapping 4 spaces. + style.named_parameter_indentation = IndentationStyle::kIndent; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +struct SelectLinesTestCase { + std::string_view input; + LineNumberSet lines; // explicit set of lines to enable formatting + std::string_view expected; +}; + +// Tests that formatter honors selected line numbers. +TEST(FormatterEndToEndTest, SelectLines) { + const SelectLinesTestCase kTestCases[] = { + {"", {}, ""}, + {"", {{1, 2}}, ""}, + {// expect all three lines for format + " parameter int foo_line1 = 0 ;\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n", + {}, + "parameter int foo_line1 = 0;\n" + "parameter int foo_line2 = 0;\n" + "parameter int foo_line3 = 0;\n"}, + {// expect only one line to format + " parameter int foo_line1 = 0 ;\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n", + {{1, 2}}, + "parameter int foo_line1 = 0;\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n"}, + {// expect only one line to format + " parameter int foo_line1 = 0 ;\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n", + {{2, 3}}, + " parameter int foo_line1 = 0 ;\n" + "parameter int foo_line2 = 0;\n" + " parameter int foo_line3 = 0 ;\n"}, + {// expect only one line to format + " parameter int foo_line1 = 0 ;\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n", + {{3, 4}}, + " parameter int foo_line1 = 0 ;\n" + " parameter int foo_line2 = 0 ;\n" + "parameter int foo_line3 = 0;\n"}, + {// expect to format two lines + " parameter int foo_line1 = 0 ;\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n", + {{1, 3}}, + "parameter int foo_line1 = 0;\n" + "parameter int foo_line2 = 0;\n" + " parameter int foo_line3 = 0 ;\n"}, + {// expect to format two lines + " parameter int foo_line1 = 0 ;\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n", + {{2, 4}}, + " parameter int foo_line1 = 0 ;\n" + "parameter int foo_line2 = 0;\n" + "parameter int foo_line3 = 0;\n"}, + {// expect to format two lines + " parameter int foo_line1 = 0 ;\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n", + {{1, 2}, {3, 4}}, + "parameter int foo_line1 = 0;\n" + " parameter int foo_line2 = 0 ;\n" + "parameter int foo_line3 = 0;\n"}, + {// expect to format all lines + " parameter int foo_line1 = 0 ;\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n", + {{1, 4}}, + "parameter int foo_line1 = 0;\n" + "parameter int foo_line2 = 0;\n" + "parameter int foo_line3 = 0;\n"}, + {// expect to format no lines (line numbers out of bounds) + " parameter int foo_line1 = 0 ;\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n", + {{4, 6}}, + " parameter int foo_line1 = 0 ;\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n"}, + {// expect to format all lines + "// verilog_format: on\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n" + " parameter int foo_line4 = 0 ;\n", + {}, + "// verilog_format: on\n" + "parameter int foo_line2 = 0;\n" + "parameter int foo_line3 = 0;\n" + "parameter int foo_line4 = 0;\n"}, + {// expect to format no lines + "// verilog_format: off\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n" + " parameter int foo_line4 = 0 ;\n", + {}, + "// verilog_format: off\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n" + " parameter int foo_line4 = 0 ;\n"}, + {// expect to format some lines + "// verilog_format: on\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n" + " parameter int foo_line4 = 0 ;\n", + {{3, 5}}, + "// verilog_format: on\n" + " parameter int foo_line2 = 0 ;\n" + "parameter int foo_line3 = 0;\n" // disable lines 3,4 + "parameter int foo_line4 = 0;\n"}, + {// enable all lines, but respect format-off + " parameter int foo_line1 = 0 ;\n" + " parameter int foo_line2 = 0 ;\n" + "// verilog_format: off\n" + " parameter int foo_line4 = 0 ;\n", + {{1, 5}}, + "parameter int foo_line1 = 0;\n" + "parameter int foo_line2 = 0;\n" + "// verilog_format: off\n" + " parameter int foo_line4 = 0 ;\n"}, + {// enable all lines, but respect format-off + " parameter int foo_line1 = 0 ;\n" + "// verilog_format: off\n" + " parameter int foo_line3 = 0 ;\n" + "// verilog_format: on\n" + " parameter int foo_line5 = 0 ;\n", + {{1, 6}}, + "parameter int foo_line1 = 0;\n" + "// verilog_format: off\n" + " parameter int foo_line3 = 0 ;\n" + "// verilog_format: on\n" + "parameter int foo_line5 = 0;\n"}, + {// enable all lines, but respect format-off + "// verilog_format: off\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n" + "// verilog_format: on\n" + " parameter int foo_line5 = 0 ;\n", + {{1, 6}}, + "// verilog_format: off\n" + " parameter int foo_line2 = 0 ;\n" + " parameter int foo_line3 = 0 ;\n" + "// verilog_format: on\n" + "parameter int foo_line5 = 0;\n"}, + {"module m;\n" + " if (foo) begin:l1\n" + " if (foo) begin:l2\n" + " always_comb\n" // normally this line and next would fit together + " d<=#1ps x_lat\t;\n" // only format this line, 5 + " end : l2\n" + " end : l1\n" + "endmodule\n", + {{5, 6}}, + "module m;\n" + " if (foo) begin:l1\n" + " if (foo) begin:l2\n" + " always_comb\n" // incremental mode prevents joining next line + " d <= #1ps x_lat;\n" // only this line changed + " end : l2\n" + " end : l1\n" + "endmodule\n"}, + + // Next three test cases: one whole-file, two incremental + {"module m(\n" + " input wire f,\n" + " input foo::bar ggg\n" + ");\n" + "endmodule:m\n", + {}, // format all lines + "module m (\n" + " input wire f,\n" + " input foo::bar ggg\n" + ");\n" + "endmodule : m\n"}, + {"module m(\n" + " input wire f,\n" + " input foo::bar ggg\n" // "new line", formatted incrementally + ");\n" + "endmodule:m\n", + {{3, 4}}, // format incrementally + "module m(\n" + " input wire f,\n" + " input foo::bar ggg\n" // "new line" remains untouched + ");\n" + "endmodule:m\n"}, + {"module m(\n" + " input wire f,\n" // "new line", formatted incrementally + " input foo::bar ggg\n" + ");\n" + "endmodule:m\n", + {{2, 3}}, // format incrementally + "module m(\n" + " input wire f,\n" // "new line" indented, but other spaces kept + " input foo::bar ggg\n" + ");\n" + "endmodule:m\n"}, + }; + // Use a fixed style. + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = FormatVerilog(test_case.input, "<filename>", style, + stream, test_case.lines); + EXPECT_OK(status) << status.message() << '\n' + << "Lines: " << test_case.lines; + EXPECT_EQ(stream.str(), test_case.expected) + << "code:\n" + << test_case.input << "\nlines: " << test_case.lines; + } +} + +// These tests verify the mode where horizontal spacing is discarded while +// vertical spacing is preserved. +TEST(FormatterEndToEndTest, PreserveVSpacesOnly) { + static constexpr FormatterTestCase kTestCases[] = { + // {input, expected}, + // No tokens cases: still preserve vertical spacing, but not horizontal + {"", ""}, + {" ", ""}, + {"\n", "\n"}, + {"\n\n", "\n\n"}, + {" \n", "\n"}, + {"\n ", "\n"}, + {" \n ", "\n"}, + {" \n \t\t\n\t ", "\n\n"}, + + // The remaining cases have at least one non-whitespace token. + + // single comment + {"//\n", "//\n"}, + {"// \n", "// \n"}, // trailing spaces inside comment untouched + {"\n//\n", "\n//\n"}, + {"\n\n//\n", "\n\n//\n"}, + {"\n//\n\n", "\n//\n\n"}, + {" //\n", "//\n"}, // spaces before comment discarded + {" \n //\n", "\n//\n"}, + {" \n //\n \n ", "\n//\n\n"}, // trailing spaces discarded + + // multi-comment + {"//\n//\n", "//\n//\n"}, + {"\n//\n\n//\n\n", "\n//\n\n//\n\n"}, + {"\n//\n\n//\n", "\n//\n\n//\n"}, // blank line between comments + + // Module cases with token partition boundary (before 'endmodule'). + {"module foo;endmodule\n", "module foo;\nendmodule\n"}, + {"module foo;\nendmodule\n", "module foo;\nendmodule\n"}, + {"module foo;\n\nendmodule\n", "module foo;\n\nendmodule\n"}, + {"\nmodule foo;endmodule\n", "\nmodule foo;\nendmodule\n"}, + {"\nmodule foo ; endmodule\n", "\nmodule foo;\nendmodule\n"}, + {"\nmodule\nfoo\n;endmodule\n", "\nmodule foo;\nendmodule\n"}, + {"\nmodule foo;endmodule\n\n\n", "\nmodule foo;\nendmodule\n\n\n"}, + {"\n\n\nmodule foo;endmodule\n", "\n\n\nmodule foo;\nendmodule\n"}, + {"\nmodule\nfoo\n;\n\n\nendmodule\n", "\nmodule foo;\n\n\nendmodule\n"}, + + // Module cases with one indented item, various original vertical spacing + {"module foo;wire w;endmodule\n", "module foo;\n wire w;\nendmodule\n"}, + {" module foo ;wire w ;endmodule \n ", + "module foo;\n wire w;\nendmodule\n"}, + {"\nmodule\nfoo\n;\nwire\nw\n;endmodule\n\n", + "\nmodule foo;\n wire w;\nendmodule\n\n"}, + {"\n\nmodule\nfoo\n;\n\n\nwire\nw\n;\n\nendmodule\n\n", + "\n\nmodule foo;\n\n\n wire w;\n\nendmodule\n\n"}, + + // The following cases show that some horizontal whitespace is discarded, + // while vertical spacing is preserved on partition boundaries. + {" module foo\t \t; endmodule \n", + "module foo;\nendmodule\n"}, + {"\t\n module foo\t\t; endmodule \n", + "\nmodule foo;\nendmodule\n"}, + + // Module with comments intermingled. + { + "//1\nmodule foo;//2\nwire w;//3\n//4\nendmodule\n", + "//1\nmodule foo; //2\n wire w; //3\n //4\nendmodule\n" + // TODO(fangism): whether or not //4 should be indented is + // questionable (in similar cases below too). + }, + {// now with extra blank lines + "//1\n\nmodule foo;//2\n\nwire w;//3\n\n//4\n\nendmodule\n\n", + "//1\n\nmodule foo; //2\n\n wire w; //3\n\n //4\n\nendmodule\n\n"}, + + { + // module with comments-only in some empty blocks, properly indented + " // humble module\n" + " module foo (// non-port comment\n" + "// port comment 1\n" + "// port comment 2\n" + ");// header trailing comment\n" + "// item comment 1\n" + "// item comment 2\n" + "endmodule\n", + "// humble module\n" + "module foo ( // non-port comment\n" + " // port comment 1\n" + " // port comment 2\n" + "); // header trailing comment\n" + " // item comment 1\n" + " // item comment 2\n" + "endmodule\n", + }, + + { + // module with comments around non-empty blocks + " // humble module\n" + " module foo (// non-port comment\n" + "// port comment 1\n" + "input logic f \n" + "// port comment 2\n" + ");// header trailing comment\n" + "// item comment 1\n" + "wire w ; \n" + "// item comment 2\n" + "endmodule\n", + "// humble module\n" + "module foo ( // non-port comment\n" + " // port comment 1\n" + " input logic f\n" + " // port comment 2\n" + "); // header trailing comment\n" + " // item comment 1\n" + " wire w;\n" + " // item comment 2\n" + "endmodule\n", + }, + }; + FormatStyle style; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +static constexpr FormatterTestCase kFormatterTestCasesElseStatements[] = { + {"module m;" + "task static t; if (r == t) a.b(c); else d.e(f); endtask;" + "endmodule", + "module m;\n" + " task static t;\n" + " if (r == t) a.b(c);\n" + " else d.e(f);\n" + " endtask\n" + " ;\n" // possibly unintended stray ';' + "endmodule\n"}, + {"module m;" + "task static t; if (r == t) begin a.b(c); end else begin d.e(f); end " + "endtask;" + "endmodule", + "module m;\n" + " task static t;\n" + " if (r == t) begin\n" + " a.b(c);\n" + " end else begin\n" + " d.e(f);\n" + " end\n" + " endtask\n" + " ;\n" // stray ';' + "endmodule\n"}, + {"module m;initial begin if(a==b)" + "c.d(e);else\n" + "f.g(h);end endmodule", + "module m;\n" + " initial begin\n" + " if (a == b) c.d(e);\n" + " else f.g(h);\n" + " end\n" + "endmodule\n"}, + {" module m; always_comb begin \n" + " if ( a ) b = 16'hdead ; \n" + " else if ( c ) d= 16 'hbeef ; \n" + " else if (e) f=16'hca_fe ; \n" + "end \n endmodule\n", + "module m;\n" + " always_comb begin\n" + " if (a) b = 16'hdead;\n" + " else if (c) d = 16'hbeef;\n" + " else if (e) f = 16'hca_fe;\n" + " end\n" + "endmodule\n"}, + {"module foo();\n" + "always_comb begin\n" + "value = function_name(.long_parameter(8'hA), .parameter_three(foobar));\n" + "end\n" + "endmodule : foo\n", + "module foo ();\n" + " always_comb begin\n" + " value = function_name(\n" + " .long_parameter(8'hA),\n" + " .parameter_three(foobar)\n" + " );\n" + " end\n" + "endmodule : foo\n"}, + {"module foo();\n" + "always_comb begin\n" + "value = function_name(.a(1), .b(2));\n" + "end\n" + "endmodule : foo\n", + "module foo ();\n" + " always_comb begin\n" + " value = function_name(.a(1), .b(2));\n" + " end\n" + "endmodule : foo\n"}, + {"module foo ();\n" + "always_comb begin\n" + "value = function_name(8'hA, foobar, signal_1234); end\n" + "always_comb begin\n" + "value = function_name(8'hA, foobar); end\n" + "endmodule : foo\n", + "module foo ();\n" + " always_comb begin\n" + " value = function_name(8'hA, foobar,\n" + " signal_1234);\n" + " end\n" + " always_comb begin\n" + " value = function_name(8'hA, foobar);\n" + " end\n" + "endmodule : foo\n"}, + {"module foo ();\n" + "always_comb begin\n" + "value = function_name(8'hA, foobar, signal_1234);\n" + "value = function_name(8'hA, foobar, signal_1234); end\n" + "endmodule : foo\n", + "module foo ();\n" + " always_comb begin\n" + " value = function_name(8'hA, foobar,\n" + " signal_1234);\n" + " value = function_name(8'hA, foobar,\n" + " signal_1234);\n" + " end\n" + "endmodule : foo\n"}, + {"always_comb begin\n" + "value = " + "f(long_parameter_exceeding_col_limit, foo, bar); end\n", + "always_comb begin\n" + " value = f(\n" + " long_parameter_exceeding_col_limit,\n" + " foo,\n" + " bar\n" + " );\n" + "end\n"}, + {"module foo();\n" + "always_comb begin\n" + "value = function_name(8'hA, .parameter_three(foobar));\n" + "end\n" + "endmodule : foo\n", + "module foo ();\n" + " always_comb begin\n" + " value = function_name(\n" + " 8'hA,\n" + " .parameter_three(foobar)\n" + " );\n" + " end\n" + "endmodule : foo\n"}, + {"module foo ();\n" + "always_comb begin\n" + "value = function_name(8'hA, 8'hB, 8'hC, .parameter_four(foo), " + ".par_five(bar));\n" + "end\n" + "endmodule : foo\n", + "module foo ();\n" + " always_comb begin\n" + " value = function_name(\n" + " 8'hA,\n" + " 8'hB,\n" + " 8'hC,\n" + " .parameter_four(foo),\n" + " .par_five(bar)\n" + " );\n" + " end\n" + "endmodule : foo\n"}, + {"class dv_base_mem; function void configure(); \nbegin\n" + "value = func(8'hA, foobar, signal_1234);\n" + "value = new(8'hA, foobar, signal_1234); end\n" + "endfunction : configure endclass\n", + "class dv_base_mem;\n" + " function void configure();\n" + " begin\n" + " value = func(8'hA, foobar,\n" + " signal_1234);\n" + " value = new(8'hA, foobar,\n" + " signal_1234);\n" + " end\n" + " endfunction : configure\n" + "endclass\n"}, + {"module m; initial begin\n" + " if (a||b) c = 1'b1;\n" + "d = 1'b1; if (e)\n" + "begin f = 1'b0; end else begin\n" + " g = h;\n" + " end \n" + " i = 1'b1; " + "end endmodule\n", + "module m;\n" + " initial begin\n" + " if (a || b) c = 1'b1;\n" + " d = 1'b1;\n" + " if (e) begin\n" + " f = 1'b0;\n" + " end else begin\n" + " g = h;\n" + " end\n" + " i = 1'b1;\n" + " end\n" + "endmodule\n"}, + {"module m; initial begin\n" + "if (a&&b&&c) begin\n" + " d = 1'b1;\n" + " if (e) begin\n" + " f = ff;\n" + " end else if ( g ) begin\n" + " h = hh;\n" + "end else if (i) begin\n" + " j = (kk == ll) ? mm :\n" + " gg;\n" + " end else if ( qq ) begin\n" + " if ( xx ||yy ) begin d0 = 1'b0; d1 = " + "1'b1;\n" + " end else if (oo) begin aa = bb; cc = dd;" + " if (zz) zx = xz; else ba = ab;" + " end else \n begin vv = tt ; \n" + " end end " + "end \n else if (uu)\nbegin\n\na=b;if (aa) b = c;\n" + "\nelse if \n (bb) \n\nc =d ;\n\n\n\n\n " + " else e\n\n = h;\n\n" + "end \n else \n begin if(x)y=a;else\nbegin\n" + "\n\n\na=y; if (a) b = c;\n\n\n\nelse\n\n\nd=e;end \n" + "end\n" + "end endmodule\n", + "module m;\n" + " initial begin\n" + " if (a && b && c) begin\n" + " d = 1'b1;\n" + " if (e) begin\n" + " f = ff;\n" + " end else if (g) begin\n" + " h = hh;\n" + " end else if (i) begin\n" + " j = (kk == ll) ? mm : gg;\n" + " end else if (qq) begin\n" + " if (xx || yy) begin\n" + " d0 = 1'b0;\n" + " d1 = 1'b1;\n" + " end else if (oo) begin\n" + " aa = bb;\n" + " cc = dd;\n" + " if (zz) zx = xz;\n" + " else ba = ab;\n" + " end else begin\n" + " vv = tt;\n" + " end\n" + " end\n" + " end else if (uu) begin\n\n" + " a = b;\n" + " if (aa) b = c;\n\n" + " else if (bb) c = d;\n\n\n\n\n" + " else e = h;\n\n" + " end else begin\n" + " if (x) y = a;\n" + " else begin\n\n\n\n" + " a = y;\n" + " if (a) b = c;\n\n\n\n" + " else d = e;\n" + " end\n" + " end\n" + " end\n" + "endmodule\n"}}; + +TEST(FormatterEndToEndTest, FormatElseStatements) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + for (const auto &test_case : kFormatterTestCasesElseStatements) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, ConstraintExpressions) { + static constexpr FormatterTestCase kTestCases[] = { + {"", ""}, + + // class members + {"class Foo; constraint if_c { if (zzzzzzzzzzzzzzzzzzzzz)" + "{ soft xxxxxxxxxxxxxxxxxxxxxx == yyyyyyyyyyyyyyyyyyy; } } endclass", + "class Foo;\n" + " constraint if_c {\n" + " if (zzzzzzzzzzzzzzzzzzzzz) {\n" + " soft xxxxxxxxxxxxxxxxxxxxxx == yyyyyyyyyyyyyyyyyyy;\n" + " }\n" + " }\n" + "endclass\n"}, + + // constraints with if-constraint expressions + {"constraint xx { if (a) b; }\n", "constraint xx {if (a) b;}\n"}, + + {"constraint xx { if (a) {b;} }\n", + "constraint xx {\n" + " if (a) {\n" + " b;\n" + " }\n" + "}\n"}, + + // multi item constraint + {"constraint yy { a == b;c==d;}", + "constraint yy {\n" + " a == b;\n" + " c == d;\n" + "}\n"}, + + // one-line constraints + {"constraint only_vec_instr_c {soft only_vec_instr == 0;}", + "constraint only_vec_instr_c {soft only_vec_instr == 0;}\n"}, + + {"constraint\nnum_trans_c\n\n\n{\n\n\nnum_trans inside{[800:1000]};}", + "constraint num_trans_c {num_trans inside {[800 : 1000]};}\n"}, + + // if-vs-concatenation expression + {"constraint c_operation{ if(fixed_operation_en){" + "aes_operation == fixed_operation" + ";}}", + "constraint c_operation {\n" + " if (fixed_operation_en) {\n" + " aes_operation == fixed_operation;\n" + " }\n" + "}\n"}, + + {"constraint c_operation{ if(fixed_operation_en){" + "aes_operation == fixed_operation" + "};}", + "constraint c_operation {\n" + " if (fixed_operation_en)\n" + " {aes_operation == fixed_operation};\n" + "}\n"}, + + // concatenation expression + {"constraint c_iv {if (fixed_iv_en) {aes_iv == fixed_iv};}", + "constraint c_iv {\n" + " if (fixed_iv_en)\n" + " {aes_iv == fixed_iv};\n" + "}\n"}, + + // looooong test + {"constraint xx {" + "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa==" + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;" + "ccccccccccccccccccccccc==dddddddddddddddddddddd;}", + "constraint xx {\n" + " if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == " + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;\n" + " ccccccccccccccccccccccc == dddddddddddddddddddddd;\n" + "}\n"}, + }; + FormatStyle style; + style.column_limit = + 100; // smaller column_limit forces expansion of constraint blocks + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.port_declarations_alignment = verible::AlignmentPolicy::kPreserve; + for (const auto &test_case : kTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +static constexpr FormatterTestCase kFormatterTestCasesEnumDeclarations[] = { + // Inferring user intent: not too many spaces to be added: align. + {"typedef enum { kA=1, kAB=2, kABC=3} x;", + "typedef enum {\n" + " kA = 1,\n" + " kAB = 2,\n" + " kABC = 3\n} x;\n"}, + + // Lots of spaces would've to be be added - keep flush + {"typedef enum { kA=1, kAB=2, kABCDEFGHIJKLMN=3} x;", + "typedef enum {\n" + " kA = 1,\n" + " kAB = 2,\n" + " kABCDEFGHIJKLMN = 3\n} x;\n"}, + + // Source spaces indicate alignment wish. + {"typedef enum { kA =1, kAB=2, kABCDEFGHIJKLMN=3} x;", + "typedef enum {\n" + " kA = 1,\n" + " kAB = 2,\n" + " kABCDEFGHIJKLMN = 3\n} x;\n"}, + + // An empty line groups into several sections, to be aligned independently + {"typedef enum { kA=1, kAB=2, \n\n kABC=3} x;", + "typedef enum {\n" + " kA = 1,\n" + " kAB = 2,\n" + "\n" + " kABC = 3\n} x;\n"}, + + // Lines with comments don't interrupt alignment + {"typedef enum { kA=1,\n" + "// hello world\n" + "kAB=2, kABC=3} x;", + "typedef enum {\n" + " kA = 1,\n" + " // hello world\n" + " kAB = 2,\n" + " kABC = 3\n} x;\n"}, + + // Generally, comment locations are preserved, and full line comments + // indented to enum name level. + {"typedef enum { kA=1,// value kA\n" + "// hello world\n" + "kAB=2,// value kAB\n" + "kABC=3// value kABC\n" + "} x;", + "typedef enum {\n" + " kA = 1, // value kA\n" + " // hello world\n" + " kAB = 2, // value kAB\n" + " kABC = 3 // value kABC" + "\n} x;\n"}, + + {"typedef enum { kA=1,// value kA\n" + "kAB=2,\n" + "kABC=3// value kABC\n" + "} x;", + "typedef enum {\n" + " kA = 1, // value kA\n" + " kAB = 2,\n" + " kABC = 3 // value kABC" + "\n} x;\n"}, + + // Numeric constants are currently flushed left, but maybe todo + // align right in the future ? + {"typedef enum { kA=1, kAB=10, kABC=100} x;", + "typedef enum {\n" + " kA = 1,\n" + " kAB = 10,\n" + " kABC = 100\n} x;\n"}, +}; + +TEST(FormatterEndToEndTest, FormatAlignEnumDeclarations) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.enum_assignment_statement_alignment = AlignmentPolicy::kInferUserIntent; + for (const auto &test_case : kFormatterTestCasesEnumDeclarations) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +TEST(FormatterEndToEndTest, DiagnosticShowFullTree) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + for (const auto &test_case : kDiagnosticFormatterTestCases) { + std::ostringstream stream, debug_stream; + ExecutionControl control; + control.stream = &debug_stream; + control.show_token_partition_tree = true; + const auto status = FormatVerilog(test_case.input, "<filename>", style, + stream, kEnableAllLines, control); + EXPECT_EQ(status.code(), StatusCode::kCancelled); + EXPECT_TRUE( + absl::StartsWith(debug_stream.str(), "Full token partition tree")); + } +} + +TEST(FormatterEndToEndTest, DiagnosticLargestPartitions) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + for (const auto &test_case : kDiagnosticFormatterTestCases) { + std::ostringstream stream, debug_stream; + ExecutionControl control; + control.stream = &debug_stream; + control.show_largest_token_partitions = 2; + const auto status = FormatVerilog(test_case.input, "<filename>", style, + stream, kEnableAllLines, control); + EXPECT_EQ(status.code(), StatusCode::kCancelled); + EXPECT_TRUE(absl::StartsWith(debug_stream.str(), "Showing the ")) + << "got: " << debug_stream.str(); + } +} + +TEST(FormatterEndToEndTest, DiagnosticEquallyOptimalWrappings) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + for (const auto &test_case : kDiagnosticFormatterTestCases) { + std::ostringstream stream, debug_stream; + ExecutionControl control; + control.stream = &debug_stream; + control.show_equally_optimal_wrappings = true; + const auto status = FormatVerilog(test_case.input, "<filename>", style, + stream, kEnableAllLines, control); + EXPECT_OK(status) << status.message(); + if (!debug_stream.str().empty()) { + EXPECT_TRUE(absl::StartsWith(debug_stream.str(), "Showing the ")) + << "got: " << debug_stream.str(); + // Cannot guarantee among unit tests that there will be >1 solution. + } + } +} + +// Test that hitting search space limit results in correct error status. +TEST(FormatterEndToEndTest, UnfinishedLineWrapSearching) { + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + + const std::string_view code("parameter int x = 1+1;\n"); + + std::ostringstream stream, debug_stream; + ExecutionControl control; + control.max_search_states = 2; // Cause search to abort early. + control.stream = &debug_stream; + const auto status = FormatVerilog(code, "<filename>", style, stream, + kEnableAllLines, control); + EXPECT_EQ(status.code(), StatusCode::kResourceExhausted); + EXPECT_TRUE(absl::StartsWith(status.message(), "***")); +} + +static constexpr FormatterTestCase kOnelineFormatBaselineTestCases[] = { + // Reference - following test cases should not be affected by the switch + {// Minimal useful case + "covergroup c @ (posedge clk); coverpoint a; endgroup\n", + "covergroup c @(posedge clk);\n" + " coverpoint a;\n" + "endgroup\n"}, + {// Multiple coverpoints + "covergroup foo @(posedge clk); coverpoint a; coverpoint b; " + "coverpoint c; coverpoint d; endgroup\n", + "covergroup foo @(posedge clk);\n" + " coverpoint a;\n" + " coverpoint b;\n" + " coverpoint c;\n" + " coverpoint d;\n" + "endgroup\n"}, + {// Multiple bins + "covergroup memory @ (posedge ce); address :coverpoint addr {" + "bins low={LOW}; bins high={HIGH};} endgroup\n", + "covergroup memory @(posedge ce);\n" + " address: coverpoint addr {\n" + " bins low = {LOW};\n" + " bins high = {HIGH};\n" + " }\n" + "endgroup\n"}, + {// Multiple bins with multiple elements + "covergroup memory @ (posedge ce); address :coverpoint addr {" + "bins low={0,127}; bins high={128,255};} endgroup\n", + "covergroup memory @(posedge ce);\n" + " address: coverpoint addr {\n" + " bins low = {0, 127};\n" + " bins high = {128, 255};\n" + " }\n" + "endgroup\n"}, +}; + +// Tests that constructs that could be formatted as one-liners are formatted +// correctly. This is the baseline test with default style, test cases should +// not be affected by the setting. +TEST(FormatterEndToEndTest, OnelineFormatBaselineTest) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.expand_coverpoints = false; + for (const auto &test_case : kOnelineFormatBaselineTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } + // Test again with the switch, should not affect formatting + style.expand_coverpoints = true; + for (const auto &test_case : kOnelineFormatBaselineTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Following two test sets are affected by the expand_coverponits switch +// They should contain corresponding test cases +static constexpr FormatterTestCase kOnelineFormatReferenceTestCases[] = { + {// Coverpoint that could fit on one line + "covergroup memory @ (posedge ce); a :coverpoint d {" + "bins l={0};} endgroup\n", + "covergroup memory @(posedge ce);\n" + " a: coverpoint d {bins l = {0};}\n" + "endgroup\n"}, + {// Fit with a reference + "covergroup memory @ (posedge ce); a :coverpoint d {" + "bins l={LOW};} endgroup\n", + "covergroup memory @(posedge ce);\n" + " a: coverpoint d {bins l = {LOW};}\n" + "endgroup\n"}, + {// Fit with multiple elements + "covergroup memory @ (posedge ce); a :coverpoint d {" + "bins l={0,8};} endgroup\n", + "covergroup memory @(posedge ce);\n" + " a: coverpoint d {bins l = {0, 8};}\n" + "endgroup\n"}, +}; + +static constexpr FormatterTestCase kOnelineFormatExpandTestCases[] = { + {// Coverpoint that could fit on one line + "covergroup memory @ (posedge ce); a :coverpoint d {" + "bins l={0};} endgroup\n", + "covergroup memory @(posedge ce);\n" + " a: coverpoint d {\n" + " bins l = {0};\n" + " }\n" + "endgroup\n"}, + {// Fit with a reference + "covergroup memory @ (posedge ce); a :coverpoint d {" + "bins l={LOW};} endgroup\n", + "covergroup memory @(posedge ce);\n" + " a: coverpoint d {\n" + " bins l = {LOW};\n" + " }\n" + "endgroup\n"}, + {// Fit with multiple elements + "covergroup memory @ (posedge ce); a :coverpoint d {" + "bins l={0,8};} endgroup\n", + "covergroup memory @(posedge ce);\n" + " a: coverpoint d {\n" + " bins l = {0, 8};\n" + " }\n" + "endgroup\n"}, +}; + +TEST(FormatterEndToEndTest, OnelineFormatReferenceTest) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.expand_coverpoints = false; + + for (const auto &test_case : kOnelineFormatReferenceTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Tests that constructs that could be formatted as one-liners are expanded +// correctly. This is the baseline test with default style +TEST(FormatterEndToEndTest, OnelineFormatExpandTest) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.expand_coverpoints = true; + + for (const auto &test_case : kOnelineFormatExpandTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +struct DimensionsAlignmentTestCase { + std::string_view input; + std::string_view expected[4]; +}; + +static constexpr DimensionsAlignmentTestCase + kPortDeclarationDimensionsAlignmentTestCases[] = { + {"import \"DPI-C\" context function void func(\n" + "input bit foo,\n" + "input bit [2] foobar,\n" + "input bit [24:16] bar,\n" + "input bit [2:0][31:0] baz,\n" + "input bit [4][24:0][16:0] foobarbaz[],\n" + "input bit [FOOBAZ][31:24] qux[16],\n" + "input bit [16] quux[8:2][16][32],\n" + "output bit [2:0][2:0][2:0] quuz[8][16:12]\n" + ");\n", + { + "import \"DPI-C\" context function void func(\n" + " input bit foo,\n" + " input bit [ 2] foobar,\n" + " input bit [ 24:16] bar,\n" + " input bit [ 2:0][ 31:0] baz,\n" + " input bit [ 4][ 24:0][16:0] foobarbaz[ ],\n" + " input bit [FOOBAZ][31:24] qux [ 16],\n" + " input bit [ 16] quux [8:2][ 16][32],\n" + " output bit [ 2:0][ 2:0][ 2:0] quuz [ 8][16:12]\n" + ");\n", + "import \"DPI-C\" context function void func(\n" + " input bit foo,\n" + " input bit [ 2] foobar,\n" + " input bit [ 24:16] bar,\n" + " input bit [ 2:0][ 31:0] baz,\n" + " input bit [ 4][ 24:0][16:0] foobarbaz [ ],\n" + " input bit [FOOBAZ][31:24] qux [ 16],\n" + " input bit [ 16] quux [8:2][16][ 32],\n" + " output bit [ 2:0][ 2:0][ 2:0] quuz [ 8][16:12]\n" + ");\n", + "import \"DPI-C\" context function void func(\n" + " input bit foo,\n" + " input bit [ 2] foobar,\n" + " input bit [24:16] bar,\n" + " input bit [ 2:0][ 31:0] baz,\n" + " input bit [ 4][ 24:0][ 16:0] foobarbaz[ ],\n" + " input bit [FOOBAZ][31:24] qux [ 16],\n" + " input bit [ 16] quux [8:2][ 16][32],\n" + " output bit [2:0][ 2:0][ 2:0] quuz [ 8][16:12]\n" + ");\n", + "import \"DPI-C\" context function void func(\n" + " input bit foo,\n" + " input bit [ 2] foobar,\n" + " input bit [24:16] bar,\n" + " input bit [ 2:0][ 31:0] baz,\n" + " input bit [ 4][ 24:0][ 16:0] foobarbaz [ ],\n" + " input bit [FOOBAZ][31:24] qux [ 16],\n" + " input bit [ 16] quux [8:2][16][ 32],\n" + " output bit [2:0][ 2:0][ 2:0] quuz [ 8][16:12]\n" + ");\n", + }}, + {"module m(\n" + "output bit [2:0][2:0][2:0] quuz[8][16:12],\n" + "input bit [16] quux[8:2][16][32],\n" + "input bit [FOOBAZ][31:24] qux[16],\n" + "input bit [4][24:0][16:0] foobaz[],\n" + "input bit [2:0][31:0] baz,\n" + "input bit [24:16] bar,\n" + "input bit [2] foobar,\n" + "input bit foo\n" + "); endmodule:m\n", + { + "module m (\n" + " output bit [ 2:0][ 2:0][ 2:0] quuz [ 8][16:12],\n" + " input bit [ 16] quux [8:2][ 16][32],\n" + " input bit [FOOBAZ][31:24] qux [ 16],\n" + " input bit [ 4][ 24:0][16:0] foobaz[ ],\n" + " input bit [ 2:0][ 31:0] baz,\n" + " input bit [ 24:16] bar,\n" + " input bit [ 2] foobar,\n" + " input bit foo\n" + ");\n" + "endmodule : m\n", + "module m (\n" + " output bit [ 2:0][ 2:0][ 2:0] quuz [ 8][16:12],\n" + " input bit [ 16] quux [8:2][16][ 32],\n" + " input bit [FOOBAZ][31:24] qux [ 16],\n" + " input bit [ 4][ 24:0][16:0] foobaz [ ],\n" + " input bit [ 2:0][ 31:0] baz,\n" + " input bit [ 24:16] bar,\n" + " input bit [ 2] foobar,\n" + " input bit foo\n" + ");\n" + "endmodule : m\n", + "module m (\n" + " output bit [2:0][ 2:0][ 2:0] quuz [ 8][16:12],\n" + " input bit [ 16] quux [8:2][ 16][32],\n" + " input bit [FOOBAZ][31:24] qux [ 16],\n" + " input bit [ 4][ 24:0][ 16:0] foobaz[ ],\n" + " input bit [ 2:0][ 31:0] baz,\n" + " input bit [24:16] bar,\n" + " input bit [ 2] foobar,\n" + " input bit foo\n" + ");\n" + "endmodule : m\n", + "module m (\n" + " output bit [2:0][ 2:0][ 2:0] quuz [ 8][16:12],\n" + " input bit [ 16] quux [8:2][16][ 32],\n" + " input bit [FOOBAZ][31:24] qux [ 16],\n" + " input bit [ 4][ 24:0][ 16:0] foobaz [ ],\n" + " input bit [ 2:0][ 31:0] baz,\n" + " input bit [24:16] bar,\n" + " input bit [ 2] foobar,\n" + " input bit foo\n" + ");\n" + "endmodule : m\n", + }}, +}; + +TEST(FormatterEndToEndTest, PortDeclarationDimensionsAlignmentTest) { + FormatStyle style; + style.column_limit = 64; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + + // All combinations of port_declaration_right_align_{un,}packed_dimensions + static const bool right_align_combinations[][2] = { + {false, false}, {false, true}, {true, false}, {true, true}}; + + for (const auto &test_case : kPortDeclarationDimensionsAlignmentTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + size_t expected_index = 0; + for (const auto &right_align : right_align_combinations) { + VLOG(1) << "style variant:\n" + << "port_declarations_right_align_packed_dimensions: " + << right_align[0] << "\n" + << "port_declarations_right_align_unpacked_dimensions: " + << right_align[1] << "\n"; + style.port_declarations_right_align_packed_dimensions = right_align[0]; + style.port_declarations_right_align_unpacked_dimensions = right_align[1]; + + std::ostringstream stream; + + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected[expected_index++]) + << "code:\n" + << test_case.input; + } + } +} + +// TODO(fangism): directed tests using style variations + +static constexpr FormatterTestCase kNestedFunctionsTestCases40ColumnsLimit[] = { + {"module foo;" + "`uvm_info(`gfn, $sformatf(\n" + "\"\\n base_vseq: generate %0d pulse in channel %0d\", cfg.num_pulses, " + "i), UVM_DEBUG)\n" + "endmodule", + "module foo;\n" + " `uvm_info(\n" + " `gfn,\n" + " $sformatf(\n" + " \"\\n base_vseq: generate %0d pulse in channel %0d\",\n" + " cfg.num_pulses, i), UVM_DEBUG)\n" + "endmodule\n"}, + {"module foo;`uvm_info(`gfn, $sformatf(" + "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\"," + "cfg.convert2string()), UVM_LOW)\n" + "endmodule", + "module foo;\n" + " `uvm_info(\n" + " `gfn,\n" + " $sformatf(\n" + " \"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\",\n" + " cfg.convert2string()),\n" + " UVM_LOW)\n" // FIXME: Wrapped by SearchLineWraps + "endmodule\n"}, +}; + +TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases40ColumnsLimit) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + + for (const auto &test_case : kNestedFunctionsTestCases40ColumnsLimit) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +static constexpr FormatterTestCase kNestedFunctionsTestCases60ColumnsLimit[] = { + {"module foo;" + "`uvm_info(`gfn, $sformatf(\n" + "\"\\n base_vseq: generate %0d pulse in channel %0d\", cfg.num_pulses, " + "i), UVM_DEBUG)\n" + "endmodule", + "module foo;\n" + " `uvm_info(\n" + " `gfn,\n" + " $sformatf(\n" + " \"\\n base_vseq: generate %0d pulse in channel %0d\",\n" + " cfg.num_pulses, i), UVM_DEBUG)\n" + "endmodule\n"}, + {"module foo;`uvm_info(`gfn, $sformatf(" + "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\"," + "cfg.convert2string()), UVM_LOW)\n" + "endmodule", + "module foo;\n" + " `uvm_info(\n" + " `gfn,\n" + " $sformatf(\n" + " \"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\",\n" + " cfg.convert2string()), UVM_LOW)\n" + "endmodule\n"}, +}; + +TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases60ColumnsLimit) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 60; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + + for (const auto &test_case : kNestedFunctionsTestCases60ColumnsLimit) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +static constexpr FormatterTestCase kNestedFunctionsTestCases80ColumnsLimit[] = { + {"module foo;" + "`uvm_info(`gfn, $sformatf(\n" + "\"\\n base_vseq: generate %0d pulse in channel %0d\", cfg.num_pulses, " + "i), UVM_DEBUG)\n" + "endmodule", + "module foo;\n" + " `uvm_info(`gfn, $sformatf(\"\\n base_vseq: generate %0d pulse in " + "channel %0d\",\n" + " cfg.num_pulses, i), UVM_DEBUG)\n" + "endmodule\n"}, + {"module foo;`uvm_info(`gfn, $sformatf(" + "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\"," + "cfg.convert2string()), UVM_LOW)\n" + "endmodule", + "module foo;\n" + " `uvm_info(`gfn, $sformatf(\n" + " \"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE " + "|----\\n %s\",\n" + " cfg.convert2string()), UVM_LOW)\nendmodule\n"}, + {"module x;" + "`uvm_fatal(`gfn, $sformatf(" + "\"The data 0x%0h written to the signature address is formatted " + "incorrectly.\"," + "signature_data))\n" + "endmodule", + "module x;\n" + " `uvm_fatal(\n" + " `gfn,\n" + " $sformatf(\n" + " \"The data 0x%0h written to the signature address is formatted " + "incorrectly.\",\n" + " signature_data))\n" + "endmodule\n"}, +}; + +TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases80ColumnsLimit) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 80; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + + for (const auto &test_case : kNestedFunctionsTestCases80ColumnsLimit) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +static constexpr FormatterTestCase kNestedFunctionsTestCases100ColumnsLimit[] = + { + {"module foo;" + "`uvm_info(`gfn, $sformatf(\n" + "\"\\n base_vseq: generate %0d pulse in channel %0d\", " + "cfg.num_pulses, i), UVM_DEBUG)\n" + "endmodule", + "module foo;\n" + " `uvm_info(`gfn, $sformatf(\"\\n base_vseq: generate %0d pulse in " + "channel %0d\", cfg.num_pulses, i),\n" + " UVM_DEBUG)\n" + "endmodule\n"}, + {"module foo;`uvm_info(`gfn, $sformatf(" + "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\"," + "cfg.convert2string()), UVM_LOW)\n" + "endmodule", + "module foo;\n" + " `uvm_info(`gfn, $sformatf(\"\\n\\n\\t ----| STARTING AES MAIN " + "SEQUENCE |----\\n %s\",\n" + " cfg.convert2string()), UVM_LOW)\n" + "endmodule\n"}, + {"module x;" + "`uvm_fatal(`gfn, $sformatf(" + "\"The data 0x%0h written to the signature address is formatted " + "incorrectly.\"," + "signature_data))\n" + "endmodule", + "module x;\n" + " `uvm_fatal(`gfn, $sformatf(\n" + " \"The data 0x%0h written to the signature " + "address is formatted incorrectly.\",\n" + " signature_data))\n" + "endmodule\n"}, + {// nested modules, three-levels + "module x; module y; module z;" + "`uvm_fatal(`gfn, $sformatf(" + "\"The data 0x%0h written to the signature address is formatted " + "incorrectly.\"," + "signature_data))\n" + "endmodule endmodule endmodule", + "module x;\n" + " module y;\n" + " module z;\n" + " `uvm_fatal(`gfn,\n" + " $sformatf(\n" + " \"The data 0x%0h written to the signature " + "address is formatted incorrectly.\",\n" + " signature_data))\n" + " endmodule\n" + " endmodule\n" + "endmodule\n"}, +}; + +TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases100ColumnsLimit) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 100; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + + for (const auto &test_case : kNestedFunctionsTestCases100ColumnsLimit) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +static constexpr FormatterTestCase noCompactIndexingAndSelectionsTestCases[]{ + {"module m1 ();\n" + " assign s1 = msg[1 : 2 + 3];\n" + " assign s2 = {<<8{msg[1 : 2 + 3]}};\n" + "endmodule\n", + "module m1 ();\n" + " assign s1 = msg[1 : 2 + 3];\n" + " assign s2 = {<< 8{msg[1 : 2 + 3]}};\n" + "endmodule\n"}}; + +TEST(FormatterEndToEndTest, compactIndexingAndSelectionsTestCases) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 100; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.compact_indexing_and_selections = false; + + for (const auto &test_case : noCompactIndexingAndSelectionsTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +static constexpr FormatterTestCase + kSpaceBeforeHashInUnqualifiedTypedefTestCases[] = { + // unqualified parameterized type keeps a space before '#' + {"typedef dv_base_env_cov #(.CFG_T(tl_agent_env_cfg)) " + "tl_agent_env_cov;\n", + "typedef dv_base_env_cov #(\n" + " .CFG_T(tl_agent_env_cfg)\n" + ") tl_agent_env_cov;\n"}, + // ... and is inserted when absent + {"typedef dv_base_env_cov#(.CFG_T(tl_agent_env_cfg)) " + "tl_agent_env_cov;\n", + "typedef dv_base_env_cov #(\n" + " .CFG_T(tl_agent_env_cfg)\n" + ") tl_agent_env_cov;\n"}, + // single short parameter stays on one line + {"typedef my_class #(.P(P)) my_class_t;\n", + "typedef my_class #(.P(P)) my_class_t;\n"}, + // package-qualified types are unaffected (no space before '#') + {"typedef foo_pkg::baz_t#(.L(L), .W(W)) bar_t;\n", + "typedef foo_pkg::baz_t#(\n" + " .L(L),\n" + " .W(W)\n" + ") bar_t;\n"}, +}; + +TEST(FormatterEndToEndTest, SpaceBeforeHashInUnqualifiedTypedefTestCases) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 40; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + style.class_parameter_space = true; + + for (const auto &test_case : kSpaceBeforeHashInUnqualifiedTypedefTestCases) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +static constexpr FormatterTestCase kFunctionCallsWithComments[] = { + {// no comments + "module foo;\n" + "`uvm_info(`gfn, \"xx\",\n" + "cfg.num_pulses, i, UVM_DEBUG)\n" + "endmodule", + "module foo;\n" + " `uvm_info(`gfn, \"xx\", cfg.num_pulses, i, UVM_DEBUG)\n" + "endmodule\n"}, + {// one comment + "module foo;\n" + "`uvm_info(`gfn, \"xx\", // yy\n" + "cfg.num_pulses, i, UVM_DEBUG)\n" + "endmodule", + "module foo;\n" + " `uvm_info(`gfn, \"xx\", // yy\n" + " cfg.num_pulses, i, UVM_DEBUG)\n" + "endmodule\n"}, + {// two comments + "module foo;\n" + "`uvm_info(`gfn, \"xx\", " + " cfg.num_pulses, // xx\n" + " i, UVM_DEBUG)// uuu\n" + "endmodule", + "module foo;\n" + " `uvm_info(`gfn, \"xx\", cfg.num_pulses, // xx\n" + " i, UVM_DEBUG) // uuu\n" + "endmodule\n"}, + + {// nested function calls with comments + "module foo;" + "`uvm_info(`gfn, $sformatf(\"\\n base_vseq: generate %0d" + " pulse in channel %0d\", cfg.num_pulses, // comment\n" + " i), UVM_DEBUG)\n" + "endmodule", + "module foo;\n" + " `uvm_info(`gfn, $sformatf(\"\\n base_vseq: generate %0d pulse in " + "channel %0d\",\n" + " cfg.num_pulses, // comment\n" + " i), UVM_DEBUG)\n" + "endmodule\n"}, +}; + +TEST(FormatterEndToEndTest, FunctionCallsWithComments) { + // Use a fixed style. + FormatStyle style; + style.column_limit = 100; + style.indentation_spaces = 2; + style.wrap_spaces = 4; + + for (const auto &test_case : kFunctionCallsWithComments) { + VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>"; + std::ostringstream stream; + const auto status = + FormatVerilog(test_case.input, "<filename>", style, stream); + // Require these test cases to be valid. + EXPECT_OK(status) << status.message(); + EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input; + } +} + +// Extracts the first non-whitespace token and prepends it with number of +// of newlines seen in front of it. So "\n \n\n foo" -> "3foo" +std::string NLCountAndfirstWord(std::string_view str) { + std::string result; + int newline_count = 0; + std::string_view::const_iterator begin = str.begin(); + for (/**/; begin < str.end(); ++begin) { + if (!isspace(*begin)) break; + newline_count += (*begin == '\n'); + } + // Emit number of newlines seen up to first token. + result.append(1, + static_cast<char>(newline_count + '0')); // single digit itoa + std::string_view::const_iterator end_str = begin; + for (/**/; end_str < str.end() && !isspace(*end_str); ++end_str) { + } + result.append(begin, end_str); + return result; +} + +// Similar to NLCountAndfirstWord() but looking at the last token and trailing +// newlines. +std::string lastWordAndNLCount(std::string_view str) { + std::string result; + int newline_count = 0; + std::string_view::const_iterator back = str.end() - 1; + for (/**/; back >= str.begin(); --back) { + if (!isspace(*back)) break; + newline_count += (*back == '\n'); + } + + std::string_view::const_iterator start_str = back; + for (/**/; start_str >= str.begin() && !isspace(*start_str); --start_str) { + } + result.append(&*(start_str + 1), back - start_str); + // Emit number of newlines seen following last token. + result.append(1, + static_cast<char>(newline_count + '0')); // single digit itoa + return result; +} + +// Testing the tester... +TEST(FormatterTestInternal, TokenExtractorAndLineCounterTestFixtureTest) { + std::string_view str = "\n \nhello world \n \n"; + ASSERT_EQ(NLCountAndfirstWord(str), "2hello"); + ASSERT_EQ(NLCountAndfirstWord(str.substr(1)), "1hello"); + ASSERT_EQ(NLCountAndfirstWord(str.substr(3)), "0hello"); + + ASSERT_EQ(lastWordAndNLCount(str), "world2"); + ASSERT_EQ(lastWordAndNLCount(str.substr(0, str.length() - 1)), "world1"); + ASSERT_EQ(lastWordAndNLCount(str.substr(0, str.length() - 2)), "world1"); + ASSERT_EQ(lastWordAndNLCount(str.substr(0, str.length() - 3)), "world0"); + + str = "aworld \n \n"; // Make sure to not overshoot begin. + ASSERT_EQ(lastWordAndNLCount(str.substr(1)), "world2"); +} + +TEST(FormatterEndToEndTest, RangeFormattingOnlyEmittingRelevantLines) { + // Including some empty lines to make sure the formatting + static constexpr std::string_view unformatted = + R"( module foo (// non-port comment + + // some comment + + input logic a, input logic b,input bit [2] +foobar, input bit [4] foobaz, + input bit [2] quux + + + ); endmodule +)"; + + std::vector<std::string_view> lines = absl::StrSplit(unformatted, '\n'); + const int kLineCount = lines.size(); + + FormatStyle style; + + // Go through all possible sub-ranges, format these, and compare that the + // output of the range output is contained inside the full format given the + // same sub-range. + for (int start_line = 0; start_line < kLineCount; ++start_line) { + for (int end_line = start_line; end_line < kLineCount; ++end_line) { + // Line numbers are 1-index based. + const verible::Interval<int> range = {start_line + 1, end_line + 1}; + + // Format full text for reference + std::ostringstream full_format; + absl::Status status = + FormatVerilog(unformatted, "<filename>", style, full_format, {range}); + EXPECT_OK(status) << status.message(); + + // To test: range formatted. + std::string range_formatted; + status = FormatVerilogRange(unformatted, "<filename>", style, + &range_formatted, range); + EXPECT_OK(status) << status.message(); + if (range.empty()) { // Nothing to format: expect empty output. + EXPECT_TRUE(range_formatted.empty()); + continue; + } + + // Area we cover in the input (include the final newline); + const auto source_begin = lines[start_line].begin(); + const auto source_end = lines[end_line - 1].end() + 1; // include \n + const std::string_view range_unformatted(&*source_begin, + source_end - source_begin); + + // To compare that we indeed formatted the requested reqgion, we make + // sure that the first and last token (simplified: non-whitespace word) + // in the input of the range to be formatted is + // exactly the first and last token that comes out of the range + // formatted snippet. + // + // While the whitespace might be different at the beginning and end + // due to formatting, the number of _newlines_ at the beginning and end + // should be the same, so we include the newline count in the comparison. + + EXPECT_EQ(NLCountAndfirstWord(range_unformatted), + NLCountAndfirstWord(range_formatted)) + << "'" << range_unformatted << "' vs. '" << range_formatted << "'"; + + // ... same for the last word. + EXPECT_EQ(lastWordAndNLCount(range_unformatted), + lastWordAndNLCount(range_formatted)) + << "'" << range_unformatted << "' vs. '" << range_formatted << "'"; + + EXPECT_LE(range_formatted.length(), full_format.str().length()); + EXPECT_THAT(full_format.str(), HasSubstr(range_formatted)); + } + } +} + +// Creates a string_view spanning a whole string literal. +// Works correctly with strings containing null bytes. +template <std::size_t N> +constexpr std::string_view string_view_from_literal(const char (&s)[N]) { + return std::string_view(s, N - 1); +} + +// The following regressions have been found by a fuzzer, so the input might +// look a bit 'funny'. Nevertheless, they expose real bugs in the code. + +[[maybe_unused]] void TestForNonCrash(std::string_view input) { + using verible::EscapeString; + FormatStyle style; + std::ostringstream stream; + const auto status = FormatVerilog(input, "<filename>", style, stream); + // If we are here, we did at least not crash, which is all we desire for + // the fuzzer tests. + // Other issues that are reported correctly (probably due to strange inputs + // generated by the fuzzer) are ok, so we just log them here FYI. + if (!status.ok()) { + LOG(INFO) << "No crash, but format failed for other reason: " + << status.message() << "\nEscaped input: \"" + << EscapeString(input) << "\""; + } +} + +#if 0 +// https://github.com/chipsalliance/verible/issues/1381 +TEST(FormatterEndToEndTest, FuzzingRegression_1381) { + TestForNonCrash(string_view_from_literal("P#(\0\0//\0//\0,);")); + TestForNonCrash(string_view_from_literal("P#(\0\0//\0,,//\0,")); +} +#endif + +// https://github.com/chipsalliance/verible/issues/1384 +TEST(FormatterEndToEndTest, FuzzingRegression_UseAfterFree_1384) { + TestForNonCrash("`c(`c(//););"); +} + +// https://github.com/chipsalliance/verible/issues/1386 +TEST(FormatterEndToEndTest, FuzzingRegressionHierachyInvariant) { + // Original sample input from fuzzer + TestForNonCrash(string_view_from_literal("`c(`c()\0;);")); + // Lexically correct variant (`\0` -> `\n`) + TestForNonCrash(string_view_from_literal("`c(`c()\n;);")); + // Lexically correct variant (`\0` removed) + TestForNonCrash(string_view_from_literal("`c(`c(););")); +} + +// Possibly same ? https://github.com/chipsalliance/verible/issues/1386 +TEST(FormatterEndToEndTest, FuzzingRegression_outofmemory) { + TestForNonCrash(string_view_from_literal("`f(1'O`f())\n")); +} + +} // namespace +} // namespace formatter +} // namespace verilog