Files
OpenSTA/tcl/Property.tcl
T
Deepashree Sengupta a0de2706d3 Add property-based -filter to get_scenes / get_modes, and make Scene/Mode properties extensible (#456)
* support for filter in get_scene/mode

Signed-off-by: dsengupta0628 <[email protected]>

* defineProperty overload

Signed-off-by: dsengupta0628 <[email protected]>

* define and set user property

Signed-off-by: dsengupta0628 <[email protected]>

* address review comments to generalize- current support for mode and scene

Signed-off-by: dsengupta0628 <[email protected]>

* address second round comments- removed user from cmd names

Signed-off-by: dsengupta0628 <[email protected]>

* remove defaults, check property vals against type defined

Signed-off-by: dsengupta0628 <[email protected]>

* address reviews, indent

Signed-off-by: dsengupta0628 <[email protected]>

* indent fix

Signed-off-by: dsengupta0628 <[email protected]>

---------

Signed-off-by: dsengupta0628 <[email protected]>
2026-07-10 09:37:48 -07:00

153 lines
5.6 KiB
Tcl

# OpenSTA, Static Timing Analyzer
# Copyright (c) 2026, Parallax Software, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# The origin of this software must not be misrepresented; you must not
# claim that you wrote the original software.
#
# Altered source versions must be plainly marked as such, and must not be
# misrepresented as being the original software.
#
# This notice may not be removed or altered from any source distribution.
namespace eval sta {
define_cmd_args "get_property" \
{[-object_type library|liberty_library|cell|liberty_cell|instance|pin|net|port|clock|timing_arc] object property}
proc get_property { args } {
parse_key_args "get_property" args keys {-object_type} flags {-quiet}
check_argc_eq2 "get_property" $args
set quiet [info exists flags(-quiet)]
set object [lindex $args 0]
if { $object == "" } {
sta_error 2200 "get_property object is null."
} elseif { ![is_object $object] } {
if [info exists keys(-object_type)] {
set object_type $keys(-object_type)
} else {
sta_error 2201 "get_property -object_type must be specified with object name argument."
}
set object [get_property_object_type $object_type $object $quiet]
}
set prop [lindex $args 1]
return [get_object_property $object $prop]
}
proc get_object_property { object prop } {
if { [is_object $object] } {
set object_type [object_type $object]
if { $object_type == "Instance" } {
return [instance_property $object $prop]
} elseif { $object_type == "Pin" } {
return [pin_property $object $prop]
} elseif { $object_type == "Net" } {
return [net_property $object $prop]
} elseif { $object_type == "Clock" } {
return [clock_property $object $prop]
} elseif { $object_type == "Scene" } {
return [scene_property $object $prop]
} elseif { $object_type == "Mode" } {
return [mode_property $object $prop]
} elseif { $object_type == "Port" } {
return [port_property $object $prop]
} elseif { $object_type == "LibertyPort" } {
return [liberty_port_property $object $prop]
} elseif { $object_type == "LibertyCell" } {
return [liberty_cell_property $object $prop]
} elseif { $object_type == "Cell" } {
return [cell_property $object $prop]
} elseif { $object_type == "Library" } {
return [library_property $object $prop]
} elseif { $object_type == "LibertyLibrary" } {
return [liberty_library_property $object $prop]
} elseif { $object_type == "Edge" } {
return [edge_property $object $prop]
} elseif { $object_type == "PathEnd" } {
return [path_end_property $object $prop]
} elseif { $object_type == "Path" } {
return [path_property $object $prop]
} elseif { $object_type == "TimingArcSet" } {
return [timing_arc_property $object $prop]
} else {
sta_error 2203 "get_property unsupported object type $object_type."
}
} else {
sta_error 2204 "get_property $object is not an object."
}
}
proc get_property_object_type { object_type object_name quiet } {
set object "NULL"
if { $object_type == "instance" \
|| $object_type == "cell"} {
set object [get_cells -quiet $object_name]
} elseif { $object_type == "pin" } {
set object [get_pins -quiet $object_name]
} elseif { $object_type == "net" } {
set object [get_nets -quiet $object_name]
} elseif { $object_type == "port" } {
set object [get_ports -quiet $object_name]
} elseif { $object_type == "clock" } {
set object [get_clocks -quiet $object_name]
} elseif { $object_type == "liberty_cell" \
|| $object_type == "lib_cell"} {
set object [get_lib_cells -quiet $object_name]
} elseif { $object_type == "liberty_port" \
|| $object_type == "lib_pin" } {
set object [get_lib_pins -quiet $object_name]
} elseif { $object_type == "library" \
|| $object_type == "lib"} {
set object [get_libs -quiet $object_name]
} else {
sta_error 2205 "$object_type not supported."
}
if { $object == "NULL" && !$quiet } {
sta_error 2206 "$object_type '$object_name' not found."
}
return [lindex $object 0]
}
define_cmd_args "define_property" \
{-object_type scene|mode -type bool|float|string property}
proc define_property { args } {
parse_key_args "define_property" args keys {-object_type -type} flags {}
check_argc_eq1 "define_property" $args
if { ![info exists keys(-object_type)] } {
sta_error 2207 "define_property -object_type must be specified."
}
if { ![info exists keys(-type)] } {
sta_error 2208 "define_property -type must be specified."
}
define_property_cmd $keys(-object_type) [lindex $args 0] $keys(-type)
}
define_cmd_args "set_property" {object property value}
proc set_property { args } {
check_argc_eq3 "set_property" $args
set object [lindex $args 0]
set prop [lindex $args 1]
set value [lindex $args 2]
if { ![is_object $object] } {
sta_error 2213 "set_property $object is not an object."
}
set_property_cmd $object [object_type $object] $prop $value
}
# sta namespace end.
}