Give delay paths scope.

Delay paths need a scope. This helps the code generators bind the
modpaths to the correct scope. This patch doesn't actually make use
of the information, it just makes it available to code generators.

Signed-off-by: Stephen Williams <steve@icarus.com>
This commit is contained in:
Stephen Williams 2007-10-31 21:39:29 -07:00
parent 148e6768f6
commit 0d9ed65e8c
7 changed files with 18 additions and 2 deletions

View File

@ -128,7 +128,7 @@ void NetDelaySrc::dump(ostream&o, unsigned ind) const
<< "/" << transition_delays_[IVL_PE_x0]
<< "," << transition_delays_[IVL_PE_xz]
<< "," << transition_delays_[IVL_PE_zx]
<< "): " << endl;
<< ") scope=" << scope_path(scope()) << endl;
dump_node_pins(o, ind+4);
}

View File

@ -111,6 +111,7 @@ ivl_parameter_expr
ivl_path_condit
ivl_path_delay
ivl_path_scope
ivl_path_source
ivl_path_source_negedge
ivl_path_source_posedge

View File

@ -385,6 +385,10 @@ typedef const struct ivl_attribute_s*ivl_attribute_t;
* block in the verilog source file. The destination signal references
* the path object, which in turn points to the source for the path.
*
* ivl_path_scope
* This returns the scope of the delay path. This scope corresponds
* to the scope of the specify-block that led to this path.
*
* ivl_path_source
* This returns the nexus that is the source end of the delay
* path. Transitions on the source are the start of the delay time
@ -398,6 +402,7 @@ typedef const struct ivl_attribute_s*ivl_attribute_t;
* ivl_path_source_negedge
* These functions return true if the source is edge sensitive.
*/
extern ivl_scope_t ivl_path_scope(ivl_delaypath_t obj);
extern ivl_nexus_t ivl_path_source(ivl_delaypath_t obj);
extern uint64_t ivl_path_delay(ivl_delaypath_t obj, ivl_path_edge_t pt);
extern ivl_nexus_t ivl_path_condit(ivl_delaypath_t obj);

View File

@ -1264,6 +1264,13 @@ extern uint64_t ivl_path_delay(ivl_delaypath_t obj, ivl_path_edge_t edg)
return obj->delay[edg];
}
extern ivl_scope_t ivl_path_scope(ivl_delaypath_t obj)
{
assert(obj);
assert(obj->scope);
return obj->scope;
}
extern ivl_nexus_t ivl_path_source(ivl_delaypath_t net)
{
return net->src;

View File

@ -2242,6 +2242,7 @@ bool dll_target::signal_paths(const NetNet*net)
<< "." << endl;
}
assert(nex->t_cookie());
obj->path[ptr].scope = lookup_scope_(src->scope());
obj->path[ptr].src = nex->t_cookie();
obj->path[ptr].condit = path_condit;
obj->path[ptr].posedge = src->is_posedge();

View File

@ -175,6 +175,7 @@ struct dll_target : public target_t, public expr_scan_t {
*/
struct ivl_delaypath_s {
ivl_scope_t scope;
ivl_nexus_t src;
ivl_nexus_t condit;
bool posedge;

View File

@ -1141,7 +1141,7 @@ static void show_signal(ivl_signal_t net)
fprintf(out, " %" PRIu64 ",%" PRIu64 ",%" PRIu64
" %" PRIu64 ",%" PRIu64 ",%" PRIu64
" %" PRIu64 ",%" PRIu64 ",%" PRIu64
" %" PRIu64 ",%" PRIu64 ",%" PRIu64 "\n",
" %" PRIu64 ",%" PRIu64 ",%" PRIu64,
ivl_path_delay(path, IVL_PE_01),
ivl_path_delay(path, IVL_PE_10),
ivl_path_delay(path, IVL_PE_0z),
@ -1154,6 +1154,7 @@ static void show_signal(ivl_signal_t net)
ivl_path_delay(path, IVL_PE_x0),
ivl_path_delay(path, IVL_PE_xz),
ivl_path_delay(path, IVL_PE_zx));
fprintf(out, " scope=%s\n", ivl_scope_name(ivl_path_scope(path)));
}
for (idx = 0 ; idx < ivl_signal_attr_cnt(net) ; idx += 1) {