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