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 24 25val defaultScalaVersion = "2.13.10" 26 27def defaultVersions(chiselVersion: String) = chiselVersion match { 28 case "chisel" => Map( 29 "chisel" -> ivy"org.chipsalliance::chisel:6.3.0", 30 "chisel-plugin" -> ivy"org.chipsalliance:::chisel-plugin:6.3.0", 31 "chiseltest" -> ivy"edu.berkeley.cs::chiseltest:5.0.2" 32 ) 33 case "chisel3" => Map( 34 "chisel" -> ivy"edu.berkeley.cs::chisel3:3.6.0", 35 "chisel-plugin" -> ivy"edu.berkeley.cs:::chisel3-plugin:3.6.0", 36 "chiseltest" -> ivy"edu.berkeley.cs::chiseltest:0.6.2" 37 ) 38} 39 40trait HasChisel extends SbtModule with Cross.Module[String] { 41 def chiselModule: Option[ScalaModule] = None 42 43 def chiselPluginJar: T[Option[PathRef]] = None 44 45 def chiselIvy: Option[Dep] = Some(defaultVersions(crossValue)("chisel")) 46 47 def chiselPluginIvy: Option[Dep] = Some(defaultVersions(crossValue)("chisel-plugin")) 48 49 override def scalaVersion = defaultScalaVersion 50 51 override def scalacOptions = super.scalacOptions() ++ 52 Agg("-language:reflectiveCalls", "-Ymacro-annotations", "-Ytasty-reader") 53 54 override def ivyDeps = super.ivyDeps() ++ Agg(chiselIvy.get) 55 56 override def scalacPluginIvyDeps = super.scalacPluginIvyDeps() ++ Agg(chiselPluginIvy.get) 57} 58 59object rocketchip extends Cross[RocketChip]("chisel", "chisel3") 60 61trait 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(crossValue) 71 72 def cdeModule = cde 73 74 def mainargsIvy = ivy"com.lihaoyi::mainargs:0.5.4" 75 76 def json4sJacksonIvy = ivy"org.json4s::json4s-jackson:4.0.6" 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 extends Cross[Hardfloat](crossValue) 90 91 trait Hardfloat 92 extends millbuild.`rocket-chip`.hardfloat.common.HardfloatModule with HasChisel { 93 94 def scalaVersion: T[String] = T(defaultScalaVersion) 95 96 override def millSourcePath = os.pwd / "rocket-chip" / "hardfloat" / "hardfloat" 97 98 } 99 100 object cde extends CDE 101 102 trait CDE extends millbuild.`rocket-chip`.cde.common.CDEModule with ScalaModule { 103 104 def scalaVersion: T[String] = T(defaultScalaVersion) 105 106 override def millSourcePath = os.pwd / "rocket-chip" / "cde" / "cde" 107 } 108} 109 110object utility extends Cross[Utility]("chisel", "chisel3") 111trait Utility extends HasChisel { 112 113 override def millSourcePath = os.pwd / "utility" 114 115 override def moduleDeps = super.moduleDeps ++ Seq( 116 rocketchip(crossValue) 117 ) 118 119} 120 121object yunsuan extends Cross[YunSuan]("chisel", "chisel3") 122trait YunSuan extends HasChisel { 123 124 override def millSourcePath = os.pwd / "yunsuan" 125 126} 127 128object huancun extends Cross[HuanCun]("chisel", "chisel3") 129trait HuanCun extends millbuild.huancun.common.HuanCunModule with HasChisel { 130 131 override def millSourcePath = os.pwd / "huancun" 132 133 def rocketModule: ScalaModule = rocketchip(crossValue) 134 135 def utilityModule: ScalaModule = utility(crossValue) 136 137} 138 139object coupledL2 extends Cross[CoupledL2]("chisel", "chisel3") 140trait CoupledL2 extends millbuild.coupledL2.common.CoupledL2Module with HasChisel { 141 142 override def millSourcePath = os.pwd / "coupledL2" 143 144 def rocketModule: ScalaModule = rocketchip(crossValue) 145 146 def utilityModule: ScalaModule = utility(crossValue) 147 148 def huancunModule: ScalaModule = huancun(crossValue) 149 150} 151 152object difftest extends Cross[Difftest]("chisel", "chisel3") 153trait Difftest extends HasChisel { 154 155 override def millSourcePath = os.pwd / "difftest" 156 157} 158 159object fudian extends Cross[FuDian]("chisel", "chisel3") 160trait FuDian extends HasChisel { 161 162 override def millSourcePath = os.pwd / "fudian" 163 164} 165 166// extends this trait to use XiangShan in other projects 167trait XiangShanModule extends ScalaModule { 168 169 def rocketModule: ScalaModule 170 171 def difftestModule: ScalaModule 172 173 def huancunModule: ScalaModule 174 175 def coupledL2Module: ScalaModule 176 177 def fudianModule: ScalaModule 178 179 def utilityModule: ScalaModule 180 181 def yunsuanModule: ScalaModule 182 183 override def moduleDeps = super.moduleDeps ++ Seq( 184 rocketModule, 185 difftestModule, 186 huancunModule, 187 coupledL2Module, 188 yunsuanModule, 189 fudianModule, 190 utilityModule, 191 ) 192 193 val resourcesPATH = os.pwd.toString() + "/src/main/resources" 194 val envPATH = sys.env("PATH") + ":" + resourcesPATH 195 196 override def forkEnv = Map("PATH" -> envPATH) 197} 198 199object xiangshan extends Cross[XiangShan]("chisel", "chisel3") 200trait XiangShan extends XiangShanModule with HasChisel { 201 202 override def millSourcePath = os.pwd 203 204 def rocketModule = rocketchip(crossValue) 205 206 def difftestModule = difftest(crossValue) 207 208 def huancunModule = huancun(crossValue) 209 210 def coupledL2Module = coupledL2(crossValue) 211 212 def fudianModule = fudian(crossValue) 213 214 def utilityModule = utility(crossValue) 215 216 def yunsuanModule = yunsuan(crossValue) 217 218 override def forkArgs = Seq("-Xmx40G", "-Xss256m") 219 220 override def sources = T.sources { 221 super.sources() ++ Seq(PathRef(millSourcePath / "src" / crossValue / "main" / "scala")) 222 } 223 224 override def ivyDeps = super.ivyDeps() ++ Agg( 225 defaultVersions(crossValue)("chiseltest"), 226 ) 227 228 object test extends SbtModuleTests with TestModule.ScalaTest { 229 override def forkArgs = Seq("-Xmx40G", "-Xss256m") 230 231 override def sources = T.sources { 232 super.sources() ++ Seq(PathRef(millSourcePath / "src" / crossValue / "test" / "scala")) 233 } 234 235 override def ivyDeps = super.ivyDeps() ++ Agg( 236 defaultVersions(crossValue)("chiseltest") 237 ) 238 239 val resourcesPATH = os.pwd.toString() + "/src/main/resources" 240 val envPATH = sys.env("PATH") + ":" + resourcesPATH 241 242 override def forkEnv = Map("PATH" -> envPATH) 243 } 244} 245