summaryrefslogtreecommitdiff
path: root/src/main/scala/chisel3/util/experimental/Inline.scala
blob: 4039f3eddf8271f3a2b0bf07ee8d1303e92e73fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// See LICENSE for license details.

package chisel3.util.experimental

import chisel3._
import chisel3.internal.InstanceId
import chisel3.experimental.{BaseModule, ChiselAnnotation, RunFirrtlTransform}
import firrtl.Transform
import firrtl.passes.{InlineAnnotation, InlineInstances}
import firrtl.transforms.{NoDedupAnnotation, FlattenAnnotation, Flatten}
import firrtl.annotations.{CircuitName, ModuleName, ComponentName, Annotation}

/** Inlines an instance of a module
  *
  * @example {{{
  * trait Internals { this: Module =>
  *   val io = IO(new Bundle{ val a = Input(Bool()) })
  * }
  * class Sub extends Module with Internals
  * trait HasSub { this: Module with Internals =>
  *   val sub = Module(new Sub)
  *   sub.io.a := io.a
  * }
  * /* InlineInstance is mixed directly into Foo's definition. Every instance
  *  * of this will be inlined. */
  * class Foo extends Module with Internals with InlineInstance with HasSub
  * /* Bar will, by default, not be inlined */
  * class Bar extends Module with Internals with HasSub
  * /* The resulting instances will be:
  *  - Top
  *  - Top.x$sub
  *  - Top.y$sub
  *  - Top.z
  *  - Top.z.sub */
  * class Top extends Module with Internals {
  *   val x = Module(new Foo)                     // x will be inlined
  *   val y = Module(new Bar with InlineInstance) // y will also be inlined
  *   val z = Module(new Bar)                     // z will not be inlined
  *   Seq(x, y, z).map(_.io.a := io.a)
  * }
  * }}}
  */
trait InlineInstance { self: BaseModule =>
  Seq(new ChiselAnnotation with RunFirrtlTransform {
        def toFirrtl: Annotation = InlineAnnotation(self.toNamed)
        def transformClass: Class[_ <: Transform] = classOf[InlineInstances] },
      new ChiselAnnotation {
        def toFirrtl: Annotation = NoDedupAnnotation(self.toNamed) })
    .map(chisel3.experimental.annotate(_))
}