1*7c19dcc5SAlessandro Di Federico#!/usr/bin/env python3 2*7c19dcc5SAlessandro Di Federico 3*7c19dcc5SAlessandro Di Federico## 4*7c19dcc5SAlessandro Di Federico## Copyright(c) 2019-2022 rev.ng Labs Srl. All Rights Reserved. 5*7c19dcc5SAlessandro Di Federico## 6*7c19dcc5SAlessandro Di Federico## This program is free software; you can redistribute it and/or modify 7*7c19dcc5SAlessandro Di Federico## it under the terms of the GNU General Public License as published by 8*7c19dcc5SAlessandro Di Federico## the Free Software Foundation; either version 2 of the License, or 9*7c19dcc5SAlessandro Di Federico## (at your option) any later version. 10*7c19dcc5SAlessandro Di Federico## 11*7c19dcc5SAlessandro Di Federico## This program is distributed in the hope that it will be useful, 12*7c19dcc5SAlessandro Di Federico## but WITHOUT ANY WARRANTY; without even the implied warranty of 13*7c19dcc5SAlessandro Di Federico## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*7c19dcc5SAlessandro Di Federico## GNU General Public License for more details. 15*7c19dcc5SAlessandro Di Federico## 16*7c19dcc5SAlessandro Di Federico## You should have received a copy of the GNU General Public License 17*7c19dcc5SAlessandro Di Federico## along with this program; if not, see <http://www.gnu.org/licenses/>. 18*7c19dcc5SAlessandro Di Federico## 19*7c19dcc5SAlessandro Di Federico 20*7c19dcc5SAlessandro Di Federicoimport sys 21*7c19dcc5SAlessandro Di Federicoimport re 22*7c19dcc5SAlessandro Di Federicoimport string 23*7c19dcc5SAlessandro Di Federicofrom io import StringIO 24*7c19dcc5SAlessandro Di Federico 25*7c19dcc5SAlessandro Di Federicoimport hex_common 26*7c19dcc5SAlessandro Di Federico 27*7c19dcc5SAlessandro Di Federico## 28*7c19dcc5SAlessandro Di Federico## Generate code to be fed to the idef_parser 29*7c19dcc5SAlessandro Di Federico## 30*7c19dcc5SAlessandro Di Federico## Consider A2_add: 31*7c19dcc5SAlessandro Di Federico## 32*7c19dcc5SAlessandro Di Federico## Rd32=add(Rs32,Rt32), { RdV=RsV+RtV;} 33*7c19dcc5SAlessandro Di Federico## 34*7c19dcc5SAlessandro Di Federico## We produce: 35*7c19dcc5SAlessandro Di Federico## 36*7c19dcc5SAlessandro Di Federico## A2_add(RdV, in RsV, in RtV) { 37*7c19dcc5SAlessandro Di Federico## { RdV=RsV+RtV;} 38*7c19dcc5SAlessandro Di Federico## } 39*7c19dcc5SAlessandro Di Federico## 40*7c19dcc5SAlessandro Di Federico## A2_add represents the instruction tag. Then we have a list of TCGv 41*7c19dcc5SAlessandro Di Federico## that the code generated by the parser can expect in input. Some of 42*7c19dcc5SAlessandro Di Federico## them are inputs ("in" prefix), while some others are outputs. 43*7c19dcc5SAlessandro Di Federico## 44*7c19dcc5SAlessandro Di Federicodef main(): 45*7c19dcc5SAlessandro Di Federico hex_common.read_semantics_file(sys.argv[1]) 46*7c19dcc5SAlessandro Di Federico hex_common.read_attribs_file(sys.argv[2]) 47*7c19dcc5SAlessandro Di Federico hex_common.calculate_attribs() 48*7c19dcc5SAlessandro Di Federico tagregs = hex_common.get_tagregs() 49*7c19dcc5SAlessandro Di Federico tagimms = hex_common.get_tagimms() 50*7c19dcc5SAlessandro Di Federico 51*7c19dcc5SAlessandro Di Federico with open(sys.argv[3], 'w') as f: 52*7c19dcc5SAlessandro Di Federico f.write('#include "macros.inc"\n\n') 53*7c19dcc5SAlessandro Di Federico 54*7c19dcc5SAlessandro Di Federico for tag in hex_common.tags: 55*7c19dcc5SAlessandro Di Federico ## Skip the priv instructions 56*7c19dcc5SAlessandro Di Federico if ( "A_PRIV" in hex_common.attribdict[tag] ) : 57*7c19dcc5SAlessandro Di Federico continue 58*7c19dcc5SAlessandro Di Federico ## Skip the guest instructions 59*7c19dcc5SAlessandro Di Federico if ( "A_GUEST" in hex_common.attribdict[tag] ) : 60*7c19dcc5SAlessandro Di Federico continue 61*7c19dcc5SAlessandro Di Federico ## Skip instructions that saturate in a ternary expression 62*7c19dcc5SAlessandro Di Federico if ( tag in {'S2_asr_r_r_sat', 'S2_asl_r_r_sat'} ) : 63*7c19dcc5SAlessandro Di Federico continue 64*7c19dcc5SAlessandro Di Federico ## Skip instructions using switch 65*7c19dcc5SAlessandro Di Federico if ( tag in {'S4_vrcrotate_acc', 'S4_vrcrotate'} ) : 66*7c19dcc5SAlessandro Di Federico continue 67*7c19dcc5SAlessandro Di Federico ## Skip trap instructions 68*7c19dcc5SAlessandro Di Federico if ( tag in {'J2_trap0', 'J2_trap1'} ) : 69*7c19dcc5SAlessandro Di Federico continue 70*7c19dcc5SAlessandro Di Federico ## Skip 128-bit instructions 71*7c19dcc5SAlessandro Di Federico if ( tag in {'A7_croundd_ri', 'A7_croundd_rr'} ) : 72*7c19dcc5SAlessandro Di Federico continue 73*7c19dcc5SAlessandro Di Federico if ( tag in {'M7_wcmpyrw', 'M7_wcmpyrwc', 74*7c19dcc5SAlessandro Di Federico 'M7_wcmpyiw', 'M7_wcmpyiwc', 75*7c19dcc5SAlessandro Di Federico 'M7_wcmpyrw_rnd', 'M7_wcmpyrwc_rnd', 76*7c19dcc5SAlessandro Di Federico 'M7_wcmpyiw_rnd', 'M7_wcmpyiwc_rnd'} ) : 77*7c19dcc5SAlessandro Di Federico continue 78*7c19dcc5SAlessandro Di Federico ## Skip interleave/deinterleave instructions 79*7c19dcc5SAlessandro Di Federico if ( tag in {'S2_interleave', 'S2_deinterleave'} ) : 80*7c19dcc5SAlessandro Di Federico continue 81*7c19dcc5SAlessandro Di Federico ## Skip instructions using bit reverse 82*7c19dcc5SAlessandro Di Federico if ( tag in {'S2_brev', 'S2_brevp', 'S2_ct0', 'S2_ct1', 83*7c19dcc5SAlessandro Di Federico 'S2_ct0p', 'S2_ct1p', 'A4_tlbmatch'} ) : 84*7c19dcc5SAlessandro Di Federico continue 85*7c19dcc5SAlessandro Di Federico ## Skip other unsupported instructions 86*7c19dcc5SAlessandro Di Federico if ( tag == 'S2_cabacdecbin' or tag == 'A5_ACS' ) : 87*7c19dcc5SAlessandro Di Federico continue 88*7c19dcc5SAlessandro Di Federico if ( tag.startswith('Y') ) : 89*7c19dcc5SAlessandro Di Federico continue 90*7c19dcc5SAlessandro Di Federico if ( tag.startswith('V6_') ) : 91*7c19dcc5SAlessandro Di Federico continue 92*7c19dcc5SAlessandro Di Federico if ( tag.startswith('F') ) : 93*7c19dcc5SAlessandro Di Federico continue 94*7c19dcc5SAlessandro Di Federico if ( tag.endswith('_locked') ) : 95*7c19dcc5SAlessandro Di Federico continue 96*7c19dcc5SAlessandro Di Federico if ( "A_COF" in hex_common.attribdict[tag] ) : 97*7c19dcc5SAlessandro Di Federico continue 98*7c19dcc5SAlessandro Di Federico 99*7c19dcc5SAlessandro Di Federico regs = tagregs[tag] 100*7c19dcc5SAlessandro Di Federico imms = tagimms[tag] 101*7c19dcc5SAlessandro Di Federico 102*7c19dcc5SAlessandro Di Federico arguments = [] 103*7c19dcc5SAlessandro Di Federico for regtype,regid,toss,numregs in regs: 104*7c19dcc5SAlessandro Di Federico prefix = "in " if hex_common.is_read(regid) else "" 105*7c19dcc5SAlessandro Di Federico 106*7c19dcc5SAlessandro Di Federico is_pair = hex_common.is_pair(regid) 107*7c19dcc5SAlessandro Di Federico is_single_old = (hex_common.is_single(regid) 108*7c19dcc5SAlessandro Di Federico and hex_common.is_old_val(regtype, regid, tag)) 109*7c19dcc5SAlessandro Di Federico is_single_new = (hex_common.is_single(regid) 110*7c19dcc5SAlessandro Di Federico and hex_common.is_new_val(regtype, regid, tag)) 111*7c19dcc5SAlessandro Di Federico 112*7c19dcc5SAlessandro Di Federico if is_pair or is_single_old: 113*7c19dcc5SAlessandro Di Federico arguments.append("%s%s%sV" % (prefix, regtype, regid)) 114*7c19dcc5SAlessandro Di Federico elif is_single_new: 115*7c19dcc5SAlessandro Di Federico arguments.append("%s%s%sN" % (prefix, regtype, regid)) 116*7c19dcc5SAlessandro Di Federico else: 117*7c19dcc5SAlessandro Di Federico print("Bad register parse: ",regtype,regid,toss,numregs) 118*7c19dcc5SAlessandro Di Federico 119*7c19dcc5SAlessandro Di Federico for immlett,bits,immshift in imms: 120*7c19dcc5SAlessandro Di Federico arguments.append(hex_common.imm_name(immlett)) 121*7c19dcc5SAlessandro Di Federico 122*7c19dcc5SAlessandro Di Federico f.write("%s(%s) {\n" % (tag, ", ".join(arguments))) 123*7c19dcc5SAlessandro Di Federico f.write(" "); 124*7c19dcc5SAlessandro Di Federico if hex_common.need_ea(tag): 125*7c19dcc5SAlessandro Di Federico f.write("size4u_t EA; "); 126*7c19dcc5SAlessandro Di Federico f.write("%s\n" % hex_common.semdict[tag]) 127*7c19dcc5SAlessandro Di Federico f.write("}\n\n") 128*7c19dcc5SAlessandro Di Federico 129*7c19dcc5SAlessandro Di Federicoif __name__ == "__main__": 130*7c19dcc5SAlessandro Di Federico main() 131