xref: /XiangShan/macros/src/main/scala/CSRMacros.scala (revision 01cdded87283f55be427ca849d18baa3e9459c2d)
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