diff options
| author | Chick Markley | 2019-05-13 18:08:25 -0700 |
|---|---|---|
| committer | GitHub | 2019-05-13 18:08:25 -0700 |
| commit | 89ef4d78e8f44f31df6530a6a4dee20d0ad0399f (patch) | |
| tree | fb7948f90429b41af789252751d80e347e1142dd /chiselFrontend/src/main/scala/chisel3/core/MultiClock.scala | |
| parent | df0e0b1cc4b566fc098ac3a6d34ec6d9a551d21d (diff) | |
RawModule with no reset should be able to use withClock method. (#1065)
* RawModule with no reset should be able to use withClock method.
- refactor ClockAndReset
- now has `clockOpt: Option[Clock]` and `resetOpt: Option[Reset]` constructor params
- convenience methods clock and reset tries to deref the option
- ClockAndReset.empty is factory method for (None, None)
- In Builder
- forcedClock does not check resetOpt now
- forcedReset does not check clockOpt now
- withClock no longer looks at resetOpt
- withReset no longer looks at clockOpt
- Module starts with empty ClockAndReset
* RawModule with no reset should be able to use withClock method.
Refactor again based on @ducky64 comments
- refactor away ClockAndReset, now builder just has a
- currentClock
- currentReset
- withClock, withRest, withClockAndReset just use these fields directly
* RawModule with no reset should be able to use withClock method.
- Fixed typo in withReset handler, now picks up new reset
Diffstat (limited to 'chiselFrontend/src/main/scala/chisel3/core/MultiClock.scala')
| -rw-r--r-- | chiselFrontend/src/main/scala/chisel3/core/MultiClock.scala | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/MultiClock.scala b/chiselFrontend/src/main/scala/chisel3/core/MultiClock.scala index 6af4da41..aaa03d78 100644 --- a/chiselFrontend/src/main/scala/chisel3/core/MultiClock.scala +++ b/chiselFrontend/src/main/scala/chisel3/core/MultiClock.scala @@ -2,14 +2,9 @@ package chisel3.core -import scala.language.experimental.macros - import chisel3.internal._ -import chisel3.internal.Builder.pushCommand -import chisel3.internal.firrtl._ -import chisel3.internal.sourceinfo.{SourceInfo} -private[chisel3] final case class ClockAndReset(clock: Clock, reset: Reset) +import scala.language.experimental.macros object withClockAndReset { // scalastyle:ignore object.name /** Creates a new Clock and Reset scope @@ -21,11 +16,17 @@ object withClockAndReset { // scalastyle:ignore object.name */ def apply[T](clock: Clock, reset: Reset)(block: => T): T = { // Save parentScope - val parentScope = Builder.currentClockAndReset - Builder.currentClockAndReset = Some(ClockAndReset(clock, reset)) + val parentClock = Builder.currentClock + val parentReset = Builder.currentReset + + Builder.currentClock = Some(clock) + Builder.currentReset = Some(reset) + val res = block // execute block + // Return to old scope - Builder.currentClockAndReset = parentScope + Builder.currentClock = parentClock + Builder.currentReset = parentReset res } } @@ -37,8 +38,15 @@ object withClock { // scalastyle:ignore object.name * @param block the block of code to run with new implicit Clock * @return the result of the block */ - def apply[T](clock: Clock)(block: => T): T = - withClockAndReset(clock, Module.reset)(block) + def apply[T](clock: Clock)(block: => T): T = { + // Save parentScope + val parentClock = Builder.currentClock + Builder.currentClock = Some(clock) + val res = block // execute block + // Return to old scope + Builder.currentClock = parentClock + res + } } object withReset { // scalastyle:ignore object.name @@ -48,7 +56,15 @@ object withReset { // scalastyle:ignore object.name * @param block the block of code to run with new implicit Reset * @return the result of the block */ - def apply[T](reset: Reset)(block: => T): T = - withClockAndReset(Module.clock, reset)(block) + def apply[T](reset: Reset)(block: => T): T = { + // Save parentScope + val parentReset = Builder.currentReset + Builder.currentReset = Some(reset) + val res = block // execute block + // Return to old scope + Builder.currentReset = parentReset + res + } + } |
