do not merge path delays with -to

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2022-08-09 12:31:33 -07:00
parent 6002e66cba
commit 254115c06b
2 changed files with 26 additions and 10 deletions

View File

@ -607,7 +607,18 @@ PathDelay::mergeable(ExceptionPath *exception) const
return ExceptionPath::mergeable(exception)
&& overrides(exception)
&& exception->ignoreClkLatency() == ignore_clk_latency_
&& exception->delay() == delay_;
&& exception->delay() == delay_
// path delays -to pin/inst may be along the same path because they
// can be internal pins and not restricted to normal endpoints.
// This means that
// set_max_delay -to p1
// set_max_delay -to p2
// is not the same as
// set_max_delay -to {p1 p2}
// when p1 and p2 are on the same path because once endpoint
// is encountered the exception is not complete.
&& to_ == nullptr
&& exception->to() == nullptr;
}
bool

View File

@ -2558,10 +2558,7 @@ Search::mutateTag(Tag *from_tag,
// Don't propagate a completed false path -thru unless it is a
// clock (which ignores exceptions).
return nullptr;
// Don't propagate path delay tags past the -to pin.
if (exception->isPathDelay()
&& sdc_->isCompleteTo(state, from_pin, from_rf, min_max))
return nullptr;
if (state->matchesNextThru(from_pin,to_pin,to_rf,min_max,network_)) {
// Found a -thru that we've been waiting for.
if (state->nextState()->isComplete()
@ -2571,8 +2568,13 @@ Search::mutateTag(Tag *from_tag,
state_change = true;
break;
}
// Kill loop tags at register clock pins.
if (to_is_reg_clk && exception->isLoop()) {
// Kill path delay tags past the -to pin.
if ((exception->isPathDelay()
&& sdc_->isCompleteTo(state, from_pin, from_rf, min_max))
// Kill loop tags at register clock pins.
|| (to_is_reg_clk
&& exception->isLoop())) {
state_change = true;
break;
}
@ -2607,9 +2609,12 @@ Search::mutateTag(Tag *from_tag,
return nullptr;
}
// Kill loop tags at register clock pins.
if (!(to_is_reg_clk
&& exception->isLoop()))
// Kill path delay tags past the -to pin.
if (!((exception->isPathDelay()
&& sdc_->isCompleteTo(state, from_pin, from_rf, min_max))
// Kill loop tags at register clock pins.
|| (to_is_reg_clk
&& exception->isLoop())))
new_states->insert(state);
}
}