Object model (#1684)

* Added Object Model case classes

* Added objectionModelInstance function to SimpleDevice

* Added object model JSON elaboration artifact.

* Added companion object and OMISA factory
This commit is contained in:
Derek Pappas 2018-11-05 12:49:51 -08:00 committed by GitHub
parent 5627b138ae
commit df2a964bd3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 135 additions and 0 deletions

View File

@ -3,6 +3,7 @@
package freechips.rocketchip.diplomacy
import Chisel.log2Ceil
import freechips.rocketchip.diplomaticobjectmodel.model._
import scala.collection.immutable.{ListMap,SortedMap}
import scala.collection.mutable.HashMap
@ -68,6 +69,10 @@ abstract class Device
{
def describe(resources: ResourceBindings): Description
/* This can be overriden to make one device relative to another */
def objectModelInstance() : Option[OMComponent] = None
def parent: Option[Device] = None
/** make sure all derived devices have an unique label */
@ -359,6 +364,8 @@ trait BindingScope
/** Collect resource addresses from tree. */
def collectResourceAddresses = collect(2, Nil, 0, bindingTree)
def objectModelInstance: Option[OMComponent] = None
}
object BindingScope

View File

@ -0,0 +1,26 @@
// See LICENSE.SiFive for license details.
package freechips.rocketchip.diplomaticobjectmodel
import java.io.{File, FileWriter}
import java.lang.management.OperatingSystemMXBean
import org.json4s.jackson.JsonMethods.pretty
import org.json4s.jackson.Serialization
import org.json4s.{Extraction, NoTypeHints}
object DiplomaticObjectModelUtils {
def toJson(json: Any): String = {
implicit val formats = Serialization.formats(NoTypeHints)
pretty(Extraction.decompose(json))
}
def writeJsonFile(filename: String, json: Map[String, Any]) : Unit = {
val writer = new FileWriter(new File(filename))
writer.write(toJson(json))
writer.close()
}
}

View File

@ -0,0 +1,42 @@
// See LICENSE.SiFive for license details.
package freechips.rocketchip.diplomaticobjectmodel.model
sealed trait PrivilegedArchitectureExtension
case object MachineLevelISA extends PrivilegedArchitectureExtension
case object SupervisorLevelISA extends PrivilegedArchitectureExtension
object PrivilegedArchitectureExtensions {
val specifications = Map[PrivilegedArchitectureExtension, String](
MachineLevelISA -> "Machine-Level ISA",
SupervisorLevelISA -> "Supervisor-Level ISA"
)
def specVersion(extension: PrivilegedArchitectureExtension, version: String): OMSpecification = OMSpecification(specifications(extension), version)
}
object BaseExtensions {
val specifications = Map[OMBaseInstructionSet, String](
RV32E -> "RV32E Base Integer Instruction Set",
RV32I -> "RV32I Base Integer Instruction Set",
RV64I -> "RV64I Base Integer Instruction Set"
)
def specVersion(extension: OMBaseInstructionSet, version: String): OMSpecification = OMSpecification(specifications(extension), version)
}
object ISAExtensions {
val specifications = Map[OMExtensionType, String](
M -> "M Standard Extension for Integer Multiplication and Division",
A -> "A Standard Extension for Atomic Instruction",
F -> "F Standard Extension for Single-Precision Floating-Point",
D -> "D Standard Extension for Double-Precision Floating-Point",
C -> "C Standard Extension for Compressed Instruction",
U -> "TODO This is not really correct. The RISCV Instruction Set Manual, Volume II: Privileged Architecture",
S -> "Supervisor-Level ISA"
)
def specVersion(extension: OMExtensionType, version: String): OMSpecification = OMSpecification(specifications(extension), version)
}

View File

@ -0,0 +1,12 @@
// See LICENSE.SiFive for license details.
package freechips.rocketchip.diplomaticobjectmodel.model
trait OMBaseType
trait OMEnum extends OMBaseType
trait OMCompoundType extends OMBaseType
trait OMComponent extends OMCompoundType

View File

@ -0,0 +1,37 @@
// See LICENSE.SiFive for license details.
package freechips.rocketchip.diplomaticobjectmodel.model
trait OMExtensionType extends OMEnum
case object M extends OMExtensionType
case object A extends OMExtensionType
case object F extends OMExtensionType
case object D extends OMExtensionType
case object C extends OMExtensionType
case object U extends OMExtensionType
case object S extends OMExtensionType
trait OMAddressTranslationMode extends OMEnum
case object Sv32 extends OMAddressTranslationMode
case object Sv39 extends OMAddressTranslationMode
case object Sv48 extends OMAddressTranslationMode
trait OMBaseInstructionSet extends OMEnum
case object RV32E extends OMBaseInstructionSet
case object RV32I extends OMBaseInstructionSet
case object RV64I extends OMBaseInstructionSet
case object RV128I extends OMBaseInstructionSet
case class OMISA(
xLen: Int,
baseSpecification: OMSpecification,
base: OMBaseInstructionSet,
m: Option[OMSpecification],
a: Option[OMSpecification],
f: Option[OMSpecification],
d: Option[OMSpecification],
c: Option[OMSpecification],
u: Option[OMSpecification],
s: Option[OMSpecification],
addressTranslationModes: Seq[OMAddressTranslationMode]
) extends OMCompoundType

View File

@ -0,0 +1,8 @@
// See LICENSE.SiFive for license details.
package freechips.rocketchip.diplomaticobjectmodel.model
case class OMSpecification(
name: String,
version: String
)

View File

@ -5,6 +5,7 @@ package freechips.rocketchip.subsystem
import Chisel._
import freechips.rocketchip.config.{Parameters, Field}
import freechips.rocketchip.diplomacy._
import freechips.rocketchip.diplomaticobjectmodel.DiplomaticObjectModelUtils
import freechips.rocketchip.tilelink._
import freechips.rocketchip.util._
@ -19,6 +20,7 @@ case object BuildSystemBus extends Field[Parameters => SystemBus](p => new Syste
/** BareSubsystem is the root class for creating a subsystem */
abstract class BareSubsystem(implicit p: Parameters) extends LazyModule with BindingScope {
lazy val objectModelJson = DiplomaticObjectModelUtils.toJson(objectModelInstance)
lazy val dts = DTS(bindingTree)
lazy val dtb = DTB(dts)
lazy val json = JSON(bindingTree)
@ -26,6 +28,7 @@ abstract class BareSubsystem(implicit p: Parameters) extends LazyModule with Bin
abstract class BareSubsystemModuleImp[+L <: BareSubsystem](_outer: L) extends LazyModuleImp(_outer) {
val outer = _outer
ElaborationArtefacts.add("objectModel.json", outer.objectModelJson)
ElaborationArtefacts.add("graphml", outer.graphML)
ElaborationArtefacts.add("dts", outer.dts)
ElaborationArtefacts.add("json", outer.json)