diplomacy: ValName captures val bindings for Nodes
This commit is contained in:
22
macros/src/main/scala/ValName.scala
Normal file
22
macros/src/main/scala/ValName.scala
Normal file
@ -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."))
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user