get_prpperty PathEnd points, PathRef arrival, required, slack, pin
This commit is contained in:
parent
e1059eac12
commit
0a693f3236
20
tcl/Cmds.tcl
20
tcl/Cmds.tcl
|
|
@ -1795,6 +1795,8 @@ proc get_property_cmd { cmd type_key cmd_args } {
|
||||||
return [edge_property $object $attr]
|
return [edge_property $object $attr]
|
||||||
} elseif { $object_type == "PathEnd" } {
|
} elseif { $object_type == "PathEnd" } {
|
||||||
return [path_end_property $object $attr]
|
return [path_end_property $object $attr]
|
||||||
|
} elseif { $object_type == "PathRef" } {
|
||||||
|
return [path_ref_property $object $attr]
|
||||||
} else {
|
} else {
|
||||||
sta_error "$cmd unsupported object type $object_type."
|
sta_error "$cmd unsupported object type $object_type."
|
||||||
}
|
}
|
||||||
|
|
@ -1838,7 +1840,9 @@ proc edge_property { edge property } {
|
||||||
}
|
}
|
||||||
|
|
||||||
proc path_end_property { path_end property } {
|
proc path_end_property { path_end property } {
|
||||||
if { $property == "startpoint" } {
|
if { $property == "points" } {
|
||||||
|
return [$path_end points]
|
||||||
|
} elseif { $property == "startpoint" } {
|
||||||
return [$path_end startpoint]
|
return [$path_end startpoint]
|
||||||
} elseif { $property == "startpoint_clock" } {
|
} elseif { $property == "startpoint_clock" } {
|
||||||
return [$path_end startpoint_clock]
|
return [$path_end startpoint_clock]
|
||||||
|
|
@ -1855,6 +1859,20 @@ proc path_end_property { path_end property } {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proc path_ref_property { path property } {
|
||||||
|
if { $property == "pin" } {
|
||||||
|
return [$path pin]
|
||||||
|
} elseif { $property == "arrival" } {
|
||||||
|
return [time_sta_ui [$path arrival]]
|
||||||
|
} elseif { $property == "required" } {
|
||||||
|
return [time_sta_ui [$path required]]
|
||||||
|
} elseif { $property == "slack" } {
|
||||||
|
return [time_sta_ui [$path slack]]
|
||||||
|
} else {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
proc get_object_type { obj } {
|
proc get_object_type { obj } {
|
||||||
set object_type [object_type $obj]
|
set object_type [object_type $obj]
|
||||||
if { $object_type == "Clock" } {
|
if { $object_type == "Clock" } {
|
||||||
|
|
|
||||||
44
tcl/StaTcl.i
44
tcl/StaTcl.i
|
|
@ -1808,6 +1808,22 @@ using namespace sta;
|
||||||
Tcl_SetObjResult(interp, obj);
|
Tcl_SetObjResult(interp, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
%typemap(out) PathRefSeq* {
|
||||||
|
Tcl_Obj *obj = SWIG_NewInstanceObj($1, $1_descriptor, false);
|
||||||
|
Tcl_SetObjResult(interp, obj);
|
||||||
|
|
||||||
|
Tcl_Obj *list = Tcl_NewListObj(0, NULL);
|
||||||
|
PathRefSeq *paths = $1;
|
||||||
|
PathRefSeq::Iterator path_iter(paths);
|
||||||
|
while (path_iter.hasNext()) {
|
||||||
|
PathRef *path = &path_iter.next();
|
||||||
|
Tcl_Obj *obj = SWIG_NewInstanceObj(path, SWIGTYPE_p_PathRef, false);
|
||||||
|
Tcl_ListObjAppendElement(interp, list, obj);
|
||||||
|
}
|
||||||
|
delete paths;
|
||||||
|
Tcl_SetObjResult(interp, list);
|
||||||
|
}
|
||||||
|
|
||||||
%typemap(out) MinPulseWidthCheck* {
|
%typemap(out) MinPulseWidthCheck* {
|
||||||
Tcl_Obj *obj = SWIG_NewInstanceObj($1, $1_descriptor, false);
|
Tcl_Obj *obj = SWIG_NewInstanceObj($1, $1_descriptor, false);
|
||||||
Tcl_SetObjResult(interp, obj);
|
Tcl_SetObjResult(interp, obj);
|
||||||
|
|
@ -6289,6 +6305,20 @@ endpoint_clock_pin()
|
||||||
return self->targetClkPath()->pin(sta);
|
return self->targetClkPath()->pin(sta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PathRefSeq *
|
||||||
|
points()
|
||||||
|
{
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
PathExpanded expanded(self->path(), sta);
|
||||||
|
PathRefSeq *paths = new PathRefSeq;
|
||||||
|
for (int i = expanded.startIndex(); i < expanded.size(); i++) {
|
||||||
|
PathRef *path = expanded.path(i);
|
||||||
|
PathRef *copy = new PathRef(path);
|
||||||
|
paths->push_back(copy);
|
||||||
|
}
|
||||||
|
return paths;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
%extend MinPulseWidthCheckSeqIterator {
|
%extend MinPulseWidthCheckSeqIterator {
|
||||||
|
|
@ -6312,6 +6342,20 @@ required()
|
||||||
return delayAsFloat(self->required(sta));
|
return delayAsFloat(self->required(sta));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
slack()
|
||||||
|
{
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
return delayAsFloat(self->slack(sta));
|
||||||
|
}
|
||||||
|
|
||||||
|
Pin *
|
||||||
|
pin()
|
||||||
|
{
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
return self->pin(sta);
|
||||||
|
}
|
||||||
|
|
||||||
TmpPinSeq *
|
TmpPinSeq *
|
||||||
pins()
|
pins()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue