read_spef dspef delete reduced parasitics

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2021-10-10 15:03:27 -07:00
parent bdc07bb6a3
commit 1c88a1a8d4
4 changed files with 36 additions and 2 deletions

View File

@ -60,6 +60,8 @@ public:
virtual void deleteParasitics(const Pin *pin, virtual void deleteParasitics(const Pin *pin,
const ParasiticAnalysisPt *ap) = 0; const ParasiticAnalysisPt *ap) = 0;
virtual void deleteUnsavedParasitic(Parasitic *parasitic) = 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 void deleteDrvrReducedParasitics(const Pin *drvr_pin) = 0;
virtual bool isReducedParasiticNetwork(Parasitic *parasitic) const = 0; virtual bool isReducedParasiticNetwork(Parasitic *parasitic) const = 0;

View File

@ -999,6 +999,19 @@ ConcreteParasitics::loadPinCapacitanceChanged(const Pin *pin)
deleteReducedParasitics(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. // Delete reduced models on pin's net.
void void
ConcreteParasitics::deleteReducedParasitics(const Pin *pin) ConcreteParasitics::deleteReducedParasitics(const Pin *pin)
@ -1027,6 +1040,19 @@ ConcreteParasitics::deleteDrvrReducedParasitics(const Pin *drvr_pin)
drvr_parasitic_map_[drvr_pin] = nullptr; 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 bool

View File

@ -193,6 +193,8 @@ public:
const Corner *corner, const Corner *corner,
const MinMax *cnst_min_max, const MinMax *cnst_min_max,
const ParasiticAnalysisPt *ap); const ParasiticAnalysisPt *ap);
void deleteReducedParasitics(const Net *net,
const ParasiticAnalysisPt *ap);
virtual void deleteDrvrReducedParasitics(const Pin *drvr_pin); virtual void deleteDrvrReducedParasitics(const Pin *drvr_pin);
protected: protected:
@ -201,6 +203,8 @@ protected:
Parasitic *ensureRspf(const Pin *drvr_pin); Parasitic *ensureRspf(const Pin *drvr_pin);
void makeAnalysisPtAfter(); void makeAnalysisPtAfter();
void deleteReducedParasitics(const Pin *pin); 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 // Driver pin to array of parasitics indexed by analysis pt index
// and transition. // and transition.

View File

@ -448,9 +448,11 @@ SpefReader::dspfBegin(Net *net,
if (increment_ if (increment_
&& parasitics_->findParasiticNetwork(net, ap_)) && parasitics_->findParasiticNetwork(net, ap_))
parasitic_ = nullptr; parasitic_ = nullptr;
else else {
parasitics_->deleteReducedParasitics(net, ap_);
parasitic_ = parasitics_->makeParasiticNetwork(net, pin_cap_included_, parasitic_ = parasitics_->makeParasiticNetwork(net, pin_cap_included_,
ap_); ap_);
}
net_ = net; net_ = net;
} }
else { else {