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