diff --git a/include/sta/Parasitics.hh b/include/sta/Parasitics.hh index b548eef4..e1c20039 100644 --- a/include/sta/Parasitics.hh +++ b/include/sta/Parasitics.hh @@ -60,6 +60,8 @@ public: virtual void deleteParasitics(const Pin *pin, const ParasiticAnalysisPt *ap) = 0; virtual void deleteUnsavedParasitic(Parasitic *parasitic) = 0; + virtual void deleteReducedParasitics(const Net *net, + const ParasiticAnalysisPt *ap) = 0; virtual void deleteDrvrReducedParasitics(const Pin *drvr_pin) = 0; virtual bool isReducedParasiticNetwork(Parasitic *parasitic) const = 0; diff --git a/parasitics/ConcreteParasitics.cc b/parasitics/ConcreteParasitics.cc index 5da55bc7..334518a7 100644 --- a/parasitics/ConcreteParasitics.cc +++ b/parasitics/ConcreteParasitics.cc @@ -999,6 +999,19 @@ ConcreteParasitics::loadPinCapacitanceChanged(const Pin *pin) deleteReducedParasitics(pin); } +void +ConcreteParasitics::deleteReducedParasitics(const Net *net, + const ParasiticAnalysisPt *ap) +{ + if (!drvr_parasitic_map_.empty()) { + PinSet *drivers = network_->drivers(net); + if (drivers) { + for (auto drvr_pin : *drivers) + deleteDrvrReducedParasitics(drvr_pin, ap); + } + } +} + // Delete reduced models on pin's net. void ConcreteParasitics::deleteReducedParasitics(const Pin *pin) @@ -1027,6 +1040,19 @@ ConcreteParasitics::deleteDrvrReducedParasitics(const Pin *drvr_pin) drvr_parasitic_map_[drvr_pin] = nullptr; } +void +ConcreteParasitics::deleteDrvrReducedParasitics(const Pin *drvr_pin, + const ParasiticAnalysisPt *ap) +{ + UniqueLock lock(lock_); + ConcreteParasitic **parasitics = drvr_parasitic_map_[drvr_pin]; + if (parasitics) { + int ap_index = ap->index(); + delete parasitics[ap_index]; + parasitics[ap_index] = nullptr; + } +} + //////////////////////////////////////////////////////////////// bool diff --git a/parasitics/ConcreteParasitics.hh b/parasitics/ConcreteParasitics.hh index f777a1bb..ceca77e0 100644 --- a/parasitics/ConcreteParasitics.hh +++ b/parasitics/ConcreteParasitics.hh @@ -193,6 +193,8 @@ public: const Corner *corner, const MinMax *cnst_min_max, const ParasiticAnalysisPt *ap); + void deleteReducedParasitics(const Net *net, + const ParasiticAnalysisPt *ap); virtual void deleteDrvrReducedParasitics(const Pin *drvr_pin); protected: @@ -201,6 +203,8 @@ protected: Parasitic *ensureRspf(const Pin *drvr_pin); void makeAnalysisPtAfter(); void deleteReducedParasitics(const Pin *pin); + void deleteDrvrReducedParasitics(const Pin *drvr_pin, + const ParasiticAnalysisPt *ap); // Driver pin to array of parasitics indexed by analysis pt index // and transition. diff --git a/parasitics/SpefReader.cc b/parasitics/SpefReader.cc index be7194c0..45b5185a 100644 --- a/parasitics/SpefReader.cc +++ b/parasitics/SpefReader.cc @@ -448,9 +448,11 @@ SpefReader::dspfBegin(Net *net, if (increment_ && parasitics_->findParasiticNetwork(net, ap_)) parasitic_ = nullptr; - else + else { + parasitics_->deleteReducedParasitics(net, ap_); parasitic_ = parasitics_->makeParasiticNetwork(net, pin_cap_included_, - ap_); + ap_); + } net_ = net; } else {