changeset 9a087e046c58 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=9a087e046c58
description:
        ruby: allow function definition in slicc structs
        This patch adds support for function definitions to appear in slicc 
structs.
        This is required for supporting functional accesses for different types 
of
        messages. Subsequent patches will use this to development.

diffstat:

 src/mem/protocol/RubySlicc_Types.sm     |   2 --
 src/mem/slicc/ast/EnumDeclAST.py        |   2 +-
 src/mem/slicc/ast/FuncDeclAST.py        |  13 ++++++++++---
 src/mem/slicc/ast/InPortDeclAST.py      |   6 +++---
 src/mem/slicc/ast/MachineAST.py         |   2 +-
 src/mem/slicc/ast/StateDeclAST.py       |   4 ++--
 src/mem/slicc/ast/TypeFieldEnumAST.py   |   2 +-
 src/mem/slicc/ast/TypeFieldMemberAST.py |   2 +-
 src/mem/slicc/ast/TypeFieldMethodAST.py |   6 ++++--
 src/mem/slicc/ast/TypeFieldStateAST.py  |   2 +-
 src/mem/slicc/parser.py                 |  19 ++++++++++++++++---
 src/mem/slicc/symbols/Func.py           |  16 +++-------------
 src/mem/slicc/symbols/Type.py           |  28 +++++++++++++++++++++++++---
 13 files changed, 68 insertions(+), 36 deletions(-)

diffs (truncated from 332 to 300 lines):

diff -r b6d1e257d488 -r 9a087e046c58 src/mem/protocol/RubySlicc_Types.sm
--- a/src/mem/protocol/RubySlicc_Types.sm       Mon Oct 15 17:27:15 2012 -0500
+++ b/src/mem/protocol/RubySlicc_Types.sm       Mon Oct 15 17:27:16 2012 -0500
@@ -51,8 +51,6 @@
 external_type(NodeID, default="0", primitive="yes");
 external_type(MachineID);
 
-MessageBuffer getMandatoryQueue(int core_id);
-
 structure (Set, external = "yes", non_obj="yes") {
   void setSize(int);
   void add(NodeID);
diff -r b6d1e257d488 -r 9a087e046c58 src/mem/slicc/ast/EnumDeclAST.py
--- a/src/mem/slicc/ast/EnumDeclAST.py  Mon Oct 15 17:27:15 2012 -0500
+++ b/src/mem/slicc/ast/EnumDeclAST.py  Mon Oct 15 17:27:16 2012 -0500
@@ -67,5 +67,5 @@
         pairs = { "external" : "yes" }
         func = Func(self.symtab, func_id, self.location,
                     self.symtab.find("std::string", Type), [ t ], [], "",
-                    pairs, None)
+                    pairs)
         self.symtab.newSymbol(func)
diff -r b6d1e257d488 -r 9a087e046c58 src/mem/slicc/ast/FuncDeclAST.py
--- a/src/mem/slicc/ast/FuncDeclAST.py  Mon Oct 15 17:27:15 2012 -0500
+++ b/src/mem/slicc/ast/FuncDeclAST.py  Mon Oct 15 17:27:16 2012 -0500
@@ -43,7 +43,7 @@
     def files(self, parent=None):
         return set()
 
-    def generate(self):
+    def generate(self, parent = None):
         types = []
         params = []
         void_type = self.symtab.find("void", Type)
@@ -71,9 +71,16 @@
 
         machine = self.state_machine
         func = Func(self.symtab, self.ident, self.location, return_type,
-                    types, params, str(body), self.pairs, machine)
+                    types, params, str(body), self.pairs)
 
-        if machine is not None:
+        if parent is not None:
+            if not parent.addFunc(func):
+                self.error("Duplicate method: %s:%s()" % (parent, self.ident))
+            func.class_name = parent.c_ident
+
+        elif machine is not None:
             machine.addFunc(func)
+            func.isInternalMachineFunc = True
+            func.class_name = "%s_Controller" % machine
         else:
             self.symtab.newSymbol(func)
diff -r b6d1e257d488 -r 9a087e046c58 src/mem/slicc/ast/InPortDeclAST.py
--- a/src/mem/slicc/ast/InPortDeclAST.py        Mon Oct 15 17:27:15 2012 -0500
+++ b/src/mem/slicc/ast/InPortDeclAST.py        Mon Oct 15 17:27:16 2012 -0500
@@ -91,7 +91,7 @@
         # Add the trigger method - FIXME, this is a bit dirty
         pairs = { "external" : "yes" }
         func = Func(self.symtab, "trigger", self.location, void_type,
-                    param_types, [], "", pairs, None)
+                    param_types, [], "", pairs)
         symtab.newSymbol(func)
 
         param_types = []
@@ -117,13 +117,13 @@
         # checks before calling double trigger to ensure that won't
         # happen
         func = Func(self.symtab, "doubleTrigger", self.location, void_type,
-                    param_types, [], "", pairs, None)
+                    param_types, [], "", pairs)
         symtab.newSymbol(func)
 
         # Add the continueProcessing method - this hack supports
         # messages that don't trigger events
         func = Func(self.symtab, "continueProcessing", self.location,
-                    void_type, [], [], "", pairs, None)
+                    void_type, [], [], "", pairs)
         symtab.newSymbol(func)
 
         if self.statements is not None:
diff -r b6d1e257d488 -r 9a087e046c58 src/mem/slicc/ast/MachineAST.py
--- a/src/mem/slicc/ast/MachineAST.py   Mon Oct 15 17:27:15 2012 -0500
+++ b/src/mem/slicc/ast/MachineAST.py   Mon Oct 15 17:27:16 2012 -0500
@@ -76,7 +76,7 @@
     def findMachines(self):
         # Add to MachineType enumeration
         machine_type = self.symtab.find("MachineType", Type)
-        if not machine_type.enumAdd(self.ident, self.pairs_ast.pairs):
+        if not machine_type.addEnum(self.ident, self.pairs_ast.pairs):
             self.error("Duplicate machine name: %s:%s" % (machine_type,
                                                           self.ident))
 
diff -r b6d1e257d488 -r 9a087e046c58 src/mem/slicc/ast/StateDeclAST.py
--- a/src/mem/slicc/ast/StateDeclAST.py Mon Oct 15 17:27:15 2012 -0500
+++ b/src/mem/slicc/ast/StateDeclAST.py Mon Oct 15 17:27:16 2012 -0500
@@ -66,7 +66,7 @@
         pairs = { "external" : "yes" }
         func = Func(self.symtab, func_id, self.location,
                     self.symtab.find("std::string", Type), [ t ], [], "",
-                    pairs, None)
+                    pairs)
         self.symtab.newSymbol(func)
 
         # Add the State_to_permission method
@@ -75,5 +75,5 @@
         pairs = { "external" : "yes" }
         func = Func(self.symtab, func_id, self.location,
                     self.symtab.find("AccessPermission", Type), [ t ], [], "",
-                    pairs, None)
+                    pairs)
         self.symtab.newSymbol(func)
diff -r b6d1e257d488 -r 9a087e046c58 src/mem/slicc/ast/TypeFieldEnumAST.py
--- a/src/mem/slicc/ast/TypeFieldEnumAST.py     Mon Oct 15 17:27:15 2012 -0500
+++ b/src/mem/slicc/ast/TypeFieldEnumAST.py     Mon Oct 15 17:27:16 2012 -0500
@@ -43,7 +43,7 @@
             self.error("States must in a State Declaration, not a normal 
enum.")
         
         # Add enumeration
-        if not type.enumAdd(self.field_id, self.pairs_ast.pairs):
+        if not type.addEnum(self.field_id, self.pairs_ast.pairs):
             self.error("Duplicate enumeration: %s:%s" % (type, self.field_id))
 
         # Fill machine info
diff -r b6d1e257d488 -r 9a087e046c58 src/mem/slicc/ast/TypeFieldMemberAST.py
--- a/src/mem/slicc/ast/TypeFieldMemberAST.py   Mon Oct 15 17:27:15 2012 -0500
+++ b/src/mem/slicc/ast/TypeFieldMemberAST.py   Mon Oct 15 17:27:16 2012 -0500
@@ -51,7 +51,7 @@
                            (field_type, rvalue_type))
 
         # Add data member to the parent type
