xref: /XiangShan/build.sc (revision ce34d21eb5ac76b5b49df0748e135581b8df51e5)
1/***************************************************************************************
2* Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC)
3* Copyright (c) 2020-2024 Institute of Computing Technology, Chinese Academy of Sciences
4* Copyright (c) 2020-2021 Peng Cheng Laboratory
5*
6* XiangShan is licensed under Mulan PSL v2.
7* You can use this software according to the terms and conditions of the Mulan PSL v2.
8* You may obtain a copy of Mulan PSL v2 at:
9*          http://license.coscl.org.cn/MulanPSL2
10*
11* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
12* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
13* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
14*
15* See the Mulan PSL v2 for more details.
16***************************************************************************************/
17
18import mill._
19import scalalib._
20import $file.`rocket-chip`.common
21import $file.`rocket-chip`.cde.common
22import $file.`rocket-chip`.hardfloat.build
23import $file.huancun.common
24import $file.coupledL2.common
25import $file.openLLC.common
26
27/* for publishVersion */
28import $ivy.`de.tototec::de.tobiasroeser.mill.vcs.version::0.4.0`
29import de.tobiasroeser.mill.vcs.version.VcsVersion
30import java.time.LocalDateTime
31import java.time.format.DateTimeFormatter
32import scala.util.matching.Regex
33
34val defaultScalaVersion = "2.13.14"
35
36def defaultVersions = Map(
37  "chisel"        -> ivy"org.chipsalliance::chisel:6.5.0",
38  "chisel-plugin" -> ivy"org.chipsalliance:::chisel-plugin:6.5.0",
39  "chiseltest"    -> ivy"edu.berkeley.cs::chiseltest:6.0.0"
40)
41
42trait HasChisel extends SbtModule {
43  def chiselModule: Option[ScalaModule] = None
44
45  def chiselPluginJar: T[Option[PathRef]] = None
46
47  def chiselIvy: Option[Dep] = Some(defaultVersions("chisel"))
48
49  def chiselPluginIvy: Option[Dep] = Some(defaultVersions("chisel-plugin"))
50
51  override def scalaVersion = defaultScalaVersion
52
53  override def scalacOptions = super.scalacOptions() ++
54    Agg("-language:reflectiveCalls", "-Ymacro-annotations", "-Ytasty-reader")
55
56  override def ivyDeps = super.ivyDeps() ++ Agg(chiselIvy.get)
57
58  override def scalacPluginIvyDeps = super.scalacPluginIvyDeps() ++ Agg(chiselPluginIvy.get)
59}
60
61object rocketchip
62  extends millbuild.`rocket-chip`.common.RocketChipModule
63    with HasChisel {
64  def scalaVersion: T[String] = T(defaultScalaVersion)
65
66  override def millSourcePath = os.pwd / "rocket-chip"
67
68  def macrosModule = macros
69
70  def hardfloatModule = hardfloat
71
72  def cdeModule = cde
73
74  def mainargsIvy = ivy"com.lihaoyi::mainargs:0.7.0"
75
76  def json4sJacksonIvy = ivy"org.json4s::json4s-jackson:4.0.7"
77
78  object macros extends Macros
79
80  trait Macros
81    extends millbuild.`rocket-chip`.common.MacrosModule
82      with SbtModule {
83
84    def scalaVersion: T[String] = T(defaultScalaVersion)
85
86    def scalaReflectIvy = ivy"org.scala-lang:scala-reflect:${defaultScalaVersion}"
87  }
88
89  object hardfloat
90    extends millbuild.`rocket-chip`.hardfloat.common.HardfloatModule with HasChisel {
91
92    def scalaVersion: T[String] = T(defaultScalaVersion)
93
94    override def millSourcePath = os.pwd / "rocket-chip" / "hardfloat" / "hardfloat"
95
96  }
97
98  object cde
99    extends millbuild.`rocket-chip`.cde.common.CDEModule with ScalaModule {
100
101    def scalaVersion: T[String] = T(defaultScalaVersion)
102
103    override def millSourcePath = os.pwd / "rocket-chip" / "cde" / "cde"
104  }
105}
106
107object utility extends HasChisel {
108
109  override def millSourcePath = os.pwd / "utility"
110
111  override def moduleDeps = super.moduleDeps ++ Seq(
112    rocketchip
113  )
114
115}
116
117object yunsuan extends HasChisel {
118
119  override def millSourcePath = os.pwd / "yunsuan"
120
121}
122
123object huancun extends millbuild.huancun.common.HuanCunModule with HasChisel {
124
125  override def millSourcePath = os.pwd / "huancun"
126
127  def rocketModule: ScalaModule = rocketchip
128
129  def utilityModule: ScalaModule = utility
130
131}
132
133object coupledL2 extends millbuild.coupledL2.common.CoupledL2Module with HasChisel {
134
135  override def millSourcePath = os.pwd / "coupledL2"
136
137  def rocketModule: ScalaModule = rocketchip
138
139  def utilityModule: ScalaModule = utility
140
141  def huancunModule: ScalaModule = huancun
142
143}
144
145object openLLC extends millbuild.openLLC.common.OpenLLCModule with HasChisel {
146
147  override def millSourcePath = os.pwd / "openLLC"
148
149  def coupledL2Module: ScalaModule = coupledL2
150
151  def rocketModule: ScalaModule = rocketchip
152
153  def utilityModule: ScalaModule = utility
154}
155
156object difftest extends HasChisel {
157
158  override def millSourcePath = os.pwd / "difftest"
159
160}
161
162object fudian extends HasChisel {
163
164  override def millSourcePath = os.pwd / "fudian"
165
166}
167
168object macros extends ScalaModule {
169
170  override def millSourcePath = os.pwd / "macros"
171
172  override def scalaVersion: T[String] = T(defaultScalaVersion)
173
174  override def ivyDeps = super.ivyDeps() ++ Agg(ivy"org.scala-lang:scala-reflect:${defaultScalaVersion}")
175
176  def scalaReflectIvy = ivy"org.scala-lang:scala-reflect:${defaultScalaVersion}"
177}
178
179// extends this trait to use XiangShan in other projects
180trait XiangShanModule extends ScalaModule {
181
182  def rocketModule: ScalaModule
183
184  def difftestModule: ScalaModule
185
186  def huancunModule: ScalaModule
187
188  def coupledL2Module: ScalaModule
189
190  def openLLCModule: ScalaModule
191
192  def fudianModule: ScalaModule
193
194  def utilityModule: ScalaModule
195
196  def yunsuanModule: ScalaModule
197
198  def macrosModule: ScalaModule
199
200  override def moduleDeps = super.moduleDeps ++ Seq(
201    rocketModule,
202    difftestModule,
203    huancunModule,
204    coupledL2Module,
205    openLLCModule,
206    yunsuanModule,
207    fudianModule,
208    utilityModule,
209    macrosModule,
210  )
211
212  val resourcesPATH = os.pwd.toString() + "/src/main/resources"
213  val envPATH = sys.env("PATH") + ":" + resourcesPATH
214
215  override def forkEnv = Map("PATH" -> envPATH)
216}
217
218object xiangshan extends XiangShanModule with HasChisel {
219
220  override def millSourcePath = os.pwd
221
222  def rocketModule = rocketchip
223
224  def difftestModule = difftest
225
226  def huancunModule = huancun
227
228  def coupledL2Module = coupledL2
229
230  def openLLCModule = openLLC
231
232  def fudianModule = fudian
233
234  def utilityModule = utility
235
236  def yunsuanModule = yunsuan
237
238  def macrosModule = macros
239
240  override def forkArgs = Seq("-Xmx40G", "-Xss256m")
241
242  override def ivyDeps = super.ivyDeps() ++ Agg(
243    defaultVersions("chiseltest"),
244  )
245
246  override def scalacOptions = super.scalacOptions() ++ Agg("-deprecation", "-feature")
247
248  def publishVersion: T[String] = VcsVersion.vcsState().format(
249    revHashDigits = 8,
250    dirtyHashDigits = 0,
251    commitCountPad = -1,
252    countSep = "",
253    tagModifier = (tag: String) => "[Rr]elease.*".r.findFirstMatchIn(tag) match {
254      case Some(_) => "Kunminghu-Release-" + LocalDateTime.now().format(
255                                 DateTimeFormatter.ofPattern("MMM-dd-yyyy"))
256      case None => "Kunminghu-dev"
257    },
258    /* add "username, buildhost, buildtime" for non-release version */
259    untaggedSuffix = " (%s@%s) # %s".format(
260      System.getProperty("user.name"),
261      java.net.InetAddress.getLocalHost().getHostName(),
262      LocalDateTime.now().format(DateTimeFormatter.ofPattern("MMM dd hh:mm:ss yyyy"))),
263  )
264
265  override def resources = T.sources {
266    os.write(T.dest / "publishVersion", publishVersion())
267    super.resources() ++ Seq(PathRef(T.dest))
268  }
269
270  object test extends SbtModuleTests with TestModule.ScalaTest {
271    override def forkArgs = Seq("-Xmx40G", "-Xss256m")
272
273    override def ivyDeps = super.ivyDeps() ++ Agg(
274      defaultVersions("chiseltest")
275    )
276
277    override def scalacOptions = super.scalacOptions() ++ Agg("-deprecation", "-feature")
278
279    val resourcesPATH = os.pwd.toString() + "/src/main/resources"
280    val envPATH = sys.env("PATH") + ":" + resourcesPATH
281
282    override def forkEnv = Map("PATH" -> envPATH)
283  }
284}
285