1 from enum
import Enum
, unique
4 from os
.path
import dirname
, join
5 from collections
import namedtuple
7 def find_wiki_file(name
):
8 filedir
= os
.path
.dirname(os
.path
.abspath(__file__
))
9 basedir
= dirname(dirname(dirname(filedir
)))
10 tabledir
= join(basedir
, 'libreriscv')
11 tabledir
= join(tabledir
, 'openpower')
12 tabledir
= join(tabledir
, 'isatables')
14 file_path
= join(tabledir
, name
)
19 file_path
= find_wiki_file(name
)
20 with
open(file_path
, 'r') as csvfile
:
21 reader
= csv
.DictReader(csvfile
)
25 # names of the fields in the tables that don't correspond to an enum
26 single_bit_flags
= ['inv A', 'inv out',
27 'cry out', 'BR', 'sgn ext', 'upd', 'rsrv', '32b',
28 'sgn', 'lk', 'sgl pipe']
30 # default values for fields in the table
31 default_values
= {'unit': "NONE", 'internal op': "OP_ILLEGAL",
32 'in1': "RA", 'in2': 'NONE', 'in3': 'NONE', 'out': 'NONE',
35 'rc': 'NONE', 'cry in': 'ZERO', 'form': 'NONE'}
38 def get_signal_name(name
):
41 return name
.lower().replace(' ', '_')
43 # this corresponds to which Function Unit (pipeline-with-Reservation-Stations)
44 # is to process and guard the operation. they are roughly divided by having
45 # the same register input/output signature (X-Form, etc.)
93 # Internal Operation numbering. Add new opcodes here (FPADD, FPMUL etc.)
95 class InternalOp(Enum
):
96 OP_ILLEGAL
= 0 # important that this is zero (see power_decoder.py)
174 RS
= 4 # for some ALU/Logical operations
192 RS
= 13 # for shiftrot (M-Form)
199 RB
= 2 # for shiftrot (M-Form)
243 class CROutSel(Enum
):
251 # SPRs - Special-Purpose Registers. See V3.0B Figure 18 p971 and
252 # http://libre-riscv.org/openpower/isatables/sprs.csv
253 # http://bugs.libre-riscv.org/show_bug.cgi?id=261
255 spr_csv
= get_csv("sprs.csv")
256 spr_info
= namedtuple('spr_info', 'SPR priv_mtspr priv_mfspr length')
259 info
= spr_info(SPR
=row
['SPR'], priv_mtspr
=row
['priv_mtspr'],
260 priv_mfspr
=row
['priv_mfspr'], length
=int(row
['len']))
261 spr_dict
[int(row
['Idx'])] = info
262 fields
= [(row
['SPR'], int(row
['Idx'])) for row
in spr_csv
]
263 SPR
= Enum('SPR', fields
)
274 if __name__
== '__main__':
275 # find out what the heck is in SPR enum :)
276 print ("sprs", len(SPR
))
279 print (SPR
.__members
__['TAR'])
281 print (x
, x
.value
, str(x
), x
.name
)