@@ -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
605600PathSourceType 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
799795TimingPathState& 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
805801TimingPathState* TimingPropagator::getWorstPathState (TimingPoint& timing_point, AnalysisType analysis_type, PathSourceType source_type)
0 commit comments