X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Farch%2Fmicro_asm.py;h=4e5400ceffe8d075ecf935cc64f6b9968aef7184;hb=04e196f4223b5dfd61782edaaac27166a2bfcf3c;hp=7fb7b3f6d1c8955fe85ff884136fc6b7c11f0f08;hpb=85caab4e8c91bcbe08803773be7f0222b660dcf7;p=gem5.git diff --git a/src/arch/micro_asm.py b/src/arch/micro_asm.py index 7fb7b3f6d..4e5400cef 100644 --- a/src/arch/micro_asm.py +++ b/src/arch/micro_asm.py @@ -34,10 +34,6 @@ import traceback # get type names from types import * -# Prepend the directory where the PLY lex & yacc modules are found -# to the search path. -sys.path[0:0] = [os.environ['M5_PLY']] - from ply import lex from ply import yacc @@ -55,7 +51,7 @@ class Micro_Container(object): self.micro_classes = {} self.labels = {} - def add_microop(self, microop): + def add_microop(self, mnemonic, microop): self.microops.append(microop) def __str__(self): @@ -127,24 +123,34 @@ def print_error(message): def handle_statement(parser, container, statement): if statement.is_microop: + if statement.mnemonic not in parser.microops.keys(): + raise Exception, "Unrecognized mnemonic: %s" % statement.mnemonic + parser.symbols["__microopClassFromInsideTheAssembler"] = \ + parser.microops[statement.mnemonic] try: - microop = eval('parser.microops[statement.mnemonic](%s)' % - statement.params) + microop = eval('__microopClassFromInsideTheAssembler(%s)' % + statement.params, {}, parser.symbols) except: - print_error("Error creating microop object.") + print_error("Error creating microop object with mnemonic %s." % \ + statement.mnemonic) raise try: for label in statement.labels: - container.labels[label.name] = microop - if label.extern: - container.externs[label.name] = microop - container.add_microop(microop) + container.labels[label.text] = microop + if label.is_extern: + container.externs[label.text] = microop + container.add_microop(statement.mnemonic, microop) except: print_error("Error adding microop.") raise elif statement.is_directive: + if statement.name not in container.directives.keys(): + raise Exception, "Unrecognized directive: %s" % statement.name + parser.symbols["__directiveFunctionFromInsideTheAssembler"] = \ + container.directives[statement.name] try: - eval('container.directives[statement.name](%s)' % statement.params) + eval('__directiveFunctionFromInsideTheAssembler(%s)' % + statement.params, {}, parser.symbols) except: print_error("Error executing directive.") print container.directives @@ -197,74 +203,88 @@ reserved_map = { } for r in reserved: reserved_map[r.lower()] = r +# Ignore comments def t_ANY_COMMENT(t): r'\#[^\n]*(?=\n)' - #print "t_ANY_COMMENT %s" % t.value def t_ANY_MULTILINECOMMENT(t): r'/\*([^/]|((?