1 from enum
import Enum
, unique
4 from os
.path
import dirname
, join
5 from collections
import namedtuple
8 def find_wiki_file(name
):
9 filedir
= os
.path
.dirname(os
.path
.abspath(__file__
))
10 basedir
= dirname(dirname(dirname(filedir
)))
11 tabledir
= join(basedir
, 'libreriscv')
12 tabledir
= join(tabledir
, 'openpower')
13 tabledir
= join(tabledir
, 'isatables')
15 file_path
= join(tabledir
, name
)
20 file_path
= find_wiki_file(name
)
21 with
open(file_path
, 'r') as csvfile
:
22 reader
= csv
.DictReader(csvfile
)
26 # names of the fields in the tables that don't correspond to an enum
27 single_bit_flags
= ['inv A', 'inv out',
28 'cry out', 'BR', 'sgn ext', 'rsrv', '32b',
29 'sgn', 'lk', 'sgl pipe']
31 # default values for fields in the table
32 default_values
= {'unit': "NONE", 'internal op': "OP_ILLEGAL",
33 'in1': "RA", 'in2': 'NONE', 'in3': 'NONE', 'out': 'NONE',
37 'rc': 'NONE', 'cry in': 'ZERO', 'form': 'NONE'}
40 def get_signal_name(name
):
43 return name
.lower().replace(' ', '_')
45 # this corresponds to which Function Unit (pipeline-with-Reservation-Stations)
46 # is to process and guard the operation. they are roughly divided by having
47 # the same register input/output signature (X-Form, etc.)
96 # supported instructions: make sure to keep up-to-date with CSV files
97 # just like everything else
99 "NONE", "add", "addc", "addco", "adde", "addeo", "addi", "addic", "addic.",
100 "addis", "addme", "addmeo", "addo", "addze", "addzeo", "and", "andc",
101 "andi.", "andis.", "attn", "b", "bc", "bcctr", "bclr", "bctar",
102 "bpermd", "cmp", "cmpb", "cmpeqb", "cmpi", "cmpl", "cmpli", "cmprb",
103 "cntlzd", "cntlzw", "cnttzd", "cnttzw", "crand", "crandc", "creqv",
104 "crnand", "crnor", "cror", "crorc", "crxor", "darn", "dcbf", "dcbst",
105 "dcbt", "dcbtst", "dcbz", "divd", "divde", "divdeo", "divdeu",
106 "divdeuo", "divdo", "divdu", "divduo", "divw", "divwe", "divweo",
107 "divweu", "divweuo", "divwo", "divwu", "divwuo", "eqv", "extsb",
108 "extsh", "extsw", "extswsli", "hrfid", "icbi", "icbt", "isel", "isync",
109 "lbarx", "lbz", "lbzu", "lbzux", "lbzx", "ld", "ldarx", "ldbrx",
110 "ldu", "ldux", "ldx", "lha", "lharx", "lhau", "lhaux", "lhax",
111 "lhbrx", "lhz", "lhzu", "lhzux", "lhzx", "lwa", "lwarx", "lwaux",
112 "lwax", "lwbrx", "lwz", "lwzcix", "lwzu", "lwzux", "lwzx", "mcrf", "mcrxr",
113 "mcrxrx", "mfcr/mfocrf", "mfmsr", "mfspr", "modsd", "modsw", "modud",
114 "moduw", "mtcrf/mtocrf", "mtmsr", "mtmsrd", "mtspr", "mulhd", "mulhdu",
115 "mulhw", "mulhwu", "mulld", "mulldo", "mulli", "mullw", "mullwo",
116 "nand", "neg", "nego", "nop", "nor", "or", "orc", "ori", "oris",
117 "popcntb", "popcntd", "popcntw", "prtyd", "prtyw", "rfid", "rldcl",
118 "rldcr", "rldic", "rldicl", "rldicr", "rldimi", "rlwimi", "rlwinm",
119 "rlwnm", "setb", "sim_cfg", "slbia", "sld", "slw", "srad", "sradi", "sraw",
120 "srawi", "srd", "srw", "stb", "stbcix", "stbcx", "stbu", "stbux", "stbx",
121 "std", "stdbrx", "stdcx", "stdu", "stdux", "stdx", "sth", "sthbrx", "sthcx",
122 "sthu", "sthux", "sthx", "stw", "stwbrx", "stwcx", "stwu", "stwux",
123 "stwx", "subf", "subfc", "subfco", "subfe", "subfeo", "subfic",
124 "subfme", "subfmeo", "subfo", "subfze", "subfzeo", "sync", "td",
125 "tdi", "tlbie", "tlbiel", "tw", "twi", "xor", "xori", "xoris",
128 # two-way lookup of instruction-to-index and vice-versa
131 for i
, insn
in enumerate(_insns
):
135 # Internal Operation numbering. Add new opcodes here (FPADD, FPMUL etc.)
138 OP_ILLEGAL
= 0 # important that this is zero (see power_decoder.py)
219 RS
= 4 # for some ALU/Logical operations
237 RS
= 13 # for shiftrot (M-Form)
244 RB
= 2 # for shiftrot (M-Form)
265 class LDSTMode(Enum
):
299 class CROutSel(Enum
):
307 # SPRs - Special-Purpose Registers. See V3.0B Figure 18 p971 and
308 # http://libre-riscv.org/openpower/isatables/sprs.csv
309 # http://bugs.libre-riscv.org/show_bug.cgi?id=261
311 spr_csv
= get_csv("sprs.csv")
312 spr_info
= namedtuple('spr_info', 'SPR priv_mtspr priv_mfspr length idx')
316 info
= spr_info(SPR
=row
['SPR'], priv_mtspr
=row
['priv_mtspr'],
317 priv_mfspr
=row
['priv_mfspr'], length
=int(row
['len']),
319 spr_dict
[int(row
['Idx'])] = info
320 spr_byname
[row
['SPR']] = info
321 fields
= [(row
['SPR'], int(row
['Idx'])) for row
in spr_csv
]
322 SPR
= Enum('SPR', fields
)
333 if __name__
== '__main__':
334 # find out what the heck is in SPR enum :)
335 print("sprs", len(SPR
))
338 print(SPR
.__members
__['TAR'])
340 print(x
, x
.value
, str(x
), x
.name
)
342 print ("function", Function
.ALU
.name
)