mirror of
https://github.com/The-OpenROAD-Project/OpenSTA.git
synced 2026-05-30 00:24:12 +08:00
Merge remote-tracking branch 'parallax_sta/master' into sta_update_latest_0505
This commit is contained in:
@@ -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
|
||||
----------
|
||||
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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
|
||||
|
||||
21
sdc/Sdc.tcl
21
sdc/Sdc.tcl
@@ -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
|
||||
}
|
||||
|
||||
################################################################
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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 &
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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]
|
||||
}
|
||||
|
||||
################################################################
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)));
|
||||
|
||||
Reference in New Issue
Block a user