@@ -570,30 +570,46 @@ Sta::clearNonSdc()
570570Sdc *
571571Sta::cmdSdc () const
572572{
573- return cmdMode () ->sdc ();
573+ return cmd_mode_ ->sdc ();
574574}
575575
576576void
577577Sta::setCmdMode (std::string_view mode_name)
578578{
579- if (!mode_name.empty ()) {
580- if (!mode_name_map_.contains (mode_name)) {
581- if (modes_.size () == 1 && modes_[0 ]->name () == " default" ) {
582- // No need for default mode if one is defined.
583- delete modes_[0 ];
584- mode_name_map_.clear ();
585- modes_.clear ();
579+ Mode *mode = findKey (mode_name_map_, std::string (mode_name));
580+ if (mode) {
581+ // Sync scene with mode. Note that multiple scenes can share a mode.
582+ Scene *mode_scene = nullptr ;
583+ for (Scene *scene : scenes_) {
584+ if (scene->mode () == mode) {
585+ if (mode_scene) {
586+ report_->warn (1556 , " multiple scenes reference mode {}" , mode_name);
587+ break ;
588+ }
589+ mode_scene = scene;
586590 }
587- Mode *mode = new Mode (mode_name, mode_name_map_.size (), this );
588- mode_name_map_[std::string (mode_name)] = mode;
589- modes_.push_back (mode);
590- mode->sim ()->setMode (mode);
591- mode->sim ()->setObserver (new StaSimObserver (this ));
592-
593- if (scenes_.size () == 1 && scenes_[0 ]->name () == " default" )
594- scenes_[0 ]->setMode (mode);
595- updateComponentsState ();
596591 }
592+ if (mode_scene)
593+ cmd_scene_ = mode_scene;
594+ cmd_mode_ = mode;
595+ }
596+ else {
597+ if (modes_.size () == 1 && modes_[0 ]->name () == " default" ) {
598+ // No need for default mode if one is defined.
599+ delete modes_[0 ];
600+ mode_name_map_.clear ();
601+ modes_.clear ();
602+ }
603+ Mode *mode = new Mode (mode_name, mode_name_map_.size (), this );
604+ mode_name_map_[std::string (mode_name)] = mode;
605+ modes_.push_back (mode);
606+ mode->sim ()->setMode (mode);
607+ mode->sim ()->setObserver (new StaSimObserver (this ));
608+ cmd_mode_ = mode;
609+
610+ if (scenes_.size () == 1 && scenes_[0 ]->name () == " default" )
611+ scenes_[0 ]->setMode (mode);
612+ updateComponentsState ();
597613 }
598614}
599615
@@ -2514,6 +2530,7 @@ Sta::makeDefaultScene()
25142530 makeScene (name, mode, parasitics);
25152531
25162532 cmd_scene_ = scenes_[0 ];
2533+ cmd_mode_ = mode;
25172534}
25182535
25192536// define_corners (before read_liberty).
@@ -2603,8 +2620,8 @@ Sta::makeScene(const std::string &name,
26032620 if (scenes_.size () == 1 && findScene (" default" ))
26042621 deleteScenes ();
26052622
2606- Scene *scene =
2607- new Scene (name, scenes_. size (), mode, parasitics_min, parasitics_max);
2623+ Scene *scene = new Scene (name, scenes_. size (), mode,
2624+ parasitics_min, parasitics_max);
26082625 scene_name_map_[name] = scene;
26092626 scenes_.push_back (scene);
26102627 mode->addScene (scene);
@@ -2696,6 +2713,7 @@ void
26962713Sta::setCmdScene (Scene *scene)
26972714{
26982715 cmd_scene_ = scene;
2716+ cmd_mode_ = scene->mode ();
26992717}
27002718
27012719SceneSeq
@@ -3496,7 +3514,7 @@ Sta::findRequired(Vertex *vertex)
34963514 search_->findAllArrivals ();
34973515 if (search_->isEndpoint (vertex)
34983516 // Need to include downstream required times if there is fanout.
3499- && !hasFanout (vertex, search_->searchAdj (), graph_, cmdMode () ))
3517+ && !hasFanout (vertex, search_->searchAdj (), graph_, cmd_mode_ ))
35003518 search_->seedRequired (vertex);
35013519 else
35023520 search_->findRequireds (vertex->level ());
@@ -3894,14 +3912,14 @@ Sta::findLogicConstants()
38943912{
38953913 ensureGraph ();
38963914 // Sdc independent constants so any mode should return the same values.
3897- Sim *sim = cmdMode () ->sim ();
3915+ Sim *sim = cmd_mode_ ->sim ();
38983916 sim->findLogicConstants ();
38993917}
39003918
39013919void
39023920Sta::clearLogicConstants ()
39033921{
3904- Sim *sim = cmdMode () ->sim ();
3922+ Sim *sim = cmd_mode_ ->sim ();
39053923 sim->clear ();
39063924}
39073925
0 commit comments