diff --git a/include/sta/PathEnd.hh b/include/sta/PathEnd.hh index c41cda50..36f9e2b7 100644 --- a/include/sta/PathEnd.hh +++ b/include/sta/PathEnd.hh @@ -375,6 +375,8 @@ public: virtual const TimingRole *checkRole(const StaState *sta) const; virtual Required requiredTime(const StaState *sta) const; virtual Arrival borrow(const StaState *sta) const; + virtual float targetClkTime(const StaState *sta) const; + virtual float targetClkOffset(const StaState *sta) const; Arrival targetClkWidth(const StaState *sta) const; virtual int exceptPathCmp(const PathEnd *path_end, const StaState *sta) const; diff --git a/search/Latches.cc b/search/Latches.cc index 15469083..c75028b1 100644 --- a/search/Latches.cc +++ b/search/Latches.cc @@ -93,7 +93,7 @@ Latches::latchRequired(const Path *data_path, CycleAccting *acct = sdc_->cycleAccting(data_clk_edge, enable_clk_edge); // checkTgtClkTime - float tgt_clk_time = acct->requiredTime(check_role); + float tgt_clk_time = path_delay ? 0.0 : acct->requiredTime(check_role); // checkTgtClkArrival broken down into components. Arrival enable_arrival = max_delay + tgt_clk_time diff --git a/search/PathEnd.cc b/search/PathEnd.cc index 203b3d52..aa3e7ac9 100644 --- a/search/PathEnd.cc +++ b/search/PathEnd.cc @@ -1193,6 +1193,24 @@ PathEndLatchCheck::checkRole(const StaState *sta) const return TimingRole::latchSetup(); } +float +PathEndLatchCheck::targetClkTime(const StaState *sta) const +{ + if (path_delay_) + return 0.0; + else + return PathEndClkConstrained::targetClkTime(sta); +} + +float +PathEndLatchCheck::targetClkOffset(const StaState *sta) const +{ + if (path_delay_) + return -targetClkEdge(sta)->time(); + else + return PathEndClkConstrained::targetClkOffset(sta); +} + Required PathEndLatchCheck::requiredTime(const StaState *sta) const {