From e43337067cb27cb3b20870d17d4682e9cad3cc3a Mon Sep 17 00:00:00 2001 From: xuyipei Date: Tue, 15 Sep 2026 16:06:43 +0800 Subject: [PATCH] fix(iSTA): apply clock uncertainty to output timing checks --- .../iSTA/source/module/timing_analyzer/TimingAnalyzer.cpp | 8 ++++++-- .../iSTA/source/module/timing_reporter/TimingReporter.cpp | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/operation/iSTA/source/module/timing_analyzer/TimingAnalyzer.cpp b/src/operation/iSTA/source/module/timing_analyzer/TimingAnalyzer.cpp index 8db5fc723..c62a66a97 100644 --- a/src/operation/iSTA/source/module/timing_analyzer/TimingAnalyzer.cpp +++ b/src/operation/iSTA/source/module/timing_analyzer/TimingAnalyzer.cpp @@ -405,11 +405,15 @@ double TimingAnalyzer::getEndPointRequired(std::string& start_point, std::string Pin& pin = database.get_pin_map()[end_point]; if (pin.get_is_port()) { std::map& port_constraint_map = database.get_timing_constraint().get_port_constraint_map(); + double uncertainty = getClockUncertainty(end_point, analysis_type); + double signed_uncertainty = analysis_type == AnalysisType::kMin ? uncertainty : -uncertainty; if (analysis_type == AnalysisType::kMin && port_constraint_map.count(end_point) > 0 && port_constraint_map[end_point].get_has_output_delay_min()) { - return getEndPointCaptureTime(start_point, end_point, analysis_type) - port_constraint_map[end_point].get_output_delay_min(); + return roundTime(getEndPointCaptureTime(start_point, end_point, analysis_type) - port_constraint_map[end_point].get_output_delay_min() + + signed_uncertainty); } if (port_constraint_map.count(end_point) > 0 && port_constraint_map[end_point].get_has_output_delay_max()) { - return getEndPointCaptureTime(start_point, end_point, analysis_type) - port_constraint_map[end_point].get_output_delay_max(); + return roundTime(getEndPointCaptureTime(start_point, end_point, analysis_type) - port_constraint_map[end_point].get_output_delay_max() + + signed_uncertainty); } return default_required_time; } diff --git a/src/operation/iSTA/source/module/timing_reporter/TimingReporter.cpp b/src/operation/iSTA/source/module/timing_reporter/TimingReporter.cpp index ba19a449b..51d6ca15e 100644 --- a/src/operation/iSTA/source/module/timing_reporter/TimingReporter.cpp +++ b/src/operation/iSTA/source/module/timing_reporter/TimingReporter.cpp @@ -1436,6 +1436,8 @@ void TimingReporter::outputRequiredClockInfo(std::ofstream* report_file, TimingP double required_before_check = timing_path.get_required_time(); if (std::fabs(timing_path.get_check_time()) > STA_ERROR) { required_before_check -= delay_type == DelayType::kMax ? -timing_path.get_check_time() : timing_path.get_check_time(); + } else if (isPort(timing_path.get_end_point())) { + required_before_check += getOutputDelay(timing_path, delay_type); } outputTimingLine(report_file, "clock uncertainty", signed_uncertainty, required_before_check, true, "", label_width); } @@ -1452,7 +1454,7 @@ void TimingReporter::outputRequiredClockInfo(std::ofstream* report_file, TimingP && (port_constraint_map[timing_path.get_end_point()].get_has_output_delay_max() || port_constraint_map[timing_path.get_end_point()].get_has_output_delay_min()); if (has_output_delay) { - outputTimingLine(report_file, "output external delay", output_delay, timing_path.get_required_time(), true, "", label_width); + outputTimingLine(report_file, "output external delay", -output_delay, timing_path.get_required_time(), true, "", label_width); } } outputTimingSummaryLine(report_file, "data required time", timing_path.get_required_time(), label_width);