summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSchuyler Eldridge2021-06-10 17:32:08 -0400
committerGitHub2021-06-10 17:32:08 -0400
commit820200b75242dde2a66c8103fd53eb10afc7ff6b (patch)
tree4e5a2f81b308a2824737364e36432d4b3cc4128e
parent81bc972bf3202577b6534b82d96b75f7abfbab5e (diff)
Stop Emitting BlackBoxResourceAnno (#1954)
* Change HasBlackBoxResource to Resolve Resources Change HasBlackBoxResource to resolve resources immediately and emit BlackBoxInlineAnno instead of a BlackBoxResourceAnno. This removes the need for a FIRRTL compiler to grok the Java Resource API in order to handle BlackBoxResourceAnno. Emit BlackBoxInlineAnno from HasExtModuleResource instead of BlackBoxResourceAnno. Signed-off-by: Schuyler Eldridge <schuyler.eldridge@sifive.com>
-rw-r--r--src/main/scala/chisel3/util/BlackBoxUtils.scala33
-rw-r--r--src/main/scala/chisel3/util/ExtModuleUtils.scala7
-rw-r--r--src/test/scala/chiselTests/BlackBoxImpl.scala15
-rw-r--r--src/test/scala/chiselTests/ExtModuleImpl.scala16
4 files changed, 66 insertions, 5 deletions
diff --git a/src/main/scala/chisel3/util/BlackBoxUtils.scala b/src/main/scala/chisel3/util/BlackBoxUtils.scala
index 3cd704b3..443d7f3e 100644
--- a/src/main/scala/chisel3/util/BlackBoxUtils.scala
+++ b/src/main/scala/chisel3/util/BlackBoxUtils.scala
@@ -4,12 +4,39 @@ package chisel3.util
import chisel3._
import chisel3.experimental.{ChiselAnnotation, RunFirrtlTransform}
-import firrtl.transforms.{BlackBoxPathAnno, BlackBoxResourceAnno, BlackBoxInlineAnno, BlackBoxSourceHelper}
+import firrtl.transforms.{BlackBoxPathAnno, BlackBoxResourceAnno, BlackBoxInlineAnno, BlackBoxSourceHelper,
+ BlackBoxNotFoundException}
+import firrtl.annotations.ModuleName
+import logger.LazyLogging
+
+private[util] object BlackBoxHelpers {
+
+ implicit class BlackBoxInlineAnnoHelpers(anno: BlackBoxInlineAnno.type) extends LazyLogging {
+ /** Generate a BlackBoxInlineAnno from a Java Resource and a module name. */
+ def fromResource(resourceName: String, moduleName: ModuleName) = try {
+ val blackBoxFile = os.resource / os.RelPath(resourceName.dropWhile(_ == '/'))
+ val contents = os.read(blackBoxFile)
+ if (contents.size > BigInt(2).pow(20)) {
+ val message =
+ s"Black box resource $resourceName, which will be converted to an inline annotation, is greater than 1 MiB." +
+ "This may affect compiler performance. Consider including this resource via a black box path."
+ logger.warn(message)
+ }
+ BlackBoxInlineAnno(moduleName, blackBoxFile.last, contents)
+ } catch {
+ case e: os.ResourceNotFoundException =>
+ throw new BlackBoxNotFoundException(resourceName, e.getMessage)
+ }
+ }
+}
+
+import BlackBoxHelpers._
trait HasBlackBoxResource extends BlackBox {
self: BlackBox =>
- /** Copies a resource file to the target directory
+ /** Copies a Java resource containing some text into the output directory. This is typically used to copy a Verilog file
+ * to the final output directory, but may be used to copy any Java resource (e.g., a C++ testbench).
*
* Resource files are located in project_root/src/main/resources/.
* Example of adding the resource file project_root/src/main/resources/blackbox.v:
@@ -19,7 +46,7 @@ trait HasBlackBoxResource extends BlackBox {
*/
def addResource(blackBoxResource: String): Unit = {
val anno = new ChiselAnnotation with RunFirrtlTransform {
- def toFirrtl = BlackBoxResourceAnno(self.toNamed, blackBoxResource)
+ def toFirrtl = BlackBoxInlineAnno.fromResource(blackBoxResource, self.toNamed)
def transformClass = classOf[BlackBoxSourceHelper]
}
chisel3.experimental.annotate(anno)
diff --git a/src/main/scala/chisel3/util/ExtModuleUtils.scala b/src/main/scala/chisel3/util/ExtModuleUtils.scala
index 831639be..62f384bc 100644
--- a/src/main/scala/chisel3/util/ExtModuleUtils.scala
+++ b/src/main/scala/chisel3/util/ExtModuleUtils.scala
@@ -3,7 +3,10 @@
package chisel3.util
import chisel3.experimental.{ChiselAnnotation, ExtModule, RunFirrtlTransform}
-import firrtl.transforms.{BlackBoxPathAnno, BlackBoxResourceAnno, BlackBoxInlineAnno, BlackBoxSourceHelper}
+import firrtl.transforms.{BlackBoxPathAnno, BlackBoxResourceAnno, BlackBoxInlineAnno, BlackBoxSourceHelper,
+ BlackBoxNotFoundException}
+
+import BlackBoxHelpers._
trait HasExtModuleResource extends ExtModule {
self: ExtModule =>
@@ -18,7 +21,7 @@ trait HasExtModuleResource extends ExtModule {
*/
def addResource(blackBoxResource: String): Unit = {
val anno = new ChiselAnnotation with RunFirrtlTransform {
- def toFirrtl = BlackBoxResourceAnno(self.toNamed, blackBoxResource)
+ def toFirrtl = BlackBoxInlineAnno.fromResource(blackBoxResource, self.toNamed)
def transformClass = classOf[BlackBoxSourceHelper]
}
chisel3.experimental.annotate(anno)
diff --git a/src/test/scala/chiselTests/BlackBoxImpl.scala b/src/test/scala/chiselTests/BlackBoxImpl.scala
index f8e16ad7..a9a6fa29 100644
--- a/src/test/scala/chiselTests/BlackBoxImpl.scala
+++ b/src/test/scala/chiselTests/BlackBoxImpl.scala
@@ -8,6 +8,7 @@ import chisel3._
import chisel3.util.{HasBlackBoxInline, HasBlackBoxResource, HasBlackBoxPath}
import chisel3.stage.{ChiselGeneratorAnnotation, ChiselStage}
import firrtl.FirrtlExecutionSuccess
+import firrtl.transforms.BlackBoxNotFoundException
import org.scalacheck.Test.Failed
import org.scalatest.Succeeded
import org.scalatest.freespec.AnyFreeSpec
@@ -88,6 +89,15 @@ class UsesBlackBoxMinusViaPath extends Module {
io.out := mod0.io.out
}
+class BlackBoxResourceNotFound extends HasBlackBoxResource {
+ val io = IO(new Bundle{})
+ addResource("/missing.resource")
+}
+
+class UsesMissingBlackBoxResource extends RawModule {
+ val foo = Module(new BlackBoxResourceNotFound)
+}
+
class BlackBoxImplSpec extends AnyFreeSpec with Matchers {
val targetDir = "test_run_dir"
val stage = new ChiselStage
@@ -114,5 +124,10 @@ class BlackBoxImplSpec extends AnyFreeSpec with Matchers {
verilogOutput.delete()
Succeeded
}
+ "Resource files that do not exist produce Chisel errors" in {
+ assertThrows[BlackBoxNotFoundException]{
+ ChiselStage.emitChirrtl(new UsesMissingBlackBoxResource)
+ }
+ }
}
}
diff --git a/src/test/scala/chiselTests/ExtModuleImpl.scala b/src/test/scala/chiselTests/ExtModuleImpl.scala
index f71a1335..e0a76201 100644
--- a/src/test/scala/chiselTests/ExtModuleImpl.scala
+++ b/src/test/scala/chiselTests/ExtModuleImpl.scala
@@ -11,6 +11,7 @@ import chisel3.util.{HasExtModuleInline, HasExtModulePath, HasExtModuleResource}
import firrtl.FirrtlExecutionSuccess
import firrtl.options.TargetDirAnnotation
import firrtl.stage.FirrtlCircuitAnnotation
+import firrtl.transforms.BlackBoxNotFoundException
import org.scalacheck.Test.Failed
import org.scalatest.{FreeSpec, Matchers, Succeeded}
@@ -92,6 +93,15 @@ class UsesExtModuleMinusViaPath extends Module {
io.out := mod0.io.out
}
+class ExtModuleResourceNotFound extends HasExtModuleResource {
+ val io = IO(new Bundle{})
+ addResource("/missing.resource")
+}
+
+class UsesMissingExtModuleResource extends RawModule {
+ val foo = Module(new ExtModuleResourceNotFound)
+}
+
class ExtModuleImplSpec extends FreeSpec with Matchers {
"ExtModule can have verilator source implementation" - {
@@ -137,5 +147,11 @@ class ExtModuleImplSpec extends FreeSpec with Matchers {
verilogOutput.exists() should be(true)
verilogOutput.delete()
}
+
+ "Resource files that do not exist produce Chisel errors" in {
+ assertThrows[BlackBoxNotFoundException]{
+ ChiselStage.emitChirrtl(new UsesMissingExtModuleResource)
+ }
+ }
}
}