Skip to content

Commit 48a03f3

Browse files
authored
Merge pull request #2190 from sconwayaus/package_localparam
[proper-parameter-declaration] parameter vs localparam in packages
2 parents f273154 + d33c0a9 commit 48a03f3

File tree

4 files changed

+186
-32
lines changed

4 files changed

+186
-32
lines changed

verilog/analysis/checkers/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1745,6 +1745,7 @@ cc_library(
17451745
"//common/analysis:syntax-tree-lint-rule",
17461746
"//common/analysis/matcher",
17471747
"//common/analysis/matcher:bound-symbol-manager",
1748+
"//common/text:config-utils",
17481749
"//common/text:symbol",
17491750
"//common/text:syntax-tree-context",
17501751
"//verilog/CST:context-functions",
@@ -1753,6 +1754,7 @@ cc_library(
17531754
"//verilog/analysis:descriptions",
17541755
"//verilog/analysis:lint-rule-registry",
17551756
"//verilog/parser:verilog-token-enum",
1757+
"@com_google_absl//absl/status",
17561758
"@com_google_absl//absl/strings:string_view",
17571759
],
17581760
alwayslink = 1,

verilog/analysis/checkers/proper_parameter_declaration_rule.cc

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616

1717
#include <set>
1818

19+
#include "absl/status/status.h"
1920
#include "absl/strings/string_view.h"
2021
#include "common/analysis/lint_rule_status.h"
2122
#include "common/analysis/matcher/bound_symbol_manager.h"
2223
#include "common/analysis/matcher/matcher.h"
24+
#include "common/text/config_utils.h"
2325
#include "common/text/symbol.h"
2426
#include "common/text/syntax_tree_context.h"
2527
#include "verilog/CST/context_functions.h"
@@ -40,25 +42,66 @@ using verible::matcher::Matcher;
4042
// Register ProperParameterDeclarationRule
4143
VERILOG_REGISTER_LINT_RULE(ProperParameterDeclarationRule);
4244

43-
static constexpr absl::string_view kParameterMessage =
44-
"\'parameter\' declarations should only be within packages or in the "
45-
"formal parameter list of modules/classes.";
46-
static constexpr absl::string_view kLocalParamMessage =
47-
"\'localparam\' declarations should only be within modules\' or classes\' "
45+
static constexpr absl::string_view kParameterNotInPackageMessage =
46+
"\'parameter\' declarations should only be in the formal parameter list of "
47+
"modules/classes.";
48+
static constexpr absl::string_view kParameterAllowPackageMessage =
49+
"\'parameter\' declarations should only be in the formal parameter list of "
50+
"modules and classes or in package definition bodies.";
51+
static constexpr absl::string_view kLocalParamNotInPackageMessage =
52+
"\'localparam\' declarations should only be within modules or class "
4853
"definition bodies.";
54+
static constexpr absl::string_view kLocalParamAllowPackageMessage =
55+
"\'localparam\' declarations should only be within modules, packages or "
56+
"class definition bodies.";
57+
58+
static absl::string_view kParameterMessage = kParameterNotInPackageMessage;
59+
static absl::string_view kLocalParamMessage = kLocalParamAllowPackageMessage;
4960

5061
const LintRuleDescriptor &ProperParameterDeclarationRule::GetDescriptor() {
5162
static const LintRuleDescriptor d{
5263
.name = "proper-parameter-declaration",
5364
.topic = "constants",
5465
.desc =
5566
"Checks that every `parameter` declaration is inside a "
56-
"package or in the formal parameter list of modules/classes and "
57-
"every `localparam` declaration is inside a module or class.",
58-
};
67+
"formal parameter list of modules/classes and "
68+
"every `localparam` declaration is inside a module, class or "
69+
"package.",
70+
.param = {
71+
{
72+
.name = "package_allow_parameter",
73+
.default_value = "true",
74+
.description = "Allow parameters in packages (treated as a "
75+
"synonym for localparam).",
76+
},
77+
{
78+
.name = "package_allow_localparam",
79+
.default_value = "false",
80+
.description = "Allow localparams in packages.",
81+
},
82+
}};
5983
return d;
6084
}
6185

