diff --git a/src/operation/iSTA/source/module/sdf_writer/SDFWriter.cpp b/src/operation/iSTA/source/module/sdf_writer/SDFWriter.cpp index aadec6a89d..a7b83d4fc0 100644 --- a/src/operation/iSTA/source/module/sdf_writer/SDFWriter.cpp +++ b/src/operation/iSTA/source/module/sdf_writer/SDFWriter.cpp @@ -554,10 +554,19 @@ void SDFWriter::outputSDFPeriodTimingCheck(std::ofstream* sdf_file, Instance& in return; } std::string port_name = getSDFPortName(database.get_pin_map()[pin_name]); + std::string condition = getSDFCondition(timing_arc); double min_delay = getSDFTimingCheckDelay(instance, timing_check_arc, timing_arc, AnalysisType::kMin, TransType::kRise); double max_delay = getSDFTimingCheckDelay(instance, timing_check_arc, timing_arc, AnalysisType::kMax, TransType::kRise); - (*sdf_file) << " (PERIOD " << port_name << " "; + (*sdf_file) << " (PERIOD "; + if (!condition.empty()) { + (*sdf_file) << "(COND " << condition << " "; + } + (*sdf_file) << port_name; + if (!condition.empty()) { + (*sdf_file) << ")"; + } + (*sdf_file) << " "; outputSDFTriple(sdf_file, min_delay, max_delay); (*sdf_file) << ")\n"; } diff --git a/src/operation/iSTA/source/module/timing_analyzer/TimingAnalyzer.cpp b/src/operation/iSTA/source/module/timing_analyzer/TimingAnalyzer.cpp index 8db5fc723a..c62a66a976 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 ba19a449b0..51d6ca15ea 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);