Skip to content

Commit

Permalink
Support Vecs of empty Bundles
Browse files Browse the repository at this point in the history
  • Loading branch information
jackkoenig committed May 24, 2022
1 parent 77a6c93 commit f3ce3c8
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
4 changes: 3 additions & 1 deletion core/src/main/scala/chisel3/Aggregate.scala
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,8 @@ sealed class Vec[T <: Data] private[chisel3] (gen: => T, val length: Int) extend

// Since all children are the same, we can just use the sample_element rather than all children
// .get is safe because None means mixed directions, we only pass 1 so that's not possible
direction = ActualDirection.fromChildren(Set(sample_element.direction), resolvedDirection).get
direction =
ActualDirection.fromChildren(Set(sample_element.direction), resolvedDirection).getOrElse(ActualDirection.Empty)
}

// Note: the constructor takes a gen() function instead of a Seq to enforce
Expand Down Expand Up @@ -321,6 +322,7 @@ sealed class Vec[T <: Data] private[chisel3] (gen: => T, val length: Int) extend
case ActualDirection.Bidirectional(ActualDirection.Default) | ActualDirection.Unspecified =>
SpecifiedDirection.Unspecified
case ActualDirection.Bidirectional(ActualDirection.Flipped) => SpecifiedDirection.Flip
case ActualDirection.Empty => SpecifiedDirection.Unspecified
}
// TODO port technically isn't directly child of this data structure, but the result of some
// muxes / demuxes. However, this does make access consistent with the top-level bindings.
Expand Down
15 changes: 15 additions & 0 deletions src/test/scala/chiselTests/Vec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -517,4 +517,19 @@ class VecSpec extends ChiselPropSpec with Utils {
property("reduceTree should preserve input/output type") {
assertTesterPasses { new ReduceTreeTester() }
}

property("Vecs of empty Bundles should work") {
class EmptyBundle extends Bundle
val chirrtl = ChiselStage.emitChirrtl(new Module {
val idx = IO(Input(UInt(2.W)))
val in = IO(Input(new EmptyBundle))
val out = IO(Output(new EmptyBundle))

val reg = RegInit(0.U.asTypeOf(Vec(4, new EmptyBundle)))
reg(idx) := in
out := reg(idx)
})
chirrtl should include("input in : { }")
chirrtl should include("reg reg : { }[4]")
}
}

0 comments on commit f3ce3c8

Please sign in to comment.