llvm / llvm/circt

[FIRRTL][IMDCE] Extend weak annotation support to more than ports

Open
#6,060 2 comments 0 reactions 1 assignee Claimed by @uenoku View on GitHub
enhancement FIRRTL
Dominant language
C++
Stars
2.2k
Forks
524
Avg merge
3d 2h
Merged PRs (30d)
46

Description

IMDCE has special handling for certain annotations that is considers "weak", I believe regarding their use of the hierpath symbol.

This is only done for ports, and should be extended to other places annotations appear, such as on wires.

Testcase (modified current existing lit test for handling weak) below, see #6046 for some discussion.

```
firrtl.circuit "Top" {
// CHECK-NOT: @nla_1
// CHECK: @nla_2
hw.hierpath private @nla_1 [@Foo1::@dead, @EncodingModule]
hw.hierpath private @nla_2 [@Foo2::@live, @EncodingModule]
// CHECK-LABEL: private @EncodingModule
// CHECK-NOT: @nla_1
// CHECK-SAME: @nla_2
firrtl.module private @EncodingModule(in %in: !firrtl.uint<1>, out %a: !firrtl.uint<1> [{circt.nonlocal = @nla_1, class = "freechips.rocketchip.objectmodel.OMIRTracker", id = 0 : i64, type = "OMReferenceTarget"}, {circt.nonlocal = @nla_2, class = "freechips.rocketchip.objectmodel.OMIRTracker", id = 1 : i64, type = "OMReferenceTarget"}]) {
firrtl.strictconnect %a, %in : !firrtl.uint<1>
// CHECK: firrtl.wire
// CHECK-NOT: @nla_1
// CHECK-SAME: @nla_2
firrtl.wire {annotations = [{circt.nonlocal = @nla_1,
class = "freechips.rocketchip.objectmodel.OMIRTracker",
id = 2 : i64,
type = "OMMemberReferenceTarget"},
{circt.nonlocal = @nla_2,
class = "freechips.rocketchip.objectmodel.OMIRTracker",
id = 3 : i64,
type = "OMMemberReferenceTarget"}]} : !firrtl.uint<1>
}
// CHECK-NOT: @Foo1
firrtl.module private @Foo1(in %in: !firrtl.uint<1>) {
%c_in, %c_a = firrtl.instance c sym @dead @EncodingModule(in in: !firrtl.uint<1>, out a: !firrtl.uint<1>)
firrtl.strictconnect %c_in, %in : !firrtl.uint<1>
}
// CHECK-LABEL: @Foo2
firrtl.module private @Foo2(in %in: !firrtl.uint<1>, out %a: !firrtl.uint<1>) {
%c_in, %c_a = firrtl.instance c sym @live @EncodingModule(in in: !firrtl.uint<1>, out a: !firrtl.uint<1>)
firrtl.strictconnect %a, %c_a : !firrtl.uint<1>
firrtl.strictconnect %c_in, %in : !firrtl.uint<1>
}
// CHECK-LABEL: @Top
// CHECK-NOT: @Foo1
// CHECK-NOT: firrtl.strictconnect %foo1_in, %in
// CHECK: @Foo2
firrtl.module @Top(in %in: !firrtl.uint<1>, out %a: !firrtl.uint<1>) {
%foo1_in = firrtl.instance foo1 @Foo1(in in: !firrtl.uint<1>)
firrtl.strictconnect %foo1_in, %in : !firrtl.uint<1>
%foo2_in, %foo2_a = firrtl.instance foo2 @Foo2(in in: !firrtl.uint<1>, out a: !firrtl.uint<1>)
firrtl.strictconnect %a, %foo2_a : !firrtl.uint<1>
firrtl.strictconnect %foo2_in, %in : !firrtl.uint<1>

}
}
```

By adding the wire, `@nla_1` is now kept, but for both the port and wire it should be removed as its path is dead.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.