From f0ca4bd429a676772cb1504951a0e5f4ffffab73 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Tue, 23 Aug 2022 11:50:27 -0700 Subject: [PATCH 1/4] Throw error if forceName is used on non-hardware values --- src/main/scala/chisel3/util/experimental/ForceNames.scala | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/scala/chisel3/util/experimental/ForceNames.scala b/src/main/scala/chisel3/util/experimental/ForceNames.scala index 53ee2bd23bc..5175bbbef17 100644 --- a/src/main/scala/chisel3/util/experimental/ForceNames.scala +++ b/src/main/scala/chisel3/util/experimental/ForceNames.scala @@ -3,6 +3,7 @@ package chisel3.util.experimental import chisel3.experimental.{annotate, ChiselAnnotation, RunFirrtlTransform} +import chisel3.internal.Builder import firrtl.Mappers._ import firrtl._ import firrtl.annotations._ @@ -24,6 +25,9 @@ object forceName { * @param name Name to force to */ def apply[T <: chisel3.Element](signal: T, name: String): T = { + if (!signal.isSynthesizable) { + Builder.error(s"Using forceName '$name' on non-hardware value $signal") + } annotate(new ChiselAnnotation with RunFirrtlTransform { def toFirrtl = ForceNameAnnotation(signal.toTarget, name) override def transformClass: Class[_ <: Transform] = classOf[ForceNamesTransform] From b7d8de43de04973ac4318eb519cedd5106b419c2 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Tue, 23 Aug 2022 13:35:36 -0700 Subject: [PATCH 2/4] Add test --- .../chiselTests/experimental/ForceNames.scala | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/scala/chiselTests/experimental/ForceNames.scala b/src/test/scala/chiselTests/experimental/ForceNames.scala index 233b4a5fa35..0fd922c1cf9 100644 --- a/src/test/scala/chiselTests/experimental/ForceNames.scala +++ b/src/test/scala/chiselTests/experimental/ForceNames.scala @@ -110,4 +110,18 @@ class ForceNamesSpec extends ChiselFlatSpec { ) } } + "Force Name of non-hardware value" should "error" in { + class Example extends Module { + val tpe = UInt(8.W) + forceName(tpe, "foobar") + + val in = IO(Input(tpe)) + val out = IO(Output(tpe)) + out := in + } + + a[ChiselException] shouldBe thrownBy { + chisel3.stage.ChiselStage.elaborate(new Example) + } + } } From 7a27fbff7b681ad092e65000dca828fbcfcadc1a Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Wed, 24 Aug 2022 15:36:31 -0700 Subject: [PATCH 3/4] Also throw error for DecodeTable --- src/main/scala/chisel3/util/experimental/ForceNames.scala | 5 ++--- .../scala/chisel3/util/experimental/decode/decoder.scala | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/scala/chisel3/util/experimental/ForceNames.scala b/src/main/scala/chisel3/util/experimental/ForceNames.scala index 5175bbbef17..aee51db3297 100644 --- a/src/main/scala/chisel3/util/experimental/ForceNames.scala +++ b/src/main/scala/chisel3/util/experimental/ForceNames.scala @@ -25,9 +25,7 @@ object forceName { * @param name Name to force to */ def apply[T <: chisel3.Element](signal: T, name: String): T = { - if (!signal.isSynthesizable) { - Builder.error(s"Using forceName '$name' on non-hardware value $signal") - } + if (!signal.isSynthesizable) Builder.error(s"Using forceName '$name' on non-hardware value $signal") annotate(new ChiselAnnotation with RunFirrtlTransform { def toFirrtl = ForceNameAnnotation(signal.toTarget, name) override def transformClass: Class[_ <: Transform] = classOf[ForceNamesTransform] @@ -41,6 +39,7 @@ object forceName { * @param signal Signal to name */ def apply[T <: chisel3.Element](signal: T): T = { + if (!signal.isSynthesizable) Builder.error(s"Using forceName on non-hardware value $signal") annotate(new ChiselAnnotation with RunFirrtlTransform { def toFirrtl = ForceNameAnnotation(signal.toTarget, signal.toTarget.ref) override def transformClass: Class[_ <: Transform] = classOf[ForceNamesTransform] diff --git a/src/main/scala/chisel3/util/experimental/decode/decoder.scala b/src/main/scala/chisel3/util/experimental/decode/decoder.scala index 4feda672eb6..09b5e929e8b 100644 --- a/src/main/scala/chisel3/util/experimental/decode/decoder.scala +++ b/src/main/scala/chisel3/util/experimental/decode/decoder.scala @@ -6,6 +6,7 @@ import chisel3._ import chisel3.experimental.{annotate, ChiselAnnotation} import chisel3.util.{pla, BitPat} import chisel3.util.experimental.{getAnnotations, BitSet} +import chisel3.internal.Builder import firrtl.annotations.Annotation import logger.LazyLogging @@ -30,6 +31,7 @@ object decoder extends LazyLogging { val (plaInput, plaOutput) = pla(minimizedTable.table.toSeq, BitPat(minimizedTable.default.value.U(minimizedTable.default.getWidth.W))) + if (!plaOutput.isSynthesizable) Builder.error(s"Using DecodeTableAnnotation on non-hardware value $plaOutput") annotate(new ChiselAnnotation { override def toFirrtl: Annotation = DecodeTableAnnotation(plaOutput.toTarget, truthTable.toString, minimizedTable.toString) From dce61ef670c62c9818585609290a057455d5ee23 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Wed, 24 Aug 2022 17:41:49 -0700 Subject: [PATCH 4/4] Replace error with assert --- src/main/scala/chisel3/util/experimental/decode/decoder.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/scala/chisel3/util/experimental/decode/decoder.scala b/src/main/scala/chisel3/util/experimental/decode/decoder.scala index 09b5e929e8b..7c020bea0e0 100644 --- a/src/main/scala/chisel3/util/experimental/decode/decoder.scala +++ b/src/main/scala/chisel3/util/experimental/decode/decoder.scala @@ -6,7 +6,6 @@ import chisel3._ import chisel3.experimental.{annotate, ChiselAnnotation} import chisel3.util.{pla, BitPat} import chisel3.util.experimental.{getAnnotations, BitSet} -import chisel3.internal.Builder import firrtl.annotations.Annotation import logger.LazyLogging @@ -31,7 +30,7 @@ object decoder extends LazyLogging { val (plaInput, plaOutput) = pla(minimizedTable.table.toSeq, BitPat(minimizedTable.default.value.U(minimizedTable.default.getWidth.W))) - if (!plaOutput.isSynthesizable) Builder.error(s"Using DecodeTableAnnotation on non-hardware value $plaOutput") + assert(plaOutput.isSynthesizable, s"Using DecodeTableAnnotation on non-hardware value $plaOutput") annotate(new ChiselAnnotation { override def toFirrtl: Annotation = DecodeTableAnnotation(plaOutput.toTarget, truthTable.toString, minimizedTable.toString)