summaryrefslogtreecommitdiff
path: root/chiselFrontend/src/main/scala/chisel3/core/MonoConnect.scala
diff options
context:
space:
mode:
Diffstat (limited to 'chiselFrontend/src/main/scala/chisel3/core/MonoConnect.scala')
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/MonoConnect.scala43
1 files changed, 21 insertions, 22 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/MonoConnect.scala b/chiselFrontend/src/main/scala/chisel3/core/MonoConnect.scala
index 80e96ce7..3c34785f 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/MonoConnect.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/MonoConnect.scala
@@ -120,24 +120,23 @@ object MonoConnect {
// This function checks if element-level connection operation allowed.
// Then it either issues it or throws the appropriate exception.
def elemConnect(implicit sourceInfo: SourceInfo, connectCompileOptions: CompileOptions, sink: Element, source: Element, context_mod: UserModule): Unit = {
- import Direction.{Input, Output} // Using extensively so import these
+ import BindingDirection.{Internal, Input, Output} // Using extensively so import these
// If source has no location, assume in context module
// This can occur if is a literal, unbound will error previously
val sink_mod: BaseModule = sink.binding.location.getOrElse(throw UnwritableSinkException)
val source_mod: BaseModule = source.binding.location.getOrElse(context_mod)
- val sink_direction: Option[Direction] = sink.binding.direction
- val source_direction: Option[Direction] = source.binding.direction
- // None means internal
+ val sink_direction = BindingDirection.from(sink.topBinding, sink.direction)
+ val source_direction = BindingDirection.from(source.topBinding, source.direction)
// CASE: Context is same module that both left node and right node are in
if( (context_mod == sink_mod) && (context_mod == source_mod) ) {
((sink_direction, source_direction): @unchecked) match {
// SINK SOURCE
// CURRENT MOD CURRENT MOD
- case (Some(Output), _) => issueConnect(sink, source)
- case (None, _) => issueConnect(sink, source)
- case (Some(Input), _) => throw UnwritableSinkException
+ case (Output, _) => issueConnect(sink, source)
+ case (Internal, _) => issueConnect(sink, source)
+ case (Input, _) => throw UnwritableSinkException
}
}
@@ -148,19 +147,19 @@ object MonoConnect {
((sink_direction, source_direction): @unchecked) match {
// SINK SOURCE
// CURRENT MOD CHILD MOD
- case (None, Some(Output)) => issueConnect(sink, source)
- case (None, Some(Input)) => issueConnect(sink, source)
- case (Some(Output), Some(Output)) => issueConnect(sink, source)
- case (Some(Output), Some(Input)) => issueConnect(sink, source)
- case (_, None) => {
+ case (Internal, Output) => issueConnect(sink, source)
+ case (Internal, Input) => issueConnect(sink, source)
+ case (Output, Output) => issueConnect(sink, source)
+ case (Output, Input) => issueConnect(sink, source)
+ case (_, Internal) => {
if (!(connectCompileOptions.dontAssumeDirectionality)) {
issueConnect(sink, source)
} else {
throw UnreadableSourceException
}
}
- case (Some(Input), Some(Output)) if (!(connectCompileOptions.dontTryConnectionsSwapped)) => issueConnect(source, sink)
- case (Some(Input), _) => throw UnwritableSinkException
+ case (Input, Output) if (!(connectCompileOptions.dontTryConnectionsSwapped)) => issueConnect(source, sink)
+ case (Input, _) => throw UnwritableSinkException
}
}
@@ -171,9 +170,9 @@ object MonoConnect {
((sink_direction, source_direction): @unchecked) match {
// SINK SOURCE
// CHILD MOD CURRENT MOD
- case (Some(Input), _) => issueConnect(sink, source)
- case (Some(Output), _) => throw UnwritableSinkException
- case (None, _) => throw UnwritableSinkException
+ case (Input, _) => issueConnect(sink, source)
+ case (Output, _) => throw UnwritableSinkException
+ case (Internal, _) => throw UnwritableSinkException
}
}
@@ -187,17 +186,17 @@ object MonoConnect {
((sink_direction, source_direction): @unchecked) match {
// SINK SOURCE
// CHILD MOD CHILD MOD
- case (Some(Input), Some(Input)) => issueConnect(sink, source)
- case (Some(Input), Some(Output)) => issueConnect(sink, source)
- case (Some(Output), _) => throw UnwritableSinkException
- case (_, None) => {
+ case (Input, Input) => issueConnect(sink, source)
+ case (Input, Output) => issueConnect(sink, source)
+ case (Output, _) => throw UnwritableSinkException
+ case (_, Internal) => {
if (!(connectCompileOptions.dontAssumeDirectionality)) {
issueConnect(sink, source)
} else {
throw UnreadableSourceException
}
}
- case (None, _) => throw UnwritableSinkException
+ case (Internal, _) => throw UnwritableSinkException
}
}