Fix file/line reported for duplicate parameter declarations.
We need to retain the old parameter information until we have reported the error.
This commit is contained in:
parent
d3bced57cc
commit
628f5645bf
2
Module.h
2
Module.h
|
|
@ -97,7 +97,7 @@ class Module : public PScopeExtra, public PNamedItem {
|
|||
/* specparams are simpler than other parameters, in that they
|
||||
can have a range, but not an explicit type. The restrictions
|
||||
are enforced by the parser. */
|
||||
map<perm_string,param_expr_t>specparams;
|
||||
map<perm_string,param_expr_t*>specparams;
|
||||
|
||||
/* The module also has defparam assignments which don't create
|
||||
new parameters within the module, but may be used to set
|
||||
|
|
|
|||
4
PScope.h
4
PScope.h
|
|
@ -105,8 +105,8 @@ class LexicalScope {
|
|||
|
||||
SymbolType symbol_type() const;
|
||||
};
|
||||
map<perm_string,param_expr_t>parameters;
|
||||
map<perm_string,param_expr_t>localparams;
|
||||
map<perm_string,param_expr_t*>parameters;
|
||||
map<perm_string,param_expr_t*>localparams;
|
||||
|
||||
// Defined types in the scope.
|
||||
map<perm_string,data_type_t*>typedefs;
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ void set_scope_timescale(Design*des, NetScope*scope, PScope*pscope)
|
|||
des->set_precision(pscope->time_precision);
|
||||
}
|
||||
|
||||
typedef map<perm_string,LexicalScope::param_expr_t>::const_iterator mparm_it_t;
|
||||
typedef map<perm_string,LexicalScope::param_expr_t*>::const_iterator mparm_it_t;
|
||||
|
||||
static void collect_parm_item_(Design*des, NetScope*scope, perm_string name,
|
||||
const LexicalScope::param_expr_t&cur,
|
||||
|
|
@ -110,59 +110,59 @@ static void collect_parm_item_(Design*des, NetScope*scope, perm_string name,
|
|||
}
|
||||
|
||||
static void collect_scope_parameters_(Design*des, NetScope*scope,
|
||||
const map<perm_string,LexicalScope::param_expr_t>¶meters)
|
||||
const map<perm_string,LexicalScope::param_expr_t*>¶meters)
|
||||
{
|
||||
for (mparm_it_t cur = parameters.begin()
|
||||
; cur != parameters.end() ; ++ cur ) {
|
||||
|
||||
// A parameter can not have the same name as a genvar.
|
||||
if (scope->find_genvar((*cur).first)) {
|
||||
cerr << cur->second.get_fileline()
|
||||
cerr << cur->second->get_fileline()
|
||||
<< ": error: parameter and genvar in '"
|
||||
<< scope->fullname() << "' have the same name '"
|
||||
<< (*cur).first << "'." << endl;
|
||||
des->errors += 1;
|
||||
}
|
||||
|
||||
collect_parm_item_(des, scope, (*cur).first, (*cur).second, false, false);
|
||||
collect_parm_item_(des, scope, cur->first, *(cur->second), false, false);
|
||||
}
|
||||
}
|
||||
|
||||
static void collect_scope_localparams_(Design*des, NetScope*scope,
|
||||
const map<perm_string,LexicalScope::param_expr_t>&localparams)
|
||||
const map<perm_string,LexicalScope::param_expr_t*>&localparams)
|
||||
{
|
||||
for (mparm_it_t cur = localparams.begin()
|
||||
; cur != localparams.end() ; ++ cur ) {
|
||||
|
||||
// A localparam can not have the same name as a genvar.
|
||||
if (scope->find_genvar((*cur).first)) {
|
||||
cerr << cur->second.get_fileline()
|
||||
cerr << cur->second->get_fileline()
|
||||
<< ": error: localparam and genvar in '"
|
||||
<< scope->fullname() << "' have the same name '"
|
||||
<< (*cur).first << "'." << endl;
|
||||
des->errors += 1;
|
||||
}
|
||||
|
||||
collect_parm_item_(des, scope, (*cur).first, (*cur).second, false, true);
|
||||
collect_parm_item_(des, scope, cur->first, *(cur->second), false, true);
|
||||
}
|
||||
}
|
||||
|
||||
static void collect_scope_specparams_(Design*des, NetScope*scope,
|
||||
const map<perm_string,LexicalScope::param_expr_t>&specparams)
|
||||
const map<perm_string,LexicalScope::param_expr_t*>&specparams)
|
||||
{
|
||||
for (mparm_it_t cur = specparams.begin()
|
||||
; cur != specparams.end() ; ++ cur ) {
|
||||
|
||||
// A specparam can not have the same name as a genvar.
|
||||
if (scope->find_genvar((*cur).first)) {
|
||||
cerr << cur->second.get_fileline()
|
||||
cerr << cur->second->get_fileline()
|
||||
<< ": error: specparam and genvar in '"
|
||||
<< scope->fullname() << "' have the same name '"
|
||||
<< (*cur).first << "'." << endl;
|
||||
des->errors += 1;
|
||||
}
|
||||
|
||||
collect_parm_item_(des, scope, (*cur).first, (*cur).second, true, false);
|
||||
collect_parm_item_(des, scope, cur->first, *(cur->second), true, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
77
pform.cc
77
pform.cc
|
|
@ -3059,27 +3059,28 @@ void pform_set_parameter(const struct vlltype&loc,
|
|||
}
|
||||
|
||||
assert(expr);
|
||||
Module::param_expr_t&parm = scope->parameters[name];
|
||||
FILE_NAME(&parm, loc);
|
||||
Module::param_expr_t*parm = new Module::param_expr_t();
|
||||
FILE_NAME(parm, loc);
|
||||
|
||||
parm.expr = expr;
|
||||
add_local_symbol(scope, name, parm);
|
||||
scope->parameters[name] = parm;
|
||||
|
||||
parm.type = type;
|
||||
parm->expr = expr;
|
||||
|
||||
parm->type = type;
|
||||
if (range) {
|
||||
assert(range->size() == 1);
|
||||
pform_range_t&rng = range->front();
|
||||
assert(rng.first);
|
||||
assert(rng.second);
|
||||
parm.msb = rng.first;
|
||||
parm.lsb = rng.second;
|
||||
parm->msb = rng.first;
|
||||
parm->lsb = rng.second;
|
||||
} else {
|
||||
parm.msb = 0;
|
||||
parm.lsb = 0;
|
||||
parm->msb = 0;
|
||||
parm->lsb = 0;
|
||||
}
|
||||
parm.signed_flag = signed_flag;
|
||||
parm.range = value_range;
|
||||
|
||||
add_local_symbol(scope, name, &parm);
|
||||
parm->signed_flag = signed_flag;
|
||||
parm->range = value_range;
|
||||
|
||||
// Only a Module keeps the position of the parameter.
|
||||
if ((dynamic_cast<Module*>(scope)) && (scope == pform_cur_module.front()))
|
||||
|
|
@ -3097,27 +3098,28 @@ void pform_set_localparam(const struct vlltype&loc,
|
|||
}
|
||||
|
||||
assert(expr);
|
||||
Module::param_expr_t&parm = scope->localparams[name];
|
||||
FILE_NAME(&parm, loc);
|
||||
Module::param_expr_t*parm = new Module::param_expr_t();
|
||||
FILE_NAME(parm, loc);
|
||||
|
||||
parm.expr = expr;
|
||||
add_local_symbol(scope, name, parm);
|
||||
scope->localparams[name] = parm;
|
||||
|
||||
parm.type = type;
|
||||
parm->expr = expr;
|
||||
|
||||
parm->type = type;
|
||||
if (range) {
|
||||
assert(range->size() == 1);
|
||||
pform_range_t&rng = range->front();
|
||||
assert(rng.first);
|
||||
assert(rng.second);
|
||||
parm.msb = rng.first;
|
||||
parm.lsb = rng.second;
|
||||
parm->msb = rng.first;
|
||||
parm->lsb = rng.second;
|
||||
} else {
|
||||
parm.msb = 0;
|
||||
parm.lsb = 0;
|
||||
parm->msb = 0;
|
||||
parm->lsb = 0;
|
||||
}
|
||||
parm.signed_flag = signed_flag;
|
||||
parm.range = 0;
|
||||
|
||||
add_local_symbol(scope, name, &parm);
|
||||
parm->signed_flag = signed_flag;
|
||||
parm->range = 0;
|
||||
}
|
||||
|
||||
void pform_set_specparam(const struct vlltype&loc, perm_string name,
|
||||
|
|
@ -3128,28 +3130,29 @@ void pform_set_specparam(const struct vlltype&loc, perm_string name,
|
|||
assert(scope == lexical_scope);
|
||||
|
||||
assert(expr);
|
||||
Module::param_expr_t&parm = pform_cur_module.front()->specparams[name];
|
||||
FILE_NAME(&parm, loc);
|
||||
Module::param_expr_t*parm = new Module::param_expr_t();
|
||||
FILE_NAME(parm, loc);
|
||||
|
||||
parm.expr = expr;
|
||||
add_local_symbol(scope, name, parm);
|
||||
pform_cur_module.front()->specparams[name] = parm;
|
||||
|
||||
parm->expr = expr;
|
||||
|
||||
if (range) {
|
||||
assert(range->size() == 1);
|
||||
pform_range_t&rng = range->front();
|
||||
assert(rng.first);
|
||||
assert(rng.second);
|
||||
parm.type = IVL_VT_LOGIC;
|
||||
parm.msb = rng.first;
|
||||
parm.lsb = rng.second;
|
||||
parm->type = IVL_VT_LOGIC;
|
||||
parm->msb = rng.first;
|
||||
parm->lsb = rng.second;
|
||||
} else {
|
||||
parm.type = IVL_VT_NO_TYPE;
|
||||
parm.msb = 0;
|
||||
parm.lsb = 0;
|
||||
parm->type = IVL_VT_NO_TYPE;
|
||||
parm->msb = 0;
|
||||
parm->lsb = 0;
|
||||
}
|
||||
parm.signed_flag = false;
|
||||
parm.range = 0;
|
||||
|
||||
add_local_symbol(scope, name, &parm);
|
||||
parm->signed_flag = false;
|
||||
parm->range = 0;
|
||||
}
|
||||
|
||||
void pform_set_defparam(const pform_name_t&name, PExpr*expr)
|
||||
|
|
|
|||
|
|
@ -1359,22 +1359,22 @@ void LexicalScope::dump_typedefs_(ostream&out, unsigned indent) const
|
|||
|
||||
void LexicalScope::dump_parameters_(ostream&out, unsigned indent) const
|
||||
{
|
||||
typedef map<perm_string,param_expr_t>::const_iterator parm_iter_t;
|
||||
typedef map<perm_string,param_expr_t*>::const_iterator parm_iter_t;
|
||||
for (parm_iter_t cur = parameters.begin()
|
||||
; cur != parameters.end() ; ++ cur ) {
|
||||
out << setw(indent) << "" << "parameter "
|
||||
<< (*cur).second.type << " ";
|
||||
if ((*cur).second.signed_flag)
|
||||
<< (*cur).second->type << " ";
|
||||
if ((*cur).second->signed_flag)
|
||||
out << "signed ";
|
||||
if ((*cur).second.msb)
|
||||
out << "[" << *(*cur).second.msb << ":"
|
||||
<< *(*cur).second.lsb << "] ";
|
||||
if ((*cur).second->msb)
|
||||
out << "[" << *(*cur).second->msb << ":"
|
||||
<< *(*cur).second->lsb << "] ";
|
||||
out << (*cur).first << " = ";
|
||||
if ((*cur).second.expr)
|
||||
out << *(*cur).second.expr;
|
||||
if ((*cur).second->expr)
|
||||
out << *(*cur).second->expr;
|
||||
else
|
||||
out << "/* ERROR */";
|
||||
for (LexicalScope::range_t*tmp = (*cur).second.range
|
||||
for (LexicalScope::range_t*tmp = (*cur).second->range
|
||||
; tmp ; tmp = tmp->next) {
|
||||
if (tmp->exclude_flag)
|
||||
out << " exclude ";
|
||||
|
|
@ -1408,16 +1408,16 @@ void LexicalScope::dump_parameters_(ostream&out, unsigned indent) const
|
|||
|
||||
void LexicalScope::dump_localparams_(ostream&out, unsigned indent) const
|
||||
{
|
||||
typedef map<perm_string,param_expr_t>::const_iterator parm_iter_t;
|
||||
typedef map<perm_string,param_expr_t*>::const_iterator parm_iter_t;
|
||||
for (parm_iter_t cur = localparams.begin()
|
||||
; cur != localparams.end() ; ++ cur ) {
|
||||
out << setw(indent) << "" << "localparam ";
|
||||
if ((*cur).second.msb)
|
||||
out << "[" << *(*cur).second.msb << ":"
|
||||
<< *(*cur).second.lsb << "] ";
|
||||
if ((*cur).second->msb)
|
||||
out << "[" << *(*cur).second->msb << ":"
|
||||
<< *(*cur).second->lsb << "] ";
|
||||
out << (*cur).first << " = ";
|
||||
if ((*cur).second.expr)
|
||||
out << *(*cur).second.expr << ";" << endl;
|
||||
if ((*cur).second->expr)
|
||||
out << *(*cur).second->expr << ";" << endl;
|
||||
else
|
||||
out << "/* ERROR */;" << endl;
|
||||
}
|
||||
|
|
@ -1513,16 +1513,16 @@ void PClass::dump(ostream&out, unsigned indent) const
|
|||
|
||||
void Module::dump_specparams_(ostream&out, unsigned indent) const
|
||||
{
|
||||
typedef map<perm_string,param_expr_t>::const_iterator parm_iter_t;
|
||||
typedef map<perm_string,param_expr_t*>::const_iterator parm_iter_t;
|
||||
for (parm_iter_t cur = specparams.begin()
|
||||
; cur != specparams.end() ; ++ cur ) {
|
||||
out << setw(indent) << "" << "specparam ";
|
||||
if ((*cur).second.msb)
|
||||
out << "[" << *(*cur).second.msb << ":"
|
||||
<< *(*cur).second.lsb << "] ";
|
||||
if ((*cur).second->msb)
|
||||
out << "[" << *(*cur).second->msb << ":"
|
||||
<< *(*cur).second->lsb << "] ";
|
||||
out << (*cur).first << " = ";
|
||||
if ((*cur).second.expr)
|
||||
out << *(*cur).second.expr << ";" << endl;
|
||||
if ((*cur).second->expr)
|
||||
out << *(*cur).second->expr << ";" << endl;
|
||||
else
|
||||
out << "/* ERROR */;" << endl;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue