issue82 hierarchical spef annotation
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
66d0914e4c
commit
3fb703b4b1
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -208,7 +202,6 @@ ReduceToPi::reducePiDfs(const Pin *drvr_pin,
|
||||||
debugPrint(debug_, "parasitic_reduce", 3,
|
debugPrint(debug_, "parasitic_reduce", 3,
|
||||||
" 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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue