diff options
| author | Albert Magyar | 2019-01-22 11:13:35 -0800 |
|---|---|---|
| committer | GitHub | 2019-01-22 11:13:35 -0800 |
| commit | 26660ff96d323e74c12d3ab0d43883c51188ff7c (patch) | |
| tree | 8f649c7595d854aa5eb4e40a30b9a7d344d86254 /chiselFrontend/src/main | |
| parent | 99bb15f13491637f1c7ce58edb5ba494efc810dc (diff) | |
Add Rocket Chip-style clonemodule as CloneModuleAsRecord to experimental (#943)
Diffstat (limited to 'chiselFrontend/src/main')
| -rw-r--r-- | chiselFrontend/src/main/scala/chisel3/core/Module.scala | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Module.scala b/chiselFrontend/src/main/scala/chisel3/core/Module.scala index 8a1a5c8a..751d5401 100644 --- a/chiselFrontend/src/main/scala/chisel3/core/Module.scala +++ b/chiselFrontend/src/main/scala/chisel3/core/Module.scala @@ -2,6 +2,7 @@ package chisel3.core +import scala.collection.immutable.ListMap import scala.collection.mutable.{ArrayBuffer, HashMap} import scala.collection.JavaConversions._ import scala.language.experimental.macros @@ -115,6 +116,32 @@ object IO { } } +object BaseModule { + private[chisel3] class ClonePorts (elts: Data*)(implicit compileOptions: CompileOptions) extends Record { + val elements = ListMap(elts.map(d => d.instanceName -> d.cloneTypeFull): _*) + def apply(field: String) = elements(field) + override def cloneType = (new ClonePorts(elts: _*)).asInstanceOf[this.type] + } + + private[chisel3] def cloneIORecord(proto: BaseModule)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): ClonePorts = { + require(proto.isClosed, "Can't clone a module before module close") + val clonePorts = new ClonePorts(proto.getModulePorts: _*) + clonePorts.bind(WireBinding(Builder.forcedUserModule)) + val cloneInstance = new DefInstance(sourceInfo, proto, proto._component.get.ports) { + override def name = clonePorts.getRef.name + } + pushCommand(cloneInstance) + if (!compileOptions.explicitInvalidate) { + pushCommand(DefInvalid(sourceInfo, clonePorts.ref)) + } + if (proto.isInstanceOf[MultiIOModule]) { + clonePorts("clock") := Module.clock + clonePorts("reset") := Module.reset + } + clonePorts + } +} + /** Abstract base class for Modules, an instantiable organizational unit for RTL. */ // TODO: seal this? |
