changeset 2712:d653a8c383d3

some CPU DSL fixes
author Michael Pavone <pavone@retrodev.com>
date Thu, 10 Jul 2025 16:06:33 -0700
parents 7e5aaa84fa78
children a88eff3fb5d8
files cpu_dsl.py
diffstat 1 files changed, 29 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/cpu_dsl.py	Thu Jul 10 16:06:13 2025 -0700
+++ b/cpu_dsl.py	Thu Jul 10 16:06:33 2025 -0700
@@ -40,8 +40,10 @@
 			if len(parts) == 4 and parts[2] in compareOps:
 				self.addOp(NormalOp(['cmp', parts[3], parts[1]]))
 				cond = parts[2]
+			elif len(parts) == 2:
+				cond = parts[1]
 			else:
-				cond = parts[1]
+				raise Exception('Invalid if: ' + ' '.join(parts))
 			o = If(self, cond)
 			self.addOp(o)
 			return o
@@ -2238,66 +2240,51 @@
 			if self.body in self.subroutines:
 				pieces.append('\nvoid {pre}execute({type} *context, uint32_t target_cycle)'.format(pre = self.prefix, type = self.context_type))
 				pieces.append('\n{')
+				bodyPieces = []
+				self.declaredLocals.clear()
 				if self.sync_cycle:
-					pieces.append('\n\t{sync}(context, target_cycle);'.format(sync=self.sync_cycle))
+					bodyPieces.append('\n\t{sync}(context, target_cycle);'.format(sync=self.sync_cycle))
 				if self.pc_reg:
-					pieces.append('\n\tif (context->breakpoints) {')
-					pieces.append('\n\t\twhile (context->cycles < target_cycle)')
-					pieces.append('\n\t\t{')
+					bodyPieces.append('\n\tif (context->breakpoints) {')
+					bodyPieces.append('\n\t\twhile (context->cycles < target_cycle)')
+					bodyPieces.append('\n\t\t{')
 					if self.interrupt in self.subroutines:
-						pieces.append('\n\t\t\tif (context->cycles >= context->sync_cycle) {')
-						pieces.append(f'\n\t\t\t\t{self.sync_cycle}(context, target_cycle);')
-						pieces.append('\n\t\t\t}')
+						bodyPieces.append('\n\t\t\tif (context->cycles >= context->sync_cycle) {')
+						bodyPieces.append(f'\n\t\t\t\t{self.sync_cycle}(context, target_cycle);')
+						bodyPieces.append('\n\t\t\t}')
 						self.meta = {}
 						self.temp = {}
-						intpieces = []
-						self.declaredLocals.clear()
-						self.subroutines[self.interrupt].inline(self, [], intpieces, otype, None)
+						self.subroutines[self.interrupt].inline(self, [], bodyPieces, otype, None)
 						for size in self.temp:
-							pieces.append('\n\t\t\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size))
-						for name in self.declaredLocals:
-							pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};')
-						pieces += intpieces
+							bodyPieces.append('\n\t\t\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size))
 					if self.pc_offset:
-						pieces.append(f'\n\t\t\tuint32_t debug_pc = context->{self.pc_reg} - {self.pc_offset};')
+						bodyPieces.append(f'\n\t\t\tuint32_t debug_pc = context->{self.pc_reg} - {self.pc_offset};')
 						pc_reg = 'debug_pc'
 					else:
 						pc_reg = 'context->' + self.pc_reg
-					pieces.append('\n\t\t\tchar key_buf[6];')
-					pieces.append(f'\n\t\t\tdebug_handler handler = tern_find_ptr(context->breakpoints, tern_int_key({pc_reg}, key_buf));')
-					pieces.append('\n\t\t\tif (handler) {')
-					pieces.append(f'\n\t\t\t\thandler(context, {pc_reg});')
-					pieces.append('\n\t\t\t}')
+					bodyPieces.append('\n\t\t\tchar key_buf[6];')
+					bodyPieces.append(f'\n\t\t\tdebug_handler handler = tern_find_ptr(context->breakpoints, tern_int_key({pc_reg}, key_buf));')
+					bodyPieces.append('\n\t\t\tif (handler) {')
+					bodyPieces.append(f'\n\t\t\t\thandler(context, {pc_reg});')
+					bodyPieces.append('\n\t\t\t}')
 					self.meta = {}
 					self.temp = {}
-					self.declaredLocals.clear()
-					bodyPieces = []
 					self.subroutines[self.body].inline(self, [], bodyPieces, otype, None)
-					for name in self.declaredLocals:
-						pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};')
-					pieces += bodyPieces
-					pieces.append('\n\t}')
-					pieces.append('\n\t} else {')
-				pieces.append('\n\twhile (context->cycles < target_cycle)')
-				pieces.append('\n\t{')
+					bodyPieces.append('\n\t}')
+					bodyPieces.append('\n\t} else {')
+				bodyPieces.append('\n\twhile (context->cycles < target_cycle)')
+				bodyPieces.append('\n\t{')
 				if self.interrupt in self.subroutines:
-					pieces.append('\n\t\tif (context->cycles >= context->sync_cycle) {')
-					pieces.append(f'\n\t\t\t{self.sync_cycle}(context, target_cycle);')
-					pieces.append('\n\t\t}')
+					bodyPieces.append('\n\t\tif (context->cycles >= context->sync_cycle) {')
+					bodyPieces.append(f'\n\t\t\t{self.sync_cycle}(context, target_cycle);')
+					bodyPieces.append('\n\t\t}')
 					self.meta = {}
 					self.temp = {}
-					intpieces = []
-					self.declaredLocals.clear()
-					self.subroutines[self.interrupt].inline(self, [], intpieces, otype, None)
+					self.subroutines[self.interrupt].inline(self, [], bodyPieces, otype, None)
 					for size in self.temp:
-						pieces.append('\n\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size))
-					for name in self.declaredLocals:
-						pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};')
-					pieces += intpieces
+						bodyPieces.append('\n\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size))
 				self.meta = {}
 				self.temp = {}
-				self.declaredLocals.clear()
-				bodyPieces = []
 				self.subroutines[self.body].inline(self, [], bodyPieces, otype, None)
 				for name in self.declaredLocals:
 					pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};')