[FIRRTL][IMDCE] Extend weak annotation support to more than ports
- 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.