Files
gps/dependencies/chisel/common.sc
T
2026-07-12 11:01:51 +03:00

297 lines
7.3 KiB
Python

import mill._
import mill.scalalib._
trait HasMacroAnnotations
extends ScalaModule {
override def scalacOptions = T {
super.scalacOptions() ++ Agg("-Ymacro-annotations")
}
}
trait MacrosModule
extends ScalaModule
with HasMacroAnnotations {
def scalaReflectIvy: Dep
override def ivyDeps = super.ivyDeps() ++ Some(scalaReflectIvy)
}
trait FirrtlModule
extends ScalaModule
with HasMacroAnnotations {
def osLibModuleIvy: Dep
def json4sIvy: Dep
def dataclassIvy: Dep
def commonTextIvy: Dep
def scoptIvy: Dep
override def ivyDeps = super.ivyDeps() ++ Agg(
osLibModuleIvy,
json4sIvy,
dataclassIvy,
commonTextIvy,
scoptIvy
)
}
trait SvsimModule
extends ScalaModule {
}
trait SvsimUnitTestModule
extends TestModule
with ScalaModule
with TestModule.ScalaTest {
def svsimModule: SvsimModule
def scalatestIvy: Dep
def scalacheckIvy: Dep
override def moduleDeps = Seq(svsimModule)
override def defaultCommandName() = "test"
override def ivyDeps = super.ivyDeps() ++ Agg(
scalatestIvy,
scalacheckIvy
)
}
trait FirrtlUnitTestModule
extends TestModule
with ScalaModule
with TestModule.ScalaTest {
def firrtlModule: FirrtlModule
def scalatestIvy: Dep
def scalacheckIvy: Dep
override def moduleDeps = Seq(firrtlModule)
override def defaultCommandName() = "test"
override def ivyDeps = super.ivyDeps() ++ Agg(
scalatestIvy,
scalacheckIvy
)
}
trait CoreModule
extends ScalaModule
with HasMacroAnnotations {
def firrtlModule: FirrtlModule
def macrosModule: MacrosModule
def osLibModuleIvy: Dep
def upickleModuleIvy: Dep
override def moduleDeps = super.moduleDeps ++ Seq(macrosModule, firrtlModule)
override def ivyDeps = super.ivyDeps() ++ Agg(
osLibModuleIvy,
upickleModuleIvy
)
}
trait PluginModule
extends ScalaModule {
def scalaLibraryIvy: Dep
def scalaReflectIvy: Dep
def scalaCompilerIvy: Dep
override def ivyDeps = super.ivyDeps() ++ Agg(scalaLibraryIvy, scalaReflectIvy, scalaCompilerIvy)
}
trait HasChiselPlugin
extends ScalaModule {
def pluginModule: PluginModule
override def scalacOptions = T {
super.scalacOptions() ++ Agg(s"-Xplugin:${pluginModule.jar().path}")
}
override def scalacPluginClasspath = T {
super.scalacPluginClasspath() ++ Agg(
pluginModule.jar()
)
}
}
trait StdLibModule
extends ScalaModule
with HasChisel
trait ChiselModule
extends ScalaModule
with HasChiselPlugin
with HasMacroAnnotations {
def macrosModule: MacrosModule
def svsimModule: SvsimModule
def coreModule: CoreModule
override def scalacPluginClasspath = T(super.scalacPluginClasspath() ++ Agg(pluginModule.jar()))
override def moduleDeps = super.moduleDeps ++ Seq(macrosModule, coreModule, svsimModule)
}
trait HasChisel
extends ScalaModule
with HasChiselPlugin {
def chiselModule: ChiselModule
override def moduleDeps = super.moduleDeps ++ Some(chiselModule)
}
trait ChiselUnitTestModule
extends TestModule
with ScalaModule
with HasChisel
with HasMacroAnnotations
with TestModule.ScalaTest {
def scalatestIvy: Dep
def scalacheckIvy: Dep
override def defaultCommandName() = "test"
override def ivyDeps = super.ivyDeps() ++ Agg(
scalatestIvy,
scalacheckIvy
)
}
trait HasJextractGeneratedSources
extends JavaModule {
def includePaths: T[Seq[PathRef]]
def libraryPaths: T[Seq[PathRef]]
def header: T[PathRef]
def includeFunctions: T[Seq[String]]
def includeConstants: T[Seq[String]]
def includeStructs: T[Seq[String]]
def includeTypedefs: T[Seq[String]]
def includeUnions: T[Seq[String]]
def includeVars: T[Seq[String]]
def linkLibraries: T[Seq[String]]
def target: T[String]
def headerClassName: T[String]
def dumpAllIncludes = T {
val f = os.temp()
os.proc(
Seq("jextract", header().path.toString)
++ includePaths().flatMap(p => Seq("-I", p.path.toString))
++ Seq("--dump-includes", f.toString)
).call()
os.read.lines(f).filter(s => s.nonEmpty && !s.startsWith("#"))
}
override def generatedSources: T[Seq[PathRef]] = T {
super.generatedSources() ++ {
// @formatter:off
os.proc(
Seq("jextract", header().path.toString)
++ includePaths().flatMap(p => Seq("-I", p.path.toString))
++ Seq(
"-t", target(),
"--header-class-name", headerClassName(),
"--source",
"--output", T.dest.toString
) ++ includeFunctions().flatMap(f => Seq("--include-function", f)) ++
includeConstants().flatMap(f => Seq("--include-constant", f)) ++
includeStructs().flatMap(f => Seq("--include-struct", f)) ++
includeTypedefs().flatMap(f => Seq("--include-typedef", f)) ++
includeUnions().flatMap(f => Seq("--include-union", f)) ++
includeVars().flatMap(f => Seq("--include-var", f)) ++
linkLibraries().flatMap(l => Seq("-l", l))
).call(T.dest)
// @formatter:on
Lib
.findSourceFiles(os.walk(T.dest).map(PathRef(_)), Seq("java"))
.distinct
.map(PathRef(_))
}
}
override def javacOptions = T(super.javacOptions() ++ Seq("--enable-preview", "--release", "21"))
}
trait CIRCTPanamaBinderModule
extends ScalaModule
with HasJextractGeneratedSources
with HasChisel {
def includeConstants = T.input(os.read.lines(millSourcePath / "includeConstants.txt").filter(s => s.nonEmpty && !s.startsWith("#")))
def includeFunctions = T.input(os.read.lines(millSourcePath / "includeFunctions.txt").filter(s => s.nonEmpty && !s.startsWith("#")))
def includeStructs = T.input(os.read.lines(millSourcePath / "includeStructs.txt").filter(s => s.nonEmpty && !s.startsWith("#")))
def includeTypedefs = T.input(os.read.lines(millSourcePath / "includeTypedefs.txt").filter(s => s.nonEmpty && !s.startsWith("#")))
def includeUnions = T.input(os.read.lines(millSourcePath / "includeUnions.txt").filter(s => s.nonEmpty && !s.startsWith("#")))
def includeVars = T.input(os.read.lines(millSourcePath / "includeVars.txt").filter(s => s.nonEmpty && !s.startsWith("#")))
def linkLibraries = T.input(os.read.lines(millSourcePath / "linkLibraries.txt").filter(s => s.nonEmpty && !s.startsWith("#")))
def target: T[String] = T("org.llvm.circt")
def headerClassName: T[String] = T("CAPI")
}
trait HasCIRCTPanamaBinderModule
extends ScalaModule
with HasChisel {
def circtPanamaBinderModule: CIRCTPanamaBinderModule
override def chiselModule = circtPanamaBinderModule.chiselModule
override def pluginModule = circtPanamaBinderModule.pluginModule
override def moduleDeps = super.moduleDeps ++ Some(circtPanamaBinderModule)
override def javacOptions = T(super.javacOptions() ++ Seq("--enable-preview", "--release", "20"))
override def forkArgs: T[Seq[String]] = T(
super.forkArgs() ++ Seq("--enable-native-access=ALL-UNNAMED", "--enable-preview")
++ circtPanamaBinderModule
.libraryPaths()
.map(p => s"-Djava.library.path=${p.path}")
)
}
trait CIRCTPanamaBinderModuleTestModule
extends TestModule
with ScalaModule
with HasCIRCTPanamaBinderModule
with HasMacroAnnotations
with TestModule.ScalaTest {
def scalatestIvy: Dep
def scalacheckIvy: Dep
override def defaultCommandName() = "test"
override def ivyDeps = super.ivyDeps() ++ Agg(
scalatestIvy,
scalacheckIvy
)
}