Ruby: Simplify SLICC and Entry/TBE handling.
authorLisa Hsu <Lisa.Hsu@amd.com>
Fri, 1 Apr 2011 00:18:00 +0000 (17:18 -0700)
committerLisa Hsu <Lisa.Hsu@amd.com>
Fri, 1 Apr 2011 00:18:00 +0000 (17:18 -0700)
Before this changeset, all local variables of type Entry and TBE were considered
to be pointers, but an immediate use of said variables would not be automatically
deferenced in SLICC-generated code.  Instead, deferences occurred when such
variables were passed to functions, and were automatically dereferenced in
the bodies of the functions (e.g. the implicitly passed cache_entry).

This is a more general way to do it, which leaves in place the
assumption that parameters to functions and local variables of type AbstractCacheEntry
and TBE are always pointers, but instead of dereferencing to access member variables
on a contextual basis, the dereferencing automatically occurs on a type basis at the
moment a member is being accessed.  So, now, things you can do that you couldn't before
include:

Entry foo := getCacheEntry(address);
cache_entry.DataBlk := foo.DataBlk;

or

cache_entry.DataBlk := getCacheEntry(address).DataBlk;

or even

cache_entry.DataBlk := static_cast(Entry, pointer, cache.lookup(address)).DataBlk;

src/mem/slicc/ast/ActionDeclAST.py
src/mem/slicc/ast/FormalParamAST.py
src/mem/slicc/ast/FuncCallExprAST.py
src/mem/slicc/ast/IsValidPtrExprAST.py
src/mem/slicc/ast/MemberExprAST.py

index 2a8fb06392317be1632732f718529d59d6ef835f..8015523aba2a4426b3c3e9bab96df2c51c0c8b58 100644 (file)
@@ -59,12 +59,12 @@ class ActionDeclAST(DeclAST):
 
             if machine.TBEType != None:
                 var = Var(self.symtab, "tbe", self.location, machine.TBEType,
-                      "(*m_tbe_ptr)", self.pairs)
+                      "m_tbe_ptr", self.pairs)
                 self.symtab.newSymbol(var)
 
             if machine.EntryType != None:
                 var = Var(self.symtab, "cache_entry", self.location,
-                          machine.EntryType, "(*m_cache_entry_ptr)", self.pairs)
+                          machine.EntryType, "m_cache_entry_ptr", self.pairs)
                 self.symtab.newSymbol(var)
 
             # Do not allows returns in actions
index 142e837cc0117d020bb37286b2edd94d3621039f..783607f43ec848fc1df787cab8971649355ee3ab 100644 (file)
@@ -48,17 +48,12 @@ class FormalParamAST(AST):
         param = "param_%s" % self.ident
 
         # Add to symbol table
+        v = Var(self.symtab, self.ident, self.location, type, param,
+                self.pairs)
+        self.symtab.newSymbol(v)
         if self.pointer or str(type) == "TBE" or (
            "interface" in type and type["interface"] == "AbstractCacheEntry"):
 
-            v = Var(self.symtab, self.ident, self.location, type,
-                    "(*%s)" % param, self.pairs)
-            self.symtab.newSymbol(v)
             return type, "%s* %s" % (type.c_ident, param)
-
         else:
-            v = Var(self.symtab, self.ident, self.location, type, param,
-                    self.pairs)
-            self.symtab.newSymbol(v)
-
-        return type, "%s %s" % (type.c_ident, param)
+            return type, "%s %s" % (type.c_ident, param)
index 2c5e9ea4db815c8a31b37f300057b5bd0f288e16..75ec12344cd34658729726ee6311c7df54a10dfe 100644 (file)
@@ -217,22 +217,12 @@ if (!(${{cvec[0]}})) {
             first_param = True
 
             for (param_code, type) in zip(cvec, type_vec):
-                 if str(type) == "TBE" or ("interface" in type and
-                    type["interface"] == "AbstractCacheEntry"):
-
-                     if first_param:
-                         params = str(param_code).replace('*','')
-                         first_param  = False
-                     else:
-                         params += ', '
-                         params += str(param_code).replace('*','');
-                 else:
-                     if first_param:
-                         params = str(param_code)
-                         first_param  = False
-                     else:
-                         params += ', '
-                         params += str(param_code);
+                if first_param:
+                    params = str(param_code)
+                    first_param  = False
+                else:
+                    params += ', '
+                    params += str(param_code);
 
             fix = code.nofix()
             code('(${internal}${{func.c_ident}}($params))')
index 850f45e9604facc18d14a47496cdb1628d32d1ae..e68e084c051b6c1aeb274aa0e000fdd705df9f0b 100644 (file)
@@ -43,11 +43,10 @@ class IsValidPtrExprAST(ExprAST):
         fix = code.nofix()
         code("(")
         var_type, var_code = self.variable.inline(True);
-        var_code_str = str(var_code).replace('*','')
         if self.flag:
-            code("${var_code_str} != NULL)")
+            code("${var_code} != NULL)")
         else:
-            code("${var_code_str} == NULL)")
+            code("${var_code} == NULL)")
         code.fix(fix)
         type = self.symtab.find("bool", Type)
         return type
index 8f6b4a55c69370bda4404e10f09e607e6d189b27..a13205252f72a32a86a3ad2c540c7552b63e54ae 100644 (file)
@@ -40,7 +40,12 @@ class MemberExprAST(ExprAST):
     def generate(self, code):
         return_type, gcode = self.expr_ast.inline(True)
         fix = code.nofix()
-        code("($gcode).m_${{self.field}}")
+
+        if str(return_type) == "TBE" or ("interface" in return_type and return_type["interface"] == "AbstractCacheEntry"):
+            code("(*$gcode).m_${{self.field}}")
+        else:
+            code("($gcode).m_${{self.field}}")
+
         code.fix(fix)
 
         # Verify that this is a valid field name for this type