diff options
| author | Jack Koenig | 2021-07-08 15:30:28 -0700 |
|---|---|---|
| committer | GitHub | 2021-07-08 15:30:28 -0700 |
| commit | 16c0b53e04f3a78ddaaa382936cd660523a57199 (patch) | |
| tree | 789eb837a11e71c51de86711dee556f47f79a4f6 /core/src/main | |
| parent | bb520b8573328fda5f7b3c3892e6995fbe1b4239 (diff) | |
Fix chisel3 <> for Bundles that contain compatibility Bundles (#2023)
BiConnect in chisel3 delegates to FIRRTL <- semantics whenever it hits a
Bundle defined in `import Chisel._`. Because chisel3 <> is commutative
it needs to be mindful of flippedness when emitting a FIRRTL <- (which
is *not* commutative).
Diffstat (limited to 'core/src/main')
| -rw-r--r-- | core/src/main/scala/chisel3/internal/BiConnect.scala | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/core/src/main/scala/chisel3/internal/BiConnect.scala b/core/src/main/scala/chisel3/internal/BiConnect.scala index 1ee149ee..fcea4fe2 100644 --- a/core/src/main/scala/chisel3/internal/BiConnect.scala +++ b/core/src/main/scala/chisel3/internal/BiConnect.scala @@ -113,14 +113,23 @@ private[chisel3] object BiConnect { } } } - // Handle Records defined in Chisel._ code (change to NotStrict) - case (left_r: Record, right_r: Record) => (left_r.compileOptions, right_r.compileOptions) match { - case (ExplicitCompileOptions.NotStrict, _) => - left_r.bulkConnect(right_r)(sourceInfo, ExplicitCompileOptions.NotStrict) - case (_, ExplicitCompileOptions.NotStrict) => - left_r.bulkConnect(right_r)(sourceInfo, ExplicitCompileOptions.NotStrict) - case _ => recordConnect(sourceInfo, connectCompileOptions, left_r, right_r, context_mod) - } + // Handle Records defined in Chisel._ code by emitting a FIRRTL partial connect + case pair @ (left_r: Record, right_r: Record) => + val notStrict = + Seq(left_r.compileOptions, right_r.compileOptions).contains(ExplicitCompileOptions.NotStrict) + if (notStrict) { + // chisel3 <> is commutative but FIRRTL <- is not + val flipped = { + // Everything is flipped when it's the port of a child + val childPort = left_r._parent.get != context_mod + val isFlipped = left_r.direction == ActualDirection.Bidirectional(ActualDirection.Flipped) + isFlipped ^ childPort + } + val (newLeft, newRight) = if (flipped) pair.swap else pair + newLeft.bulkConnect(newRight)(sourceInfo, ExplicitCompileOptions.NotStrict) + } else { + recordConnect(sourceInfo, connectCompileOptions, left_r, right_r, context_mod) + } // Handle Records connected to DontCare (change to NotStrict) case (left_r: Record, DontCare) => |
