Skip to content

Commit a94316d

Browse files
yipeixWenz-jam
andauthored
Sta main (#147)
Co-authored-by: Wenz-jam <wjj20040520@163.com>
1 parent 76b02fa commit a94316d

4 files changed

Lines changed: 39 additions & 41 deletions

File tree

src/operation/iSTA/source/data_manager/advance/TimingPoint.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class TimingPoint
6060
return _physical_clock_predecessor_trans_type_map;
6161
}
6262
std::map<AnalysisType, std::map<TransType, double>>& get_data_slew_map() { return _data_slew_map; }
63+
// The innermost key is the launch clock name, not the individual startpoint.
6364
std::map<AnalysisType, std::map<PathSourceType, std::map<TransType, std::map<std::string, TimingPathState>>>>& get_path_state_map()
6465
{
6566
return _path_state_map;

src/operation/iSTA/source/module/timing_analyzer/TimingAnalyzer.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,10 @@ std::map<std::string, TimingPathState>& TimingAnalyzer::getPathStateMap(TimingPo
190190
}
191191

192192
TimingPathState& TimingAnalyzer::getPathState(TimingPoint& timing_point, AnalysisType analysis_type, PathSourceType source_type, TransType trans_type,
193-
std::string& start_point)
193+
std::string& start_point)
194194
{
195-
return timing_point.get_path_state_map()[analysis_type][source_type][trans_type][start_point];
195+
std::string path_state_tag{getClockName(start_point)};
196+
return timing_point.get_path_state_map()[analysis_type][source_type][trans_type][path_state_tag];
196197
}
197198

