Skip to content

Commit f622da7

Browse files
committed
set_mode
Signed-off-by: James Cherry <cherry@parallaxsw.com>
1 parent 6fd3194 commit f622da7

5 files changed

Lines changed: 56 additions & 35 deletions

File tree

include/sta/Sta.hh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public:
138138
void setCmdScene(Scene *scene);
139139
SceneSeq makeSceneSeq(Scene *scene) const;
140140

141-
Mode *cmdMode() const { return cmd_scene_->mode(); }
141+
Mode *cmdMode() const { return cmd_mode_; }
142142
const std::string &cmdModeName();
143143
void setCmdMode(std::string_view mode_name);
144144
Mode *findMode(std::string_view mode_name) const;
@@ -1604,6 +1604,7 @@ protected:
16041604
void checkLibrarayPocv();
16051605

16061606
Scene *cmd_scene_{nullptr};
1607+
Mode *cmd_mode_{nullptr};
16071608
CmdNamespace cmd_namespace_{CmdNamespace::sdc};
16081609
Instance *current_instance_{nullptr};
16091610
SceneNameMap scene_name_map_;

sdc/Sdc.tcl

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,20 @@ proc_redirect read_sdc {
4242
check_argc_eq1 "read_sdc" $args
4343
set echo [info exists flags(-echo)]
4444
set filename [file nativename [lindex $args 0]]
45-
set mode_name {}
45+
4646
if { [info exists keys(-mode)] } {
4747
set mode_name $keys(-mode)
48-
}
49-
set prev_mode [cmd_mode_name]
50-
try {
51-
set_mode_cmd $mode_name
52-
include_file $filename $echo 0
53-
} finally {
54-
if { $prev_mode != "default" } {
55-
set_mode_cmd $prev_mode
48+
set prev_mode [cmd_mode_name]
49+
try {
50+
set_cmd_mode $mode_name
51+
include_file $filename $echo 0
52+
} finally {
53+
if { $prev_mode != "default" } {
54+
set_cmd_mode $prev_mode
55+
}
5656
}
57+
} else {
58+
include_file $filename $echo 0
5759
}
5860
}
5961

search/Search.i

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,7 @@ cmd_mode_name()
817817
}
818818

819819
void
820-
set_mode_cmd(std::string mode_name)
820+
set_cmd_mode(std::string mode_name)
821821
{
822822
Sta::sta()->setCmdMode(mode_name);
823823
}

search/Sta.cc

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -570,30 +570,46 @@ Sta::clearNonSdc()
570570
Sdc *
571571
Sta::cmdSdc() const
572572
{
573-
return cmdMode()->sdc();
573+
return cmd_mode_->sdc();
574574
}
575575

576576
void
577577
Sta::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
26962713
Sta::setCmdScene(Scene *scene)
26972714
{
26982715
cmd_scene_ = scene;
2716+
cmd_mode_ = scene->mode();
26992717
}
27002718

27012719
SceneSeq
@@ -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

39013919
void
39023920
Sta::clearLogicConstants()
39033921
{
3904-
Sim *sim = cmdMode()->sim();
3922+
Sim *sim = cmd_mode_->sim();
39053923
sim->clear();
39063924
}
39073925

tcl/Sta.tcl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ define_cmd_args "set_scene" {scene_name}
102102

103103
proc set_scene { args } {
104104
check_argc_eq1 "set_scene" $args
105-
set_scene_cmd [lindex $args 0]
105+
set_cmd_scene [lindex $args 0]
106106
}
107107

108108
################################################################
@@ -141,7 +141,7 @@ define_cmd_args "set_mode" {mode_name}
141141

142142
proc set_mode { args } {
143143
check_argc_eq1 "set_mode" $args
144-
set_mode_cmd [lindex $args 0]
144+
set_cmd_mode [lindex $args 0]
145145
}
146146

147147
################################################################

0 commit comments

Comments
 (0)