86+
absl::Status ProperParameterDeclarationRule::Configure(
87+
absl::string_view configuration) {
88+
using verible::config::SetBool;
89+
auto status = verible::ParseNameValues(
90+
configuration,
91+
{
92+
{"package_allow_parameter", SetBool(&package_allow_parameter_)},
93+
{"package_allow_localparam", SetBool(&package_allow_localparam_)},
94+
});
95+
96+
// Change the message slightly
97+
kParameterMessage = package_allow_parameter_ ? kParameterAllowPackageMessage
98+
: kParameterNotInPackageMessage;
99+
kLocalParamMessage = package_allow_localparam_
100+
? kLocalParamAllowPackageMessage
101+
: kLocalParamNotInPackageMessage;
102+
return status;
103+
}
104+
62105
static const Matcher &ParamDeclMatcher() {
63106
static const Matcher matcher(NodekParamDeclaration());
64107
return matcher;
@@ -79,11 +122,24 @@ void ProperParameterDeclarationRule::HandleSymbol(
79122
} else if (ContextIsInsideModule(context) &&
80123
!ContextIsInsideFormalParameterList(context)) {
81124
violations_.insert(LintViolation(symbol, kParameterMessage, context));
125+
} else if (ContextIsInsidePackage(context)) {
126+
if (!package_allow_parameter_) {
127+
violations_.insert(LintViolation(symbol, kParameterMessage, context));
128+
}
82129
}
83130
} else if (param_decl_token == TK_localparam) {
84-
// If the context is not inside a class or module, report violation.
131+
// Raise violation if the context is not inside a class, package or
132+
// module, report violation.
85133
if (!ContextIsInsideClass(context) && !ContextIsInsideModule(context)) {
86-
violations_.insert(LintViolation(symbol, kLocalParamMessage, context));
134+
if (!ContextIsInsidePackage(context)) {
135+
violations_.insert(
136+
LintViolation(symbol, kLocalParamMessage, context));
137+
} else {
138+
if (!package_allow_localparam_) {
139+
violations_.insert(
140+
LintViolation(symbol, kLocalParamMessage, context));
141+
}
142+
}
87143
}
88144
}
89145
}

verilog/analysis/checkers/proper_parameter_declaration_rule.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
#include <set>
1919

20+
#include "absl/status/status.h"
21+
#include "absl/strings/string_view.h"
2022
#include "common/analysis/lint_rule_status.h"
2123
#include "common/analysis/syntax_tree_lint_rule.h"
2224
#include "common/text/symbol.h"
@@ -40,8 +42,13 @@ class ProperParameterDeclarationRule : public verible::SyntaxTreeLintRule {
4042

4143
verible::LintRuleStatus Report() const final;
4244

45+
absl::Status Configure(absl::string_view configuration) final;
46+
4347
private:
4448
std::set<verible::LintViolation> violations_;
49+
50+
bool package_allow_parameter_ = true;
51+
bool package_allow_localparam_ = false;
4552
};
4653

4754
} // namespace analysis

verilog/analysis/checkers/proper_parameter_declaration_rule_test.cc

