is_object cleanup
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
bfbbe0d90e
commit
5b9d0f3aa8
242
tcl/CmdUtil.tcl
242
tcl/CmdUtil.tcl
|
|
@ -191,136 +191,138 @@ proc set_unit_values { unit key suffix key_var } {
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
|
|
||||||
define_cmd_args "delete_from_list" {list objs}
|
define_cmd_args "delete_from_list" {list delete}
|
||||||
|
|
||||||
proc delete_from_list { list objects } {
|
proc delete_from_list { list delete } {
|
||||||
delete_objects_from_list_cmd $list $objects
|
delete_objects_from_list_cmd $list $delete
|
||||||
}
|
}
|
||||||
|
|
||||||
proc delete_objects_from_list_cmd { list objects } {
|
proc delete_objects_from_list_cmd { list delete } {
|
||||||
set list0 [lindex $list 0]
|
if { $list != {} } {
|
||||||
set list_is_object [is_object $list0]
|
set list0 [lindex $list 0]
|
||||||
set list_type [object_type $list0]
|
set list_is_objects [is_object $list0]
|
||||||
foreach obj $objects {
|
foreach obj $delete {
|
||||||
# If the list is a collection of tcl objects (returned by get_*),
|
# If the list is a collection of tcl objects (returned by get_*),
|
||||||
# convert the obj to be removed from a name to an object of the same
|
# convert the obj to be removed from a name to an object of the same
|
||||||
# type.
|
# type.
|
||||||
if {$list_is_object && ![is_object $obj]} {
|
if {$list_is_objects && ![is_object $obj]} {
|
||||||
if {$list_type == "Clock"} {
|
set list_type [object_type $list0]
|
||||||
set obj [find_clock $obj]
|
if {$list_type == "Clock"} {
|
||||||
} elseif {$list_type == "Port"} {
|
set obj [find_clock $obj]
|
||||||
set top_instance [top_instance]
|
} elseif {$list_type == "Port"} {
|
||||||
set top_cell [$top_instance cell]
|
set top_instance [top_instance]
|
||||||
set obj [$top_cell find_port $obj]
|
set top_cell [$top_instance cell]
|
||||||
} elseif {$list_type == "Pin"} {
|
set obj [$top_cell find_port $obj]
|
||||||
set obj [find_pin $obj]
|
} elseif {$list_type == "Pin"} {
|
||||||
} elseif {$list_type == "Instance"} {
|
set obj [find_pin $obj]
|
||||||
set obj [find_instance $obj]
|
} elseif {$list_type == "Instance"} {
|
||||||
} elseif {$list_type == "Net"} {
|
set obj [find_instance $obj]
|
||||||
set obj [find_net $obj]
|
} elseif {$list_type == "Net"} {
|
||||||
} elseif {$list_type == "LibertyLibrary"} {
|
set obj [find_net $obj]
|
||||||
set obj [find_liberty $obj]
|
} elseif {$list_type == "LibertyLibrary"} {
|
||||||
} elseif {$list_type == "LibertyCell"} {
|
set obj [find_liberty $obj]
|
||||||
set obj [find_liberty_cell $obj]
|
} elseif {$list_type == "LibertyCell"} {
|
||||||
} elseif {$list_type == "LibertyPort"} {
|
set obj [find_liberty_cell $obj]
|
||||||
set obj [get_lib_pins $obj]
|
} elseif {$list_type == "LibertyPort"} {
|
||||||
} else {
|
set obj [get_lib_pins $obj]
|
||||||
sta_error 164 "unsupported object type $list_type."
|
} else {
|
||||||
|
sta_error 164 "unsupported object type $list_type."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set index [lsearch $list $obj]
|
||||||
|
if { $index != -1 } {
|
||||||
|
set list [lreplace $list $index $index]
|
||||||
}
|
}
|
||||||
}
|
|
||||||
set index [lsearch $list $obj]
|
|
||||||
if { $index != -1 } {
|
|
||||||
set list [lreplace $list $index $index]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $list
|
return $list
|
||||||
}
|
}
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
|
|
||||||
proc set_cmd_namespace { namespc } {
|
proc set_cmd_namespace { namespc } {
|
||||||
if { $namespc == "sdc" || $namespc == "sta" } {
|
if { $namespc == "sdc" || $namespc == "sta" } {
|
||||||
set_cmd_namespace_cmd $namespc
|
set_cmd_namespace_cmd $namespc
|
||||||
} else {
|
} else {
|
||||||
sta_error 165 "unknown namespace $namespc."
|
sta_error 165 "unknown namespace $namespc."
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
################################################################
|
||||||
################################################################
|
|
||||||
|
define_cmd_args "report_object_full_names" {objects}
|
||||||
define_cmd_args "report_object_full_names" {objects}
|
|
||||||
|
proc report_object_full_names { objects } {
|
||||||
proc report_object_full_names { objects } {
|
foreach obj [sort_by_full_name $objects] {
|
||||||
foreach obj [sort_by_full_name $objects] {
|
report_line [get_full_name $obj]
|
||||||
report_line [get_full_name $obj]
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
define_cmd_args "report_object_names" {objects}
|
||||||
define_cmd_args "report_object_names" {objects}
|
|
||||||
|
proc report_object_names { objects } {
|
||||||
proc report_object_names { objects } {
|
foreach obj [sort_by_name $objects] {
|
||||||
foreach obj [sort_by_name $objects] {
|
report_line [get_name $obj]
|
||||||
report_line [get_name $obj]
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
################################################################
|
||||||
################################################################
|
|
||||||
|
define_cmd_args "get_name" {object}
|
||||||
define_cmd_args "get_name" {object}
|
define_cmd_args "get_full_name" {object}
|
||||||
define_cmd_args "get_full_name" {object}
|
|
||||||
|
################################################################
|
||||||
################################################################
|
|
||||||
|
proc get_name { object } {
|
||||||
proc get_name { object } {
|
return [get_object_property $object "name"]
|
||||||
return [get_object_property $object "name"]
|
|
||||||
}
|
|
||||||
|
|
||||||
proc get_full_name { object } {
|
|
||||||
return [get_object_property $object "full_name"]
|
|
||||||
}
|
|
||||||
|
|
||||||
proc sort_by_name { objects } {
|
|
||||||
return [lsort -command name_cmp $objects]
|
|
||||||
}
|
|
||||||
|
|
||||||
proc name_cmp { obj1 obj2 } {
|
|
||||||
return [string compare [get_name $obj1] [get_name $obj2]]
|
|
||||||
}
|
|
||||||
|
|
||||||
proc sort_by_full_name { objects } {
|
|
||||||
return [lsort -command full_name_cmp $objects]
|
|
||||||
}
|
|
||||||
|
|
||||||
proc full_name_cmp { obj1 obj2 } {
|
|
||||||
return [string compare [get_full_name $obj1] [get_full_name $obj2]]
|
|
||||||
}
|
|
||||||
|
|
||||||
proc get_object_type { obj } {
|
|
||||||
set object_type [object_type $obj]
|
|
||||||
if { $object_type == "Clock" } {
|
|
||||||
return "clock"
|
|
||||||
} elseif { $object_type == "LibertyCell" } {
|
|
||||||
return "lib_cell"
|
|
||||||
} elseif { $object_type == "LibertyPort" } {
|
|
||||||
return "lib_pin"
|
|
||||||
} elseif { $object_type == "Cell" } {
|
|
||||||
return "cell"
|
|
||||||
} elseif { $object_type == "Instance" } {
|
|
||||||
return "instance"
|
|
||||||
} elseif { $object_type == "Port" } {
|
|
||||||
return "port"
|
|
||||||
} elseif { $object_type == "Pin" } {
|
|
||||||
return "pin"
|
|
||||||
} elseif { $object_type == "Net" } {
|
|
||||||
return "net"
|
|
||||||
} elseif { $object_type == "Edge" } {
|
|
||||||
return "timing_arc"
|
|
||||||
} elseif { $object_type == "TimingArcSet" } {
|
|
||||||
return "timing_arc"
|
|
||||||
} else {
|
|
||||||
return "?"
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
proc get_full_name { object } {
|
||||||
# sta namespace end.
|
return [get_object_property $object "full_name"]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc sort_by_name { objects } {
|
||||||
|
return [lsort -command name_cmp $objects]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc name_cmp { obj1 obj2 } {
|
||||||
|
return [string compare [get_name $obj1] [get_name $obj2]]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc sort_by_full_name { objects } {
|
||||||
|
return [lsort -command full_name_cmp $objects]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc full_name_cmp { obj1 obj2 } {
|
||||||
|
return [string compare [get_full_name $obj1] [get_full_name $obj2]]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc get_object_type { obj } {
|
||||||
|
set object_type [object_type $obj]
|
||||||
|
if { $object_type == "Clock" } {
|
||||||
|
return "clock"
|
||||||
|
} elseif { $object_type == "LibertyCell" } {
|
||||||
|
return "lib_cell"
|
||||||
|
} elseif { $object_type == "LibertyPort" } {
|
||||||
|
return "lib_pin"
|
||||||
|
} elseif { $object_type == "Cell" } {
|
||||||
|
return "cell"
|
||||||
|
} elseif { $object_type == "Instance" } {
|
||||||
|
return "instance"
|
||||||
|
} elseif { $object_type == "Port" } {
|
||||||
|
return "port"
|
||||||
|
} elseif { $object_type == "Pin" } {
|
||||||
|
return "pin"
|
||||||
|
} elseif { $object_type == "Net" } {
|
||||||
|
return "net"
|
||||||
|
} elseif { $object_type == "Edge" } {
|
||||||
|
return "timing_arc"
|
||||||
|
} elseif { $object_type == "TimingArcSet" } {
|
||||||
|
return "timing_arc"
|
||||||
|
} else {
|
||||||
|
return "?"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# sta namespace end.
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,9 @@
|
||||||
|
|
||||||
%{
|
%{
|
||||||
|
|
||||||
|
#include <cctype>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "Network.hh"
|
#include "Network.hh"
|
||||||
#include "Liberty.hh"
|
#include "Liberty.hh"
|
||||||
#include "FuncExpr.hh"
|
#include "FuncExpr.hh"
|
||||||
|
|
@ -52,7 +55,7 @@ namespace sta {
|
||||||
typedef MinMaxAll MinMaxAllNull;
|
typedef MinMaxAll MinMaxAllNull;
|
||||||
|
|
||||||
#if TCL_MAJOR_VERSION < 9
|
#if TCL_MAJOR_VERSION < 9
|
||||||
typedef int Tcl_Size;
|
typedef int Tcl_Size;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
template <class TYPE>
|
template <class TYPE>
|
||||||
|
|
@ -256,14 +259,51 @@ setPtrTclList(SET_TYPE *set,
|
||||||
Tcl_SetObjResult(interp, list);
|
Tcl_SetObjResult(interp, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
} // namespace sta
|
} // namespace sta
|
||||||
|
|
||||||
using namespace sta;
|
using namespace sta;
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
|
||||||
|
bool
|
||||||
|
is_object(const char *obj)
|
||||||
|
{
|
||||||
|
// _hexaddress_p_type
|
||||||
|
const std::string s(obj);
|
||||||
|
if (s.empty() || s[0] != '_')
|
||||||
|
return false;
|
||||||
|
const size_t hex_digits = sizeof(void *) * 2;
|
||||||
|
if (s.size() < 1 + hex_digits + 3)
|
||||||
|
return false;
|
||||||
|
for (size_t i = 1; i < 1 + hex_digits; i++) {
|
||||||
|
if (!std::isxdigit(static_cast<unsigned char>(s[i])))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (s.compare(1 + hex_digits, 3, "_p_") != 0)
|
||||||
|
return false;
|
||||||
|
for (size_t i = 1 + hex_digits + 3; i < s.size(); i++) {
|
||||||
|
char ch = s[i];
|
||||||
|
if (!(std::isalnum(ch) || ch == '_'))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assumes is_object is true.
|
||||||
|
const char *
|
||||||
|
object_type(const char *obj)
|
||||||
|
{
|
||||||
|
if (is_object(obj))
|
||||||
|
return &obj[1 + sizeof(void*) * 2 + 3];
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// SWIG type definitions.
|
// SWIG type definitions.
|
||||||
|
|
|
||||||
31
util/Util.i
31
util/Util.i
|
|
@ -224,37 +224,6 @@ set_debug(const char *what,
|
||||||
Sta::sta()->setDebugLevel(what, level);
|
Sta::sta()->setDebugLevel(what, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
bool
|
|
||||||
is_object(const char *obj)
|
|
||||||
{
|
|
||||||
// _hexaddress_p_type
|
|
||||||
const char *s = obj;
|
|
||||||
char ch = *s++;
|
|
||||||
if (ch != '_')
|
|
||||||
return false;
|
|
||||||
while (*s && isxdigit(*s))
|
|
||||||
s++;
|
|
||||||
if ((s - obj - 1) == sizeof(void*) * 2
|
|
||||||
&& *s && *s++ == '_'
|
|
||||||
&& *s && *s++ == 'p'
|
|
||||||
&& *s && *s++ == '_') {
|
|
||||||
while (*s && *s != ' ')
|
|
||||||
s++;
|
|
||||||
return *s == '\0';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assumes is_object is true.
|
|
||||||
const char *
|
|
||||||
object_type(const char *obj)
|
|
||||||
{
|
|
||||||
return &obj[1 + sizeof(void*) * 2 + 3];
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Units
|
// Units
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue