aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiuyang Liu2021-04-27 03:26:39 +0000
committerGitHub2021-04-27 03:26:39 +0000
commit54b6d8713bddb0e16e475a4f47e376217c5261e3 (patch)
treef53206dc22198e10c0a5c7186ea14525b29d306a
parent33c0b4312aec944caa62087663ba9ca41c9c9a6e (diff)
Memlib Refactor (#2191)
* remove all deprecations, switch to new API. * Add MemLibOutConfigFileAnnotation to replace ConfWriter. * Inline CreateMemoryAnnotations in ReplSeqMem. * Dont use ConfWriter anymore. * Fix ReplSeqMemTests, rewrite checkMemConf to directly read from annoation. * Fix for review. 0. Since DependencyAPI only initiate transform only once, ListBuffer is dangerous to use, remove defAnnotatedMemories from Transform. 1. Add trait HasAnnotatedMemories to store ListBuffer, MemLibOutConfigFileAnnotation also extends from which now. * Use two annotations converting and storing DefMemory. 0. rewrite CreateMemoryAnnotations to match ReplSeqMemAnnotation creating PinAnnotation. 1. add DumpMemoryAnnotations to convert from AnnotatedMemoriesCollectorAnnotation to MemLibOutConfigFileAnnotation 2. refactor MemLibOutConfigFileAnnotation and remove HasAnnotatedMemories 3. add private AnnotatedMemoriesCollectorAnnotation to store mutable DefAnnotatedMemory 4. change ReplSeqMem to SeqTransform * Fix for review. 0. replace AnnotatedMemoriesCollectorAnnotation with immutable AnnotatedMemoriesAnnotation. 1. add ListBuffer[DefAnnotatedMemory] in ReplaceMemMacros.execute. * private functions in ReplaceMemMacros transform. * scalafmt * remove ConfWriter API.
-rw-r--r--src/main/scala/firrtl/passes/memlib/CreateMemoryAnnotations.scala29
-rw-r--r--src/main/scala/firrtl/passes/memlib/DumpMemoryAnnotations.scala29
-rw-r--r--src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala119
-rw-r--r--src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala73
-rw-r--r--src/test/scala/firrtlTests/ReplSeqMemTests.scala36
5 files changed, 154 insertions, 132 deletions
diff --git a/src/main/scala/firrtl/passes/memlib/CreateMemoryAnnotations.scala b/src/main/scala/firrtl/passes/memlib/CreateMemoryAnnotations.scala
index ce7eea5e..240c2c9a 100644
--- a/src/main/scala/firrtl/passes/memlib/CreateMemoryAnnotations.scala
+++ b/src/main/scala/firrtl/passes/memlib/CreateMemoryAnnotations.scala
@@ -4,26 +4,29 @@ package firrtl
package passes
package memlib
+import firrtl.Utils.error
import firrtl.stage.Forms
-@deprecated("CreateMemoryAnnotations will not take reader: Option[YamlFileReader] as argument since 1.5.", "FIRRTL 1.4")
-class CreateMemoryAnnotations(reader: Option[YamlFileReader]) extends Transform with DependencyAPIMigration {
+import java.io.File
+
+class CreateMemoryAnnotations extends Transform with DependencyAPIMigration {
override def prerequisites = Forms.MidForm
override def optionalPrerequisites = Seq.empty
override def optionalPrerequisiteOf = Forms.MidEmitters
override def invalidates(a: Transform) = false
- def execute(state: CircuitState): CircuitState = reader match {
- case None => state
- case Some(r) =>
- import CustomYAMLProtocol._
- val configs = r.parse[Config]
- val oldAnnos = state.annotations
- val (as, pins) = configs.foldLeft((oldAnnos, Seq.empty[String])) {
- case ((annos, pins), config) =>
- (annos, pins :+ config.pin.name)
- }
- state.copy(annotations = PinAnnotation(pins.toSeq) +: as)
+ def execute(state: CircuitState): CircuitState = {
+ state.copy(annotations = state.annotations.flatMap {
+ case ReplSeqMemAnnotation(inputFileName, outputConfig) =>
+ Seq(MemLibOutConfigFileAnnotation(outputConfig, Nil)) ++ {
+ if (inputFileName.isEmpty) None
+ else if (new File(inputFileName).exists) {
+ import CustomYAMLProtocol._
+ Some(PinAnnotation(new YamlFileReader(inputFileName).parse[Config].map(_.pin.name)))
+ } else error("Input configuration file does not exist!")
+ }
+ case a => Seq(a)
+ })
}
}
diff --git a/src/main/scala/firrtl/passes/memlib/DumpMemoryAnnotations.scala b/src/main/scala/firrtl/passes/memlib/DumpMemoryAnnotations.scala
new file mode 100644
index 00000000..5cc1e0bf
--- /dev/null
+++ b/src/main/scala/firrtl/passes/memlib/DumpMemoryAnnotations.scala
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: Apache-2.0
+
+package firrtl
+package passes
+package memlib
+
+import firrtl.stage.Forms
+
+class DumpMemoryAnnotations extends Transform with DependencyAPIMigration {
+
+ override def prerequisites = Forms.MidForm
+ override def optionalPrerequisites = Seq.empty
+ override def optionalPrerequisiteOf = Forms.MidEmitters
+ override def invalidates(a: Transform) = false
+
+ def execute(state: CircuitState): CircuitState = {
+ state.copy(annotations = state.annotations.flatMap {
+ // convert and remove AnnotatedMemoriesAnnotation to CustomFileEmission
+ case AnnotatedMemoriesAnnotation(annotatedMemories) =>
+ state.annotations.collect {
+ case a: MemLibOutConfigFileAnnotation =>
+ a.copy(annotatedMemories = annotatedMemories)
+ // todo convert xxx to verilogs here.
+ }
+ case MemLibOutConfigFileAnnotation(_, Nil) => Nil
+ case a => Seq(a)
+ })
+ }
+}
diff --git a/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala b/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala
index bb2bed33..4b43118b 100644
--- a/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala
+++ b/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala
@@ -3,15 +3,17 @@
package firrtl.passes
package memlib
-import firrtl._
-import firrtl.ir._
-import firrtl.Utils._
import firrtl.Mappers._
-import MemPortUtils.{MemPortMap, Modules}
-import MemTransformUtils._
+import firrtl.Utils._
+import firrtl._
import firrtl.annotations._
+import firrtl.ir._
+import firrtl.passes.MemPortUtils.{MemPortMap, Modules}
+import firrtl.passes.memlib.MemTransformUtils._
+import firrtl.passes.wiring._
import firrtl.stage.Forms
-import wiring._
+
+import scala.collection.mutable.ListBuffer
/** Annotates the name of the pins to add for WiringTransform */
case class PinAnnotation(pins: Seq[String]) extends NoTargetAnnotation
@@ -24,9 +26,7 @@ object ReplaceMemMacros {
* This will not generate wmask ports if not needed.
* Creates the minimum # of black boxes needed by the design.
*/
-@deprecated("ReplaceMemMacros will not take writer: ConfWriter as argument since 1.5.", "FIRRTL 1.4")
-class ReplaceMemMacros(writer: ConfWriter) extends Transform with DependencyAPIMigration {
-
+class ReplaceMemMacros extends Transform with DependencyAPIMigration {
override def prerequisites = Forms.MidForm
override def optionalPrerequisites = Seq.empty
override def optionalPrerequisiteOf = Forms.MidEmitters
@@ -122,15 +122,13 @@ class ReplaceMemMacros(writer: ConfWriter) extends Transform with DependencyAPIM
})
)
- @deprecated("memToBundle will become private in 1.5.", "FIRRTL 1.4")
- def memToBundle(s: DefAnnotatedMemory) = BundleType(
+ private def memToBundle(s: DefAnnotatedMemory) = BundleType(
s.readers.map(Field(_, Flip, rPortToBundle(s))) ++
s.writers.map(Field(_, Flip, wPortToBundle(s))) ++
s.readwriters.map(Field(_, Flip, rwPortToBundle(s)))
)
- @deprecated("memToFlattenBundle will become private in 1.5.", "FIRRTL 1.4")
- def memToFlattenBundle(s: DefAnnotatedMemory) = BundleType(
+ private def memToFlattenBundle(s: DefAnnotatedMemory) = BundleType(
s.readers.map(Field(_, Flip, rPortToFlattenBundle(s))) ++
s.writers.map(Field(_, Flip, wPortToFlattenBundle(s))) ++
s.readwriters.map(Field(_, Flip, rwPortToFlattenBundle(s)))
@@ -140,8 +138,11 @@ class ReplaceMemMacros(writer: ConfWriter) extends Transform with DependencyAPIM
* The wrapper module has the same type as the memory it replaces
* The external module
*/
- @deprecated("createMemModule will become private in 1.5.", "FIRRTL 1.4")
- def createMemModule(m: DefAnnotatedMemory, wrapperName: String): Seq[DefModule] = {
+ private def createMemModule(
+ m: DefAnnotatedMemory,
+ wrapperName: String,
+ annotatedMemoriesBuffer: ListBuffer[DefAnnotatedMemory]
+ ): Seq[DefModule] = {
assert(m.dataType != UnknownType)
val wrapperIoType = memToBundle(m)
val wrapperIoPorts = wrapperIoType.fields.map(f => Port(NoInfo, f.name, Input, f.tpe))
@@ -161,29 +162,25 @@ class ReplaceMemMacros(writer: ConfWriter) extends Transform with DependencyAPIM
// TODO: Annotate? -- use actual annotation map
// add to conf file
- writer.append(m)
+ annotatedMemoriesBuffer += m
Seq(bb, wrapper)
}
// TODO(shunshou): get rid of copy pasta
// Connects the clk, en, and addr fields from the wrapperPort to the bbPort
- @deprecated("defaultConnects will become private in 1.5.", "FIRRTL 1.4")
- def defaultConnects(wrapperPort: WRef, bbPort: WSubField): Seq[Connect] =
+ private def defaultConnects(wrapperPort: WRef, bbPort: WSubField): Seq[Connect] =
Seq("clk", "en", "addr").map(f => connectFields(bbPort, f, wrapperPort, f))
// Generates mask bits (concatenates an aggregate to ground type)
// depending on mask granularity (# bits = data width / mask granularity)
- @deprecated("maskBits will become private in 1.5.", "FIRRTL 1.4")
- def maskBits(mask: WSubField, dataType: Type, fillMask: Boolean): Expression =
+ private def maskBits(mask: WSubField, dataType: Type, fillMask: Boolean): Expression =
if (fillMask) toBitMask(mask, dataType) else toBits(mask)
- @deprecated("adaptReader will become private in 1.5.", "FIRRTL 1.4")
- def adaptReader(wrapperPort: WRef, bbPort: WSubField): Seq[Statement] =
+ private def adaptReader(wrapperPort: WRef, bbPort: WSubField): Seq[Statement] =
defaultConnects(wrapperPort, bbPort) :+
fromBits(WSubField(wrapperPort, "data"), WSubField(bbPort, "data"))
- @deprecated("adaptWriter will become private in 1.5.", "FIRRTL 1.4")
- def adaptWriter(wrapperPort: WRef, bbPort: WSubField, hasMask: Boolean, fillMask: Boolean): Seq[Statement] = {
+ private def adaptWriter(wrapperPort: WRef, bbPort: WSubField, hasMask: Boolean, fillMask: Boolean): Seq[Statement] = {
val wrapperData = WSubField(wrapperPort, "data")
val defaultSeq = defaultConnects(wrapperPort, bbPort) :+
Connect(NoInfo, WSubField(bbPort, "data"), toBits(wrapperData))
@@ -198,8 +195,12 @@ class ReplaceMemMacros(writer: ConfWriter) extends Transform with DependencyAPIM
}
}
- @deprecated("adaptReadWriter will become private in 1.5.", "FIRRTL 1.4")
- def adaptReadWriter(wrapperPort: WRef, bbPort: WSubField, hasMask: Boolean, fillMask: Boolean): Seq[Statement] = {
+ private def adaptReadWriter(
+ wrapperPort: WRef,
+ bbPort: WSubField,
+ hasMask: Boolean,
+ fillMask: Boolean
+ ): Seq[Statement] = {
val wrapperWData = WSubField(wrapperPort, "wdata")
val defaultSeq = defaultConnects(wrapperPort, bbPort) ++ Seq(
fromBits(WSubField(wrapperPort, "rdata"), WSubField(bbPort, "rdata")),
@@ -221,8 +222,7 @@ class ReplaceMemMacros(writer: ConfWriter) extends Transform with DependencyAPIM
private type NameMap = collection.mutable.HashMap[(String, String), String]
/** Construct NameMap by assigning unique names for each memory blackbox */
- @deprecated("constructNameMap will become private in 1.5.", "FIRRTL 1.4")
- def constructNameMap(namespace: Namespace, nameMap: NameMap, mname: String)(s: Statement): Statement = {
+ private def constructNameMap(namespace: Namespace, nameMap: NameMap, mname: String)(s: Statement): Statement = {
s match {
case m: DefAnnotatedMemory =>
m.memRef match {
@@ -234,14 +234,14 @@ class ReplaceMemMacros(writer: ConfWriter) extends Transform with DependencyAPIM
s.map(constructNameMap(namespace, nameMap, mname))
}
- @deprecated("updateMemStmts will be private in 1.5.", "FIRRTL 1.4")
- def updateMemStmts(
- namespace: Namespace,
- nameMap: NameMap,
- mname: String,
- memPortMap: MemPortMap,
- memMods: Modules
- )(s: Statement
+ private def updateMemStmts(
+ namespace: Namespace,
+ nameMap: NameMap,
+ mname: String,
+ memPortMap: MemPortMap,
+ memMods: Modules,
+ annotatedMemoriesBuffer: ListBuffer[DefAnnotatedMemory]
+ )(s: Statement
): Statement = s match {
case m: DefAnnotatedMemory =>
if (m.maskGran.isEmpty) {
@@ -254,42 +254,49 @@ class ReplaceMemMacros(writer: ConfWriter) extends Transform with DependencyAPIM
val newWrapperName = nameMap(mname -> m.name)
val newMemBBName = namespace.newName(s"${newWrapperName}_ext")
val newMem = m.copy(name = newMemBBName)
- memMods ++= createMemModule(newMem, newWrapperName)
+ memMods ++= createMemModule(newMem, newWrapperName, annotatedMemoriesBuffer)
WDefInstance(m.info, m.name, newWrapperName, UnknownType)
case Some((module, mem)) =>
WDefInstance(m.info, m.name, nameMap(module -> mem), UnknownType)
}
- case sx => sx.map(updateMemStmts(namespace, nameMap, mname, memPortMap, memMods))
+ case sx => sx.map(updateMemStmts(namespace, nameMap, mname, memPortMap, memMods, annotatedMemoriesBuffer))
}
- @deprecated("updateMemMods will be private in 1.5.", "FIRRTL 1.4")
- def updateMemMods(namespace: Namespace, nameMap: NameMap, memMods: Modules)(m: DefModule) = {
+ private def updateMemMods(
+ namespace: Namespace,
+ nameMap: NameMap,
+ memMods: Modules,
+ annotatedMemoriesBuffer: ListBuffer[DefAnnotatedMemory]
+ )(m: DefModule
+ ) = {
val memPortMap = new MemPortMap
- (m.map(updateMemStmts(namespace, nameMap, m.name, memPortMap, memMods))
+ (m.map(updateMemStmts(namespace, nameMap, m.name, memPortMap, memMods, annotatedMemoriesBuffer))
.map(updateStmtRefs(memPortMap)))
}
def execute(state: CircuitState): CircuitState = {
+ val annotatedMemoriesBuffer: collection.mutable.ListBuffer[DefAnnotatedMemory] = ListBuffer[DefAnnotatedMemory]()
val c = state.circuit
val namespace = Namespace(c)
val memMods = new Modules
val nameMap = new NameMap
c.modules.map(m => m.map(constructNameMap(namespace, nameMap, m.name)))
- val modules = c.modules.map(updateMemMods(namespace, nameMap, memMods))
- // print conf
- writer.serialize()
- val pannos = state.annotations.collect { case a: PinAnnotation => a }
- val pins = pannos match {
- case Seq() => Nil
- case Seq(PinAnnotation(pins)) => pins
- case _ => throwInternalError("Something went wrong")
- }
- val annos = pins.foldLeft(Seq[Annotation]()) { (seq, pin) =>
- seq ++ memMods.collect {
- case m: ExtModule => SinkAnnotation(ModuleName(m.name, CircuitName(c.main)), pin)
- }
- } ++ state.annotations
- state.copy(circuit = c.copy(modules = modules ++ memMods), annotations = annos)
+ val modules = c.modules.map(updateMemMods(namespace, nameMap, memMods, annotatedMemoriesBuffer))
+ state.copy(
+ circuit = c.copy(modules = modules ++ memMods),
+ annotations =
+ state.annotations ++
+ (state.annotations.collectFirst { case a: PinAnnotation => a } match {
+ case None => Nil
+ case Some(PinAnnotation(pins)) =>
+ pins.foldLeft(Seq[Annotation]()) { (seq, pin) =>
+ seq ++ memMods.collect {
+ case m: ExtModule => SinkAnnotation(ModuleName(m.name, CircuitName(c.main)), pin)
+ }
+ }
+ }) :+
+ AnnotatedMemoriesAnnotation(annotatedMemoriesBuffer.toList)
+ )
}
}
diff --git a/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala b/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala
index 515ac691..f9df27a7 100644
--- a/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala
+++ b/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala
@@ -3,14 +3,15 @@
package firrtl.passes
package memlib
+import firrtl.Utils.error
import firrtl._
import firrtl.annotations._
-import firrtl.options.{HasShellOptions, ShellOption}
-import Utils.error
-import java.io.{CharArrayWriter, File, PrintWriter}
-import wiring._
+import firrtl.options.{CustomFileEmission, HasShellOptions, ShellOption}
+import firrtl.passes.wiring._
import firrtl.stage.{Forms, RunFirrtlTransformAnnotation}
+import java.io.{CharArrayWriter, PrintWriter}
+
sealed trait PassOption
case object InputConfigFileName extends PassOption
case object OutputConfigFileName extends PassOption
@@ -43,15 +44,20 @@ object PassConfigUtil {
}
}
-@deprecated("ConfWriter will be removed in 1.5.", "FIRRTL 1.4")
-class ConfWriter(filename: String) {
- val outputBuffer = new CharArrayWriter
- def append(m: DefAnnotatedMemory) = {
- // legacy
- // assert that we don't overflow going from BigInt to Int conversion
+case class ReplSeqMemAnnotation(inputFileName: String, outputConfig: String) extends NoTargetAnnotation
+
+/** Generate conf file for a sequence of [[DefAnnotatedMemory]]
+ * @note file already has its suffix adding by `--replSeqMem`
+ */
+case class MemLibOutConfigFileAnnotation(file: String, annotatedMemories: Seq[DefAnnotatedMemory])
+ extends NoTargetAnnotation
+ with CustomFileEmission {
+ def baseFileName(annotations: AnnotationSeq) = file
+ def suffix = None
+ def getBytes = annotatedMemories.map { m =>
require(bitWidth(m.dataType) <= Int.MaxValue)
- m.maskGran.foreach { case x => require(x <= Int.MaxValue) }
- val conf = MemConf(
+ m.maskGran.foreach(x => require(x <= Int.MaxValue))
+ MemConf(
m.name,
m.depth,
bitWidth(m.dataType).toInt,
@@ -59,17 +65,12 @@ class ConfWriter(filename: String) {
m.writers.length,
m.readwriters.length,
m.maskGran.map(_.toInt)
- )
- outputBuffer.append(conf.toString)
- }
- def serialize() = {
- val outputFile = new PrintWriter(filename)
- outputFile.write(outputBuffer.toString)
- outputFile.close()
- }
+ ).toString
+ }.mkString("\n").getBytes
}
-case class ReplSeqMemAnnotation(inputFileName: String, outputConfig: String) extends NoTargetAnnotation
+private[memlib] case class AnnotatedMemoriesAnnotation(annotatedMemories: List[DefAnnotatedMemory])
+ extends NoTargetAnnotation
object ReplSeqMemAnnotation {
def parse(t: String): ReplSeqMemAnnotation = {
@@ -112,8 +113,7 @@ class SimpleTransform(p: Pass, form: CircuitForm) extends Transform {
class SimpleMidTransform(p: Pass) extends SimpleTransform(p, MidForm)
// SimpleRun instead of PassBased because of the arguments to passSeq
-@deprecated("Migrate to a SeqTransform. API will be changed in 1.5.", "FIRRTL 1.4")
-class ReplSeqMem extends Transform with HasShellOptions with DependencyAPIMigration {
+class ReplSeqMem extends SeqTransform with HasShellOptions with DependencyAPIMigration {
override def prerequisites = Forms.MidForm
override def optionalPrerequisites = Seq.empty
@@ -134,33 +134,16 @@ class ReplSeqMem extends Transform with HasShellOptions with DependencyAPIMigrat
)
)
- @deprecated("API will be replaced with a val in 1.5.", "FIRRTL 1.4")
- def transforms(inConfigFile: Option[YamlFileReader], outConfigFile: ConfWriter): Seq[Transform] =
+ val transforms: Seq[Transform] =
Seq(
new SimpleMidTransform(Legalize),
new SimpleMidTransform(ToMemIR),
new SimpleMidTransform(ResolveMaskGranularity),
new SimpleMidTransform(RenameAnnotatedMemoryPorts),
+ new CreateMemoryAnnotations,
new ResolveMemoryReference,
- new CreateMemoryAnnotations(inConfigFile),
- new ReplaceMemMacros(outConfigFile),
- new WiringTransform
+ new ReplaceMemMacros,
+ new WiringTransform,
+ new DumpMemoryAnnotations
)
-
- @deprecated("API will be removed in 1.5.", "FIRRTL 1.4")
- def execute(state: CircuitState): CircuitState = {
- val annos = state.annotations.collect { case a: ReplSeqMemAnnotation => a }
- annos match {
- case Nil => state // Do nothing if there are no annotations
- case Seq(ReplSeqMemAnnotation(inputFileName, outputConfig)) =>
- val inConfigFile = {
- if (inputFileName.isEmpty) None
- else if (new File(inputFileName).exists) Some(new YamlFileReader(inputFileName))
- else error("Input configuration file does not exist!")
- }
- val outConfigFile = new ConfWriter(outputConfig)
- transforms(inConfigFile, outConfigFile).foldLeft(state) { (in, xform) => xform.runTransform(in) }
- case _ => error("Unexpected transform annotation")
- }
- }
}
diff --git a/src/test/scala/firrtlTests/ReplSeqMemTests.scala b/src/test/scala/firrtlTests/ReplSeqMemTests.scala
index 84709a21..4e00cb3a 100644
--- a/src/test/scala/firrtlTests/ReplSeqMemTests.scala
+++ b/src/test/scala/firrtlTests/ReplSeqMemTests.scala
@@ -3,14 +3,13 @@
package firrtlTests
import firrtl._
+import firrtl.annotations._
import firrtl.ir._
import firrtl.passes._
-import firrtl.transforms._
import firrtl.passes.memlib._
-import firrtl.FileUtils
+import firrtl.testutils.FirrtlCheckers._
import firrtl.testutils._
-import annotations._
-import FirrtlCheckers._
+import firrtl.transforms._
class ReplSeqMemSpec extends SimpleTransformSpec {
def emitter = new LowFirrtlEmitter
@@ -30,10 +29,11 @@ class ReplSeqMemSpec extends SimpleTransformSpec {
}
)
- @deprecated("API will be changed in 1.5.", "FIRRTL 1.4")
- def checkMemConf(filename: String, mems: Set[MemConf]) {
+ def checkMemConf(circuitState: CircuitState, mems: Set[MemConf]) {
// Read the mem conf
- val text = FileUtils.getText(filename)
+ val text = circuitState.annotations.collectFirst {
+ case a: MemLibOutConfigFileAnnotation => a.getBytes.map(_.toChar).mkString
+ }.get
// Verify that this does not throw an exception
val fromConf = MemConf.fromString(text)
// Verify the mems in the conf are the same as the expected ones
@@ -75,7 +75,7 @@ circuit Top :
// Check correctness of firrtl
parse(res.getEmittedCircuit.value)
// Check the emitted conf
- checkMemConf(confLoc, mems)
+ checkMemConf(res, mems)
(new java.io.File(confLoc)).delete()
}
@@ -100,7 +100,7 @@ circuit Top :
// Check correctness of firrtl
parse(res.getEmittedCircuit.value)
// Check the emitted conf
- checkMemConf(confLoc, mems)
+ checkMemConf(res, mems)
(new java.io.File(confLoc)).delete()
}
@@ -128,7 +128,7 @@ circuit CustomMemory :
// Check correctness of firrtl
parse(res.getEmittedCircuit.value)
// Check the emitted conf
- checkMemConf(confLoc, mems)
+ checkMemConf(res, mems)
(new java.io.File(confLoc)).delete()
}
@@ -156,7 +156,7 @@ circuit CustomMemory :
// Check correctness of firrtl
parse(res.getEmittedCircuit.value)
// Check the emitted conf
- checkMemConf(confLoc, mems)
+ checkMemConf(res, mems)
(new java.io.File(confLoc)).delete()
}
@@ -245,7 +245,7 @@ circuit CustomMemory :
}
numExtMods should be(2)
// Check the emitted conf
- checkMemConf(confLoc, mems)
+ checkMemConf(res, mems)
(new java.io.File(confLoc)).delete()
}
@@ -292,7 +292,7 @@ circuit CustomMemory :
}
numExtMods should be(2)
// Check the emitted conf
- checkMemConf(confLoc, mems)
+ checkMemConf(res, mems)
(new java.io.File(confLoc)).delete()
}
@@ -354,7 +354,7 @@ circuit CustomMemory :
// would be 3 ExtModules
numExtMods should be(2)
// Check the emitted conf
- checkMemConf(confLoc, mems)
+ checkMemConf(res, mems)
(new java.io.File(confLoc)).delete()
}
@@ -414,7 +414,7 @@ circuit CustomMemory :
val res = compileAndEmit(CircuitState(parse(input), ChirrtlForm, annos))
res.getEmittedCircuit.value shouldNot include("mask")
// Check the emitted conf
- checkMemConf(confLoc, mems)
+ checkMemConf(res, mems)
(new java.io.File(confLoc)).delete()
}
@@ -444,7 +444,7 @@ circuit CustomMemory :
res should containLine("mem.W0_mask_0 <= validif(io_en, io_mask_0)")
res should containLine("mem.W0_mask_1 <= validif(io_en, io_mask_1)")
// Check the emitted conf
- checkMemConf(confLoc, mems)
+ checkMemConf(res, mems)
(new java.io.File(confLoc)).delete()
}
@@ -478,7 +478,7 @@ circuit CustomMemory :
res should containLine("mem.RW0_wmask_0 <= validif(io_en, io_mask_0)")
res should containLine("mem.RW0_wmask_1 <= validif(io_en, io_mask_1)")
// Check the emitted conf
- checkMemConf(confLoc, mems)
+ checkMemConf(res, mems)
(new java.io.File(confLoc)).delete()
}
@@ -499,7 +499,7 @@ circuit NoMemsHere :
val annos = Seq(ReplSeqMemAnnotation.parse("-c:CustomMemory:-o:" + confLoc), InferReadWriteAnnotation)
val res = compileAndEmit(CircuitState(parse(input), ChirrtlForm, annos))
// Check the emitted conf
- checkMemConf(confLoc, mems)
+ checkMemConf(res, mems)
(new java.io.File(confLoc)).delete()
}