From f622da713443662802b36d1c06d5089561cdc248 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Fri, 1 May 2026 10:01:10 -0700 Subject: [PATCH] set_mode Signed-off-by: James Cherry --- include/sta/Sta.hh | 3 ++- sdc/Sdc.tcl | 20 ++++++++------- search/Search.i | 2 +- search/Sta.cc | 62 ++++++++++++++++++++++++++++++---------------- tcl/Sta.tcl | 4 +-- 5 files changed, 56 insertions(+), 35 deletions(-) diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index 7817b1c2..5f9c1362 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -138,7 +138,7 @@ public: void setCmdScene(Scene *scene); SceneSeq makeSceneSeq(Scene *scene) const; - Mode *cmdMode() const { return cmd_scene_->mode(); } + Mode *cmdMode() const { return cmd_mode_; } const std::string &cmdModeName(); void setCmdMode(std::string_view mode_name); Mode *findMode(std::string_view mode_name) const; @@ -1604,6 +1604,7 @@ protected: void checkLibrarayPocv(); Scene *cmd_scene_{nullptr}; + Mode *cmd_mode_{nullptr}; CmdNamespace cmd_namespace_{CmdNamespace::sdc}; Instance *current_instance_{nullptr}; SceneNameMap scene_name_map_; diff --git a/sdc/Sdc.tcl b/sdc/Sdc.tcl index d8e5aef1..4c11522b 100644 --- a/sdc/Sdc.tcl +++ b/sdc/Sdc.tcl @@ -42,18 +42,20 @@ proc_redirect read_sdc { check_argc_eq1 "read_sdc" $args set echo [info exists flags(-echo)] set filename [file nativename [lindex $args 0]] - set mode_name {} + if { [info exists keys(-mode)] } { set mode_name $keys(-mode) - } - set prev_mode [cmd_mode_name] - try { - set_mode_cmd $mode_name - include_file $filename $echo 0 - } finally { - if { $prev_mode != "default" } { - set_mode_cmd $prev_mode + set prev_mode [cmd_mode_name] + try { + set_cmd_mode $mode_name + include_file $filename $echo 0 + } finally { + if { $prev_mode != "default" } { + set_cmd_mode $prev_mode + } } + } else { + include_file $filename $echo 0 } } diff --git a/search/Search.i b/search/Search.i index 0764ae68..85de21d5 100644 --- a/search/Search.i +++ b/search/Search.i @@ -817,7 +817,7 @@ cmd_mode_name() } void -set_mode_cmd(std::string mode_name) +set_cmd_mode(std::string mode_name) { Sta::sta()->setCmdMode(mode_name); } diff --git a/search/Sta.cc b/search/Sta.cc index 9ccdc841..6593b16d 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -570,30 +570,46 @@ Sta::clearNonSdc() Sdc * Sta::cmdSdc() const { - return cmdMode()->sdc(); + return cmd_mode_->sdc(); } void Sta::setCmdMode(std::string_view mode_name) { - if (!mode_name.empty()) { - if (!mode_name_map_.contains(mode_name)) { - if (modes_.size() == 1 && modes_[0]->name() == "default") { - // No need for default mode if one is defined. - delete modes_[0]; - mode_name_map_.clear(); - modes_.clear(); + Mode *mode = findKey(mode_name_map_, std::string(mode_name)); + if (mode) { + // Sync scene with mode. Note that multiple scenes can share a mode. + Scene *mode_scene = nullptr; + for (Scene *scene : scenes_) { + if (scene->mode() == mode) { + if (mode_scene) { + report_->warn(1556, "multiple scenes reference mode {}", mode_name); + break; + } + mode_scene = scene; } - Mode *mode = new Mode(mode_name, mode_name_map_.size(), this); - mode_name_map_[std::string(mode_name)] = mode; - modes_.push_back(mode); - mode->sim()->setMode(mode); - mode->sim()->setObserver(new StaSimObserver(this)); - - if (scenes_.size() == 1 && scenes_[0]->name() == "default") - scenes_[0]->setMode(mode); - updateComponentsState(); } + if (mode_scene) + cmd_scene_ = mode_scene; + cmd_mode_ = mode; + } + else { + if (modes_.size() == 1 && modes_[0]->name() == "default") { + // No need for default mode if one is defined. + delete modes_[0]; + mode_name_map_.clear(); + modes_.clear(); + } + Mode *mode = new Mode(mode_name, mode_name_map_.size(), this); + mode_name_map_[std::string(mode_name)] = mode; + modes_.push_back(mode); + mode->sim()->setMode(mode); + mode->sim()->setObserver(new StaSimObserver(this)); + cmd_mode_ = mode; + + if (scenes_.size() == 1 && scenes_[0]->name() == "default") + scenes_[0]->setMode(mode); + updateComponentsState(); } } @@ -2514,6 +2530,7 @@ Sta::makeDefaultScene() makeScene(name, mode, parasitics); cmd_scene_ = scenes_[0]; + cmd_mode_ = mode; } // define_corners (before read_liberty). @@ -2603,8 +2620,8 @@ Sta::makeScene(const std::string &name, if (scenes_.size() == 1 && findScene("default")) deleteScenes(); - Scene *scene = - new Scene(name, scenes_.size(), mode, parasitics_min, parasitics_max); + Scene *scene = new Scene(name, scenes_.size(), mode, + parasitics_min, parasitics_max); scene_name_map_[name] = scene; scenes_.push_back(scene); mode->addScene(scene); @@ -2696,6 +2713,7 @@ void Sta::setCmdScene(Scene *scene) { cmd_scene_ = scene; + cmd_mode_ = scene->mode(); } SceneSeq @@ -3496,7 +3514,7 @@ Sta::findRequired(Vertex *vertex) search_->findAllArrivals(); if (search_->isEndpoint(vertex) // Need to include downstream required times if there is fanout. - && !hasFanout(vertex, search_->searchAdj(), graph_, cmdMode())) + && !hasFanout(vertex, search_->searchAdj(), graph_, cmd_mode_)) search_->seedRequired(vertex); else search_->findRequireds(vertex->level()); @@ -3894,14 +3912,14 @@ Sta::findLogicConstants() { ensureGraph(); // Sdc independent constants so any mode should return the same values. - Sim *sim = cmdMode()->sim(); + Sim *sim = cmd_mode_->sim(); sim->findLogicConstants(); } void Sta::clearLogicConstants() { - Sim *sim = cmdMode()->sim(); + Sim *sim = cmd_mode_->sim(); sim->clear(); } diff --git a/tcl/Sta.tcl b/tcl/Sta.tcl index 2db64f5e..ee560962 100644 --- a/tcl/Sta.tcl +++ b/tcl/Sta.tcl @@ -102,7 +102,7 @@ define_cmd_args "set_scene" {scene_name} proc set_scene { args } { check_argc_eq1 "set_scene" $args - set_scene_cmd [lindex $args 0] + set_cmd_scene [lindex $args 0] } ################################################################ @@ -141,7 +141,7 @@ define_cmd_args "set_mode" {mode_name} proc set_mode { args } { check_argc_eq1 "set_mode" $args - set_mode_cmd [lindex $args 0] + set_cmd_mode [lindex $args 0] } ################################################################