-        if not type.dataMemberAdd(self.field_id, field_type, self.pairs,
+        if not type.addDataMember(self.field_id, field_type, self.pairs,
                                   init_code):
 
             self.error("Duplicate data member: %s:%s" % (type_ptr, field_id))
diff -r b6d1e257d488 -r 9a087e046c58 src/mem/slicc/ast/TypeFieldMethodAST.py
--- a/src/mem/slicc/ast/TypeFieldMethodAST.py   Mon Oct 15 17:27:15 2012 -0500
+++ b/src/mem/slicc/ast/TypeFieldMethodAST.py   Mon Oct 15 17:27:16 2012 -0500
@@ -28,12 +28,14 @@
 from slicc.ast.TypeFieldAST import TypeFieldAST
 
 class TypeFieldMethodAST(TypeFieldAST):
-    def __init__(self, slicc, return_type_ast, ident, type_asts, pairs):
+    def __init__(self, slicc, return_type_ast, ident, type_asts, pairs,
+        statements = None):
         super(TypeFieldMethodAST, self).__init__(slicc, pairs)
 
         self.return_type_ast = return_type_ast
         self.ident = ident
         self.type_asts = type_asts
+        self.statements = statements
 
     def __repr__(self):
         return ""
@@ -46,5 +48,5 @@
         types = [ t.type for t in self.type_asts ]
 
         # Add method
-        if not type.methodAdd(self.ident, return_type, types):
+        if not type.addMethod(self.ident, return_type, types):
             self.error("Duplicate method: %s:%s()" % (type, self.ident))
diff -r b6d1e257d488 -r 9a087e046c58 src/mem/slicc/ast/TypeFieldStateAST.py
--- a/src/mem/slicc/ast/TypeFieldStateAST.py    Mon Oct 15 17:27:15 2012 -0500
+++ b/src/mem/slicc/ast/TypeFieldStateAST.py    Mon Oct 15 17:27:16 2012 -0500
@@ -45,7 +45,7 @@
             self.error("State Declaration must be of type State.")
         
         # Add enumeration
-        if not type.enumAdd(self.field_id, self.pairs_ast.pairs):
+        if not type.addEnum(self.field_id, self.pairs_ast.pairs):
             self.error("Duplicate enumeration: %s:%s" % (type, self.field_id))
 
         # Fill machine info
diff -r b6d1e257d488 -r 9a087e046c58 src/mem/slicc/parser.py
--- a/src/mem/slicc/parser.py   Mon Oct 15 17:27:15 2012 -0500
+++ b/src/mem/slicc/parser.py   Mon Oct 15 17:27:16 2012 -0500
@@ -315,14 +315,23 @@
         "decl : type ident pairs SEMI"
         p[0] = ast.ObjDeclAST(self, p[1], p[2], p[3])
 
+    # Function definition and declaration
     def p_decl__func_decl(self, p):
-        """decl : void ident '(' params ')' pairs SEMI
+        "decl : func_decl"
+        p[0] = p[1]
+
+    def p_func_decl__0(self, p):
+        """func_decl :  void ident '(' params ')' pairs SEMI
                 | type ident '(' params ')' pairs SEMI"""
         p[0] = ast.FuncDeclAST(self, p[1], p[2], p[4], p[6], None)
 
     def p_decl__func_def(self, p):
-        """decl : void ident '(' params ')' pairs statements
-                | type ident '(' params ')' pairs statements"""
+        "decl : func_def"
+        p[0] = p[1]
+
+    def p_func_def__0(self, p):
+        """func_def : void ident '(' params ')' pairs statements
+            | type ident '(' params ')' pairs statements"""
         p[0] = ast.FuncDeclAST(self, p[1], p[2], p[4], p[6], p[7])
 
     # Type fields
@@ -338,6 +347,10 @@
         "type_member : type_or_void ident '(' types ')' pairs SEMI"
         p[0] = ast.TypeFieldMethodAST(self, p[1], p[2], p[4], p[6])
 
+    def p_type_method__1(self, p):
+        "type_member : type_or_void ident '(' params ')' pairs statements"
+        p[0] = ast.FuncDeclAST(self, p[1], p[2], p[4], p[6], p[7])
+
     def p_type_member__1(self, p):
         "type_member : type_or_void ident pairs SEMI"
         p[0] = ast.TypeFieldMemberAST(self, p[1], p[2], p[3], None)
diff -r b6d1e257d488 -r 9a087e046c58 src/mem/slicc/symbols/Func.py
--- a/src/mem/slicc/symbols/Func.py     Mon Oct 15 17:27:15 2012 -0500
+++ b/src/mem/slicc/symbols/Func.py     Mon Oct 15 17:27:16 2012 -0500
@@ -30,7 +30,7 @@
 
 class Func(Symbol):
     def __init__(self, table, ident, location, return_type, param_types,
-                 param_strings, body, pairs, machine):
+                 param_strings, body, pairs):
         super(Func, self).__init__(table, ident, location, pairs)
         self.return_type = return_type
         self.param_types = param_types
@@ -38,12 +38,7 @@
         self.body = body
         self.isInternalMachineFunc = False
         self.c_ident = ident
-
-        if machine is None or "external" in self or "primitive" in self:
-            pass
-        else:
-            self.machineStr = str(machine)
-            self.isInternalMachineFunc = True
+        self.class_name = ""
 
     def __repr__(self):
         return ""
@@ -81,16 +76,11 @@
         if "return_by_pointer" in self and self.return_type != void_type:
             return_type += "*"
 
-        if self.isInternalMachineFunc:
-            klass = "%s_Controller" % self.machineStr
-        else:
-            self.error("No class found for the function %s" % self.ident)
-
         params = ', '.join(self.param_strings)
 
         code('''
 $return_type
-${klass}::${{self.c_ident}}($params)
+${{self.class_name}}::${{self.c_ident}}($params)
 {
 ${{self.body}}
 }
diff -r b6d1e257d488 -r 9a087e046c58 src/mem/slicc/symbols/Type.py
--- a/src/mem/slicc/symbols/Type.py     Mon Oct 15 17:27:15 2012 -0500
+++ b/src/mem/slicc/symbols/Type.py     Mon Oct 15 17:27:16 2012 -0500
@@ -107,6 +107,7 @@
 
         # Methods
         self.methods = {}
+        self.functions = {}
 
         # Enums
         self.enums = orderdict()
@@ -143,7 +144,7 @@
         return "interface" in self
 
     # Return false on error
-    def dataMemberAdd(self, ident, type, pairs, init_code):
+    def addDataMember(self, ident, type, pairs, init_code):
         if ident in self.data_members:
             return False
 
@@ -164,7 +165,7 @@
     def statePermPairAdd(self, state_name, perm_name):
         self.statePermPairs.append([state_name, perm_name])
 
-    def methodAdd(self, name, return_type, param_type_vec):
+    def addMethod(self, name, return_type, param_type_vec):
         ident = self.methodId(name, param_type_vec)
         if ident in self.methods:
             return False
@@ -172,7 +173,18 @@
         self.methods[ident] = Method(return_type, param_type_vec)
         return True
 
-    def enumAdd(self, ident, pairs):
+    # Ideally either this function or the one above should exist. But
+    # methods and functions have different structures right now.
+    # Hence, these are different, at least for the time being.
+    def addFunc(self, func):
+        ident = self.methodId(func.ident, func.param_types)
+        if ident in self.functions:
+            return False
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to