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("") 19*01cdded8SXuan Hu def CSRROFieldRangeWithReset(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int], rfn: c.Tree, resetVal: c.Tree): c.Tree = { 20*01cdded8SXuan Hu c.parse(s"CSRDefines.CSRField${calcuWidth(c)(msb, lsb)}Bits.RO(${c.eval(msb)}, ${c.eval(lsb)}, $rfn, $resetVal)") 21*01cdded8SXuan Hu } 22*01cdded8SXuan Hu 23*01cdded8SXuan Hu @compileTimeOnly("") 24039cdc35SXuan Hu def CSRROFieldRange(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int], rfn: c.Tree): c.Tree = { 25*01cdded8SXuan Hu CSRROFieldRangeWithReset(c)(msb, lsb, rfn, null) 26039cdc35SXuan Hu } 27039cdc35SXuan Hu 28039cdc35SXuan Hu @compileTimeOnly("") 29039cdc35SXuan Hu def CSRROFieldBit(c: Context)(bit: c.Expr[Int], rfn: c.Tree): c.Tree = { 30*01cdded8SXuan Hu CSRROFieldRangeWithReset(c)(bit, bit, rfn, null) 31039cdc35SXuan Hu } 32039cdc35SXuan Hu 33039cdc35SXuan Hu @compileTimeOnly("") 34039cdc35SXuan Hu def CSRROFieldRangeNoFn(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int]): c.Tree = { 35*01cdded8SXuan Hu CSRROFieldRangeWithReset(c)(msb, lsb, null, null) 36*01cdded8SXuan Hu } 37*01cdded8SXuan Hu 38*01cdded8SXuan Hu @compileTimeOnly("") 39*01cdded8SXuan Hu def CSRROFieldRangeNoFnWithReset(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int], resetVal: c.Tree): c.Tree = { 40*01cdded8SXuan Hu CSRROFieldRangeWithReset(c)(msb, lsb, null, resetVal) 41039cdc35SXuan Hu } 42039cdc35SXuan Hu 43039cdc35SXuan Hu @compileTimeOnly("") 44039cdc35SXuan Hu def CSRROFieldBitNoFn(c: Context)(bit: c.Expr[Int]): c.Tree = { 45*01cdded8SXuan Hu CSRROFieldRangeWithReset(c)(bit, bit, null, null) 46039cdc35SXuan Hu } 47039cdc35SXuan Hu 48039cdc35SXuan Hu @compileTimeOnly("") 49039cdc35SXuan Hu def CSRWARLFieldRange(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int], fn: c.Tree): c.Tree = { 50039cdc35SXuan Hu c.parse(s"CSRDefines.CSRField${calcuWidth(c)(msb, lsb)}Bits.WARL(${c.eval(msb)}, ${c.eval(lsb)}, $fn)") 51039cdc35SXuan Hu } 52039cdc35SXuan Hu 53039cdc35SXuan Hu @compileTimeOnly("") 54039cdc35SXuan Hu def CSRWARLFieldBit(c: Context)(bit: c.Expr[Int], fn: c.Tree): c.Tree = { 55039cdc35SXuan Hu CSRWARLFieldRange(c)(bit, bit, fn) 56039cdc35SXuan Hu } 57039cdc35SXuan Hu 58039cdc35SXuan Hu @compileTimeOnly("") 59039cdc35SXuan Hu def CSRRWFieldRange(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int]): c.Tree = { 60039cdc35SXuan Hu c.parse(s"CSRDefines.CSRField${calcuWidth(c)(msb, lsb)}Bits.RW(" + 61039cdc35SXuan Hu s"${c.eval(msb)}, " + 62039cdc35SXuan Hu s"${c.eval(lsb)}" + 63039cdc35SXuan Hu s")" 64039cdc35SXuan Hu ) 65039cdc35SXuan Hu } 66039cdc35SXuan Hu 67039cdc35SXuan Hu @compileTimeOnly("") 68039cdc35SXuan Hu def CSRRWFieldBit(c: Context)(bit: c.Expr[Int]): c.Tree = { 69039cdc35SXuan Hu CSRRWFieldRange(c)(bit, bit) 70039cdc35SXuan Hu } 71039cdc35SXuan Hu 72039cdc35SXuan Hu @compileTimeOnly("") 7325dc4a82SXuan Hu def CSRRWFieldRangeWithReset(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int], resetVal: c.Tree): c.Tree = { 7425dc4a82SXuan Hu c.parse(s"CSRDefines.CSRField${calcuWidth(c)(msb, lsb)}Bits.RW(" + 7525dc4a82SXuan Hu s"${c.eval(msb)}, " + 7625dc4a82SXuan Hu s"${c.eval(lsb)}, " + 7725dc4a82SXuan Hu s"${resetVal}" + 7825dc4a82SXuan Hu s")" 7925dc4a82SXuan Hu ) 8025dc4a82SXuan Hu } 8125dc4a82SXuan Hu 8225dc4a82SXuan Hu @compileTimeOnly("") 8325dc4a82SXuan Hu def CSRRWFieldBitWithReset(c: Context)(bit: c.Expr[Int], resetVal: c.Tree): c.Tree = { 8425dc4a82SXuan Hu CSRRWFieldRangeWithReset(c)(bit, bit, resetVal) 8525dc4a82SXuan Hu } 8625dc4a82SXuan Hu 8725dc4a82SXuan Hu @compileTimeOnly("") 88039cdc35SXuan Hu def CSRWLRLFieldRange(c: Context)(msb: c.Expr[Int], lsb: c.Expr[Int], fn: c.Tree): c.Tree = { 89039cdc35SXuan Hu c.parse(s"CSRDefines.CSRField${calcuWidth(c)(msb, lsb)}Bits.WARL(${c.eval(msb)}, ${c.eval(lsb)}, $fn)") 90039cdc35SXuan Hu } 91039cdc35SXuan Hu 92039cdc35SXuan Hu @compileTimeOnly("") 93039cdc35SXuan Hu def CSRWLRLFieldBit(c: Context)(bit: c.Expr[Int], fn: c.Tree): c.Tree = { 94039cdc35SXuan Hu CSRWLRLFieldRange(c)(bit, bit, fn) 95039cdc35SXuan Hu } 96039cdc35SXuan Hu 97039cdc35SXuan Hu @compileTimeOnly("") 98039cdc35SXuan Hu def CSRRefWARLFieldRange(c: Context)(ref: c.Tree, msb: c.Expr[Int], lsb: c.Expr[Int], wfn: c.Tree): c.Tree = { 99039cdc35SXuan Hu c.parse(s"CSRDefines.CSRField${calcuWidth(c)(msb, lsb)}Bits.RefWARL($ref, ${c.eval(msb)}, ${c.eval(lsb)}, $wfn)") 100039cdc35SXuan Hu } 101039cdc35SXuan Hu 102039cdc35SXuan Hu @compileTimeOnly("") 103039cdc35SXuan Hu def CSRRefWARLFieldBit(c: Context)(ref: c.Tree, bit: c.Expr[Int], wfn: c.Tree): c.Tree = { 104039cdc35SXuan Hu CSRRefWARLFieldRange(c)(ref, bit, bit, wfn) 105039cdc35SXuan Hu } 106039cdc35SXuan Hu } 107039cdc35SXuan Hu} 108039cdc35SXuan Hu 109039cdc35SXuan Hu 110