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