Make directives take parameters and use the directive function and not it's name
authorGabe Black <gblack@eecs.umich.edu>
Thu, 31 May 2007 20:45:06 +0000 (20:45 +0000)
committerGabe Black <gblack@eecs.umich.edu>
Thu, 31 May 2007 20:45:06 +0000 (20:45 +0000)
--HG--
extra : convert_revision : fbc93ba592b0cc009696e8d7edead841ec2ea01c

src/arch/micro_asm.py
src/arch/micro_asm_test.py

index 1fb04c185944d529962b84746b1f8df67dbead56..e36daf862170c96653a12f12361b7ccc04a71f69 100644 (file)
@@ -91,6 +91,7 @@ class Statement(object):
     def __init__(self):
         self.is_microop = False
         self.is_directive = False
+        self.params = ""
 
 class Microop(Statement):
     def __init__(self):
@@ -98,7 +99,6 @@ class Microop(Statement):
         self.mnemonic = ""
         self.labels = []
         self.is_microop = True
-        self.params = ""
 
 class Directive(Statement):
     def __init__(self):
@@ -136,7 +136,7 @@ def handle_statement(parser, container, statement):
             raise
     elif statement.is_directive:
         try:
-            eval('container.%s()' % statement.name)
+            eval('container.directives[statement.name](%s)' % statement.params)
         except:
             print_error("Error executing directive.")
             print container.directives
@@ -415,12 +415,19 @@ def p_label_1(t):
     label.text = t[2]
     t[0] = label
 
-def p_directive(t):
+def p_directive_0(t):
     'directive : DOT ID'
     directive = Directive()
     directive.name = t[2]
     t[0] = directive
 
+def p_directive_1(t):
+    'directive : DOT ID PARAMS'
+    directive = Directive()
+    directive.name = t[2]
+    directive.params = t[3]
+    t[0] = directive
+
 # Parse error handler.  Note that the argument here is the offending
 # *token*, not a grammar symbol (hence the need to use t.value)
 def p_error(t):
index 816a74b71ef566b60ebecc6445459da88e7eb55e..858ac511eedb327bb27af2ab9bf1fdc255656740 100755 (executable)
@@ -57,12 +57,15 @@ class TestMacroop(Macroop):
         microops["bah"] = Bah_Tweaked
     def untweak(self):
         microops["bah"] = Bah
+    def print_debug(self, message):
+        print message
 
     def __init__(self, name):
         super(TestMacroop, self).__init__(name)
         self.directives = {
             "tweak": self.tweak,
-            "untweak": self.untweak
+            "untweak": self.untweak,
+            "print": self.print_debug
         }
 
 assembler = MicroAssembler(TestMacroop, microops, Rom('main ROM'))
@@ -82,6 +85,7 @@ def macroop squishy {
     .tweak
     bah
     .untweak
+    .print "In the midst"
     bah
     dah # single line comment after something
     .tweak