Lines changed: 111 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ namespace analysis {
2727
namespace {
2828

2929
using verible::LintTestCase;
30+
using verible::RunConfiguredLintTestCases;
3031
using verible::RunLintTestCases;
3132

3233
// Tests that ProperParameterDeclarationRule does not report a violation when
@@ -41,20 +42,28 @@ TEST(ProperParameterDeclarationRuleTest, BasicTests) {
4142
RunLintTestCases<VerilogAnalyzer, ProperParameterDeclarationRule>(kTestCases);
4243
}
4344

44-
// Tests that the expected number of parameter usage violations are found.
45-
TEST(ProperParameterDeclarationRuleTest, ParameterTests) {
45+
// Tests rejection of package parameters and allow package localparams
46+
TEST(ProperParameterDeclarationRuleTest, RejectPackageParameters) {
4647
const std::initializer_list<LintTestCase> kTestCases = {
4748
{"parameter int Foo = 1;"},
48-
{"package foo; parameter int Bar = 1; endpackage"},
49-
{"package foo; parameter int Bar = 1; parameter int Bar2 = 2; "
49+
{"package foo; ",
50+
{TK_parameter, "parameter"},
51+
" int Bar = 1; endpackage"},
52+
{"package foo; ",
53+
{TK_parameter, "parameter"},
54+
" int Bar = 1; ",
55+
{TK_parameter, "parameter"},
56+
" int Bar2 = 2; "
5057
"endpackage"},
5158
{"module foo #(parameter int Bar = 1); endmodule"},
5259
{"module foo #(int Bar = 1); endmodule"},
5360
{"class foo #(parameter int Bar = 1); endclass"},
5461
{"module foo #(parameter type Foo); endmodule"},
5562
{"module foo; ", {TK_parameter, "parameter"}, " int Bar = 1; endmodule"},
5663
{"class foo; ", {TK_parameter, "parameter"}, " int Bar = 1; endclass"},
57-
{"package foo; class bar; endclass parameter int HelloWorld = 1; "
64+
{"package foo; class bar; endclass ",
65+
{TK_parameter, "parameter"},
66+
" int HelloWorld = 1; "
5867
"endpackage"},
5968
{"package foo; class bar; ",
6069
{TK_parameter, "parameter"},
@@ -69,8 +78,20 @@ TEST(ProperParameterDeclarationRuleTest, ParameterTests) {
6978
{"module foo #(parameter type Bar); ",
7079
{TK_parameter, "parameter"},
7180
" type Bar2; endmodule"},
81+
{"module foo #(parameter type Bar);"
82+
"module innerFoo #("
83+
"parameter type innerBar,",
84+
"localparam int j = 2)();",
85+
{TK_parameter, "parameter"},
86+
" int i = 1;"
87+
"localparam int j = 2;"
88+
"endmodule "
89+
"endmodule"},
7290
};
73-
RunLintTestCases<VerilogAnalyzer, ProperParameterDeclarationRule>(kTestCases);
91+
92+
RunConfiguredLintTestCases<VerilogAnalyzer, ProperParameterDeclarationRule>(
93+
kTestCases,
94+
"package_allow_parameter:false;package_allow_localparam:true");
7495
}
7596

7697
// Tests that the expected number of localparam usage violations are found.
@@ -83,18 +104,17 @@ TEST(ProperParameterDeclarationRuleTest, LocalParamTests) {
83104
{"module foo #(localparam int Bar = 1); endmodule"},
84105
{"module foo #(localparam type Bar); endmodule"},
85106
{"class foo #(localparam int Bar = 1); endclass"},
86-
{{TK_localparam, "localparam"}, " int Bar = 1;"},
87-
{"package foo; ",
88-
{TK_localparam, "localparam"},
89-
" int Bar = 1; endpackage"},
90-
{"package foo; class bar; endclass ",
91-
{TK_localparam, "localparam"},
92-
" int HelloWorld = 1; "
107+
{{TK_localparam, "localparam"},
108+
" int Bar = 1;"}, // localparam defined outside a module or package
109+
{"package foo; localparam int Bar = 1; endpackage"},
110+
{"package foo; class bar; endclass localparam int HelloWorld = 1; "
93111
"endpackage"},
94112
{"package foo; class bar; localparam int HelloWorld = 1; endclass "
95113
"endpackage"},
96114
};
97-
RunLintTestCases<VerilogAnalyzer, ProperParameterDeclarationRule>(kTestCases);
115+
RunConfiguredLintTestCases<VerilogAnalyzer, ProperParameterDeclarationRule>(
116+
kTestCases,
117+
"package_allow_parameter:false;package_allow_localparam:true");
98118
}
99119

100120
// Tests that the expected number of localparam and parameter usage violations
@@ -104,9 +124,10 @@ TEST(ProperParameterDeclarationRuleTest, CombinationParametersTest) {
104124
{"parameter int Foo = 1; ",
105125
{TK_localparam, "localparam"},
106126
" int Bar = 1;"},
107-
{"package foo; parameter int Bar = 1; ",
108-
{TK_localparam, "localparam"},
109-
" int Bar2 = 2; "
127+
{"package foo; ",
128+
{TK_parameter, "parameter"},
129+
" int Bar = 1; ",
130+
"localparam int Bar2 = 2; "
110131
"endpackage"},
111132
{"module foo #(parameter int Bar = 1); localparam int Bar2 = 2; "
112133
"endmodule"},
@@ -121,17 +142,85 @@ TEST(ProperParameterDeclarationRuleTest, CombinationParametersTest) {
121142
{"class foo; ",
122143
{TK_parameter, "parameter"},
123144
" int Bar = 1; localparam int Bar2 = 2; endclass"},
124-
{"package foo; class bar; localparam int Bar2 = 2; endclass parameter "
125-
"int HelloWorld = 1; "
145+
{"package foo; class bar; localparam int Bar2 = 2; endclass ",
146+
{TK_parameter, "parameter"},
147+
" int HelloWorld = 1; "
126148
"endpackage"},
127149
{"package foo; ",
128-
{TK_localparam, "localparam"},
129-
" int Bar2 = 2; class bar; endclass parameter "
130-
"int HelloWorld = 1; "
150+
"localparam",
151+
" int Bar2 = 2; class bar; endclass ",
152+
{TK_parameter, "parameter"},
153+
" int HelloWorld = 1; "
131154
"endpackage"},
132155
{"parameter int Foo = 1; module bar; localparam int Bar2 = 2; "
133156
"endmodule"},
134157
};
158+
RunConfiguredLintTestCases<VerilogAnalyzer, ProperParameterDeclarationRule>(
159+
kTestCases,
160+
"package_allow_parameter:false;package_allow_localparam:true");
161+
}
162+
163+
// package parameters allowed, package localparam's are rejected
164+
TEST(ProperParameterDeclarationRuleTest, AllowPackageParameters) {
165+
const std::initializer_list<LintTestCase> kTestCases = {
166+
{"parameter int Foo = 1;"},
167+
{"package foo; parameter int Bar = 1; endpackage"},
168+
{"package foo; ",
169+
{TK_localparam, "localparam"},
170+
" int Bar = 1; endpackage"},
171+
{"package foo; parameter int Bar = 1; "
172+
"parameter int Bar2 = 2; "
173+
"endpackage"},
174+
{"module foo #(parameter int Bar = 1); endmodule"},
175+
{"module foo #(int Bar = 1); endmodule"},
176+
{"class foo #(parameter int Bar = 1); endclass"},
177+
{"module foo #(parameter type Foo); endmodule"},
178+
{"module foo; ", {TK_parameter, "parameter"}, " int Bar = 1; endmodule"},
179+
{"class foo; ", {TK_parameter, "parameter"}, " int Bar = 1; endclass"},
180+
{"package foo; class bar; endclass ",
181+
"parameter int HelloWorld = 1; "
182+
"endpackage"},
183+
{"package foo; class bar; ",
184+
{TK_parameter, "parameter"},
185+
" int HelloWorld = 1; endclass "
186+
"endpackage"},
187+
{"module foo #(parameter int Bar = 1); ",
188+
{TK_parameter, "parameter"},
189+
" int HelloWorld = 1; "
190+
"endmodule"},
191+
{"module foo #(parameter type Foo, parameter int Bar = 1); "
192+
"endmodule"},
193+
{"module foo #(parameter type Bar); ",
194+
{TK_parameter, "parameter"},
195+
" type Bar2; endmodule"},
196+
{"module foo #(parameter type Bar);"
197+
"module innerFoo #("
198+
"parameter type innerBar,",
199+
"localparam int j = 2)();",
200+
{TK_parameter, "parameter"},
201+
" int i = 1;"
202+
"localparam int j = 2;"
203+
"endmodule "
204+
"endmodule"},
205+
{"module foo; localparam int Bar = 1; endmodule"},
206+
{"class foo; localparam int Bar = 1; endclass"},
207+
{"module foo; localparam int Bar = 1; localparam int Bar2 = 2; "
208+
"endmodule"},
209+
{"module foo #(localparam int Bar = 1); endmodule"},
210+
{"module foo #(localparam type Bar); endmodule"},
211+
{"class foo #(localparam int Bar = 1); endclass"},
212+
{{TK_localparam, "localparam"}, " int Bar = 1;"},
213+
{"package foo; ",
214+
{TK_localparam, "localparam"},
215+
" int Bar = 1; endpackage"},
216+
{"package foo; class bar; endclass ",
217+
{TK_localparam, "localparam"},
218+
" int HelloWorld = 1; "
219+
"endpackage"},
220+
{"package foo; class bar; localparam int HelloWorld = 1; endclass "
221+
"endpackage"},
222+
};
223+
135224
RunLintTestCases<VerilogAnalyzer, ProperParameterDeclarationRule>(kTestCases);
136225
}
137226

0 commit comments

Comments
 (0)