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