comparison cpu_dsl.py @ 1750:01236179fc71

Optimization to memory access in new Z80 core
author Michael Pavone <pavone@retrodev.com>
date Sat, 09 Feb 2019 11:34:31 -0800
parents e4fe5a450d05
children d6d4c006a7b3
comparison
equal deleted inserted replaced
1749:e4fe5a450d05 1750:01236179fc71
1030 self.regToArray = {} 1030 self.regToArray = {}
1031 1031
1032 def addReg(self, name, size): 1032 def addReg(self, name, size):
1033 self.regs[name] = size 1033 self.regs[name] = size
1034 1034
1035 def addPointer(self, name, size): 1035 def addPointer(self, name, size, count):
1036 self.pointers[name] = size 1036 self.pointers[name] = (size, count)
1037 1037
1038 def addRegArray(self, name, size, regs): 1038 def addRegArray(self, name, size, regs):
1039 self.regArrays[name] = (size, regs) 1039 self.regArrays[name] = (size, regs)
1040 idx = 0 1040 idx = 0
1041 if not type(regs) is int: 1041 if not type(regs) is int:
1068 def isNamedArray(self, array): 1068 def isNamedArray(self, array):
1069 return array in self.regArrays and type(self.regArrays[array][1]) is int 1069 return array in self.regArrays and type(self.regArrays[array][1]) is int
1070 1070
1071 def processLine(self, parts): 1071 def processLine(self, parts):
1072 if len(parts) == 3: 1072 if len(parts) == 3:
1073 self.addRegArray(parts[0], int(parts[1]), int(parts[2])) 1073 if parts[1].startswith('ptr'):
1074 self.addPointer(parts[0], parts[1][3:], int(parts[2]))
1075 else:
1076 self.addRegArray(parts[0], int(parts[1]), int(parts[2]))
1074 elif len(parts) > 2: 1077 elif len(parts) > 2:
1075 self.addRegArray(parts[0], int(parts[1]), parts[2:]) 1078 self.addRegArray(parts[0], int(parts[1]), parts[2:])
1076 else: 1079 else:
1077 if parts[1].startswith('ptr'): 1080 if parts[1].startswith('ptr'):
1078 self.addPointer(parts[0], parts[1][3:]) 1081 self.addPointer(parts[0], parts[1][3:], 1)
1079 else: 1082 else:
1080 self.addReg(parts[0], int(parts[1])) 1083 self.addReg(parts[0], int(parts[1]))
1081 return self 1084 return self
1082 1085
1083 def writeHeader(self, otype, hFile): 1086 def writeHeader(self, otype, hFile):
1084 fieldList = [] 1087 fieldList = []
1085 for pointer in self.pointers: 1088 for pointer in self.pointers:
1086 stars = '*' 1089 stars = '*'
1087 ptype = self.pointers[pointer] 1090 ptype, count = self.pointers[pointer]
1088 while ptype.startswith('ptr'): 1091 while ptype.startswith('ptr'):
1089 stars += '*' 1092 stars += '*'
1090 ptype = ptype[3:] 1093 ptype = ptype[3:]
1091 if ptype.isdigit(): 1094 if ptype.isdigit():
1092 ptype = 'uint{sz}_t'.format(sz=ptype) 1095 ptype = 'uint{sz}_t'.format(sz=ptype)
1093 hFile.write('\n\t{ptype} {stars}{nm};'.format(nm=pointer, ptype=ptype, stars=stars)) 1096 if count > 1:
1097 arr = '[{n}]'.format(n=count)
1098 else:
1099 arr = ''
1100 hFile.write('\n\t{ptype} {stars}{nm}{arr};'.format(nm=pointer, ptype=ptype, stars=stars, arr=arr))
1094 for reg in self.regs: 1101 for reg in self.regs:
1095 if not self.isRegArrayMember(reg): 1102 if not self.isRegArrayMember(reg):
1096 fieldList.append((self.regs[reg], 1, reg)) 1103 fieldList.append((self.regs[reg], 1, reg))
1097 for arr in self.regArrays: 1104 for arr in self.regArrays:
1098 size,regs = self.regArrays[arr] 1105 size,regs = self.regArrays[arr]