@@ -7,7 +7,7 @@ import elftools.elf.elffile
77import elftools .elf .enums
88import elftools .elf .sections
99
10- EXT_OPTS = {
10+ QEMU_EXT_OPTS = {
1111 "zba" : "zba=true" ,
1212 "zbb" : "zbb=true" ,
1313 "zbc" : "zbc=true" ,
@@ -16,21 +16,48 @@ EXT_OPTS = {
1616 "zve32f" : "Zve32f=true" ,
1717 "zve64f" : "Zve64f=true" ,
1818 "zfh" : "Zfh=true" ,
19- "zfhmin" : "Zfhmin=true" ,
19+ "zfhmin" : "Zfhmin=true" ,
2020 "zhinx" : "zhinx=true" ,
2121 "zfinx" : "zfinx=true" ,
2222 "zdinx" : "zdinx=true" ,
2323}
2424
25+ SPIKE_EXT_NOT_ALLOWED = [
26+ "zve32x" ,
27+ "zve32f" ,
28+ "zve64x" ,
29+ "zve64f" ,
30+ "zve64d" ,
31+ "zvl32b" ,
32+ "zvl64b" ,
33+ "zvl128b" ,
34+ "zvl256b" ,
35+ "zvl512b" ,
36+ "zvl1024b" ,
37+ "zvl2048b" ,
38+ "zvl4096b" ,
39+ ]
40+
41+ CPU_OPTIONS = {
42+ "xlen" : "" ,
43+ "vlen" : "" ,
44+ "extensions" : [],
45+ }
46+
2547SUPPORTTED_EXTS = "iemafdcbvph"
2648MC_EXT_PREFIX = "zsx"
2749
2850def parse_opt (argv ):
2951 parser = argparse .ArgumentParser ()
3052 parser .add_argument ('-march' , '--with-arch' , type = str , dest = 'march' )
3153 parser .add_argument ('-selftest' , action = 'store_true' )
32- parser .add_argument ('--get-riscv-tag' , type = str )
33- parser .add_argument ('--get-elf-class' , type = str )
54+ parser .add_argument ('--elf-file-path' , type = str )
55+ parser .add_argument ('--print-xlen' , action = 'store_true' , default = False )
56+ parser .add_argument ('--print-vlen' , action = 'store_true' , default = False )
57+ parser .add_argument ('--print-qemu-cpu' , action = 'store_true' , default = False )
58+ parser .add_argument ('--print-spike-isa' , action = 'store_true' , default = False )
59+ parser .add_argument ('--print-spike-varch' , action = 'store_true' ,
60+ default = False )
3461 opt = parser .parse_args ()
3562 return opt
3663
@@ -119,31 +146,47 @@ def get_vlen(ext_dict):
119146 vlen = max (vlen , zvelen )
120147 return vlen
121148
122- def conver_arch_to_qemu_cpu_opt (march ):
123- if len (march ) < 5 :
124- return None
125-
126- ext_dict = parse_march (march )
127-
128- cpu_opt = []
129- cpu_opt .append (march [0 :4 ]) # rv32 or rv64
130-
131- vlen = get_vlen (ext_dict )
149+ def print_qemu_cpu ():
150+ cpu_options = []
151+ cpu_options .append ("rv{0}" .format (CPU_OPTIONS ['xlen' ]))
132152
133- if vlen != 0 :
134- cpu_opt .append ("vlen=%d" % vlen )
153+ if CPU_OPTIONS [ ' vlen' ] :
154+ cpu_options .append ("vlen={0}" . format ( CPU_OPTIONS [ ' vlen' ]) )
135155
136156 disable_all_fd = False
137- for ext in ext_dict .keys ():
138- if ext in EXT_OPTS :
139- cpu_opt .append (EXT_OPTS [ext ])
157+ for ext in CPU_OPTIONS ['extensions' ]:
158+ if ext in QEMU_EXT_OPTS :
159+ cpu_options .append (QEMU_EXT_OPTS [ext ])
160+
140161 if ext in ['zhinx' , 'zfinx' , 'zdinx' ]:
141162 disable_all_fd = True
163+
142164 if disable_all_fd :
143- cpu_opt .append ("f=false" )
144- cpu_opt .append ("d=false" )
145- return "," .join (cpu_opt )
165+ cpu_options .append ("f=false" )
166+ cpu_options .append ("d=false" )
167+
168+ return "," .join (cpu_options )
169+
170+ def print_spike_isa ():
171+ cpu_options = []
172+ cpu_options .append ("rv{0}" .format (CPU_OPTIONS ['xlen' ]))
173+
174+ for ext in CPU_OPTIONS ['extensions' ]:
175+ if ext not in SPIKE_EXT_NOT_ALLOWED :
176+ normalized_ext_name = ext
177+
178+ if len (ext ) > 1 :
179+ normalized_ext_name = "_{0}" .format (normalized_ext_name )
146180
181+ cpu_options .append (normalized_ext_name )
182+
183+ return "" .join (cpu_options )
184+
185+ def print_spike_varch ():
186+ if not CPU_OPTIONS ['vlen' ]:
187+ return ""
188+
189+ return "vlen:{0},elen:{1}" .format (CPU_OPTIONS ['vlen' ], CPU_OPTIONS ['xlen' ])
147190
148191class TestArchStringParse (unittest .TestCase ):
149192 def _test (self , arch , expected_arch_list , expected_vlen = 0 ):
@@ -168,7 +211,7 @@ def open_elf(path):
168211 raise Exception ("%s is not ELF file!" % path )
169212 return elffile
170213
171- def read_elf_class (path ):
214+ def get_xlen (path ):
172215 elffile = open_elf (path )
173216 return elffile .elfclass
174217
@@ -204,21 +247,41 @@ def read_arch_attr (path):
204247 return val
205248 raise Exception ("Not found ELF attribute in %s?" % path )
206249
250+ def parse_elf_file (elf_file_path ):
251+ extensions = []
252+ extension_dict = parse_march (read_arch_attr (elf_file_path ))
253+
254+ for extension in extension_dict .keys ():
255+ extensions .append (extension )
256+
257+ CPU_OPTIONS ["extensions" ] = extensions
258+ CPU_OPTIONS ["vlen" ] = get_vlen (extension_dict )
259+ CPU_OPTIONS ["xlen" ] = get_xlen (elf_file_path )
260+
207261def main (argv ):
208262 opt = parse_opt (argv )
209263 if opt .selftest :
210264 selftest ()
211265 return 0
212- if (opt .get_elf_class ):
213- elf_class = read_elf_class (opt .get_elf_class )
214- print (elf_class )
266+
267+ parse_elf_file (opt .elf_file_path )
268+
269+ if opt .print_xlen :
270+ print (CPU_OPTIONS ['xlen' ])
215271 return
216- if (opt .get_riscv_tag ):
217- march = read_arch_attr (opt .get_riscv_tag )
218- else :
219- march = opt .march
220- cpu_opt = conver_arch_to_qemu_cpu_opt (march )
221- print (cpu_opt )
272+
273+ if opt .print_vlen :
274+ print (CPU_OPTIONS ['vlen' ])
275+ return
276+
277+ if opt .print_qemu_cpu :
278+ print (print_qemu_cpu ())
279+
280+ if opt .print_spike_isa :
281+ print (print_spike_isa ())
282+
283+ if opt .print_spike_varch :
284+ print (print_spike_varch ())
222285
223286if __name__ == '__main__' :
224287 sys .exit (main (sys .argv ))
0 commit comments