diff --git a/src/main/scala/diplomacy/Resources.scala b/src/main/scala/diplomacy/Resources.scala index b5b2e2f4..5dd738af 100644 --- a/src/main/scala/diplomacy/Resources.scala +++ b/src/main/scala/diplomacy/Resources.scala @@ -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 diff --git a/src/main/scala/diplomaticobjectmodel/DiplomaticObjectModelUtils.scala b/src/main/scala/diplomaticobjectmodel/DiplomaticObjectModelUtils.scala new file mode 100644 index 00000000..f776c76e --- /dev/null +++ b/src/main/scala/diplomaticobjectmodel/DiplomaticObjectModelUtils.scala @@ -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() + } + +} diff --git a/src/main/scala/diplomaticobjectmodel/model/ISASpecifications.scala b/src/main/scala/diplomaticobjectmodel/model/ISASpecifications.scala new file mode 100644 index 00000000..249fb19a --- /dev/null +++ b/src/main/scala/diplomaticobjectmodel/model/ISASpecifications.scala @@ -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 RISC‑V Instruction Set Manual, Volume II: Privileged Architecture", + S -> "Supervisor-Level ISA" + ) + + def specVersion(extension: OMExtensionType, version: String): OMSpecification = OMSpecification(specifications(extension), version) + +} diff --git a/src/main/scala/diplomaticobjectmodel/model/OMBase.scala b/src/main/scala/diplomaticobjectmodel/model/OMBase.scala new file mode 100644 index 00000000..2f109569 --- /dev/null +++ b/src/main/scala/diplomaticobjectmodel/model/OMBase.scala @@ -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 + diff --git a/src/main/scala/diplomaticobjectmodel/model/OMISA.scala b/src/main/scala/diplomaticobjectmodel/model/OMISA.scala new file mode 100644 index 00000000..ef064624 --- /dev/null +++ b/src/main/scala/diplomaticobjectmodel/model/OMISA.scala @@ -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 diff --git a/src/main/scala/diplomaticobjectmodel/model/OMSpecification.scala b/src/main/scala/diplomaticobjectmodel/model/OMSpecification.scala new file mode 100644 index 00000000..90dffb5c --- /dev/null +++ b/src/main/scala/diplomaticobjectmodel/model/OMSpecification.scala @@ -0,0 +1,8 @@ +// See LICENSE.SiFive for license details. + +package freechips.rocketchip.diplomaticobjectmodel.model + +case class OMSpecification( + name: String, + version: String +) diff --git a/src/main/scala/subsystem/BaseSubsystem.scala b/src/main/scala/subsystem/BaseSubsystem.scala index fee7412b..b4906e86 100644 --- a/src/main/scala/subsystem/BaseSubsystem.scala +++ b/src/main/scala/subsystem/BaseSubsystem.scala @@ -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)