97 lines
3.0 KiB
Scala
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
|
|
}
|
|
}
|
|
}
|
|
}
|