1*5bd65c56STang Haojin/*************************************************************************************** 2*5bd65c56STang Haojin* Copyright (c) 2025 Beijing Institute of Open Source Chip (BOSC) 3*5bd65c56STang Haojin* Copyright (c) 2025 Institute of Computing Technology, Chinese Academy of Sciences 4*5bd65c56STang Haojin* 5*5bd65c56STang Haojin* XiangShan is licensed under Mulan PSL v2. 6*5bd65c56STang Haojin* You can use this software according to the terms and conditions of the Mulan PSL v2. 7*5bd65c56STang Haojin* You may obtain a copy of Mulan PSL v2 at: 8*5bd65c56STang Haojin* http://license.coscl.org.cn/MulanPSL2 9*5bd65c56STang Haojin* 10*5bd65c56STang Haojin* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11*5bd65c56STang Haojin* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12*5bd65c56STang Haojin* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13*5bd65c56STang Haojin* 14*5bd65c56STang Haojin* See the Mulan PSL v2 for more details. 15*5bd65c56STang Haojin***************************************************************************************/ 16*5bd65c56STang Haojin 17*5bd65c56STang Haojinpackage top 18*5bd65c56STang Haojin 19*5bd65c56STang Haojinimport io.circe.generic.extras.Configuration 20*5bd65c56STang Haojinimport io.circe.generic.extras.auto._ 21*5bd65c56STang Haojin 22*5bd65c56STang Haojinimport org.chipsalliance.cde.config.Parameters 23*5bd65c56STang Haojinimport system.SoCParamsKey 24*5bd65c56STang Haojinimport xiangshan.backend.fu.{MemoryRange, PMAConfigEntry} 25*5bd65c56STang Haojinimport freechips.rocketchip.devices.debug.DebugModuleKey 26*5bd65c56STang Haojinimport freechips.rocketchip.util.AsyncQueueParams 27*5bd65c56STang Haojin 28*5bd65c56STang Haojincase class YamlConfig( 29*5bd65c56STang Haojin PmemRanges: Option[List[MemoryRange]], 30*5bd65c56STang Haojin PMAConfigs: Option[List[PMAConfigEntry]], 31*5bd65c56STang Haojin CHIAsyncBridge: Option[AsyncQueueParams], 32*5bd65c56STang Haojin L2CacheConfig: Option[L2CacheConfig], 33*5bd65c56STang Haojin L3CacheConfig: Option[L3CacheConfig], 34*5bd65c56STang Haojin DebugModuleBaseAddr: Option[BigInt] 35*5bd65c56STang Haojin) 36*5bd65c56STang Haojin 37*5bd65c56STang Haojinobject YamlParser { 38*5bd65c56STang Haojin implicit val customParserConfig: Configuration = Configuration.default.withDefaults 39*5bd65c56STang Haojin def parseYaml(config: Parameters, yamlFile: String): Parameters = { 40*5bd65c56STang Haojin val yaml = scala.io.Source.fromFile(yamlFile).mkString 41*5bd65c56STang Haojin val json = io.circe.yaml.parser.parse(yaml) match { 42*5bd65c56STang Haojin case Left(value) => throw value 43*5bd65c56STang Haojin case Right(value) => value 44*5bd65c56STang Haojin } 45*5bd65c56STang Haojin val yamlConfig = json.as[YamlConfig] match { 46*5bd65c56STang Haojin case Left(value) => throw value 47*5bd65c56STang Haojin case Right(value) => value 48*5bd65c56STang Haojin } 49*5bd65c56STang Haojin var newConfig = config 50*5bd65c56STang Haojin yamlConfig.PmemRanges.foreach { ranges => 51*5bd65c56STang Haojin newConfig = newConfig.alter((site, here, up) => { 52*5bd65c56STang Haojin case SoCParamsKey => up(SoCParamsKey).copy(PmemRanges = ranges) 53*5bd65c56STang Haojin }) 54*5bd65c56STang Haojin } 55*5bd65c56STang Haojin yamlConfig.PMAConfigs.foreach { pmaConfigs => 56*5bd65c56STang Haojin newConfig = newConfig.alter((site, here, up) => { 57*5bd65c56STang Haojin case SoCParamsKey => up(SoCParamsKey).copy(PMAConfigs = pmaConfigs) 58*5bd65c56STang Haojin }) 59*5bd65c56STang Haojin } 60*5bd65c56STang Haojin yamlConfig.CHIAsyncBridge.foreach { bridge => 61*5bd65c56STang Haojin newConfig = newConfig.alter((site, here, up) => { 62*5bd65c56STang Haojin case SoCParamsKey => up(SoCParamsKey).copy( 63*5bd65c56STang Haojin EnableCHIAsyncBridge = Option.when(bridge.depth > 0)(bridge) 64*5bd65c56STang Haojin ) 65*5bd65c56STang Haojin }) 66*5bd65c56STang Haojin } 67*5bd65c56STang Haojin yamlConfig.L2CacheConfig.foreach(l2 => newConfig = newConfig.alter(l2)) 68*5bd65c56STang Haojin yamlConfig.L3CacheConfig.foreach(l3 => newConfig = newConfig.alter(l3)) 69*5bd65c56STang Haojin yamlConfig.DebugModuleBaseAddr.foreach { addr => 70*5bd65c56STang Haojin newConfig = newConfig.alter((site, here, up) => { 71*5bd65c56STang Haojin case DebugModuleKey => up(DebugModuleKey).map(_.copy(baseAddress = addr)) 72*5bd65c56STang Haojin }) 73*5bd65c56STang Haojin } 74*5bd65c56STang Haojin newConfig 75*5bd65c56STang Haojin } 76*5bd65c56STang Haojin} 77