xref: /XiangShan/build.sc (revision 8855a44dec9797e391f85126d9e2ffe43c0e2e5c)
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
27val defaultScalaVersion = "2.13.14"
28
29def defaultVersions = 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
35trait HasChisel extends SbtModule {
36  def chiselModule: Option[ScalaModule] = None
37
38  def chiselPluginJar: T[Option[PathRef]] = None
39
40  def chiselIvy: Option[Dep] = Some(defaultVersions("chisel"))
41
42  def chiselPluginIvy: Option[Dep] = Some(defaultVersions("chisel-plugin"))
43
44  override def scalaVersion = defaultScalaVersion
45
46  override def scalacOptions = super.scalacOptions() ++
47    Agg("-language:reflectiveCalls", "-Ymacro-annotations", "-Ytasty-reader")
48
49  override def ivyDeps = super.ivyDeps() ++ Agg(chiselIvy.get)
50
51  override def scalacPluginIvyDeps = super.scalacPluginIvyDeps() ++ Agg(chiselPluginIvy.get)
52}
53
54object rocketchip
55  extends millbuild.`rocket-chip`.common.RocketChipModule
56    with HasChisel {
57  def scalaVersion: T[String] = T(defaultScalaVersion)
58
59  override def millSourcePath = os.pwd / "rocket-chip"
60
61  def macrosModule = macros
62
63  def hardfloatModule = hardfloat
64
65  def cdeModule = cde
66
67  def mainargsIvy = ivy"com.lihaoyi::mainargs:0.7.0"
68
69  def json4sJacksonIvy = ivy"org.json4s::json4s-jackson:4.0.7"
70
71  object macros extends Macros
72
73  trait Macros
74    extends millbuild.`rocket-chip`.common.MacrosModule
75      with SbtModule {
76
77    def scalaVersion: T[String] = T(defaultScalaVersion)
78
79    def scalaReflectIvy = ivy"org.scala-lang:scala-reflect:${defaultScalaVersion}"
80  }
81
82  object hardfloat
83    extends millbuild.`rocket-chip`.hardfloat.common.HardfloatModule with HasChisel {
84
85    def scalaVersion: T[String] = T(defaultScalaVersion)
86
87    override def millSourcePath = os.pwd / "rocket-chip" / "hardfloat" / "hardfloat"
88
89  }
90
91  object cde
92    extends millbuild.`rocket-chip`.cde.common.CDEModule with ScalaModule {
93
94    def scalaVersion: T[String] = T(defaultScalaVersion)
95
96    override def millSourcePath = os.pwd / "rocket-chip" / "cde" / "cde"
97  }
98}
99
100object utility extends HasChisel {
101
102  override def millSourcePath = os.pwd / "utility"
103
104  override def moduleDeps = super.moduleDeps ++ Seq(
105    rocketchip
106  )
107
108}
109
110object yunsuan extends HasChisel {
111
112  override def millSourcePath = os.pwd / "yunsuan"
113
114}
115
116object huancun extends millbuild.huancun.common.HuanCunModule with HasChisel {
117
118  override def millSourcePath = os.pwd / "huancun"
119
120  def rocketModule: ScalaModule = rocketchip
121
122  def utilityModule: ScalaModule = utility
123
124}
125
126object coupledL2 extends millbuild.coupledL2.common.CoupledL2Module with HasChisel {
127
128  override def millSourcePath = os.pwd / "coupledL2"
129
130  def rocketModule: ScalaModule = rocketchip
131
132  def utilityModule: ScalaModule = utility
133
134  def huancunModule: ScalaModule = huancun
135
136}
137
138object openLLC extends millbuild.openLLC.common.OpenLLCModule with HasChisel {
139
140  override def millSourcePath = os.pwd / "openLLC"
141
142  def coupledL2Module: ScalaModule = coupledL2
143
144  def rocketModule: ScalaModule = rocketchip
145
146  def utilityModule: ScalaModule = utility
147}
148
149object difftest extends HasChisel {
150
151  override def millSourcePath = os.pwd / "difftest"
152
153}
154
155object fudian extends HasChisel {
156
157  override def millSourcePath = os.pwd / "fudian"
158
159}
160
161object macros extends ScalaModule {
162
163  override def millSourcePath = os.pwd / "macros"
164
165  override def scalaVersion: T[String] = T(defaultScalaVersion)
166
167  override def ivyDeps = super.ivyDeps() ++ Agg(ivy"org.scala-lang:scala-reflect:${defaultScalaVersion}")
168
169  def scalaReflectIvy = ivy"org.scala-lang:scala-reflect:${defaultScalaVersion}"
170}
171
172// extends this trait to use XiangShan in other projects
173trait XiangShanModule extends ScalaModule {
174
175  def rocketModule: ScalaModule
176
177  def difftestModule: ScalaModule
178
179  def huancunModule: ScalaModule
180
181  def coupledL2Module: ScalaModule
182
183  def openLLCModule: ScalaModule
184
185  def fudianModule: ScalaModule
186
187  def utilityModule: ScalaModule
188
189  def yunsuanModule: ScalaModule
190
191  def macrosModule: ScalaModule
192
193  override def moduleDeps = super.moduleDeps ++ Seq(
194    rocketModule,
195    difftestModule,
196    huancunModule,
197    coupledL2Module,
198    openLLCModule,
199    yunsuanModule,
200    fudianModule,
201    utilityModule,
202    macrosModule,
203  )
204
205  val resourcesPATH = os.pwd.toString() + "/src/main/resources"
206  val envPATH = sys.env("PATH") + ":" + resourcesPATH
207
208  override def forkEnv = Map("PATH" -> envPATH)
209}
210
211object xiangshan extends XiangShanModule with HasChisel {
212
213  override def millSourcePath = os.pwd
214
215  def rocketModule = rocketchip
216
217  def difftestModule = difftest
218
219  def huancunModule = huancun
220
221  def coupledL2Module = coupledL2
222
223  def openLLCModule = openLLC
224
225  def fudianModule = fudian
226
227  def utilityModule = utility
228
229  def yunsuanModule = yunsuan
230
231  def macrosModule = macros
232
233  override def forkArgs = Seq("-Xmx40G", "-Xss256m")
234
235  override def ivyDeps = super.ivyDeps() ++ Agg(
236    defaultVersions("chiseltest"),
237  )
238
239  override def scalacOptions = super.scalacOptions() ++ Agg("-deprecation", "-feature")
240
241  object test extends SbtModuleTests with TestModule.ScalaTest {
242    override def forkArgs = Seq("-Xmx40G", "-Xss256m")
243
244    override def ivyDeps = super.ivyDeps() ++ Agg(
245      defaultVersions("chiseltest")
246    )
247
248    override def scalacOptions = super.scalacOptions() ++ Agg("-deprecation", "-feature")
249
250    val resourcesPATH = os.pwd.toString() + "/src/main/resources"
251    val envPATH = sys.env("PATH") + ":" + resourcesPATH
252
253    override def forkEnv = Map("PATH" -> envPATH)
254  }
255}
256