xref: /XiangShan/build.sc (revision ae0295f43242554dacb7990eb9b71895cb781c84)
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)
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
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  override def moduleDeps = super.moduleDeps ++ Seq(
199    rocketModule,
200    difftestModule,
201    huancunModule,
202    coupledL2Module,
203    openLLCModule,
204    yunsuanModule,
205    fudianModule,
206    utilityModule,
207  )
208
209  val resourcesPATH = os.pwd.toString() + "/src/main/resources"
210  val envPATH = sys.env("PATH") + ":" + resourcesPATH
211
212  override def forkEnv = Map("PATH" -> envPATH)
213}
214
215object xiangshan extends Cross[XiangShan]("chisel", "chisel3")
216trait XiangShan extends XiangShanModule with HasChisel {
217
218  override def millSourcePath = os.pwd
219
220  def rocketModule = rocketchip(crossValue)
221
222  def difftestModule = difftest(crossValue)
223
224  def huancunModule = huancun(crossValue)
225
226  def coupledL2Module = coupledL2(crossValue)
227
228  def openLLCModule = openLLC(crossValue)
229
230  def fudianModule = fudian(crossValue)
231
232  def utilityModule = utility(crossValue)
233
234  def yunsuanModule = yunsuan(crossValue)
235
236  override def forkArgs = Seq("-Xmx40G", "-Xss256m")
237
238  override def sources = T.sources {
239    super.sources() ++ Seq(PathRef(millSourcePath / "src" / crossValue / "main" / "scala"))
240  }
241
242  override def ivyDeps = super.ivyDeps() ++ Agg(
243    defaultVersions(crossValue)("chiseltest"),
244  )
245
246  object test extends SbtModuleTests with TestModule.ScalaTest {
247    override def forkArgs = Seq("-Xmx40G", "-Xss256m")
248
249    override def sources = T.sources {
250      super.sources() ++ Seq(PathRef(this.millSourcePath / "src" / crossValue / "test" / "scala"))
251    }
252
253    override def ivyDeps = super.ivyDeps() ++ Agg(
254      defaultVersions(crossValue)("chiseltest")
255    )
256
257    val resourcesPATH = os.pwd.toString() + "/src/main/resources"
258    val envPATH = sys.env("PATH") + ":" + resourcesPATH
259
260    override def forkEnv = Map("PATH" -> envPATH)
261  }
262}
263