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:
Meinhard Kissich 2023-05-22 09:39:05 +02:00 committed by GitHub
parent 1d3e5151ba
commit f03da6568b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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;