From 1a82c082b30d930ee68dd0f5289c2ac1309e615f Mon Sep 17 00:00:00 2001 From: chick Date: Tue, 29 Sep 2020 10:11:46 -0700 Subject: [PATCH] - Make transfrorms run in as close to same order as before - Fix parsing of PadPlacement JSON --- .../transforms/.pads/AddIOPadsTransform.scala | 1 + .../scala/transforms/.pads/PadPlacement.scala | 72 +++++++++++++++---- .../transforms/AddSuffixToModuleNames.scala | 1 + .../scala/transforms/EnumerateModules.scala | 1 + .../main/scala/transforms/ResetInverter.scala | 1 + .../main/scala/transforms/retime/Retime.scala | 1 + .../scala/transforms/utils/FileUtils.scala | 1 + .../transforms/.pads/AddIOPadsSpec.scala | 5 +- 8 files changed, 66 insertions(+), 17 deletions(-) diff --git a/tapeout/src/main/scala/transforms/.pads/AddIOPadsTransform.scala b/tapeout/src/main/scala/transforms/.pads/AddIOPadsTransform.scala index b79c1093..ba095879 100644 --- a/tapeout/src/main/scala/transforms/.pads/AddIOPadsTransform.scala +++ b/tapeout/src/main/scala/transforms/.pads/AddIOPadsTransform.scala @@ -15,6 +15,7 @@ import scala.collection.mutable class AddIOPadsTransform extends Transform with SeqTransformBased with DependencyAPIMigration { override def prerequisites: Seq[TransformDependency] = Forms.LowForm + override def optionalPrerequisites: Seq[TransformDependency] = Forms.LowFormOptimized override def optionalPrerequisiteOf: Seq[TransformDependency] = Forms.LowEmitters val transformList = new mutable.ArrayBuffer[Transform] diff --git a/tapeout/src/main/scala/transforms/.pads/PadPlacement.scala b/tapeout/src/main/scala/transforms/.pads/PadPlacement.scala index 2d774f01..d3e99626 100644 --- a/tapeout/src/main/scala/transforms/.pads/PadPlacement.scala +++ b/tapeout/src/main/scala/transforms/.pads/PadPlacement.scala @@ -1,20 +1,46 @@ +// See LICENSE for license details. + package barstools.tapeout.transforms.pads +import barstools.tapeout.transforms._ import net.jcazevedo.moultingyaml._ -import firrtl._ -import firrtl.ir._ -import barstools.tapeout.transforms._ +/** This is a hack to get around weird problem with yaml parser + * that without this gives PadPlacement defines additional fields + * + */ +trait HasPadPlacementFields { + def file: String + def left: String + def top: String + def right: String + def bottom: String + def instanceArray: String + def padLine: String + def template: String +} + +case class PadPlacementFields( + file: String, + left: String, + top: String, + right: String, + bottom: String, + instanceArray: String, + padLine: String, + template: String +) extends HasPadPlacementFields case class PadPlacement( - file: String, - left: String, - top: String, - right: String, - bottom: String, - instanceArray: String, - padLine: String, - template: String) { + file: String, + left: String, + top: String, + right: String, + bottom: String, + instanceArray: String, + padLine: String, + template: String +) extends HasPadPlacementFields { require(instanceArray contains "{{signal}}", "Instance Array Template should contain {{signal}}") require(instanceArray contains "{{idx}}", "Instance Array Template should contain {{idx}}") @@ -33,8 +59,8 @@ case class PadPlacement( case Bottom => bottom } - import com.gilt.handlebars.scala.binding.dynamic._ import com.gilt.handlebars.scala.Handlebars + import com.gilt.handlebars.scala.binding.dynamic._ private val instanceArrayTemplate = Handlebars(instanceArray.stripMargin) private val padLineTemplate = Handlebars(padLine.stripMargin) @@ -52,10 +78,26 @@ case class PadPlacementParams(leftPads: String, rightPads: String, topPads: Stri object PadPlacementFile extends DefaultYamlProtocol { val exampleResource = "/PadPlacement.yaml" - implicit val _pad = yamlFormat8(PadPlacement) - def parse(file: String = ""): PadPlacement = { - (new YamlFileReader(exampleResource)).parse[PadPlacement](file).head + implicit val _pad = yamlFormat8(PadPlacementFields) + + def main(args: Array[String]): Unit = { + println(parse("RealTech/PadPlacement.yaml")) } + + def parse(file: String = ""): PadPlacement = { + val fields = (new YamlFileReader(exampleResource)).parse[PadPlacementFields](file).head + PadPlacement( + file = fields.file, + left = fields.left, + top = fields.top, + right = fields.right, + bottom = fields.bottom, + instanceArray = fields.instanceArray, + padLine = fields.padLine, + template = fields.template + ) + } + def generate( techDir: String, targetDir: String, diff --git a/tapeout/src/main/scala/transforms/AddSuffixToModuleNames.scala b/tapeout/src/main/scala/transforms/AddSuffixToModuleNames.scala index ada3a719..ab1dd487 100644 --- a/tapeout/src/main/scala/transforms/AddSuffixToModuleNames.scala +++ b/tapeout/src/main/scala/transforms/AddSuffixToModuleNames.scala @@ -26,6 +26,7 @@ case class ModuleNameSuffixAnnotation(target: CircuitTarget, suffix: String) class AddSuffixToModuleNames extends Transform with DependencyAPIMigration { override def prerequisites: Seq[TransformDependency] = Forms.LowForm + override def optionalPrerequisites: Seq[TransformDependency] = Forms.LowFormOptimized override def optionalPrerequisiteOf: Seq[TransformDependency] = Forms.LowEmitters def processAnnos(annos: AnnotationSeq): (AnnotationSeq, (String) => String) = { diff --git a/tapeout/src/main/scala/transforms/EnumerateModules.scala b/tapeout/src/main/scala/transforms/EnumerateModules.scala index f1f66033..a2b499fd 100644 --- a/tapeout/src/main/scala/transforms/EnumerateModules.scala +++ b/tapeout/src/main/scala/transforms/EnumerateModules.scala @@ -26,6 +26,7 @@ class EnumerateModules(enumerate: (Module) => Unit) extends Transform with SeqTransformBased with DependencyAPIMigration { override def prerequisites: Seq[TransformDependency] = Forms.LowForm + override def optionalPrerequisites: Seq[TransformDependency] = Forms.LowFormOptimized override def optionalPrerequisiteOf: Seq[TransformDependency] = Forms.LowEmitters def transforms: Seq[Transform] = Seq(new EnumerateModulesPass(enumerate)) diff --git a/tapeout/src/main/scala/transforms/ResetInverter.scala b/tapeout/src/main/scala/transforms/ResetInverter.scala index 22b2a704..f9282251 100644 --- a/tapeout/src/main/scala/transforms/ResetInverter.scala +++ b/tapeout/src/main/scala/transforms/ResetInverter.scala @@ -44,6 +44,7 @@ object ResetN extends Pass { class ResetInverterTransform extends Transform with DependencyAPIMigration { override def prerequisites: Seq[TransformDependency] = Forms.LowForm + override def optionalPrerequisites: Seq[TransformDependency] = Forms.LowFormOptimized override def optionalPrerequisiteOf: Seq[TransformDependency] = Forms.LowEmitters override def execute(state: CircuitState): CircuitState = { diff --git a/tapeout/src/main/scala/transforms/retime/Retime.scala b/tapeout/src/main/scala/transforms/retime/Retime.scala index e554bead..d88217c7 100644 --- a/tapeout/src/main/scala/transforms/retime/Retime.scala +++ b/tapeout/src/main/scala/transforms/retime/Retime.scala @@ -15,6 +15,7 @@ case class RetimeAnnotation(target: Named) extends SingleTargetAnnotation[Named] class RetimeTransform extends Transform with DependencyAPIMigration { override def prerequisites: Seq[TransformDependency] = Forms.LowForm + override def optionalPrerequisites: Seq[TransformDependency] = Forms.LowFormOptimized override def optionalPrerequisiteOf: Seq[TransformDependency] = Forms.LowEmitters override def execute(state: CircuitState): CircuitState = { diff --git a/tapeout/src/main/scala/transforms/utils/FileUtils.scala b/tapeout/src/main/scala/transforms/utils/FileUtils.scala index 0d38d376..ded0474d 100644 --- a/tapeout/src/main/scala/transforms/utils/FileUtils.scala +++ b/tapeout/src/main/scala/transforms/utils/FileUtils.scala @@ -54,6 +54,7 @@ case class TechnologyLocationAnnotation(dir: String) extends SingleTargetAnnotat class TechnologyLocation extends Transform with DependencyAPIMigration { override def prerequisites: Seq[TransformDependency] = Forms.LowForm + override def optionalPrerequisites: Seq[TransformDependency] = Forms.LowFormOptimized override def optionalPrerequisiteOf: Seq[TransformDependency] = Forms.LowEmitters def execute(state: CircuitState): CircuitState = { diff --git a/tapeout/src/test/scala/transforms/.pads/AddIOPadsSpec.scala b/tapeout/src/test/scala/transforms/.pads/AddIOPadsSpec.scala index 7fe42342..12fcb411 100644 --- a/tapeout/src/test/scala/transforms/.pads/AddIOPadsSpec.scala +++ b/tapeout/src/test/scala/transforms/.pads/AddIOPadsSpec.scala @@ -257,9 +257,10 @@ class IOPadSpec extends FlatSpec with Matchers { */ it should "create proper IO pads + black box in verilog" in { val dir = "test_run_dir/PadsVerilog" - (new ChiselStage).emitFirrtl( + (new ChiselStage).emitVerilog( new ExampleTopModuleWithBB, - Array("-td", dir, "-X", "verilog") +// Array("-td", dir, "-X", "verilog") + Array("-td", dir) ) checkOutputs(dir) }