diff cpu_dsl.py @ 1615:28f80d1b343e

Support immediate operands for ld and alu ops in SVP. Support double indirect and immediate address modes for alu ops. Fixed DSL issues revealed by those changes
author Michael Pavone <pavone@retrodev.com>
date Mon, 24 Sep 2018 19:09:16 -0700
parents c9639139aedf
children 8c78543c4783
line wrap: on
line diff
--- a/cpu_dsl.py	Fri Sep 21 09:26:12 2018 -0700
+++ b/cpu_dsl.py	Mon Sep 24 19:09:16 2018 -0700
@@ -682,10 +682,11 @@
 	def addRegArray(self, name, size, regs):
 		self.regArrays[name] = (size, regs)
 		idx = 0
-		for reg in regs:
-			self.regs[reg] = size
-			self.regToArray[reg] = (name, idx)
-			idx += 1
+		if not type(regs) is int:
+			for reg in regs:
+				self.regs[reg] = size
+				self.regToArray[reg] = (name, idx)
+				idx += 1
 	
 	def isReg(self, name):
 		return name in self.regs
@@ -703,13 +704,18 @@
 		return self.regToArray[name][1]
 	
 	def arrayMemberName(self, array, index):
-		if type(index) is int:
+		if type(index) is int and not type(self.regArrays[array][1]) is int:
 			return self.regArrays[array][1][index]
 		else:
 			return None
+			
+	def isNamedArray(self, array):
+		return array in self.regArrays and type(self.regArrays[array][1]) is int
 	
 	def processLine(self, parts):
-		if len(parts) > 2:
+		if len(parts) == 3:
+			self.addRegArray(parts[0], int(parts[1]), int(parts[2]))
+		elif len(parts) > 2:
 			self.addRegArray(parts[0], int(parts[1]), parts[2:])
 		else:
 			self.addReg(parts[0], int(parts[1]))
@@ -983,7 +989,10 @@
 				end = self.regs.arrayMemberIndex(end)
 				if arrayName != begin:
 					end = 'context->{0}[{1}]'.format(arrayName, end)
-			regName = self.regs.arrayMemberName(begin, end)
+			if self.regs.isNamedArray(begin):
+				regName = self.regs.arrayMemberName(begin, end)
+			else:
+				regName = '{0}.{1}'.format(begin, end)
 			ret = 'context->{0}[{1}]'.format(begin, end)
 		else:
 			regName = name