297 lines
7.3 KiB
Python
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
|
|
)
|
|
}
|