Merge remote-tracking branch 'parallax/master'
This commit is contained in:
commit
d8a87863aa
|
|
@ -886,11 +886,17 @@ SdcNetwork::findNetRelative(const Instance *inst,
|
||||||
{
|
{
|
||||||
Net *net = network_->findNetRelative(inst, path_name);
|
Net *net = network_->findNetRelative(inst, path_name);
|
||||||
if (net == nullptr) {
|
if (net == nullptr) {
|
||||||
string path_name1 = escapeBrackets(path_name, this);
|
string path_name1 = escapeDividers(path_name, network_);
|
||||||
net = network_->findNetRelative(inst, path_name1.c_str());
|
net = network_->findNetRelative(inst, path_name1.c_str());
|
||||||
|
|
||||||
if (net == nullptr) {
|
if (net == nullptr) {
|
||||||
string path_name2 = escapeDividers(path_name1.c_str(), network_);
|
string path_name2 = escapeBrackets(path_name, network_);
|
||||||
net = network_->findNetRelative(inst, path_name2.c_str());
|
net = network_->findNetRelative(inst, path_name2.c_str());
|
||||||
|
|
||||||
|
if (net == nullptr) {
|
||||||
|
string path_name3 = escapeDividers(path_name2.c_str(), network_);
|
||||||
|
net = network_->findNetRelative(inst, path_name3.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return net;
|
return net;
|
||||||
|
|
|
||||||
|
|
@ -458,7 +458,8 @@ SpefReader::findParasiticNode(char *name,
|
||||||
if (pin) {
|
if (pin) {
|
||||||
if (local_only
|
if (local_only
|
||||||
&& !network_->isConnected(net_, pin))
|
&& !network_->isConnected(net_, pin))
|
||||||
warn(1651, "%s not connected to net %s.", name1, network_->pathName(net_));
|
warn(1651, "%s not connected to net %s.",
|
||||||
|
name1, sdc_network_->pathName(net_));
|
||||||
return parasitics_->ensureParasiticNode(parasitic_, pin, network_);
|
return parasitics_->ensureParasiticNode(parasitic_, pin, network_);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
||||||
|
|
@ -1074,7 +1074,8 @@ Search::findArrivals1(Level level)
|
||||||
Stats stats(debug_, report_);
|
Stats stats(debug_, report_);
|
||||||
int arrival_count = arrival_iter_->visitParallel(level, arrival_visitor_);
|
int arrival_count = arrival_iter_->visitParallel(level, arrival_visitor_);
|
||||||
deleteTagsPrev();
|
deleteTagsPrev();
|
||||||
deleteUnusedTagGroups();
|
if (arrival_count > 0)
|
||||||
|
deleteUnusedTagGroups();
|
||||||
stats.report("Find arrivals");
|
stats.report("Find arrivals");
|
||||||
if (arrival_iter_->empty()
|
if (arrival_iter_->empty()
|
||||||
&& invalid_arrivals_->empty()) {
|
&& invalid_arrivals_->empty()) {
|
||||||
|
|
|
||||||
|
|
@ -3196,24 +3196,30 @@ Sta::findRequired(Vertex *vertex)
|
||||||
{
|
{
|
||||||
searchPreamble();
|
searchPreamble();
|
||||||
search_->findAllArrivals();
|
search_->findAllArrivals();
|
||||||
search_->findRequireds(vertex->level());
|
if (search_->isEndpoint(vertex)
|
||||||
if (variables_->crprEnabled()
|
// Need to include downstream required times if there is fanout.
|
||||||
&& search_->crprPathPruningEnabled()
|
&& !hasFanout(vertex, search_->searchAdj(), graph_))
|
||||||
&& !search_->crprApproxMissingRequireds()
|
search_->seedRequired(vertex);
|
||||||
// Clocks invariably have requireds that are pruned but it isn't
|
else {
|
||||||
// worth finding arrivals and requireds all over again for
|
|
||||||
// the entire fanout of the clock.
|
|
||||||
&& !search_->isClock(vertex)) {
|
|
||||||
// Invalidate arrivals and requireds and disable
|
|
||||||
// path pruning on fanout vertices with DFS.
|
|
||||||
int fanout = 0;
|
|
||||||
disableFanoutCrprPruning(vertex, fanout);
|
|
||||||
debugPrint(debug_, "search", 1, "resurrect pruned required %s fanout %d",
|
|
||||||
vertex->to_string(this).c_str(),
|
|
||||||
fanout);
|
|
||||||
// Find fanout arrivals and requireds with pruning disabled.
|
|
||||||
search_->findArrivals();
|
|
||||||
search_->findRequireds(vertex->level());
|
search_->findRequireds(vertex->level());
|
||||||
|
if (variables_->crprEnabled()
|
||||||
|
&& search_->crprPathPruningEnabled()
|
||||||
|
&& !search_->crprApproxMissingRequireds()
|
||||||
|
// Clocks invariably have requireds that are pruned but it isn't
|
||||||
|
// worth finding arrivals and requireds all over again for
|
||||||
|
// the entire fanout of the clock.
|
||||||
|
&& !search_->isClock(vertex)) {
|
||||||
|
// Invalidate arrivals and requireds and disable
|
||||||
|
// path pruning on fanout vertices with DFS.
|
||||||
|
int fanout = 0;
|
||||||
|
disableFanoutCrprPruning(vertex, fanout);
|
||||||
|
debugPrint(debug_, "search", 1, "resurrect pruned required %s fanout %d",
|
||||||
|
vertex->to_string(this).c_str(),
|
||||||
|
fanout);
|
||||||
|
// Find fanout arrivals and requireds with pruning disabled.
|
||||||
|
search_->findArrivals();
|
||||||
|
search_->findRequireds(vertex->level());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue