ruby: remove some unused things in slicc
This patch removes the parts of slicc that were required for multi-chip protocols. Going ahead, it seems multi-chip protocols would be implemented by playing with the network itself.
This commit is contained in:
parent
3c9d3b16d8
commit
73eafe4849
8 changed files with 5 additions and 280 deletions
|
@ -1,74 +0,0 @@
|
||||||
# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
|
|
||||||
# Copyright (c) 2009 The Hewlett-Packard Development Company
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met: redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer;
|
|
||||||
# redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in the
|
|
||||||
# documentation and/or other materials provided with the distribution;
|
|
||||||
# neither the name of the copyright holders nor the names of its
|
|
||||||
# contributors may be used to endorse or promote products derived from
|
|
||||||
# this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
from slicc.ast.StatementAST import StatementAST
|
|
||||||
|
|
||||||
class CheckStopSlotsStatementAST(StatementAST):
|
|
||||||
def __init__(self, slicc, variable, condStr, bankStr):
|
|
||||||
super(StatementAST, self).__init__(slicc)
|
|
||||||
self.variable = variable
|
|
||||||
self.condStr = condStr
|
|
||||||
self.bankStr = bankStr
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "[CheckStopSlotsStatementAst: %r]" % self.variable
|
|
||||||
|
|
||||||
def generate(self, code, return_type):
|
|
||||||
# Make sure the variable is valid
|
|
||||||
self.variable.var
|
|
||||||
|
|
||||||
def findResources(self, resources):
|
|
||||||
var = self.variable.var
|
|
||||||
assert var not in self.resources
|
|
||||||
|
|
||||||
check_code = self.slicc.codeFormatter()
|
|
||||||
if self.condStr == "((*in_msg_ptr)).m_isOnChipSearch":
|
|
||||||
check_code('''
|
|
||||||
const Response9Msg* in_msg_ptr =
|
|
||||||
dynamic_cast<const Response9Msg*>(((*(m_chip_ptr.m_L2Cache_responseToL2Cache9_vec[m_version]))).peek());
|
|
||||||
assert(in_msg_ptr != NULL);
|
|
||||||
''')
|
|
||||||
|
|
||||||
vcode = self.variable.inline()
|
|
||||||
bank = self.bankStr
|
|
||||||
cond = self.condStr
|
|
||||||
|
|
||||||
check_code('''
|
|
||||||
if ($cond) {
|
|
||||||
auto pos = m_chip_ptr.m_DNUCAmover_ptr->getBankPos($bank)
|
|
||||||
|
|
||||||
if (!$vcode.isDisableSPossible(pos)) {
|
|
||||||
return TransitionResult_ResourceStall;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!$vcode.isDisableFPossible(pos)) {
|
|
||||||
return TransitionResult_ResourceStall;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
''')
|
|
||||||
|
|
||||||
resources[var] = str(check_code)
|
|
|
@ -1,161 +0,0 @@
|
||||||
# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
|
|
||||||
# Copyright (c) 2009 The Hewlett-Packard Development Company
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met: redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer;
|
|
||||||
# redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in the
|
|
||||||
# documentation and/or other materials provided with the distribution;
|
|
||||||
# neither the name of the copyright holders nor the names of its
|
|
||||||
# contributors may be used to endorse or promote products derived from
|
|
||||||
# this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
import re
|
|
||||||
|
|
||||||
from slicc.ast.ExprAST import ExprAST
|
|
||||||
from slicc.symbols import Type
|
|
||||||
|
|
||||||
class ChipComponentAccessAST(ExprAST):
|
|
||||||
def __init__(self, slicc, machine, mach_version, component):
|
|
||||||
super(ChipComponentAccessAST, self).__init__(slicc)
|
|
||||||
self.mach_var = machine
|
|
||||||
self.comp_var = component
|
|
||||||
self.mach_ver_expr = mach_version
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "[ChipAccessExpr: %r]" % self.expr_vec
|
|
||||||
|
|
||||||
def generate(self, code):
|
|
||||||
void_type = self.symtab.find("void", Type)
|
|
||||||
|
|
||||||
mname = self.mach_var.name
|
|
||||||
cname = self.comp_var.name
|
|
||||||
var = self.symtab.machine_components[mname][cname]
|
|
||||||
|
|
||||||
vcode = str(var.code)
|
|
||||||
|
|
||||||
if self.chip_ver_expr is not None:
|
|
||||||
# replace self.chip with specified chip
|
|
||||||
gcode = "g_system.getChip(%s)" % self.chip_ver_expr.inline()
|
|
||||||
vcode = re.sub("m_chip", gcode, vcode)
|
|
||||||
|
|
||||||
# replace default "m_version" with the version we really want
|
|
||||||
gcode = "(%s)" % self.mach_ver_expr.inline()
|
|
||||||
vcode = re.sub("m_version", gcode, vcode)
|
|
||||||
|
|
||||||
return_type, gcode = self.generate_access(var)
|
|
||||||
code("($vcode)$gcode")
|
|
||||||
return return_type
|
|
||||||
|
|
||||||
class ChipMethodAccessAST(ChipComponentAccessAST):
|
|
||||||
def __init__(self, slicc, chip_version, machine, mach_version, component,
|
|
||||||
proc_name, expr_vec):
|
|
||||||
s = super(ChipMethodAccessAST, self)
|
|
||||||
s.__init__(slicc, machine, mach_version, component)
|
|
||||||
|
|
||||||
self.chip_ver_expr = chip_version
|
|
||||||
self.expr_vec = expr_vec
|
|
||||||
self.proc_name = proc_name
|
|
||||||
|
|
||||||
def generate_access(self, var):
|
|
||||||
# generate code
|
|
||||||
paramTypes = []
|
|
||||||
gcode = []
|
|
||||||
for expr in self.expr_vec:
|
|
||||||
t,c = expr.generate()
|
|
||||||
paramTypes.append(t)
|
|
||||||
gcode.append(c)
|
|
||||||
|
|
||||||
methodId = var.type.methodId(self.proc_name, paramTypes)
|
|
||||||
|
|
||||||
# Verify that this is a method of the object
|
|
||||||
if not var.type.methodExist(methodId):
|
|
||||||
self.error("%s: Type '%s' does not have a method '%s'" % \
|
|
||||||
("Invalid method call", var.type, methodId))
|
|
||||||
|
|
||||||
expected_size = len(var.type.methodParamType(methodId))
|
|
||||||
if len(self.expr_vec) != expected_size:
|
|
||||||
# Right number of parameters
|
|
||||||
self.error("Wrong number of parameters for function name: " +\
|
|
||||||
"'%s', expected: %d, actual: %d",
|
|
||||||
self.proc_name, expected_size, len(self.expr_vec))
|
|
||||||
|
|
||||||
for expr,expected,actual in zip(self.expr_vec,
|
|
||||||
var.type.methodParamType(methodId),
|
|
||||||
paramTypes):
|
|
||||||
# Check the types of the parameter
|
|
||||||
if actual != expected:
|
|
||||||
expr.error("Type mismatch: expected: %s actual: %s",
|
|
||||||
expected, actual)
|
|
||||||
|
|
||||||
# method call
|
|
||||||
code = ".%s(%s)" % (self.proc_name, ', '.join(gcode))
|
|
||||||
|
|
||||||
# Return the return type of the method
|
|
||||||
return var.type.methodReturnType(methodId), code
|
|
||||||
|
|
||||||
class LocalChipMethodAST(ChipMethodAccessAST):
|
|
||||||
# method call from local chip
|
|
||||||
def __init__(self, slicc, machine, mach_version, component, proc_name,
|
|
||||||
expr_vec):
|
|
||||||
s = super(LocalChipMethodAST, self)
|
|
||||||
s.__init__(slicc, None, machine, mach_version, component, proc_name,
|
|
||||||
expr_vec)
|
|
||||||
|
|
||||||
class SpecifiedChipMethodAST(ChipMethodAccessAST):
|
|
||||||
# method call from specified chip
|
|
||||||
def __init__(self, slicc, chip_version, machine, mach_version, component,
|
|
||||||
proc_name, expr_vec):
|
|
||||||
s = super(SpecifiedChipMethodAST, self)
|
|
||||||
s.__init__(slicc, chip_version, machine, mach_version, component,
|
|
||||||
proc_name, expr_vec)
|
|
||||||
|
|
||||||
class ChipMemberAccessAST(ChipComponentAccessAST):
|
|
||||||
# member access from specified chip
|
|
||||||
def __init__(self, chip_version, machine, mach_version, component,
|
|
||||||
field_name):
|
|
||||||
s = super(ChipMemberAccessAST, self)
|
|
||||||
s.__init__(slicc, machine, mach_version, component)
|
|
||||||
|
|
||||||
self.chip_ver_expr = chip_version
|
|
||||||
self.field_name = field_name
|
|
||||||
|
|
||||||
def generate_access(self, var):
|
|
||||||
# Verify that this is a valid field name for this type
|
|
||||||
if not var.type.dataMemberExist(self.field_name):
|
|
||||||
self.error("Invalid object field: " +\
|
|
||||||
"Type '%s' does not have data member %s",
|
|
||||||
var.type, self.field_name)
|
|
||||||
|
|
||||||
code += ").m_%s" % self.field_name
|
|
||||||
|
|
||||||
return var.type.dataMemberType(self.field_name), code
|
|
||||||
|
|
||||||
class LocalChipMemberAST(ChipMemberAccessAST):
|
|
||||||
# member access from local chip
|
|
||||||
def __init__(self, slicc, machine, mach_version, component, field_name):
|
|
||||||
s = super(LocalChipMemberAST, self)
|
|
||||||
s.__init__(slicc, None, machine, mach_version, component, field_name)
|
|
||||||
|
|
||||||
class SpecifiedChipMemberAST(ChipMemberAccessAST):
|
|
||||||
# member access from specified chip
|
|
||||||
def __init__(self, chip_version, machine, mach_version, component,
|
|
||||||
field_name):
|
|
||||||
s = super(SpecifiedChipMemberAST, self)
|
|
||||||
s.__init__(slicc, chip_version, machine, mach_version, component,
|
|
||||||
field_name)
|
|
|
@ -206,12 +206,8 @@ if (!(${{cvec[0]}})) {
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# Normal function
|
# Normal function
|
||||||
|
|
||||||
# if the func is internal to the chip but not the machine
|
|
||||||
# then it can only be accessed through the chip pointer
|
|
||||||
internal = ""
|
|
||||||
if "external" not in func and not func.isInternalMachineFunc:
|
if "external" not in func and not func.isInternalMachineFunc:
|
||||||
internal = "m_chip_ptr->"
|
self.error("Invalid function")
|
||||||
|
|
||||||
params = ""
|
params = ""
|
||||||
first_param = True
|
first_param = True
|
||||||
|
@ -225,7 +221,7 @@ if (!(${{cvec[0]}})) {
|
||||||
params += str(param_code);
|
params += str(param_code);
|
||||||
|
|
||||||
fix = code.nofix()
|
fix = code.nofix()
|
||||||
code('(${internal}${{func.c_ident}}($params))')
|
code('(${{func.c_ident}}($params))')
|
||||||
code.fix(fix)
|
code.fix(fix)
|
||||||
|
|
||||||
return func.return_type
|
return func.return_type
|
||||||
|
|
|
@ -41,8 +41,6 @@ class ObjDeclAST(DeclAST):
|
||||||
def generate(self):
|
def generate(self):
|
||||||
machineComponentSym = False
|
machineComponentSym = False
|
||||||
|
|
||||||
self["chip_object"] = "yes"
|
|
||||||
|
|
||||||
if "hack" in self:
|
if "hack" in self:
|
||||||
warning("'hack=' is now deprecated")
|
warning("'hack=' is now deprecated")
|
||||||
|
|
||||||
|
@ -70,9 +68,7 @@ class ObjDeclAST(DeclAST):
|
||||||
|
|
||||||
# FIXME : should all use accessors here to avoid public member
|
# FIXME : should all use accessors here to avoid public member
|
||||||
# variables
|
# variables
|
||||||
if self.ident == "id":
|
if self.ident == "version":
|
||||||
c_code = "m_chip_ptr.getID()"
|
|
||||||
elif self.ident == "version":
|
|
||||||
c_code = "m_version"
|
c_code = "m_version"
|
||||||
elif self.ident == "machineID":
|
elif self.ident == "machineID":
|
||||||
c_code = "m_machineID"
|
c_code = "m_machineID"
|
||||||
|
|
|
@ -30,8 +30,6 @@ from slicc.ast.AST import *
|
||||||
from slicc.ast.ActionDeclAST import *
|
from slicc.ast.ActionDeclAST import *
|
||||||
from slicc.ast.AssignStatementAST import *
|
from slicc.ast.AssignStatementAST import *
|
||||||
from slicc.ast.CheckAllocateStatementAST import *
|
from slicc.ast.CheckAllocateStatementAST import *
|
||||||
from slicc.ast.CheckStopSlotsStatementAST import *
|
|
||||||
from slicc.ast.ChipComponentAccessAST import *
|
|
||||||
from slicc.ast.CopyHeadStatementAST import *
|
from slicc.ast.CopyHeadStatementAST import *
|
||||||
from slicc.ast.DeclAST import *
|
from slicc.ast.DeclAST import *
|
||||||
from slicc.ast.DeclListAST import *
|
from slicc.ast.DeclListAST import *
|
||||||
|
|
|
@ -121,8 +121,6 @@ class SLICC(Grammar):
|
||||||
'is_invalid' : 'IS_INVALID',
|
'is_invalid' : 'IS_INVALID',
|
||||||
'else' : 'ELSE',
|
'else' : 'ELSE',
|
||||||
'return' : 'RETURN',
|
'return' : 'RETURN',
|
||||||
'THIS' : 'THIS',
|
|
||||||
'CHIP' : 'CHIP',
|
|
||||||
'void' : 'VOID',
|
'void' : 'VOID',
|
||||||
'new' : 'NEW',
|
'new' : 'NEW',
|
||||||
'OOD' : 'OOD',
|
'OOD' : 'OOD',
|
||||||
|
@ -619,27 +617,6 @@ class SLICC(Grammar):
|
||||||
"aexpr : OOD"
|
"aexpr : OOD"
|
||||||
p[0] = ast.OodAST(self)
|
p[0] = ast.OodAST(self)
|
||||||
|
|
||||||
# globally access a local chip component and call a method
|
|
||||||
def p_expr__local_chip_method(self, p):
|
|
||||||
"aexpr : THIS DOT var '[' expr ']' DOT var DOT ident '(' exprs ')'"
|
|
||||||
p[0] = ast.LocalChipMethodAST(self, p[3], p[5], p[8], p[10], p[12])
|
|
||||||
|
|
||||||
# globally access a local chip component and access a data member
|
|
||||||
def p_expr__local_chip_member(self, p):
|
|
||||||
"aexpr : THIS DOT var '[' expr ']' DOT var DOT field"
|
|
||||||
p[0] = ast.LocalChipMemberAST(self, p[3], p[5], p[8], p[10])
|
|
||||||
|
|
||||||
# globally access a specified chip component and call a method
|
|
||||||
def p_expr__specified_chip_method(self, p):
|
|
||||||
"aexpr : CHIP '[' expr ']' DOT var '[' expr ']' DOT var DOT ident '(' exprs ')'"
|
|
||||||
p[0] = ast.SpecifiedChipMethodAST(self, p[3], p[6], p[8], p[11], p[13],
|
|
||||||
p[15])
|
|
||||||
|
|
||||||
# globally access a specified chip component and access a data member
|
|
||||||
def p_expr__specified_chip_member(self, p):
|
|
||||||
"aexpr : CHIP '[' expr ']' DOT var '[' expr ']' DOT var DOT field"
|
|
||||||
p[0] = ast.SpecifiedChipMemberAST(self, p[3], p[6], p[8], p[11], p[13])
|
|
||||||
|
|
||||||
def p_expr__member(self, p):
|
def p_expr__member(self, p):
|
||||||
"aexpr : aexpr DOT ident"
|
"aexpr : aexpr DOT ident"
|
||||||
p[0] = ast.MemberExprAST(self, p[1], p[3])
|
p[0] = ast.MemberExprAST(self, p[1], p[3])
|
||||||
|
@ -718,7 +695,3 @@ class SLICC(Grammar):
|
||||||
def p_var(self, p):
|
def p_var(self, p):
|
||||||
"var : ident"
|
"var : ident"
|
||||||
p[0] = ast.VarExprAST(self, p[1])
|
p[0] = ast.VarExprAST(self, p[1])
|
||||||
|
|
||||||
def p_field(self, p):
|
|
||||||
"field : ident"
|
|
||||||
p[0] = p[1]
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ class Func(Symbol):
|
||||||
if self.isInternalMachineFunc:
|
if self.isInternalMachineFunc:
|
||||||
klass = "%s_Controller" % self.machineStr
|
klass = "%s_Controller" % self.machineStr
|
||||||
else:
|
else:
|
||||||
klass = "Chip"
|
self.error("No class found for the function %s" % self.ident)
|
||||||
|
|
||||||
params = ', '.join(self.param_strings)
|
params = ', '.join(self.param_strings)
|
||||||
|
|
||||||
|
|
|
@ -246,10 +246,7 @@ extern std::stringstream ${ident}_transitionComment;
|
||||||
|
|
||||||
class $c_ident : public AbstractController
|
class $c_ident : public AbstractController
|
||||||
{
|
{
|
||||||
// the coherence checker needs to call isBlockExclusive() and isBlockShared()
|
public:
|
||||||
// making the Chip a friend class is an easy way to do this for now
|
|
||||||
|
|
||||||
public:
|
|
||||||
typedef ${c_ident}Params Params;
|
typedef ${c_ident}Params Params;
|
||||||
$c_ident(const Params *p);
|
$c_ident(const Params *p);
|
||||||
static int getNumControllers();
|
static int getNumControllers();
|
||||||
|
|
Loading…
Reference in a new issue