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 225bd65c56STang Haojinimport org.chipsalliance.cde.config.Parameters 235bd65c56STang Haojinimport system.SoCParamsKey 245bd65c56STang Haojinimport xiangshan.backend.fu.{MemoryRange, PMAConfigEntry} 255bd65c56STang Haojinimport freechips.rocketchip.devices.debug.DebugModuleKey 265bd65c56STang Haojinimport freechips.rocketchip.util.AsyncQueueParams 27*16ae9ddcSTang Haojinimport freechips.rocketchip.diplomacy.AddressSet 285bd65c56STang Haojin 295bd65c56STang Haojincase class YamlConfig( 305bd65c56STang Haojin PmemRanges: Option[List[MemoryRange]], 315bd65c56STang Haojin PMAConfigs: Option[List[PMAConfigEntry]], 320964a977STang Haojin EnableCHIAsyncBridge: Option[Boolean], 335bd65c56STang Haojin L2CacheConfig: Option[L2CacheConfig], 345bd65c56STang Haojin L3CacheConfig: Option[L3CacheConfig], 35*16ae9ddcSTang Haojin DebugModuleBaseAddr: Option[BigInt], 36*16ae9ddcSTang Haojin SeperateDM: Option[Boolean], 37*16ae9ddcSTang Haojin SeperateTLBus: Option[Boolean], 38*16ae9ddcSTang Haojin SeperateTLBusRanges: Option[List[AddressSet]] 395bd65c56STang Haojin) 405bd65c56STang Haojin 415bd65c56STang Haojinobject YamlParser { 425bd65c56STang Haojin implicit val customParserConfig: Configuration = Configuration.default.withDefaults 435bd65c56STang Haojin def parseYaml(config: Parameters, yamlFile: String): Parameters = { 445bd65c56STang Haojin val yaml = scala.io.Source.fromFile(yamlFile).mkString 455bd65c56STang Haojin val json = io.circe.yaml.parser.parse(yaml) match { 465bd65c56STang Haojin case Left(value) => throw value 475bd65c56STang Haojin case Right(value) => value 485bd65c56STang Haojin } 495bd65c56STang Haojin val yamlConfig = json.as[YamlConfig] match { 505bd65c56STang Haojin case Left(value) => throw value 515bd65c56STang Haojin case Right(value) => value 525bd65c56STang Haojin } 535bd65c56STang Haojin var newConfig = config 545bd65c56STang Haojin yamlConfig.PmemRanges.foreach { ranges => 555bd65c56STang Haojin newConfig = newConfig.alter((site, here, up) => { 565bd65c56STang Haojin case SoCParamsKey => up(SoCParamsKey).copy(PmemRanges = ranges) 575bd65c56STang Haojin }) 585bd65c56STang Haojin } 595bd65c56STang Haojin yamlConfig.PMAConfigs.foreach { pmaConfigs => 605bd65c56STang Haojin newConfig = newConfig.alter((site, here, up) => { 615bd65c56STang Haojin case SoCParamsKey => up(SoCParamsKey).copy(PMAConfigs = pmaConfigs) 625bd65c56STang Haojin }) 635bd65c56STang Haojin } 640964a977STang Haojin yamlConfig.EnableCHIAsyncBridge.foreach { enable => 655bd65c56STang Haojin newConfig = newConfig.alter((site, here, up) => { 665bd65c56STang Haojin case SoCParamsKey => up(SoCParamsKey).copy( 670964a977STang Haojin EnableCHIAsyncBridge = Option.when(enable)(AsyncQueueParams(depth = 16, sync = 3, safe = false)) 685bd65c56STang Haojin ) 695bd65c56STang Haojin }) 705bd65c56STang Haojin } 715bd65c56STang Haojin yamlConfig.L2CacheConfig.foreach(l2 => newConfig = newConfig.alter(l2)) 725bd65c56STang Haojin yamlConfig.L3CacheConfig.foreach(l3 => newConfig = newConfig.alter(l3)) 735bd65c56STang Haojin yamlConfig.DebugModuleBaseAddr.foreach { addr => 745bd65c56STang Haojin newConfig = newConfig.alter((site, here, up) => { 755bd65c56STang Haojin case DebugModuleKey => up(DebugModuleKey).map(_.copy(baseAddress = addr)) 765bd65c56STang Haojin }) 775bd65c56STang Haojin } 78*16ae9ddcSTang Haojin yamlConfig.SeperateDM.foreach { enable => 79*16ae9ddcSTang Haojin newConfig = newConfig.alter((site, here, up) => { 80*16ae9ddcSTang Haojin case SoCParamsKey => up(SoCParamsKey).copy(SeperateDM = enable) 81*16ae9ddcSTang Haojin }) 82*16ae9ddcSTang Haojin } 83*16ae9ddcSTang Haojin yamlConfig.SeperateTLBus.foreach { enable => 84*16ae9ddcSTang Haojin newConfig = newConfig.alter((site, here, up) => { 85*16ae9ddcSTang Haojin case SoCParamsKey => up(SoCParamsKey).copy(SeperateTLBus = enable) 86*16ae9ddcSTang Haojin }) 87*16ae9ddcSTang Haojin } 88*16ae9ddcSTang Haojin yamlConfig.SeperateTLBusRanges.foreach { ranges => 89*16ae9ddcSTang Haojin newConfig = newConfig.alter((site, here, up) => { 90*16ae9ddcSTang Haojin case SoCParamsKey => up(SoCParamsKey).copy(SeperateTLBusRanges = ranges) 91*16ae9ddcSTang Haojin }) 92*16ae9ddcSTang Haojin } 935bd65c56STang Haojin newConfig 945bd65c56STang Haojin } 955bd65c56STang Haojin} 96