summaryrefslogtreecommitdiff
path: root/src/mem/slicc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/slicc')
-rw-r--r--src/mem/slicc/ast/OperatorExprAST.py (renamed from src/mem/slicc/ast/InfixOperatorExprAST.py)21
-rw-r--r--src/mem/slicc/ast/__init__.py2
-rw-r--r--src/mem/slicc/parser.py8
-rw-r--r--src/mem/slicc/symbols/StateMachine.py6
4 files changed, 31 insertions, 6 deletions
diff --git a/src/mem/slicc/ast/InfixOperatorExprAST.py b/src/mem/slicc/ast/OperatorExprAST.py
index 31bf9bd1a..df074b9f0 100644
--- a/src/mem/slicc/ast/InfixOperatorExprAST.py
+++ b/src/mem/slicc/ast/OperatorExprAST.py
@@ -68,6 +68,7 @@ class InfixOperatorExprAST(ExprAST):
expected_types = [("int", "int", "int"),
("Cycles", "Cycles", "Cycles"),
("Cycles", "int", "Cycles"),
+ ("Scalar", "int", "Scalar"),
("int", "Cycles", "Cycles")]
else:
self.error("No operator matched with {0}!" .format(self.op))
@@ -89,3 +90,23 @@ class InfixOperatorExprAST(ExprAST):
code("($lcode ${{self.op}} $rcode)")
code.fix(fix)
return self.symtab.find(output, Type)
+
+class PrefixOperatorExprAST(ExprAST):
+ def __init__(self, slicc, op, operand):
+ super(PrefixOperatorExprAST, self).__init__(slicc)
+
+ self.op = op
+ self.operand = operand
+
+ def __repr__(self):
+ return "[PrefixExpr: %s %r]" % (self.op, self.operand)
+
+ def generate(self, code):
+ opcode = self.slicc.codeFormatter()
+ optype = self.operand.generate(opcode)
+
+ fix = code.nofix()
+ code("(${{self.op}} $opcode)")
+ code.fix(fix)
+
+ return self.symtab.find("void", Type)
diff --git a/src/mem/slicc/ast/__init__.py b/src/mem/slicc/ast/__init__.py
index c2baea8df..bd9de52d0 100644
--- a/src/mem/slicc/ast/__init__.py
+++ b/src/mem/slicc/ast/__init__.py
@@ -43,7 +43,6 @@ from slicc.ast.FuncCallExprAST import *
from slicc.ast.FuncDeclAST import *
from slicc.ast.IfStatementAST import *
from slicc.ast.InPortDeclAST import *
-from slicc.ast.InfixOperatorExprAST import *
from slicc.ast.IsValidPtrExprAST import *
from slicc.ast.LiteralExprAST import *
from slicc.ast.LocalVariableAST import *
@@ -53,6 +52,7 @@ from slicc.ast.MethodCallExprAST import *
from slicc.ast.NewExprAST import *
from slicc.ast.OodAST import *
from slicc.ast.ObjDeclAST import *
+from slicc.ast.OperatorExprAST import *
from slicc.ast.OutPortDeclAST import *
from slicc.ast.PairAST import *
from slicc.ast.PairListAST import *
diff --git a/src/mem/slicc/parser.py b/src/mem/slicc/parser.py
index 78b842f74..96e029ecf 100644
--- a/src/mem/slicc/parser.py
+++ b/src/mem/slicc/parser.py
@@ -132,6 +132,7 @@ class SLICC(Grammar):
'LEFTSHIFT', 'RIGHTSHIFT',
'NOT', 'AND', 'OR',
'PLUS', 'DASH', 'STAR', 'SLASH',
+ 'INCR', 'DECR',
'DOUBLE_COLON', 'SEMI',
'ASSIGN', 'DOT',
'IDENT', 'LIT_BOOL', 'FLOATNUMBER', 'NUMBER', 'STRING' ]
@@ -156,8 +157,11 @@ class SLICC(Grammar):
t_SEMI = r';'
t_ASSIGN = r':='
t_DOT = r'\.'
+ t_INCR = r'\+\+'
+ t_DECR = r'--'
precedence = (
+ ('left', 'INCR', 'DECR'),
('left', 'AND', 'OR'),
('left', 'EQ', 'NE'),
('left', 'LT', 'GT', 'LE', 'GE'),
@@ -670,8 +674,10 @@ class SLICC(Grammar):
# FIXME - unary not
def p_expr__unary_op(self, p):
"""expr : NOT expr
+ | INCR expr
+ | DECR expr
| DASH expr %prec UMINUS"""
- p[0] = PrefixOperatorExpr(p[1], p[2])
+ p[0] = ast.PrefixOperatorExprAST(self, p[1], p[2])
def p_expr__parens(self, p):
"aexpr : '(' expr ')'"
diff --git a/src/mem/slicc/symbols/StateMachine.py b/src/mem/slicc/symbols/StateMachine.py
index f650f5809..c2ee42553 100644
--- a/src/mem/slicc/symbols/StateMachine.py
+++ b/src/mem/slicc/symbols/StateMachine.py
@@ -768,8 +768,7 @@ $c_ident::printStats(ostream& out) const
# them. Print out these stats before dumping state transition stats.
#
for param in self.config_parameters:
- if param.type_ast.type.ident == "CacheMemory" or \
- param.type_ast.type.ident == "DirectoryMemory" or \
+ if param.type_ast.type.ident == "DirectoryMemory" or \
param.type_ast.type.ident == "MemoryControl":
assert(param.pointer)
code(' m_${{param.ident}}_ptr->printStats(out);')
@@ -787,8 +786,7 @@ void $c_ident::clearStats() {
# them. These stats must be cleared too.
#
for param in self.config_parameters:
- if param.type_ast.type.ident == "CacheMemory" or \
- param.type_ast.type.ident == "MemoryControl":
+ if param.type_ast.type.ident == "MemoryControl":
assert(param.pointer)
code(' m_${{param.ident}}_ptr->clearStats();')