summaryrefslogtreecommitdiff
path: root/src/mem/slicc/ast
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/slicc/ast')
-rw-r--r--src/mem/slicc/ast/EnumDeclAST.py2
-rw-r--r--src/mem/slicc/ast/FuncDeclAST.py13
-rw-r--r--src/mem/slicc/ast/InPortDeclAST.py6
-rw-r--r--src/mem/slicc/ast/MachineAST.py2
-rw-r--r--src/mem/slicc/ast/StateDeclAST.py4
-rw-r--r--src/mem/slicc/ast/TypeFieldEnumAST.py2
-rw-r--r--src/mem/slicc/ast/TypeFieldMemberAST.py2
-rw-r--r--src/mem/slicc/ast/TypeFieldMethodAST.py6
-rw-r--r--src/mem/slicc/ast/TypeFieldStateAST.py2
9 files changed, 24 insertions, 15 deletions
diff --git a/src/mem/slicc/ast/EnumDeclAST.py b/src/mem/slicc/ast/EnumDeclAST.py
index da07a0165..acddcb91f 100644
--- a/src/mem/slicc/ast/EnumDeclAST.py
+++ b/src/mem/slicc/ast/EnumDeclAST.py
@@ -67,5 +67,5 @@ class EnumDeclAST(DeclAST):
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 --git a/src/mem/slicc/ast/FuncDeclAST.py b/src/mem/slicc/ast/FuncDeclAST.py
index 54b0f2c59..1d7e2c3ff 100644
--- a/src/mem/slicc/ast/FuncDeclAST.py
+++ b/src/mem/slicc/ast/FuncDeclAST.py
@@ -43,7 +43,7 @@ class FuncDeclAST(DeclAST):
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 @@ class FuncDeclAST(DeclAST):
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 --git a/src/mem/slicc/ast/InPortDeclAST.py b/src/mem/slicc/ast/InPortDeclAST.py
index c6fadb9e7..376315eed 100644
--- a/src/mem/slicc/ast/InPortDeclAST.py
+++ b/src/mem/slicc/ast/InPortDeclAST.py
@@ -91,7 +91,7 @@ class InPortDeclAST(DeclAST):
# 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 @@ class InPortDeclAST(DeclAST):
# 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 --git a/src/mem/slicc/ast/MachineAST.py b/src/mem/slicc/ast/MachineAST.py
index 6cefe8374..c48d2aef1 100644
--- a/src/mem/slicc/ast/MachineAST.py
+++ b/src/mem/slicc/ast/MachineAST.py
@@ -76,7 +76,7 @@ class MachineAST(DeclAST):
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 --git a/src/mem/slicc/ast/StateDeclAST.py b/src/mem/slicc/ast/StateDeclAST.py
index a1bbd74ae..2bca54d09 100644
--- a/src/mem/slicc/ast/StateDeclAST.py
+++ b/src/mem/slicc/ast/StateDeclAST.py
@@ -66,7 +66,7 @@ class StateDeclAST(DeclAST):
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 @@ class StateDeclAST(DeclAST):
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 --git a/src/mem/slicc/ast/TypeFieldEnumAST.py b/src/mem/slicc/ast/TypeFieldEnumAST.py
index 1255c972a..5ebb516d3 100644
--- a/src/mem/slicc/ast/TypeFieldEnumAST.py
+++ b/src/mem/slicc/ast/TypeFieldEnumAST.py
@@ -43,7 +43,7 @@ class TypeFieldEnumAST(TypeFieldAST):
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 --git a/src/mem/slicc/ast/TypeFieldMemberAST.py b/src/mem/slicc/ast/TypeFieldMemberAST.py
index a60153664..26d3ab2c6 100644
--- a/src/mem/slicc/ast/TypeFieldMemberAST.py
+++ b/src/mem/slicc/ast/TypeFieldMemberAST.py
@@ -51,7 +51,7 @@ class TypeFieldMemberAST(TypeFieldAST):
(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 --git a/src/mem/slicc/ast/TypeFieldMethodAST.py b/src/mem/slicc/ast/TypeFieldMethodAST.py
index 2c8cf3f7b..b89f7f97e 100644
--- a/src/mem/slicc/ast/TypeFieldMethodAST.py
+++ b/src/mem/slicc/ast/TypeFieldMethodAST.py
@@ -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 @@ class TypeFieldMethodAST(TypeFieldAST):
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 --git a/src/mem/slicc/ast/TypeFieldStateAST.py b/src/mem/slicc/ast/TypeFieldStateAST.py
index aafa241dd..d2b253218 100644
--- a/src/mem/slicc/ast/TypeFieldStateAST.py
+++ b/src/mem/slicc/ast/TypeFieldStateAST.py
@@ -45,7 +45,7 @@ class TypeFieldStateAST(TypeFieldAST):
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