diff --git a/tapeout/src/main/scala/transforms/clkgen/ClkDivider.scala b/tapeout/src/main/scala/transforms/clkgen/ClkDivider.scala index 3f41a128..23402982 100644 --- a/tapeout/src/main/scala/transforms/clkgen/ClkDivider.scala +++ b/tapeout/src/main/scala/transforms/clkgen/ClkDivider.scala @@ -72,6 +72,9 @@ class SEClkDivider(divBy: Int, phases: Seq[Int], analogFile: String = "", syncRe extends Module with IsClkModule { require(phases.distinct.length == phases.length, "Phases should be distinct!") + phases foreach { p => + require(p < divBy, "Phases must be < divBy") + } val io = IO(new SEClkDividerIO(phases)) diff --git a/tapeout/src/main/scala/transforms/clkgen/ClkSrcTransform.scala b/tapeout/src/main/scala/transforms/clkgen/ClkSrcTransform.scala index 4a447cb7..a98086d1 100644 --- a/tapeout/src/main/scala/transforms/clkgen/ClkSrcTransform.scala +++ b/tapeout/src/main/scala/transforms/clkgen/ClkSrcTransform.scala @@ -18,7 +18,8 @@ class ClkSrcTransform extends Transform with SimpleRun { case Some((clkModAnnos, clkPortAnnos)) => val targetDir = barstools.tapeout.transforms.GetTargetDir(state) val passSeq = Seq( - InferTypes, + // TODO: Enable when it's legal? + // InferTypes, new CreateClkConstraints(clkModAnnos, clkPortAnnos, targetDir) ) state.copy(circuit = runPasses(state.circuit, passSeq)) diff --git a/tapeout/src/main/scala/transforms/clkgen/CreateClkConstraints.scala b/tapeout/src/main/scala/transforms/clkgen/CreateClkConstraints.scala index ea2ba22f..0c6e8823 100644 --- a/tapeout/src/main/scala/transforms/clkgen/CreateClkConstraints.scala +++ b/tapeout/src/main/scala/transforms/clkgen/CreateClkConstraints.scala @@ -117,7 +117,7 @@ class CreateClkConstraints( // sources of sinks are generated clks or top level clk inputs if (clkSrcsFlip.contains(sourceAbsPath)) clkSrcsFlip(sourceAbsPath) else if (topClksFlip.contains(sourceAbsPath)) topClksFlip(sourceAbsPath) - else throw new Exception(s"Absolute path of clk source for $sinkId not found!") + else throw new Exception(s"Absolute path $sourceAbsPath of clk source for $sinkId not found!") } sinkId -> sourceId } @@ -131,7 +131,8 @@ class CreateClkConstraints( clkPortAnnos.find(x => // TODO: Not sufficiently general for output clks? Might have forgotten to label a clk module... LowerName(x.target.name) == n && x.target.module.name == mod.name).getOrElse( - throw new Exception("All top module input clks/clk module output clocks must be sinks/sources!")) + throw new Exception( + s"All top module input clks/clk module output clocks must be sinks/sources! $n not annotated!")) case _ => } } diff --git a/tapeout/src/main/scala/transforms/utils/ProgrammaticBundle.scala b/tapeout/src/main/scala/transforms/utils/ProgrammaticBundle.scala index 17197c80..c3eec670 100644 --- a/tapeout/src/main/scala/transforms/utils/ProgrammaticBundle.scala +++ b/tapeout/src/main/scala/transforms/utils/ProgrammaticBundle.scala @@ -3,18 +3,18 @@ package barstools.tapeout.transforms import chisel3._ import scala.collection.immutable.ListMap -final class CustomBundle[T <: Data](elts: (String, T)*) extends Record { +class CustomBundle[T <: Data](elts: (String, T)*) extends Record { val elements = ListMap(elts map { case (field, elt) => field -> elt.chiselCloneType }: _*) def apply(elt: String): T = elements(elt) def apply(elt: Int): T = elements(elt.toString) override def cloneType = (new CustomBundle(elements.toList: _*)).asInstanceOf[this.type] } -final class CustomIndexedBundle[T <: Data](elts: (Int, T)*) extends Record { +class CustomIndexedBundle[T <: Data](elts: (Int, T)*) extends Record { // Must be String, Data val elements = ListMap(elts map { case (field, elt) => field.toString -> elt.chiselCloneType }: _*) - // TODO: Make an equivalent to the below work publicly - private def indexedElements = ListMap(elts map { case (field, elt) => field -> elt.chiselCloneType }: _*) + // TODO: Make an equivalent to the below work publicly (or only on subclasses?) + def indexedElements = ListMap(elts map { case (field, elt) => field -> elt.chiselCloneType }: _*) def apply(elt: Int): T = elements(elt.toString) override def cloneType = (new CustomIndexedBundle(indexedElements.toList: _*)).asInstanceOf[this.type] }