198199
TimingPathState* TimingAnalyzer::getWorstPathState(TimingPoint& timing_point, AnalysisType analysis_type, PathSourceType source_type)
@@ -1133,15 +1134,15 @@ bool TimingAnalyzer::updateDiversionPathState(std::string& pin_name, AnalysisTyp
11331134
{
11341135
Database& database = STADM.getDatabase();
11351136
TimingPoint& timing_point = database.get_timing_point_map()[pin_name];
1136-
std::string& start_point = source_path_state.get_start_point();
1137+
const std::string& path_state_tag = source_path_state.get_clock_name();
11371138
std::map<std::string, TimingPathState>& path_state_map = getPathStateMap(timing_point, analysis_type, source_type, trans_type);
1138-
if (path_state_map.count(start_point) > 0 && !isBetterArrival(arrival, path_state_map[start_point].get_arrival(), analysis_type)) {
1139+
if (path_state_map.count(path_state_tag) > 0 && !isBetterArrival(arrival, path_state_map[path_state_tag].get_arrival(), analysis_type)) {
11391140
return false;
11401141
}
1141-
TimingPathState& path_state = path_state_map[start_point];
1142+
TimingPathState& path_state = path_state_map[path_state_tag];
11421143
path_state.set_arrival(arrival);
11431144
path_state.set_slew(getDataSlew(timing_point, analysis_type, trans_type));
1144-
path_state.set_start_point(start_point);
1145+
path_state.set_start_point(source_path_state.get_start_point());
11451146
path_state.set_predecessor(predecessor);
11461147
path_state.set_predecessor_arc_idx(predecessor_arc_idx);
11471148
path_state.set_predecessor_arc_delay(predecessor_arc_delay);

src/operation/iSTA/source/module/timing_propagator/TimingPropagator.cpp

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -572,34 +572,29 @@ void TimingPropagator::seedPathState(std::string& start_point, AnalysisType anal
572572
return;
573573
}
574574
std::string path_state_start_point = getPathStateStartPoint(start_point);
575-
TimingPathState& rise_path_state
576-
= database.get_timing_point_map()[start_point].get_path_state_map()[analysis_type][source_type][TransType::kRise][path_state_start_point];
577-
rise_path_state.set_arrival(getStartPointArrival(start_point, analysis_type, TransType::kRise));
578-
rise_path_state.set_slew(getStartPointSlew(start_point, analysis_type, TransType::kRise));
579-
rise_path_state.set_launch_time(getStartPointLaunchTime(start_point, analysis_type, TransType::kRise));
580-
rise_path_state.set_start_point(path_state_start_point);
581-
rise_path_state.set_clock_name(getClockName(start_point));
582-
rise_path_state.set_crpr_clock_pin(getStartPointCrprClockPin(start_point));
583-
rise_path_state.get_predecessor().clear();
584-
rise_path_state.set_predecessor_arc_idx(std::numeric_limits<std::size_t>::max());
585-
rise_path_state.set_predecessor_arc_delay(0.0);
586-
rise_path_state.set_trans_type(TransType::kRise);
587-
rise_path_state.set_predecessor_trans_type(TransType::kNone);
588-
rise_path_state.set_crpr_clock_trans_type(getStartPointCrprClockTransType(start_point));
589-
TimingPathState& fall_path_state
590-
= database.get_timing_point_map()[start_point].get_path_state_map()[analysis_type][source_type][TransType::kFall][path_state_start_point];
591-
fall_path_state.set_arrival(getStartPointArrival(start_point, analysis_type, TransType::kFall));
592-
fall_path_state.set_slew(getStartPointSlew(start_point, analysis_type, TransType::kFall));
593-
fall_path_state.set_launch_time(getStartPointLaunchTime(start_point, analysis_type, TransType::kFall));
594-
fall_path_state.set_start_point(path_state_start_point);
595-
fall_path_state.set_clock_name(getClockName(start_point));
596-
fall_path_state.set_crpr_clock_pin(getStartPointCrprClockPin(start_point));
597-
fall_path_state.get_predecessor().clear();
598-
fall_path_state.set_predecessor_arc_idx(std::numeric_limits<std::size_t>::max());
599-
fall_path_state.set_predecessor_arc_delay(0.0);
600-
fall_path_state.set_trans_type(TransType::kFall);
601-
fall_path_state.set_predecessor_trans_type(TransType::kNone);
602-
fall_path_state.set_crpr_clock_trans_type(getStartPointCrprClockTransType(start_point));
575+
std::string path_state_tag{getClockName(start_point)};
576+
TimingPoint& timing_point = database.get_timing_point_map()[start_point];
577+
for (TransType trans_type : {TransType::kRise, TransType::kFall}) {
578+
double arrival = getStartPointArrival(start_point, analysis_type, trans_type);
579+
std::map<std::string, TimingPathState>& path_state_map = getPathStateMap(timing_point, analysis_type, source_type, trans_type);
580+
if (path_state_map.count(path_state_tag) > 0 && !isBetterArrival(arrival, path_state_map[path_state_tag].get_arrival(), analysis_type)) {
581+
continue;
582+
}
583+
584+
TimingPathState& path_state = path_state_map[path_state_tag];
585+
path_state.set_arrival(arrival);
586+
path_state.set_slew(getStartPointSlew(start_point, analysis_type, trans_type));
587+
path_state.set_launch_time(getStartPointLaunchTime(start_point, analysis_type, trans_type));
588+
path_state.set_start_point(path_state_start_point);
589+
path_state.set_clock_name(path_state_tag);
590+
path_state.set_crpr_clock_pin(getStartPointCrprClockPin(start_point));
591+
path_state.get_predecessor().clear();
592+
path_state.set_predecessor_arc_idx(std::numeric_limits<std::size_t>::max());
593+
path_state.set_predecessor_arc_delay(0.0);
594+
path_state.set_trans_type(trans_type);
595+
path_state.set_predecessor_trans_type(TransType::kNone);
596+
path_state.set_crpr_clock_trans_type(getStartPointCrprClockTransType(start_point));
597+
}
603598
}
604599

605600
PathSourceType TimingPropagator::getStartPointSourceType(std::string& start_point, AnalysisType analysis_type)
@@ -721,13 +716,14 @@ void TimingPropagator::propagatePathStateArc(std::size_t arc_idx, AnalysisType a
721716
}
722717
double arc_delay = getArcDelay(arc, analysis_type, input_trans_type, output_trans_type);
723718
double candidate_arrival = roundTime(source_path_state.get_arrival() + arc_delay);
724-
std::string& start_point = source_path_state.get_start_point();
719+
const std::string& path_state_tag = source_path_state.get_clock_name();
725720
std::map<std::string, TimingPathState>& sink_path_state_map = getPathStateMap(sink_point, analysis_type, source_type, output_trans_type);
726-
if (sink_path_state_map.count(start_point) == 0 || isBetterArrival(candidate_arrival, sink_path_state_map[start_point].get_arrival(), analysis_type)) {
727-
TimingPathState& sink_path_state = sink_path_state_map[start_point];
721+
if (sink_path_state_map.count(path_state_tag) == 0
722+
|| isBetterArrival(candidate_arrival, sink_path_state_map[path_state_tag].get_arrival(), analysis_type)) {
723+
TimingPathState& sink_path_state = sink_path_state_map[path_state_tag];
728724
sink_path_state.set_arrival(candidate_arrival);
729725
sink_path_state.set_slew(getDataSlew(sink_point, analysis_type, output_trans_type));
730-
sink_path_state.set_start_point(start_point);
726+
sink_path_state.set_start_point(source_path_state.get_start_point());
731727
sink_path_state.set_predecessor(arc.get_source_pin());
732728
sink_path_state.set_predecessor_arc_idx(arc_idx);
733729
sink_path_state.set_predecessor_arc_delay(arc_delay);
@@ -797,9 +793,9 @@ std::map<std::string, TimingPathState>& TimingPropagator::getPathStateMap(Timing
797793
}
798794

799795
TimingPathState& TimingPropagator::getPathState(TimingPoint& timing_point, AnalysisType analysis_type, PathSourceType source_type, TransType trans_type,
800-
std::string& start_point)
796+
std::string& path_state_tag)
801797
{
802-
return timing_point.get_path_state_map()[analysis_type][source_type][trans_type][start_point];
798+
return timing_point.get_path_state_map()[analysis_type][source_type][trans_type][path_state_tag];
803799
}
804800

805801
TimingPathState* TimingPropagator::getWorstPathState(TimingPoint& timing_point, AnalysisType analysis_type, PathSourceType source_type)

src/operation/iSTA/source/module/timing_propagator/TimingPropagator.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class TimingPropagator
101101
std::map<std::string, TimingPathState>& getPathStateMap(TimingPoint& timing_point, AnalysisType analysis_type, PathSourceType source_type,
102102
TransType trans_type);
103103
TimingPathState& getPathState(TimingPoint& timing_point, AnalysisType analysis_type, PathSourceType source_type, TransType trans_type,
104-
std::string& start_point);
104+
std::string& path_state_tag);
105105
TimingPathState* getWorstPathState(TimingPoint& timing_point, AnalysisType analysis_type, PathSourceType source_type);
106106
TimingPathState* getWorstPathState(TimingPoint& timing_point, AnalysisType analysis_type, PathSourceType source_type, TransType trans_type);
107107
TransType getEndPointTransType(TimingPoint& timing_point, AnalysisType analysis_type, PathSourceType source_type);

0 commit comments

Comments
 (0)