#!/usr/bin/python3 # The OS/K Team licenses this file to you under the MIT license. # See the LICENSE file in the project root for more information. from tempfile import TemporaryFile fi = open("INSTRS") hd = open("arch_i.h", "w") ls = open("instrs.lst", "w") count = 0 hd.write("// Auto-generated by arch_i.py from INSTRS\n\n"); hd.write("#ifdef _NEED_ARCH_I\n") hd.write("instr_t arch_i[] =\n{\n\n") hd.write("#endif\n") fp = TemporaryFile(mode="w+") def getflag(s): if s == "r": return "P_REG" if s == "i": return "P_IMM" if s == "m": return "P_MEM" return "__FLAG_ERROR__" def doprnt(i, p1, p2): for c1 in p1: for c2 in p2: fp.write("{} {} {}".format(i, c1, c2).strip()) fp.write('\n') # "instr ri ri" => "instr r r\ninstr r i\ninstr i r..." # not optimal but will do for now for _, line in enumerate(fi): if line[0] == '#' or line[0] == ' ' or line[0] == '\n': continue tok = line.strip().split(' ') if len(tok) == 0: continue cond = False if tok[0][0] == '!': assert(len(tok[0]) > 1) tok[0] = tok[0][1:] i = tok[0].strip() if len(tok) == 1: doprnt(i, ' ', ' ') continue if len(tok) == 2: p = tok[1].strip() doprnt(i, p, ' ') continue assert(len(tok) == 3) p1 = tok[1].strip() p2 = tok[2].strip() doprnt(i, p1, p2) fp.seek(0) for _, line in enumerate(fp): tok = line.strip().split(' ') if len(tok) == 1: name = tok[0] p1 = "NOPRM" p2 = "NOPRM" elif len(tok) == 2: name = "{}_{}".format(tok[0], tok[1].strip()) p1 = getflag(tok[1]) p2 = "NOPRM" elif len(tok) == 3: name = "{}_{}_{}".format(tok[0], tok[1], tok[2].strip()) p1 = getflag(tok[1]) p2 = getflag(tok[2]) else: name = "__TOK_ERROR__" p1 = "__TOK_ERROR__" p2 = "__TOK_ERROR__" ls.write("{}\n".format(name)); hd.write("#ifdef _NEED_ARCH_I\n") hd.write('{{ "{}", "{}", {}, {}, i_{} }},\n'\ .format(tok[0], name, p1, p2, tok[0])) hd.write("#else\n") hd.write("#define I_{} {}\n".format(name.upper(), count)) hd.write("extern bool i_{}(ctx_t *, acc_t *, acc_t *, ulong *, ulong *);\n" .format(tok[0])) hd.write("#endif\n\n") count = count + 1 hd.write("#ifdef _NEED_ARCH_I\n") hd.write("};\n") hd.write("#else\n") hd.write("#define NINSTRS {}\n\n".format(count)) hd.write("#endif\n") ls.close() hd.close() fi.close()