parameter table in ivl_scope_s uses vector instead of C arrays.

This commit is contained in:
Stephen Williams 2013-04-05 19:27:03 -07:00
parent bae0f1d3a7
commit b122ec2a1a
3 changed files with 21 additions and 17 deletions

View File

@ -2035,14 +2035,14 @@ extern "C" const char* ivl_scope_name(ivl_scope_t net)
extern "C" unsigned ivl_scope_params(ivl_scope_t net)
{
assert(net);
return net->nparam_;
return net->param.size();
}
extern "C" ivl_parameter_t ivl_scope_param(ivl_scope_t net, unsigned idx)
{
assert(net);
assert(idx < net->nparam_);
return net->param_ + idx;
assert(idx < net->param.size());
return & (net->param[idx]);
}
extern "C" ivl_scope_t ivl_scope_parent(ivl_scope_t net)

View File

@ -467,9 +467,9 @@ ivl_parameter_t dll_target::scope_find_param(ivl_scope_t scope,
const char*name)
{
unsigned idx = 0;
while (idx < scope->nparam_) {
if (strcmp(name, scope->param_[idx].basename) == 0)
return scope->param_ + idx;
while (idx < scope->param.size()) {
if (strcmp(name, scope->param[idx].basename) == 0)
return &scope->param[idx];
idx += 1;
}
@ -484,13 +484,12 @@ ivl_parameter_t dll_target::scope_find_param(ivl_scope_t scope,
*/
void dll_target::make_scope_parameters(ivl_scope_t scop, const NetScope*net)
{
scop->nparam_ = net->parameters.size();
if (scop->nparam_ == 0) {
scop->param_ = 0;
if (net->parameters.size() == 0) {
scop->param.clear();
return;
}
scop->param_ = new struct ivl_parameter_s [scop->nparam_];
scop->param.resize(net->parameters.size());
unsigned idx = 0;
typedef map<perm_string,NetScope::param_expr_t>::const_iterator pit_t;
@ -498,14 +497,20 @@ void dll_target::make_scope_parameters(ivl_scope_t scop, const NetScope*net)
for (pit_t cur_pit = net->parameters.begin()
; cur_pit != net->parameters.end() ; ++ cur_pit ) {
assert(idx < scop->nparam_);
ivl_parameter_t cur_par = scop->param_ + idx;
cur_par->basename = (*cur_pit).first;
assert(idx < scop->param.size());
ivl_parameter_t cur_par = &scop->param[idx];
cur_par->basename = cur_pit->first;
cur_par->local = cur_pit->second.local_flag;
cur_par->scope = scop;
FILE_NAME(cur_par, &((*cur_pit).second));
FILE_NAME(cur_par, &(cur_pit->second));
NetExpr*etmp = (*cur_pit).second.val;
NetExpr*etmp = cur_pit->second.val;
if (etmp == 0) {
cerr << "?:?: internal error: "
<< "What is the parameter expression for " << cur_pit->first
<< " in " << net->fullname() << "?" << endl;
}
assert(etmp);
make_scope_param_expr(cur_par, etmp);
idx += 1;
}

View File

@ -653,8 +653,7 @@ struct ivl_scope_s {
unsigned nlpm_;
ivl_lpm_t* lpm_;
unsigned nparam_;
ivl_parameter_t param_;
std::vector<struct ivl_parameter_s> param;
/* Scopes that are tasks/functions have a definition. */
ivl_statement_t def;