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