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;