From f03da6568b8696fc25e29b91177e95b68386694d Mon Sep 17 00:00:00 2001 From: Meinhard Kissich Date: Mon, 22 May 2023 09:39:05 +0200 Subject: [PATCH] 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 --------- Co-authored-by: Meinhard Kissich Co-authored-by: Lofty --- common/kernel/timing.cc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/common/kernel/timing.cc b/common/kernel/timing.cc index 924f336c..dc2bfad1 100644 --- a/common/kernel/timing.cc +++ b/common/kernel/timing.cc @@ -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 &, delay_t)> find_net_drivers = - [&](const NetInfo *ni, dict &drivers, delay_t delay_acc) { + std::function &, dict &, delay_t)> find_net_drivers = + [&](const NetInfo *ni, pool &net_trace, dict &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 drivers; - find_net_drivers(ni, drivers, 0); + pool net_trace; + find_net_drivers(ni, net_trace, drivers, 0); clock_drivers[domain.key.clock] = drivers;