comparison cpu_dsl.py @ 2708:2fb2e989186f

Fix regression in CPU DSL var handling
author Michael Pavone <pavone@retrodev.com>
date Mon, 07 Jul 2025 22:12:42 -0700
parents c5dce4284e69
children
comparison
equal deleted inserted replaced
2707:a64c0e1ed6ac 2708:2fb2e989186f
222 return funName 222 return funName
223 223
224 def generateBody(self, value, prog, otype): 224 def generateBody(self, value, prog, otype):
225 output = [] 225 output = []
226 prog.meta = {} 226 prog.meta = {}
227 prog.declaredLocals.clear()
227 prog.pushScope(self) 228 prog.pushScope(self)
228 self.regValues = {} 229 self.regValues = {}
229 for var in self.locals: 230 for var in self.locals:
230 output.append('\n\tuint{sz}_t {name};'.format(sz=self.locals[var], name=var)) 231 output.append('\n\tuint{sz}_t {name};'.format(sz=self.locals[var], name=var))
231 self.newLocals = [] 232 self.newLocals = []
258 output.append(prog.flags.disperseFlags(prog, otype)) 259 output.append(prog.flags.disperseFlags(prog, otype))
259 for var in self.newLocals: 260 for var in self.newLocals:
260 begin += '\n\tuint{sz}_t {name};'.format(sz=self.locals[var], name=var) 261 begin += '\n\tuint{sz}_t {name};'.format(sz=self.locals[var], name=var)
261 for size in prog.temp: 262 for size in prog.temp:
262 begin += '\n\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size) 263 begin += '\n\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size)
264 for name in prog.declaredLocals:
265 begin += f'\n\tuint{prog.declaredLocals[name]}_t {name};'
263 prog.popScope() 266 prog.popScope()
264 if prog.dispatch == 'goto': 267 if prog.dispatch == 'goto':
265 output += prog.nextInstruction(otype) 268 output += prog.nextInstruction(otype)
266 return begin + ''.join(output) + '\n}' 269 return begin + ''.join(output) + '\n}'
267 270
281 self.args = [] 284 self.args = []
282 self.arg_map = {} 285 self.arg_map = {}
283 self.locals = {} 286 self.locals = {}
284 self.regValues = {} 287 self.regValues = {}
285 self.argValues = {} 288 self.argValues = {}
289 self.sizedLocals = {}
286 290
287 def addOp(self, op): 291 def addOp(self, op):
288 if op.op == 'arg': 292 if op.op == 'arg':
289 name = op.params[0] 293 name = op.params[0]
290 size = int(op.params[1]) 294 size = int(op.params[1])
296 self.locals[name] = size 300 self.locals[name] = size
297 else: 301 else:
298 self.implementation.append(op) 302 self.implementation.append(op)
299 303
300 def resolveLocal(self, name): 304 def resolveLocal(self, name):
305 if name in self.sizedLocals:
306 return self.sizedLocals[name]
301 if name in self.locals: 307 if name in self.locals:
302 return self.name + '_' + name 308 return self.name + '_' + name
303 return None 309 return None
304 310
305 def addLocal(self, name, size): 311 def addLocal(self, name, size):
317 if len(params) != len(self.args): 323 if len(params) != len(self.args):
318 raise Exception('{0} expects {1} arguments, but was called with {2}'.format(self.name, len(self.args), len(params))) 324 raise Exception('{0} expects {1} arguments, but was called with {2}'.format(self.name, len(self.args), len(params)))
319 argValues = {} 325 argValues = {}
320 if parent: 326 if parent:
321 self.regValues = parent.regValues 327 self.regValues = parent.regValues
322 output.append('\n\t{')
323 prog.pushScope(self) 328 prog.pushScope(self)
324 i = 0 329 i = 0
325 for name,size in self.args: 330 for name,size in self.args:
326 argValues[name] = params[i] 331 argValues[name] = params[i]
327 i += 1 332 i += 1
328 for name in self.locals: 333 for name in self.locals:
329 size = self.locals[name] 334 size = self.locals[name]
330 output.append('\n\tuint{size}_t {sub}_{local};'.format(size=size, sub=self.name, local=name)) 335 fullName = f'{self.name}_{name}'
336 declare = not fullName in prog.declaredLocals
337 if not declare and prog.declaredLocals[fullName] != size:
338 self.sizedLocals[name] = fullName
339 fullName = f'{self.name}_{size}_{name}'
340 declare = True
341 if declare:
342 prog.declaredLocals[fullName] = size
331 self.argValues = argValues 343 self.argValues = argValues
332 self.processOps(prog, argValues, output, otype, self.implementation) 344 self.processOps(prog, argValues, output, otype, self.implementation)
333 prog.popScope() 345 prog.popScope()
334 output.append('\n\t}')
335 346
336 def __str__(self): 347 def __str__(self):
337 pieces = [self.name] 348 pieces = [self.name]
338 for name,size in self.args: 349 for name,size in self.args:
339 pieces.append('\n\targ {0} {1}'.format(name, size)) 350 pieces.append('\n\targ {0} {1}'.format(name, size))
2080 self.sizeAdjust = None 2091 self.sizeAdjust = None
2081 self.conditional = False 2092 self.conditional = False
2082 self.declares = [] 2093 self.declares = []
2083 self.lastSize = None 2094 self.lastSize = None
2084 self.mainDispatch = set() 2095 self.mainDispatch = set()
2096 self.declaredLocals = {}
2085 2097
2086 def __str__(self): 2098 def __str__(self):
2087 pieces = [] 2099 pieces = []
2088 for reg in self.regs: 2100 for reg in self.regs:
2089 pieces.append(str(self.regs[reg])) 2101 pieces.append(str(self.regs[reg]))
2179 output.append('\n\tif (context->cycles >= context->sync_cycle) {') 2191 output.append('\n\tif (context->cycles >= context->sync_cycle) {')
2180 output.append('\n\tif (context->cycles >= target_cycle) { return; }') 2192 output.append('\n\tif (context->cycles >= target_cycle) { return; }')
2181 if self.interrupt in self.subroutines: 2193 if self.interrupt in self.subroutines:
2182 self.meta = {} 2194 self.meta = {}
2183 self.temp = {} 2195 self.temp = {}
2184 self.subroutines[self.interrupt].inline(self, [], output, otype, None) 2196 body = []
2197 self.declaredLocals.clear()
2198 self.subroutines[self.interrupt].inline(self, [], body, otype, None)
2199 for name in self.declaredLocals:
2200 output.append(f'\n\tuint{self.declaredLocals[name]}_t {name};')
2201 output += body
2185 output.append('\n\t}') 2202 output.append('\n\t}')
2186 2203
2187 self.meta = {} 2204 self.meta = {}
2188 self.temp = {} 2205 self.temp = {}
2189 self.subroutines[self.body].inline(self, [], output, otype, None) 2206 self.declaredLocals.clear()
2207 body = []
2208 self.subroutines[self.body].inline(self, [], body, otype, None)
2209 for name in self.declaredLocals:
2210 output.append(f'\n\tuint{self.declaredLocals[name]}_t {name};')
2211 output += body
2190 return output 2212 return output
2191 2213
2192 def build(self, otype): 2214 def build(self, otype):
2193 body = [] 2215 body = []
2194 pieces = [] 2216 pieces = []
2227 pieces.append(f'\n\t\t\t\t{self.sync_cycle}(context, target_cycle);') 2249 pieces.append(f'\n\t\t\t\t{self.sync_cycle}(context, target_cycle);')
2228 pieces.append('\n\t\t\t}') 2250 pieces.append('\n\t\t\t}')
2229 self.meta = {} 2251 self.meta = {}
2230 self.temp = {} 2252 self.temp = {}
2231 intpieces = [] 2253 intpieces = []
2254 self.declaredLocals.clear()
2232 self.subroutines[self.interrupt].inline(self, [], intpieces, otype, None) 2255 self.subroutines[self.interrupt].inline(self, [], intpieces, otype, None)
2233 for size in self.temp: 2256 for size in self.temp:
2234 pieces.append('\n\t\t\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size)) 2257 pieces.append('\n\t\t\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size))
2258 for name in self.declaredLocals:
2259 pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};')
2235 pieces += intpieces 2260 pieces += intpieces
2236 if self.pc_offset: 2261 if self.pc_offset:
2237 pieces.append(f'\n\t\t\tuint32_t debug_pc = context->{self.pc_reg} - {self.pc_offset};') 2262 pieces.append(f'\n\t\t\tuint32_t debug_pc = context->{self.pc_reg} - {self.pc_offset};')
2238 pc_reg = 'debug_pc' 2263 pc_reg = 'debug_pc'
2239 else: 2264 else:
2243 pieces.append('\n\t\t\tif (handler) {') 2268 pieces.append('\n\t\t\tif (handler) {')
2244 pieces.append(f'\n\t\t\t\thandler(context, {pc_reg});') 2269 pieces.append(f'\n\t\t\t\thandler(context, {pc_reg});')
2245 pieces.append('\n\t\t\t}') 2270 pieces.append('\n\t\t\t}')
2246 self.meta = {} 2271 self.meta = {}
2247 self.temp = {} 2272 self.temp = {}
2248 self.subroutines[self.body].inline(self, [], pieces, otype, None) 2273 self.declaredLocals.clear()
2274 bodyPieces = []
2275 self.subroutines[self.body].inline(self, [], bodyPieces, otype, None)
2276 for name in self.declaredLocals:
2277 pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};')
2278 pieces += bodyPieces
2249 pieces.append('\n\t}') 2279 pieces.append('\n\t}')
2250 pieces.append('\n\t} else {') 2280 pieces.append('\n\t} else {')
2251 pieces.append('\n\twhile (context->cycles < target_cycle)') 2281 pieces.append('\n\twhile (context->cycles < target_cycle)')
2252 pieces.append('\n\t{') 2282 pieces.append('\n\t{')
2253 if self.interrupt in self.subroutines: 2283 if self.interrupt in self.subroutines:
2255 pieces.append(f'\n\t\t\t{self.sync_cycle}(context, target_cycle);') 2285 pieces.append(f'\n\t\t\t{self.sync_cycle}(context, target_cycle);')
2256 pieces.append('\n\t\t}') 2286 pieces.append('\n\t\t}')
2257 self.meta = {} 2287 self.meta = {}
2258 self.temp = {} 2288 self.temp = {}
2259 intpieces = [] 2289 intpieces = []
2290 self.declaredLocals.clear()
2260 self.subroutines[self.interrupt].inline(self, [], intpieces, otype, None) 2291 self.subroutines[self.interrupt].inline(self, [], intpieces, otype, None)
2261 for size in self.temp: 2292 for size in self.temp:
2262 pieces.append('\n\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size)) 2293 pieces.append('\n\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size))
2294 for name in self.declaredLocals:
2295 pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};')
2263 pieces += intpieces 2296 pieces += intpieces
2264 self.meta = {} 2297 self.meta = {}
2265 self.temp = {} 2298 self.temp = {}
2266 self.subroutines[self.body].inline(self, [], pieces, otype, None) 2299 self.declaredLocals.clear()
2300 bodyPieces = []
2301 self.subroutines[self.body].inline(self, [], bodyPieces, otype, None)
2302 for name in self.declaredLocals:
2303 pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};')
2304 pieces += bodyPieces
2267 pieces.append('\n\t}') 2305 pieces.append('\n\t}')
2268 if self.pc_reg: 2306 if self.pc_reg:
2269 pieces.append('\n\t}') 2307 pieces.append('\n\t}')
2270 pieces.append('\n}') 2308 pieces.append('\n}')
2271 body.append('\nstatic void unimplemented({pre}context *context, uint32_t target_cycle)'.format(pre = self.prefix)) 2309 body.append('\nstatic void unimplemented({pre}context *context, uint32_t target_cycle)'.format(pre = self.prefix))