final class CustomBundle(elts: (String, Data)*) extends Record { val elements = ListMap(elts map { case (field, elt) => field -> elt.chiselCloneType }: _*) def apply(elt: String): Data = elements(elt) override def cloneType = (new CustomBundle(elements.toList: _*)).asInstanceOf[this.type] }
I could have found a solution using the above (not sure, is it possible to convert ListMap to varargs?), but I dug into Scala meta programming for the purpose of ramp. Behold! Here's an alternative (though incomplete) method of generating a bundle.
object MetaBundle { import reflect.runtime.currentMirror import tools.reflect.ToolBox val toolbox = currentMirror.mkToolBox() import toolbox.u._ def apply(): Bundle = { val tree = q""" import chisel3.core._ val b = new Bundle { // placeholder for your interface val i = Input(UInt(1.W)) val o = Output(UInt(1.W)) } b """
toolbox.eval(tree).asInstanceOf[Bundle] } }
The code above returns an instance of a typeless bundle. The result isn't equivalent to above, but serves my purpose. Have yet to try, but suspect the technique can be extended to other cases. There's likely implications wrt. statically typed nature of Scala. Use at your own risk. I am only posting this because it's a neat hack.
No comments:
Post a Comment