issue82 hierarchical spef annotation

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2024-09-05 16:21:07 -07:00
parent 66d0914e4c
commit 3fb703b4b1
6 changed files with 101 additions and 51 deletions

View File

@ -154,6 +154,8 @@ public:
bool includes_pin_caps, bool includes_pin_caps,
const ParasiticAnalysisPt *ap) = 0; const ParasiticAnalysisPt *ap) = 0;
virtual ParasiticNodeSeq nodes(const Parasitic *parasitic) const = 0; virtual ParasiticNodeSeq nodes(const Parasitic *parasitic) const = 0;
virtual void report(const Parasitic *parasitic) const;
virtual const Net *net(const Parasitic *parasitic) const = 0;
virtual ParasiticResistorSeq resistors(const Parasitic *parasitic) const = 0; virtual ParasiticResistorSeq resistors(const Parasitic *parasitic) const = 0;
virtual ParasiticCapacitorSeq capacitors(const Parasitic *parasitic) const = 0; virtual ParasiticCapacitorSeq capacitors(const Parasitic *parasitic) const = 0;
// Delete parasitic network if it exists. // Delete parasitic network if it exists.

View File

@ -596,13 +596,14 @@ ConcreteParasiticNetwork::findParasiticNode(const Pin *pin) const
ConcreteParasiticNode * ConcreteParasiticNode *
ConcreteParasiticNetwork::ensureParasiticNode(const Net *net, ConcreteParasiticNetwork::ensureParasiticNode(const Net *net,
int id, int id,
const Network *) const Network *network)
{ {
ConcreteParasiticNode *node; ConcreteParasiticNode *node;
NetIdPair net_id(net, id); NetIdPair net_id(net, id);
auto id_node = sub_nodes_.find(net_id); auto id_node = sub_nodes_.find(net_id);
if (id_node == sub_nodes_.end()) { if (id_node == sub_nodes_.end()) {
node = new ConcreteParasiticNode(net, id, net != net_); Net *net1 = network->highestNetAbove(const_cast<Net*>(net));
node = new ConcreteParasiticNode(net, id, network->highestNetAbove(net1) != net_);
sub_nodes_[net_id] = node; sub_nodes_[net_id] = node;
if (net == net_) if (net == net_)
max_node_id_ = max((int) max_node_id_, id); max_node_id_ = max((int) max_node_id_, id);
@ -1287,6 +1288,17 @@ ConcreteParasitics::deleteParasiticNetworks(const Net *net)
} }
} }
const Net *
ConcreteParasitics::net(const Parasitic *parasitic) const
{
const ConcreteParasiticNetwork *cparasitic =
static_cast<const ConcreteParasiticNetwork*>(parasitic);
if (cparasitic->isParasiticNetwork())
return cparasitic->net();
else
return nullptr;
}
bool bool
ConcreteParasitics::includesPinCaps(const Parasitic *parasitic) const ConcreteParasitics::includesPinCaps(const Parasitic *parasitic) const
{ {

View File

@ -112,6 +112,7 @@ public:
void deleteParasiticNetwork(const Net *net, void deleteParasiticNetwork(const Net *net,
const ParasiticAnalysisPt *ap) override; const ParasiticAnalysisPt *ap) override;
void deleteParasiticNetworks(const Net *net) override; void deleteParasiticNetworks(const Net *net) override;
const Net *net(const Parasitic *parasitic) const override;
bool includesPinCaps(const Parasitic *parasitic) const override; bool includesPinCaps(const Parasitic *parasitic) const override;
ParasiticNode *findParasiticNode(Parasitic *parasitic, ParasiticNode *findParasiticNode(Parasitic *parasitic,
const Net *net, const Net *net,

View File

@ -207,7 +207,7 @@ public:
const Network *network); const Network *network);
virtual ~ConcreteParasiticNetwork(); virtual ~ConcreteParasiticNetwork();
virtual bool isParasiticNetwork() const { return true; } virtual bool isParasiticNetwork() const { return true; }
const Net *net() { return net_; } const Net *net() const { return net_; }
bool includesPinCaps() const { return includes_pin_caps_; } bool includesPinCaps() const { return includes_pin_caps_; }
ConcreteParasiticNode *findParasiticNode(const Net *net, ConcreteParasiticNode *findParasiticNode(const Net *net,
int id, int id,

View File

@ -18,6 +18,7 @@
#include "Error.hh" #include "Error.hh"
#include "Debug.hh" #include "Debug.hh"
#include "Units.hh"
#include "Liberty.hh" #include "Liberty.hh"
#include "Wireload.hh" #include "Wireload.hh"
#include "Network.hh" #include "Network.hh"
@ -34,6 +35,47 @@ Parasitics::Parasitics(StaState *sta) :
{ {
} }
void
Parasitics::report(const Parasitic *parasitic) const
{
if (isParasiticNetwork(parasitic)) {
const Unit *cap_unit = units_->capacitanceUnit();
report_->reportLine("Net %s %s",
network_->pathName(net(parasitic)),
cap_unit->asString(capacitance(parasitic)));
report_->reportLine("Nodes:");
for (ParasiticNode *node : nodes(parasitic))
report_->reportLine("%s%s %s",
name(node),
isExternal(node) ? " (ext)" : "",
cap_unit->asString(nodeGndCap(node)));
report_->reportLine("Resistors:");
for (ParasiticResistor *res : resistors(parasitic)) {
ParasiticNode *node1 = this->node1(res);
ParasiticNode *node2 = this->node2(res);
report_->reportLine("%zu %s%s %s%s %s",
id(res),
name(node1),
isExternal(node1) ? " (ext)" : "",
name(node2),
isExternal(node2) ? " (ext)" : "",
units_->resistanceUnit()->asString(value(res)));
}
report_->reportLine("Coupling Capacitors:");
for (ParasiticCapacitor *cap : capacitors(parasitic)) {
ParasiticNode *node1 = this->node1(cap);
ParasiticNode *node2 = this->node2(cap);
report_->reportLine("%zu %s%s %s%s %s",
id(cap),
name(node1),
isExternal(node1) ? " (ext)" : "",
name(node2),
isExternal(node2) ? " (ext)" : "",
cap_unit->asString(value(cap)));
}
}
}
const Net * const Net *
Parasitics::findParasiticNet(const Pin *pin) const Parasitics::findParasiticNet(const Pin *pin) const
{ {

View File

@ -155,12 +155,6 @@ ReduceToPi::reducePiDfs(const Pin *drvr_pin,
double &dwn_cap, double &dwn_cap,
double &max_resistance) double &max_resistance)
{ {
if (parasitics_->isExternal(node)) {
y1 = y2 = y3 = 0.0;
max_resistance = 0.0;
dwn_cap = 0.0;
}
else {
double coupling_cap = 0.0; double coupling_cap = 0.0;
ParasiticCapacitorSeq &capacitors = capacitor_map_[node]; ParasiticCapacitorSeq &capacitors = capacitor_map_[node];
for (ParasiticCapacitor *capacitor : capacitors) for (ParasiticCapacitor *capacitor : capacitors)
@ -209,7 +203,6 @@ ReduceToPi::reducePiDfs(const Pin *drvr_pin,
" node %s y1=%.3g y2=%.3g y3=%.3g cap=%.3g", " node %s y1=%.3g y2=%.3g y3=%.3g cap=%.3g",
parasitics_->name(node), y1, y2, y3, dwn_cap); parasitics_->name(node), y1, y2, y3, dwn_cap);
} }
}
float float
ReduceToPi::pinCapacitance(ParasiticNode *node) ReduceToPi::pinCapacitance(ParasiticNode *node)