hpin reorg code
This commit is contained in:
parent
63691545c9
commit
ddb0c8dc58
|
|
@ -21,73 +21,82 @@
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
HpinDrvrLoad::HpinDrvrLoad(Pin *drvr,
|
static void
|
||||||
Pin *load,
|
visitPinsAboveNet2(const Pin *hpin,
|
||||||
PinSet *hpins_from_drvr,
|
Net *above_net,
|
||||||
PinSet *hpins_to_load) :
|
NetSet &visited,
|
||||||
drvr_(drvr),
|
HpinDrvrLoads &above_drvrs,
|
||||||
load_(load),
|
HpinDrvrLoads &above_loads,
|
||||||
hpins_from_drvr_(hpins_from_drvr ? new PinSet(*hpins_from_drvr) : nullptr),
|
PinSet *hpin_path,
|
||||||
hpins_to_load_(hpins_to_load ? new PinSet(*hpins_to_load) : nullptr)
|
const Network *network);
|
||||||
{
|
static void
|
||||||
}
|
visitPinsBelowNet2(const Pin *hpin,
|
||||||
|
Net *above_net,
|
||||||
|
Net *below_net,
|
||||||
|
NetSet &visited,
|
||||||
|
HpinDrvrLoads &below_drvrs,
|
||||||
|
HpinDrvrLoads &below_loads,
|
||||||
|
PinSet *hpin_path,
|
||||||
|
const Network *network);
|
||||||
|
static void
|
||||||
|
visitHpinDrvrLoads(HpinDrvrLoads drvrs,
|
||||||
|
HpinDrvrLoads loads,
|
||||||
|
HpinDrvrLoadVisitor *visitor);
|
||||||
|
|
||||||
HpinDrvrLoad::HpinDrvrLoad(Pin *drvr,
|
void
|
||||||
Pin *load) :
|
visitHpinDrvrLoads(const Pin *pin,
|
||||||
drvr_(drvr),
|
const Network *network,
|
||||||
load_(load)
|
HpinDrvrLoadVisitor *visitor)
|
||||||
{
|
{
|
||||||
}
|
NetSet visited;
|
||||||
|
HpinDrvrLoads above_drvrs;
|
||||||
HpinDrvrLoad::~HpinDrvrLoad()
|
HpinDrvrLoads above_loads;
|
||||||
{
|
PinSet hpin_path;
|
||||||
delete hpins_from_drvr_;
|
Net *above_net = network->net(pin);
|
||||||
delete hpins_to_load_;
|
if (above_net) {
|
||||||
}
|
visitPinsAboveNet2(pin, above_net, visited,
|
||||||
|
above_drvrs, above_loads,
|
||||||
void
|
&hpin_path, network);
|
||||||
HpinDrvrLoad::report(const Network *network)
|
|
||||||
{
|
|
||||||
printf("%s -> %s: ",
|
|
||||||
drvr_ ? network->pathName(drvr_) : "-",
|
|
||||||
load_ ? network->pathName(load_) : "-");
|
|
||||||
PinSet::Iterator pin_iter(hpins_from_drvr_);
|
|
||||||
while (pin_iter.hasNext()) {
|
|
||||||
Pin *pin = pin_iter.next();
|
|
||||||
printf("%s ", network->pathName(pin));
|
|
||||||
}
|
}
|
||||||
printf("* ");
|
|
||||||
PinSet::Iterator pin_iter2(hpins_to_load_);
|
|
||||||
while (pin_iter2.hasNext()) {
|
|
||||||
Pin *pin = pin_iter2.next();
|
|
||||||
printf("%s ", network->pathName(pin));
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
// Search down from hpin terminal.
|
||||||
HpinDrvrLoad::setDrvr(Pin *drvr)
|
HpinDrvrLoads below_drvrs;
|
||||||
{
|
HpinDrvrLoads below_loads;
|
||||||
drvr_ = drvr;
|
Term *term = network->term(pin);
|
||||||
}
|
if (term) {
|
||||||
|
Net *below_net = network->net(term);
|
||||||
bool
|
if (below_net)
|
||||||
HpinDrvrLoadLess::operator()(const HpinDrvrLoad *drvr_load1,
|
visitPinsBelowNet2(pin, above_net, below_net, visited,
|
||||||
const HpinDrvrLoad *drvr_load2) const
|
below_drvrs, below_loads,
|
||||||
{
|
&hpin_path, network);
|
||||||
Pin *load1 = drvr_load1->load();
|
|
||||||
Pin *load2 = drvr_load2->load();
|
|
||||||
if (load1 == load2) {
|
|
||||||
Pin *drvr1 = drvr_load1->drvr();
|
|
||||||
Pin *drvr2 = drvr_load2->drvr();
|
|
||||||
return drvr1 < drvr2;
|
|
||||||
}
|
}
|
||||||
else
|
if (network->isHierarchical(pin)) {
|
||||||
return load1 < load2;
|
visitHpinDrvrLoads(above_drvrs, below_loads, visitor);
|
||||||
|
visitHpinDrvrLoads(below_drvrs, above_loads, visitor);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (network->isDriver(pin)) {
|
||||||
|
HpinDrvrLoad drvr(const_cast<Pin*>(pin), nullptr, &hpin_path, nullptr);
|
||||||
|
HpinDrvrLoads drvrs;
|
||||||
|
drvrs.insert(&drvr);
|
||||||
|
visitHpinDrvrLoads(drvrs, below_loads, visitor);
|
||||||
|
visitHpinDrvrLoads(drvrs, above_loads, visitor);
|
||||||
|
}
|
||||||
|
// Bidirects are drivers and loads.
|
||||||
|
if (network->isLoad(pin)) {
|
||||||
|
HpinDrvrLoad load(nullptr, const_cast<Pin*>(pin), nullptr, &hpin_path);
|
||||||
|
HpinDrvrLoads loads;
|
||||||
|
loads.insert(&load);
|
||||||
|
visitHpinDrvrLoads(below_drvrs, loads, visitor);
|
||||||
|
visitHpinDrvrLoads(above_drvrs, loads, visitor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
above_drvrs.deleteContents();
|
||||||
|
above_loads.deleteContents();
|
||||||
|
below_drvrs.deleteContents();
|
||||||
|
below_loads.deleteContents();
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
visitPinsAboveNet2(const Pin *hpin,
|
visitPinsAboveNet2(const Pin *hpin,
|
||||||
Net *above_net,
|
Net *above_net,
|
||||||
|
|
@ -246,58 +255,71 @@ visitHpinDrvrLoads(HpinDrvrLoads drvrs,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
////////////////////////////////////////////////////////////////
|
||||||
visitHpinDrvrLoads(const Pin *pin,
|
|
||||||
const Network *network,
|
|
||||||
HpinDrvrLoadVisitor *visitor)
|
|
||||||
{
|
|
||||||
NetSet visited;
|
|
||||||
HpinDrvrLoads above_drvrs;
|
|
||||||
HpinDrvrLoads above_loads;
|
|
||||||
PinSet hpin_path;
|
|
||||||
Net *above_net = network->net(pin);
|
|
||||||
if (above_net) {
|
|
||||||
visitPinsAboveNet2(pin, above_net, visited,
|
|
||||||
above_drvrs, above_loads,
|
|
||||||
&hpin_path, network);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Search down from hpin terminal.
|
HpinDrvrLoad::HpinDrvrLoad(Pin *drvr,
|
||||||
HpinDrvrLoads below_drvrs;
|
Pin *load,
|
||||||
HpinDrvrLoads below_loads;
|
PinSet *hpins_from_drvr,
|
||||||
Term *term = network->term(pin);
|
PinSet *hpins_to_load) :
|
||||||
if (term) {
|
drvr_(drvr),
|
||||||
Net *below_net = network->net(term);
|
load_(load),
|
||||||
if (below_net)
|
hpins_from_drvr_(hpins_from_drvr ? new PinSet(*hpins_from_drvr) : nullptr),
|
||||||
visitPinsBelowNet2(pin, above_net, below_net, visited,
|
hpins_to_load_(hpins_to_load ? new PinSet(*hpins_to_load) : nullptr)
|
||||||
below_drvrs, below_loads,
|
{
|
||||||
&hpin_path, network);
|
}
|
||||||
|
|
||||||
|
HpinDrvrLoad::HpinDrvrLoad(Pin *drvr,
|
||||||
|
Pin *load) :
|
||||||
|
drvr_(drvr),
|
||||||
|
load_(load)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
HpinDrvrLoad::~HpinDrvrLoad()
|
||||||
|
{
|
||||||
|
delete hpins_from_drvr_;
|
||||||
|
delete hpins_to_load_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HpinDrvrLoad::report(const Network *network)
|
||||||
|
{
|
||||||
|
printf("%s -> %s: ",
|
||||||
|
drvr_ ? network->pathName(drvr_) : "-",
|
||||||
|
load_ ? network->pathName(load_) : "-");
|
||||||
|
PinSet::Iterator pin_iter(hpins_from_drvr_);
|
||||||
|
while (pin_iter.hasNext()) {
|
||||||
|
Pin *pin = pin_iter.next();
|
||||||
|
printf("%s ", network->pathName(pin));
|
||||||
}
|
}
|
||||||
if (network->isHierarchical(pin)) {
|
printf("* ");
|
||||||
visitHpinDrvrLoads(above_drvrs, below_loads, visitor);
|
PinSet::Iterator pin_iter2(hpins_to_load_);
|
||||||
visitHpinDrvrLoads(below_drvrs, above_loads, visitor);
|
while (pin_iter2.hasNext()) {
|
||||||
|
Pin *pin = pin_iter2.next();
|
||||||
|
printf("%s ", network->pathName(pin));
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HpinDrvrLoad::setDrvr(Pin *drvr)
|
||||||
|
{
|
||||||
|
drvr_ = drvr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
HpinDrvrLoadLess::operator()(const HpinDrvrLoad *drvr_load1,
|
||||||
|
const HpinDrvrLoad *drvr_load2) const
|
||||||
|
{
|
||||||
|
Pin *load1 = drvr_load1->load();
|
||||||
|
Pin *load2 = drvr_load2->load();
|
||||||
|
if (load1 == load2) {
|
||||||
|
Pin *drvr1 = drvr_load1->drvr();
|
||||||
|
Pin *drvr2 = drvr_load2->drvr();
|
||||||
|
return drvr1 < drvr2;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
if (network->isDriver(pin)) {
|
return load1 < load2;
|
||||||
HpinDrvrLoad drvr(const_cast<Pin*>(pin), nullptr, &hpin_path, nullptr);
|
|
||||||
HpinDrvrLoads drvrs;
|
|
||||||
drvrs.insert(&drvr);
|
|
||||||
visitHpinDrvrLoads(drvrs, below_loads, visitor);
|
|
||||||
visitHpinDrvrLoads(drvrs, above_loads, visitor);
|
|
||||||
}
|
|
||||||
// Bidirects are drivers and loads.
|
|
||||||
if (network->isLoad(pin)) {
|
|
||||||
HpinDrvrLoad load(nullptr, const_cast<Pin*>(pin), nullptr, &hpin_path);
|
|
||||||
HpinDrvrLoads loads;
|
|
||||||
loads.insert(&load);
|
|
||||||
visitHpinDrvrLoads(below_drvrs, loads, visitor);
|
|
||||||
visitHpinDrvrLoads(above_drvrs, loads, visitor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
above_drvrs.deleteContents();
|
|
||||||
above_loads.deleteContents();
|
|
||||||
below_drvrs.deleteContents();
|
|
||||||
below_loads.deleteContents();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,12 @@
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
class HpinDrvrLoad;
|
class HpinDrvrLoad;
|
||||||
|
class HpinDrvrLoadVisitor;
|
||||||
|
|
||||||
|
void
|
||||||
|
visitHpinDrvrLoads(const Pin *pin,
|
||||||
|
const Network *network,
|
||||||
|
HpinDrvrLoadVisitor *visitor);
|
||||||
|
|
||||||
class HpinDrvrLoadLess
|
class HpinDrvrLoadLess
|
||||||
{
|
{
|
||||||
|
|
@ -69,11 +75,6 @@ private:
|
||||||
PinSet *hpins_to_load_;
|
PinSet *hpins_to_load_;
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
|
||||||
visitHpinDrvrLoads(const Pin *pin,
|
|
||||||
const Network *network,
|
|
||||||
HpinDrvrLoadVisitor *visitor);
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue