summaryrefslogtreecommitdiff
path: root/chiselFrontend/src/main/scala/chisel3/core/MultiClock.scala
diff options
context:
space:
mode:
Diffstat (limited to 'chiselFrontend/src/main/scala/chisel3/core/MultiClock.scala')
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/MultiClock.scala54
1 files changed, 54 insertions, 0 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/MultiClock.scala b/chiselFrontend/src/main/scala/chisel3/core/MultiClock.scala
new file mode 100644
index 00000000..62163318
--- /dev/null
+++ b/chiselFrontend/src/main/scala/chisel3/core/MultiClock.scala
@@ -0,0 +1,54 @@
+// See LICENSE for license details.
+
+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: Bool)
+
+object withClockAndReset { // scalastyle:ignore object.name
+ /** Creates a new Clock and Reset scope
+ *
+ * @param clock the new implicit Clock
+ * @param reset the new implicit Reset
+ * @param block the block of code to run with new implicit Clock and Reset
+ * @return the result of the block
+ */
+ def apply[T](clock: Clock, reset: Bool)(block: => T): T = {
+ // Save parentScope
+ val parentScope = Builder.currentClockAndReset
+ Builder.currentClockAndReset = Some(ClockAndReset(clock, reset))
+ val res = block // execute block
+ // Return to old scope
+ Builder.currentClockAndReset = parentScope
+ res
+ }
+}
+
+object withClock { // scalastyle:ignore object.name
+ /** Creates a new Clock scope
+ *
+ * @param clock the new implicit Clock
+ * @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)
+}
+
+object withReset { // scalastyle:ignore object.name
+ /** Creates a new Reset scope
+ *
+ * @param reset the new implicit Reset
+ * @param block the block of code to run with new implicit Reset
+ * @return the result of the block
+ */
+ def apply[T](reset: Bool)(block: => T): T =
+ withClockAndReset(Module.clock, reset)(block)
+}
+