[Consider merging] provide an option to produce antenna DRC debug output
|
|
@ -1366,9 +1366,10 @@ compute_area_and_perimeter_of_net_shapes (const db::hier_clusters<db::NetShape>
|
|||
perimeter = ap_collector.perimeter ();
|
||||
}
|
||||
|
||||
static void
|
||||
static db::Point
|
||||
get_merged_shapes_of_net (const db::hier_clusters<db::NetShape> &clusters, db::cell_index_type ci, size_t cid, unsigned int layer_id, db::Shapes &shapes)
|
||||
{
|
||||
db::Point ref;
|
||||
db::EdgeProcessor ep;
|
||||
|
||||
// count vertices and reserve space
|
||||
|
|
@ -1380,16 +1381,76 @@ get_merged_shapes_of_net (const db::hier_clusters<db::NetShape> &clusters, db::c
|
|||
|
||||
size_t p = 0;
|
||||
for (db::recursive_cluster_shape_iterator<db::NetShape> rci (clusters, layer_id, ci, cid); !rci.at_end (); ++rci) {
|
||||
ep.insert (rci.trans () * rci->polygon_ref (), ++p);
|
||||
if (p == 0) {
|
||||
db::PolygonRef pr = (rci.trans () * rci->polygon_ref ());
|
||||
db::PolygonRef::polygon_edge_iterator e = pr.begin_edge ();
|
||||
if (! e.at_end ()) {
|
||||
// pick one reference point for the label
|
||||
ref = (*e).p1 ();
|
||||
ep.insert (pr, ++p);
|
||||
}
|
||||
} else {
|
||||
ep.insert (rci.trans () * rci->polygon_ref (), ++p);
|
||||
}
|
||||
}
|
||||
|
||||
db::ShapeGenerator sg (shapes);
|
||||
db::PolygonGenerator pg (sg, false);
|
||||
db::SimpleMerge op;
|
||||
ep.process (pg, op);
|
||||
|
||||
return ref;
|
||||
}
|
||||
|
||||
db::Region LayoutToNetlist::antenna_check (const db::Region &gate, double gate_area_factor, double gate_perimeter_factor, const db::Region &metal, double metal_area_factor, double metal_perimeter_factor, double ratio, const std::vector<std::pair<const db::Region *, double> > &diodes)
|
||||
static std::string
|
||||
create_antenna_msg (double agate, db::Polygon::area_type agate_int, double gate_area_factor, db::Polygon::perimeter_type pgate_int, double gate_perimeter_factor,
|
||||
double ametal, db::Polygon::area_type ametal_int, double metal_area_factor, db::Polygon::perimeter_type pmetal_int, double metal_perimeter_factor,
|
||||
const std::vector<std::pair<const db::Region *, double> > &diodes,
|
||||
const std::vector<db::Polygon::area_type> &adiodes_int,
|
||||
double r, double ratio, double dbu)
|
||||
{
|
||||
std::string msg;
|
||||
msg += tl::sprintf ("agate_eff: %.12g, ", agate);
|
||||
if (fabs (gate_area_factor) > 1e-6) {
|
||||
msg += tl::sprintf ("agate: %.12g, agate_factor: %.12g, ", agate_int * dbu * dbu, gate_area_factor);
|
||||
}
|
||||
if (fabs (gate_perimeter_factor) > 1e-6) {
|
||||
msg += tl::sprintf ("pgate: %.12g, pgate_factor: %.12g, ", pgate_int * dbu * dbu, gate_perimeter_factor);
|
||||
}
|
||||
msg += tl::sprintf ("ametal_eff: %.12g, ", ametal);
|
||||
if (fabs (metal_area_factor) > 1e-6) {
|
||||
msg += tl::sprintf ("ametal: %.12g, ametal_factor: %.12g, ", ametal_int * dbu * dbu, metal_area_factor);
|
||||
}
|
||||
if (fabs (metal_perimeter_factor) > 1e-6) {
|
||||
msg += tl::sprintf ("pmetal: %.12g, pmetal_factor: %.12g, ", pmetal_int * dbu * dbu, metal_perimeter_factor);
|
||||
}
|
||||
if (! adiodes_int.empty ()) {
|
||||
msg += "adiodes: [";
|
||||
for (auto d = adiodes_int.begin (); d != adiodes_int.end (); ++d) {
|
||||
if (d != adiodes_int.begin ()) {
|
||||
msg += ", ";
|
||||
}
|
||||
msg += tl::sprintf ("%.12g", *d * dbu * dbu);
|
||||
}
|
||||
msg += "], ";
|
||||
}
|
||||
if (! diodes.empty ()) {
|
||||
msg += "diode_factors: [";
|
||||
for (auto d = diodes.begin (); d != diodes.end (); ++d) {
|
||||
if (d != diodes.begin ()) {
|
||||
msg += ", ";
|
||||
}
|
||||
msg += tl::sprintf ("%.12g", d->second);
|
||||
}
|
||||
msg += "], ";
|
||||
}
|
||||
msg += tl::sprintf ("ratio: %.12g, ", ametal / agate);
|
||||
msg += tl::sprintf ("max_ratio_eff: %.12g, ", r);
|
||||
msg += tl::sprintf ("max_ratio: %.12g", ratio);
|
||||
return msg;
|
||||
}
|
||||
|
||||
db::Region LayoutToNetlist::antenna_check (const db::Region &gate, double gate_area_factor, double gate_perimeter_factor, const db::Region &metal, double metal_area_factor, double metal_perimeter_factor, double ratio, const std::vector<std::pair<const db::Region *, double> > &diodes, db::Texts *values)
|
||||
{
|
||||
// TODO: that's basically too much .. we only need the clusters
|
||||
if (! m_netlist_extracted) {
|
||||
|
|
@ -1401,6 +1462,11 @@ db::Region LayoutToNetlist::antenna_check (const db::Region &gate, double gate_a
|
|||
|
||||
db::DeepLayer dl (&dss (), m_layout_index, ly.insert_layer ());
|
||||
|
||||
db::DeepLayer dlv;
|
||||
if (values) {
|
||||
dlv = db::DeepLayer (&dss (), m_layout_index, ly.insert_layer ());
|
||||
}
|
||||
|
||||
for (db::Layout::bottom_up_const_iterator cid = ly.begin_bottom_up (); cid != ly.end_bottom_up (); ++cid) {
|
||||
|
||||
const connected_clusters<db::NetShape> &clusters = m_net_clusters.clusters_per_cell (*cid);
|
||||
|
|
@ -1408,6 +1474,8 @@ db::Region LayoutToNetlist::antenna_check (const db::Region &gate, double gate_a
|
|||
continue;
|
||||
}
|
||||
|
||||
std::vector<db::Polygon::area_type> adiodes_int;
|
||||
|
||||
for (connected_clusters<db::NetShape>::all_iterator c = clusters.begin_all (); ! c.at_end (); ++c) {
|
||||
|
||||
if (! clusters.is_root (*c)) {
|
||||
|
|
@ -1417,13 +1485,18 @@ db::Region LayoutToNetlist::antenna_check (const db::Region &gate, double gate_a
|
|||
double r = ratio;
|
||||
bool skip = false;
|
||||
|
||||
for (std::vector<std::pair<const db::Region *, double> >::const_iterator d = diodes.begin (); d != diodes.end () && ! skip; ++d) {
|
||||
adiodes_int.clear ();
|
||||
adiodes_int.reserve (diodes.size ());
|
||||
|
||||
for (auto d = diodes.begin (); d != diodes.end () && ! skip; ++d) {
|
||||
|
||||
db::Polygon::area_type adiode_int = 0;
|
||||
db::Polygon::perimeter_type pdiode_int = 0;
|
||||
|
||||
compute_area_and_perimeter_of_net_shapes (m_net_clusters, *cid, *c, layer_of (*d->first), adiode_int, pdiode_int);
|
||||
|
||||
adiodes_int.push_back (adiode_int);
|
||||
|
||||
if (fabs (d->second) < db::epsilon) {
|
||||
if (adiode_int > 0) {
|
||||
skip = true;
|
||||
|
|
@ -1465,12 +1538,29 @@ db::Region LayoutToNetlist::antenna_check (const db::Region &gate, double gate_a
|
|||
}
|
||||
|
||||
if (tl::verbosity () >= 50) {
|
||||
tl::info << "cell [" << ly.cell_name (*cid) << "]: agate=" << tl::to_string (agate) << ", ametal=" << tl::to_string (ametal) << ", r=" << tl::sprintf ("%.12g", r);
|
||||
tl::info << "cell [" << ly.cell_name (*cid) << "]: " <<
|
||||
create_antenna_msg (agate, agate_int, gate_area_factor, pgate_int, gate_perimeter_factor,
|
||||
ametal, ametal_int, metal_area_factor, pmetal_int, metal_perimeter_factor,
|
||||
diodes, adiodes_int, r, ratio, dbu);
|
||||
}
|
||||
|
||||
if (ametal / agate > r + db::epsilon) {
|
||||
|
||||
db::Shapes &shapes = ly.cell (*cid).shapes (dl.layer ());
|
||||
get_merged_shapes_of_net (m_net_clusters, *cid, *c, layer_of (metal), shapes);
|
||||
db::Point ref = get_merged_shapes_of_net (m_net_clusters, *cid, *c, layer_of (metal), shapes);
|
||||
|
||||
if (values) {
|
||||
|
||||
// generate a data string with the details of the antenna computation (intentionally like JSON)
|
||||
std::string msg = create_antenna_msg (agate, agate_int, gate_area_factor, pgate_int, gate_perimeter_factor,
|
||||
ametal, ametal_int, metal_area_factor, pmetal_int, metal_perimeter_factor,
|
||||
diodes, adiodes_int, r, ratio, dbu);
|
||||
|
||||
db::Shapes &shapesv = ly.cell (*cid).shapes (dlv.layer ());
|
||||
shapesv.insert (db::Text (msg, db::Trans (ref - db::Point ())));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1481,6 +1571,10 @@ db::Region LayoutToNetlist::antenna_check (const db::Region &gate, double gate_a
|
|||
|
||||
}
|
||||
|
||||
if (values) {
|
||||
*values = db::Texts (new db::DeepTexts (dlv));
|
||||
}
|
||||
|
||||
return db::Region (new db::DeepRegion (dl));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -856,18 +856,18 @@ public:
|
|||
* regardless of the diode's area.
|
||||
* In other words: any diode will make the net safe against antenna discharge.
|
||||
*/
|
||||
db::Region antenna_check (const db::Region &gate, double gate_perimeter_factor, const db::Region &metal, double metal_perimeter_factor, double ratio, const std::vector<std::pair<const db::Region *, double> > &diodes = std::vector<std::pair<const db::Region *, double> > ())
|
||||
db::Region antenna_check (const db::Region &gate, double gate_perimeter_factor, const db::Region &metal, double metal_perimeter_factor, double ratio, const std::vector<std::pair<const db::Region *, double> > &diodes = std::vector<std::pair<const db::Region *, double> > (), db::Texts *values = 0)
|
||||
{
|
||||
return antenna_check (gate, 1.0, gate_perimeter_factor, metal, 1.0, metal_perimeter_factor, ratio, diodes);
|
||||
return antenna_check (gate, 1.0, gate_perimeter_factor, metal, 1.0, metal_perimeter_factor, ratio, diodes, values);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Variant of the antenna check not using the perimeter
|
||||
* This version uses 0 for the perimeter factor hence not taking into account the perimeter at all.
|
||||
*/
|
||||
db::Region antenna_check (const db::Region &gate, const db::Region &metal, double ratio, const std::vector<std::pair<const db::Region *, double> > &diodes = std::vector<std::pair<const db::Region *, double> > ())
|
||||
db::Region antenna_check (const db::Region &gate, const db::Region &metal, double ratio, const std::vector<std::pair<const db::Region *, double> > &diodes = std::vector<std::pair<const db::Region *, double> > (), db::Texts *values = 0)
|
||||
{
|
||||
return antenna_check (gate, 1.0, 0.0, metal, 1.0, 0.0, ratio, diodes);
|
||||
return antenna_check (gate, 1.0, 0.0, metal, 1.0, 0.0, ratio, diodes, values);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -879,8 +879,10 @@ public:
|
|||
*
|
||||
* where f is the area scale factor and t the perimeter scale factor. This version allows to ignore the
|
||||
* area contribution entirely and switch to a perimeter-based antenna check by setting f to zero.
|
||||
*
|
||||
* If values is non-null, texts explaining the violations are placed there.
|
||||
*/
|
||||
db::Region antenna_check (const db::Region &gate, double gate_area_factor, double gate_perimeter_factor, const db::Region &metal, double metal_area_factor, double metal_perimeter_factor, double ratio, const std::vector<std::pair<const db::Region *, double> > &diodes = std::vector<std::pair<const db::Region *, double> > ());
|
||||
db::Region antenna_check (const db::Region &gate, double gate_area_factor, double gate_perimeter_factor, const db::Region &metal, double metal_area_factor, double metal_perimeter_factor, double ratio, const std::vector<std::pair<const db::Region *, double> > &diodes = std::vector<std::pair<const db::Region *, double> > (), Texts *values = 0);
|
||||
|
||||
/**
|
||||
* @brief Saves the database to the given path
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ static std::vector<std::string> l2n_layer_names (const db::LayoutToNetlist *l2n)
|
|||
return ln;
|
||||
}
|
||||
|
||||
static db::Region antenna_check3 (db::LayoutToNetlist *l2n, const db::Region &poly, double poly_area_factor, double poly_perimeter_factor, const db::Region &metal, double metal_area_factor, double metal_perimeter_factor, double ratio, const std::vector<tl::Variant> &diodes)
|
||||
static db::Region antenna_check3 (db::LayoutToNetlist *l2n, const db::Region &poly, double poly_area_factor, double poly_perimeter_factor, const db::Region &metal, double metal_area_factor, double metal_perimeter_factor, double ratio, const std::vector<tl::Variant> &diodes, db::Texts *texts)
|
||||
{
|
||||
std::vector<std::pair<const db::Region *, double> > diode_pairs;
|
||||
|
||||
|
|
@ -127,17 +127,17 @@ static db::Region antenna_check3 (db::LayoutToNetlist *l2n, const db::Region &po
|
|||
|
||||
}
|
||||
|
||||
return l2n->antenna_check (poly, poly_area_factor, poly_perimeter_factor, metal, metal_area_factor, metal_perimeter_factor, ratio, diode_pairs);
|
||||
return l2n->antenna_check (poly, poly_area_factor, poly_perimeter_factor, metal, metal_area_factor, metal_perimeter_factor, ratio, diode_pairs, texts);
|
||||
}
|
||||
|
||||
static db::Region antenna_check2 (db::LayoutToNetlist *l2n, const db::Region &poly, double poly_perimeter_factor, const db::Region &metal, double metal_perimeter_factor, double ratio, const std::vector<tl::Variant> &diodes)
|
||||
static db::Region antenna_check2 (db::LayoutToNetlist *l2n, const db::Region &poly, double poly_perimeter_factor, const db::Region &metal, double metal_perimeter_factor, double ratio, const std::vector<tl::Variant> &diodes, db::Texts *texts)
|
||||
{
|
||||
return antenna_check3 (l2n, poly, 1, poly_perimeter_factor, metal, 1, metal_perimeter_factor, ratio, diodes);
|
||||
return antenna_check3 (l2n, poly, 1, poly_perimeter_factor, metal, 1, metal_perimeter_factor, ratio, diodes, texts);
|
||||
}
|
||||
|
||||
static db::Region antenna_check (db::LayoutToNetlist *l2n, const db::Region &poly, const db::Region &metal, double ratio, const std::vector<tl::Variant> &diodes)
|
||||
static db::Region antenna_check (db::LayoutToNetlist *l2n, const db::Region &poly, const db::Region &metal, double ratio, const std::vector<tl::Variant> &diodes, db::Texts *texts)
|
||||
{
|
||||
return antenna_check3 (l2n, poly, 1, 0, metal, 1, 0, ratio, diodes);
|
||||
return antenna_check3 (l2n, poly, 1, 0, metal, 1, 0, ratio, diodes, texts);
|
||||
}
|
||||
|
||||
static void join_net_names (db::LayoutToNetlist *l2n, const std::string &s)
|
||||
|
|
@ -701,7 +701,7 @@ Class<db::LayoutToNetlist> decl_dbLayoutToNetlist ("db", "LayoutToNetlist",
|
|||
"@brief Reads the extracted netlist from the file.\n"
|
||||
"This method employs the native format of KLayout.\n"
|
||||
) +
|
||||
gsi::method_ext ("antenna_check", &antenna_check, gsi::arg ("gate"), gsi::arg ("metal"), gsi::arg ("ratio"), gsi::arg ("diodes", std::vector<tl::Variant> (), "[]"),
|
||||
gsi::method_ext ("antenna_check", &antenna_check, gsi::arg ("gate"), gsi::arg ("metal"), gsi::arg ("ratio"), gsi::arg ("diodes", std::vector<tl::Variant> (), "[]"), gsi::arg ("texts", (db::Texts *) 0, "nil"),
|
||||
"@brief Runs an antenna check on the extracted clusters\n"
|
||||
"\n"
|
||||
"The antenna check will traverse all clusters and run an antenna check\n"
|
||||
|
|
@ -741,8 +741,13 @@ Class<db::LayoutToNetlist> decl_dbLayoutToNetlist ("db", "LayoutToNetlist",
|
|||
"# diode_layer1 increases the ratio by 50 per square micrometer area:\n"
|
||||
"errors = l2n.antenna(poly, metal, 10.0 [ [ diode_layer, 50.0 ] ])\n"
|
||||
"@/code\n"
|
||||
"\n"
|
||||
"If 'texts' is non-nil, this text collection will receive labels explaining the error in "
|
||||
"terms of area values and relevant ratio.\n"
|
||||
"\n"
|
||||
"The 'texts' parameter has been added in version 0.27.11."
|
||||
) +
|
||||
gsi::method_ext ("antenna_check", &antenna_check2, gsi::arg ("gate"), gsi::arg ("gate_perimeter_factor"), gsi::arg ("metal"), gsi::arg ("metal_perimeter_factor"), gsi::arg ("ratio"), gsi::arg ("diodes", std::vector<tl::Variant> (), "[]"),
|
||||
gsi::method_ext ("antenna_check", &antenna_check2, gsi::arg ("gate"), gsi::arg ("gate_perimeter_factor"), gsi::arg ("metal"), gsi::arg ("metal_perimeter_factor"), gsi::arg ("ratio"), gsi::arg ("diodes", std::vector<tl::Variant> (), "[]"), gsi::arg ("texts", (db::Texts *) 0, "nil"),
|
||||
"@brief Runs an antenna check on the extracted clusters taking the perimeter into account\n"
|
||||
"\n"
|
||||
"This version of the \\antenna_check method allows taking the perimeter of gate or metal into account. "
|
||||
|
|
@ -759,7 +764,7 @@ Class<db::LayoutToNetlist> decl_dbLayoutToNetlist ("db", "LayoutToNetlist",
|
|||
"\n"
|
||||
"This variant has been introduced in version 0.26.6.\n"
|
||||
) +
|
||||
gsi::method_ext ("antenna_check", &antenna_check3, gsi::arg ("gate"), gsi::arg ("gate_area_factor"), gsi::arg ("gate_perimeter_factor"), gsi::arg ("metal"), gsi::arg ("metal_area_factor"), gsi::arg ("metal_perimeter_factor"), gsi::arg ("ratio"), gsi::arg ("diodes", std::vector<tl::Variant> (), "[]"),
|
||||
gsi::method_ext ("antenna_check", &antenna_check3, gsi::arg ("gate"), gsi::arg ("gate_area_factor"), gsi::arg ("gate_perimeter_factor"), gsi::arg ("metal"), gsi::arg ("metal_area_factor"), gsi::arg ("metal_perimeter_factor"), gsi::arg ("ratio"), gsi::arg ("diodes", std::vector<tl::Variant> (), "[]"), gsi::arg ("texts", (db::Texts *) 0, "nil"),
|
||||
"@brief Runs an antenna check on the extracted clusters taking the perimeter into account and providing an area factor\n"
|
||||
"\n"
|
||||
"This (most generic) version of the \\antenna_check method allows taking the perimeter of gate or metal into account and also "
|
||||
|
|
|
|||
|
|
@ -351,7 +351,7 @@ module DRC
|
|||
# %DRC%
|
||||
# @brief Performs an antenna check
|
||||
# @name antenna_check
|
||||
# @synopsis antenna_check(gate, metal, ratio, [ diode_specs ... ])
|
||||
# @synopsis antenna_check(gate, metal, ratio, [ diode_specs ... ] [, texts ])
|
||||
#
|
||||
# The antenna check is used to avoid plasma induced damage. Physically,
|
||||
# the damage happes if during the manufacturing of a metal layer with
|
||||
|
|
@ -486,8 +486,13 @@ module DRC
|
|||
# The error shapes produced by the antenna check are copies
|
||||
# of the metal shapes on the metal layers of each network
|
||||
# violating the antenna rule.
|
||||
#
|
||||
# You can specify a text layer (use "labels" to create one). It will receive
|
||||
# error labels describing the measured values and computation parameters for debugging
|
||||
# the layout. This option has been introduced in version 0.27.11.
|
||||
#
|
||||
|
||||
def antenna_check(agate, ametal, ratio, *diodes)
|
||||
def antenna_check(agate, ametal, ratio, *args)
|
||||
|
||||
@engine._context("antenna_check") do
|
||||
|
||||
|
|
@ -529,18 +534,31 @@ module DRC
|
|||
raise("Ratio argument is not a number")
|
||||
end
|
||||
|
||||
dl = diodes.collect do |d|
|
||||
if d.is_a?(Array)
|
||||
d.size == 2 || raise("Diode specification pair expects two elements")
|
||||
d[0].requires_region
|
||||
[ d[0].data, d[1].to_f ]
|
||||
else
|
||||
d.requires_region
|
||||
[ d.data, 0.0 ]
|
||||
dl = []
|
||||
texts = nil
|
||||
n = 3
|
||||
args.each do |a|
|
||||
if a.is_a?(Array)
|
||||
a.size == 2 || raise("Diode specification pair expects two elements for argument #{n + 1}")
|
||||
if ! a[0].is_a?(DRC::DRCLayer)
|
||||
raise("Diode specification pair needs a layer for the first argument of argument #{n + 1}")
|
||||
end
|
||||
a[0].requires_region
|
||||
dl << [ a[0].data, a[1].to_f ]
|
||||
elsif ! a.is_a?(DRC::DRCLayer)
|
||||
raise("Argument #{n + 1} has to be a layer")
|
||||
else
|
||||
a.requires_texts_or_region
|
||||
if a.data.is_a?(RBA::Region)
|
||||
dl << [ a.data, 0.0 ]
|
||||
else
|
||||
texts = a.data
|
||||
end
|
||||
end
|
||||
n += 1
|
||||
end
|
||||
|
||||
DRC::DRCLayer::new(@engine, @engine._cmd(l2n_data, :antenna_check, gate.data, gate_area_factor, gate_perimeter_factor, metal.data, metal_area_factor, metal_perimeter_factor, ratio, dl))
|
||||
DRC::DRCLayer::new(@engine, @engine._cmd(l2n_data, :antenna_check, gate.data, gate_area_factor, gate_perimeter_factor, metal.data, metal_area_factor, metal_perimeter_factor, ratio, dl, texts))
|
||||
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -367,6 +367,7 @@ CODE
|
|||
# %DRC%
|
||||
# @name input
|
||||
# @brief Specifies input from a source
|
||||
# @synopsis source.input
|
||||
# @synopsis source.input(layer)
|
||||
# @synopsis source.input(layer, datatype)
|
||||
# @synopsis source.input(layer_into)
|
||||
|
|
@ -405,6 +406,8 @@ CODE
|
|||
# True text layers should be preferred over mixed polygon/text layers if text object processing
|
||||
# is required.
|
||||
#
|
||||
# "input" without any arguments will create a new, empty original layer.
|
||||
#
|
||||
# Use the global version of "input" without a source object to address the default source.
|
||||
|
||||
def input(*args)
|
||||
|
|
@ -417,6 +420,7 @@ CODE
|
|||
# %DRC%
|
||||
# @name labels
|
||||
# @brief Gets the labels (texts) from an input layer
|
||||
# @synopsis source.labels
|
||||
# @synopsis source.labels(layer)
|
||||
# @synopsis source.labels(layer, datatype)
|
||||
# @synopsis source.labels(layer_into)
|
||||
|
|
@ -429,6 +433,8 @@ CODE
|
|||
# to provide text support but a layer type which is provided for carrying text objects
|
||||
# explicitly.
|
||||
#
|
||||
# "labels" without any arguments will create a new, empty original layer.
|
||||
#
|
||||
# Use the global version of "labels" without a source object to address the default source.
|
||||
|
||||
def labels(*args)
|
||||
|
|
@ -441,6 +447,7 @@ CODE
|
|||
# %DRC%
|
||||
# @name polygons
|
||||
# @brief Gets the polygon shapes (or shapes that can be converted polygons) from an input layer
|
||||
# @synopsis source.polygons
|
||||
# @synopsis source.polygons(layer)
|
||||
# @synopsis source.polygons(layer, datatype)
|
||||
# @synopsis source.polygons(layer_into)
|
||||
|
|
@ -452,6 +459,8 @@ CODE
|
|||
#
|
||||
# This method is identical to \input with respect to the options supported.
|
||||
#
|
||||
# "polygons" without any arguments will create a new, empty original layer.
|
||||
#
|
||||
# Use the global version of "polygons" without a source object to address the default source.
|
||||
|
||||
def polygons(*args)
|
||||
|
|
@ -464,6 +473,7 @@ CODE
|
|||
# %DRC%
|
||||
# @name edges
|
||||
# @brief Gets the edge shapes (or shapes that can be converted edges) from an input layer
|
||||
# @synopsis source.edges
|
||||
# @synopsis source.edges(layer)
|
||||
# @synopsis source.edges(layer, datatype)
|
||||
# @synopsis source.edges(layer_into)
|
||||
|
|
@ -478,6 +488,8 @@ CODE
|
|||
#
|
||||
# Use the global version of "edges" without a source object to address the default source.
|
||||
#
|
||||
# "edges" without any arguments will create a new, empty original layer.
|
||||
#
|
||||
# This method has been introduced in version 0.27.
|
||||
|
||||
def edges(*args)
|
||||
|
|
@ -490,6 +502,7 @@ CODE
|
|||
# %DRC%
|
||||
# @name edge_pairs
|
||||
# @brief Gets the edge pairs from an input layer
|
||||
# @synopsis source.edge_pairs
|
||||
# @synopsis source.edge_pairs(layer)
|
||||
# @synopsis source.edge_pairs(layer, datatype)
|
||||
# @synopsis source.edge_pairs(layer_into)
|
||||
|
|
@ -504,6 +517,8 @@ CODE
|
|||
#
|
||||
# Use the global version of "edge_pairs" without a source object to address the default source.
|
||||
#
|
||||
# "edge_pairs" without any arguments will create a new, empty original layer.
|
||||
#
|
||||
# This method has been introduced in version 0.27.
|
||||
|
||||
def edge_pairs(*args)
|
||||
|
|
@ -517,7 +532,8 @@ CODE
|
|||
# @name make_layer
|
||||
# @brief Creates an empty polygon layer based on the hierarchy of the layout
|
||||
# @synopsis make_layer
|
||||
# This method delivers a new empty original layer.
|
||||
# This method delivers a new empty original layer. It is provided to keep old code working.
|
||||
# Use "input" without arguments instead.
|
||||
|
||||
def make_layer
|
||||
layers = []
|
||||
|
|
|
|||
|
|
@ -3037,6 +3037,12 @@ The effect of the operation is shown in these examples:
|
|||
</tr>
|
||||
</table>
|
||||
</p>
|
||||
<a name="texts?"/><h2>"texts?" - Returns true, if the layer is a text collection</h2>
|
||||
<keyword name="texts?"/>
|
||||
<p>Usage:</p>
|
||||
<ul>
|
||||
<li><tt>layer.texts?</tt></li>
|
||||
</ul>
|
||||
<a name="texts_not"/><h2>"texts_not" - Selects texts from an original layer not matching a specific selection</h2>
|
||||
<keyword name="texts_not"/>
|
||||
<p>Usage:</p>
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ More methods will be added in the future to support network-related features.
|
|||
<keyword name="antenna_check"/>
|
||||
<p>Usage:</p>
|
||||
<ul>
|
||||
<li><tt>antenna_check(gate, metal, ratio, [ diode_specs ... ])</tt></li>
|
||||
<li><tt>antenna_check(gate, metal, ratio, [ diode_specs ... ] [, texts ])</tt></li>
|
||||
</ul>
|
||||
<p>
|
||||
The antenna check is used to avoid plasma induced damage. Physically,
|
||||
|
|
@ -201,6 +201,10 @@ errors = antenna_check(perimeter_only(gate, 0.5), ...)
|
|||
The error shapes produced by the antenna check are copies
|
||||
of the metal shapes on the metal layers of each network
|
||||
violating the antenna rule.
|
||||
</p><p>
|
||||
You can specify a text layer (use "labels" to create one). It will receive
|
||||
error labels describing the measured values and computation parameters for debugging
|
||||
the layout. This option has been introduced in version 0.27.11.
|
||||
</p>
|
||||
<a name="clear_connections"/><h2>"clear_connections" - Clears all connections stored so far</h2>
|
||||
<keyword name="clear_connections"/>
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ same but without clipping is <a href="#touching">touching</a> or <a href="#overl
|
|||
<keyword name="edge_pairs"/>
|
||||
<p>Usage:</p>
|
||||
<ul>
|
||||
<li><tt>source.edge_pairs</tt></li>
|
||||
<li><tt>source.edge_pairs(layer)</tt></li>
|
||||
<li><tt>source.edge_pairs(layer, datatype)</tt></li>
|
||||
<li><tt>source.edge_pairs(layer_into)</tt></li>
|
||||
|
|
@ -73,12 +74,15 @@ This method is identical to <a href="#input">input</a> with respect to the optio
|
|||
</p><p>
|
||||
Use the global version of "edge_pairs" without a source object to address the default source.
|
||||
</p><p>
|
||||
"edge_pairs" without any arguments will create a new, empty original layer.
|
||||
</p><p>
|
||||
This method has been introduced in version 0.27.
|
||||
</p>
|
||||
<a name="edges"/><h2>"edges" - Gets the edge shapes (or shapes that can be converted edges) from an input layer</h2>
|
||||
<keyword name="edges"/>
|
||||
<p>Usage:</p>
|
||||
<ul>
|
||||
<li><tt>source.edges</tt></li>
|
||||
<li><tt>source.edges(layer)</tt></li>
|
||||
<li><tt>source.edges(layer, datatype)</tt></li>
|
||||
<li><tt>source.edges(layer_into)</tt></li>
|
||||
|
|
@ -94,6 +98,8 @@ This method is identical to <a href="#input">input</a> with respect to the optio
|
|||
</p><p>
|
||||
Use the global version of "edges" without a source object to address the default source.
|
||||
</p><p>
|
||||
"edges" without any arguments will create a new, empty original layer.
|
||||
</p><p>
|
||||
This method has been introduced in version 0.27.
|
||||
</p>
|
||||
<a name="extent"/><h2>"extent" - Returns a layer with the bounding box of the selected layout or cells</h2>
|
||||
|
|
@ -160,6 +166,7 @@ source.global_transform(shift(0, 100.um), rotate(90.0))
|
|||
<keyword name="input"/>
|
||||
<p>Usage:</p>
|
||||
<ul>
|
||||
<li><tt>source.input</tt></li>
|
||||
<li><tt>source.input(layer)</tt></li>
|
||||
<li><tt>source.input(layer, datatype)</tt></li>
|
||||
<li><tt>source.input(layer_into)</tt></li>
|
||||
|
|
@ -200,12 +207,15 @@ operations is available for these objects, such as boolean "and" and "not" with
|
|||
True text layers should be preferred over mixed polygon/text layers if text object processing
|
||||
is required.
|
||||
</p><p>
|
||||
"input" without any arguments will create a new, empty original layer.
|
||||
</p><p>
|
||||
Use the global version of "input" without a source object to address the default source.
|
||||
</p>
|
||||
<a name="labels"/><h2>"labels" - Gets the labels (texts) from an input layer</h2>
|
||||
<keyword name="labels"/>
|
||||
<p>Usage:</p>
|
||||
<ul>
|
||||
<li><tt>source.labels</tt></li>
|
||||
<li><tt>source.labels(layer)</tt></li>
|
||||
<li><tt>source.labels(layer, datatype)</tt></li>
|
||||
<li><tt>source.labels(layer_into)</tt></li>
|
||||
|
|
@ -219,6 +229,8 @@ layer. Starting with version 0.27, the result is no longer a polygon layer that
|
|||
to provide text support but a layer type which is provided for carrying text objects
|
||||
explicitly.
|
||||
</p><p>
|
||||
"labels" without any arguments will create a new, empty original layer.
|
||||
</p><p>
|
||||
Use the global version of "labels" without a source object to address the default source.
|
||||
</p>
|
||||
<a name="layers"/><h2>"layers" - Gets the layers the source contains</h2>
|
||||
|
|
@ -258,7 +270,8 @@ layers.each { |l| (input(l) & clip_box).output(l) }
|
|||
<li><tt>make_layer</tt></li>
|
||||
</ul>
|
||||
<p>
|
||||
This method delivers a new empty original layer.
|
||||
This method delivers a new empty original layer. It is provided to keep old code working.
|
||||
Use "input" without arguments instead.
|
||||
</p>
|
||||
<a name="overlapping"/><h2>"overlapping" - Specifies input selected from a region in overlapping mode</h2>
|
||||
<keyword name="overlapping"/>
|
||||
|
|
@ -286,6 +299,7 @@ the search region with their bounding box (without the requirement to overlap)
|
|||
<keyword name="polygons"/>
|
||||
<p>Usage:</p>
|
||||
<ul>
|
||||
<li><tt>source.polygons</tt></li>
|
||||
<li><tt>source.polygons(layer)</tt></li>
|
||||
<li><tt>source.polygons(layer, datatype)</tt></li>
|
||||
<li><tt>source.polygons(layer_into)</tt></li>
|
||||
|
|
@ -298,6 +312,8 @@ Those are boxes, paths and real polygons.
|
|||
</p><p>
|
||||
This method is identical to <a href="#input">input</a> with respect to the options supported.
|
||||
</p><p>
|
||||
"polygons" without any arguments will create a new, empty original layer.
|
||||
</p><p>
|
||||
Use the global version of "polygons" without a source object to address the default source.
|
||||
</p>
|
||||
<a name="select"/><h2>"select" - Adds cell name expressions to the cell filters</h2>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 6.8 KiB |