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')