xref: /XiangShan/src/main/scala/top/ArgParser.scala (revision b665b65009f36cbe77ec1a1cb4246701d9cee88b)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
1745c767e3SLinJiaweipackage top
1845c767e3SLinJiawei
1945c767e3SLinJiaweiimport chipsalliance.rocketchip.config.{Config, Parameters}
2045c767e3SLinJiaweiimport system.SoCParamsKey
2134ab1ae9SJiawei Linimport xiangshan.{DebugOptionsKey, XSTileKey}
2245c767e3SLinJiawei
2345c767e3SLinJiaweiimport scala.annotation.tailrec
2445c767e3SLinJiaweiimport scala.sys.exit
2545c767e3SLinJiawei
2645c767e3SLinJiaweiobject ArgParser {
2745c767e3SLinJiawei  // TODO: add more explainations
2845c767e3SLinJiawei  val usage =
2945c767e3SLinJiawei    """
3045c767e3SLinJiawei      |XiangShan Options
3145c767e3SLinJiawei      |--xs-help                  print this help message
3245c767e3SLinJiawei      |--config <ConfigClassName>
3345c767e3SLinJiawei      |--num-cores <Int>
3445c767e3SLinJiawei      |--with-dramsim3
351545277aSYinan Xu      |--fpga-platform
361545277aSYinan Xu      |--enable-difftest
371545277aSYinan Xu      |--enable-log
3845c767e3SLinJiawei      |--disable-perf
39cc358710SLinJiawei      |--mfc
4045c767e3SLinJiawei      |""".stripMargin
4145c767e3SLinJiawei
4245c767e3SLinJiawei  def getConfigByName(confString: String): Parameters = {
4345c767e3SLinJiawei    var prefix = "top." // default package is 'top'
4445c767e3SLinJiawei    if(confString.contains('.')){ // already a full name
4545c767e3SLinJiawei      prefix = ""
4645c767e3SLinJiawei    }
4745c767e3SLinJiawei    val c = Class.forName(prefix + confString).getConstructor(Integer.TYPE)
4845c767e3SLinJiawei    c.newInstance(1.asInstanceOf[Object]).asInstanceOf[Parameters]
4945c767e3SLinJiawei  }
50*b665b650STang Haojin  def parse(args: Array[String]): (Parameters, Array[String], FirrtlCompiler, Array[String]) = {
5145c767e3SLinJiawei    val default = new DefaultConfig(1)
5245c767e3SLinJiawei    var firrtlOpts = Array[String]()
53cc358710SLinJiawei    var firrtlCompiler: FirrtlCompiler = SFC
54*b665b650STang Haojin    var firtoolOpts = Array[String]()
5545c767e3SLinJiawei    @tailrec
5645c767e3SLinJiawei    def nextOption(config: Parameters, list: List[String]): Parameters = {
5745c767e3SLinJiawei      list match {
5845c767e3SLinJiawei        case Nil => config
5945c767e3SLinJiawei        case "--xs-help" :: tail =>
6045c767e3SLinJiawei          println(usage)
6145c767e3SLinJiawei          if(tail == Nil) exit(0)
6245c767e3SLinJiawei          nextOption(config, tail)
6345c767e3SLinJiawei        case "--config" :: confString :: tail =>
6445c767e3SLinJiawei          nextOption(getConfigByName(confString), tail)
6545c767e3SLinJiawei        case "--num-cores" :: value :: tail =>
6645c767e3SLinJiawei          nextOption(config.alter((site, here, up) => {
6734ab1ae9SJiawei Lin            case XSTileKey => (0 until value.toInt) map{ i =>
6834ab1ae9SJiawei Lin              up(XSTileKey).head.copy(HartId = i)
6934ab1ae9SJiawei Lin            }
7045c767e3SLinJiawei          }), tail)
7145c767e3SLinJiawei        case "--with-dramsim3" :: tail =>
7245c767e3SLinJiawei          nextOption(config.alter((site, here, up) => {
7345c767e3SLinJiawei            case DebugOptionsKey => up(DebugOptionsKey).copy(UseDRAMSim = true)
7445c767e3SLinJiawei          }), tail)
751545277aSYinan Xu        case "--fpga-platform" :: tail =>
7645c767e3SLinJiawei          nextOption(config.alter((site, here, up) => {
771545277aSYinan Xu            case DebugOptionsKey => up(DebugOptionsKey).copy(FPGAPlatform = true)
781545277aSYinan Xu          }), tail)
791545277aSYinan Xu        case "--enable-difftest" :: tail =>
801545277aSYinan Xu          nextOption(config.alter((site, here, up) => {
811545277aSYinan Xu            case DebugOptionsKey => up(DebugOptionsKey).copy(EnableDifftest = true)
821545277aSYinan Xu          }), tail)
831545277aSYinan Xu        case "--enable-log" :: tail =>
841545277aSYinan Xu          nextOption(config.alter((site, here, up) => {
851545277aSYinan Xu            case DebugOptionsKey => up(DebugOptionsKey).copy(EnableDebug = true)
8645c767e3SLinJiawei          }), tail)
8745c767e3SLinJiawei        case "--disable-perf" :: tail =>
8845c767e3SLinJiawei          nextOption(config.alter((site, here, up) => {
8945c767e3SLinJiawei            case DebugOptionsKey => up(DebugOptionsKey).copy(EnablePerfDebug = false)
9045c767e3SLinJiawei          }), tail)
91eb163ef0SHaojin Tang        case "--enable-topdown" :: tail =>
92eb163ef0SHaojin Tang          nextOption(config.alter((site, here, up) => {
93eb163ef0SHaojin Tang            case DebugOptionsKey => up(DebugOptionsKey).copy(EnableTopDown = true)
94eb163ef0SHaojin Tang          }), tail)
95cc358710SLinJiawei        case "--mfc" :: tail =>
96cc358710SLinJiawei          firrtlCompiler = MFC
97cc358710SLinJiawei          nextOption(config, tail)
98*b665b650STang Haojin        case "--firtool-opt" :: option :: tail =>
99*b665b650STang Haojin          firtoolOpts :+= option
100*b665b650STang Haojin          nextOption(config, tail)
10145c767e3SLinJiawei        case option :: tail =>
10245c767e3SLinJiawei          // unknown option, maybe a firrtl option, skip
10345c767e3SLinJiawei          firrtlOpts :+= option
10445c767e3SLinJiawei          nextOption(config, tail)
10545c767e3SLinJiawei      }
10645c767e3SLinJiawei    }
107175bcfe9SLinJiawei    var config = nextOption(default, args.toList)
108*b665b650STang Haojin    (config, firrtlOpts, firrtlCompiler, firtoolOpts)
10945c767e3SLinJiawei  }
11045c767e3SLinJiawei}
111