ruby: slicc: use default argument value
Before this patch, while one could declare / define a function with default argument values, but the actual function call would require one to specify all the arguments. This patch changes the check for function arguments. Now a function call needs to specify arguments that are at least as much as those with default values and at most the total number of arguments taken as input by the function.
This commit is contained in:
parent
7fc725fdb5
commit
9648c05db1
12 changed files with 69 additions and 40 deletions
|
@ -66,7 +66,7 @@ AbstractReplacementPolicy::~AbstractReplacementPolicy()
|
|||
}
|
||||
|
||||
Tick
|
||||
AbstractReplacementPolicy::getLastAccess(int64 set, int64 way)
|
||||
AbstractReplacementPolicy::getLastAccess(int64_t set, int64_t way)
|
||||
{
|
||||
return m_last_ref_ptr[set][way];
|
||||
}
|
||||
|
|
|
@ -44,13 +44,13 @@ class AbstractReplacementPolicy : public SimObject
|
|||
virtual ~AbstractReplacementPolicy();
|
||||
|
||||
/* touch a block. a.k.a. update timestamp */
|
||||
virtual void touch(int64 set, int64 way, Tick time) = 0;
|
||||
virtual void touch(int64_t set, int64_t way, Tick time) = 0;
|
||||
|
||||
/* returns the way to replace */
|
||||
virtual int64 getVictim(int64 set) const = 0;
|
||||
virtual int64_t getVictim(int64_t set) const = 0;
|
||||
|
||||
/* get the time of the last access */
|
||||
Tick getLastAccess(int64 set, int64 way);
|
||||
Tick getLastAccess(int64_t set, int64_t way);
|
||||
|
||||
virtual bool useOccupancy() const { return false; }
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ LRUReplacementPolicyParams::create()
|
|||
|
||||
|
||||
void
|
||||
LRUPolicy::touch(int64 set, int64 index, Tick time)
|
||||
LRUPolicy::touch(int64_t set, int64_t index, Tick time)
|
||||
{
|
||||
assert(index >= 0 && index < m_assoc);
|
||||
assert(set >= 0 && set < m_num_sets);
|
||||
|
@ -58,11 +58,11 @@ LRUPolicy::touch(int64 set, int64 index, Tick time)
|
|||
m_last_ref_ptr[set][index] = time;
|
||||
}
|
||||
|
||||
int64
|
||||
LRUPolicy::getVictim(int64 set) const
|
||||
int64_t
|
||||
LRUPolicy::getVictim(int64_t set) const
|
||||
{
|
||||
Tick time, smallest_time;
|
||||
int64 smallest_index;
|
||||
int64_t smallest_index;
|
||||
|
||||
smallest_index = 0;
|
||||
smallest_time = m_last_ref_ptr[set][0];
|
||||
|
|
|
@ -41,8 +41,8 @@ class LRUPolicy : public AbstractReplacementPolicy
|
|||
LRUPolicy(const Params * p);
|
||||
~LRUPolicy();
|
||||
|
||||
void touch(int64 set, int64 way, Tick time);
|
||||
int64 getVictim(int64 set) const;
|
||||
void touch(int64_t set, int64_t way, Tick time);
|
||||
int64_t getVictim(int64_t set) const;
|
||||
};
|
||||
|
||||
#endif // __MEM_RUBY_STRUCTURES_LRUPOLICY_HH__
|
||||
|
|
|
@ -38,7 +38,7 @@ PseudoLRUPolicy::PseudoLRUPolicy(const Params * p)
|
|||
// associativity cannot exceed capacity of tree representation
|
||||
assert(m_num_sets > 0 &&
|
||||
m_assoc > 1 &&
|
||||
m_assoc <= (int64) sizeof(uint64)*4);
|
||||
m_assoc <= (int64_t) sizeof(uint64_t)*4);
|
||||
|
||||
m_trees = NULL;
|
||||
m_num_levels = 0;
|
||||
|
@ -55,7 +55,7 @@ PseudoLRUPolicy::PseudoLRUPolicy(const Params * p)
|
|||
m_num_levels++;
|
||||
}
|
||||
assert(m_num_levels < sizeof(unsigned int)*4);
|
||||
m_trees = new uint64[m_num_sets];
|
||||
m_trees = new uint64_t[m_num_sets];
|
||||
for (unsigned i = 0; i < m_num_sets; i++) {
|
||||
m_trees[i] = 0;
|
||||
}
|
||||
|
@ -75,7 +75,7 @@ PseudoLRUPolicy::~PseudoLRUPolicy()
|
|||
}
|
||||
|
||||
void
|
||||
PseudoLRUPolicy::touch(int64 set, int64 index, Tick time)
|
||||
PseudoLRUPolicy::touch(int64_t set, int64_t index, Tick time)
|
||||
{
|
||||
assert(index >= 0 && index < m_assoc);
|
||||
assert(set >= 0 && set < m_num_sets);
|
||||
|
@ -93,10 +93,10 @@ PseudoLRUPolicy::touch(int64 set, int64 index, Tick time)
|
|||
m_last_ref_ptr[set][index] = time;
|
||||
}
|
||||
|
||||
int64
|
||||
PseudoLRUPolicy::getVictim(int64 set) const
|
||||
int64_t
|
||||
PseudoLRUPolicy::getVictim(int64_t set) const
|
||||
{
|
||||
int64 index = 0;
|
||||
int64_t index = 0;
|
||||
|
||||
int tree_index = 0;
|
||||
int node_val;
|
||||
|
|
|
@ -53,13 +53,13 @@ class PseudoLRUPolicy : public AbstractReplacementPolicy
|
|||
PseudoLRUPolicy(const Params * p);
|
||||
~PseudoLRUPolicy();
|
||||
|
||||
void touch(int64 set, int64 way, Tick time);
|
||||
int64 getVictim(int64 set) const;
|
||||
void touch(int64_t set, int64_t way, Tick time);
|
||||
int64_t getVictim(int64_t set) const;
|
||||
|
||||
private:
|
||||
unsigned int m_effective_assoc; /** nearest (to ceiling) power of 2 */
|
||||
unsigned int m_num_levels; /** number of levels in the tree */
|
||||
uint64* m_trees; /** bit representation of the
|
||||
uint64_t *m_trees; /** bit representation of the
|
||||
* trees, one for each set */
|
||||
};
|
||||
|
||||
|
|
|
@ -67,6 +67,6 @@ class EnumDeclAST(DeclAST):
|
|||
pairs = { "external" : "yes" }
|
||||
func = Func(self.symtab, func_id + "_" + t.c_ident,
|
||||
func_id, self.location,
|
||||
self.symtab.find("std::string", Type), [ t ], [], "",
|
||||
self.symtab.find("std::string", Type), [ t ], [], [], "",
|
||||
pairs)
|
||||
self.symtab.newSymbol(func)
|
||||
|
|
|
@ -46,6 +46,9 @@ class FormalParamAST(AST):
|
|||
def generate(self):
|
||||
type = self.type_ast.type
|
||||
param = "param_%s" % self.ident
|
||||
proto = ""
|
||||
body = ""
|
||||
default = False
|
||||
|
||||
# Add to symbol table
|
||||
v = Var(self.symtab, self.ident, self.location, type, param,
|
||||
|
@ -56,6 +59,21 @@ class FormalParamAST(AST):
|
|||
"interface" in type and (
|
||||
type["interface"] == "AbstractCacheEntry" or
|
||||
type["interface"] == "AbstractEntry")):
|
||||
return type, "%s* %s" % (type.c_ident, param)
|
||||
proto = "%s* %s" % (type.c_ident, param)
|
||||
body = proto
|
||||
elif self.default != None:
|
||||
value = ""
|
||||
if self.default == True:
|
||||
value = "true"
|
||||
elif self.default == False:
|
||||
value = "false"
|
||||
else:
|
||||
return type, "const %s& %s" % (type.c_ident, param)
|
||||
value = "%s" % self.default
|
||||
proto = "const %s& %s = %s" % (type.c_ident, param, value)
|
||||
body = "const %s& %s" % (type.c_ident, param)
|
||||
default = True
|
||||
else:
|
||||
proto = "const %s& %s" % (type.c_ident, param)
|
||||
body = proto
|
||||
|
||||
return type, proto, body, default
|
||||
|
|
|
@ -45,7 +45,9 @@ class FuncDeclAST(DeclAST):
|
|||
|
||||
def generate(self, parent = None):
|
||||
types = []
|
||||
params = []
|
||||
proto_params = []
|
||||
body_params = []
|
||||
default_count = 0
|
||||
void_type = self.symtab.find("void", Type)
|
||||
|
||||
# Generate definition code
|
||||
|
@ -58,13 +60,17 @@ class FuncDeclAST(DeclAST):
|
|||
for formal in self.formals:
|
||||
# Lookup parameter types
|
||||
try:
|
||||
type, ident = formal.generate()
|
||||
type, proto, body, default = formal.generate()
|
||||
types.append(type)
|
||||
params.append(ident)
|
||||
proto_params.append(proto)
|
||||
body_params.append(body)
|
||||
if default:
|
||||
default_count += 1
|
||||
|
||||
except AttributeError:
|
||||
types.append(formal.type)
|
||||
params.append(None)
|
||||
proto_params.append(None)
|
||||
body_params.append(None)
|
||||
|
||||
body = self.slicc.codeFormatter()
|
||||
if self.statements is None:
|
||||
|
@ -87,7 +93,8 @@ class FuncDeclAST(DeclAST):
|
|||
|
||||
machine = self.state_machine
|
||||
func = Func(self.symtab, func_name_args, self.ident, self.location,
|
||||
return_type, types, params, str(body), self.pairs)
|
||||
return_type, types, proto_params,
|
||||
body_params, str(body), self.pairs, default_count)
|
||||
|
||||
if parent is not None:
|
||||
if not parent.addFunc(func):
|
||||
|
|
|
@ -89,13 +89,13 @@ class InPortDeclAST(DeclAST):
|
|||
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)
|
||||
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", "stallPort", self.location,
|
||||
void_type, [], [], "", pairs)
|
||||
void_type, [], [], [], "", pairs)
|
||||
symtab.newSymbol(func)
|
||||
|
||||
param_types = []
|
||||
|
|
|
@ -66,7 +66,7 @@ class StateDeclAST(DeclAST):
|
|||
pairs = { "external" : "yes" }
|
||||
func = Func(self.symtab, func_id + "_" +
|
||||
t.ident, func_id, self.location,
|
||||
self.symtab.find("std::string", Type), [ t ], [], "",
|
||||
self.symtab.find("std::string", Type), [ t ], [], [], "",
|
||||
pairs)
|
||||
self.symtab.newSymbol(func)
|
||||
|
||||
|
@ -76,6 +76,6 @@ class StateDeclAST(DeclAST):
|
|||
pairs = { "external" : "yes" }
|
||||
func = Func(self.symtab, func_id + "_" +
|
||||
t.ident, func_id, self.location,
|
||||
self.symtab.find("AccessPermission", Type), [ t ], [], "",
|
||||
self.symtab.find("AccessPermission", Type), [ t ], [], [], "",
|
||||
pairs)
|
||||
self.symtab.newSymbol(func)
|
||||
|
|
|
@ -30,16 +30,19 @@ from slicc.symbols.Type import Type
|
|||
|
||||
class Func(Symbol):
|
||||
def __init__(self, table, ident, name, location, return_type, param_types,
|
||||
param_strings, body, pairs):
|
||||
proto_param_strings, body_param_strings, body,
|
||||
pairs, default_count = 0):
|
||||
super(Func, self).__init__(table, ident, location, pairs)
|
||||
self.return_type = return_type
|
||||
self.param_types = param_types
|
||||
self.param_strings = param_strings
|
||||
self.proto_param_strings = proto_param_strings
|
||||
self.body_param_strings = body_param_strings
|
||||
self.body = body
|
||||
self.isInternalMachineFunc = False
|
||||
self.c_ident = ident
|
||||
self.c_name = name
|
||||
self.class_name = ""
|
||||
self.default_count = default_count
|
||||
|
||||
def __repr__(self):
|
||||
return ""
|
||||
|
@ -57,16 +60,17 @@ class Func(Symbol):
|
|||
return_type += "*"
|
||||
|
||||
return "%s %s(%s);" % (return_type, self.c_name,
|
||||
", ".join(self.param_strings))
|
||||
", ".join(self.proto_param_strings))
|
||||
|
||||
def writeCodeFiles(self, path, includes):
|
||||
return
|
||||
|
||||
def checkArguments(self, args):
|
||||
if len(args) != len(self.param_types):
|
||||
if len(args) + self.default_count < len(self.param_types) or \
|
||||
len(args) > len(self.param_types):
|
||||
self.error("Wrong number of arguments passed to function: '%s'" + \
|
||||
" Expected %d, got %d", self.c_ident,
|
||||
len(self.param_types), len(args))
|
||||
" Expected at least: %d, got: %d", self.c_ident,
|
||||
len(self.param_types) - self.default_count, len(args))
|
||||
|
||||
cvec = []
|
||||
type_vec = []
|
||||
|
@ -91,14 +95,14 @@ class Func(Symbol):
|
|||
code = self.symtab.codeFormatter()
|
||||
|
||||
# Generate function header
|
||||
void_type = self.symtab.find("void", Type)
|
||||
return_type = self.return_type.c_ident
|
||||
void_type = self.symtab.find("void", Type)
|
||||
if "return_by_ref" in self and self.return_type != void_type:
|
||||
return_type += "&"
|
||||
if "return_by_pointer" in self and self.return_type != void_type:
|
||||
return_type += "*"
|
||||
|
||||
params = ', '.join(self.param_strings)
|
||||
params = ', '.join(self.body_param_strings)
|
||||
|
||||
code('''
|
||||
$return_type
|
||||
|
|
Loading…
Reference in a new issue