Get $root scope tasks/fuctions down to the ivl_target API.

This commit is contained in:
Stephen Williams 2014-10-02 14:09:27 -07:00
parent c5fee8bdb9
commit 338a0eb11a
7 changed files with 79 additions and 17 deletions

View File

@ -504,6 +504,12 @@ int Design::emit(struct target_t*tgt) const
if (tgt->start_design(this) == false) if (tgt->start_design(this) == false)
return -2; return -2;
for (map<NetScope*,PTaskFunc*>::const_iterator scope = root_tasks_.begin()
; scope != root_tasks_.end() ; ++ scope) {
scope->first->emit_scope(tgt);
scope->first->emit_defs(tgt);
}
// enumerate package scopes // enumerate package scopes
for (map<perm_string,NetScope*>::const_iterator scope = packages_.begin() for (map<perm_string,NetScope*>::const_iterator scope = packages_.begin()
; scope != packages_.end() ; ++ scope) { ; scope != packages_.end() ; ++ scope) {

View File

@ -52,6 +52,7 @@ struct ivl_design_s {
// Keep arrays of root scopes. // Keep arrays of root scopes.
std::map<const NetScope*,ivl_scope_t> classes; std::map<const NetScope*,ivl_scope_t> classes;
std::map<const NetScope*,ivl_scope_t> root_tasks;
std::vector<ivl_scope_t> packages; std::vector<ivl_scope_t> packages;
std::vector<ivl_scope_t> roots; std::vector<ivl_scope_t> roots;

View File

@ -169,6 +169,17 @@ list<NetScope*> Design::find_package_scopes() const
return res; return res;
} }
list<NetScope*> Design::find_roottask_scopes() const
{
list<NetScope*>res;
for (map<NetScope*,PTaskFunc*>::const_iterator cur = root_tasks_.begin()
; cur != root_tasks_.end() ; ++ cur) {
res.push_back (cur->first);
}
return res;
}
/* /*
* This method locates a scope in the design, given its rooted * This method locates a scope in the design, given its rooted
* hierarchical name. Each component of the key is used to scan one * hierarchical name. Each component of the key is used to scan one

View File

@ -4815,6 +4815,7 @@ class Design : public Definitions {
// Tasks // Tasks
NetScope* find_task(NetScope*scope, const pform_name_t&name); NetScope* find_task(NetScope*scope, const pform_name_t&name);
void add_root_task(NetScope*tscope, PTaskFunc*tf); void add_root_task(NetScope*tscope, PTaskFunc*tf);
std::list<NetScope*> find_roottask_scopes(void) const;
// Find a class in the $root scope. // Find a class in the $root scope.
void add_class(netclass_t*cl, PClass*pclass); void add_class(netclass_t*cl, PClass*pclass);

View File

@ -84,7 +84,11 @@ extern "C" void ivl_design_roots(ivl_design_t des, ivl_scope_t **scopes,
assert (nscopes && scopes); assert (nscopes && scopes);
if (des->root_scope_list.size() == 0) { if (des->root_scope_list.size() == 0) {
size_t fill = 0; size_t fill = 0;
des->root_scope_list.resize(des->packages.size() + des->roots.size() + des->classes.size()); des->root_scope_list.resize(des->root_tasks.size() + des->packages.size() + des->roots.size() + des->classes.size());
for (map<const NetScope*,ivl_scope_t>::iterator idx = des->root_tasks.begin()
; idx != des->root_tasks.end() ; ++ idx)
des->root_scope_list[fill++] = idx->second;
for (map<const NetScope*,ivl_scope_t>::iterator idx = des->classes.begin() for (map<const NetScope*,ivl_scope_t>::iterator idx = des->classes.begin()
; idx != des->classes.end() ; ++ idx) ; idx != des->classes.end() ; ++ idx)
des->root_scope_list[fill++] = idx->second; des->root_scope_list[fill++] = idx->second;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000-2013 Stephen Williams (steve@icarus.com) * Copyright (c) 2000-2014 Stephen Williams (steve@icarus.com)
* Copyright CERN 2013 / Stephen Williams (steve@icarus.com) * Copyright CERN 2013 / Stephen Williams (steve@icarus.com)
* *
* This source code is free software; you can redistribute it * This source code is free software; you can redistribute it
@ -261,6 +261,12 @@ ivl_scope_t dll_target::find_scope(ivl_design_s &des, const NetScope*cur)
return tmp; return tmp;
} }
if (cur->type()==NetScope::TASK || cur->type()==NetScope::FUNC) {
map<const NetScope*,ivl_scope_t>::const_iterator idx = des.root_tasks.find(cur);
if (idx != des.root_tasks.end())
return idx->second;
}
for (unsigned idx = 0; idx < des.roots.size(); idx += 1) { for (unsigned idx = 0; idx < des.roots.size(); idx += 1) {
assert(des.roots[idx]); assert(des.roots[idx]);
ivl_scope_t scope = find_scope_from_root(des.roots[idx], cur); ivl_scope_t scope = find_scope_from_root(des.roots[idx], cur);
@ -605,6 +611,13 @@ void dll_target::add_root(const NetScope *s)
root_->lpm_ = 0; root_->lpm_ = 0;
root_->def = 0; root_->def = 0;
make_scope_parameters(root_, s); make_scope_parameters(root_, s);
root_->tname_ = root_->name_;
root_->time_precision = s->time_precision();
root_->time_units = s->time_unit();
root_->nattr = s->attr_cnt();
root_->attr = fill_in_attributes(s);
root_->is_auto = 0;
root_->is_cell = s->is_cell();
switch (s->type()) { switch (s->type()) {
case NetScope::PACKAGE: case NetScope::PACKAGE:
root_->type_ = IVL_SCT_PACKAGE; root_->type_ = IVL_SCT_PACKAGE;
@ -615,16 +628,25 @@ void dll_target::add_root(const NetScope *s)
case NetScope::CLASS: case NetScope::CLASS:
root_->type_ = IVL_SCT_CLASS; root_->type_ = IVL_SCT_CLASS;
break; break;
case NetScope::TASK: {
const NetTaskDef*def = s->task_def();
if (def == 0) {
cerr << "?:?" << ": internal error: "
<< "task " << root_->name_
<< " has no definition." << endl;
}
assert(def);
root_->type_ = IVL_SCT_TASK;
root_->tname_ = def->scope()->basename();
break;
}
break;
case NetScope::FUNC:
root_->type_ = IVL_SCT_FUNCTION;
break;
default: default:
assert(0); assert(0);
} }
root_->tname_ = root_->name_;
root_->time_precision = s->time_precision();
root_->time_units = s->time_unit();
root_->nattr = s->attr_cnt();
root_->attr = fill_in_attributes(s);
root_->is_auto = 0;
root_->is_cell = s->is_cell();
switch (s->type()) { switch (s->type()) {
case NetScope::MODULE: case NetScope::MODULE:
@ -650,6 +672,11 @@ void dll_target::add_root(const NetScope *s)
des_.classes[s] = root_; des_.classes[s] = root_;
break; break;
case NetScope::TASK:
case NetScope::FUNC:
des_.root_tasks[s] = root_;
break;
default: default:
assert(0); assert(0);
break; break;
@ -691,16 +718,22 @@ bool dll_target::start_design(const Design*des)
} }
assert(idx == des_.disciplines.size()); assert(idx == des_.disciplines.size());
list<NetScope *> package_scopes = des->find_package_scopes(); list<NetScope *> scope_list = des->find_roottask_scopes();
for (list<NetScope*>::const_iterator scop = package_scopes.begin() for (list<NetScope*>::const_iterator cur = scope_list.begin()
; scop != package_scopes.end(); ++ scop ) { ; cur != scope_list.end() ; ++ cur) {
add_root(*scop); add_root(*cur);
} }
list<NetScope *> root_scopes = des->find_root_scopes(); scope_list = des->find_package_scopes();
for (list<NetScope*>::const_iterator scop = root_scopes.begin() for (list<NetScope*>::const_iterator cur = scope_list.begin()
; scop != root_scopes.end(); ++ scop ) { ; cur != scope_list.end(); ++ cur ) {
add_root(*scop); add_root(*cur);
}
scope_list = des->find_root_scopes();
for (list<NetScope*>::const_iterator cur = scope_list.begin()
; cur != scope_list.end(); ++ cur ) {
add_root(*cur);
} }
target_ = (target_design_f)ivl_dlsym(dll_, LU "target_design" TU); target_ = (target_design_f)ivl_dlsym(dll_, LU "target_design" TU);

View File

@ -1797,6 +1797,12 @@ int target_design(ivl_design_t des)
ivl_scope_t cur = root_scopes[idx]; ivl_scope_t cur = root_scopes[idx];
switch (ivl_scope_type(cur)) { switch (ivl_scope_type(cur)) {
case IVL_SCT_TASK:
fprintf(out, "task = %s\n", ivl_scope_name(cur));
break;
case IVL_SCT_FUNCTION:
fprintf(out, "function = %s\n", ivl_scope_name(cur));
break;
case IVL_SCT_CLASS: case IVL_SCT_CLASS:
fprintf(out, "class = %s\n", ivl_scope_name(cur)); fprintf(out, "class = %s\n", ivl_scope_name(cur));
break; break;