Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New rule: package_item_not_in_package #272

Merged
merged 1 commit into from
Nov 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions MANUAL.md
Original file line number Diff line number Diff line change
Expand Up @@ -3545,6 +3545,41 @@ The most relevant clauses of IEEE1800-2017 are:



* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

## Syntax Rule: `package_item_not_in_package`

### Hint

Place item into a package, module, interface, program, udp, or config.

### Reason

Globally-scoped items are not supported by some tools.

### Pass Example (1 of 1)
```systemverilog
package P;
localparam int A = 1;
endpackage
```

### Fail Example (1 of 1)
```systemverilog
localparam int A = 1;
```

### Explanation

Some tools support items, like variables, nets, `task`, `function`, `class`,
`localparam`, `covergroup`, etc. to be defined outside of a `package`,
`module`, `program`, `interface` etc. which can lead to namespace issues.

The most relevant clauses of IEEE1800-2017 are:
- A.1.11 Package items



* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

## Syntax Rule: `parameter_default_value`
Expand Down
6 changes: 6 additions & 0 deletions md/syntaxrules-explanation-package_item_not_in_package.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Some tools support items, like variables, nets, `task`, `function`, `class`,
`localparam`, `covergroup`, etc. to be defined outside of a `package`,
`module`, `program`, `interface` etc. which can lead to namespace issues.

The most relevant clauses of IEEE1800-2017 are:
- A.1.11 Package items
60 changes: 60 additions & 0 deletions src/syntaxrules/package_item_not_in_package.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
use crate::config::ConfigOption;
use crate::linter::{SyntaxRule, SyntaxRuleResult};
use sv_parser::{NodeEvent, PackageItem, RefNode, SyntaxTree};

#[derive(Default)]
pub struct PackageItemNotUnderPackage {
under_package_declaration: bool,
}

impl SyntaxRule for PackageItemNotUnderPackage {
fn check(
&mut self,
_syntax_tree: &SyntaxTree,
event: &NodeEvent,
_option: &ConfigOption,
) -> SyntaxRuleResult {
let node = match event {
NodeEvent::Enter(x) => {
match x {
RefNode::PackageDeclaration(_) => {
self.under_package_declaration = true;
}
_ => ()
}
x
}
NodeEvent::Leave(x) => {
match x {
RefNode::PackageDeclaration(_) => {
self.under_package_declaration = false;
}
_ => ()
}
return SyntaxRuleResult::Pass;
}
};

if self.under_package_declaration {
SyntaxRuleResult::Pass
} else {
match node {
RefNode::PackageItem(PackageItem::PackageOrGenerateItemDeclaration(_)) |
RefNode::PackageItem(PackageItem::PackageExportDeclaration(_)) => SyntaxRuleResult::Fail,
_ => SyntaxRuleResult::Pass
}
}
}

fn name(&self) -> String {
String::from("package_item_not_in_package")
}

fn hint(&self, _option: &ConfigOption) -> String {
String::from("Place item into a package, module, interface, program, udp, or config.")
}

fn reason(&self) -> String {
String::from("Globally-scoped items are not supported by some tools.")
}
}
1 change: 1 addition & 0 deletions testcases/syntaxrules/fail/package_item_not_in_package.sv
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
localparam int A = 1;
3 changes: 3 additions & 0 deletions testcases/syntaxrules/pass/package_item_not_in_package.sv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package P;
localparam int A = 1;
endpackage