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
|
// For each clock net identify all nets that can possibly drive it. Compute
|
||||||
// cumulative delays to each of them.
|
// cumulative delays to each of them.
|
||||||
std::function<void(const NetInfo *, dict<IdString, delay_t> &, delay_t)> find_net_drivers =
|
std::function<void(const NetInfo *, pool<IdString> &, dict<IdString, delay_t> &, delay_t)> find_net_drivers =
|
||||||
[&](const NetInfo *ni, dict<IdString, delay_t> &drivers, delay_t delay_acc) {
|
[&](const NetInfo *ni, pool<IdString> &net_trace, dict<IdString, delay_t> &drivers, delay_t delay_acc) {
|
||||||
// Get driving cell and port
|
// Get driving cell and port
|
||||||
if (ni == nullptr)
|
if (ni == nullptr)
|
||||||
return;
|
return;
|
||||||
@ -309,6 +309,13 @@ void TimingAnalyser::identify_related_domains()
|
|||||||
|
|
||||||
bool didGoUpstream = false;
|
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
|
// The cell has only one port
|
||||||
if (cell->ports.size() == 1) {
|
if (cell->ports.size() == 1) {
|
||||||
drivers[ni->name] = delay_acc;
|
drivers[ni->name] = delay_acc;
|
||||||
@ -350,7 +357,7 @@ void TimingAnalyser::identify_related_domains()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Recurse
|
// 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;
|
didGoUpstream = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,7 +378,8 @@ void TimingAnalyser::identify_related_domains()
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
dict<IdString, delay_t> drivers;
|
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;
|
clock_drivers[domain.key.clock] = drivers;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user