summaryrefslogtreecommitdiff
path: root/src/mem/slicc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/slicc')
-rw-r--r--src/mem/slicc/ast/EnumDeclAST.py3
-rw-r--r--src/mem/slicc/ast/FuncCallExprAST.py12
-rw-r--r--src/mem/slicc/ast/FuncDeclAST.py15
-rw-r--r--src/mem/slicc/ast/InPortDeclAST.py11
-rw-r--r--src/mem/slicc/ast/StateDeclAST.py6
-rw-r--r--src/mem/slicc/symbols/Func.py7
-rw-r--r--src/mem/slicc/symbols/Transition.py2
7 files changed, 40 insertions, 16 deletions
diff --git a/src/mem/slicc/ast/EnumDeclAST.py b/src/mem/slicc/ast/EnumDeclAST.py
index acddcb91f..d97c13483 100644
--- a/src/mem/slicc/ast/EnumDeclAST.py
+++ b/src/mem/slicc/ast/EnumDeclAST.py
@@ -65,7 +65,8 @@ class EnumDeclAST(DeclAST):
func_id = "%s_to_string" % t.c_ident
pairs = { "external" : "yes" }
- func = Func(self.symtab, func_id, self.location,
+ func = Func(self.symtab, func_id + "_" + t.c_ident,
+ func_id, self.location,
self.symtab.find("std::string", Type), [ t ], [], "",
pairs)
self.symtab.newSymbol(func)
diff --git a/src/mem/slicc/ast/FuncCallExprAST.py b/src/mem/slicc/ast/FuncCallExprAST.py
index 8aebad336..9336a2297 100644
--- a/src/mem/slicc/ast/FuncCallExprAST.py
+++ b/src/mem/slicc/ast/FuncCallExprAST.py
@@ -80,12 +80,18 @@ class FuncCallExprAST(ExprAST):
code("APPEND_TRANSITION_COMMENT($0)", self.exprs[0].inline())
return self.symtab.find("void", Type)
+ func_name_args = self.proc_name
+
+ for expr in self.exprs:
+ actual_type,param_code = expr.inline(True)
+ func_name_args += "_" + str(actual_type.ident)
+
# Look up the function in the symbol table
- func = self.symtab.find(self.proc_name, Func)
+ func = self.symtab.find(func_name_args, Func)
# Check the types and get the code for the parameters
if func is None:
- self.error("Unrecognized function name: '%s'", self.proc_name)
+ self.error("Unrecognized function name: '%s'", func_name_args)
if len(self.exprs) != len(func.param_types):
self.error("Wrong number of arguments passed to function : '%s'" +\
@@ -193,7 +199,7 @@ if (!(${{cvec[0]}})) {
params += str(param_code);
fix = code.nofix()
- code('(${{func.c_ident}}($params))')
+ code('(${{func.c_name}}($params))')
code.fix(fix)
return func.return_type
diff --git a/src/mem/slicc/ast/FuncDeclAST.py b/src/mem/slicc/ast/FuncDeclAST.py
index 052d9f05e..47ae7076e 100644
--- a/src/mem/slicc/ast/FuncDeclAST.py
+++ b/src/mem/slicc/ast/FuncDeclAST.py
@@ -74,9 +74,20 @@ class FuncDeclAST(DeclAST):
self.symtab.popFrame()
+ func_name_args = self.ident
+
+ if parent is None:
+ for arg in self.formals:
+ from slicc.ast import FormalParamAST
+ if isinstance(arg, FormalParamAST):
+ arg_name = arg.type_ast.ident
+ else:
+ arg_name = arg
+ func_name_args += "_" + str(arg_name)
+
machine = self.state_machine
- func = Func(self.symtab, self.ident, self.location, return_type,
- types, params, str(body), self.pairs)
+ func = Func(self.symtab, func_name_args, self.ident, self.location,
+ return_type, types, params, str(body), self.pairs)
if parent is not None:
if not parent.addFunc(func):
diff --git a/src/mem/slicc/ast/InPortDeclAST.py b/src/mem/slicc/ast/InPortDeclAST.py
index c5a1435eb..da7357580 100644
--- a/src/mem/slicc/ast/InPortDeclAST.py
+++ b/src/mem/slicc/ast/InPortDeclAST.py
@@ -85,14 +85,17 @@ 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)
+ trigger_func_name = "trigger"
+ for param in param_types:
+ trigger_func_name += "_" + param.ident
+ func = Func(self.symtab, trigger_func_name, "trigger", self.location,
+ void_type, param_types, [], "", pairs)
symtab.newSymbol(func)
# Add the stallPort method - this hacks reschedules the controller
# for stalled messages that don't trigger events
- func = Func(self.symtab, "stallPort", self.location, void_type, [],
- [], "", pairs)
+ func = Func(self.symtab, "stallPort", "stallPort", self.location,
+ void_type, [], [], "", pairs)
symtab.newSymbol(func)
param_types = []
diff --git a/src/mem/slicc/ast/StateDeclAST.py b/src/mem/slicc/ast/StateDeclAST.py
index 2bca54d09..f0a0b97d3 100644
--- a/src/mem/slicc/ast/StateDeclAST.py
+++ b/src/mem/slicc/ast/StateDeclAST.py
@@ -64,7 +64,8 @@ class StateDeclAST(DeclAST):
func_id = "%s_to_string" % t.c_ident
pairs = { "external" : "yes" }
- func = Func(self.symtab, func_id, self.location,
+ func = Func(self.symtab, func_id + "_" +
+ t.ident, func_id, self.location,
self.symtab.find("std::string", Type), [ t ], [], "",
pairs)
self.symtab.newSymbol(func)
@@ -73,7 +74,8 @@ class StateDeclAST(DeclAST):
func_id = "%s_to_permission" % t.c_ident
pairs = { "external" : "yes" }
- func = Func(self.symtab, func_id, self.location,
+ func = Func(self.symtab, func_id + "_" +
+ t.ident, func_id, self.location,
self.symtab.find("AccessPermission", Type), [ t ], [], "",
pairs)
self.symtab.newSymbol(func)
diff --git a/src/mem/slicc/symbols/Func.py b/src/mem/slicc/symbols/Func.py
index a52b6bbcc..d50d0309f 100644
--- a/src/mem/slicc/symbols/Func.py
+++ b/src/mem/slicc/symbols/Func.py
@@ -29,7 +29,7 @@ from slicc.symbols.Symbol import Symbol
from slicc.symbols.Type import Type
class Func(Symbol):
- def __init__(self, table, ident, location, return_type, param_types,
+ def __init__(self, table, ident, name, location, return_type, param_types,
param_strings, body, pairs):
super(Func, self).__init__(table, ident, location, pairs)
self.return_type = return_type
@@ -38,6 +38,7 @@ class Func(Symbol):
self.body = body
self.isInternalMachineFunc = False
self.c_ident = ident
+ self.c_name = name
self.class_name = ""
def __repr__(self):
@@ -55,7 +56,7 @@ class Func(Symbol):
elif "return_by_pointer" in self and self.return_type != void_type:
return_type += "*"
- return "%s %s(%s);" % (return_type, self.c_ident,
+ return "%s %s(%s);" % (return_type, self.c_name,
", ".join(self.param_strings))
def writeCodeFiles(self, path, includes):
@@ -80,7 +81,7 @@ class Func(Symbol):
code('''
$return_type
-${{self.class_name}}::${{self.c_ident}}($params)
+${{self.class_name}}::${{self.c_name}}($params)
{
${{self.body}}
}
diff --git a/src/mem/slicc/symbols/Transition.py b/src/mem/slicc/symbols/Transition.py
index 9ecd6c54b..856d3f4b0 100644
--- a/src/mem/slicc/symbols/Transition.py
+++ b/src/mem/slicc/symbols/Transition.py
@@ -40,7 +40,7 @@ class Transition(Symbol):
# check to make sure there is a getNextState function declared
found = False
for func in machine.functions:
- if func.c_ident == 'getNextState':
+ if func.c_ident == 'getNextState_Address':
found = True
break
if found == False: