Skip to content

Commit

Permalink
newrule209 package_item_not_in_package
Browse files Browse the repository at this point in the history
  • Loading branch information
DaveMcEwan committed Nov 11, 2023
1 parent 20c84ef commit 1f599a5
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 0 deletions.
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

0 comments on commit 1f599a5

Please sign in to comment.