1039cdc35SXuan Hupackage xiangshan.macros 2039cdc35SXuan Hu 3039cdc35SXuan Huimport scala.annotation.compileTimeOnly 4039cdc35SXuan Huimport scala.language.experimental.macros 5039cdc35SXuan Huimport scala.reflect.macros.blackbox.Context 6039cdc35SXuan Hu 7039cdc35SXuan Huobject CSRMacros { 8039cdc35SXuan Hu object CSRFieldsImpl { 9039cdc35SXuan Hu private def calcuWidth(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int]): Int = { 10039cdc35SXuan Hu import c.universe._ 11039cdc35SXuan Hu 12039cdc35SXuan Hu val i_msb = c.eval(msb) 13039cdc35SXuan Hu val i_lsb = c.eval(lsb) 14039cdc35SXuan Hu 15039cdc35SXuan Hu i_msb - i_lsb + 1 16039cdc35SXuan Hu } 17039cdc35SXuan Hu 18039cdc35SXuan Hu @compileTimeOnly("") 19039cdc35SXuan Hu def CSRROFieldRange(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int], rfn: c.Tree): c.Tree = { 20039cdc35SXuan Hu c.parse(s"CSRDefines.CSRField${calcuWidth(c)(msb, lsb)}Bits.RO(${c.eval(msb)}, ${c.eval(lsb)}, $rfn)") 21039cdc35SXuan Hu } 22039cdc35SXuan Hu 23039cdc35SXuan Hu @compileTimeOnly("") 24039cdc35SXuan Hu def CSRROFieldBit(c: Context)(bit: c.Expr[Int], rfn: c.Tree): c.Tree = { 25039cdc35SXuan Hu CSRROFieldRange(c)(bit, bit, rfn) 26039cdc35SXuan Hu } 27039cdc35SXuan Hu 28039cdc35SXuan Hu @compileTimeOnly("") 29039cdc35SXuan Hu def CSRROFieldRangeNoFn(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int]): c.Tree = { 30039cdc35SXuan Hu CSRROFieldRange(c)(msb, lsb, null) 31039cdc35SXuan Hu } 32039cdc35SXuan Hu 33039cdc35SXuan Hu @compileTimeOnly("") 34039cdc35SXuan Hu def CSRROFieldBitNoFn(c: Context)(bit: c.Expr[Int]): c.Tree = { 35039cdc35SXuan Hu CSRROFieldRange(c)(bit, bit, null) 36039cdc35SXuan Hu } 37039cdc35SXuan Hu 38039cdc35SXuan Hu @compileTimeOnly("") 39039cdc35SXuan Hu def CSRWARLFieldRange(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int], fn: c.Tree): c.Tree = { 40039cdc35SXuan Hu c.parse(s"CSRDefines.CSRField${calcuWidth(c)(msb, lsb)}Bits.WARL(${c.eval(msb)}, ${c.eval(lsb)}, $fn)") 41039cdc35SXuan Hu } 42039cdc35SXuan Hu 43039cdc35SXuan Hu @compileTimeOnly("") 44039cdc35SXuan Hu def CSRWARLFieldBit(c: Context)(bit: c.Expr[Int], fn: c.Tree): c.Tree = { 45039cdc35SXuan Hu CSRWARLFieldRange(c)(bit, bit, fn) 46039cdc35SXuan Hu } 47039cdc35SXuan Hu 48039cdc35SXuan Hu @compileTimeOnly("") 49039cdc35SXuan Hu def CSRRWFieldRange(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int]): c.Tree = { 50039cdc35SXuan Hu c.parse(s"CSRDefines.CSRField${calcuWidth(c)(msb, lsb)}Bits.RW(" + 51039cdc35SXuan Hu s"${c.eval(msb)}, " + 52039cdc35SXuan Hu s"${c.eval(lsb)}" + 53039cdc35SXuan Hu s")" 54039cdc35SXuan Hu ) 55039cdc35SXuan Hu } 56039cdc35SXuan Hu 57039cdc35SXuan Hu @compileTimeOnly("") 58039cdc35SXuan Hu def CSRRWFieldBit(c: Context)(bit: c.Expr[Int]): c.Tree = { 59039cdc35SXuan Hu CSRRWFieldRange(c)(bit, bit) 60039cdc35SXuan Hu } 61039cdc35SXuan Hu 62039cdc35SXuan Hu @compileTimeOnly("") 63*25dc4a82SXuan Hu def CSRRWFieldRangeWithReset(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int], resetVal: c.Tree): c.Tree = { 64*25dc4a82SXuan Hu c.parse(s"CSRDefines.CSRField${calcuWidth(c)(msb, lsb)}Bits.RW(" + 65*25dc4a82SXuan Hu s"${c.eval(msb)}, " + 66*25dc4a82SXuan Hu s"${c.eval(lsb)}, " + 67*25dc4a82SXuan Hu s"${resetVal}" + 68*25dc4a82SXuan Hu s")" 69*25dc4a82SXuan Hu ) 70*25dc4a82SXuan Hu } 71*25dc4a82SXuan Hu 72*25dc4a82SXuan Hu @compileTimeOnly("") 73*25dc4a82SXuan Hu def CSRRWFieldBitWithReset(c: Context)(bit: c.Expr[Int], resetVal: c.Tree): c.Tree = { 74*25dc4a82SXuan Hu CSRRWFieldRangeWithReset(c)(bit, bit, resetVal) 75*25dc4a82SXuan Hu } 76*25dc4a82SXuan Hu 77*25dc4a82SXuan Hu @compileTimeOnly("") 78039cdc35SXuan Hu def CSRWLRLFieldRange(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int], fn: c.Tree): c.Tree = { 79039cdc35SXuan Hu c.parse(s"CSRDefines.CSRField${calcuWidth(c)(msb, lsb)}Bits.WARL(${c.eval(msb)}, ${c.eval(lsb)}, $fn)") 80039cdc35SXuan Hu } 81039cdc35SXuan Hu 82039cdc35SXuan Hu @compileTimeOnly("") 83039cdc35SXuan Hu def CSRWLRLFieldBit(c: Context)(bit: c.Expr[Int], fn: c.Tree): c.Tree = { 84039cdc35SXuan Hu CSRWLRLFieldRange(c)(bit, bit, fn) 85039cdc35SXuan Hu } 86039cdc35SXuan Hu 87039cdc35SXuan Hu @compileTimeOnly("") 88039cdc35SXuan Hu def CSRRefWARLFieldRange(c: Context)(ref: c.Tree, msb: c.Expr[Int], lsb: c.Expr[Int], wfn: c.Tree): c.Tree = { 89039cdc35SXuan Hu c.parse(s"CSRDefines.CSRField${calcuWidth(c)(msb, lsb)}Bits.RefWARL($ref, ${c.eval(msb)}, ${c.eval(lsb)}, $wfn)") 90039cdc35SXuan Hu } 91039cdc35SXuan Hu 92039cdc35SXuan Hu @compileTimeOnly("") 93039cdc35SXuan Hu def CSRRefWARLFieldBit(c: Context)(ref: c.Tree, bit: c.Expr[Int], wfn: c.Tree): c.Tree = { 94039cdc35SXuan Hu CSRRefWARLFieldRange(c)(ref, bit, bit, wfn) 95039cdc35SXuan Hu } 96039cdc35SXuan Hu } 97039cdc35SXuan Hu} 98039cdc35SXuan Hu 99039cdc35SXuan Hu 100