xref: /XiangShan/src/main/scala/top/ArgParser.scala (revision 8cfc24b28454f1915c339ce79485711f8e438f59)
1c6d43980SLemover/***************************************************************************************
2e3da8badSTang Haojin* Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC)
3e3da8badSTang Haojin* Copyright (c) 2020-2024 Institute of Computing Technology, Chinese Academy of Sciences
4f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
5c6d43980SLemover*
6c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
7c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
8c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
9c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
10c6d43980SLemover*
11c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
12c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
13c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
14c6d43980SLemover*
15c6d43980SLemover* See the Mulan PSL v2 for more details.
16c6d43980SLemover***************************************************************************************/
17c6d43980SLemover
1845c767e3SLinJiaweipackage top
1945c767e3SLinJiawei
208891a219SYinan Xuimport org.chipsalliance.cde.config.{Config, Parameters}
2145c767e3SLinJiaweiimport system.SoCParamsKey
2234ab1ae9SJiawei Linimport xiangshan.{DebugOptionsKey, XSTileKey}
2319fbeaf4STang Haojinimport freechips.rocketchip.tile.MaxHartIdBits
24321934c7SKunlin Youimport difftest.DifftestModule
2545c767e3SLinJiawei
2645c767e3SLinJiaweiimport scala.annotation.tailrec
2745c767e3SLinJiaweiimport scala.sys.exit
2819fbeaf4STang Haojinimport chisel3.util.log2Up
29bb2f3f51STang Haojinimport utility._
30*8cfc24b2STang Haojinimport device.IMSICBusType
3145c767e3SLinJiawei
3245c767e3SLinJiaweiobject ArgParser {
3345c767e3SLinJiawei  // TODO: add more explainations
3445c767e3SLinJiawei  val usage =
3545c767e3SLinJiawei    """
3645c767e3SLinJiawei      |XiangShan Options
3745c767e3SLinJiawei      |--xs-help                  print this help message
38ce34d21eSJiuyue Ma      |--version                  print version info
3945c767e3SLinJiawei      |--config <ConfigClassName>
4045c767e3SLinJiawei      |--num-cores <Int>
41b628978eSTang Haojin      |--hartidbits <Int>
4245c767e3SLinJiawei      |--with-dramsim3
431545277aSYinan Xu      |--fpga-platform
449eee369fSKamimiao      |--reset-gen
451545277aSYinan Xu      |--enable-difftest
461545277aSYinan Xu      |--enable-log
47839e5512SZifei Zhang      |--with-chiseldb
48839e5512SZifei Zhang      |--with-rollingdb
4945c767e3SLinJiawei      |--disable-perf
5037b8fdeeSKamimiao      |--disable-alwaysdb
514b2c87baS梁森 Liang Sen      |--enable-dfx
5245c767e3SLinJiawei      |""".stripMargin
5345c767e3SLinJiawei
5445c767e3SLinJiawei  def getConfigByName(confString: String): Parameters = {
5545c767e3SLinJiawei    var prefix = "top." // default package is 'top'
5645c767e3SLinJiawei    if(confString.contains('.')){ // already a full name
5745c767e3SLinJiawei      prefix = ""
5845c767e3SLinJiawei    }
5945c767e3SLinJiawei    val c = Class.forName(prefix + confString).getConstructor(Integer.TYPE)
6045c767e3SLinJiawei    c.newInstance(1.asInstanceOf[Object]).asInstanceOf[Parameters]
6145c767e3SLinJiawei  }
6251e45dbbSTang Haojin  def parse(args: Array[String]): (Parameters, Array[String], Array[String]) = {
6345c767e3SLinJiawei    val default = new DefaultConfig(1)
6445c767e3SLinJiawei    var firrtlOpts = Array[String]()
65b665b650STang Haojin    var firtoolOpts = Array[String]()
6645c767e3SLinJiawei    @tailrec
6745c767e3SLinJiawei    def nextOption(config: Parameters, list: List[String]): Parameters = {
6845c767e3SLinJiawei      list match {
6945c767e3SLinJiawei        case Nil => config
7045c767e3SLinJiawei        case "--xs-help" :: tail =>
7145c767e3SLinJiawei          println(usage)
7245c767e3SLinJiawei          if(tail == Nil) exit(0)
7345c767e3SLinJiawei          nextOption(config, tail)
74ce34d21eSJiuyue Ma        case "--version" :: tail =>
75ce34d21eSJiuyue Ma          println(os.read(os.resource / "publishVersion"))
76ce34d21eSJiuyue Ma          if(tail == Nil) exit(0)
77ce34d21eSJiuyue Ma          nextOption(config, tail)
7845c767e3SLinJiawei        case "--config" :: confString :: tail =>
7945c767e3SLinJiawei          nextOption(getConfigByName(confString), tail)
801fc8b877Szhanglinjuan        case "--issue" :: issueString :: tail =>
811fc8b877Szhanglinjuan          nextOption(config.alter((site, here, up) => {
821fc8b877Szhanglinjuan            case coupledL2.tl2chi.CHIIssue => issueString
831fc8b877Szhanglinjuan          }), tail)
8445c767e3SLinJiawei        case "--num-cores" :: value :: tail =>
8545c767e3SLinJiawei          nextOption(config.alter((site, here, up) => {
8634ab1ae9SJiawei Lin            case XSTileKey => (0 until value.toInt) map { i =>
8734ab1ae9SJiawei Lin              up(XSTileKey).head.copy(HartId = i)
8834ab1ae9SJiawei Lin            }
8919fbeaf4STang Haojin            case MaxHartIdBits =>
90b628978eSTang Haojin              log2Up(value.toInt) max up(MaxHartIdBits)
91b628978eSTang Haojin          }), tail)
92b628978eSTang Haojin        case "--hartidbits" :: hartidbits :: tail =>
93b628978eSTang Haojin          nextOption(config.alter((site, here, up) => {
9496f46b96STang Haojin            case MaxHartIdBits => hartidbits.toInt
9545c767e3SLinJiawei          }), tail)
9645c767e3SLinJiawei        case "--with-dramsim3" :: tail =>
9745c767e3SLinJiawei          nextOption(config.alter((site, here, up) => {
9845c767e3SLinJiawei            case DebugOptionsKey => up(DebugOptionsKey).copy(UseDRAMSim = true)
9945c767e3SLinJiawei          }), tail)
100b8890d17SZifei Zhang        case "--with-chiseldb" :: tail =>
101b8890d17SZifei Zhang          nextOption(config.alter((site, here, up) => {
102b8890d17SZifei Zhang            case DebugOptionsKey => up(DebugOptionsKey).copy(EnableChiselDB = true)
103b8890d17SZifei Zhang          }), tail)
104839e5512SZifei Zhang        case "--with-rollingdb" :: tail =>
105839e5512SZifei Zhang          nextOption(config.alter((site, here, up) => {
106839e5512SZifei Zhang            case DebugOptionsKey => up(DebugOptionsKey).copy(EnableRollingDB = true)
107839e5512SZifei Zhang          }), tail)
108047e34f9SMaxpicca-Li        case "--with-constantin" :: tail =>
109047e34f9SMaxpicca-Li          nextOption(config.alter((site, here, up) => {
110047e34f9SMaxpicca-Li            case DebugOptionsKey => up(DebugOptionsKey).copy(EnableConstantin = true)
111047e34f9SMaxpicca-Li          }), tail)
1121545277aSYinan Xu        case "--fpga-platform" :: tail =>
11345c767e3SLinJiawei          nextOption(config.alter((site, here, up) => {
1141545277aSYinan Xu            case DebugOptionsKey => up(DebugOptionsKey).copy(FPGAPlatform = true)
1151545277aSYinan Xu          }), tail)
1169eee369fSKamimiao        case "--reset-gen" :: tail =>
1179eee369fSKamimiao          nextOption(config.alter((site, here, up) => {
1189eee369fSKamimiao            case DebugOptionsKey => up(DebugOptionsKey).copy(ResetGen = true)
1199eee369fSKamimiao          }), tail)
1201545277aSYinan Xu        case "--enable-difftest" :: tail =>
1211545277aSYinan Xu          nextOption(config.alter((site, here, up) => {
1221545277aSYinan Xu            case DebugOptionsKey => up(DebugOptionsKey).copy(EnableDifftest = true)
1231545277aSYinan Xu          }), tail)
124b7d9e8d5Sxiaofeibao-xjtu        case "--disable-always-basic-diff" :: tail =>
125b7d9e8d5Sxiaofeibao-xjtu          nextOption(config.alter((site, here, up) => {
126b7d9e8d5Sxiaofeibao-xjtu            case DebugOptionsKey => up(DebugOptionsKey).copy(AlwaysBasicDiff = false)
127b7d9e8d5Sxiaofeibao-xjtu          }), tail)
1281545277aSYinan Xu        case "--enable-log" :: tail =>
1291545277aSYinan Xu          nextOption(config.alter((site, here, up) => {
1301545277aSYinan Xu            case DebugOptionsKey => up(DebugOptionsKey).copy(EnableDebug = true)
13145c767e3SLinJiawei          }), tail)
13245c767e3SLinJiawei        case "--disable-perf" :: tail =>
13345c767e3SLinJiawei          nextOption(config.alter((site, here, up) => {
13445c767e3SLinJiawei            case DebugOptionsKey => up(DebugOptionsKey).copy(EnablePerfDebug = false)
13545c767e3SLinJiawei          }), tail)
1364ba1d457SKunlin You        case "--perf-level" :: value :: tail =>
1374ba1d457SKunlin You          nextOption(config.alter((site, here, up) => {
1384ba1d457SKunlin You            case DebugOptionsKey => up(DebugOptionsKey).copy(PerfLevel = value)
1394ba1d457SKunlin You          }), tail)
14037b8fdeeSKamimiao        case "--disable-alwaysdb" :: tail =>
14137b8fdeeSKamimiao          nextOption(config.alter((site, here, up) => {
14237b8fdeeSKamimiao            case DebugOptionsKey => up(DebugOptionsKey).copy(AlwaysBasicDB = false)
14337b8fdeeSKamimiao          }), tail)
144e3da8badSTang Haojin        case "--xstop-prefix" :: value :: tail =>
145a5b77de4STang Haojin          nextOption(config.alter((site, here, up) => {
146a5b77de4STang Haojin            case SoCParamsKey => up(SoCParamsKey).copy(XSTopPrefix = Some(value))
147a5b77de4STang Haojin          }), tail)
148*8cfc24b2STang Haojin        case "--imsic-bus-type" :: value :: tail =>
149720dd621STang Haojin          nextOption(config.alter((site, here, up) => {
150*8cfc24b2STang Haojin            case SoCParamsKey => up(SoCParamsKey).copy(IMSICBusType = device.IMSICBusType.withName(value))
151720dd621STang Haojin          }), tail)
152a74491fcSzhanglinjuan        case "--enable-ns" :: tail =>
153a74491fcSzhanglinjuan          nextOption(config.alter((site, here, up) => {
154a74491fcSzhanglinjuan            case coupledL2.tl2chi.NonSecureKey => true
155a74491fcSzhanglinjuan          }), tail)
156b665b650STang Haojin        case "--firtool-opt" :: option :: tail =>
15751e45dbbSTang Haojin          firtoolOpts ++= option.split(" ").filter(_.nonEmpty)
158b665b650STang Haojin          nextOption(config, tail)
159414f1bf4STang Haojin        case "--l2-cache-size" :: value :: tail =>
160414f1bf4STang Haojin          nextOption(config.alter((site, here, up) => {
161414f1bf4STang Haojin            case XSTileKey =>
162414f1bf4STang Haojin              val tileParams = up(XSTileKey)
163414f1bf4STang Haojin              val banks = tileParams.map(_.L2NBanks)
164414f1bf4STang Haojin              val ways = tileParams.map(_.L2CacheParamsOpt.map(_.ways))
165414f1bf4STang Haojin              val l2sets = banks zip ways map { case (banks, ways) =>
166414f1bf4STang Haojin                ways.map(value.toInt * 1024 / banks / _ / 64)
167414f1bf4STang Haojin              }
168414f1bf4STang Haojin              val newL2Params = tileParams zip l2sets map { case (tileParam, l2sets) =>
169414f1bf4STang Haojin                tileParam.L2CacheParamsOpt.map(_.copy(
170414f1bf4STang Haojin                  sets = l2sets.get
171414f1bf4STang Haojin                ))
172414f1bf4STang Haojin              }
173414f1bf4STang Haojin              tileParams zip newL2Params map { case (tileParam, newL2Param) =>
174414f1bf4STang Haojin                tileParam.copy(L2CacheParamsOpt = newL2Param)
175414f1bf4STang Haojin              }
176414f1bf4STang Haojin          }), tail)
177414f1bf4STang Haojin        case "--l3-cache-size" :: value :: tail =>
178414f1bf4STang Haojin          nextOption(config.alter((site, here, up) => {
179414f1bf4STang Haojin            case SoCParamsKey =>
180414f1bf4STang Haojin              val socParam = up(SoCParamsKey)
181414f1bf4STang Haojin              val banks = socParam.L3NBanks
182414f1bf4STang Haojin              val l3Ways = socParam.L3CacheParamsOpt.map(_.ways)
183414f1bf4STang Haojin              val l3Sets = l3Ways.map(value.toInt * 1024 / banks / _ / 64)
184414f1bf4STang Haojin              val openLLCWays = socParam.OpenLLCParamsOpt.map(_.ways)
185414f1bf4STang Haojin              val openLLCSets = openLLCWays.map(value.toInt * 1024 / banks / _ / 64)
186414f1bf4STang Haojin              val newL3Param = socParam.L3CacheParamsOpt.map(_.copy(
187414f1bf4STang Haojin                sets = l3Sets.get
188414f1bf4STang Haojin              ))
189414f1bf4STang Haojin              val openLLCParam = socParam.OpenLLCParamsOpt.map(_.copy(
190414f1bf4STang Haojin                sets = openLLCSets.get
191414f1bf4STang Haojin              ))
192414f1bf4STang Haojin              socParam.copy(
193414f1bf4STang Haojin                L3CacheParamsOpt = newL3Param,
194414f1bf4STang Haojin                OpenLLCParamsOpt = openLLCParam
195414f1bf4STang Haojin              )
196414f1bf4STang Haojin          }), tail)
197d084f29cSTang Haojin        case "--dfx" :: value :: tail =>
1984b2c87baS梁森 Liang Sen          nextOption(config.alter((site, here, up) => {
199d084f29cSTang Haojin            case XSTileKey => up(XSTileKey).map(_.copy(hasMbist = value.toBoolean))
2004b2c87baS梁森 Liang Sen          }), tail)
201602aa9f1Scz4e        case "--sram-with-ctl" :: tail =>
202602aa9f1Scz4e          nextOption(config.alter((site, here, up) => {
203602aa9f1Scz4e            case XSTileKey => up(XSTileKey).map(_.copy(hasSramCtl = true))
204602aa9f1Scz4e          }), tail)
20516ae9ddcSTang Haojin        case "--seperate-tl-bus" :: tail =>
2064a699e27Szhanglinjuan          nextOption(config.alter((site, here, up) => {
20716ae9ddcSTang Haojin            case SoCParamsKey => up(SoCParamsKey).copy(SeperateTLBus = true)
20816ae9ddcSTang Haojin          }), tail)
20916ae9ddcSTang Haojin        case "--seperate-dm" :: tail =>
21016ae9ddcSTang Haojin          nextOption(config.alter((site, here, up) => {
21116ae9ddcSTang Haojin            case SoCParamsKey => up(SoCParamsKey).copy(SeperateDM = true)
2124a699e27Szhanglinjuan          }), tail)
2134c0658aeSTang Haojin        case "--wfi-resume" :: value :: tail =>
2144c0658aeSTang Haojin          nextOption(config.alter((site, here, up) => {
2154c0658aeSTang Haojin            case XSTileKey => up(XSTileKey).map(_.copy(wfiResume = value.toBoolean))
2164c0658aeSTang Haojin          }), tail)
2175bd65c56STang Haojin        case "--yaml-config" :: yamlFile :: tail =>
2185bd65c56STang Haojin          nextOption(YamlParser.parseYaml(config, yamlFile), tail)
21945c767e3SLinJiawei        case option :: tail =>
22045c767e3SLinJiawei          // unknown option, maybe a firrtl option, skip
22145c767e3SLinJiawei          firrtlOpts :+= option
22245c767e3SLinJiawei          nextOption(config, tail)
22345c767e3SLinJiawei      }
22445c767e3SLinJiawei    }
225321934c7SKunlin You    val newArgs = DifftestModule.parseArgs(args)
226bb2f3f51STang Haojin    val config = nextOption(default, newArgs.toList).alter((site, here, up) => {
227bb2f3f51STang Haojin      case LogUtilsOptionsKey => LogUtilsOptions(
228bb2f3f51STang Haojin        here(DebugOptionsKey).EnableDebug,
229bb2f3f51STang Haojin        here(DebugOptionsKey).EnablePerfDebug,
230bb2f3f51STang Haojin        here(DebugOptionsKey).FPGAPlatform
231bb2f3f51STang Haojin      )
232bb2f3f51STang Haojin      case PerfCounterOptionsKey => PerfCounterOptions(
233bb2f3f51STang Haojin        here(DebugOptionsKey).EnablePerfDebug && !here(DebugOptionsKey).FPGAPlatform,
234bb2f3f51STang Haojin        here(DebugOptionsKey).EnableRollingDB && !here(DebugOptionsKey).FPGAPlatform,
2354ba1d457SKunlin You        XSPerfLevel.withName(here(DebugOptionsKey).PerfLevel),
236bb2f3f51STang Haojin        0
237bb2f3f51STang Haojin      )
238bb2f3f51STang Haojin    })
23951e45dbbSTang Haojin    (config, firrtlOpts, firtoolOpts)
24045c767e3SLinJiawei  }
24145c767e3SLinJiawei}
242