X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=openpower%2Fsv_analysis.py;h=ec0a442b0fcc0514f79776784b3148393419ac8d;hb=9557a17af04d90df5e58549ecc2358e35c42f557;hp=783af9b416e419aa085cd8574ebbbd894e02e482;hpb=afb5ad2f7db060ee5c223b1aecd9c012749c6b9d;p=libreriscv.git diff --git a/openpower/sv_analysis.py b/openpower/sv_analysis.py index 783af9b41..ec0a442b0 100644 --- a/openpower/sv_analysis.py +++ b/openpower/sv_analysis.py @@ -13,13 +13,17 @@ from glob import glob from collections import OrderedDict # Return absolute path (ie $PWD) + isatables + name + + def find_wiki_file(name): filedir = os.path.dirname(os.path.abspath(__file__)) tabledir = join(filedir, 'isatables') - file_path = join(tabledir, name) + file_path = join(tabledir, name) return file_path # Return an array of dictionaries from the CSV file name: + + def get_csv(name): file_path = find_wiki_file(name) with open(file_path, 'r') as csvfile: @@ -28,10 +32,12 @@ def get_csv(name): # This will return True if all values are true. # Not sure what this is about + + def blank_key(row): - #for v in row.values(): - # if 'SPR' in v: # skip all SPRs - # return True + # for v in row.values(): + # if 'SPR' in v: # skip all SPRs + # return True for v in row.values(): if v: return False @@ -40,6 +46,8 @@ def blank_key(row): # General purpose registers have names like: RA, RT, R1, ... # Floating point registers names like: FRT, FRA, FR1, ..., FRTp, ... # Return True if field is a register + + def isreg(field): return field.startswith('R') or field.startswith('FR') @@ -47,10 +55,11 @@ def isreg(field): # These are the attributes of the instructions, # register names keycolumns = ['unit', 'in1', 'in2', 'in3', 'out', 'CR in', 'CR out', - ] # don't think we need these: 'ldst len', 'rc', 'lk'] + ] # don't think we need these: 'ldst len', 'rc', 'lk'] tablecols = ['unit', 'in', 'outcnt', 'CR in', 'CR out', 'imm' - ] # don't think we need these: 'ldst len', 'rc', 'lk'] + ] # don't think we need these: 'ldst len', 'rc', 'lk'] + def create_key(row): res = OrderedDict() @@ -79,9 +88,11 @@ def create_key(row): res[key] = '0' else: res[key] = '1' + if row['comment'].startswith('cr'): + res['crop'] = '1' # unit if key == 'unit': - if row[key] == 'LDST': # we care about LDST units + if row[key] == 'LDST': # we care about LDST units res[key] = row[key] else: res[key] = 'OTHER' @@ -108,21 +119,30 @@ def create_key(row): # constants if row['in2'].startswith('CONST_'): - res['imm'] = "1" # row['in2'].split("_")[1] + res['imm'] = "1" # row['in2'].split("_")[1] else: res['imm'] = '' return res # + + def dformat(d): res = [] for k, v in d.items(): res.append("%s: %s" % (k, v)) return ' '.join(res) -def tformat(d): - return ' | '.join(d) + "|" + +def print_table_row(*cols): + print(f"| {' | '.join(cols)} |") + + +def print_table_header(*cols): + print_table_row(*cols) + print_table_row(*map(lambda v: '-'*max(1, len(v)), cols)) + def keyname(row): res = [] @@ -133,7 +153,10 @@ def keyname(row): if row['outcnt'] != '0': res.append('%sW' % row['outcnt']) if row['CR in'] == '1' and row['CR out'] == '1': - res.append("CRio") + if 'crop' in row: + res.append("CR=2R1W") + else: + res.append("CRio") elif row['CR in'] == '1': res.append("CRi") elif row['CR out'] == '1': @@ -148,6 +171,13 @@ def process_csvs(): bykey = {} primarykeys = set() dictkeys = OrderedDict() + immediates = {} + + print("# OpenPOWER ISA register 'profile's") + print() + print("this page is auto-generated, do not edit") + print("created by https://libre-soc.org/openpower/sv_analysis.py") + print() # Expand that (all .csv files) pth = find_wiki_file("*.csv") @@ -179,6 +209,13 @@ def process_csvs(): bykey[key].append((csvname, row['opcode'], row['comment'], row['form'].upper() + '-Form')) + # detect immediates, collate them (useful info) + if row['in2'].startswith('CONST_'): + imm = row['in2'].split("_")[1] + if key not in immediates: + immediates[key] = set() + immediates[key].add(imm) + primarykeys = list(primarykeys) primarykeys.sort() @@ -187,56 +224,71 @@ def process_csvs(): '2R-1W-CRio': 'R', '2R-1W-CRi': 'R', '2R-1W-CRo': 'R', + '2R': 'non-SV', '2R-1W': 'R', + '1R-CRio': 'TBD - need close inspection', '2R-CRio': 'R', '2R-CRo': 'R', + '1R': 'non-SV', '1R-1W-CRio': 'R', '1R-1W-CRo': 'R', '1R-1W': 'R', - '1R-1W': 'R', - '1R-Imm': 'U', + '1R-1W-imm': 'I', + '1R-CRo': 'I', + '1R-imm': 'non-SV', + '1W': 'non-SV', + '1W-CRi': 'TBD - needs close inspection', + 'CRio': 'R', + 'CR=2R1W': 'R', + 'CRi': 'non-SV', + 'imm': 'non-SV', + '': 'non-SV', 'LDST-2R-imm': 'S', 'LDST-2R-1W-imm': 'S', + 'LDST-2R-1W': 'I', + 'LDST-2R-2W': 'I', 'LDST-1R-1W-imm': 'I', 'LDST-1R-2W-imm': 'I', + 'LDST-3R': 'R/TBD - st*x', # these are st*x + 'LDST-3R-CRo': 'R/TBD - st*x', # st*x + 'LDST-3R-1W': 'R/TBD - st*x', # st*x } - print ("# map to old SV Prefix") - print ('') - print ('[[!table data="""') + print("# map to old SV Prefix") + print() + print_table_header("register profile", "old SV Prefix") for key in primarykeys: name = keyname(dictkeys[key]) value = mapsto.get(name, "-") - print (tformat([name, value+ " "])) - print ('"""]]') - print ('') - - print ("# keys") - print ('') - print ('[[!table data="""') - print (tformat(tablecols) + " name |") + print_table_row(name, value) + print() + print("# keys") + print() + print_table_header(*tablecols, "imms", "name") for key in primarykeys: name = keyname(dictkeys[key]) - print (tformat(dictkeys[key].values()) + " %s |" % name) - print ('"""]]') - print ('') + imms = list(immediates.get(key, "")) + imms.sort() + print_table_row(*dictkeys[key].values(), "/".join(imms), name) + print() for key in primarykeys: name = keyname(dictkeys[key]) - print ("## %s " % name) - print ('') - print ('[[!table data="""') - print (tformat(['CSV', 'opcode', 'asm', 'form'])) + value = mapsto.get(name, "-") + print("## %s (%s)" % (name, value)) + print() + print_table_header('CSV', 'opcode', 'asm', 'form') rows = bykey[key] rows.sort() for row in rows: - print (tformat(row)) - print ('"""]]') - print ('') + print_table_row(*row) + print() + + # TODO(lkcl): what did this do: + # bykey = {} + # for fname, csv in csvs.items(): + # key - bykey = {} - for fname, csv in csvs.items(): - key if __name__ == '__main__': process_csvs()