Mercurial > repos > blastem
comparison cpu_dsl.py @ 1700:e4b4e21a37fa
Output tables in order specified by the extra_tables field so the user can deal with dependencies between tables
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 25 Jan 2019 14:30:55 -0800 |
parents | 93103ad9d7f7 |
children | 4fd34fde390c |
comparison
equal
deleted
inserted
replaced
1699:93103ad9d7f7 | 1700:e4b4e21a37fa |
---|---|
951 hFile.write('\n}} {0}context;'.format(self.prefix)) | 951 hFile.write('\n}} {0}context;'.format(self.prefix)) |
952 hFile.write('\n') | 952 hFile.write('\n') |
953 hFile.write('\n#endif //{0}_'.format(macro)) | 953 hFile.write('\n#endif //{0}_'.format(macro)) |
954 hFile.write('\n') | 954 hFile.write('\n') |
955 hFile.close() | 955 hFile.close() |
956 def build(self, otype): | 956 |
957 body = [] | 957 def _buildTable(self, otype, table, body): |
958 pieces = [] | 958 pieces = [] |
959 for include in self.includes: | 959 opmap = [None] * (1 << self.opsize) |
960 body.append('#include "{0}"\n'.format(include)) | 960 bodymap = {} |
961 for table in self.instructions: | 961 if table in self.instructions: |
962 opmap = [None] * (1 << self.opsize) | |
963 bodymap = {} | |
964 instructions = self.instructions[table] | 962 instructions = self.instructions[table] |
965 instructions.sort() | 963 instructions.sort() |
966 for inst in instructions: | 964 for inst in instructions: |
967 for val in inst.allValues(): | 965 for val in inst.allValues(): |
968 if opmap[val] is None: | 966 if opmap[val] is None: |
971 self.needFlagCoalesce = False | 969 self.needFlagCoalesce = False |
972 self.needFlagDisperse = False | 970 self.needFlagDisperse = False |
973 self.lastOp = None | 971 self.lastOp = None |
974 opmap[val] = inst.generateName(val) | 972 opmap[val] = inst.generateName(val) |
975 bodymap[val] = inst.generateBody(val, self, otype) | 973 bodymap[val] = inst.generateBody(val, self, otype) |
976 | 974 |
977 pieces.append('\ntypedef void (*impl_fun)({pre}context *context);'.format(pre=self.prefix)) | 975 pieces.append('\ntypedef void (*impl_fun)({pre}context *context);'.format(pre=self.prefix)) |
978 pieces.append('\nstatic impl_fun impl_{name}[{sz}] = {{'.format(name = table, sz=len(opmap))) | 976 pieces.append('\nstatic impl_fun impl_{name}[{sz}] = {{'.format(name = table, sz=len(opmap))) |
979 for inst in range(0, len(opmap)): | 977 for inst in range(0, len(opmap)): |
980 op = opmap[inst] | 978 op = opmap[inst] |
981 if op is None: | 979 if op is None: |
982 pieces.append('\n\tunimplemented,') | 980 pieces.append('\n\tunimplemented,') |
983 else: | 981 else: |
984 pieces.append('\n\t' + op + ',') | 982 pieces.append('\n\t' + op + ',') |
985 body.append(bodymap[inst]) | 983 body.append(bodymap[inst]) |
986 pieces.append('\n};') | 984 pieces.append('\n};') |
985 body.extend(pieces) | |
986 | |
987 def build(self, otype): | |
988 body = [] | |
989 pieces = [] | |
990 for include in self.includes: | |
991 body.append('#include "{0}"\n'.format(include)) | |
992 body.append('\nstatic void unimplemented({pre}context *context)'.format(pre = self.prefix)) | |
993 body.append('\n{') | |
994 body.append('\n\tfatal_error("Unimplemented instruction");') | |
995 body.append('\n}\n') | |
996 for table in self.extra_tables: | |
997 self._buildTable(otype, table, body) | |
998 self._buildTable(otype, 'main', body) | |
987 if self.body in self.subroutines: | 999 if self.body in self.subroutines: |
988 pieces.append('\nvoid {pre}execute({type} *context, uint32_t target_cycle)'.format(pre = self.prefix, type = self.context_type)) | 1000 pieces.append('\nvoid {pre}execute({type} *context, uint32_t target_cycle)'.format(pre = self.prefix, type = self.context_type)) |
989 pieces.append('\n{') | 1001 pieces.append('\n{') |
990 pieces.append('\n\twhile (context->cycles < target_cycle)') | 1002 pieces.append('\n\twhile (context->cycles < target_cycle)') |
991 pieces.append('\n\t{') | 1003 pieces.append('\n\t{') |
992 self.meta = {} | 1004 self.meta = {} |
993 self.temp = {} | 1005 self.temp = {} |
994 self.subroutines[self.body].inline(self, [], pieces, otype, None) | 1006 self.subroutines[self.body].inline(self, [], pieces, otype, None) |
995 pieces.append('\n\t}') | 1007 pieces.append('\n\t}') |
996 pieces.append('\n}') | 1008 pieces.append('\n}') |
997 body.append('\nstatic void unimplemented({pre}context *context)'.format(pre = self.prefix)) | |
998 body.append('\n{') | |
999 body.append('\n\tfatal_error("Unimplemented instruction");') | |
1000 body.append('\n}\n') | |
1001 return ''.join(body) + ''.join(pieces) | 1009 return ''.join(body) + ''.join(pieces) |
1002 | 1010 |
1003 def checkBool(self, name): | 1011 def checkBool(self, name): |
1004 if not name in self.booleans: | 1012 if not name in self.booleans: |
1005 raise Exception(name + ' is not a defined boolean flag') | 1013 raise Exception(name + ' is not a defined boolean flag') |