Files
chipyard/tools/tapeout/src/main/scala/macrolib/Utils.scala
2024-04-19 11:06:07 -07:00

97 lines
3.0 KiB
Scala

package mdf.macrolib
import play.api.libs.json._
import java.io.FileNotFoundException
import scala.collection.mutable.ListBuffer
import scala.language.implicitConversions
object Utils {
// Read a MDF file from a String.
def readMDFFromString(str: String): Option[Seq[Macro]] = {
Json.parse(str) match {
// Make sure that the document is a list.
case arr: JsArray => {
val result: List[Option[Macro]] = arr.as[List[Map[String, JsValue]]].map { obj =>
// Check the type of object.
val objTypeStr: String = obj.get("type") match {
case Some(x: JsString) => x.as[String]
case _ => return None // error, no type found
}
objTypeStr match {
case "filler cell" | "metal filler cell" => FillerMacroBase.parseJSON(obj)
case "sram" => SRAMMacro.parseJSON(obj)
case "sramcompiler" => SRAMCompiler.parseJSON(obj)
case "io_properties" => IOProperties.parseJSON(obj)
case "flipchip" => FlipChipMacro.parseJSON(obj)
case _ => None // skip unknown macro types
}
}
// Remove all the Nones and convert back to Seq[Macro]
Some(result.filter { x => x != None }.map { x => x.get })
}
case _ => None
}
}
// Read a MDF file from a path.
def readMDFFromPath(path: Option[String]): Option[Seq[Macro]] = {
path match {
case None => None
// Read file into string and parse
case Some(p) =>
try {
Utils.readMDFFromString(scala.io.Source.fromFile(p).mkString)
} catch {
case f: FileNotFoundException =>
println(s"FILE NOT FOUND $p in dir ${os.pwd}")
throw f
}
}
}
// Write a MDF file to a String.
def writeMDFToString(s: Seq[Macro]): String = {
Json.prettyPrint(JsArray(s.map(_.toJSON)))
}
// Write a MDF file from a path.
// Returns true upon success.
def writeMDFToPath(path: Option[String], s: Seq[Macro]): Boolean = {
path match {
case None => false
// Read file into string and parse
case Some(p: String) => {
import java.io._
val pw = new PrintWriter(new File(p))
pw.write(writeMDFToString(s))
val error = pw.checkError
pw.close()
!error
}
}
}
// Write a macro file to a String.
def writeMacroToString(s: Macro): String = {
Json.prettyPrint(s.toJSON)
}
// Write a Macro file from a path.
// Returns true upon success.
def writeMacroToPath(path: Option[String], s: Macro): Boolean = {
path match {
case None => false
// Read file into string and parse
case Some(p: String) => {
import java.io._
val pw = new PrintWriter(new File(p))
pw.write(writeMacroToString(s))
val error = pw.checkError
pw.close()
!error
}
}
}
}