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