-
Notifications
You must be signed in to change notification settings - Fork 320
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[FIRRTL] Initial support for classes and objects in Dedup. (#6582)
This adds initial support for Dedup to handle deduping classes and objects. For the most part, this amounts to ensuring core functionality is implemented in terms of the FModuleLike and FInstanceLike interfaces, which classes and objects implement, respectively. There are a couple places where some specific logic is added for objects, similar to the specific logic that was already there for instance ops. Finally, a small change related to paths is needed in LowerClasses. There is some logic there that confirms a hierarchical path's root module is contained within the path's owning module. In the case of deduping hierarchical paths, an extra layer of hierarchy is added to hierpath ops, which breaks this logic. A new condition is added, and if the owning module is anywhere in the hierarchical path, it is used as the root module. An end-to-end firtool test is added to demonstrate that classes and objects dedup, and the final paths are valid in both the local and hierarchical cases. This initial support is capable of generating valid paths, but does not actually confirm that paths which dedup point to entities that dedup. Comments have been left, and a ticket opened to address this: #6583. This initial support does not handle references to objects in class ports, in the case the objects' classes are deduped. A ticket has also been opened to address this: #6603
- Loading branch information
1 parent
cb19b54
commit 19d522f
Showing
3 changed files
with
194 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
; RUN: firtool %s -ir-verilog | FileCheck %s | ||
|
||
FIRRTL version 3.3.0 | ||
|
||
circuit Test : %[[ | ||
{ | ||
"class": "firrtl.transforms.MustDeduplicateAnnotation", | ||
"modules": ["~Test|CPU_1", "~Test|CPU_2"] | ||
} | ||
]] | ||
; CHECK: hw.hierpath private [[NLA1:@.+]] [@Test::@sym, @CPU_1::[[SYM1:@.+]]] | ||
; CHECK: hw.hierpath private [[NLA2:@.+]] [@Test::@sym, @CPU_1::[[SYM2:@.+]], @Fetch_1::[[SYM3:@.+]]] | ||
module Test : | ||
input in : UInt<1> | ||
output out_1 : UInt<1> | ||
output out_2 : UInt<1> | ||
output om_out_1 : AnyRef | ||
output om_out_2 : AnyRef | ||
inst cpu_1 of CPU_1 | ||
inst cpu_2 of CPU_2 | ||
connect cpu_1.in, in | ||
connect cpu_2.in, in | ||
connect out_1, cpu_1.out | ||
connect out_2, cpu_2.out | ||
propassign om_out_1, cpu_1.om_out | ||
propassign om_out_2, cpu_2.om_out | ||
|
||
; CHECK-LABEL: hw.module private @CPU_1 | ||
; CHECK-SAME: out out : i1 {hw.exportPort = #hw<innerSym[[SYM1]]>} | ||
module CPU_1 : | ||
input in : UInt<1> | ||
output out : UInt<1> | ||
output om_out : AnyRef | ||
|
||
object om of OM_1 | ||
propassign om_out, om | ||
|
||
; CHECK: hw.instance "fetch_1" sym [[SYM2]] | ||
inst fetch_1 of Fetch_1 | ||
inst fetch_2 of Fetch_1 | ||
connect fetch_1.in, in | ||
connect fetch_2.in, in | ||
connect out, fetch_1.out | ||
|
||
; CHECK-NOT: CPU_2 | ||
module CPU_2 : | ||
input in : UInt<1> | ||
output out : UInt<1> | ||
output om_out : AnyRef | ||
|
||
object om of OM_2 | ||
propassign om_out, om | ||
|
||
inst fetch_1 of Fetch_2 | ||
inst fetch_2 of Fetch_2 | ||
connect fetch_1.in, in | ||
connect fetch_2.in, in | ||
connect out, fetch_1.out | ||
|
||
module Fetch_1 : | ||
input in : UInt<1> | ||
output out : UInt<1> | ||
; CHECK: %foo = sv.wire sym [[SYM3]] | ||
wire foo : UInt<1> | ||
connect foo, in | ||
connect out, foo | ||
|
||
; CHECK-NOT: Fetch_2 | ||
module Fetch_2 : | ||
input in : UInt<1> | ||
output out : UInt<1> | ||
wire foo : UInt<1> | ||
connect foo, in | ||
connect out, foo | ||
|
||
class Foo_1 : | ||
output out_foo : Integer | ||
propassign out_foo, Integer(1) | ||
|
||
class Foo_2 : | ||
output out_bar : Integer | ||
propassign out_bar, Integer(1) | ||
|
||
; CHECK-LABEL: om.class @OM_1(%basepath: !om.basepath) | ||
class OM_1 : | ||
output out_1 : Path | ||
output out_2 : Path | ||
output out_foo_1 : Inst<Foo_1> | ||
output out_foo_2 : Inst<Foo_2> | ||
|
||
object foo_1 of Foo_1 | ||
propassign out_foo_1, foo_1 | ||
|
||
object foo_2 of Foo_2 | ||
propassign out_foo_2, foo_2 | ||
|
||
; CHECK: om.path_create reference %basepath [[NLA1]] | ||
propassign out_1, path("OMReferenceTarget:~Test|CPU_1>out") | ||
; CHECK: om.path_create reference %basepath [[NLA2]] | ||
propassign out_2, path("OMReferenceTarget:~Test|CPU_1/fetch_1:Fetch_1>foo") | ||
|
||
; CHECK-NOT: OM_2 | ||
class OM_2 : | ||
output out_1 : Path | ||
output out_2 : Path | ||
output out_foo_1 : Inst<Foo_1> | ||
output out_foo_2 : Inst<Foo_2> | ||
|
||
object foo_1 of Foo_1 | ||
propassign out_foo_1, foo_1 | ||
|
||
object foo_2 of Foo_2 | ||
propassign out_foo_2, foo_2 | ||
|
||
propassign out_1, path("OMReferenceTarget:~Test|CPU_2>out") | ||
propassign out_2, path("OMReferenceTarget:~Test|CPU_2/fetch_1:Fetch_2>foo") |