xref: /XiangShan/src/main/scala/top/YamlParser.scala (revision 69b78670068a0a6f0fb634fc02c24fc772838119)
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
228cfc24b2STang 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
27*69b78670STang Haojinimport freechips.rocketchip.devices.debug.{DebugAttachParams, ExportDebug}
28*69b78670STang Haojinimport freechips.rocketchip.devices.debug.{DMI, JTAG, CJTAG, APB}
29*69b78670STang Haojinimport freechips.rocketchip.devices.debug.{DebugModuleKey, DebugModuleParams}
3016ae9ddcSTang Haojinimport freechips.rocketchip.diplomacy.AddressSet
31*69b78670STang Haojinimport freechips.rocketchip.tile.MaxHartIdBits
324c0658aeSTang Haojinimport freechips.rocketchip.util.AsyncQueueParams
338cfc24b2STang Haojinimport device.IMSICBusType
345bd65c56STang Haojin
355bd65c56STang Haojincase class YamlConfig(
36*69b78670STang Haojin  Config: Option[String],
375bd65c56STang Haojin  PmemRanges: Option[List[MemoryRange]],
385bd65c56STang Haojin  PMAConfigs: Option[List[PMAConfigEntry]],
390964a977STang Haojin  EnableCHIAsyncBridge: Option[Boolean],
405bd65c56STang Haojin  L2CacheConfig: Option[L2CacheConfig],
415bd65c56STang Haojin  L3CacheConfig: Option[L3CacheConfig],
42*69b78670STang Haojin  HartIDBits: Option[Int],
43*69b78670STang Haojin  DebugAttachProtocals: Option[List[String]],
44*69b78670STang Haojin  DebugModuleParams: Option[DebugModuleParams],
454c0658aeSTang Haojin  WFIResume: Option[Boolean],
4616ae9ddcSTang Haojin  SeperateDM: Option[Boolean],
4716ae9ddcSTang Haojin  SeperateTLBus: Option[Boolean],
488cfc24b2STang Haojin  SeperateTLBusRanges: Option[List[AddressSet]],
49*69b78670STang Haojin  EnableSeperateTLBusAsyncBridge: Option[Boolean],
508cfc24b2STang Haojin  IMSICBusType: Option[String],
518cfc24b2STang Haojin  IMSICParams: Option[IMSICParams],
52*69b78670STang Haojin  CHIIssue: Option[String],
53*69b78670STang Haojin  WFIClockGate: Option[Boolean],
54*69b78670STang Haojin  EnablePowerDown: Option[Boolean],
55*69b78670STang Haojin  XSTopPrefix: Option[String],
56*69b78670STang Haojin  EnableDFX: Option[Boolean],
57*69b78670STang Haojin  EnableSramCtl: Option[Boolean],
58*69b78670STang Haojin  EnableCHINS: Option[Boolean],
595bd65c56STang Haojin)
605bd65c56STang Haojin
615bd65c56STang Haojinobject YamlParser {
625bd65c56STang Haojin  implicit val customParserConfig: Configuration = Configuration.default.withDefaults
635bd65c56STang Haojin  def parseYaml(config: Parameters, yamlFile: String): Parameters = {
645bd65c56STang Haojin    val yaml = scala.io.Source.fromFile(yamlFile).mkString
655bd65c56STang Haojin    val json = io.circe.yaml.parser.parse(yaml) match {
665bd65c56STang Haojin      case Left(value) => throw value
675bd65c56STang Haojin      case Right(value) => value
685bd65c56STang Haojin    }
695bd65c56STang Haojin    val yamlConfig = json.as[YamlConfig] match {
705bd65c56STang Haojin      case Left(value) => throw value
715bd65c56STang Haojin      case Right(value) => value
725bd65c56STang Haojin    }
735bd65c56STang Haojin    var newConfig = config
74*69b78670STang Haojin    yamlConfig.Config.foreach { config =>
75*69b78670STang Haojin      newConfig = ArgParser.getConfigByName(config)
76*69b78670STang Haojin    }
775bd65c56STang Haojin    yamlConfig.PmemRanges.foreach { ranges =>
785bd65c56STang Haojin      newConfig = newConfig.alter((site, here, up) => {
795bd65c56STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(PmemRanges = ranges)
805bd65c56STang Haojin      })
815bd65c56STang Haojin    }
825bd65c56STang Haojin    yamlConfig.PMAConfigs.foreach { pmaConfigs =>
835bd65c56STang Haojin      newConfig = newConfig.alter((site, here, up) => {
845bd65c56STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(PMAConfigs = pmaConfigs)
855bd65c56STang Haojin      })
865bd65c56STang Haojin    }
870964a977STang Haojin    yamlConfig.EnableCHIAsyncBridge.foreach { enable =>
885bd65c56STang Haojin      newConfig = newConfig.alter((site, here, up) => {
895bd65c56STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(
900964a977STang Haojin          EnableCHIAsyncBridge = Option.when(enable)(AsyncQueueParams(depth = 16, sync = 3, safe = false))
915bd65c56STang Haojin        )
925bd65c56STang Haojin      })
935bd65c56STang Haojin    }
945bd65c56STang Haojin    yamlConfig.L2CacheConfig.foreach(l2 => newConfig = newConfig.alter(l2))
955bd65c56STang Haojin    yamlConfig.L3CacheConfig.foreach(l3 => newConfig = newConfig.alter(l3))
96*69b78670STang Haojin    yamlConfig.DebugAttachProtocals.foreach { protocols =>
975bd65c56STang Haojin      newConfig = newConfig.alter((site, here, up) => {
98*69b78670STang Haojin        case ExportDebug => DebugAttachParams(protocols = protocols.map {
99*69b78670STang Haojin          case "DMI" => DMI
100*69b78670STang Haojin          case "JTAG" => JTAG
101*69b78670STang Haojin          case "CJTAG" => CJTAG
102*69b78670STang Haojin          case "APB" => APB
103*69b78670STang Haojin        }.toSet)
104*69b78670STang Haojin      })
105*69b78670STang Haojin    }
106*69b78670STang Haojin    yamlConfig.HartIDBits.foreach { bits =>
107*69b78670STang Haojin      newConfig = newConfig.alter((site, here, up) => {
108*69b78670STang Haojin        case MaxHartIdBits => bits
109*69b78670STang Haojin      })
110*69b78670STang Haojin    }
111*69b78670STang Haojin    yamlConfig.DebugModuleParams.foreach { params =>
112*69b78670STang Haojin      newConfig = newConfig.alter((site, here, up) => {
113*69b78670STang Haojin        case DebugModuleKey => Some(params)
1145bd65c56STang Haojin      })
1155bd65c56STang Haojin    }
1164c0658aeSTang Haojin    yamlConfig.WFIResume.foreach { enable =>
1174c0658aeSTang Haojin      newConfig = newConfig.alter((site, here, up) => {
1184c0658aeSTang Haojin        case XSTileKey => up(XSTileKey).map(_.copy(wfiResume = enable))
1194c0658aeSTang Haojin      })
1204c0658aeSTang Haojin    }
12116ae9ddcSTang Haojin    yamlConfig.SeperateDM.foreach { enable =>
12216ae9ddcSTang Haojin      newConfig = newConfig.alter((site, here, up) => {
12316ae9ddcSTang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(SeperateDM = enable)
12416ae9ddcSTang Haojin      })
12516ae9ddcSTang Haojin    }
12616ae9ddcSTang Haojin    yamlConfig.SeperateTLBus.foreach { enable =>
12716ae9ddcSTang Haojin      newConfig = newConfig.alter((site, here, up) => {
12816ae9ddcSTang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(SeperateTLBus = enable)
12916ae9ddcSTang Haojin      })
13016ae9ddcSTang Haojin    }
13116ae9ddcSTang Haojin    yamlConfig.SeperateTLBusRanges.foreach { ranges =>
13216ae9ddcSTang Haojin      newConfig = newConfig.alter((site, here, up) => {
13316ae9ddcSTang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(SeperateTLBusRanges = ranges)
13416ae9ddcSTang Haojin      })
13516ae9ddcSTang Haojin    }
136*69b78670STang Haojin    yamlConfig.EnableSeperateTLBusAsyncBridge.foreach { enable =>
137*69b78670STang Haojin      newConfig = newConfig.alter((site, here, up) => {
138*69b78670STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(
139*69b78670STang Haojin          SeperateTLAsyncBridge = Option.when(enable)(AsyncQueueParams(depth = 1, sync = 3, safe = false))
140*69b78670STang Haojin        )
141*69b78670STang Haojin      })
142*69b78670STang Haojin    }
1438cfc24b2STang Haojin    yamlConfig.IMSICBusType.foreach { busType =>
1448cfc24b2STang Haojin      newConfig = newConfig.alter((site, here, up) => {
1458cfc24b2STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(IMSICBusType = device.IMSICBusType.withName(busType))
1468cfc24b2STang Haojin      })
1478cfc24b2STang Haojin    }
1488cfc24b2STang Haojin    yamlConfig.IMSICParams.foreach { params =>
1498cfc24b2STang Haojin      newConfig = newConfig.alter((site, here, up) => {
1508cfc24b2STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(IMSICParams = params)
1518cfc24b2STang Haojin      })
1528cfc24b2STang Haojin    }
153*69b78670STang Haojin    yamlConfig.CHIIssue.foreach { issue =>
154*69b78670STang Haojin      newConfig = newConfig.alter((site, here, up) => {
155*69b78670STang Haojin        case coupledL2.tl2chi.CHIIssue => issue
156*69b78670STang Haojin      })
157*69b78670STang Haojin    }
158*69b78670STang Haojin    yamlConfig.WFIClockGate.foreach { enable =>
159*69b78670STang Haojin      newConfig = newConfig.alter((site, here, up) => {
160*69b78670STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(WFIClockGate = enable)
161*69b78670STang Haojin      })
162*69b78670STang Haojin    }
163*69b78670STang Haojin    yamlConfig.EnablePowerDown.foreach { enable =>
164*69b78670STang Haojin      newConfig = newConfig.alter((site, here, up) => {
165*69b78670STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(EnablePowerDown = enable)
166*69b78670STang Haojin      })
167*69b78670STang Haojin    }
168*69b78670STang Haojin    yamlConfig.XSTopPrefix.foreach { prefix =>
169*69b78670STang Haojin      newConfig = newConfig.alter((site, here, up) => {
170*69b78670STang Haojin        case SoCParamsKey => up(SoCParamsKey).copy(XSTopPrefix = Option.when(prefix.nonEmpty)(prefix))
171*69b78670STang Haojin      })
172*69b78670STang Haojin    }
173*69b78670STang Haojin    yamlConfig.EnableDFX.foreach { enable =>
174*69b78670STang Haojin      newConfig = newConfig.alter((site, here, up) => {
175*69b78670STang Haojin        case XSTileKey => up(XSTileKey).map(_.copy(hasMbist = enable))
176*69b78670STang Haojin      })
177*69b78670STang Haojin    }
178*69b78670STang Haojin    yamlConfig.EnableSramCtl.foreach { enable =>
179*69b78670STang Haojin      newConfig = newConfig.alter((site, here, up) => {
180*69b78670STang Haojin        case XSTileKey => up(XSTileKey).map(_.copy(hasSramCtl = enable))
181*69b78670STang Haojin      })
182*69b78670STang Haojin    }
183*69b78670STang Haojin    yamlConfig.EnableCHINS.foreach { enable =>
184*69b78670STang Haojin      newConfig = newConfig.alter((site, here, up) => {
185*69b78670STang Haojin        case coupledL2.tl2chi.NonSecureKey => enable
186*69b78670STang Haojin      })
187*69b78670STang Haojin    }
1885bd65c56STang Haojin    newConfig
1895bd65c56STang Haojin  }
1905bd65c56STang Haojin}
191