xref: /XiangShan/src/main/scala/top/YamlParser.scala (revision 16ae9ddcda54fc9a2fddffad73174cf793ac7814)
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