XiangShan/build.mill

234 lines
7.8 KiB
Plaintext

// Copyright (c) 2024-2025 Beijing Institute of Open Source Chip (BOSC)
// Copyright (c) 2020-2025 Institute of Computing Technology, Chinese Academy of Sciences
// Copyright (c) 2020-2021 Peng Cheng Laboratory
//
// XiangShan is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// https://license.coscl.org.cn/MulanPSL2
//
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
//
// See the Mulan PSL v2 for more details.
package build
import $ivy.`de.tototec::de.tobiasroeser.mill.vcs.version::0.4.0`
import $ivy.`org.chipsalliance::chisel:6.6.0`
import $ivy.`org.chipsalliance::firtool-resolver:1.3.0`
import de.tobiasroeser.mill.vcs.version.VcsVersion
import java.io.BufferedReader
import java.io.InputStreamReader
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import java.util.Locale
import mill._
import mill.scalalib._
import mill.scalalib.scalafmt.ScalafmtModule
import os.Path
val defaultScalaVersion = "2.13.15"
val pwd = os.Path(sys.env("MILL_WORKSPACE_ROOT"))
trait ChiselModule extends SbtModule with ScalafmtModule {
def scalaVersion: T[String] = defaultScalaVersion
def scalacOptions = Seq("-language:reflectiveCalls", "-Ymacro-annotations", "-Ytasty-reader")
def ivyDeps: T[Agg[Dep]] = Agg(ivy"org.chipsalliance::chisel:6.6.0", ivy"edu.berkeley.cs::chiseltest:6.0.0")
def scalacPluginIvyDeps: T[Agg[Dep]] = Agg(ivy"org.chipsalliance:::chisel-plugin:6.6.0")
def resolveFirtoolDeps = T {
firtoolresolver.Resolve(chisel3.BuildInfo.firtoolVersion.get, true) match {
case Right(bin) => bin.path.getAbsolutePath
case Left(err) => err
}
}
}
object `rocket-chip` extends ChiselModule {
object macros extends ScalaModule {
def scalaVersion: T[String] = defaultScalaVersion
def ivyDeps: T[Agg[Dep]] = Agg(ivy"org.scala-lang:scala-reflect:$defaultScalaVersion")
}
object hardfloat extends ChiselModule {
def millSourcePath: Path = pwd / "rocket-chip" / "hardfloat" / "hardfloat"
}
object cde extends ScalaModule {
def scalaVersion: T[String] = defaultScalaVersion
def millSourcePath: Path = pwd / "rocket-chip" / "cde" / "cde"
}
def mainClass = Some("freechips.rocketchip.diplomacy.Main")
def moduleDeps = Seq(macros, hardfloat, cde)
def ivyDeps: T[Agg[Dep]] =
super.ivyDeps() ++ Agg(ivy"com.lihaoyi::mainargs:0.7.0", ivy"org.json4s::json4s-jackson:4.0.7")
}
object utility extends ChiselModule {
def moduleDeps = Seq(`rocket-chip`)
def ivyDeps: T[Agg[Dep]] = super.ivyDeps() ++ Agg(ivy"com.lihaoyi::sourcecode:0.4.2")
object test extends SbtTests with TestModule.ScalaTest {
def ivyDeps: T[Agg[Dep]] = super.ivyDeps() ++ Agg(ivy"org.scalatest::scalatest:3.2.7")
}
}
object yunsuan extends ChiselModule {}
object huancun extends ChiselModule {
def moduleDeps = Seq(`rocket-chip`, utility)
}
object coupledL2 extends ChiselModule {
def moduleDeps = Seq(`rocket-chip`, utility, huancun)
}
object openNCB extends ChiselModule {
def millSourcePath = pwd / "openLLC" / "openNCB"
def moduleDeps = Seq(`rocket-chip`)
}
object openLLC extends ChiselModule {
def moduleDeps = Seq(`rocket-chip`, utility, coupledL2, openNCB)
}
object difftest extends ChiselModule {
object test extends SbtTests with TestModule.ScalaTest {
override def sources: T[Seq[PathRef]] = Task.Sources {
super.sources() ++ Seq(PathRef(this.millSourcePath / "src" / "generator" / "chisel"))
}
}
}
object fudian extends ChiselModule {}
object ChiselAIA extends ChiselModule {
def moduleDeps = Seq(`rocket-chip`, utility)
}
object macros extends ScalaModule {
def scalaVersion: T[String] = defaultScalaVersion
def ivyDeps: T[Agg[Dep]] = Agg(ivy"org.scala-lang:scala-reflect:$defaultScalaVersion")
}
object xiangshan extends ChiselModule {
def millSourcePath = pwd
def moduleDeps = Seq(
`rocket-chip`,
difftest,
huancun,
coupledL2,
openLLC,
yunsuan,
fudian,
utility,
ChiselAIA,
macros
)
val resourcesPath: String = pwd.toString() + "/src/main/resources"
val envPath: String = sys.env("PATH") + ":" + resourcesPath
def forkEnv = Map("PATH" -> envPath)
def forkArgs = Seq(
s"-Xmx${sys.props.getOrElse("jvm-xmx", "40G")}",
s"-Xss${sys.props.getOrElse("jvm-xss", "256m")}"
)
def ivyDeps: T[Agg[Dep]] = super.ivyDeps() ++ Agg(
ivy"io.circe::circe-yaml:1.15.0",
ivy"io.circe::circe-generic-extras:0.14.4"
)
def scalacOptions: T[Seq[String]] = super.scalacOptions() ++ Agg("-deprecation", "-feature")
private def publishVersion: T[String] = VcsVersion.vcsState().format(
revHashDigits = 8,
dirtyHashDigits = 0,
commitCountPad = -1,
countSep = "",
tagModifier = (tag: String) =>
"[Rr]elease.*".r.findFirstMatchIn(tag) match {
case Some(_) => "KunminghuV3-Release-" + LocalDateTime.now().format(
DateTimeFormatter.ofPattern("MMM-dd-yyyy").withLocale(new Locale("en"))
)
case None => "KunminghuV3-dev"
},
/* add "username, build-host, build-time" for non-release version */
untaggedSuffix = " (%s@%s) # %s".format(
System.getProperty("user.name"),
java.net.InetAddress.getLocalHost.getHostName,
LocalDateTime.now().format(DateTimeFormatter.ofPattern("MMM dd hh:mm:ss yyyy").withLocale(new Locale("en")))
)
)
// gitStatus changes frequently and unpredictably. Use `Task.Input` here.
private def gitStatus: T[String] = Task.Input {
val gitRevParseBuilder = new ProcessBuilder("git", "rev-parse", "HEAD")
val gitRevParseProcess = gitRevParseBuilder.start()
val shaReader = new BufferedReader(new InputStreamReader(gitRevParseProcess.getInputStream))
val sha = shaReader.readLine()
val gitStatusBuilder = new ProcessBuilder("git", "status", "-uno", "--porcelain")
val gitStatusProcess = gitStatusBuilder.start()
val gitStatusReader = new BufferedReader(new InputStreamReader(gitStatusProcess.getInputStream))
val status = gitStatusReader.readLine()
val gitDirty = if (status == null) 0 else 1
val str =
s"""|SHA=$sha
|dirty=$gitDirty
|""".stripMargin
str
}
private def packDifftestResources(destDir: os.Path): Unit = {
// package difftest source as resources, only git tracked files were collected
val difftest_srcs = os.proc("git", "ls-files").call(cwd = pwd / "difftest").out
.text().split("\n").filter(_.nonEmpty).toSeq
.map(os.RelPath(_))
difftest_srcs.foreach(f => os.copy(pwd / "difftest" / f, destDir / "difftest-src" / f, createFolders = true))
// package ready-to-run binary as resources
val ready_to_run = Seq("riscv64-nemu-interpreter-dual-so", "riscv64-nemu-interpreter-so", "riscv64-spike-so")
ready_to_run.foreach(f => os.copy(pwd / "ready-to-run" / f, destDir / "ready-to-run" / f, createFolders = true))
}
override def resources: T[Seq[PathRef]] = Task.Sources {
os.write(T.dest / "publishVersion", publishVersion())
os.write(T.dest / "gitStatus", gitStatus())
os.write(T.dest / "gitModules", os.proc("git", "submodule", "status").call().out.text())
packDifftestResources(T.dest)
super.resources() ++ Seq(PathRef(T.dest))
}
object test extends SbtTests with TestModule.ScalaTest {
def moduleDeps: Seq[JavaModule] = super.moduleDeps ++ Seq(xiangshan, difftest.test)
def forkArgs: T[Seq[String]] = super.forkArgs
def scalacOptions: T[Seq[String]] = super.scalacOptions() ++ Seq("-deprecation", "-feature")
val resourcesPath: String = pwd.toString() + "/src/main/resources"
val envPath: String = sys.env("PATH") + ":" + resourcesPath
def forkEnv = Map("PATH" -> envPath)
}
}