xref: /XiangShan/build.sc (revision 844fba5b86d00c2ec233eddeffc3d637862575fd)
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
182102afb5SLinJiaweiimport mill._
19718a511dSLinJiaweiimport scalalib._
20cf7d6b7aSMuziimport scalafmt._
2172060888SJiawei Linimport $file.`rocket-chip`.common
228891a219SYinan Xuimport $file.`rocket-chip`.cde.common
2372060888SJiawei Linimport $file.`rocket-chip`.hardfloat.build
247f37d55fSTang Haojinimport $file.huancun.common
257f37d55fSTang Haojinimport $file.coupledL2.common
2678a8cd25Szhanglinjuanimport $file.openLLC.common
272905e463SZihao Yu
28ce34d21eSJiuyue Ma/* for publishVersion */
29ce34d21eSJiuyue Maimport $ivy.`de.tototec::de.tobiasroeser.mill.vcs.version::0.4.0`
30ce34d21eSJiuyue Maimport de.tobiasroeser.mill.vcs.version.VcsVersion
31*844fba5bSXuan Huimport java.io.{BufferedReader, InputStreamReader}
32ce34d21eSJiuyue Maimport java.time.LocalDateTime
33ce34d21eSJiuyue Maimport java.time.format.DateTimeFormatter
3426f0fb0dSJiuyue Maimport java.util.Locale
35ce34d21eSJiuyue Maimport scala.util.matching.Regex
36ce34d21eSJiuyue Ma
37195ef4a5STang Haojinval defaultScalaVersion = "2.13.14"
3872060888SJiawei Lin
39e3da8badSTang Haojindef defaultVersions = Map(
40ae0295f4STang Haojin  "chisel"        -> ivy"org.chipsalliance::chisel:6.5.0",
41ae0295f4STang Haojin  "chisel-plugin" -> ivy"org.chipsalliance:::chisel-plugin:6.5.0",
42195ef4a5STang Haojin  "chiseltest"    -> ivy"edu.berkeley.cs::chiseltest:6.0.0"
43c21bff99SJiawei Lin)
447f37d55fSTang Haojin
45e3da8badSTang Haojintrait HasChisel extends SbtModule {
467f37d55fSTang Haojin  def chiselModule: Option[ScalaModule] = None
477f37d55fSTang Haojin
487f37d55fSTang Haojin  def chiselPluginJar: T[Option[PathRef]] = None
497f37d55fSTang Haojin
50e3da8badSTang Haojin  def chiselIvy: Option[Dep] = Some(defaultVersions("chisel"))
517f37d55fSTang Haojin
52e3da8badSTang Haojin  def chiselPluginIvy: Option[Dep] = Some(defaultVersions("chisel-plugin"))
537f37d55fSTang Haojin
547f37d55fSTang Haojin  override def scalaVersion = defaultScalaVersion
557f37d55fSTang Haojin
567f37d55fSTang Haojin  override def scalacOptions = super.scalacOptions() ++
577f37d55fSTang Haojin    Agg("-language:reflectiveCalls", "-Ymacro-annotations", "-Ytasty-reader")
587f37d55fSTang Haojin
59e3da8badSTang Haojin  override def ivyDeps = super.ivyDeps() ++ Agg(chiselIvy.get)
607f37d55fSTang Haojin
617f37d55fSTang Haojin  override def scalacPluginIvyDeps = super.scalacPluginIvyDeps() ++ Agg(chiselPluginIvy.get)
62c21bff99SJiawei Lin}
63c21bff99SJiawei Lin
64e3da8badSTang Haojinobject rocketchip
657f37d55fSTang Haojin  extends millbuild.`rocket-chip`.common.RocketChipModule
6651e45dbbSTang Haojin    with HasChisel {
677f37d55fSTang Haojin  def scalaVersion: T[String] = T(defaultScalaVersion)
6872060888SJiawei Lin
697f37d55fSTang Haojin  override def millSourcePath = os.pwd / "rocket-chip"
7072060888SJiawei Lin
717f37d55fSTang Haojin  def macrosModule = macros
7272060888SJiawei Lin
73e3da8badSTang Haojin  def hardfloatModule = hardfloat
7472060888SJiawei Lin
757f37d55fSTang Haojin  def cdeModule = cde
7672060888SJiawei Lin
77195ef4a5STang Haojin  def mainargsIvy = ivy"com.lihaoyi::mainargs:0.7.0"
787f37d55fSTang Haojin
79195ef4a5STang Haojin  def json4sJacksonIvy = ivy"org.json4s::json4s-jackson:4.0.7"
807f37d55fSTang Haojin
817f37d55fSTang Haojin  object macros extends Macros
827f37d55fSTang Haojin
837f37d55fSTang Haojin  trait Macros
847f37d55fSTang Haojin    extends millbuild.`rocket-chip`.common.MacrosModule
857f37d55fSTang Haojin      with SbtModule {
867f37d55fSTang Haojin
877f37d55fSTang Haojin    def scalaVersion: T[String] = T(defaultScalaVersion)
887f37d55fSTang Haojin
897f37d55fSTang Haojin    def scalaReflectIvy = ivy"org.scala-lang:scala-reflect:${defaultScalaVersion}"
902905e463SZihao Yu  }
912905e463SZihao Yu
92e3da8badSTang Haojin  object hardfloat
937f37d55fSTang Haojin    extends millbuild.`rocket-chip`.hardfloat.common.HardfloatModule with HasChisel {
942102afb5SLinJiawei
957f37d55fSTang Haojin    def scalaVersion: T[String] = T(defaultScalaVersion)
96718a511dSLinJiawei
977f37d55fSTang Haojin    override def millSourcePath = os.pwd / "rocket-chip" / "hardfloat" / "hardfloat"
9872060888SJiawei Lin
9972060888SJiawei Lin  }
10072060888SJiawei Lin
101e3da8badSTang Haojin  object cde
102e3da8badSTang Haojin    extends millbuild.`rocket-chip`.cde.common.CDEModule with ScalaModule {
103718a511dSLinJiawei
1047f37d55fSTang Haojin    def scalaVersion: T[String] = T(defaultScalaVersion)
1057f37d55fSTang Haojin
1067f37d55fSTang Haojin    override def millSourcePath = os.pwd / "rocket-chip" / "cde" / "cde"
1077f37d55fSTang Haojin  }
108718a511dSLinJiawei}
109718a511dSLinJiawei
110e3da8badSTang Haojinobject utility extends HasChisel {
1113c02ee8fSwakafa
1123c02ee8fSwakafa  override def millSourcePath = os.pwd / "utility"
1133c02ee8fSwakafa
1143c02ee8fSwakafa  override def moduleDeps = super.moduleDeps ++ Seq(
115e3da8badSTang Haojin    rocketchip
1163c02ee8fSwakafa  )
1177f37d55fSTang Haojin
1187f37d55fSTang Haojin}
1197f37d55fSTang Haojin
120e3da8badSTang Haojinobject yunsuan extends HasChisel {
1214b0d80d8SXuan Hu
1224b0d80d8SXuan Hu  override def millSourcePath = os.pwd / "yunsuan"
1234b0d80d8SXuan Hu
1244b0d80d8SXuan Hu}
1254b0d80d8SXuan Hu
126e3da8badSTang Haojinobject huancun extends millbuild.huancun.common.HuanCunModule with HasChisel {
1277f37d55fSTang Haojin
1287f37d55fSTang Haojin  override def millSourcePath = os.pwd / "huancun"
1297f37d55fSTang Haojin
130e3da8badSTang Haojin  def rocketModule: ScalaModule = rocketchip
1317f37d55fSTang Haojin
132e3da8badSTang Haojin  def utilityModule: ScalaModule = utility
1337f37d55fSTang Haojin
1347f37d55fSTang Haojin}
1357f37d55fSTang Haojin
136e3da8badSTang Haojinobject coupledL2 extends millbuild.coupledL2.common.CoupledL2Module with HasChisel {
1377f37d55fSTang Haojin
1387f37d55fSTang Haojin  override def millSourcePath = os.pwd / "coupledL2"
1397f37d55fSTang Haojin
140e3da8badSTang Haojin  def rocketModule: ScalaModule = rocketchip
1417f37d55fSTang Haojin
142e3da8badSTang Haojin  def utilityModule: ScalaModule = utility
1437f37d55fSTang Haojin
144e3da8badSTang Haojin  def huancunModule: ScalaModule = huancun
1457f37d55fSTang Haojin
1467f37d55fSTang Haojin}
1477f37d55fSTang Haojin
1485c060727Ssumailyycobject openNCB extends SbtModule with HasChisel {
1495c060727Ssumailyyc
1505c060727Ssumailyyc  override def millSourcePath = os.pwd / "openLLC" / "openNCB"
1515c060727Ssumailyyc
1525c060727Ssumailyyc  override def moduleDeps = super.moduleDeps ++ Seq(
1535c060727Ssumailyyc    rocketchip
1545c060727Ssumailyyc  )
1555c060727Ssumailyyc
1565c060727Ssumailyyc}
1575c060727Ssumailyyc
158e3da8badSTang Haojinobject openLLC extends millbuild.openLLC.common.OpenLLCModule with HasChisel {
15978a8cd25Szhanglinjuan
16078a8cd25Szhanglinjuan  override def millSourcePath = os.pwd / "openLLC"
16178a8cd25Szhanglinjuan
162e3da8badSTang Haojin  def coupledL2Module: ScalaModule = coupledL2
16378a8cd25Szhanglinjuan
164e3da8badSTang Haojin  def rocketModule: ScalaModule = rocketchip
16578a8cd25Szhanglinjuan
166e3da8badSTang Haojin  def utilityModule: ScalaModule = utility
1675c060727Ssumailyyc
1685c060727Ssumailyyc  def openNCBModule: ScalaModule = openNCB
1695c060727Ssumailyyc
17078a8cd25Szhanglinjuan}
17178a8cd25Szhanglinjuan
172e3da8badSTang Haojinobject difftest extends HasChisel {
1737f37d55fSTang Haojin
1747f37d55fSTang Haojin  override def millSourcePath = os.pwd / "difftest"
1757f37d55fSTang Haojin
1767f37d55fSTang Haojin}
1777f37d55fSTang Haojin
178e3da8badSTang Haojinobject fudian extends HasChisel {
1797f37d55fSTang Haojin
1807f37d55fSTang Haojin  override def millSourcePath = os.pwd / "fudian"
1817f37d55fSTang Haojin
1823c02ee8fSwakafa}
1833c02ee8fSwakafa
184e3da8badSTang Haojinobject macros extends ScalaModule {
185039cdc35SXuan Hu
186039cdc35SXuan Hu  override def millSourcePath = os.pwd / "macros"
187039cdc35SXuan Hu
188039cdc35SXuan Hu  override def scalaVersion: T[String] = T(defaultScalaVersion)
189039cdc35SXuan Hu
190039cdc35SXuan Hu  override def ivyDeps = super.ivyDeps() ++ Agg(ivy"org.scala-lang:scala-reflect:${defaultScalaVersion}")
191039cdc35SXuan Hu
192039cdc35SXuan Hu  def scalaReflectIvy = ivy"org.scala-lang:scala-reflect:${defaultScalaVersion}"
193039cdc35SXuan Hu}
194039cdc35SXuan Hu
19572060888SJiawei Lin// extends this trait to use XiangShan in other projects
1967f37d55fSTang Haojintrait XiangShanModule extends ScalaModule {
19772060888SJiawei Lin
1987f37d55fSTang Haojin  def rocketModule: ScalaModule
19972060888SJiawei Lin
2007f37d55fSTang Haojin  def difftestModule: ScalaModule
201718a511dSLinJiawei
2027f37d55fSTang Haojin  def huancunModule: ScalaModule
203718a511dSLinJiawei
2047f37d55fSTang Haojin  def coupledL2Module: ScalaModule
2057f37d55fSTang Haojin
20678a8cd25Szhanglinjuan  def openLLCModule: ScalaModule
20778a8cd25Szhanglinjuan
2087f37d55fSTang Haojin  def fudianModule: ScalaModule
2097f37d55fSTang Haojin
2107f37d55fSTang Haojin  def utilityModule: ScalaModule
21172060888SJiawei Lin
21283ba63b3SXuan Hu  def yunsuanModule: ScalaModule
213718a511dSLinJiawei
214039cdc35SXuan Hu  def macrosModule: ScalaModule
215039cdc35SXuan Hu
216c5f31b5bSLinJiawei  override def moduleDeps = super.moduleDeps ++ Seq(
21772060888SJiawei Lin    rocketModule,
21872060888SJiawei Lin    difftestModule,
21972060888SJiawei Lin    huancunModule,
22015ee59e4Swakafa    coupledL2Module,
22178a8cd25Szhanglinjuan    openLLCModule,
22230056234SZhangZifei    yunsuanModule,
2233c02ee8fSwakafa    fudianModule,
2247f37d55fSTang Haojin    utilityModule,
225039cdc35SXuan Hu    macrosModule,
226c5f31b5bSLinJiawei  )
2272905e463SZihao Yu
2284b0d80d8SXuan Hu  val resourcesPATH = os.pwd.toString() + "/src/main/resources"
2294b0d80d8SXuan Hu  val envPATH = sys.env("PATH") + ":" + resourcesPATH
2306f021e01SJiawei Lin
2314b0d80d8SXuan Hu  override def forkEnv = Map("PATH" -> envPATH)
2327f37d55fSTang Haojin}
2337f37d55fSTang Haojin
234cf7d6b7aSMuziobject xiangshan extends XiangShanModule with HasChisel with ScalafmtModule {
2357f37d55fSTang Haojin
23651e45dbbSTang Haojin  override def millSourcePath = os.pwd
2377f37d55fSTang Haojin
238e3da8badSTang Haojin  def rocketModule = rocketchip
2397f37d55fSTang Haojin
240e3da8badSTang Haojin  def difftestModule = difftest
2417f37d55fSTang Haojin
242e3da8badSTang Haojin  def huancunModule = huancun
2437f37d55fSTang Haojin
244e3da8badSTang Haojin  def coupledL2Module = coupledL2
2457f37d55fSTang Haojin
246e3da8badSTang Haojin  def openLLCModule = openLLC
24778a8cd25Szhanglinjuan
248e3da8badSTang Haojin  def fudianModule = fudian
2497f37d55fSTang Haojin
250e3da8badSTang Haojin  def utilityModule = utility
2517f37d55fSTang Haojin
252e3da8badSTang Haojin  def yunsuanModule = yunsuan
25383ba63b3SXuan Hu
254039cdc35SXuan Hu  def macrosModule = macros
255039cdc35SXuan Hu
2565fca38ffSXuan Hu  override def forkArgs = Seq("-Xmx40G", "-Xss256m")
2577f37d55fSTang Haojin
25883ba63b3SXuan Hu  override def ivyDeps = super.ivyDeps() ++ Agg(
259e3da8badSTang Haojin    defaultVersions("chiseltest"),
26083ba63b3SXuan Hu  )
26183ba63b3SXuan Hu
262e3da8badSTang Haojin  override def scalacOptions = super.scalacOptions() ++ Agg("-deprecation", "-feature")
263e3da8badSTang Haojin
264ce34d21eSJiuyue Ma  def publishVersion: T[String] = VcsVersion.vcsState().format(
265ce34d21eSJiuyue Ma    revHashDigits = 8,
266ce34d21eSJiuyue Ma    dirtyHashDigits = 0,
267ce34d21eSJiuyue Ma    commitCountPad = -1,
268ce34d21eSJiuyue Ma    countSep = "",
269ce34d21eSJiuyue Ma    tagModifier = (tag: String) => "[Rr]elease.*".r.findFirstMatchIn(tag) match {
270ce34d21eSJiuyue Ma      case Some(_) => "Kunminghu-Release-" + LocalDateTime.now().format(
27126f0fb0dSJiuyue Ma                                 DateTimeFormatter.ofPattern("MMM-dd-yyyy").withLocale(new Locale("en")))
272ce34d21eSJiuyue Ma      case None => "Kunminghu-dev"
273ce34d21eSJiuyue Ma    },
274ce34d21eSJiuyue Ma    /* add "username, buildhost, buildtime" for non-release version */
275ce34d21eSJiuyue Ma    untaggedSuffix = " (%s@%s) # %s".format(
276ce34d21eSJiuyue Ma      System.getProperty("user.name"),
277ce34d21eSJiuyue Ma      java.net.InetAddress.getLocalHost().getHostName(),
27826f0fb0dSJiuyue Ma      LocalDateTime.now().format(DateTimeFormatter.ofPattern("MMM dd hh:mm:ss yyyy").withLocale(new Locale("en")))),
279ce34d21eSJiuyue Ma  )
280ce34d21eSJiuyue Ma
281*844fba5bSXuan Hu  def gitStatus: T[String] = {
282*844fba5bSXuan Hu    val gitRevParseBuilder = new ProcessBuilder("git", "rev-parse", "HEAD")
283*844fba5bSXuan Hu    val gitRevParseProcess = gitRevParseBuilder.start()
284*844fba5bSXuan Hu    val shaReader = new BufferedReader(new InputStreamReader(gitRevParseProcess.getInputStream))
285*844fba5bSXuan Hu    val sha = shaReader.readLine()
286*844fba5bSXuan Hu
287*844fba5bSXuan Hu    val gitStatusBuilder = new ProcessBuilder("git", "status", "-uno", "--porcelain")
288*844fba5bSXuan Hu    val gitStatusProcess = gitStatusBuilder.start()
289*844fba5bSXuan Hu    val gitStatusReader = new BufferedReader(new InputStreamReader(gitStatusProcess.getInputStream))
290*844fba5bSXuan Hu    val status = gitStatusReader.readLine()
291*844fba5bSXuan Hu    val gitDirty = if (status == null) 0 else 1
292*844fba5bSXuan Hu
293*844fba5bSXuan Hu    val str =
294*844fba5bSXuan Hu      s"""|SHA=$sha
295*844fba5bSXuan Hu          |dirty=$gitDirty
296*844fba5bSXuan Hu          |""".stripMargin
297*844fba5bSXuan Hu    str
298*844fba5bSXuan Hu  }
299*844fba5bSXuan Hu
300ce34d21eSJiuyue Ma  override def resources = T.sources {
301ce34d21eSJiuyue Ma    os.write(T.dest / "publishVersion", publishVersion())
302*844fba5bSXuan Hu    os.write(T.dest / "gitStatus", gitStatus())
303ce34d21eSJiuyue Ma    super.resources() ++ Seq(PathRef(T.dest))
304ce34d21eSJiuyue Ma  }
305ce34d21eSJiuyue Ma
306cf9b35a7SYinan Xu  object test extends SbtModuleTests with TestModule.ScalaTest {
3075fca38ffSXuan Hu    override def forkArgs = Seq("-Xmx40G", "-Xss256m")
30851e45dbbSTang Haojin
309718a511dSLinJiawei    override def ivyDeps = super.ivyDeps() ++ Agg(
310e3da8badSTang Haojin      defaultVersions("chiseltest")
3116aea7ec5SLinJiawei    )
3124364f1d0SHaojin Tang
313e3da8badSTang Haojin    override def scalacOptions = super.scalacOptions() ++ Agg("-deprecation", "-feature")
314e3da8badSTang Haojin
3154364f1d0SHaojin Tang    val resourcesPATH = os.pwd.toString() + "/src/main/resources"
3164364f1d0SHaojin Tang    val envPATH = sys.env("PATH") + ":" + resourcesPATH
3174364f1d0SHaojin Tang
3184364f1d0SHaojin Tang    override def forkEnv = Map("PATH" -> envPATH)
319fc85214eSLinJiawei  }
3202905e463SZihao Yu}
321