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