package kelvin.soc

import kelvin.{MemoryRegion, MemoryRegionType}

// --- External Port Definitions ---

/** A simple enumeration for port directions. */
sealed trait PortDirection
case object In extends PortDirection
case object Out extends PortDirection

/** A simple enumeration for basic port types. */
sealed trait PortType
case object Clk extends PortType
case object Bool extends PortType

/**
 * Defines a non-TileLink port to be exposed at the subsystem boundary.
 *
 * @param name The name of the port on the subsystem's IO bundle.
 * @param portType The Chisel type of the port (e.g., Clock, Bool).
 * @param direction The direction of the port (In or Out).
 * @param modulePort The full path to the port on the instantiated module
 *                   (e.g., "io.halted", "io.spi.csb").
 */
case class ExternalPort(
  name: String,
  portType: PortType,
  direction: PortDirection,
  modulePort: String
)

// --- Type-Safe Module Parameter Definitions ---

/** A trait representing the parameters for any configurable Chisel module. */
sealed trait ModuleParameters

/** Parameters for the CoreTlul module. */
case class CoreTlulParameters(
  lsuDataBits: Int,
  enableRvv: Boolean,
  enableFetchL0: Boolean,
  fetchDataBits: Int,
  enableVector: Boolean,
  enableFloat: Boolean,
  memoryRegions: Seq[MemoryRegion]
) extends ModuleParameters

/** Parameters for the Spi2TLUL module. */
case class Spi2TlulParameters(
  lsuDataBits: Int
) extends ModuleParameters


/**
 * Defines the parameters for a Chisel module to be instantiated within the subsystem.
 *
 * @param name A unique instance name for the module.
 * @param moduleClass The fully qualified Scala class name of the Chisel Module to instantiate.
 * @param hostConnections A map where keys are port names on the module that are TileLink hosts,
 *                        and values are the names of the host ports on the crossbar to connect to.
 * @param deviceConnections A map where keys are port names on the module that are TileLink devices,
 *                          and values are the names of the device ports on the crossbar to connect to.
 * @param externalPorts A sequence of non-TileLink ports that need to be wired to the subsystem's top-level IO.
 */
case class ChiselModuleConfig(
  name: String,
  moduleClass: String,
  params: ModuleParameters,
  hostConnections: Map[String, String] = Map.empty,
  deviceConnections: Map[String, String] = Map.empty,
  externalPorts: Seq[ExternalPort] = Seq.empty
)

/**
 * The single source of truth for the entire Chisel-based portion of the SoC.
 */
object SoCChiselConfig {
  val crossbar = CrossbarConfig

  val modules = Seq(
    ChiselModuleConfig(
      name = "rvv_core",
      moduleClass = "kelvin.CoreTlul",
      params = CoreTlulParameters(
        lsuDataBits = 128,
        enableRvv = true,
        enableFetchL0 = false,
        fetchDataBits = 128,
        enableVector = false,
        enableFloat = true,
        memoryRegions = Seq(
          new MemoryRegion(0x0000, 0x2000, MemoryRegionType.IMEM),
          new MemoryRegion(0x10000, 0x8000, MemoryRegionType.DMEM),
          new MemoryRegion(0x30000, 0x2000, MemoryRegionType.Peripheral)
        )
      ),
      hostConnections = Map("io.tl_host" -> "kelvin_core"),
      deviceConnections = Map("io.tl_device" -> "kelvin_device"),
      externalPorts = Seq(
        ExternalPort("halted", Bool, Out, "io.halted"),
        ExternalPort("fault",  Bool, Out, "io.fault"),
        ExternalPort("wfi",    Bool, Out, "io.wfi"),
        ExternalPort("irq",    Bool, In,  "io.irq"),
        ExternalPort("te",     Bool, In,  "io.te")
      )
    ),
    ChiselModuleConfig(
      name = "spi2tlul",
      moduleClass = "bus.Spi2TLUL",
      params = Spi2TlulParameters(lsuDataBits = 128),
      hostConnections = Map("io.tl" -> "spi2tlul"),
      externalPorts = Seq(
        ExternalPort("spi_clk",  Clk,  In,  "io.spi.clk"),
        ExternalPort("spi_csb",  Bool, In,  "io.spi.csb"),
        ExternalPort("spi_mosi", Bool, In,  "io.spi.mosi"),
        ExternalPort("spi_miso", Bool, Out, "io.spi.miso")
      )
    )
  )
}
