Files
OpenSTA/network/Network.i
T

825 lines
20 KiB
OpenEdge ABL
Raw Normal View History

2024-07-21 19:02:04 -07:00
// OpenSTA, Static Timing Analyzer
2026-03-10 13:21:17 -07:00
// Copyright (c) 2026, Parallax Software, Inc.
2024-07-21 19:02:04 -07:00
//
// 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/>.
2025-01-21 18:54:33 -07:00
//
// 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.
2024-07-21 19:02:04 -07:00
2026-03-28 19:13:35 -07:00
%include <std_string.i>
2024-07-21 19:02:04 -07:00
%{
#include "Network.hh"
2026-04-15 09:38:10 -07:00
2026-03-28 19:13:35 -07:00
#include <string>
2026-04-15 09:38:10 -07:00
#include "StringUtil.hh"
2024-07-21 19:02:04 -07:00
%}
////////////////////////////////////////////////////////////////
//
// Empty class definitions to make swig happy.
// Private constructor/destructor so swig doesn't emit them.
//
////////////////////////////////////////////////////////////////
2024-07-21 19:14:31 -07:00
class Library
{
private:
Library();
~Library();
};
class LibraryIterator
{
private:
LibraryIterator();
~LibraryIterator();
};
class Cell
{
private:
Cell();
~Cell();
};
class CellPortIterator
{
private:
CellPortIterator();
~CellPortIterator();
};
class Port
{
private:
Port();
~Port();
};
class PortMemberIterator
{
private:
PortMemberIterator();
~PortMemberIterator();
};
class Instance
{
private:
Instance();
~Instance();
};
class Pin
{
private:
Pin();
~Pin();
};
class Term
{
private:
Term();
~Term();
};
class InstanceChildIterator
{
private:
InstanceChildIterator();
~InstanceChildIterator();
};
class InstancePinIterator
{
private:
InstancePinIterator();
~InstancePinIterator();
};
class InstanceNetIterator
{
private:
InstanceNetIterator();
~InstanceNetIterator();
};
class LeafInstanceIterator
{
private:
LeafInstanceIterator();
~LeafInstanceIterator();
};
class Net
{
private:
Net();
~Net();
};
class NetPinIterator
{
private:
NetPinIterator();
~NetPinIterator();
};
class NetTermIterator
{
private:
NetTermIterator();
~NetTermIterator();
};
class NetConnectedPinIterator
{
private:
NetConnectedPinIterator();
~NetConnectedPinIterator();
};
class PinConnectedPinIterator
{
private:
PinConnectedPinIterator();
~PinConnectedPinIterator();
};
2024-07-21 19:02:04 -07:00
%inline %{
2024-07-21 19:14:31 -07:00
bool
network_is_linked()
{
return Sta::sta()->network()->isLinked();
2024-07-21 19:14:31 -07:00
}
void
set_path_divider(char divider)
{
Network *network = Sta::sta()->network();
network->setPathDivider(divider);
2024-07-21 19:14:31 -07:00
}
void
set_current_instance(Instance *inst)
{
Sta::sta()->setCurrentInstance(inst);
}
2024-07-22 10:54:57 -07:00
// Includes top instance.
int
network_instance_count()
{
Network *network = Sta::sta()->ensureLinked();
2024-07-22 10:54:57 -07:00
return network->instanceCount();
}
int
network_pin_count()
{
Network *network = Sta::sta()->ensureLinked();
2024-07-22 10:54:57 -07:00
return network->pinCount();
}
int
network_net_count()
{
Network *network = Sta::sta()->ensureLinked();
2024-07-22 10:54:57 -07:00
return network->netCount();
}
int
network_leaf_instance_count()
{
Network *network = Sta::sta()->ensureLinked();
2024-07-22 10:54:57 -07:00
return network->leafInstanceCount();
}
int
network_leaf_pin_count()
{
Network *network = Sta::sta()->ensureLinked();
2024-07-22 10:54:57 -07:00
return network->leafPinCount();
}
2024-07-21 19:14:31 -07:00
Library *
find_library(const char *name)
{
Network *network = Sta::sta()->ensureLinked();
return network->findLibrary(name);
2024-07-21 19:14:31 -07:00
}
LibraryIterator *
library_iterator()
{
Network *network = Sta::sta()->ensureLinked();
return network->libraryIterator();
2024-07-21 19:14:31 -07:00
}
CellSeq
find_cells_matching(const char *pattern,
2026-01-03 16:59:35 -08:00
bool regexp,
bool nocase)
2024-07-21 19:14:31 -07:00
{
Network *network = Sta::sta()->ensureLinked();
2024-07-21 19:14:31 -07:00
PatternMatch matcher(pattern, regexp, nocase, Sta::sta()->tclInterp());
CellSeq matches;
LibraryIterator *lib_iter = network->libraryIterator();
while (lib_iter->hasNext()) {
Library *lib = lib_iter->next();
CellSeq lib_matches = network->findCellsMatching(lib, &matcher);
for (Cell *match : lib_matches)
matches.push_back(match);
}
delete lib_iter;
return matches;
}
void
2026-03-28 19:13:35 -07:00
set_cmd_namespace_cmd(std::string namespc)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
2026-03-28 19:13:35 -07:00
if (namespc == "sdc")
2024-07-21 19:14:31 -07:00
sta->setCmdNamespace(CmdNamespace::sdc);
2026-03-28 19:13:35 -07:00
else if (namespc == "sta")
2024-07-21 19:14:31 -07:00
sta->setCmdNamespace(CmdNamespace::sta);
else
sta->report()->warn(2120, "unknown namespace");
}
bool
2024-07-22 16:13:19 -07:00
link_design_cmd(const char *top_cell_name,
bool make_black_boxes)
2024-07-21 19:14:31 -07:00
{
2024-07-22 16:13:19 -07:00
return Sta::sta()->linkDesign(top_cell_name, make_black_boxes);
2024-07-21 19:14:31 -07:00
}
Instance *
top_instance()
{
Network *network = Sta::sta()->ensureLinked();
return network->topInstance();
2024-07-21 19:14:31 -07:00
}
LeafInstanceIterator *
leaf_instance_iterator()
{
Network *network = Sta::sta()->ensureLinked();
return network->leafInstanceIterator();
2024-07-21 19:14:31 -07:00
}
2026-03-28 19:13:35 -07:00
std::string_view
2024-07-21 19:14:31 -07:00
port_direction(const Port *port)
{
return Sta::sta()->ensureLinked()->direction(port)->name();
2024-07-21 19:14:31 -07:00
}
2026-01-03 16:59:35 -08:00
2026-03-28 19:13:35 -07:00
std::string
2024-07-21 19:14:31 -07:00
pin_direction(const Pin *pin)
{
2026-03-28 19:13:35 -07:00
return std::string(Sta::sta()->ensureLinked()->direction(pin)->name());
2024-07-21 19:14:31 -07:00
}
PortSeq
find_ports_matching(const char *pattern,
2026-01-03 16:59:35 -08:00
bool regexp,
bool nocase)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
Network *network = sta->ensureLinked();
PatternMatch matcher(pattern, regexp, nocase, sta->tclInterp());
2024-07-21 19:14:31 -07:00
Cell *top_cell = network->cell(network->topInstance());
PortSeq matches1 = network->findPortsMatching(top_cell, &matcher);
// Expand bus/bundle ports.
PortSeq matches;
for (const Port *port : matches1) {
if (network->isBus(port)
2026-01-03 16:59:35 -08:00
|| network->isBundle(port)) {
2024-07-21 19:14:31 -07:00
PortMemberIterator *member_iter = network->memberIterator(port);
while (member_iter->hasNext()) {
2026-01-03 16:59:35 -08:00
Port *member = member_iter->next();
matches.push_back(member);
2024-07-21 19:14:31 -07:00
}
delete member_iter;
}
else
matches.push_back(port);
}
return matches;
}
PinSeq
find_port_pins_matching(const char *pattern,
2026-01-03 16:59:35 -08:00
bool regexp,
bool nocase)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
Network *network = sta->ensureLinked();
PatternMatch matcher(pattern, regexp, nocase, sta->tclInterp());
2024-07-21 19:14:31 -07:00
Instance *top_inst = network->topInstance();
Cell *top_cell = network->cell(top_inst);
PortSeq ports = network->findPortsMatching(top_cell, &matcher);
PinSeq pins;
for (const Port *port : ports) {
if (network->isBus(port)
2026-01-03 16:59:35 -08:00
|| network->isBundle(port)) {
2024-07-21 19:14:31 -07:00
PortMemberIterator *member_iter = network->memberIterator(port);
while (member_iter->hasNext()) {
2026-01-03 16:59:35 -08:00
Port *member = member_iter->next();
Pin *pin = network->findPin(top_inst, member);
if (pin)
pins.push_back(pin);
2024-07-21 19:14:31 -07:00
}
delete member_iter;
}
else {
Pin *pin = network->findPin(top_inst, port);
if (pin)
2026-01-03 16:59:35 -08:00
pins.push_back(pin);
2024-07-21 19:14:31 -07:00
}
}
return pins;
}
Pin *
find_pin(const char *path_name)
{
Network *network = Sta::sta()->ensureLinked();
return network->findPin(path_name);
2024-07-21 19:14:31 -07:00
}
Pin *
get_port_pin(const Port *port)
{
Network *network = Sta::sta()->ensureLinked();
2024-07-21 19:14:31 -07:00
return network->findPin(network->topInstance(), port);
}
PinSeq
find_pins_matching(const char *pattern,
2026-01-03 16:59:35 -08:00
bool regexp,
bool nocase)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
Network *network = sta->ensureLinked();
PatternMatch matcher(pattern, regexp, nocase, sta->tclInterp());
2024-07-21 19:14:31 -07:00
Instance *current_instance = sta->currentInstance();
PinSeq matches = network->findPinsMatching(current_instance, &matcher);
return matches;
}
PinSeq
find_pins_hier_matching(const char *pattern,
2026-01-03 16:59:35 -08:00
bool regexp,
bool nocase)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
Network *network = sta->ensureLinked();
2024-07-21 19:14:31 -07:00
Instance *current_instance = sta->currentInstance();
PatternMatch matcher(pattern, regexp, nocase, sta->tclInterp());
2024-07-21 19:14:31 -07:00
PinSeq matches = network->findPinsHierMatching(current_instance, &matcher);
return matches;
}
Instance *
find_instance(char *path_name)
{
return Sta::sta()->ensureLinked()->findInstance(path_name);
2024-07-21 19:14:31 -07:00
}
InstanceSeq
network_leaf_instances()
{
return Sta::sta()->ensureLinked()->leafInstances();
2024-07-21 19:14:31 -07:00
}
InstanceSeq
find_instances_matching(const char *pattern,
2026-01-03 16:59:35 -08:00
bool regexp,
bool nocase)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
Network *network = sta->ensureLinked();
2024-07-21 19:14:31 -07:00
Instance *current_instance = sta->currentInstance();
PatternMatch matcher(pattern, regexp, nocase, sta->tclInterp());
InstanceSeq matches = network->findInstancesMatching(current_instance, &matcher);
return matches;
}
InstanceSeq
find_instances_hier_matching(const char *pattern,
2026-01-03 16:59:35 -08:00
bool regexp,
bool nocase)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
Network *network = sta->ensureLinked();
2024-07-21 19:14:31 -07:00
Instance *current_instance = sta->currentInstance();
PatternMatch matcher(pattern, regexp, nocase, sta->tclInterp());
InstanceSeq matches = network->findInstancesHierMatching(current_instance, &matcher);
return matches;
}
Net *
find_net(char *path_name)
{
return Sta::sta()->ensureLinked()->findNet(path_name);
2024-07-21 19:14:31 -07:00
}
NetSeq
find_nets_matching(const char *pattern,
2026-01-03 16:59:35 -08:00
bool regexp,
bool nocase)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
Network *network = sta->ensureLinked();
Instance *current_instance = sta->currentInstance();
PatternMatch matcher(pattern, regexp, nocase, sta->tclInterp());
2024-07-21 19:14:31 -07:00
NetSeq matches = network->findNetsMatching(current_instance, &matcher);
return matches;
}
NetSeq
find_nets_hier_matching(const char *pattern,
2026-01-03 16:59:35 -08:00
bool regexp,
bool nocase)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
Network *network = sta->ensureLinked();
Instance *current_instance = sta->currentInstance();
PatternMatch matcher(pattern, regexp, nocase, sta->tclInterp());
2024-07-21 19:14:31 -07:00
NetSeq matches = network->findNetsHierMatching(current_instance, &matcher);
return matches;
}
2024-07-22 10:54:57 -07:00
PinSet
net_driver_pins(Net *net)
{
Network *network = Sta::sta()->ensureLinked();
2024-07-22 10:54:57 -07:00
PinSet pins(network);
NetConnectedPinIterator *pin_iter = network->connectedPinIterator(net);
while (pin_iter->hasNext()) {
const Pin *pin = pin_iter->next();
if (network->isDriver(pin))
pins.insert(pin);
}
delete pin_iter;
return pins;
}
PinSet
net_load_pins(Net *net)
{
Network *network = Sta::sta()->ensureLinked();
2024-07-22 10:54:57 -07:00
PinSet pins(network);
NetConnectedPinIterator *pin_iter = network->connectedPinIterator(net);
while (pin_iter->hasNext()) {
const Pin *pin = pin_iter->next();
if (network->isLoad(pin))
pins.insert(pin);
}
delete pin_iter;
return pins;
}
2025-06-26 10:47:41 -07:00
PinSet
net_pins(Net *net)
{
Network *network = Sta::sta()->ensureLinked();
PinSet pins(network);
NetConnectedPinIterator *pin_iter = network->connectedPinIterator(net);
while (pin_iter->hasNext()) {
const Pin *pin = pin_iter->next();
pins.insert(pin);
}
delete pin_iter;
return pins;
}
2026-03-15 14:35:24 -07:00
std::string
2024-07-22 11:42:34 -07:00
pin_location(const Pin *pin)
{
Network *network = Sta::sta()->ensureLinked();
2024-07-22 11:42:34 -07:00
double x, y;
bool exists;
network->location(pin, x, y, exists);
// return x/y as tcl list
if (exists)
2026-03-15 14:51:13 -07:00
return sta::format("{} {}", x, y);
2024-07-22 11:42:34 -07:00
else
return "";
}
2026-03-15 14:35:24 -07:00
std::string
2024-07-22 11:42:34 -07:00
port_location(const Port *port)
{
Network *network = Sta::sta()->ensureLinked();
2024-07-22 11:42:34 -07:00
const Pin *pin = network->findPin(network->topInstance(), port);
return pin_location(pin);
}
2024-07-21 19:02:04 -07:00
%} // inline
2024-07-21 19:14:31 -07:00
////////////////////////////////////////////////////////////////
//
// Object Methods
//
////////////////////////////////////////////////////////////////
%extend Library {
2026-03-28 19:13:35 -07:00
std::string name()
2024-07-21 19:14:31 -07:00
{
return Sta::sta()->ensureLinked()->name(self);
2024-07-21 19:14:31 -07:00
}
Cell *
find_cell(const char *name)
{
return Sta::sta()->ensureLinked()->findCell(self, name);
2024-07-21 19:14:31 -07:00
}
CellSeq
find_cells_matching(const char *pattern,
2026-01-03 16:59:35 -08:00
bool regexp,
bool nocase)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
Network *network = sta->ensureLinked();
PatternMatch matcher(pattern, regexp, nocase, sta->tclInterp());
CellSeq matches = network->findCellsMatching(self, &matcher);
2024-07-21 19:14:31 -07:00
return matches;
}
} // Library methods
%extend LibraryIterator {
bool has_next() { return self->hasNext(); }
Library *next() { return self->next(); }
void finish() { delete self; }
} // LibraryIterator methods
%extend Cell {
2026-03-28 19:13:35 -07:00
std::string name() { return Sta::sta()->cmdNetwork()->name(self); }
2024-12-31 15:49:51 -08:00
Library *library() { return Sta::sta()->cmdNetwork()->library(self); }
LibertyCell *liberty_cell() { return Sta::sta()->cmdNetwork()->libertyCell(self); }
bool is_leaf() { return Sta::sta()->cmdNetwork()->isLeaf(self); }
2024-07-21 19:14:31 -07:00
CellPortIterator *
2024-12-31 15:49:51 -08:00
port_iterator() { return Sta::sta()->cmdNetwork()->portIterator(self); }
2026-03-28 19:13:35 -07:00
std::string
2026-01-03 16:59:35 -08:00
get_attribute(const char *key)
2024-12-31 15:49:51 -08:00
{
return Sta::sta()->cmdNetwork()->getAttribute(self, key);
}
2024-07-21 19:14:31 -07:00
Port *
find_port(const char *name)
{
return Sta::sta()->ensureLinked()->findPort(self, name);
2024-07-21 19:14:31 -07:00
}
PortSeq
find_ports_matching(const char *pattern,
2026-01-03 16:59:35 -08:00
bool regexp,
bool nocase)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
Network *network = sta->ensureLinked();
PatternMatch matcher(pattern, regexp, nocase, sta->tclInterp());
return network->findPortsMatching(self, &matcher);
2024-07-21 19:14:31 -07:00
}
} // Cell methods
%extend CellPortIterator {
bool has_next() { return self->hasNext(); }
Port *next() { return self->next(); }
void finish() { delete self; }
} // CellPortIterator methods
%extend Port {
2026-03-28 19:13:35 -07:00
std::string bus_name() { return Sta::sta()->ensureLinked()->busName(self); }
Cell *cell() { return Sta::sta()->ensureLinked()->cell(self); }
2024-12-31 15:49:51 -08:00
LibertyPort *liberty_port() { return Sta::sta()->ensureLibLinked()->libertyPort(self); }
bool is_bus() { return Sta::sta()->ensureLinked()->isBus(self); }
2024-07-21 19:14:31 -07:00
PortMemberIterator *
member_iterator() { return Sta::sta()->ensureLinked()->memberIterator(self); }
2024-07-21 19:14:31 -07:00
} // Port methods
%extend PortMemberIterator {
bool has_next() { return self->hasNext(); }
Port *next() { return self->next(); }
void finish() { delete self; }
} // PortMemberIterator methods
%extend Instance {
Instance *parent() { return Sta::sta()->ensureLinked()->parent(self); }
Cell *cell() { return Sta::sta()->ensureLinked()->cell(self); }
2024-12-31 15:49:51 -08:00
LibertyCell *liberty_cell() { return Sta::sta()->ensureLibLinked()->libertyCell(self); }
bool is_leaf() { return Sta::sta()->ensureLinked()->isLeaf(self); }
2024-07-21 19:14:31 -07:00
InstanceChildIterator *
child_iterator() { return Sta::sta()->ensureLinked()->childIterator(self); }
2024-07-21 19:14:31 -07:00
InstancePinIterator *
pin_iterator() { return Sta::sta()->ensureLinked()->pinIterator(self); }
2024-07-21 19:14:31 -07:00
InstanceNetIterator *
net_iterator() { return Sta::sta()->ensureLinked()->netIterator(self); }
2026-03-07 16:41:25 -07:00
2024-07-21 19:14:31 -07:00
Pin *
find_pin(const char *name)
{
return Sta::sta()->ensureLinked()->findPin(self, name);
2024-07-21 19:14:31 -07:00
}
2026-03-07 16:41:25 -07:00
2026-01-03 16:59:35 -08:00
std::string
2026-03-07 16:41:25 -07:00
get_attribute(const char *key)
{
2024-12-31 15:49:51 -08:00
return Sta::sta()->ensureLinked()->getAttribute(self, key);
}
2026-05-12 11:24:24 -07:00
void
set_attribute(const char *key,
const char *value)
{
sta::Sta *sta = Sta::sta();
sta->ensureLinked();
sta->networkReader()->setAttribute(self, key, value);
}
2024-07-21 19:14:31 -07:00
} // Instance methods
%extend InstanceChildIterator {
bool has_next() { return self->hasNext(); }
Instance *next() { return self->next(); }
void finish() { delete self; }
} // InstanceChildIterator methods
%extend LeafInstanceIterator {
bool has_next() { return self->hasNext(); }
Instance *next() { return self->next(); }
void finish() { delete self; }
} // LeafInstanceIterator methods
%extend InstancePinIterator {
bool has_next() { return self->hasNext(); }
Pin *next() { return self->next(); }
void finish() { delete self; }
} // InstancePinIterator methods
%extend InstanceNetIterator {
bool has_next() { return self->hasNext(); }
Net *next() { return self->next(); }
void finish() { delete self; }
} // InstanceNetIterator methods
%extend Pin {
2026-03-28 19:13:35 -07:00
std::string port_name() { return Sta::sta()->ensureLinked()->portName(self); }
Instance *instance() { return Sta::sta()->ensureLinked()->instance(self); }
Net *net() { return Sta::sta()->ensureLinked()->net(self); }
Port *port() { return Sta::sta()->ensureLinked()->port(self); }
Term *term() { return Sta::sta()->ensureLinked()->term(self); }
2024-12-31 15:49:51 -08:00
LibertyPort *liberty_port() { return Sta::sta()->ensureLibLinked()->libertyPort(self); }
bool is_driver() { return Sta::sta()->ensureLinked()->isDriver(self); }
bool is_load() { return Sta::sta()->ensureLinked()->isLoad(self); }
bool is_leaf() { return Sta::sta()->ensureLinked()->isLeaf(self); }
bool is_hierarchical() { return Sta::sta()->ensureLinked()->isHierarchical(self); }
bool is_top_level_port() { return Sta::sta()->ensureLinked()->isTopLevelPort(self); }
2024-07-21 19:14:31 -07:00
PinConnectedPinIterator *connected_pin_iterator()
{ return Sta::sta()->ensureLinked()->connectedPinIterator(self); }
2024-07-21 19:14:31 -07:00
bool
is_pwr_gnd()
{
sta::Sta *sta = Sta::sta();
Network *network = sta->network();
LibertyPort *lib_port = network->libertyPort(self);
return lib_port && lib_port->isPwrGnd();
}
2024-07-21 19:14:31 -07:00
Vertex **
vertices()
{
Vertex *vertex, *vertex_bidirect_drvr;
static Vertex *vertices[3];
Graph *graph = Sta::sta()->ensureGraph();
graph->pinVertices(self, vertex, vertex_bidirect_drvr);
2024-07-21 19:14:31 -07:00
vertices[0] = vertex;
vertices[1] = vertex_bidirect_drvr;
vertices[2] = nullptr;
return vertices;
}
} // Pin methods
%extend PinConnectedPinIterator {
bool has_next() { return self->hasNext(); }
const Pin *next() { return self->next(); }
void finish() { delete self; }
} // PinConnectedPinIterator methods
%extend Term {
Net *net() { return Sta::sta()->ensureLinked()->net(self); }
Pin *pin() { return Sta::sta()->ensureLinked()->pin(self); }
2024-07-21 19:14:31 -07:00
} // Term methods
%extend Net {
Instance *instance() { return Sta::sta()->ensureLinked()->instance(self); }
2024-07-21 19:14:31 -07:00
const Net *highest_connected_net()
{ return Sta::sta()->ensureLinked()->highestConnectedNet(self); }
NetPinIterator *pin_iterator() { return Sta::sta()->ensureLinked()->pinIterator(self);}
NetTermIterator *term_iterator() {return Sta::sta()->ensureLinked()->termIterator(self);}
2024-07-21 19:14:31 -07:00
NetConnectedPinIterator *connected_pin_iterator()
{ return Sta::sta()->ensureLinked()->connectedPinIterator(self); }
bool is_power() { return Sta::sta()->ensureLinked()->isPower(self);}
bool is_ground() { return Sta::sta()->ensureLinked()->isGround(self);}
2024-07-21 19:14:31 -07:00
float
2026-01-03 16:59:35 -08:00
capacitance(Scene *scene,
const MinMax *min_max)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
2024-12-31 15:49:51 -08:00
sta->ensureLibLinked();
2024-07-21 19:14:31 -07:00
float pin_cap, wire_cap;
2026-01-03 16:59:35 -08:00
sta->connectedCap(self, scene, min_max, pin_cap, wire_cap);
2024-07-21 19:14:31 -07:00
return pin_cap + wire_cap;
}
float
2026-01-03 16:59:35 -08:00
pin_capacitance(Scene *scene,
const MinMax *min_max)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
2024-12-31 15:49:51 -08:00
sta->ensureLibLinked();
2024-07-21 19:14:31 -07:00
float pin_cap, wire_cap;
2026-01-03 16:59:35 -08:00
sta->connectedCap(self, scene, min_max, pin_cap, wire_cap);
2024-07-21 19:14:31 -07:00
return pin_cap;
}
float
2026-01-03 16:59:35 -08:00
wire_capacitance(Scene *scene,
const MinMax *min_max)
2024-07-21 19:14:31 -07:00
{
Sta *sta = Sta::sta();
2024-12-31 15:49:51 -08:00
sta->ensureLibLinked();
2024-07-21 19:14:31 -07:00
float pin_cap, wire_cap;
2026-01-03 16:59:35 -08:00
sta->connectedCap(self, scene, min_max, pin_cap, wire_cap);
2024-07-21 19:14:31 -07:00
return wire_cap;
}
// get_ports -of_objects net
PortSeq
ports()
{
Network *network = Sta::sta()->ensureLinked();
2024-07-21 19:14:31 -07:00
PortSeq ports;
if (network->isTopInstance(network->instance(self))) {
NetTermIterator *term_iter = network->termIterator(self);
while (term_iter->hasNext()) {
Term *term = term_iter->next();
Port *port = network->port(network->pin(term));
ports.push_back(port);
}
delete term_iter;
}
return ports;
}
} // Net methods
%extend NetPinIterator {
bool has_next() { return self->hasNext(); }
const Pin *next() { return self->next(); }
void finish() { delete self; }
} // NetPinIterator methods
%extend NetTermIterator {
bool has_next() { return self->hasNext(); }
const Term *next() { return self->next(); }
void finish() { delete self; }
} // NetTermIterator methods
%extend NetConnectedPinIterator {
bool has_next() { return self->hasNext(); }
const Pin *next() { return self->next(); }
void finish() { delete self; }
} // NetConnectedPinIterator methods