import Tests._ // This gives us a nicer handle to the root project instead of using the // implicit one lazy val chipyardRoot = Project("chipyardRoot", file(".")) lazy val commonSettings = Seq( organization := "edu.berkeley.cs", version := "1.3", scalaVersion := "2.12.10", traceLevel := 15, test in assembly := {}, assemblyMergeStrategy in assembly := { _ match { case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard case _ => MergeStrategy.first}}, scalacOptions ++= Seq("-deprecation","-unchecked","-Xsource:2.11"), libraryDependencies ++= Seq( "org.scalatest" %% "scalatest" % "3.2.2" % "test", "org.scalatestplus" %% "scalacheck-1-14" % "3.1.1.1" % "test", "org.json4s" %% "json4s-jackson" % "3.6.10", "org.scala-lang" % "scala-reflect" % scalaVersion.value, "com.github.scopt" %% "scopt" % "3.7.1", "org.scala-lang.modules" % "scala-jline" % "2.12.1", "com.typesafe.play" %% "play-json" % "2.6.10", "org.typelevel" %% "spire" % "0.16.2", "org.scalanlp" %% "breeze" % "1.0", "org.json4s" %% "json4s-native" % "3.6.10", "junit" % "junit" % "4.13", "org.apache.commons" % "commons-text" % "1.8", "net.jcazevedo" %% "moultingyaml" % "0.4.2", "org.antlr" % "antlr4-runtime" % "4.7.1" ), addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full), unmanagedBase := (chipyardRoot / unmanagedBase).value, allDependencies := allDependencies.value.filterNot(_.organization == "edu.berkeley.cs"), exportJars := true, resolvers ++= Seq( Resolver.sonatypeRepo("snapshots"), Resolver.sonatypeRepo("releases"), Resolver.mavenLocal)) val rocketChipDir = file("generators/rocket-chip") lazy val firesimAsLibrary = sys.env.get("FIRESIM_STANDALONE") == None lazy val firesimDir = if (firesimAsLibrary) { file("sims/firesim/sim/") } else { file("../../sim") } /** * It has been a struggle for us to override settings in subprojects. * An example would be adding a dependency to rocketchip on midas's targetutils library, * or replacing dsptools's maven dependency on chisel with the local chisel project. * * This function works around this by specifying the project's root at src/ and overriding * scalaSource and resourceDirectory. */ def freshProject(name: String, dir: File): Project = { Project(id = name, base = dir / "src") .settings( scalaSource in Compile := baseDirectory.value / "main" / "scala", resourceDirectory in Compile := baseDirectory.value / "main" / "resources" ) } // Fork each scala test for now, to work around persistent mutable state // in Rocket-Chip based generators def isolateAllTests(tests: Seq[TestDefinition]) = tests map { test => val options = ForkOptions() new Group(test.name, Seq(test), SubProcess(options)) } toSeq // Subproject definitions begin val chiselVersion = "3.4.0" lazy val chisel = (project in file("tools/chisel3")) lazy val chiselLib = "edu.berkeley.cs" %% "chisel3" % chiselVersion // While not built from source, *must* be in sync with the chisel3 git submodule // Building from source requires extending sbt-sriracha or a similar plugin and // keeping scalaVersion in sync with chisel3 to the minor version lazy val chiselPluginLib = "edu.berkeley.cs" % "chisel3-plugin" % chiselVersion cross CrossVersion.full lazy val firrtlRef = ProjectRef(file("tools/firrtl"), "firrtl") lazy val firrtlLib = "edu.berkeley.cs" %% "firrtl" % "1.4-SNAPSHOT" lazy val firrtl_interpreter = (project in file("tools/firrtl-interpreter")) .sourceDependency(firrtlRef, firrtlLib) .settings(commonSettings) lazy val treadle = (project in file("tools/treadle")) .sourceDependency(firrtlRef, firrtlLib) .settings(commonSettings) lazy val chisel_testers = (project in file("tools/chisel-testers")) .sourceDependency(chisel, chiselLib) .settings(addCompilerPlugin(chiselPluginLib)) .dependsOn(firrtl_interpreter, treadle) .settings( commonSettings, libraryDependencies ++= Seq( "junit" % "junit" % "4.13", "org.scalatest" %% "scalatest" % "3.2.2", "org.scalatestplus" %% "scalacheck-1-14" % "3.1.1.1", "org.scalacheck" %% "scalacheck" % "1.14.3", "com.github.scopt" %% "scopt" % "3.7.1" )) // Contains annotations & firrtl passes you may wish to use in rocket-chip without // introducing a circular dependency between RC and MIDAS lazy val midasTargetUtils = ProjectRef(firesimDir, "targetutils") // Rocket-chip dependencies (subsumes making RC a RootProject) lazy val hardfloat = (project in rocketChipDir / "hardfloat") .dependsOn(midasTargetUtils) .settings(commonSettings) lazy val rocketMacros = (project in rocketChipDir / "macros") .settings(commonSettings) lazy val rocketConfig = (project in rocketChipDir / "api-config-chipsalliance/build-rules/sbt") .settings(commonSettings) lazy val rocketchip = freshProject("rocketchip", rocketChipDir) .sourceDependency(chisel, chiselLib) .settings(addCompilerPlugin(chiselPluginLib)) .dependsOn(hardfloat, rocketMacros, rocketConfig) .settings(commonSettings) .settings( // Settings for scalafix semanticdbEnabled := true, semanticdbVersion := scalafixSemanticdb.revision, scalacOptions += "-Ywarn-unused-import" ) lazy val testchipip = (project in file("generators/testchipip")) .dependsOn(rocketchip, sifive_blocks) .settings(commonSettings) lazy val testchipipLib = "edu.berkeley.cs" %% "testchipip" % "1.0-020719-SNAPSHOT" lazy val iocell = (project in file("./tools/barstools/iocell/")) .sourceDependency(chisel, chiselLib) .settings(addCompilerPlugin(chiselPluginLib)) .settings(commonSettings) lazy val chipyard = (project in file("generators/chipyard")) .sourceDependency(testchipip, testchipipLib) .dependsOn(boom, hwacha, sifive_blocks, sifive_cache, utilities, iocell, sha3, // On separate line to allow for cleaner tutorial-setup patches dsptools, `rocket-dsptools`, gemmini, icenet, tracegen, cva6, nvdla, sodor) .settings(commonSettings) lazy val tracegen = (project in file("generators/tracegen")) .sourceDependency(testchipip, testchipipLib) .dependsOn(rocketchip, sifive_cache, boom, utilities) .settings(commonSettings) lazy val utilities = (project in file("generators/utilities")) .sourceDependency(testchipip, testchipipLib) .settings(commonSettings) lazy val icenet = (project in file("generators/icenet")) .dependsOn(rocketchip, testchipip) .settings(commonSettings) lazy val hwacha = (project in file("generators/hwacha")) .dependsOn(rocketchip) .settings(commonSettings) lazy val boom = (project in file("generators/boom")) .sourceDependency(testchipip, testchipipLib) .dependsOn(rocketchip) .settings(commonSettings) lazy val cva6 = (project in file("generators/cva6")) .dependsOn(rocketchip) .settings(commonSettings) lazy val sodor = (project in file("generators/riscv-sodor")) .dependsOn(rocketchip) .settings(commonSettings) lazy val sha3 = (project in file("generators/sha3")) .dependsOn(rocketchip, chisel_testers, midasTargetUtils) .settings(commonSettings) lazy val gemmini = (project in file("generators/gemmini")) .dependsOn(rocketchip, chisel_testers, testchipip) .settings(commonSettings) lazy val nvdla = (project in file("generators/nvdla")) .dependsOn(rocketchip) .settings(commonSettings) lazy val tapeout = (project in file("./tools/barstools/tapeout/")) .dependsOn(chisel_testers, chipyard) // must depend on chipyard to get scala resources .settings(commonSettings) .settings(libraryDependencies ++= Seq("io.github.daviddenton" %% "handlebars-scala-fork" % "2.3.0")) lazy val mdf = (project in file("./tools/barstools/mdf/scalalib/")) .settings(commonSettings) lazy val barstoolsMacros = (project in file("./tools/barstools/macros/")) .dependsOn(firrtl_interpreter, mdf, rocketchip) .enablePlugins(sbtassembly.AssemblyPlugin) .settings(commonSettings) lazy val dsptools = freshProject("dsptools", file("./tools/dsptools")) .dependsOn(chisel_testers) .settings( commonSettings, libraryDependencies ++= Seq( "junit" % "junit" % "4.13" % "test", "org.scalatest" %% "scalatest" % "3.2.2", "org.scalacheck" %% "scalacheck" % "1.14.3" % "test" )) lazy val `rocket-dsptools` = freshProject("rocket-dsptools", file("./tools/dsptools/rocket")) .dependsOn(rocketchip, dsptools) .settings(commonSettings) lazy val sifive_blocks = (project in file("generators/sifive-blocks")) .dependsOn(rocketchip) .settings(commonSettings) lazy val sifive_cache = (project in file("generators/sifive-cache")).settings( commonSettings, scalaSource in Compile := baseDirectory.value / "design/craft" ).dependsOn(rocketchip) // Library components of FireSim lazy val midas = ProjectRef(firesimDir, "midas") lazy val firesimLib = ProjectRef(firesimDir, "firesimLib") lazy val firechip = (project in file("generators/firechip")) .sourceDependency(testchipip, testchipipLib) .dependsOn(chipyard, midasTargetUtils, midas, firesimLib % "test->test;compile->compile") .settings( commonSettings, testGrouping in Test := isolateAllTests( (definedTests in Test).value ), testOptions in Test += Tests.Argument("-oF") )