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