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