xref: /XiangShan/src/main/scala/top/YamlParser.scala (revision 8cfc24b28454f1915c339ce79485711f8e438f59)
15bd65c56STang Haojin/***************************************************************************************
25bd65c56STang Haojin* Copyright (c) 2025 Beijing Institute of Open Source Chip (BOSC)
35bd65c56STang Haojin* Copyright (c) 2025 Institute of Computing Technology, Chinese Academy of Sciences
45bd65c56STang Haojin*
55bd65c56STang Haojin* XiangShan is licensed under Mulan PSL v2.
65bd65c56STang Haojin* You can use this software according to the terms and conditions of the Mulan PSL v2.
75bd65c56STang Haojin* You may obtain a copy of Mulan PSL v2 at:
85bd65c56STang Haojin*          http://license.coscl.org.cn/MulanPSL2
95bd65c56STang Haojin*
105bd65c56STang Haojin* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
115bd65c56STang Haojin* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
125bd65c56STang Haojin* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
135bd65c56STang Haojin*
145bd65c56STang Haojin* See the Mulan PSL v2 for more details.
155bd65c56STang Haojin***************************************************************************************/
165bd65c56STang Haojin
175bd65c56STang Haojinpackage top
185bd65c56STang Haojin
195bd65c56STang Haojinimport io.circe.generic.extras.Configuration
205bd65c56STang Haojinimport io.circe.generic.extras.auto._
215bd65c56STang Haojin
22*8cfc24b2STang Haojinimport aia.IMSICParams
235bd65c56STang Haojinimport org.chipsalliance.cde.config.Parameters
245bd65c56STang Haojinimport system.SoCParamsKey
255bd65c56STang Haojinimport xiangshan.backend.fu.{MemoryRange, PMAConfigEntry}
264c0658aeSTang Haojinimport xiangshan.XSTileKey
275bd65c56STang Haojinimport freechips.rocketchip.devices.debug.DebugModuleKey
2816ae9ddcSTang Haojinimport freechips.rocketchip.diplomacy.AddressSet
294c0658aeSTang Haojinimport freechips.rocketchip.util.AsyncQueueParams
30*8cfc24b2STang Haojinimport device.IMSICBusType
315bd65c56STang Haojin
325bd65c56STang Haojincase class YamlConfig(
335bd65c56STang Haojin  PmemRanges: Option[List[MemoryRange]],
345bd65c56STang Haojin  PMAConfigs: Option[List[PMAConfigEntry]],
350964a977STang Haojin  EnableCHIAsyncBridge: Option[Boolean],
365bd65c56STang Haojin  L2CacheConfig: Option[L2CacheConfig],
375bd65c56STang Haojin  L3CacheConfig: Option[L3CacheConfig],
3816ae9ddcSTang Haojin  DebugModuleBaseAddr: Option[BigInt],
394c0658aeSTang Haojin  WFIResume: Option[Boolean],
4016ae9ddcSTang Haojin  SeperateDM: Option[Boolean],
4116ae9ddcSTang Haojin  SeperateTLBus: Option[Boolean],
42*8cfc24b2STang Haojin  SeperateTLBusRanges: Option[List[AddressSet]],
43*8cfc24b2STang Haojin  IMSICBusType: Option[String],
44*8cfc24b2STang Haojin  IMSICParams: Option[IMSICParams],
455bd65c56STang Haojin)
465bd65c56STang Haojin
475bd65c56STang Haojinobject YamlParser {
485bd65c56STang Haojin  implicit val customParserConfig: Configuration = Configuration.default.withDefaults
495bd65c56STang Haojin  def parseYaml(config: Parameters, yamlFile: String): Parameters = {
505bd65c56STang Haojin    val yaml = scala.io.Source.fromFile(yamlFile).mkString
515bd65c56STang Haojin    val json = io.circe.yaml.parser.parse(yaml) match {
525bd65c56STang Haojin      case Left(value) => throw value
535bd65c56STang Haojin      case Right(value) => value
545bd65c56STang Haojin    }
555bd65c56STang Haojin    val yamlConfig = json.as[YamlConfig] match {
565bd65c56STang Haojin      case Left(value) => throw value
575bd65c56STang Haojin      case Right(value) => value
585bd65c56STang Haojin    }
595bd65c56STang Haojin    var newConfig = config
605bd65c56STang Haojin    yamlConfig.PmemRanges.foreach { ranges =>
615bd65c56STang Haojin      newConfig = newConfig.alter((site, here, up) => {
625bd65c56STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(PmemRanges = ranges)
635bd65c56STang Haojin      })
645bd65c56STang Haojin    }
655bd65c56STang Haojin    yamlConfig.PMAConfigs.foreach { pmaConfigs =>
665bd65c56STang Haojin      newConfig = newConfig.alter((site, here, up) => {
675bd65c56STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(PMAConfigs = pmaConfigs)
685bd65c56STang Haojin      })
695bd65c56STang Haojin    }
700964a977STang Haojin    yamlConfig.EnableCHIAsyncBridge.foreach { enable =>
715bd65c56STang Haojin      newConfig = newConfig.alter((site, here, up) => {
725bd65c56STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(
730964a977STang Haojin          EnableCHIAsyncBridge = Option.when(enable)(AsyncQueueParams(depth = 16, sync = 3, safe = false))
745bd65c56STang Haojin        )
755bd65c56STang Haojin      })
765bd65c56STang Haojin    }
775bd65c56STang Haojin    yamlConfig.L2CacheConfig.foreach(l2 => newConfig = newConfig.alter(l2))
785bd65c56STang Haojin    yamlConfig.L3CacheConfig.foreach(l3 => newConfig = newConfig.alter(l3))
795bd65c56STang Haojin    yamlConfig.DebugModuleBaseAddr.foreach { addr =>
805bd65c56STang Haojin      newConfig = newConfig.alter((site, here, up) => {
815bd65c56STang Haojin        case DebugModuleKey => up(DebugModuleKey).map(_.copy(baseAddress = addr))
825bd65c56STang Haojin      })
835bd65c56STang Haojin    }
844c0658aeSTang Haojin    yamlConfig.WFIResume.foreach { enable =>
854c0658aeSTang Haojin      newConfig = newConfig.alter((site, here, up) => {
864c0658aeSTang Haojin        case XSTileKey => up(XSTileKey).map(_.copy(wfiResume = enable))
874c0658aeSTang Haojin      })
884c0658aeSTang Haojin    }
8916ae9ddcSTang Haojin    yamlConfig.SeperateDM.foreach { enable =>
9016ae9ddcSTang Haojin      newConfig = newConfig.alter((site, here, up) => {
9116ae9ddcSTang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(SeperateDM = enable)
9216ae9ddcSTang Haojin      })
9316ae9ddcSTang Haojin    }
9416ae9ddcSTang Haojin    yamlConfig.SeperateTLBus.foreach { enable =>
9516ae9ddcSTang Haojin      newConfig = newConfig.alter((site, here, up) => {
9616ae9ddcSTang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(SeperateTLBus = enable)
9716ae9ddcSTang Haojin      })
9816ae9ddcSTang Haojin    }
9916ae9ddcSTang Haojin    yamlConfig.SeperateTLBusRanges.foreach { ranges =>
10016ae9ddcSTang Haojin      newConfig = newConfig.alter((site, here, up) => {
10116ae9ddcSTang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(SeperateTLBusRanges = ranges)
10216ae9ddcSTang Haojin      })
10316ae9ddcSTang Haojin    }
104*8cfc24b2STang Haojin    yamlConfig.IMSICBusType.foreach { busType =>
105*8cfc24b2STang Haojin      newConfig = newConfig.alter((site, here, up) => {
106*8cfc24b2STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(IMSICBusType = device.IMSICBusType.withName(busType))
107*8cfc24b2STang Haojin      })
108*8cfc24b2STang Haojin    }
109*8cfc24b2STang Haojin    yamlConfig.IMSICParams.foreach { params =>
110*8cfc24b2STang Haojin      newConfig = newConfig.alter((site, here, up) => {
111*8cfc24b2STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(IMSICParams = params)
112*8cfc24b2STang Haojin      })
113*8cfc24b2STang Haojin    }
1145bd65c56STang Haojin    newConfig
1155bd65c56STang Haojin  }
1165bd65c56STang Haojin}
117