set_mode
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
6fd319474f
commit
f622da7134
|
|
@ -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_;
|
||||
|
|
|
|||
20
sdc/Sdc.tcl
20
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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
}
|
||||
|
||||
################################################################
|
||||
|
|
|
|||
Loading…
Reference in New Issue