Merge remote-tracking branch 'parallax_sta/master' into sta_update_latest_0505

This commit is contained in:
dsengupta0628
2026-05-05 17:06:10 +00:00
10 changed files with 119 additions and 57 deletions

View File

@@ -4,6 +4,13 @@ OpenSTA Timing Analyzer Release Notes
This file summarizes user visible changes for each release.
See ApiChangeLog.txt for changes to the STA api.
2026/05/01
----------
The write_sdc command supports a -mode argument.
read_sdc [-mode mode]
2026/03/23
----------

View File

@@ -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;
@@ -1042,6 +1042,13 @@ public:
const Scene *scene,
const MinMax *min_max,
int digits);
void writeSdc(std::string_view filename,
std::string_view mode_name,
bool leaf,
bool native,
int digits,
bool gzip,
bool no_timestamp);
void writeSdc(const Sdc *sdc,
std::string_view filename,
// Map hierarchical pins and instances to leaf pins and instances.
@@ -1611,6 +1618,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_;

View File

@@ -94,6 +94,7 @@ private:
void
write_sdc_cmd(std::string filename,
std::string mode_name,
bool leaf,
bool compatible,
int digits,
@@ -101,8 +102,7 @@ write_sdc_cmd(std::string filename,
bool no_timestamp)
{
Sta *sta = Sta::sta();
const Sdc *sdc = sta->cmdSdc();
sta->writeSdc(sdc, filename, leaf, compatible, digits, gzip, no_timestamp);
sta->writeSdc(filename, mode_name, leaf, compatible, digits, gzip, no_timestamp);
}
void

View File

@@ -42,31 +42,38 @@ 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
set_cmd_mode $mode_name
include_file $filename $echo 0
} finally {
if { $prev_mode != "default" } {
set_mode_cmd $prev_mode
set_cmd_mode $prev_mode
}
}
} else {
include_file $filename $echo 0
}
}
################################################################
define_cmd_args "write_sdc" \
{[-map_hpins] [-digits digits] [-gzip] [-no_timestamp] filename}
{[-mode mode] [-map_hpins] [-digits digits] [-gzip] [-no_timestamp] filename}
proc write_sdc { args } {
parse_key_args "write_sdc" args keys {-digits -significant_digits} \
parse_key_args "write_sdc" args keys {-mode -digits} \
flags {-map_hpins -compatible -gzip -no_timestamp}
check_argc_eq1 "write_sdc" $args
set mode [cmd_mode]
if { [info exists keys(-mode)] } {
set mode $keys(-mode)
}
set digits 4
if { [info exists keys(-digits)] } {
set digits $keys(-digits)
@@ -78,7 +85,7 @@ proc write_sdc { args } {
set no_timestamp [info exists flags(-no_timestamp)]
set map_hpins [info exists flags(-map_hpins)]
set native [expr ![info exists flags(-compatible)]]
write_sdc_cmd $filename $map_hpins $native $digits $gzip $no_timestamp
write_sdc_cmd $filename $mode $map_hpins $native $digits $gzip $no_timestamp
}
################################################################

View File

@@ -180,7 +180,7 @@ define_cmd_args "write_sdf" \
proc_redirect write_sdf {
parse_key_args "write_sdf" args \
keys {-corner -scene -divider -digits -significant_digits} \
keys {-corner -scene -divider -digits} \
flags {-include_typ -gzip -no_timestamp -no_version}
check_argc_eq1 "write_sdf" $args
set scene [parse_scene keys]

View File

@@ -818,8 +818,14 @@ cmd_mode_name()
return Sta::sta()->cmdMode()->name();
}
Mode *
cmd_mode()
{
return Sta::sta()->cmdMode();
}
void
set_mode_cmd(std::string mode_name)
set_cmd_mode(std::string mode_name)
{
Sta::sta()->setCmdMode(mode_name);
}
@@ -830,6 +836,12 @@ find_modes(std::string mode_name)
return Sta::sta()->findModes(mode_name);
}
Mode *
find_mode(std::string mode_name)
{
return Sta::sta()->findMode(mode_name);
}
////////////////////////////////////////////////////////////////
CheckErrorSeq &

View File

@@ -570,14 +570,30 @@ 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)) {
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;
}
}
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];
@@ -589,12 +605,12 @@ Sta::setCmdMode(std::string_view mode_name)
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();
}
}
}
Mode *
@@ -2190,6 +2206,22 @@ Sta::checkExceptionToPins(ExceptionTo *to,
}
}
void
Sta::writeSdc(std::string_view filename,
std::string_view mode_name,
bool leaf,
bool native,
int digits,
bool gzip,
bool no_timestamp)
{
Mode *mode = findMode(mode_name);
if (mode)
writeSdc(mode->sdc(), filename, leaf, native, digits, gzip, no_timestamp);
else
report_->warn(1561, "mode {} not found.", mode_name);
}
void
Sta::writeSdc(const Sdc *sdc,
std::string_view filename,
@@ -2514,6 +2546,7 @@ Sta::makeDefaultScene()
makeScene(name, mode, parasitics);
cmd_scene_ = scenes_[0];
cmd_mode_ = mode;
}
// define_corners (before read_liberty).
@@ -2603,8 +2636,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 +2729,7 @@ void
Sta::setCmdScene(Scene *scene)
{
cmd_scene_ = scene;
cmd_mode_ = scene->mode();
}
SceneSeq
@@ -3529,7 +3563,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());
@@ -3927,14 +3961,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();
}

View File

@@ -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]
}
################################################################

View File

@@ -156,11 +156,8 @@ proc expand_tests { argv } {
lappend tests $test
}
}
} elseif { [lsearch [group_tests "all"] $arg] != -1 } {
lappend tests $arg
} else {
puts "Error: test $arg not found."
incr errors(no_cmd)
lappend tests $arg
}
}
return $tests
@@ -525,15 +522,11 @@ proc show_summary {} {
if { $valgrind_shared_lib_failure } {
puts "WARNING: valgrind failed because the executable is not statically linked."
}
puts "See $result_dir for log files"
set test_count [llength $tests]
if { [found_errors] } {
if { $errors(error) != 0 } {
puts "Errored $errors(error)/$test_count"
}
if { $errors(fail) != 0 } {
puts "Failed $errors(fail)/$test_count"
}
if { $errors(leak) != 0 } {
puts "Memory leaks in $errors(leak)/$test_count"
}
@@ -547,7 +540,7 @@ proc show_summary {} {
puts "No cmd tcl file for $errors(no_cmd)/$test_count"
}
if { $errors(fail) != 0 } {
puts "See $diff_file for differences"
puts "Failed $errors(fail)/$test_count"
}
} else {
puts "Passed $test_count"

View File

@@ -447,12 +447,13 @@ VerilogWriter::writeAssigns(const Instance *inst)
if (term) {
Net *net = network_->net(term);
Port *port = network_->port(pin);
if (port
if (net
&& port
&& (include_pwr_gnd_
|| !(network_->isPower(net) || network_->isGround(net)))
&& (network_->direction(port)->isAnyOutput()
|| (include_pwr_gnd_ && network_->direction(port)->isPowerGround()))
&& !stringEqual(network_->name(port), network_->name(net))) {
&& network_->name(port) != network_->name(net)) {
// Port name is different from net name.
std::string port_vname = netVerilogName(std::string(network_->name(port)));
std::string net_vname = netVerilogName(std::string(network_->name(net)));