diff --git a/include/sta/NullParasitics.hh b/include/sta/NullParasitics.hh index 7c975e7f..6256849e 100644 --- a/include/sta/NullParasitics.hh +++ b/include/sta/NullParasitics.hh @@ -97,6 +97,7 @@ public: virtual bool includesPinCaps(Parasitic *parasitic) const; virtual void deleteParasiticNetwork(const Net *net, const ParasiticAnalysisPt *ap); + virtual void deleteParasiticNetworks(const Net *net); virtual ParasiticNode *ensureParasiticNode(Parasitic *parasitic, const Net *net, int id); diff --git a/include/sta/Parasitics.hh b/include/sta/Parasitics.hh index b3003760..b548eef4 100644 --- a/include/sta/Parasitics.hh +++ b/include/sta/Parasitics.hh @@ -155,6 +155,7 @@ public: // Delete parasitic network if it exists. virtual void deleteParasiticNetwork(const Net *net, const ParasiticAnalysisPt *ap) = 0; + virtual void deleteParasiticNetworks(const Net *net) = 0; // True if the parasitic network caps include pin capacitances. virtual bool includesPinCaps(Parasitic *parasitic) const = 0; // Parasitic network component builders. diff --git a/parasitics/ConcreteParasitics.cc b/parasitics/ConcreteParasitics.cc index ff1ce01b..5da55bc7 100644 --- a/parasitics/ConcreteParasitics.cc +++ b/parasitics/ConcreteParasitics.cc @@ -1340,7 +1340,30 @@ ConcreteParasitics::deleteParasiticNetwork(const Net *net, if (parasitics) { int ap_index = ap->index(); delete parasitics[ap_index]; - parasitics[ap_index] = nullptr; + int ap_count = corners_->parasiticAnalysisPtCount(); + if (ap_count == 1) { + // If there is only one parasitic we can remove the array and map entry. + delete [] parasitics; + parasitic_network_map_.erase(net); + } + else + parasitics[ap_index] = nullptr; + } + } +} + +void +ConcreteParasitics::deleteParasiticNetworks(const Net *net) +{ + if (!parasitic_network_map_.empty()) { + UniqueLock lock(lock_); + ConcreteParasiticNetwork **parasitics = parasitic_network_map_.findKey(net); + if (parasitics) { + int ap_count = corners_->parasiticAnalysisPtCount(); + for (int i = 0; i < ap_count; i++) + delete parasitics[i]; + delete [] parasitics; + parasitic_network_map_.erase(net); } } } diff --git a/parasitics/ConcreteParasitics.hh b/parasitics/ConcreteParasitics.hh index 0ac78c5b..f777a1bb 100644 --- a/parasitics/ConcreteParasitics.hh +++ b/parasitics/ConcreteParasitics.hh @@ -106,6 +106,7 @@ public: const ParasiticAnalysisPt *ap); virtual void deleteParasiticNetwork(const Net *net, const ParasiticAnalysisPt *ap); + virtual void deleteParasiticNetworks(const Net *net); virtual bool includesPinCaps(Parasitic *parasitic) const; virtual ParasiticNode *ensureParasiticNode(Parasitic *parasitic, const Net *net, diff --git a/parasitics/NullParasitics.cc b/parasitics/NullParasitics.cc index a39076ae..2e0ccfe7 100644 --- a/parasitics/NullParasitics.cc +++ b/parasitics/NullParasitics.cc @@ -245,6 +245,11 @@ NullParasitics::deleteParasiticNetwork(const Net *, { } +void +NullParasitics::deleteParasiticNetworks(const Net *) +{ +} + ParasiticNode * NullParasitics::ensureParasiticNode(Parasitic *, const Net *,