Fix segfault when clocking a FF from a ring oscillator (#1160)
* fix segfault when clocking a FF from a ring osc * Change std::set to pool Co-authored-by: Lofty <dan.ravensloft@gmail.com> --------- Co-authored-by: Meinhard Kissich <meinhard.kissich@tugraz.at> Co-authored-by: Lofty <dan.ravensloft@gmail.com>
This commit is contained in:
parent
1d3e5151ba
commit
f03da6568b
@ -296,8 +296,8 @@ void TimingAnalyser::identify_related_domains()
|
||||
|
||||
// For each clock net identify all nets that can possibly drive it. Compute
|
||||
// cumulative delays to each of them.
|
||||
std::function<void(const NetInfo *, dict<IdString, delay_t> &, delay_t)> find_net_drivers =
|
||||
[&](const NetInfo *ni, dict<IdString, delay_t> &drivers, delay_t delay_acc) {
|
||||
std::function<void(const NetInfo *, pool<IdString> &, dict<IdString, delay_t> &, delay_t)> find_net_drivers =
|
||||
[&](const NetInfo *ni, pool<IdString> &net_trace, dict<IdString, delay_t> &drivers, delay_t delay_acc) {
|
||||
// Get driving cell and port
|
||||
if (ni == nullptr)
|
||||
return;
|
||||
@ -309,6 +309,13 @@ void TimingAnalyser::identify_related_domains()
|
||||
|
||||
bool didGoUpstream = false;
|
||||
|
||||
// Ring oscillator driving the net
|
||||
if (net_trace.find(ni->name) != net_trace.end()) {
|
||||
drivers[ni->name] = delay_acc;
|
||||
return;
|
||||
}
|
||||
net_trace.insert(ni->name);
|
||||
|
||||
// The cell has only one port
|
||||
if (cell->ports.size() == 1) {
|
||||
drivers[ni->name] = delay_acc;
|
||||
@ -350,7 +357,7 @@ void TimingAnalyser::identify_related_domains()
|
||||
}
|
||||
|
||||
// Recurse
|
||||
find_net_drivers(pi.net, drivers, delay_acc + delay.maxDelay());
|
||||
find_net_drivers(pi.net, net_trace, drivers, delay_acc + delay.maxDelay());
|
||||
didGoUpstream = true;
|
||||
}
|
||||
|
||||
@ -371,7 +378,8 @@ void TimingAnalyser::identify_related_domains()
|
||||
continue;
|
||||
|
||||
dict<IdString, delay_t> drivers;
|
||||
find_net_drivers(ni, drivers, 0);
|
||||
pool<IdString> net_trace;
|
||||
find_net_drivers(ni, net_trace, drivers, 0);
|
||||
|
||||
clock_drivers[domain.key.clock] = drivers;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user