diff --git a/macros/src/main/scala/ValName.scala b/macros/src/main/scala/ValName.scala new file mode 100644 index 00000000..a76e13a8 --- /dev/null +++ b/macros/src/main/scala/ValName.scala @@ -0,0 +1,22 @@ +// See LICENSE.SiFive for license details. + +package freechips.rocketchip.macros + +import scala.language.experimental.macros +import scala.reflect.macros.blackbox.Context + +case class ValNameImpl(name: String) + +object ValNameImpl +{ + implicit def materialize: ValNameImpl = macro detail + def detail(c: Context): c.Expr[ValNameImpl] = { + import c.universe._ + def allOwners(s: c.Symbol): Seq[c.Symbol] = + if (s == `NoSymbol`) Nil else s +: allOwners(s.owner) + val terms = allOwners(c.internal.enclosingOwner).filter(_.isTerm).map(_.asTerm) + terms.filter(_.isVal).map(_.name.toString).find(_(0) != '$').map { s => + c.Expr[ValNameImpl] { q"_root_.freechips.rocketchip.macros.ValNameImpl(${s})" } + }.getOrElse(c.abort(c.enclosingPosition, "Not a valid application.")) + } +} diff --git a/project/build.scala b/project/build.scala index 529f035f..e7fa0a79 100644 --- a/project/build.scala +++ b/project/build.scala @@ -21,7 +21,8 @@ object BuildSettings extends Build { lazy val chisel = project in file("chisel3") lazy val hardfloat = project.dependsOn(chisel) - lazy val rocketchip = (project in file(".")).settings(chipSettings).dependsOn(chisel, hardfloat) + lazy val macros = project in file("macros") + lazy val rocketchip = (project in file(".")).settings(chipSettings).dependsOn(chisel, hardfloat, macros) lazy val addons = settingKey[Seq[String]]("list of addons used for this build") lazy val make = inputKey[Unit]("trigger backend-specific makefile command") diff --git a/src/main/scala/diplomacy/ValName.scala b/src/main/scala/diplomacy/ValName.scala new file mode 100644 index 00000000..0cc57d1c --- /dev/null +++ b/src/main/scala/diplomacy/ValName.scala @@ -0,0 +1,13 @@ +// See LICENSE.SiFive for license details. + +package freechips.rocketchip.diplomacy + +import scala.language.experimental.macros +import freechips.rocketchip.macros.ValNameImpl + +case class ValName(name: String) + +object ValName +{ + implicit def materialize(implicit x: ValNameImpl): ValName = ValName(x.name) +}