Merge pull request #2257 from KLayout/evaluate_net-enhancements

Evaluate net enhancements
This commit is contained in:
Matthias Köfferlein 2026-02-05 21:53:39 +01:00 committed by GitHub
commit 01d2ccbdc5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
175 changed files with 2463 additions and 1379 deletions

View File

@ -407,14 +407,16 @@ void Circuit::join_nets (Net *net, Net *with)
subcircuit->connect_pin (with->begin_subcircuit_pins ()->pin_id (), net); subcircuit->connect_pin (with->begin_subcircuit_pins ()->pin_id (), net);
} }
while (with->begin_pins () != with->end_pins ()) {
join_pin_with_net (with->begin_pins ()->pin_id (), net);
}
if (netlist ()->callbacks ()) { if (netlist ()->callbacks ()) {
netlist ()->callbacks ()->link_nets (net, with); netlist ()->callbacks ()->link_nets (net, with);
} }
// NOTE: this needs to happen after the callback was called because further up in the
// hierarchy we want the clusters to be joined already
while (with->begin_pins () != with->end_pins ()) {
join_pin_with_net (with->begin_pins ()->pin_id (), net);
}
// create a new name for the joined net // create a new name for the joined net
net->set_name (join_names (net->name (), with->name ())); net->set_name (join_names (net->name (), with->name ()));

View File

@ -1577,6 +1577,66 @@ connected_clusters<T>::add_connection (typename local_cluster<T>::id_type id, co
m_rev_connections [inst] = id; m_rev_connections [inst] = id;
} }
template <class T>
void
connected_clusters<T>::rename_connection (const ClusterInstance &inst, typename local_cluster<T>::id_type to_id)
{
if (inst.id () == to_id) {
return; // nothing to do
}
ClusterInstance new_inst (to_id, inst);
auto rc = m_rev_connections.find (inst);
if (rc == m_rev_connections.end ()) {
return; // TODO: assert?
}
auto id = rc->second;
m_rev_connections.erase (rc);
auto &connections = m_connections [id];
auto rc_exists = m_rev_connections.find (new_inst);
if (rc_exists != m_rev_connections.end ()) {
// NOTE: possibly a different connection to the new cluster already exists (i.e.
// rc_exists->second != id).
// This may mean we are connecting two clusters here on parent level. In the netlist, this
// is reflected by having multiple upward pins. Right now, we cannot reflect this case
// in the reverse connection structures and keep the existing one only in the reverse
// lookup.
// Remove to original connections downwards
// TODO: this linear search may be slow
for (auto i = connections.begin (), ii = connections.begin (); i != connections.end (); ii = i, ++i) {
if (*i == inst) {
if (ii == i) {
connections.pop_front ();
} else {
connections.erase_after (ii);
}
break;
}
}
} else {
m_rev_connections.insert (std::make_pair (new_inst, id));
// Replace connections downwards
// TODO: this linear search may be slow
for (auto i = connections.begin (); i != connections.end (); ++i) {
if (*i == inst) {
*i = new_inst;
break;
}
}
}
}
template <class T> template <class T>
void void
connected_clusters<T>::join_cluster_with (typename local_cluster<T>::id_type id, typename local_cluster<T>::id_type with_id) connected_clusters<T>::join_cluster_with (typename local_cluster<T>::id_type id, typename local_cluster<T>::id_type with_id)
@ -1599,11 +1659,31 @@ connected_clusters<T>::join_cluster_with (typename local_cluster<T>::id_type id,
} }
connections_type &target = m_connections [id]; connections_type &target = m_connections [id];
target.splice (to_join);
if (target.empty ()) {
target.swap (to_join);
} else if (! to_join.empty ()) {
// Join while removing duplicates
std::set<connections_type::value_type> in_target (target.begin (), target.end ());
for (auto j = to_join.begin (); j != to_join.end (); ++j) {
if (in_target.find (*j) == in_target.end ()) {
target.push_back (*j);
}
}
}
m_connections.erase (tc); m_connections.erase (tc);
} }
if (m_connected_clusters.find (with_id) != m_connected_clusters.end ()) {
m_connected_clusters.insert (id);
m_connected_clusters.erase (with_id);
}
} }
template <class T> template <class T>

View File

@ -844,6 +844,12 @@ public:
// .. nothing yet .. // .. nothing yet ..
} }
ClusterInstance (size_t id, const db::ClusterInstElement &inst_element)
: ClusterInstElement (inst_element), m_id (id)
{
// .. nothing yet ..
}
ClusterInstance (size_t id) ClusterInstance (size_t id)
: ClusterInstElement (), m_id (id) : ClusterInstElement (), m_id (id)
{ {
@ -1255,6 +1261,11 @@ public:
*/ */
void add_connection (typename local_cluster<T>::id_type, const ClusterInstance &inst); void add_connection (typename local_cluster<T>::id_type, const ClusterInstance &inst);
/**
* @brief Changes the cluster ID of the connection
*/
void rename_connection (const ClusterInstance &inst, typename local_cluster<T>::id_type to_id);
/** /**
* @brief Joins the cluster id with the cluster with_id * @brief Joins the cluster id with the cluster with_id
* *

View File

@ -212,12 +212,28 @@ void LayoutToNetlist::link_nets (const db::Net *net, const db::Net *with)
{ {
if (! net->circuit () || net->circuit () != with->circuit () || ! internal_layout () if (! net->circuit () || net->circuit () != with->circuit () || ! internal_layout ()
|| ! internal_layout ()->is_valid_cell_index (net->circuit ()->cell_index ()) || ! internal_layout ()->is_valid_cell_index (net->circuit ()->cell_index ())
|| net->cluster_id () == 0 || with->cluster_id () == 0) { || net->cluster_id () == 0 || with->cluster_id () == 0 || net == with) {
return; return;
} }
connected_clusters<db::NetShape> &clusters = m_net_clusters.clusters_per_cell (net->circuit ()->cell_index ()); connected_clusters<db::NetShape> &clusters = m_net_clusters.clusters_per_cell (net->circuit ()->cell_index ());
clusters.join_cluster_with (net->cluster_id (), with->cluster_id ()); clusters.join_cluster_with (net->cluster_id (), with->cluster_id ());
// fix the connections from the parents
const db::Cell &cc = internal_layout ()->cell (net->circuit ()->cell_index ());
for (db::Cell::parent_inst_iterator p = cc.begin_parent_insts (); ! p.at_end (); ++p) {
connected_clusters<db::NetShape> &pclusters = m_net_clusters.clusters_per_cell (p->parent_cell_index ());
db::CellInstArray ci = p->child_inst ().cell_inst ();
for (db::CellInstArray::iterator ia = ci.begin (); ! ia.at_end(); ++ia) {
db::ClusterInstance cli (with->cluster_id (), ci.object ().cell_index (), ci.complex_trans (*ia), p->child_inst ().prop_id ());
pclusters.rename_connection (cli, net->cluster_id ());
}
}
} }
size_t LayoutToNetlist::link_net_to_parent_circuit (const Net *subcircuit_net, Circuit *parent_circuit, const DCplxTrans &dtrans) size_t LayoutToNetlist::link_net_to_parent_circuit (const Net *subcircuit_net, Circuit *parent_circuit, const DCplxTrans &dtrans)
@ -1800,40 +1816,91 @@ LayoutToNetlist::compute_area_and_perimeter_of_net_shapes (db::cell_index_type c
} }
db::Point db::Point
LayoutToNetlist::get_merged_shapes_of_net (db::cell_index_type ci, size_t cid, unsigned int layer_id, db::Shapes &shapes, db::properties_id_type prop_id) const LayoutToNetlist::get_shapes_of_net (db::cell_index_type ci, size_t cid, const std::vector<unsigned int> &layer_ids, bool merge, size_t max_polygons, db::Shapes &shapes, db::properties_id_type prop_id) const
{ {
const db::Layout *layout = &dss ().const_layout (m_layout_index); const db::Layout *layout = &dss ().const_layout (m_layout_index);
db::Point ref; // count vertices and polygons and determine label reference point
size_t n = 0, npoly = 0;
bool any_ref = false; bool any_ref = false;
db::EdgeProcessor ep; db::Point ref;
// count vertices and reserve space for (auto l = layer_ids.begin (); l != layer_ids.end (); ++l) {
size_t n = 0; for (db::recursive_cluster_shape_iterator<db::NetShape> rci (m_net_clusters, *l, ci, cid); !rci.at_end (); ++rci) {
for (db::recursive_cluster_shape_iterator<db::NetShape> rci (m_net_clusters, layer_id, ci, cid); !rci.at_end (); ++rci) {
n += rci->polygon_ref ().vertices ();
}
ep.reserve (n);
size_t p = 0; db::PolygonRef pr = rci->polygon_ref ();
for (db::recursive_cluster_shape_iterator<db::NetShape> rci (m_net_clusters, layer_id, ci, cid); !rci.at_end (); ++rci) {
db::PolygonRef pr = rci->polygon_ref (); n += pr.vertices ();
db::PolygonRef::polygon_edge_iterator e = pr.begin_edge (); ++npoly;
if (! e.at_end ()) {
// pick one reference point for the label db::PolygonRef::polygon_edge_iterator e = pr.begin_edge ();
auto p1 = (rci.trans () * *e).p1 (); if (! e.at_end ()) {
if (! any_ref || p1 < ref) { // pick one reference point for the label
ref = p1; auto p1 = (rci.trans () * *e).p1 ();
any_ref = true; if (! any_ref || p1 < ref) {
ref = p1;
any_ref = true;
}
} }
ep.insert_with_trans (pr, rci.trans (), ++p);
} }
} }
db::PolygonRefToShapesGenerator sg (const_cast<db::Layout *> (layout), &shapes, prop_id); if (n == 0) {
db::PolygonGenerator pg (sg, false);
db::SimpleMerge op; // nothing to do ...
ep.process (pg, op);
} else if (npoly >= max_polygons) {
db::Box bbox;
for (auto l = layer_ids.begin (); l != layer_ids.end (); ++l) {
for (db::recursive_cluster_shape_iterator<db::NetShape> rci (m_net_clusters, *l, ci, cid); !rci.at_end (); ++rci) {
db::PolygonRef pr = rci->polygon_ref ();
bbox += rci.trans () * pr.box ();
}
}
if (prop_id != 0) {
shapes.insert (db::BoxWithProperties (bbox, prop_id));
} else {
shapes.insert (bbox);
}
} else if (merge) {
db::EdgeProcessor ep;
ep.reserve (n);
size_t p = 0;
for (auto l = layer_ids.begin (); l != layer_ids.end (); ++l) {
for (db::recursive_cluster_shape_iterator<db::NetShape> rci (m_net_clusters, *l, ci, cid); !rci.at_end (); ++rci) {
db::PolygonRef pr = rci->polygon_ref ();
db::PolygonRef::polygon_edge_iterator e = pr.begin_edge ();
if (! e.at_end ()) {
ep.insert_with_trans (pr, rci.trans (), ++p);
}
}
}
db::PolygonRefToShapesGenerator sg (const_cast<db::Layout *> (layout), &shapes, prop_id);
db::PolygonGenerator pg (sg, false);
db::SimpleMerge op;
ep.process (pg, op);
} else {
db::PolygonRefToShapesGenerator sg (const_cast<db::Layout *> (layout), &shapes, prop_id);
for (auto l = layer_ids.begin (); l != layer_ids.end (); ++l) {
for (db::recursive_cluster_shape_iterator<db::NetShape> rci (m_net_clusters, *l, ci, cid); !rci.at_end (); ++rci) {
db::PolygonRef pr = rci->polygon_ref ();
sg.put (pr.instantiate ().transformed (rci.trans ()));
}
}
}
return ref; return ref;
} }
@ -2017,7 +2084,9 @@ db::Region LayoutToNetlist::antenna_check (const db::Region &gate, double gate_a
prop_id = db::properties_id (ps); prop_id = db::properties_id (ps);
} }
db::Point ref = get_merged_shapes_of_net (*cid, *c, layer_of (metal), shapes, prop_id); std::vector<unsigned int> layers;
layers.push_back (layer_of (metal));
db::Point ref = get_shapes_of_net (*cid, *c, layers, true, std::numeric_limits<size_t>::max (), shapes, prop_id);
if (values) { if (values) {
@ -2074,7 +2143,9 @@ LayoutToNetlist::measure_net (const db::Region &primary, const std::map<std::str
eval.set_var (v->first, v->second); eval.set_var (v->first, v->second);
} }
eval.set_primary_layer (layer_of (primary)); unsigned int primary_layer = layer_of (primary);
eval.set_primary_layer (primary_layer);
for (auto s = secondary.begin (); s != secondary.end (); ++s) { for (auto s = secondary.begin (); s != secondary.end (); ++s) {
if (s->second) { if (s->second) {
eval.set_secondary_layer (s->first, layer_of (*s->second)); eval.set_secondary_layer (s->first, layer_of (*s->second));
@ -2088,7 +2159,6 @@ LayoutToNetlist::measure_net (const db::Region &primary, const std::map<std::str
eval.parse (compiled_expr, ex); eval.parse (compiled_expr, ex);
db::DeepLayer dl (&dss (), m_layout_index, ly.insert_layer ()); db::DeepLayer dl (&dss (), m_layout_index, ly.insert_layer ());
unsigned int primary_layer = layer_of (primary);
for (db::Layout::bottom_up_const_iterator cid = ly.begin_bottom_up (); cid != ly.end_bottom_up (); ++cid) { for (db::Layout::bottom_up_const_iterator cid = ly.begin_bottom_up (); cid != ly.end_bottom_up (); ++cid) {
@ -2113,9 +2183,9 @@ LayoutToNetlist::measure_net (const db::Region &primary, const std::map<std::str
eval.reset (*cid, *c); eval.reset (*cid, *c);
compiled_expr.execute (); compiled_expr.execute ();
if (! eval.skip ()) { if (! eval.copy_layers ().empty ()) {
db::Shapes &shapes = ly.cell (*cid).shapes (dl.layer ()); db::Shapes &shapes = ly.cell (*cid).shapes (dl.layer ());
get_merged_shapes_of_net (*cid, *c, primary_layer, shapes, db::properties_id (eval.prop_set_out ())); get_shapes_of_net (*cid, *c, eval.copy_layers (), eval.copy_merge (), eval.copy_max_polygons (), shapes, db::properties_id (eval.prop_set_out ()));
} }
} catch (tl::Exception &ex) { } catch (tl::Exception &ex) {

View File

@ -1200,9 +1200,14 @@ public:
void compute_area_and_perimeter_of_net_shapes (db::cell_index_type ci, size_t cid, unsigned int layer_id, db::Polygon::area_type &area, db::Polygon::perimeter_type &perimeter) const; void compute_area_and_perimeter_of_net_shapes (db::cell_index_type ci, size_t cid, unsigned int layer_id, db::Polygon::area_type &area, db::Polygon::perimeter_type &perimeter) const;
/** /**
* @brief Utility: computes the merged shapes of a net * @brief Utility: computes the shapes of a net
*
* If 'merged' is true, all polygons will be merged.
*
* If 'max_polygons' is set to a value less that std::numeric_limits<size_t>::max,
* the polygons will be replaced by a bounding box if the number of polygons exceeds the number given by the limit
*/ */
db::Point get_merged_shapes_of_net (db::cell_index_type ci, size_t cid, unsigned int layer_id, db::Shapes &shapes, db::properties_id_type prop_id) const; db::Point get_shapes_of_net (db::cell_index_type ci, size_t cid, const std::vector<unsigned int> &layer_ids, bool merged, size_t max_polygons, db::Shapes &shapes, db::properties_id_type prop_id) const;
private: private:
// no copying // no copying

View File

@ -188,7 +188,7 @@ namespace db
* scale(<mag>) - magnification (default is 1) [short key: S] * scale(<mag>) - magnification (default is 1) [short key: S]
* *
* [message-entry]: * [message-entry]:
* message([severity] [message|message-geometry|message-cell|message-category|any]*) - message entry [short key: H] * message([severity] [message|message-geometry|message-cell|message-category|message-net|any]*) - message entry [short key: H]
* *
* [message]: * [message]:
* description(<name>) - message text [short key: B] * description(<name>) - message text [short key: B]
@ -199,6 +199,9 @@ namespace db
* [message-cell]: * [message-cell]:
* cell(<name>) - message cell [short key: C] * cell(<name>) - message cell [short key: C]
* *
* [message-net]:
* net(<name>) - message net name [short key: N]
*
* [message-category]: * [message-category]:
* cat(<name> <name>?) - message category with optional description [short key: X] * cat(<name> <name>?) - message category with optional description [short key: X]
* *

View File

@ -225,6 +225,18 @@ bool LayoutToNetlistStandardReader::read_message_cell (std::string &cell_name)
} }
} }
bool LayoutToNetlistStandardReader::read_message_net (std::string &net_name)
{
if (test (skeys::net_key) || test (lkeys::net_key)) {
Brace br (this);
read_word_or_quoted (net_name);
br.done ();
return true;
} else {
return false;
}
}
bool LayoutToNetlistStandardReader::read_message_geometry (db::DPolygon &polygon) bool LayoutToNetlistStandardReader::read_message_geometry (db::DPolygon &polygon)
{ {
if (test (skeys::polygon_key) || test (lkeys::polygon_key)) { if (test (skeys::polygon_key) || test (lkeys::polygon_key)) {
@ -258,7 +270,7 @@ bool LayoutToNetlistStandardReader::read_message_cat (std::string &category_name
void LayoutToNetlistStandardReader::read_message_entry (db::LogEntryData &data) void LayoutToNetlistStandardReader::read_message_entry (db::LogEntryData &data)
{ {
Severity severity (db::NoSeverity); Severity severity (db::NoSeverity);
std::string msg, cell_name, category_name, category_description; std::string msg, cell_name, net_name, category_name, category_description;
db::DPolygon geometry; db::DPolygon geometry;
Brace br (this); Brace br (this);
@ -269,6 +281,8 @@ void LayoutToNetlistStandardReader::read_message_entry (db::LogEntryData &data)
// continue // continue
} else if (read_message_cell (cell_name)) { } else if (read_message_cell (cell_name)) {
// continue // continue
} else if (read_message_net (net_name)) {
// continue
} else if (read_message_cat (category_name, category_description)) { } else if (read_message_cat (category_name, category_description)) {
// continue // continue
} else if (read_message_geometry (geometry)) { } else if (read_message_geometry (geometry)) {
@ -282,6 +296,7 @@ void LayoutToNetlistStandardReader::read_message_entry (db::LogEntryData &data)
data.set_severity (severity); data.set_severity (severity);
data.set_message (msg); data.set_message (msg);
data.set_cell_name (cell_name); data.set_cell_name (cell_name);
data.set_net_name (net_name);
data.set_category_description (category_description); data.set_category_description (category_description);
data.set_category_name (category_name); data.set_category_name (category_name);
data.set_geometry (geometry); data.set_geometry (geometry);

View File

@ -164,6 +164,7 @@ private:
db::Point read_point (); db::Point read_point ();
void read_message_entry (db::LogEntryData &data); void read_message_entry (db::LogEntryData &data);
bool read_message_cell (std::string &cell_name); bool read_message_cell (std::string &cell_name);
bool read_message_net (std::string &net_name);
bool read_message_geometry (db::DPolygon &polygon); bool read_message_geometry (db::DPolygon &polygon);
bool read_message_cat (std::string &category_name, std::string &category_description); bool read_message_cat (std::string &category_name, std::string &category_description);
}; };

View File

@ -211,6 +211,10 @@ void std_writer_impl<Keys>::write_log_entry (TokenizedOutput &stream, const LogE
TokenizedOutput (stream, Keys::cell_key, true) << tl::to_word_or_quoted_string (le.cell_name ()); TokenizedOutput (stream, Keys::cell_key, true) << tl::to_word_or_quoted_string (le.cell_name ());
} }
if (! le.net_name ().empty ()) {
TokenizedOutput (stream, Keys::net_key, true) << tl::to_word_or_quoted_string (le.net_name ());
}
if (! le.category_name ().empty ()) { if (! le.category_name ().empty ()) {
TokenizedOutput o (stream, Keys::cat_key, true); TokenizedOutput o (stream, Keys::cat_key, true);
o << tl::to_word_or_quoted_string (le.category_name ()); o << tl::to_word_or_quoted_string (le.category_name ());
@ -708,11 +712,8 @@ void std_writer_impl<Keys>::write (TokenizedOutput &stream, const db::Net &net,
outp.reset (new TokenizedOutput (stream, Keys::net_key)); outp.reset (new TokenizedOutput (stream, Keys::net_key));
*outp << tl::to_string (id); *outp << tl::to_string (id);
if (! net.name ().empty ()) { // NOTE: we always write the expanded name, so we can refer to it in log entries
TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.name ()); TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.expanded_name ());
} else if (net.id () != id) {
TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.expanded_name ());
}
*outp << endl; *outp << endl;
@ -740,11 +741,10 @@ void std_writer_impl<Keys>::write (TokenizedOutput &stream, const db::Net &net,
if (! outp) { if (! outp) {
outp.reset (new TokenizedOutput (stream, Keys::net_key)); outp.reset (new TokenizedOutput (stream, Keys::net_key));
*outp << tl::to_string (id);
if (! net.name ().empty ()) { *outp << tl::to_string (id);
TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.name ()); // NOTE: we always write the expanded name, so we can refer to it in log entries
} TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.expanded_name ());
if (net.begin_properties () != net.end_properties ()) { if (net.begin_properties () != net.end_properties ()) {
*outp << endl; *outp << endl;

View File

@ -81,19 +81,25 @@ static LogEntryStringRepository s_strings;
// LogEntryData implementation // LogEntryData implementation
LogEntryData::LogEntryData () LogEntryData::LogEntryData ()
: m_severity (NoSeverity), m_cell_name (0), m_message (0), m_category_name (0), m_category_description (0) : m_severity (NoSeverity), m_cell_name (0), m_net_name (0), m_message (0), m_category_name (0), m_category_description (0)
{ {
// .. nothing yet .. // .. nothing yet ..
} }
LogEntryData::LogEntryData (Severity s, const std::string &msg) LogEntryData::LogEntryData (Severity s, const std::string &msg)
: m_severity (s), m_cell_name (0), m_message (s_strings.id_for_string (msg)), m_category_name (0), m_category_description (0) : m_severity (s), m_cell_name (0), m_net_name (0), m_message (s_strings.id_for_string (msg)), m_category_name (0), m_category_description (0)
{ {
// .. nothing yet .. // .. nothing yet ..
} }
LogEntryData::LogEntryData (Severity s, const std::string &cell_name, const std::string &msg) LogEntryData::LogEntryData (Severity s, const std::string &cell_name, const std::string &msg)
: m_severity (s), m_cell_name (s_strings.id_for_string (cell_name)), m_message (s_strings.id_for_string (msg)), m_category_name (0), m_category_description (0) : m_severity (s), m_cell_name (s_strings.id_for_string (cell_name)), m_net_name (0), m_message (s_strings.id_for_string (msg)), m_category_name (0), m_category_description (0)
{
// .. nothing yet ..
}
LogEntryData::LogEntryData (Severity s, const std::string &cell_name, const std::string &net_name, const std::string &msg)
: m_severity (s), m_cell_name (s_strings.id_for_string (cell_name)), m_net_name (s_strings.id_for_string (net_name)), m_message (s_strings.id_for_string (msg)), m_category_name (0), m_category_description (0)
{ {
// .. nothing yet .. // .. nothing yet ..
} }
@ -104,6 +110,7 @@ LogEntryData::operator== (const LogEntryData &other) const
return m_severity == other.m_severity && return m_severity == other.m_severity &&
m_message == other.m_message && m_message == other.m_message &&
m_cell_name == other.m_cell_name && m_cell_name == other.m_cell_name &&
m_net_name == other.m_net_name &&
m_geometry == other.m_geometry && m_geometry == other.m_geometry &&
m_category_name == other.m_category_name && m_category_name == other.m_category_name &&
m_category_description == other.m_category_description; m_category_description == other.m_category_description;
@ -157,6 +164,18 @@ LogEntryData::set_cell_name (const std::string &n)
m_cell_name = s_strings.id_for_string (n); m_cell_name = s_strings.id_for_string (n);
} }
const std::string &
LogEntryData::net_name () const
{
return s_strings.string_for_id (m_net_name);
}
void
LogEntryData::set_net_name (const std::string &n)
{
m_net_name = s_strings.id_for_string (n);
}
std::string std::string
LogEntryData::to_string (bool with_geometry) const LogEntryData::to_string (bool with_geometry) const
{ {
@ -179,10 +198,24 @@ LogEntryData::to_string (bool with_geometry) const
} }
} }
if (m_cell_name != 0) { if (m_net_name != 0) {
res += tl::to_string (tr ("In cell ")); if (m_cell_name != 0) {
res += cell_name (); res += tl::to_string (tr ("In net "));
res += ": "; res += net_name ();
res += tl::to_string (tr (" in circuit "));
res += cell_name ();
res += ": ";
} else {
res += tl::to_string (tr ("In net "));
res += net_name ();
res += ": ";
}
} else {
if (m_cell_name != 0) {
res += tl::to_string (tr ("In cell "));
res += cell_name ();
res += ": ";
}
} }
res += msg; res += msg;

View File

@ -68,6 +68,11 @@ public:
*/ */
LogEntryData (Severity s, const std::string &cell_name, const std::string &msg); LogEntryData (Severity s, const std::string &cell_name, const std::string &msg);
/**
* @brief Creates an error with the severity, a cell (circuit) name, a net name and a message
*/
LogEntryData (Severity s, const std::string &cell_name, const std::string &net_name, const std::string &msg);
/** /**
* @brief Equality * @brief Equality
*/ */
@ -158,6 +163,16 @@ public:
*/ */
void set_cell_name (const std::string &n); void set_cell_name (const std::string &n);
/**
* @brief Gets the net name the error occurred in
*/
const std::string &net_name () const;
/**
* @brief Sets the net name
*/
void set_net_name (const std::string &n);
/** /**
* @brief Formats this message for printing * @brief Formats this message for printing
*/ */
@ -166,6 +181,7 @@ public:
private: private:
Severity m_severity; Severity m_severity;
string_id_type m_cell_name; string_id_type m_cell_name;
string_id_type m_net_name;
string_id_type m_message; string_id_type m_message;
db::DPolygon m_geometry; db::DPolygon m_geometry;
string_id_type m_category_name, m_category_description; string_id_type m_category_name, m_category_description;

View File

@ -385,10 +385,129 @@ public:
virtual void execute (const tl::ExpressionParserContext &context, tl::Variant & /*out*/, const std::vector<tl::Variant> &args, const std::map<std::string, tl::Variant> * /*kwargs*/) const virtual void execute (const tl::ExpressionParserContext &context, tl::Variant & /*out*/, const std::vector<tl::Variant> &args, const std::map<std::string, tl::Variant> * /*kwargs*/) const
{ {
if (args.size () != 1) { bool flag = true;
throw tl::EvalError (tl::to_string (tr ("'skip' function takes one argument (flag)")), context); if (args.size () > 1) {
throw tl::EvalError (tl::to_string (tr ("'skip' function takes one optional argument (flag)")), context);
} else if (args.size () == 1) {
flag = args [0].to_bool ();
} }
mp_eval->skip_func (args [0].to_bool ());
std::vector<unsigned int> layers;
if (! flag && ! mp_eval->layer_indexes ().empty ()) {
layers.push_back (0);
}
mp_eval->copy_func (layers, true, std::numeric_limits<size_t>::max ());
}
private:
MeasureNetEval *mp_eval;
};
/**
* @brief A function to specify the copy behaviour
*
* With the copy behavior, the polygons emitted by the "evaluate_nets" method
* are specified. The function accepts up to one positional argument and
* three optional keyword arguments (limit, layers and merged).
* Together with "skip", it maps to the following behavior:
*
* skip() -> copy(layers=[])
* skip(true) -> copy(layers=[])
* skip(false) -> copy(layers=[primary], merged=true, limit=unlimited)
* copy() -> copy(layers=[all], merged=true, limit=unlimited)
* copy(false) -> copy(layers=[])
* copy(true) -> copy(layers=[all], merged=true, limit=unlimited)
* copy(true, merged=m) -> copy(layers=[all], merged=m, limit=unlimited)
* copy(layers=l) -> copy(layers=[l], merged=true, limit=unlimited) (l is a layer symbol)
* copy(layers=[l]) -> copy(layers=[l], merged=true, limit=unlimited) ([l] is an array of layer symbols)
* copy(layers=.., merged=m) -> copy(layers=.., merged=m, limit=unlimited)
* copy(layers=.., merged=.., limit=n) -> copy(layers=.., merged=.., limit=n)
*
* The primary layer is "0", so "skip(false)" is identical to "copy(layer=0)"
*/
class NetCopyFunction
: public tl::EvalFunction
{
public:
NetCopyFunction (MeasureNetEval *eval)
: mp_eval (eval)
{
// .. nothing yet ..
}
virtual bool supports_keyword_parameters () const { return true; }
virtual void execute (const tl::ExpressionParserContext &context, tl::Variant & /*out*/, const std::vector<tl::Variant> &args, const std::map<std::string, tl::Variant> *kwargs) const
{
bool flag = true;
size_t limit = std::numeric_limits<size_t>::max ();
std::vector<unsigned int> layers;
bool merged = true;
if (args.size () > 1) {
throw tl::EvalError (tl::to_string (tr ("'copy' function takes one optional argument (flag) and the following keyword arguments: 'limit', 'layers', 'layer' or 'merged'")), context);
} else if (args.size () == 1) {
flag = args [0].to_bool ();
}
// default for "layers" is 'all'
for (unsigned int i = 0; i < (unsigned int) mp_eval->layer_indexes ().size (); ++i) {
layers.push_back (i);
}
if (kwargs) {
for (auto k = kwargs->begin (); k != kwargs->end (); ++k) {
if (k->first == "limit") {
limit = k->second.to<size_t> ();
} else if (k->first == "merged") {
merged = k->second.to_bool ();
} else if (k->first == "layers") {
const tl::Variant &v = k->second;
if (! v.is_list ()) {
throw tl::EvalError (tl::to_string (tr ("'copy' function's 'layers' keyword argument expects an array of layer symbols")), context);
}
layers.clear ();
for (auto l = v.begin (); l != v.end (); ++l) {
layers.push_back (l->to_uint ());
}
} else if (k->first == "layer") {
layers.clear ();
layers.push_back (k->second.to_uint ());
} else {
throw tl::EvalError (tl::to_string (tr ("'copy' function takes one optional argument (flag) and the following keyword arguments: 'limit', 'layers', 'layer' or 'merged'")), context);
}
}
}
if (! flag) {
// clear layers to indicate we don't want to copy
layers.clear ();
}
mp_eval->copy_func (layers, merged, limit);
}
private:
MeasureNetEval *mp_eval;
};
class NetDbFunction
: public tl::EvalFunction
{
public:
NetDbFunction (MeasureNetEval *eval)
: mp_eval (eval)
{
// .. nothing yet ..
}
virtual void execute (const tl::ExpressionParserContext &context, tl::Variant &out, const std::vector<tl::Variant> &args, const std::map<std::string, tl::Variant> * /*kwargs*/) const
{
if (args.size () != 0) {
throw tl::EvalError (tl::to_string (tr ("'db' function does not take any argument")), context);
}
out = mp_eval->db_func ();
} }
private: private:
@ -461,10 +580,11 @@ private:
MeasureNetEval *mp_eval; MeasureNetEval *mp_eval;
}; };
MeasureNetEval::MeasureNetEval (const db::LayoutToNetlist *l2n, double dbu) MeasureNetEval::MeasureNetEval (LayoutToNetlist *l2n, double dbu)
: tl::Eval (), mp_l2n (l2n), m_dbu (dbu) : tl::Eval (), mp_l2n (l2n), m_dbu (dbu)
{ {
// .. nothing yet .. m_copy_merge = false;
m_copy_max_polygons = std::numeric_limits<size_t>::max ();
} }
void void
@ -486,15 +606,24 @@ MeasureNetEval::init ()
{ {
define_function ("put", new NetPutFunction (this)); define_function ("put", new NetPutFunction (this));
define_function ("skip", new NetSkipFunction (this)); define_function ("skip", new NetSkipFunction (this));
define_function ("copy", new NetCopyFunction (this));
define_function ("area", new NetAreaFunction (this)); define_function ("area", new NetAreaFunction (this));
define_function ("perimeter", new NetPerimeterFunction (this)); define_function ("perimeter", new NetPerimeterFunction (this));
define_function ("net", new NetFunction (this)); define_function ("net", new NetFunction (this));
define_function ("db", new NetDbFunction (this));
} }
void void
MeasureNetEval::reset (db::cell_index_type cell_index, size_t cluster_id) const MeasureNetEval::reset (db::cell_index_type cell_index, size_t cluster_id) const
{ {
m_skip = false; // default action: copy primary layer, merged, no limit
m_copy_layers.clear ();
if (! m_layers.empty ()) {
m_copy_layers.push_back (m_layers.front ());
}
m_copy_merge = true;
m_copy_max_polygons = std::numeric_limits<size_t>::max ();
m_cell_index = cell_index; m_cell_index = cell_index;
m_cluster_id = cluster_id; m_cluster_id = cluster_id;
m_area_and_perimeter_cache.clear (); m_area_and_perimeter_cache.clear ();
@ -553,9 +682,18 @@ MeasureNetEval::perimeter_func (int layer_index) const
} }
void void
MeasureNetEval::skip_func (bool f) const MeasureNetEval::copy_func (const std::vector<unsigned int> &layer_indexes, bool merge, size_t max_polygons) const
{ {
m_skip = f; m_copy_layers.clear ();
m_copy_layers.reserve (layer_indexes.size ());
for (auto l = layer_indexes.begin (); l != layer_indexes.end (); ++l) {
if (size_t (*l) < m_layers.size ()) {
m_copy_layers.push_back (m_layers [*l]);
}
}
m_copy_merge = merge;
m_copy_max_polygons = max_polygons;
} }
tl::Variant tl::Variant
@ -586,4 +724,10 @@ MeasureNetEval::net_func () const
} }
} }
tl::Variant
MeasureNetEval::db_func () const
{
return tl::Variant::make_variant_ref (mp_l2n);
}
} }

View File

@ -122,7 +122,7 @@ class DB_PUBLIC MeasureNetEval
: public tl::Eval : public tl::Eval
{ {
public: public:
MeasureNetEval (const db::LayoutToNetlist *l2n, double dbu); MeasureNetEval (db::LayoutToNetlist *l2n, double dbu);
void set_primary_layer (unsigned int layer_index); void set_primary_layer (unsigned int layer_index);
void set_secondary_layer (const std::string &name, unsigned int layer_index); void set_secondary_layer (const std::string &name, unsigned int layer_index);
@ -130,10 +130,9 @@ public:
void reset (db::cell_index_type cell_index, size_t cluster_id) const; void reset (db::cell_index_type cell_index, size_t cluster_id) const;
bool skip () const const std::vector<unsigned int> copy_layers () const { return m_copy_layers; }
{ size_t copy_max_polygons () const { return m_copy_max_polygons; }
return m_skip; bool copy_merge () const { return m_copy_merge; }
}
db::PropertiesSet &prop_set_out () const db::PropertiesSet &prop_set_out () const
{ {
@ -145,7 +144,9 @@ private:
friend class NetAreaFunction; friend class NetAreaFunction;
friend class NetPerimeterFunction; friend class NetPerimeterFunction;
friend class NetFunction; friend class NetFunction;
friend class NetDbFunction;
friend class NetSkipFunction; friend class NetSkipFunction;
friend class NetCopyFunction;
struct AreaAndPerimeter struct AreaAndPerimeter
{ {
@ -153,10 +154,12 @@ private:
double area, perimeter; double area, perimeter;
}; };
const db::LayoutToNetlist *mp_l2n; db::LayoutToNetlist *mp_l2n;
double m_dbu; double m_dbu;
std::vector<unsigned int> m_layers; std::vector<unsigned int> m_layers;
mutable bool m_skip; mutable std::vector<unsigned int> m_copy_layers;
mutable bool m_copy_merge;
mutable size_t m_copy_max_polygons;
mutable db::PropertiesSet m_prop_set_out; mutable db::PropertiesSet m_prop_set_out;
mutable db::cell_index_type m_cell_index; mutable db::cell_index_type m_cell_index;
mutable size_t m_cluster_id; mutable size_t m_cluster_id;
@ -164,12 +167,14 @@ private:
mutable std::unique_ptr<std::map<std::pair<db::cell_index_type, size_t>, const db::Net *> > m_nets_per_cell_and_cluster_id; mutable std::unique_ptr<std::map<std::pair<db::cell_index_type, size_t>, const db::Net *> > m_nets_per_cell_and_cluster_id;
AreaAndPerimeter compute_area_and_perimeter (int layer_index) const; AreaAndPerimeter compute_area_and_perimeter (int layer_index) const;
const std::vector<unsigned int> &layer_indexes () const { return m_layers; }
void put_func (const tl::Variant &name, const tl::Variant &value) const; void put_func (const tl::Variant &name, const tl::Variant &value) const;
tl::Variant area_func (int layer_index) const; tl::Variant area_func (int layer_index) const;
tl::Variant perimeter_func (int layer_index) const; tl::Variant perimeter_func (int layer_index) const;
void skip_func (bool f) const; void copy_func (const std::vector<unsigned int> &layer_indexes, bool merge, size_t max_polygons) const;
tl::Variant net_func () const; tl::Variant net_func () const;
tl::Variant db_func () const;
}; };
} }

View File

@ -814,7 +814,7 @@ smooth_contour (db::Polygon::polygon_contour_iterator from, db::Polygon::polygon
if (keep_hv && (p1.x () == p0.x () || p1.y () == p0.y () || p2.x () == p1.x () || p2.y () == p1.y ())) { if (keep_hv && (p1.x () == p0.x () || p1.y () == p0.y () || p2.x () == p1.x () || p2.y () == p1.y ())) {
// keep points which participate in either a vertical or horizontal edge // keep points which participate in either a vertical or horizontal edge
} else if (db::Coord (p1.distance(p0)) <= d && db::sprod_sign (p2 - p1, p0 - pm1) > 0 && std::abs (db::vprod (p2 - p1, p0 - pm1)) < 0.8 * p2.distance (p1) * p0.distance (pm1)) { } else if (p1.double_distance (p0) <= d * (1.0 + db::epsilon) && db::sprod_sign (p2 - p1, p0 - pm1) > 0 && std::abs (db::vprod (p2 - p1, p0 - pm1)) < 0.8 * p2.distance (p1) * p0.distance (pm1)) {
// jog configurations with small edges are candidates // jog configurations with small edges are candidates
can_drop = true; can_drop = true;
} else if (db::vprod_sign (p2 - p1, p1 - p0) < 0) { } else if (db::vprod_sign (p2 - p1, p1 - p0) < 0) {
@ -826,7 +826,7 @@ smooth_contour (db::Polygon::polygon_contour_iterator from, db::Polygon::polygon
} }
for (size_t j = pi0; can_drop; ) { for (size_t j = pi0; can_drop; ) {
if (std::abs (db::Edge (p0, p2).distance (org_points [j])) > d) { if (std::abs (db::DEdge (db::DPoint (p0), db::DPoint (p2)).distance (db::DPoint (org_points [j]))) > d * (1.0 + db::epsilon)) {
can_drop = false; can_drop = false;
} }
if (j == pi2) { if (j == pi2) {

View File

@ -1232,11 +1232,13 @@ Class<db::LayoutToNetlist> decl_dbLayoutToNetlist ("db", "LayoutToNetlist",
"arbitrary values without having to encode them into the expression string.\n" "arbitrary values without having to encode them into the expression string.\n"
"\n" "\n"
"It will look at nets connecting to shapes on the primary layer and execute the expression for each\n" "It will look at nets connecting to shapes on the primary layer and execute the expression for each\n"
"of those nets. After that it will copy the primary shapes of the net to the output with the properties\n" "of those nets. After that it will copy the merged primary shapes of the net to the output with the properties\n"
"placed by 'put' attached to them.\n" "placed by 'put' attached to them.\n"
"\n" "\n"
"It is possible to skip primary shapes of a specific net by calling the 'skip' function with a 'true'\n" "It is possible to skip primary shapes of a specific net by calling the 'skip' function with a 'true'\n"
"value.\n" "value. It is also possible to configure the output in more detail, i.e. to copy other or all layers, to\n"
"replace the output by the net's bounding box above a certain complexity, or to select merged polygons or "
"unmerged ones, by using 'copy' instead of 'skip'. See below for more details.\n"
"\n" "\n"
"The expression may use the following functions:\n" "The expression may use the following functions:\n"
"\n" "\n"
@ -1246,12 +1248,54 @@ Class<db::LayoutToNetlist> decl_dbLayoutToNetlist ("db", "LayoutToNetlist",
"@li 'perimeter': the perimeter of the primary-layer shapes on the net in um @/li\n" "@li 'perimeter': the perimeter of the primary-layer shapes on the net in um @/li\n"
"@li 'perimeter(name)': the perimeter of the secondary-layer shapes. 'name' is a symbol with the name given in the secondary-layer map @/li\n" "@li 'perimeter(name)': the perimeter of the secondary-layer shapes. 'name' is a symbol with the name given in the secondary-layer map @/li\n"
"@li 'put(name, value)': places the value as property 'name' on the output shapes @/li\n" "@li 'put(name, value)': places the value as property 'name' on the output shapes @/li\n"
"@li 'skip(flag)': will skip the primary shapes of that net when called with a true value @/li\n" "@li 'skip' or 'skip(flag)': will skip the primary shapes of that net when called with a true value or without one. See also 'copy'. @/li\n"
"@li 'copy(...)': see below for details @/li\n"
"@li 'net': the \\Net object of the current net @/li\n" "@li 'net': the \\Net object of the current net @/li\n"
"@li 'db': the \\LayoutToDatabase object the netlist lives in @/li\n"
"@/ul\n" "@/ul\n"
"\n" "\n"
"If given, the 'dbu' argument gives the database unit to use for converting shape dimensions into micrometer units. " "If given, the 'dbu' argument gives the database unit to use for converting shape dimensions into micrometer units. "
"If this value is 0, the area and perimeters are calculated in database units. If no DBU is specified, the value is determined automatically." "If this value is 0, the area and perimeters are calculated in database units. If no DBU is specified, the value is determined automatically."
"\n"
"'copy' and 'skip' control the polygon output. Here are the options:\n"
"\n"
"@ul\n"
"@li 'skip' or 'skip(true)': skip output, identical to 'copy(layers=[])' @/li\n"
"@li 'skip(false)': copy the shapes from the primary layer, identical to 'copy(layer=0)' @/li\n"
"@li 'copy' or 'copy(true)': copy all shapes from the net, merged into a single polygon.\n"
" Note: this is not equivalent to 'skip(false)', as in the latter case, only the primary layer's\n"
" shapes are copied @/li\n"
"@li 'copy(false)': equivalent to 'skip(true)' @/li\n"
"@li 'copy(merged=false)': copies all shapes from all layers of the net, without merging.\n"
" 'merged' is a keyword argument that can be combined with other arguments. @/li\n"
"@li 'copy(limit=number)': if the net has less than 'number' polygons on the selected layers, \n"
" copy them to the output. For more polygons, emit the bounding box of the net for the \n"
" given layers.\n"
" 'limit' is a keyword argument that can be combined with other arguments. @/li\n"
"@li 'copy(layer=symbol)': copies all shapes from the layer denoted by the symbol.\n"
" The primary layer has value zero (0), so 'copy(layer=0)' copies the shapes from the primary layer.\n"
" 'layer' is a keyword argument that can be combined with other arguments, except 'layers'. @/li\n"
"@li 'copy(layers=[symbol, symbol, ...])': copies all shapes from the layers denoted by the symbols.\n"
" 'layers' is a keyword argument that can be combined with other arguments, except 'layer'. @/li\n"
"@/ul\n"
"\n"
"When mixing 'skip' and 'copy', the last active specification controls the output. The following\n"
"expressions are equivalent:\n"
"\n"
"@code\n"
"copy(net.name == 'VDD')\n"
"@/code\n"
"\n"
"and\n"
"\n"
"@code\n"
"skip ; net.name == 'VDD' && copy\n"
"@/code\n"
"\n"
"where the second expression establishes 'skip' as the default and conditionally executes 'copy',\n"
"overriding 'skip'.\n"
"\n"
"The 'copy' and 'db' functions were added and the 'skip' argument was made optional in version 0.30.6."
) + ) +
// test API // test API
gsi::method ("make_soft_connection_diodes=", &db::LayoutToNetlist::set_make_soft_connection_diodes, gsi::arg ("flag"), "@hide") + gsi::method ("make_soft_connection_diodes=", &db::LayoutToNetlist::set_make_soft_connection_diodes, gsi::arg ("flag"), "@hide") +

View File

@ -23,11 +23,53 @@
#include "gsiDecl.h" #include "gsiDecl.h"
#include "gsiEnums.h" #include "gsiEnums.h"
#include "dbLog.h" #include "dbLog.h"
#include "dbNet.h"
#include "dbCircuit.h"
namespace gsi namespace gsi
{ {
db::LogEntryData *new_le1 (db::Severity severity, const std::string &msg)
{
return new db::LogEntryData (severity, msg);
}
db::LogEntryData *new_le2 (db::Severity severity, const std::string &cell_name, const std::string &msg)
{
return new db::LogEntryData (severity, cell_name, msg);
}
db::LogEntryData *new_le3 (db::Severity severity, const std::string &cell_name, const std::string &net_name, const std::string &msg)
{
return new db::LogEntryData (severity, cell_name, net_name, msg);
}
db::LogEntryData *new_le4 (db::Severity severity, const db::Net *net, const std::string &msg)
{
if (! net || ! net->circuit ()) {
return new db::LogEntryData (severity, msg);
} else {
return new db::LogEntryData (severity, net->circuit ()->name (), net->expanded_name (), msg);
}
}
Class<db::LogEntryData> decl_dbNetlistDeviceExtractorError ("db", "LogEntryData", Class<db::LogEntryData> decl_dbNetlistDeviceExtractorError ("db", "LogEntryData",
gsi::constructor ("new", &new_le1, gsi::arg ("severity"), gsi::arg ("msg"),
"@brief Creates a new LogEntry object with the given severity and message\n"
"This convenience constructor has been added in version 0.30.6\n"
) +
gsi::constructor ("new", &new_le2, gsi::arg ("severity"), gsi::arg ("cell_name"), gsi::arg ("msg"),
"@brief Creates a new LogEntry object with the given severity, cell or circuit name and message\n"
"This convenience constructor has been added in version 0.30.6\n"
) +
gsi::constructor ("new", &new_le3, gsi::arg ("severity"), gsi::arg ("cell_name"), gsi::arg ("new_name"), gsi::arg ("msg"),
"@brief Creates a new LogEntry object with the given severity, cell or circuit name, net name and message\n"
"This convenience constructor has been added in version 0.30.6\n"
) +
gsi::constructor ("new", &new_le4, gsi::arg ("severity"), gsi::arg ("net"), gsi::arg ("msg"),
"@brief Creates a new LogEntry object with the given severity and message and circuit and net name taken from the given \\Net object\n"
"This convenience constructor has been added in version 0.30.6\n"
) +
gsi::method ("severity", &db::LogEntryData::severity, gsi::method ("severity", &db::LogEntryData::severity,
"@brief Gets the severity attribute.\n" "@brief Gets the severity attribute.\n"
) + ) +
@ -51,6 +93,21 @@ Class<db::LogEntryData> decl_dbNetlistDeviceExtractorError ("db", "LogEntryData"
"warning generated during device extraction, the cell name is " "warning generated during device extraction, the cell name is "
"the circuit the device should have appeared in." "the circuit the device should have appeared in."
) + ) +
gsi::method ("net_name", &db::LogEntryData::net_name,
"@brief Gets the net name.\n"
"See \\net_name= for details about this attribute."
"\n"
"The net_name attribute has been introduced in version 0.30.6.\n"
) +
gsi::method ("net_name=", &db::LogEntryData::set_net_name, gsi::arg ("net_name"),
"@brief Sets the net name.\n"
"The net (or circuit) name specifies the net the "
"log entry is related to.\n"
"\n"
"By convention, the net name is the expanded net name (see \\Net#expanded_name).\n"
"\n"
"The net_name attribute has been introduced in version 0.30.6.\n"
) +
gsi::method ("geometry", &db::LogEntryData::geometry, gsi::method ("geometry", &db::LogEntryData::geometry,
"@brief Gets the geometry.\n" "@brief Gets the geometry.\n"
"See \\geometry= for more details." "See \\geometry= for more details."

View File

@ -3388,7 +3388,112 @@ TEST(14_JoinNets)
db::compare_layouts (_this, ly, au); db::compare_layouts (_this, ly, au);
} }
TEST(15_MeasureNet) TEST(15_JoinNetsAfterExtraction)
{
db::Layout ly;
TestRig test_rig (ly);
{
db::LoadLayoutOptions options;
options.get_options<db::CommonReaderOptions> ().layer_map = test_rig.lmap ();
options.get_options<db::CommonReaderOptions> ().create_other_layers = false;
std::string fn (tl::testdata ());
fn = tl::combine_path (fn, "algo");
fn = tl::combine_path (fn, "device_extract_l15.gds");
tl::InputStream stream (fn);
db::Reader reader (stream);
reader.read (ly, options);
}
std::unique_ptr<db::LayoutToNetlist> l2n (test_rig.make_l2n ());
l2n->extract_netlist ();
db::Netlist *nl = l2n->netlist ();
EXPECT_EQ (nl->to_string (),
"circuit TOP ();\n"
" subcircuit A $1 (NET1=A,NET2=B);\n"
"end;\n"
"circuit A (NET1=NET1,NET2=NET2);\n"
"end;\n"
);
db::Circuit *top_circuit = nl->circuit_by_name ("TOP");
db::Circuit *a_circuit = nl->circuit_by_name ("A");
auto &top_cc = l2n->net_clusters ().clusters_per_cell (top_circuit->cell_index ());
auto &a_cc = l2n->net_clusters ().clusters_per_cell (a_circuit->cell_index ());
db::Net *a_net1 = a_circuit->net_by_name ("NET1");
db::Net *a_net2 = a_circuit->net_by_name ("NET2");
db::Net *a_net3 = a_circuit->net_by_name ("NET3");
tl_assert (a_net1 != 0);
tl_assert (a_net2 != 0);
tl_assert (a_net3 != 0);
db::Net *top_neta = top_circuit->net_by_name ("A");
db::Net *top_netb = top_circuit->net_by_name ("B");
tl_assert (top_neta != 0);
tl_assert (top_netb != 0);
auto cid1 = a_net1->cluster_id ();
auto cid2 = a_net2->cluster_id ();
auto cid3 = a_net3->cluster_id ();
EXPECT_EQ (a_cc.is_root (cid1), false);
EXPECT_EQ (a_cc.is_root (cid2), false);
EXPECT_EQ (a_cc.is_root (cid3), true);
// Join local NET3 and NET2 which has upward connections
a_circuit->join_nets (a_net3, a_net2);
EXPECT_EQ (nl->to_string (),
"circuit TOP ();\n"
" subcircuit A $1 (NET1=A,NET2=B);\n"
"end;\n"
"circuit A (NET1=NET1,NET2='NET2,NET3');\n"
"end;\n"
);
EXPECT_EQ (a_cc.is_root (cid3), false);
// B net from top circuit has connections to NET2 which must have changed to NET3
const auto &b_conn = top_cc.connections_for_cluster (top_netb->cluster_id ());
tl_assert (b_conn.size () == size_t (1));
EXPECT_EQ (b_conn.front ().inst_trans ().to_string (), "r0 *1 -8000,3000");
EXPECT_EQ (b_conn.front ().inst_cell_index (), a_circuit->cell_index ());
EXPECT_EQ (b_conn.front ().id (), a_net3->cluster_id ());
EXPECT_EQ (top_cc.find_cluster_with_connection (b_conn.front ()), top_netb->cluster_id ());
// Now join NET1 and NET3 in circuit A which effectively shortens A and B in TOP
a_circuit->join_nets (a_net3, a_net1);
EXPECT_EQ (nl->to_string (),
"circuit TOP ();\n"
" subcircuit A $1 ('NET1,NET2'='A,B');\n"
"end;\n"
"circuit A ('NET1,NET2'='NET1,NET2,NET3');\n"
"end;\n"
);
const db::Net *top_netab = top_circuit->net_by_name ("A,B");
tl_assert (top_netab != 0);
const auto &ab_conn = top_cc.connections_for_cluster (top_netab->cluster_id ());
tl_assert (ab_conn.size () == size_t (1));
EXPECT_EQ (ab_conn.front ().inst_trans ().to_string (), "r0 *1 -8000,3000");
EXPECT_EQ (ab_conn.front ().inst_cell_index (), a_circuit->cell_index ());
EXPECT_EQ (ab_conn.front ().id (), a_net3->cluster_id ());
EXPECT_EQ (top_cc.find_cluster_with_connection (ab_conn.front ()), top_netab->cluster_id ());
}
TEST(20_MeasureNet)
{ {
db::Layout ly; db::Layout ly;
db::LayerMap lmap; db::LayerMap lmap;
@ -3463,6 +3568,21 @@ TEST(15_MeasureNet)
unsigned int l102 = ly.get_layer (db::LayerProperties (102, 0)); unsigned int l102 = ly.get_layer (db::LayerProperties (102, 0));
l3_net_func.insert_into (&ly, tc.cell_index (), l102); l3_net_func.insert_into (&ly, tc.cell_index (), l102);
db::Region l4_net_func = l2n.measure_net (*rl1, secondary, "copy(merged=false, layers=[l2,l3,l4,l5])", std::map<std::string, tl::Variant> ());
unsigned int l103 = ly.get_layer (db::LayerProperties (103, 0));
l4_net_func.insert_into (&ly, tc.cell_index (), l103);
db::Region l5_net_func = l2n.measure_net (*rl1, secondary, "copy(net.name=='NET2', layer=l5)", std::map<std::string, tl::Variant> ());
unsigned int l104 = ly.get_layer (db::LayerProperties (104, 0));
l5_net_func.insert_into (&ly, tc.cell_index (), l104);
db::Region l6_net_func = l2n.measure_net (*rl1, secondary, "copy(net.name=='NET2', limit=0)", std::map<std::string, tl::Variant> ());
unsigned int l105 = ly.get_layer (db::LayerProperties (105, 0));
l6_net_func.insert_into (&ly, tc.cell_index (), l105);
// compare the collected test data // compare the collected test data
std::string au = tl::testdata (); std::string au = tl::testdata ();
@ -3472,3 +3592,4 @@ TEST(15_MeasureNet)
db::compare_layouts (_this, ly, au, db::NoNormalization); db::compare_layouts (_this, ly, au, db::NoNormalization);
} }

View File

@ -1366,6 +1366,65 @@ TEST(106)
EXPECT_EQ (smooth (p, 100, true).to_string (), "(0,0;0,73235;1200,90468;2300,114468;2800,138468;2800,154468;2000,186468;700,210468;0,219701;0,272971;126450,272971;126450,0)"); EXPECT_EQ (smooth (p, 100, true).to_string (), "(0,0;0,73235;1200,90468;2300,114468;2800,138468;2800,154468;2000,186468;700,210468;0,219701;0,272971;126450,272971;126450,0)");
} }
// smoothing, small units
TEST(107)
{
db::Point pattern [] = {
db::Point (1, 1),
db::Point (1, 2),
db::Point (2, 2),
db::Point (2, 4),
db::Point (3, 4),
db::Point (3, 5),
db::Point (4, 5),
db::Point (4, 7),
db::Point (5, 7),
db::Point (5, 8),
db::Point (6, 8),
db::Point (6, 9),
db::Point (7, 9),
db::Point (7, 16),
db::Point (8, 16),
db::Point (8, 17),
db::Point (9, 17),
db::Point (9, 18),
db::Point (10, 18),
db::Point (10, 19),
db::Point (12, 19),
db::Point (12, 20),
db::Point (16, 20),
db::Point (16, 21),
db::Point (17, 21),
db::Point (17, 22),
db::Point (18, 22),
db::Point (18, 23),
db::Point (24, 23),
db::Point (24, 15),
db::Point (23, 15),
db::Point (23, 14),
db::Point (22, 14),
db::Point (22, 12),
db::Point (21, 12),
db::Point (21, 10),
db::Point (20, 10),
db::Point (20, 8),
db::Point (19, 8),
db::Point (19, 6),
db::Point (18, 6),
db::Point (18, 4),
db::Point (17, 4),
db::Point (17, 3),
db::Point (16, 3),
db::Point (16, 1)
};
db::Polygon p;
p.assign_hull (&pattern[0], &pattern[0] + sizeof (pattern) / sizeof (pattern[0]));
EXPECT_EQ (smooth (p, 0, false).to_string (), "(1,1;1,2;2,2;2,4;3,4;3,5;4,5;4,7;5,7;5,8;6,8;6,9;7,9;7,16;8,16;8,17;9,17;9,18;10,18;10,19;12,19;12,20;16,20;16,21;17,21;17,22;18,22;18,23;24,23;24,15;23,15;23,14;22,14;22,12;21,12;21,10;20,10;20,8;19,8;19,6;18,6;18,4;17,4;17,3;16,3;16,1)");
EXPECT_EQ (smooth (p, 1, false).to_string (), "(1,1;2,4;4,5;4,7;7,9;7,16;10,18;18,22;24,23;24,15;22,14;18,4;17,4;16,1)");
}
// rounding // rounding
TEST(200) TEST(200)
{ {

View File

@ -355,8 +355,14 @@ It visits each net and evaluates the given expression on the net.
The expression needs to be written in KLayout expression notations. The expression needs to be written in KLayout expression notations.
</p><p> </p><p>
The default action is to copy the shapes of the primary layer to the The default action is to copy the shapes of the primary layer to the
output. This action can be modified in some ways: skip shapes of output. It is possible to customize the output further: you can
certain nets or attach properties to the shapes during the evaluation. conditionally skip the output or copy all shapes of the net from
all layers the output. You can choose to emit individual polygons
or merge all polygons from a net (all layers or a subset) into
a single polygon. The latter is the default.
</p><p>
You can also choose to emit the bounding box of the net if the number of polygons
on the net exceeds a certain limit.
</p><p> </p><p>
Using the "put" function inside the expression, properties can be Using the "put" function inside the expression, properties can be
attached to the output shapes. The properties can be computed using attached to the output shapes. The properties can be computed using
@ -366,9 +372,6 @@ Also the <class_doc href="Net">Net</class_doc> object representing the net is av
'net' function. This allows implementing a more elaborate 'net' function. This allows implementing a more elaborate
antenna check for example. antenna check for example.
</p><p> </p><p>
Also, the expression can choose to drop shapes and not copy them to
the output by calling the "skip" function with a "true" argument.
</p><p>
Arbitrary values can be passed as variables, which removes the need Arbitrary values can be passed as variables, which removes the need
to encode variable values into the expression. For this, use the to encode variable values into the expression. For this, use the
'variables' argument and pass a hash with names and values. Each of 'variables' argument and pass a hash with names and values. Each of
@ -379,7 +382,8 @@ The following functions are available inside the expressions:
</p><p> </p><p>
<ul> <ul>
<li>"net" - the <class_doc href="Net">Net</class_doc> object of the current net </li> <li>"net" - the <class_doc href="Net">Net</class_doc> object of the current net </li>
<li>"skip(flag)" - if called with a 'true' argument, the primary layer's shapes are not copied for this net </li> <li>"skip" or "skip(flag)" - if called with a 'true' argument (the default), the primary layer's shapes are not copied for this net </li>
<li>"copy(...)" - configures polygon output in a more elaborate way than "skip" (see below) </li>
<li>"put(name, value)" - places the value as a property with name 'name' (this must be a string) on the output shapes </li> <li>"put(name, value)" - places the value as a property with name 'name' (this must be a string) on the output shapes </li>
<li>"area" - the combined area of the primary layer's shapes on the net in square micrometer units </li> <li>"area" - the combined area of the primary layer's shapes on the net in square micrometer units </li>
<li>"area(symbol)" - the combined area of the secondary layer's shapes on the net in square micrometer units </li> <li>"area(symbol)" - the combined area of the secondary layer's shapes on the net in square micrometer units </li>
@ -390,6 +394,46 @@ The following functions are available inside the expressions:
Here, 'symbol' is the name given to the secondary layer in the secondary layer Here, 'symbol' is the name given to the secondary layer in the secondary layer
dictionary. dictionary.
</p><p> </p><p>
"copy" and "skip" control the polygon output. Here are the options:
</p><p>
<ul>
<li>"skip" or "skip(true): skip output, identical to "copy(layers=[])" </li>
<li>"skip(false)": copy the shapes from the primary layer, identical to "copy(layer=0)" </li>
<li>"copy" or "copy(true)": copy all shapes from the net, merged into a single polygon.
Note: this is not equivalent to "skip(false)", as in the latter case, only the primary layer's
shapes are copied </li>
<li>"copy(false)": equivalent to "skip(true)" </li>
<li>"copy(merged=false)": copies all shapes from all layers of the net, without merging.
"merged" is a keyword argument that can be combined with other arguments. </li>
<li>"copy(limit=number)": if the net has less than "number" polygons on the selected layers,
copy them to the output. For more polygons, emit the bounding box of the net for the
given layers.
"limit" is a keyword argument that can be combined with other arguments. </li>
<li>"copy(layer=symbol)": copies all shapes from the layer denoted by the symbol.
The primary layer has value zero (0), so "copy(layer=0)" copies the shapes from the primary layer.
"layer" is a keyword argument that can be combined with other arguments, except "layers". </li>
<li>"copy(layers=[symbol, symbol, ...])": copies all shapes from the layers denoted by the symbols.
"layers" is a keyword argument that can be combined with other arguments, except "layer". </li>
</ul>
</p><p>
When mixing "skip" and "copy", the last active specification controls the output. The following
expressions are equivalent:
</p><p>
<pre>
copy(net.name == "VDD")
</pre>
</p><p>
and
</p><p>
<pre>
skip ; net.name == "VDD" &amp;&amp; copy
</pre>
</p><p>
where the second expression establishes "skip" as the default and conditionally executes "copy",
overriding "skip".
</p><p>
<h4>Antenna check example </h4>
</p><p>
The following example emulates an antenna check. It computes the area ratio of metal vs. gate area and The following example emulates an antenna check. It computes the area ratio of metal vs. gate area and
attaches the value as a property with name 'AR' to the shapes, copied from the 'gate' layer: attaches the value as a property with name 'AR' to the shapes, copied from the 'gate' layer:
</p><p> </p><p>

View File

@ -780,9 +780,15 @@ module DRC
# The expression needs to be written in KLayout expression notations. # The expression needs to be written in KLayout expression notations.
# #
# The default action is to copy the shapes of the primary layer to the # The default action is to copy the shapes of the primary layer to the
# output. This action can be modified in some ways: skip shapes of # output. It is possible to customize the output further: you can
# certain nets or attach properties to the shapes during the evaluation. # conditionally skip the output or copy all shapes of the net from
# # all layers the output. You can choose to emit individual polygons
# or merge all polygons from a net (all layers or a subset) into
# a single polygon. The latter is the default.
#
# You can also choose to emit the bounding box of the net if the number of polygons
# on the net exceeds a certain limit.
#
# Using the "put" function inside the expression, properties can be # Using the "put" function inside the expression, properties can be
# attached to the output shapes. The properties can be computed using # attached to the output shapes. The properties can be computed using
# a number of net attributes - area and perimeter for example. # a number of net attributes - area and perimeter for example.
@ -791,9 +797,6 @@ module DRC
# 'net' function. This allows implementing a more elaborate # 'net' function. This allows implementing a more elaborate
# antenna check for example. # antenna check for example.
# #
# Also, the expression can choose to drop shapes and not copy them to
# the output by calling the "skip" function with a "true" argument.
#
# Arbitrary values can be passed as variables, which removes the need # Arbitrary values can be passed as variables, which removes the need
# to encode variable values into the expression. For this, use the # to encode variable values into the expression. For this, use the
# 'variables' argument and pass a hash with names and values. Each of # 'variables' argument and pass a hash with names and values. Each of
@ -804,7 +807,9 @@ module DRC
# #
# @ul # @ul
# @li "net" - the RBA::Net object of the current net @/li # @li "net" - the RBA::Net object of the current net @/li
# @li "skip(flag)" - if called with a 'true' argument, the primary layer's shapes are not copied for this net @/li # @li "db" - the RBA::LayoutToNetlist object the netlist lives in @/li
# @li "skip" or "skip(flag)" - if called with a 'true' argument (the default), the primary layer's shapes are not copied for this net @/li
# @li "copy(...)" - configures polygon output in a more elaborate way than "skip" (see below) @/li
# @li "put(name, value)" - places the value as a property with name 'name' (this must be a string) on the output shapes @/li # @li "put(name, value)" - places the value as a property with name 'name' (this must be a string) on the output shapes @/li
# @li "area" - the combined area of the primary layer's shapes on the net in square micrometer units @/li # @li "area" - the combined area of the primary layer's shapes on the net in square micrometer units @/li
# @li "area(symbol)" - the combined area of the secondary layer's shapes on the net in square micrometer units @/li # @li "area(symbol)" - the combined area of the secondary layer's shapes on the net in square micrometer units @/li
@ -815,6 +820,46 @@ module DRC
# Here, 'symbol' is the name given to the secondary layer in the secondary layer # Here, 'symbol' is the name given to the secondary layer in the secondary layer
# dictionary. # dictionary.
# #
# "copy" and "skip" control the polygon output. Here are the options:
#
# @ul
# @li "skip" or "skip(true): skip output, identical to "copy(layers=[])" @/li
# @li "skip(false)": copy the shapes from the primary layer, identical to "copy(layer=0)" @/li
# @li "copy" or "copy(true)": copy all shapes from the net, merged into a single polygon.
# Note: this is not equivalent to "skip(false)", as in the latter case, only the primary layer's
# shapes are copied @/li
# @li "copy(false)": equivalent to "skip(true)" @/li
# @li "copy(merged=false)": copies all shapes from all layers of the net, without merging.
# "merged" is a keyword argument that can be combined with other arguments. @/li
# @li "copy(limit=number)": if the net has less than "number" polygons on the selected layers,
# copy them to the output. For more polygons, emit the bounding box of the net for the
# given layers.
# "limit" is a keyword argument that can be combined with other arguments. @/li
# @li "copy(layer=symbol)": copies all shapes from the layer denoted by the symbol.
# The primary layer has value zero (0), so "copy(layer=0)" copies the shapes from the primary layer.
# "layer" is a keyword argument that can be combined with other arguments, except "layers". @/li
# @li "copy(layers=[symbol, symbol, ...])": copies all shapes from the layers denoted by the symbols.
# "layers" is a keyword argument that can be combined with other arguments, except "layer". @/li
# @/ul
#
# When mixing "skip" and "copy", the last active specification controls the output. The following
# expressions are equivalent:
#
# @code
# copy(net.name == "VDD")
# @/code
#
# and
#
# @code
# skip ; net.name == "VDD" && copy
# @/code
#
# where the second expression establishes "skip" as the default and conditionally executes "copy",
# overriding "skip".
#
# @h4 Antenna check example @/h4
#
# The following example emulates an antenna check. It computes the area ratio of metal vs. gate area and # The following example emulates an antenna check. It computes the area ratio of metal vs. gate area and
# attaches the value as a property with name 'AR' to the shapes, copied from the 'gate' layer: # attaches the value as a property with name 'AR' to the shapes, copied from the 'gate' layer:
# #

View File

@ -2076,3 +2076,35 @@ TEST(146d_edges_and_corners)
run_test (_this, "146", true); run_test (_this, "146", true);
} }
TEST(147_MeasureNetsWithL2N)
{
std::string rs = tl::testdata ();
rs += "/drc/drcSimpleTests_147.drc";
std::string input = tl::testdata ();
input += "/drc/drcSimpleTests_147.gds";
std::string au_output = tl::testdata ();
au_output += "/drc/drcSimpleTests_au147.l2n";
std::string output = this->tmp_file ("tmp.l2n");
{
// Set some variables
lym::Macro config;
config.set_text (tl::sprintf (
"$drc_test_source = '%s'\n"
"$drc_test_target = '%s'\n"
, input, output)
);
config.set_interpreter (lym::Macro::Ruby);
EXPECT_EQ (config.run (), 0);
}
lym::Macro drc;
drc.load_from (rs);
EXPECT_EQ (drc.run (), 0);
compare_text_files (output, au_output);
}

View File

@ -157,14 +157,9 @@ TextService::get_text () const
void void
TextService::do_finish_edit () TextService::do_finish_edit ()
{ {
get_edit_layer (); {
db::Transaction transaction (manager (), tl::to_string (tr ("Create text")));
if (manager ()) { cell ().shapes (layer ()).insert (get_text ());
manager ()->transaction (tl::to_string (tr ("Create text")));
}
cell ().shapes (layer ()).insert (get_text ());
if (manager ()) {
manager ()->commit ();
} }
commit_recent (); commit_recent ();

View File

@ -75,6 +75,24 @@ struct test_arg_func<gsi::VariantType>
} }
}; };
template <>
struct test_arg_func<gsi::StringType>
{
void operator () (bool *ret, const tl::Variant &arg, const gsi::ArgType & /*atype*/, bool /*loose*/, bool /*object_substitution*/)
{
*ret = arg.is_a_string ();
}
};
template <>
struct test_arg_func<gsi::ByteArrayType>
{
void operator () (bool *ret, const tl::Variant &arg, const gsi::ArgType & /*atype*/, bool /*loose*/, bool /*object_substitution*/)
{
*ret = arg.is_a_bytearray ();
}
};
template <> template <>
struct test_arg_func<gsi::ObjectType> struct test_arg_func<gsi::ObjectType>
{ {

View File

@ -5608,7 +5608,7 @@ LayoutViewBase::paste ()
db::DBox sel_bbox = selection_bbox (); db::DBox sel_bbox = selection_bbox ();
if (! sel_bbox.empty ()) { if (! sel_bbox.empty ()) {
if (m_paste_display_mode == 1) { if (m_paste_display_mode == 1 || (m_paste_display_mode == 2 && sel_bbox.is_point ())) {
// just make selection visible, i.e. shift window somewhat // just make selection visible, i.e. shift window somewhat
pan_center (sel_bbox.center ()); pan_center (sel_bbox.center ());
} else if (m_paste_display_mode == 2) { } else if (m_paste_display_mode == 2) {

View File

@ -816,15 +816,31 @@ NetlistBrowserPage::log_selection_changed ()
QModelIndexList selection = log_view->selectionModel ()->selectedIndexes (); QModelIndexList selection = log_view->selectionModel ()->selectedIndexes ();
for (QModelIndexList::const_iterator i = selection.begin (); i != selection.end (); ++i) { for (QModelIndexList::const_iterator i = selection.begin (); i != selection.end (); ++i) {
if (i->column () == 0) {
const db::LogEntryData *le = model->log_entry (*i); if (i->column () != 0) {
if (le && le->geometry () != db::DPolygon () && ! le->cell_name ().empty ()) { continue;
const db::Circuit *c = mp_database->netlist ()->circuit_by_name (le->cell_name ()); }
if (c) {
m_markers.push_back (std::make_pair (c, le->geometry ())); const db::LogEntryData *le = model->log_entry (*i);
}
const db::Circuit *c = 0;
if (le && ! le->cell_name ().empty ()) {
c = mp_database->netlist ()->circuit_by_name (le->cell_name ());
}
// highlight geometries
if (c && le->geometry () != db::DPolygon ()) {
m_markers.push_back (std::make_pair (c, le->geometry ()));
}
// highlight nets
if (c && ! le->net_name ().empty ()) {
const db::Net *net = c->net_by_name (le->net_name ());
if (net) {
m_net_markers.push_back (std::make_pair (c, net));
} }
} }
} }
update_highlights (); update_highlights ();
@ -1291,6 +1307,7 @@ NetlistBrowserPage::clear_highlights ()
m_current_path = lay::NetlistObjectsPath (); m_current_path = lay::NetlistObjectsPath ();
m_selected_paths.clear (); m_selected_paths.clear ();
m_markers.clear (); m_markers.clear ();
m_net_markers.clear ();
update_highlights (); update_highlights ();
} }
@ -1350,6 +1367,31 @@ bbox_for_circuit (const db::Layout *layout, const db::Circuit *circuit)
return layout->cell (circuit->cell_index ()).bbox (); return layout->cell (circuit->cell_index ()).bbox ();
} }
static db::Box
bbox_for_net (const db::LayoutToNetlist *db, const db::Circuit *circuit, const db::Net *net)
{
db::Box bbox;
db::cell_index_type cell_index = circuit->cell_index ();
size_t cluster_id = net->cluster_id ();
const db::Connectivity &conn = db->connectivity ();
for (db::Connectivity::all_layer_iterator layer = conn.begin_layers (); layer != conn.end_layers (); ++layer) {
db::Box layer_bbox;
db::recursive_cluster_shape_iterator<db::NetShape> shapes (db->net_clusters (), *layer, cell_index, cluster_id);
while (! shapes.at_end ()) {
layer_bbox += shapes->bbox ().transformed (shapes.trans ());
++shapes;
}
bbox += layer_bbox;
}
return bbox;
}
void void
NetlistBrowserPage::adjust_view () NetlistBrowserPage::adjust_view ()
{ {
@ -1425,22 +1467,7 @@ NetlistBrowserPage::adjust_view ()
} else if (net) { } else if (net) {
db::cell_index_type cell_index = net->circuit ()->cell_index (); ebox += bbox_for_net (mp_database.get (), circuit, net);
size_t cluster_id = net->cluster_id ();
const db::Connectivity &conn = mp_database->connectivity ();
for (db::Connectivity::all_layer_iterator layer = conn.begin_layers (); layer != conn.end_layers (); ++layer) {
db::Box layer_bbox;
db::recursive_cluster_shape_iterator<db::NetShape> shapes (mp_database->net_clusters (), *layer, cell_index, cluster_id);
while (! shapes.at_end ()) {
layer_bbox += shapes->bbox ().transformed (shapes.trans ());
++shapes;
}
ebox += layer_bbox;
}
} else if (circuit) { } else if (circuit) {
ebox += bbox_for_circuit (layout, circuit); ebox += bbox_for_circuit (layout, circuit);
@ -1461,6 +1488,17 @@ NetlistBrowserPage::adjust_view ()
} }
// add net markers boxes
for (auto marker = m_net_markers.begin (); marker != m_net_markers.end (); ++marker) {
std::pair<bool, db::DCplxTrans> tr = trans_for (marker->first, *layout, *cell, m_cell_context_cache, cv.context_dtrans ());
if (tr.first) {
bbox += tr.second * db::CplxTrans (layout->dbu ()) * bbox_for_net (mp_database.get (), marker->first, marker->second);
}
}
if (! bbox.empty ()) { if (! bbox.empty ()) {
std::vector<db::DCplxTrans> tv = mp_view->cv_transform_variants (m_cv_index); std::vector<db::DCplxTrans> tv = mp_view->cv_transform_variants (m_cv_index);
@ -1739,26 +1777,52 @@ NetlistBrowserPage::update_highlights ()
// a map of display properties vs. layer properties // a map of display properties vs. layer properties
// correct DBU differences between the storage layout and the original layout // correct DBU differences between the storage layout and the original layout
for (std::vector<db::DCplxTrans>::iterator t = tv.begin (); t != tv.end (); ++t) { std::vector<db::DCplxTrans> tvt = tv;
for (std::vector<db::DCplxTrans>::iterator t = tvt.begin (); t != tvt.end (); ++t) {
*t = *t * trans * db::DCplxTrans (layout->dbu () / original_layout.dbu ()); *t = *t * trans * db::DCplxTrans (layout->dbu () / original_layout.dbu ());
} }
if (path->net.first) { if (path->net.first) {
if (produce_highlights_for_net (path->net.first, n_markers, display_by_lp, tv)) { if (produce_highlights_for_net (path->net.first, n_markers, display_by_lp, tvt)) {
not_all_shapes_are_shown = true; not_all_shapes_are_shown = true;
} }
} else if (path->device.first) { } else if (path->device.first) {
if (produce_highlights_for_device (path->device.first, n_markers, tv)) { if (produce_highlights_for_device (path->device.first, n_markers, tvt)) {
not_all_shapes_are_shown = true; not_all_shapes_are_shown = true;
} }
} else if (circuit) { } else if (circuit) {
if (produce_highlights_for_circuit (circuit, n_markers, tv)) { if (produce_highlights_for_circuit (circuit, n_markers, tvt)) {
not_all_shapes_are_shown = true; not_all_shapes_are_shown = true;
} }
} }
} }
for (auto marker = m_net_markers.begin (); marker != m_net_markers.end (); ++marker) {
// computes the transformation supplied by the path
std::pair<bool, db::DCplxTrans> tr = trans_for (marker->first, *layout, *cell, m_cell_context_cache, cv.context_dtrans ());
if (! tr.first) {
continue;
}
db::DCplxTrans trans = tr.second;
// a map of display properties vs. layer properties
// correct DBU differences between the storage layout and the original layout
std::vector<db::DCplxTrans> tvt = tv;
for (std::vector<db::DCplxTrans>::iterator t = tvt.begin (); t != tvt.end (); ++t) {
*t = *t * trans * db::DCplxTrans (layout->dbu () / original_layout.dbu ());
}
if (produce_highlights_for_net (marker->second, n_markers, display_by_lp, tvt)) {
not_all_shapes_are_shown = true;
}
}
for (auto marker = m_markers.begin (); marker != m_markers.end (); ++marker) { for (auto marker = m_markers.begin (); marker != m_markers.end (); ++marker) {
// computes the transformation supplied by the path // computes the transformation supplied by the path

View File

@ -246,6 +246,7 @@ private:
lay::NetlistObjectsPath m_current_path; lay::NetlistObjectsPath m_current_path;
std::vector<lay::NetlistObjectsPath> m_selected_paths; std::vector<lay::NetlistObjectsPath> m_selected_paths;
std::vector<std::pair<const db::Circuit *, db::DPolygon> > m_markers; std::vector<std::pair<const db::Circuit *, db::DPolygon> > m_markers;
std::vector<std::pair<const db::Circuit *, const db::Net *> > m_net_markers;
lay::NetInfoDialog *mp_info_dialog; lay::NetInfoDialog *mp_info_dialog;
tl::DeferredMethod<NetlistBrowserPage> dm_update_highlights; tl::DeferredMethod<NetlistBrowserPage> dm_update_highlights;
tl::DeferredMethod<NetlistBrowserPage> dm_rerun_macro; tl::DeferredMethod<NetlistBrowserPage> dm_rerun_macro;

View File

@ -154,7 +154,7 @@ TEST(16_private)
TEST(17_private) TEST(17_private)
{ {
test_is_long_runner (); test_is_long_runner ();
run_test (_this, "test_17.lylvs", "test_17b.cir.gz", "test_17.gds.gz", true, "test_17b_5.lvsdb"); run_test (_this, "test_17.lylvs", "test_17b.cir.gz", "test_17.gds.gz", true, "test_17b_6.lvsdb");
} }
TEST(18_private) TEST(18_private)
@ -172,12 +172,12 @@ TEST(19_private)
TEST(20_private) TEST(20_private)
{ {
// test_is_long_runner (); // test_is_long_runner ();
run_test (_this, "test_20.lylvs", "test_20.cir.gz", "test_20.gds.gz", true, "test_20_4.lvsdb"); run_test (_this, "test_20.lylvs", "test_20.cir.gz", "test_20.gds.gz", true, "test_20_5.lvsdb");
} }
TEST(21_private) TEST(21_private)
{ {
run_test (_this, "test_21.lylvs", "test_21.cir.gz", "test_21.gds.gz", true, "test_21_6.lvsdb"); run_test (_this, "test_21.lylvs", "test_21.cir.gz", "test_21.gds.gz", true, "test_21_7.lvsdb");
} }
// issue #1021 // issue #1021

View File

@ -3993,9 +3993,20 @@ Eval::eval_atomic (ExpressionParserContext &ex, std::unique_ptr<ExpressionNode>
do { do {
std::unique_ptr<ExpressionNode> v; tl::Extractor exn = ex;
eval_top (ex, v); std::string name;
n->add_child (v.release ()); if (exn.try_read_word (name, "_") && exn.test ("=")) {
// keyword parameter -> read name again to skip it
ex.read_word (name, "_");
ex.expect ("=");
} else {
name.clear ();
}
std::unique_ptr<ExpressionNode> a;
eval_assign (ex, a);
a->set_name (name);
n->add_child (a.release ());
if (ex.test (")")) { if (ex.test (")")) {
break; break;

View File

@ -46,78 +46,94 @@ namespace tl
* - empty * - empty
*/ */
template <class T> class slist;
template <class T>
struct slist_node_type
{
slist_node_type (const T &_t) : next (0), t (_t) { }
slist_node_type (T &&_t) : next (0), t (_t) { }
slist_node_type *next;
T t;
};
template <class T>
class slist_const_iterator;
template <class T>
class slist_iterator
{
public:
typedef slist_node_type<T> node_type;
typedef std::forward_iterator_tag iterator_category;
typedef T value_type;
typedef T &reference;
typedef T *pointer;
typedef void difference_type;
slist_iterator (node_type *p = 0) : mp_p (p) { }
slist_iterator operator++ () { mp_p = mp_p->next; return *this; }
T *operator-> () const
{
return &mp_p->t;
}
T &operator* () const
{
return mp_p->t;
}
bool operator== (slist_iterator<T> other) const { return mp_p == other.mp_p; }
bool operator!= (slist_iterator<T> other) const { return mp_p != other.mp_p; }
private:
friend class slist_const_iterator<T>;
friend class slist<T>;
node_type *mp_p;
};
template <class T>
class slist_const_iterator
{
public:
typedef slist_node_type<T> node_type;
typedef std::forward_iterator_tag iterator_category;
typedef const T value_type;
typedef const T &reference;
typedef const T *pointer;
typedef void difference_type;
slist_const_iterator (slist_iterator<T> i) : mp_p (i.mp_p) { }
slist_const_iterator (const node_type *p = 0) : mp_p (p) { }
slist_const_iterator operator++ () { mp_p = mp_p->next; return *this; }
const T *operator-> () const
{
return &mp_p->t;
}
const T &operator* () const
{
return mp_p->t;
}
bool operator== (slist_const_iterator<T> other) const { return mp_p == other.mp_p; }
bool operator!= (slist_const_iterator<T> other) const { return mp_p != other.mp_p; }
private:
friend class slist<T>;
const node_type *mp_p;
};
template <class T> template <class T>
class slist class slist
{ {
private:
struct node_type
{
node_type (const T &_t) : next (0), t (_t) { }
node_type (T &&_t) : next (0), t (_t) { }
node_type *next;
T t;
};
public: public:
class const_iterator; typedef slist_node_type<T> node_type;
typedef T value_type;
class iterator typedef slist_const_iterator<T> const_iterator;
{ typedef slist_iterator<T> iterator;
public:
typedef std::forward_iterator_tag category;
typedef T value_type;
typedef T &reference;
typedef T *pointer;
iterator (node_type *p = 0) : mp_p (p) { }
iterator operator++ () { mp_p = mp_p->next; return *this; }
T *operator-> () const
{
return &mp_p->t;
}
T &operator* () const
{
return mp_p->t;
}
bool operator== (iterator other) const { return mp_p == other.mp_p; }
bool operator!= (iterator other) const { return mp_p != other.mp_p; }
private:
friend class slist<T>::const_iterator;
node_type *mp_p;
};
class const_iterator
{
public:
typedef std::forward_iterator_tag category;
typedef const T value_type;
typedef const T &reference;
typedef const T *pointer;
const_iterator (iterator i) : mp_p (i.mp_p) { }
const_iterator (const node_type *p = 0) : mp_p (p) { }
const_iterator operator++ () { mp_p = mp_p->next; return *this; }
const T *operator-> () const
{
return &mp_p->t;
}
const T &operator* () const
{
return mp_p->t;
}
bool operator== (const_iterator other) const { return mp_p == other.mp_p; }
bool operator!= (const_iterator other) const { return mp_p != other.mp_p; }
private:
const node_type *mp_p;
};
slist () slist ()
: mp_first (0), mp_last (0), m_size (0) : mp_first (0), mp_last (0), m_size (0)
@ -292,6 +308,15 @@ public:
other.m_size = 0; other.m_size = 0;
} }
void erase_after (iterator at)
{
node_type *n = at.mp_p->next;
if (n) {
at.mp_p->next = n->next;
delete n;
}
}
private: private:
node_type *mp_first, *mp_last; node_type *mp_first, *mp_last;
size_t m_size; size_t m_size;

View File

@ -105,6 +105,16 @@ TEST(1_Basic)
EXPECT_EQ (l2s (l2), "17,42"); EXPECT_EQ (l2s (l2), "17,42");
l2.pop_front (); l2.pop_front ();
EXPECT_EQ (l2s (l2), "42"); EXPECT_EQ (l2s (l2), "42");
l2.push_front (MyClass1 (11));
EXPECT_EQ (l2s (l2), "11,42");
l2.erase_after (l2.begin ());
EXPECT_EQ (l2s (l2), "11");
l2.erase_after (l2.begin ()); // ignored
EXPECT_EQ (l2s (l2), "11");
l2.pop_front ();
EXPECT_EQ (l2s (l2), "");
EXPECT_EQ (l2.empty (), true);
l2.push_front (MyClass1 (42));
l3.push_back (MyClass1 (2)); l3.push_back (MyClass1 (2));
l3.push_front (MyClass1 (1)); l3.push_front (MyClass1 (1));

BIN
testdata/algo/device_extract_l15.gds vendored Normal file

Binary file not shown.

View File

@ -113,7 +113,7 @@ circuit(INV2
rect((-1700 -1640) (3100 6220)) rect((-1700 -1640) (3100 6220))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(nwell (-1400 1800) (2800 2780)) rect(nwell (-1400 1800) (2800 2780))
rect(diff_cont (-1510 -650) (220 220)) rect(diff_cont (-1510 -650) (220 220))
rect(ntie (-510 -450) (800 680)) rect(ntie (-510 -450) (800 680))
@ -126,7 +126,7 @@ circuit(INV2
rect(poly_lbl (-526 -1801) (2 2)) rect(poly_lbl (-526 -1801) (2 2))
rect(poly_cont (-831 -111) (220 220)) rect(poly_cont (-831 -111) (220 220))
) )
net(3 net(3 name($3)
rect(poly (275 -250) (250 2500)) rect(poly (275 -250) (250 2500))
rect(poly (-305 -1430) (360 360)) rect(poly (-305 -1430) (360 360))
rect(poly (-305 820) (250 1600)) rect(poly (-305 820) (250 1600))
@ -257,13 +257,13 @@ circuit(INV2PAIR
# Nets with their geometries # Nets with their geometries
net(1 name(BULK)) net(1 name(BULK))
net(2 net(2 name($2)
rect(diff_cont (3430 3290) (220 220)) rect(diff_cont (3430 3290) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
rect(diff_cont (-220 -3420) (220 220)) rect(diff_cont (-220 -3420) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
) )
net(3 net(3 name($3)
rect(diff_cont (4230 3290) (220 220)) rect(diff_cont (4230 3290) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
rect(diff_cont (-220 -220) (220 220)) rect(diff_cont (-220 -220) (220 220))
@ -277,7 +277,7 @@ circuit(INV2PAIR
rect(metal1 (-3000 -760) (360 760)) rect(metal1 (-3000 -760) (360 760))
rect(metal1 (-360 -760) (360 760)) rect(metal1 (-360 -760) (360 760))
) )
net(4 net(4 name($4)
rect(diff_cont (4230 490) (220 220)) rect(diff_cont (4230 490) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
rect(diff_cont (-220 -220) (220 220)) rect(diff_cont (-220 -220) (220 220))
@ -291,20 +291,20 @@ circuit(INV2PAIR
rect(metal1 (-3000 -760) (360 760)) rect(metal1 (-3000 -760) (360 760))
rect(metal1 (-360 -760) (360 760)) rect(metal1 (-360 -760) (360 760))
) )
net(5 net(5 name($5)
rect(diff_cont (2390 3690) (220 220)) rect(diff_cont (2390 3690) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
rect(diff_cont (-220 -2620) (220 220)) rect(diff_cont (-220 -2620) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
) )
net(6) net(6 name($6))
net(7 net(7 name($7)
rect(diff_cont (5030 3690) (220 220)) rect(diff_cont (5030 3690) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
rect(diff_cont (-220 -2620) (220 220)) rect(diff_cont (-220 -2620) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
) )
net(8) net(8 name($8))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(BULK)) pin(1 name(BULK))
@ -507,25 +507,25 @@ circuit(RINGO
rect(metal1 (-360 -760) (360 760)) rect(metal1 (-360 -760) (360 760))
rect(metal2_lbl (-21301 -381) (2 2)) rect(metal2_lbl (-21301 -381) (2 2))
) )
net(5 net(5 name($5)
rect(diff_cont (3330 2890) (220 220)) rect(diff_cont (3330 2890) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
rect(diff_cont (-220 -2620) (220 220)) rect(diff_cont (-220 -2620) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
) )
net(6 net(6 name($6)
rect(diff_cont (19170 2890) (220 220)) rect(diff_cont (19170 2890) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
rect(diff_cont (-220 -2620) (220 220)) rect(diff_cont (-220 -2620) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
) )
net(7 net(7 name($7)
rect(diff_cont (13890 2890) (220 220)) rect(diff_cont (13890 2890) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
rect(diff_cont (-220 -2620) (220 220)) rect(diff_cont (-220 -2620) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
) )
net(8 net(8 name($8)
rect(diff_cont (8610 2890) (220 220)) rect(diff_cont (8610 2890) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
rect(diff_cont (-220 -2620) (220 220)) rect(diff_cont (-220 -2620) (220 220))

View File

@ -131,7 +131,7 @@ device(D$NMOS$3 NMOS
circuit(INV2X circuit(INV2X
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect($3 (-125 700) (250 1500)) rect($3 (-125 700) (250 1500))
rect($3 (-125 -1000) (800 500)) rect($3 (-125 -1000) (800 500))
rect($3 (-125 -1000) (250 1500)) rect($3 (-125 -1000) (250 1500))
@ -140,7 +140,7 @@ circuit(INV2X
rect($3 (550 -4500) (250 1600)) rect($3 (550 -4500) (250 1600))
rect($3 (-1050 -1600) (250 1600)) rect($3 (-1050 -1600) (250 1600))
) )
net(2 net(2 name($2)
rect($4 (1090 2590) (220 220)) rect($4 (1090 2590) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
rect($4 (-1820 -620) (220 220)) rect($4 (-1820 -620) (220 220))
@ -155,7 +155,7 @@ circuit(INV2X
rect($1 (-975 -1075) (525 950)) rect($1 (-975 -1075) (525 950))
rect($1 (-2100 -950) (525 950)) rect($1 (-2100 -950) (525 950))
) )
net(3 net(3 name($3)
rect($4 (1090 -310) (220 220)) rect($4 (1090 -310) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
rect($4 (-1820 -620) (220 220)) rect($4 (-1820 -620) (220 220))
@ -170,7 +170,7 @@ circuit(INV2X
rect($2 (-975 -1075) (525 950)) rect($2 (-975 -1075) (525 950))
rect($2 (-2100 -950) (525 950)) rect($2 (-2100 -950) (525 950))
) )
net(4 net(4 name($4)
rect($4 (290 2590) (220 220)) rect($4 (290 2590) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
@ -238,7 +238,7 @@ circuit(INV2X
circuit(NAND1X circuit(NAND1X
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect($4 (290 2590) (220 220)) rect($4 (290 2590) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
@ -254,7 +254,7 @@ circuit(NAND1X
rect($1 (-1255 2045) (550 950)) rect($1 (-1255 2045) (550 950))
rect($2 (250 -3850) (525 950)) rect($2 (250 -3850) (525 950))
) )
net(2 net(2 name($2)
rect($4 (1090 2590) (220 220)) rect($4 (1090 2590) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
rect($4 (-1820 -620) (220 220)) rect($4 (-1820 -620) (220 220))
@ -269,7 +269,7 @@ circuit(NAND1X
rect($1 (-975 -1075) (525 950)) rect($1 (-975 -1075) (525 950))
rect($1 (-2100 -950) (525 950)) rect($1 (-2100 -950) (525 950))
) )
net(3 net(3 name($3)
rect($4 (-510 -310) (220 220)) rect($4 (-510 -310) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
rect($6 (-290 -690) (360 760)) rect($6 (-290 -690) (360 760))
@ -278,17 +278,17 @@ circuit(NAND1X
rect($8 (-810 -510) (3000 1200)) rect($8 (-810 -510) (3000 1200))
rect($2 (-2550 -1075) (525 950)) rect($2 (-2550 -1075) (525 950))
) )
net(4 net(4 name($4)
rect($3 (-125 700) (250 1500)) rect($3 (-125 700) (250 1500))
rect($3 (-250 -100) (250 1600)) rect($3 (-250 -100) (250 1600))
rect($3 (-250 -4500) (250 1600)) rect($3 (-250 -4500) (250 1600))
) )
net(5 net(5 name($5)
rect($3 (675 700) (250 1500)) rect($3 (675 700) (250 1500))
rect($3 (-250 -100) (250 1600)) rect($3 (-250 -100) (250 1600))
rect($3 (-250 -4500) (250 1600)) rect($3 (-250 -4500) (250 1600))
) )
net(6 net(6 name($6)
rect($4 (290 -310) (220 220)) rect($4 (290 -310) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
@ -359,7 +359,7 @@ circuit(NAND1X
circuit(INV2ALT circuit(INV2ALT
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect($3 (675 600) (250 2300)) rect($3 (675 600) (250 2300))
rect($3 (-250 0) (1050 200)) rect($3 (-250 0) (1050 200))
rect($3 (-1725 -1900) (800 500)) rect($3 (-1725 -1900) (800 500))
@ -370,7 +370,7 @@ circuit(INV2ALT
rect($3 (-2400 3350) (1600 250)) rect($3 (-2400 3350) (1600 250))
rect($3 (-1825 -2325) (250 1600)) rect($3 (-1825 -2325) (250 1600))
) )
net(2 net(2 name($2)
rect($4 (290 -310) (220 220)) rect($4 (290 -310) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
rect($4 (-220 2280) (220 220)) rect($4 (-220 2280) (220 220))
@ -390,7 +390,7 @@ circuit(INV2ALT
rect($2 (575 -2550) (950 525)) rect($2 (575 -2550) (950 525))
rect($2 (-2050 -1825) (525 950)) rect($2 (-2050 -1825) (525 950))
) )
net(3 net(3 name($3)
rect($4 (990 4590) (220 220)) rect($4 (990 4590) (220 220))
rect($4 (-620 -220) (220 220)) rect($4 (-620 -220) (220 220))
rect($4 (-1320 -2220) (220 220)) rect($4 (-1320 -2220) (220 220))
@ -405,7 +405,7 @@ circuit(INV2ALT
rect($1 (625 2125) (950 525)) rect($1 (625 2125) (950 525))
rect($1 (-2025 -2525) (525 950)) rect($1 (-2025 -2525) (525 950))
) )
net(4 net(4 name($4)
rect($4 (1390 190) (220 220)) rect($4 (1390 190) (220 220))
rect($4 (180 -220) (220 220)) rect($4 (180 -220) (220 220))
rect($4 (-2520 -720) (220 220)) rect($4 (-2520 -720) (220 220))
@ -471,7 +471,7 @@ circuit(INV2ALT
circuit(RINGO circuit(RINGO
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect($3 (1700 1100) (1300 400)) rect($3 (1700 1100) (1300 400))
rect($4 (-2710 1090) (220 220)) rect($4 (-2710 1090) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
@ -484,7 +484,7 @@ circuit(RINGO
rect($5 (1290 890) (200 200)) rect($5 (1290 890) (200 200))
rect($6 (-1500 -300) (1600 400)) rect($6 (-1500 -300) (1600 400))
) )
net(2 net(2 name($2)
rect($3 (4700 1100) (1300 400)) rect($3 (4700 1100) (1300 400))
rect($4 (-2710 1090) (220 220)) rect($4 (-2710 1090) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
@ -497,7 +497,7 @@ circuit(RINGO
rect($5 (1290 890) (200 200)) rect($5 (1290 890) (200 200))
rect($6 (-1500 -300) (1600 400)) rect($6 (-1500 -300) (1600 400))
) )
net(3 net(3 name($3)
rect($3 (15000 1100) (1300 400)) rect($3 (15000 1100) (1300 400))
rect($4 (-4910 -1810) (220 220)) rect($4 (-4910 -1810) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
@ -510,7 +510,7 @@ circuit(RINGO
rect($5 (3190 -2810) (200 200)) rect($5 (3190 -2810) (200 200))
rect($6 (-2400 -300) (2500 400)) rect($6 (-2400 -300) (2500 400))
) )
net(4 net(4 name($4)
rect($3 (18000 1100) (1300 400)) rect($3 (18000 1100) (1300 400))
rect($4 (-2710 1090) (220 220)) rect($4 (-2710 1090) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
@ -523,7 +523,7 @@ circuit(RINGO
rect($5 (1290 890) (200 200)) rect($5 (1290 890) (200 200))
rect($6 (-1500 -300) (1600 400)) rect($6 (-1500 -300) (1600 400))
) )
net(5 net(5 name($5)
rect($3 (21000 1100) (1300 400)) rect($3 (21000 1100) (1300 400))
rect($4 (-2710 1090) (220 220)) rect($4 (-2710 1090) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
@ -536,7 +536,7 @@ circuit(RINGO
rect($5 (1290 890) (200 200)) rect($5 (1290 890) (200 200))
rect($6 (-1500 -300) (1600 400)) rect($6 (-1500 -300) (1600 400))
) )
net(6 net(6 name($6)
rect($3 (24000 1100) (1300 400)) rect($3 (24000 1100) (1300 400))
rect($4 (-2710 1090) (220 220)) rect($4 (-2710 1090) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
@ -549,7 +549,7 @@ circuit(RINGO
rect($5 (1290 890) (200 200)) rect($5 (1290 890) (200 200))
rect($6 (-1500 -300) (1600 400)) rect($6 (-1500 -300) (1600 400))
) )
net(7 net(7 name($7)
rect($3 (27000 1100) (1300 400)) rect($3 (27000 1100) (1300 400))
rect($4 (-2710 1090) (220 220)) rect($4 (-2710 1090) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
@ -583,7 +583,7 @@ circuit(RINGO
rect($8 (-31600 -400) (400 900)) rect($8 (-31600 -400) (400 900))
rect($11 (16399 -701) (2 2)) rect($11 (16399 -701) (2 2))
) )
net(9 net(9 name($9)
rect($3 (-1300 900) (1300 400)) rect($3 (-1300 900) (1300 400))
rect($4 (-2710 1290) (220 220)) rect($4 (-2710 1290) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
@ -598,7 +598,7 @@ circuit(RINGO
rect($3 (-4000 1200) (875 500)) rect($3 (-4000 1200) (875 500))
rect($9 (-476 -201) (2 2)) rect($9 (-476 -201) (2 2))
) )
net(11 net(11 name($11)
rect($3 (9800 1100) (1300 400)) rect($3 (9800 1100) (1300 400))
rect($4 (-4810 1090) (220 220)) rect($4 (-4810 1090) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))

View File

@ -115,7 +115,7 @@ circuit(INV2
rect($9 (-526 -1801) (2 2)) rect($9 (-526 -1801) (2 2))
rect($5 (-831 -111) (220 220)) rect($5 (-831 -111) (220 220))
) )
net(2 net(2 name($2)
rect($3 (275 -250) (250 2500)) rect($3 (275 -250) (250 2500))
rect($3 (-305 -1430) (360 360)) rect($3 (-305 -1430) (360 360))
rect($3 (-305 820) (250 1600)) rect($3 (-305 820) (250 1600))
@ -144,7 +144,7 @@ circuit(INV2
rect($1 (-276 524) (525 950)) rect($1 (-276 524) (525 950))
rect($2 (-525 -3750) (525 950)) rect($2 (-525 -3750) (525 950))
) )
net(4 net(4 name($4)
rect($4 (-110 -310) (220 220)) rect($4 (-110 -310) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
rect($4 (-220 -220) (220 220)) rect($4 (-220 -220) (220 220))
@ -156,7 +156,7 @@ circuit(INV2
rect($8 (-1525 -775) (2800 900)) rect($8 (-1525 -775) (2800 900))
rect($2 (-1675 -925) (550 950)) rect($2 (-1675 -925) (550 950))
) )
net(5 net(5 name($5)
rect($4 (-110 2490) (220 220)) rect($4 (-110 2490) (220 220))
rect($4 (-220 180) (220 220)) rect($4 (-220 180) (220 220))
rect($4 (-220 -220) (220 220)) rect($4 (-220 -220) (220 220))
@ -367,55 +367,55 @@ circuit(RINGO
rect($6 (-360 -760) (360 760)) rect($6 (-360 -760) (360 760))
rect($11 (-23941 -381) (2 2)) rect($11 (-23941 -381) (2 2))
) )
net(4 net(4 name($4)
rect($4 (690 2890) (220 220)) rect($4 (690 2890) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
rect($4 (-220 -2620) (220 220)) rect($4 (-220 -2620) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
) )
net(5 net(5 name($5)
rect($4 (21810 2890) (220 220)) rect($4 (21810 2890) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
rect($4 (-220 -2620) (220 220)) rect($4 (-220 -2620) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
) )
net(6 net(6 name($6)
rect($4 (19170 2890) (220 220)) rect($4 (19170 2890) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
rect($4 (-220 -2620) (220 220)) rect($4 (-220 -2620) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
) )
net(7 net(7 name($7)
rect($4 (16530 2890) (220 220)) rect($4 (16530 2890) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
rect($4 (-220 -2620) (220 220)) rect($4 (-220 -2620) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
) )
net(8 net(8 name($8)
rect($4 (13890 2890) (220 220)) rect($4 (13890 2890) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
rect($4 (-220 -2620) (220 220)) rect($4 (-220 -2620) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
) )
net(9 net(9 name($9)
rect($4 (11250 2890) (220 220)) rect($4 (11250 2890) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
rect($4 (-220 -2620) (220 220)) rect($4 (-220 -2620) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
) )
net(10 net(10 name($10)
rect($4 (8610 2890) (220 220)) rect($4 (8610 2890) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
rect($4 (-220 -2620) (220 220)) rect($4 (-220 -2620) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
) )
net(11 net(11 name($11)
rect($4 (5970 2890) (220 220)) rect($4 (5970 2890) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
rect($4 (-220 -2620) (220 220)) rect($4 (-220 -2620) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
) )
net(12 net(12 name($12)
rect($4 (3330 2890) (220 220)) rect($4 (3330 2890) (220 220))
rect($4 (-220 -620) (220 220)) rect($4 (-220 -620) (220 220))
rect($4 (-220 -2620) (220 220)) rect($4 (-220 -2620) (220 220))

View File

@ -333,7 +333,7 @@ circuit(TOP
rect(l15 (-980 -270) (1080 370)) rect(l15 (-980 -270) (1080 370))
rect(l16 (-540 -190) (0 0)) rect(l16 (-540 -190) (0 0))
) )
net(3 net(3 name($3)
rect(l11 (-5830 13120) (170 170)) rect(l11 (-5830 13120) (170 170))
rect(l11 (-170 -850) (170 170)) rect(l11 (-170 -850) (170 170))
rect(l11 (-170 170) (170 170)) rect(l11 (-170 170) (170 170))

View File

@ -98,7 +98,7 @@ circuit(INV2
text(poly_lbl IN (-525 -1800)) text(poly_lbl IN (-525 -1800))
rect(poly_cont (-830 -110) (220 220)) rect(poly_cont (-830 -110) (220 220))
) )
net(2 net(2 name($2)
rect(poly (275 -250) (250 2500)) rect(poly (275 -250) (250 2500))
rect(poly (-305 -1430) (360 360)) rect(poly (-305 -1430) (360 360))
rect(poly (-305 820) (250 1600)) rect(poly (-305 820) (250 1600))
@ -127,7 +127,7 @@ circuit(INV2
rect(psd (-275 525) (525 950)) rect(psd (-275 525) (525 950))
rect(nsd (-525 -3750) (525 950)) rect(nsd (-525 -3750) (525 950))
) )
net(4 net(4 name($4)
rect(diff_cont (-110 -310) (220 220)) rect(diff_cont (-110 -310) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
rect(diff_cont (-220 -220) (220 220)) rect(diff_cont (-220 -220) (220 220))
@ -139,7 +139,7 @@ circuit(INV2
rect(metal2 (-1525 -775) (2800 900)) rect(metal2 (-1525 -775) (2800 900))
rect(nsd (-1675 -925) (550 950)) rect(nsd (-1675 -925) (550 950))
) )
net(5 net(5 name($5)
rect(diff_cont (-110 2490) (220 220)) rect(diff_cont (-110 2490) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
rect(diff_cont (-220 -220) (220 220)) rect(diff_cont (-220 -220) (220 220))
@ -234,24 +234,24 @@ circuit(RINGO
net(4 name(VDD) net(4 name(VDD)
text(metal2_lbl VDD (0 2800)) text(metal2_lbl VDD (0 2800))
) )
net(5) net(5 name($5))
net(6) net(6 name($6))
net(7) net(7 name($7))
net(8) net(8 name($8))
net(9) net(9 name($9))
net(10) net(10 name($10))
net(11) net(11 name($11))
net(12) net(12 name($12))
net(13) net(13 name($13))
net(14) net(14 name($14))
net(15) net(15 name($15))
net(16) net(16 name($16))
net(17) net(17 name($17))
net(18) net(18 name($18))
net(19) net(19 name($19))
net(20) net(20 name($20))
net(21) net(21 name($21))
net(22) net(22 name($22))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(FB)) pin(1 name(FB))

View File

@ -79,7 +79,7 @@ X(INV2
J(poly_lbl IN (-525 -1800)) J(poly_lbl IN (-525 -1800))
R(poly_cont (-830 -110) (220 220)) R(poly_cont (-830 -110) (220 220))
) )
N(2 N(2 I($2)
R(poly (275 -250) (250 2500)) R(poly (275 -250) (250 2500))
R(poly (-305 -1430) (360 360)) R(poly (-305 -1430) (360 360))
R(poly (-305 820) (250 1600)) R(poly (-305 820) (250 1600))
@ -108,7 +108,7 @@ X(INV2
R(psd (-275 525) (525 950)) R(psd (-275 525) (525 950))
R(nsd (-525 -3750) (525 950)) R(nsd (-525 -3750) (525 950))
) )
N(4 N(4 I($4)
R(diff_cont (-110 -310) (220 220)) R(diff_cont (-110 -310) (220 220))
R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 180) (220 220))
R(diff_cont (-220 -220) (220 220)) R(diff_cont (-220 -220) (220 220))
@ -120,7 +120,7 @@ X(INV2
R(metal2 (-1525 -775) (2800 900)) R(metal2 (-1525 -775) (2800 900))
R(nsd (-1675 -925) (550 950)) R(nsd (-1675 -925) (550 950))
) )
N(5 N(5 I($5)
R(diff_cont (-110 2490) (220 220)) R(diff_cont (-110 2490) (220 220))
R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 180) (220 220))
R(diff_cont (-220 -220) (220 220)) R(diff_cont (-220 -220) (220 220))
@ -215,24 +215,24 @@ X(RINGO
N(4 I(VDD) N(4 I(VDD)
J(metal2_lbl VDD (0 2800)) J(metal2_lbl VDD (0 2800))
) )
N(5) N(5 I($5))
N(6) N(6 I($6))
N(7) N(7 I($7))
N(8) N(8 I($8))
N(9) N(9 I($9))
N(10) N(10 I($10))
N(11) N(11 I($11))
N(12) N(12 I($12))
N(13) N(13 I($13))
N(14) N(14 I($14))
N(15) N(15 I($15))
N(16) N(16 I($16))
N(17) N(17 I($17))
N(18) N(18 I($18))
N(19) N(19 I($19))
N(20) N(20 I($20))
N(21) N(21 I($21))
N(22) N(22 I($22))
P(1 I(FB)) P(1 I(FB))
P(2 I(OSC)) P(2 I(OSC))
P(3 I(VSS)) P(3 I(VSS))

View File

@ -79,7 +79,7 @@ X(INV2
J(poly_lbl IN (-525 -1800)) J(poly_lbl IN (-525 -1800))
R(poly_cont (-830 -110) (220 220)) R(poly_cont (-830 -110) (220 220))
) )
N(2 N(2 I($2)
R(poly (275 -250) (250 2500)) R(poly (275 -250) (250 2500))
R(poly (-305 -1430) (360 360)) R(poly (-305 -1430) (360 360))
R(poly (-305 820) (250 1600)) R(poly (-305 820) (250 1600))
@ -108,7 +108,7 @@ X(INV2
R(psd (-275 525) (525 950)) R(psd (-275 525) (525 950))
R(nsd (-525 -3750) (525 950)) R(nsd (-525 -3750) (525 950))
) )
N(4 N(4 I($4)
R(diff_cont (-110 -310) (220 220)) R(diff_cont (-110 -310) (220 220))
R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 180) (220 220))
R(diff_cont (-220 -220) (220 220)) R(diff_cont (-220 -220) (220 220))
@ -120,7 +120,7 @@ X(INV2
R(metal2 (-1525 -775) (2800 900)) R(metal2 (-1525 -775) (2800 900))
R(nsd (-1675 -925) (550 950)) R(nsd (-1675 -925) (550 950))
) )
N(5 N(5 I($5)
R(diff_cont (-110 2490) (220 220)) R(diff_cont (-110 2490) (220 220))
R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 180) (220 220))
R(diff_cont (-220 -220) (220 220)) R(diff_cont (-220 -220) (220 220))
@ -206,24 +206,24 @@ X(RINGO
N(4 I(VDD) N(4 I(VDD)
J(metal2_lbl VDD (0 2800)) J(metal2_lbl VDD (0 2800))
) )
N(5) N(5 I($5))
N(6) N(6 I($6))
N(7) N(7 I($7))
N(8) N(8 I($8))
N(9) N(9 I($9))
N(10) N(10 I($10))
N(11) N(11 I($11))
N(12) N(12 I($12))
N(13) N(13 I($13))
N(14) N(14 I($14))
N(15) N(15 I($15))
N(16) N(16 I($16))
N(17) N(17 I($17))
N(18) N(18 I($18))
N(19) N(19 I($19))
N(20) N(20 I($20))
N(21) N(21 I($21))
N(22) N(22 I($22))
P(1 I(FB)) P(1 I(FB))
P(2 I(OSC)) P(2 I(OSC))
P(3 I(VSS)) P(3 I(VSS))

View File

@ -98,7 +98,7 @@ circuit(INV2
text(poly_lbl IN (-525 -1800)) text(poly_lbl IN (-525 -1800))
rect(poly_cont (-830 -110) (220 220)) rect(poly_cont (-830 -110) (220 220))
) )
net(2 net(2 name($2)
rect(poly (275 -250) (250 2500)) rect(poly (275 -250) (250 2500))
rect(poly (-305 -1430) (360 360)) rect(poly (-305 -1430) (360 360))
rect(poly (-305 820) (250 1600)) rect(poly (-305 820) (250 1600))
@ -127,7 +127,7 @@ circuit(INV2
rect(psd (-275 525) (525 950)) rect(psd (-275 525) (525 950))
rect(nsd (-525 -3750) (525 950)) rect(nsd (-525 -3750) (525 950))
) )
net(4 net(4 name($4)
rect(diff_cont (-110 -310) (220 220)) rect(diff_cont (-110 -310) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
rect(diff_cont (-220 -220) (220 220)) rect(diff_cont (-220 -220) (220 220))
@ -139,7 +139,7 @@ circuit(INV2
rect(metal2 (-1525 -775) (2800 900)) rect(metal2 (-1525 -775) (2800 900))
rect(nsd (-1675 -925) (550 950)) rect(nsd (-1675 -925) (550 950))
) )
net(5 net(5 name($5)
rect(diff_cont (-110 2490) (220 220)) rect(diff_cont (-110 2490) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
rect(diff_cont (-220 -220) (220 220)) rect(diff_cont (-220 -220) (220 220))
@ -234,24 +234,24 @@ circuit(RINGO
net(4 name(VDD) net(4 name(VDD)
text(metal2_lbl VDD (0 2800)) text(metal2_lbl VDD (0 2800))
) )
net(5) net(5 name($I46))
net(6) net(6 name($I45))
net(7) net(7 name($I44))
net(8) net(8 name($I43))
net(9) net(9 name($I42))
net(10) net(10 name($I41))
net(11) net(11 name($I40))
net(12) net(12 name($I39))
net(13) net(13 name($I38))
net(14) net(14 name($I19))
net(15) net(15 name($I8))
net(16) net(16 name($I7))
net(17) net(17 name($I6))
net(18) net(18 name($I5))
net(19) net(19 name($I4))
net(20) net(20 name($I3))
net(21) net(21 name($I2))
net(22) net(22 name($I1))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(FB)) pin(1 name(FB))

View File

@ -113,7 +113,7 @@ circuit(INV2
rect((-1700 -1640) (3100 6220)) rect((-1700 -1640) (3100 6220))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(nwell (-1400 1800) (2800 2780)) rect(nwell (-1400 1800) (2800 2780))
rect(diff_cont (-1510 -650) (220 220)) rect(diff_cont (-1510 -650) (220 220))
rect(ntie (-510 -450) (800 680)) rect(ntie (-510 -450) (800 680))
@ -126,7 +126,7 @@ circuit(INV2
rect(poly_lbl (-525 -1800) (0 0)) rect(poly_lbl (-525 -1800) (0 0))
rect(poly_cont (-830 -110) (220 220)) rect(poly_cont (-830 -110) (220 220))
) )
net(3 net(3 name($3)
rect(poly (275 -250) (250 2500)) rect(poly (275 -250) (250 2500))
rect(poly (-305 -1430) (360 360)) rect(poly (-305 -1430) (360 360))
rect(poly (-305 820) (250 1600)) rect(poly (-305 820) (250 1600))
@ -257,14 +257,14 @@ circuit(INV2PAIR
# Nets with their geometries # Nets with their geometries
net(1 name(BULK)) net(1 name(BULK))
net(2) net(2 name($I8))
net(3) net(3 name($I7))
net(4) net(4 name($I6))
net(5) net(5 name($I5))
net(6) net(6 name($I4))
net(7) net(7 name($I3))
net(8) net(8 name($I2))
net(9) net(9 name($I1))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(BULK)) pin(1 name(BULK))
@ -340,14 +340,14 @@ circuit(RINGO
rect(metal1 (2280 -1120) (360 1120)) rect(metal1 (2280 -1120) (360 1120))
rect(metal2_lbl (-23940 300) (0 0)) rect(metal2_lbl (-23940 300) (0 0))
) )
net(5) net(5 name($I25))
net(6) net(6 name($I24))
net(7) net(7 name($I23))
net(8) net(8 name($I22))
net(9) net(9 name($I17))
net(10) net(10 name($I11))
net(11) net(11 name($I10))
net(12) net(12 name($I9))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(FB)) pin(1 name(FB))

View File

@ -92,7 +92,7 @@ D(D$NMOS$1 NMOS
) )
X(INV2 X(INV2
R((-1700 -1640) (3100 6220)) R((-1700 -1640) (3100 6220))
N(1 N(1 I($1)
R(nwell (-1400 1800) (2800 2780)) R(nwell (-1400 1800) (2800 2780))
R(diff_cont (-1510 -650) (220 220)) R(diff_cont (-1510 -650) (220 220))
R(ntie (-510 -450) (800 680)) R(ntie (-510 -450) (800 680))
@ -105,7 +105,7 @@ X(INV2
R(poly_lbl (-525 -1800) (0 0)) R(poly_lbl (-525 -1800) (0 0))
R(poly_cont (-830 -110) (220 220)) R(poly_cont (-830 -110) (220 220))
) )
N(3 N(3 I($3)
R(poly (275 -250) (250 2500)) R(poly (275 -250) (250 2500))
R(poly (-305 -1430) (360 360)) R(poly (-305 -1430) (360 360))
R(poly (-305 820) (250 1600)) R(poly (-305 820) (250 1600))
@ -227,14 +227,14 @@ X(INV2
X(INV2PAIR X(INV2PAIR
R((0 -840) (5740 6220)) R((0 -840) (5740 6220))
N(1 I(BULK)) N(1 I(BULK))
N(2) N(2 I($I8))
N(3) N(3 I($I7))
N(4) N(4 I($I6))
N(5) N(5 I($I5))
N(6) N(6 I($I4))
N(7) N(7 I($I3))
N(8) N(8 I($I2))
N(9) N(9 I($I1))
P(1 I(BULK)) P(1 I(BULK))
P(2) P(2)
P(4) P(4)
@ -301,14 +301,14 @@ X(RINGO
R(metal1 (2280 -1120) (360 1120)) R(metal1 (2280 -1120) (360 1120))
R(metal2_lbl (-23940 300) (0 0)) R(metal2_lbl (-23940 300) (0 0))
) )
N(5) N(5 I($I25))
N(6) N(6 I($I24))
N(7) N(7 I($I23))
N(8) N(8 I($I22))
N(9) N(9 I($I17))
N(10) N(10 I($I11))
N(11) N(11 I($I10))
N(12) N(12 I($I9))
P(1 I(FB)) P(1 I(FB))
P(2 I(OSC)) P(2 I(OSC))
P(3 I(VDD)) P(3 I(VDD))

View File

@ -79,7 +79,7 @@ X(INV2
J(poly_lbl IN (-525 -1800)) J(poly_lbl IN (-525 -1800))
R(poly_cont (-830 -110) (220 220)) R(poly_cont (-830 -110) (220 220))
) )
N(2 N(2 I($2)
R(poly (275 -250) (250 2500)) R(poly (275 -250) (250 2500))
R(poly (-305 -1430) (360 360)) R(poly (-305 -1430) (360 360))
R(poly (-305 820) (250 1600)) R(poly (-305 820) (250 1600))
@ -108,7 +108,7 @@ X(INV2
R(psd (-275 525) (525 950)) R(psd (-275 525) (525 950))
R(nsd (-525 -3750) (525 950)) R(nsd (-525 -3750) (525 950))
) )
N(4 N(4 I($4)
R(diff_cont (-110 -310) (220 220)) R(diff_cont (-110 -310) (220 220))
R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 180) (220 220))
R(diff_cont (-220 -220) (220 220)) R(diff_cont (-220 -220) (220 220))
@ -120,7 +120,7 @@ X(INV2
R(metal2 (-1525 -775) (2800 900)) R(metal2 (-1525 -775) (2800 900))
R(nsd (-1675 -925) (550 950)) R(nsd (-1675 -925) (550 950))
) )
N(5 N(5 I($5)
R(diff_cont (-110 2490) (220 220)) R(diff_cont (-110 2490) (220 220))
R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 180) (220 220))
R(diff_cont (-220 -220) (220 220)) R(diff_cont (-220 -220) (220 220))
@ -215,24 +215,24 @@ X(RINGO
N(4 I(VDD) N(4 I(VDD)
J(metal2_lbl VDD (0 2800)) J(metal2_lbl VDD (0 2800))
) )
N(5) N(5 I($I46))
N(6) N(6 I($I45))
N(7) N(7 I($I44))
N(8) N(8 I($I43))
N(9) N(9 I($I42))
N(10) N(10 I($I41))
N(11) N(11 I($I40))
N(12) N(12 I($I39))
N(13) N(13 I($I38))
N(14) N(14 I($I19))
N(15) N(15 I($I8))
N(16) N(16 I($I7))
N(17) N(17 I($I6))
N(18) N(18 I($I5))
N(19) N(19 I($I4))
N(20) N(20 I($I3))
N(21) N(21 I($I2))
N(22) N(22 I($I1))
P(1 I(FB)) P(1 I(FB))
P(2 I(OSC)) P(2 I(OSC))
P(3 I(VSS)) P(3 I(VSS))

View File

@ -79,7 +79,7 @@ X(INV2
J(poly_lbl IN (-525 -1800)) J(poly_lbl IN (-525 -1800))
R(poly_cont (-830 -110) (220 220)) R(poly_cont (-830 -110) (220 220))
) )
N(2 N(2 I($2)
R(poly (275 -250) (250 2500)) R(poly (275 -250) (250 2500))
R(poly (-305 -1430) (360 360)) R(poly (-305 -1430) (360 360))
R(poly (-305 820) (250 1600)) R(poly (-305 820) (250 1600))
@ -108,7 +108,7 @@ X(INV2
R(psd (-275 525) (525 950)) R(psd (-275 525) (525 950))
R(nsd (-525 -3750) (525 950)) R(nsd (-525 -3750) (525 950))
) )
N(4 N(4 I($4)
R(diff_cont (-110 -310) (220 220)) R(diff_cont (-110 -310) (220 220))
R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 180) (220 220))
R(diff_cont (-220 -220) (220 220)) R(diff_cont (-220 -220) (220 220))
@ -120,7 +120,7 @@ X(INV2
R(metal2 (-1525 -775) (2800 900)) R(metal2 (-1525 -775) (2800 900))
R(nsd (-1675 -925) (550 950)) R(nsd (-1675 -925) (550 950))
) )
N(5 N(5 I($5)
R(diff_cont (-110 2490) (220 220)) R(diff_cont (-110 2490) (220 220))
R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 180) (220 220))
R(diff_cont (-220 -220) (220 220)) R(diff_cont (-220 -220) (220 220))
@ -206,24 +206,24 @@ X(RINGO
N(4 I(VDD) N(4 I(VDD)
J(metal2_lbl VDD (0 2800)) J(metal2_lbl VDD (0 2800))
) )
N(5) N(5 I($I46))
N(6) N(6 I($I45))
N(7) N(7 I($I44))
N(8) N(8 I($I43))
N(9) N(9 I($I42))
N(10) N(10 I($I41))
N(11) N(11 I($I40))
N(12) N(12 I($I39))
N(13) N(13 I($I38))
N(14) N(14 I($I19))
N(15) N(15 I($I8))
N(16) N(16 I($I7))
N(17) N(17 I($I6))
N(18) N(18 I($I5))
N(19) N(19 I($I4))
N(20) N(20 I($I3))
N(21) N(21 I($I2))
N(22) N(22 I($I1))
P(1 I(FB)) P(1 I(FB))
P(2 I(OSC)) P(2 I(OSC))
P(3 I(VSS)) P(3 I(VSS))

View File

@ -116,7 +116,7 @@ layout(
rect((-1700 -2440) (3100 7820)) rect((-1700 -2440) (3100 7820))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(nwell (-1400 1800) (2800 3580)) rect(nwell (-1400 1800) (2800 3580))
rect(diff_cont (-1510 -650) (220 220)) rect(diff_cont (-1510 -650) (220 220))
rect(ntie (-510 -450) (800 680)) rect(ntie (-510 -450) (800 680))
@ -267,12 +267,12 @@ layout(
# Nets with their geometries # Nets with their geometries
net(1 name(BULK)) net(1 name(BULK))
net(2) net(2 name($I6))
net(3) net(3 name($I5))
net(4) net(4 name($I4))
net(5) net(5 name($I3))
net(6) net(6 name($I2))
net(7) net(7 name($I1))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(BULK)) pin(1 name(BULK))
@ -346,14 +346,14 @@ layout(
rect(metal1 (2280 -1120) (360 1120)) rect(metal1 (2280 -1120) (360 1120))
rect(metal2_lbl (-23940 1100) (0 0)) rect(metal2_lbl (-23940 1100) (0 0))
) )
net(5) net(5 name($I25))
net(6) net(6 name($I24))
net(7) net(7 name($I23))
net(8) net(8 name($I22))
net(9) net(9 name($I17))
net(10) net(10 name($I11))
net(11) net(11 name($I10))
net(12) net(12 name($I9))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(FB)) pin(1 name(FB))

View File

@ -116,7 +116,7 @@ layout(
rect((-1700 -2440) (3100 7820)) rect((-1700 -2440) (3100 7820))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(nwell (-1400 1800) (2800 3580)) rect(nwell (-1400 1800) (2800 3580))
rect(diff_cont (-1510 -650) (220 220)) rect(diff_cont (-1510 -650) (220 220))
rect(ntie (-510 -450) (800 680)) rect(ntie (-510 -450) (800 680))
@ -267,12 +267,12 @@ layout(
# Nets with their geometries # Nets with their geometries
net(1 name(BULK)) net(1 name(BULK))
net(2) net(2 name($I6))
net(3) net(3 name($I5))
net(4) net(4 name($I4))
net(5) net(5 name($I3))
net(6) net(6 name($I2))
net(7) net(7 name($I1))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(BULK)) pin(1 name(BULK))
@ -346,14 +346,14 @@ layout(
rect(metal1 (2280 -1120) (360 1120)) rect(metal1 (2280 -1120) (360 1120))
rect(metal2_lbl (-23940 1100) (0 0)) rect(metal2_lbl (-23940 1100) (0 0))
) )
net(5) net(5 name($I25))
net(6) net(6 name($I24))
net(7) net(7 name($I23))
net(8) net(8 name($I22))
net(9) net(9 name($I17))
net(10) net(10 name($I11))
net(11) net(11 name($I10))
net(12) net(12 name($I9))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(FB)) pin(1 name(FB))

View File

@ -116,7 +116,7 @@ layout(
rect((-1700 -2440) (3100 7820)) rect((-1700 -2440) (3100 7820))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(nwell (-1400 1800) (2800 3580)) rect(nwell (-1400 1800) (2800 3580))
rect(diff_cont (-1510 -650) (220 220)) rect(diff_cont (-1510 -650) (220 220))
rect(ntie (-510 -450) (800 680)) rect(ntie (-510 -450) (800 680))
@ -267,12 +267,12 @@ layout(
# Nets with their geometries # Nets with their geometries
net(1 name(BULK)) net(1 name(BULK))
net(2) net(2 name($I6))
net(3) net(3 name($I5))
net(4) net(4 name($I4))
net(5) net(5 name($I3))
net(6) net(6 name($I2))
net(7) net(7 name($I1))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(BULK)) pin(1 name(BULK))
@ -346,14 +346,14 @@ layout(
rect(metal1 (2280 -1120) (360 1120)) rect(metal1 (2280 -1120) (360 1120))
rect(metal2_lbl (-23940 1100) (0 0)) rect(metal2_lbl (-23940 1100) (0 0))
) )
net(5) net(5 name($I25))
net(6) net(6 name($I24))
net(7) net(7 name($I23))
net(8) net(8 name($I22))
net(9) net(9 name($I17))
net(10) net(10 name($I11))
net(11) net(11 name($I10))
net(12) net(12 name($I9))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(FB)) pin(1 name(FB))

View File

@ -116,7 +116,7 @@ layout(
rect((-1700 -2440) (3100 7820)) rect((-1700 -2440) (3100 7820))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(nwell (-1400 1800) (2800 3580)) rect(nwell (-1400 1800) (2800 3580))
rect(diff_cont (-1510 -650) (220 220)) rect(diff_cont (-1510 -650) (220 220))
rect(ntie (-510 -450) (800 680)) rect(ntie (-510 -450) (800 680))
@ -267,12 +267,12 @@ layout(
# Nets with their geometries # Nets with their geometries
net(1 name(BULK)) net(1 name(BULK))
net(2) net(2 name($I6))
net(3) net(3 name($I5))
net(4) net(4 name($I4))
net(5) net(5 name($I3))
net(6) net(6 name($I2))
net(7) net(7 name($I1))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(BULK)) pin(1 name(BULK))
@ -346,14 +346,14 @@ layout(
rect(metal1 (2280 -1120) (360 1120)) rect(metal1 (2280 -1120) (360 1120))
rect(metal2_lbl (-23940 1100) (0 0)) rect(metal2_lbl (-23940 1100) (0 0))
) )
net(5) net(5 name($I25))
net(6) net(6 name($I24))
net(7) net(7 name($I23))
net(8) net(8 name($I22))
net(9) net(9 name($I17))
net(10) net(10 name($I11))
net(11) net(11 name($I10))
net(12) net(12 name($I9))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(FB)) pin(1 name(FB))

View File

@ -116,7 +116,7 @@ layout(
rect((-1700 -2440) (3100 7820)) rect((-1700 -2440) (3100 7820))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(nwell (-1400 1800) (2800 3580)) rect(nwell (-1400 1800) (2800 3580))
rect(diff_cont (-1510 -650) (220 220)) rect(diff_cont (-1510 -650) (220 220))
rect(ntie (-510 -450) (800 680)) rect(ntie (-510 -450) (800 680))
@ -267,12 +267,12 @@ layout(
# Nets with their geometries # Nets with their geometries
net(1 name(BULK)) net(1 name(BULK))
net(2) net(2 name($I6))
net(3) net(3 name($I5))
net(4) net(4 name($I4))
net(5) net(5 name($I3))
net(6) net(6 name($I2))
net(7) net(7 name($I1))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(BULK)) pin(1 name(BULK))
@ -346,14 +346,14 @@ layout(
rect(metal1 (2280 -1120) (360 1120)) rect(metal1 (2280 -1120) (360 1120))
rect(metal2_lbl (-23940 1100) (0 0)) rect(metal2_lbl (-23940 1100) (0 0))
) )
net(5) net(5 name($I25))
net(6) net(6 name($I24))
net(7) net(7 name($I23))
net(8) net(8 name($I22))
net(9) net(9 name($I17))
net(10) net(10 name($I11))
net(11) net(11 name($I10))
net(12) net(12 name($I9))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(FB)) pin(1 name(FB))

View File

@ -116,7 +116,7 @@ layout(
rect((-1700 -2440) (3100 7820)) rect((-1700 -2440) (3100 7820))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(nwell (-1400 1800) (2800 3580)) rect(nwell (-1400 1800) (2800 3580))
rect(diff_cont (-1510 -650) (220 220)) rect(diff_cont (-1510 -650) (220 220))
rect(ntie (-510 -450) (800 680)) rect(ntie (-510 -450) (800 680))
@ -267,12 +267,12 @@ layout(
# Nets with their geometries # Nets with their geometries
net(1 name(BULK)) net(1 name(BULK))
net(2) net(2 name($I6))
net(3) net(3 name($I5))
net(4) net(4 name($I4))
net(5) net(5 name($I3))
net(6) net(6 name($I2))
net(7) net(7 name($I1))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(BULK)) pin(1 name(BULK))
@ -346,14 +346,14 @@ layout(
rect(metal1 (2280 -1120) (360 1120)) rect(metal1 (2280 -1120) (360 1120))
rect(metal2_lbl (-23940 1100) (0 0)) rect(metal2_lbl (-23940 1100) (0 0))
) )
net(5) net(5 name($I25))
net(6) net(6 name($I24))
net(7) net(7 name($I23))
net(8) net(8 name($I22))
net(9) net(9 name($I17))
net(10) net(10 name($I11))
net(11) net(11 name($I10))
net(12) net(12 name($I9))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(FB)) pin(1 name(FB))

View File

@ -116,7 +116,7 @@ layout(
rect((-1700 -2440) (3100 7820)) rect((-1700 -2440) (3100 7820))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(nwell (-1400 1800) (2800 3580)) rect(nwell (-1400 1800) (2800 3580))
rect(diff_cont (-1510 -650) (220 220)) rect(diff_cont (-1510 -650) (220 220))
rect(ntie (-510 -450) (800 680)) rect(ntie (-510 -450) (800 680))
@ -267,12 +267,12 @@ layout(
# Nets with their geometries # Nets with their geometries
net(1 name(BULK)) net(1 name(BULK))
net(2) net(2 name($I6))
net(3) net(3 name($I5))
net(4) net(4 name($I4))
net(5) net(5 name($I3))
net(6) net(6 name($I2))
net(7) net(7 name($I1))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(BULK)) pin(1 name(BULK))
@ -346,14 +346,14 @@ layout(
rect(metal1 (2280 -1120) (360 1120)) rect(metal1 (2280 -1120) (360 1120))
rect(metal2_lbl (-23940 1100) (0 0)) rect(metal2_lbl (-23940 1100) (0 0))
) )
net(5) net(5 name($I25))
net(6) net(6 name($I24))
net(7) net(7 name($I23))
net(8) net(8 name($I22))
net(9) net(9 name($I17))
net(10) net(10 name($I11))
net(11) net(11 name($I10))
net(12) net(12 name($I9))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(FB)) pin(1 name(FB))

View File

@ -116,7 +116,7 @@ layout(
rect((-1700 -2440) (3100 7820)) rect((-1700 -2440) (3100 7820))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(nwell (-1400 1800) (2800 3580)) rect(nwell (-1400 1800) (2800 3580))
rect(diff_cont (-1510 -650) (220 220)) rect(diff_cont (-1510 -650) (220 220))
rect(ntie (-510 -450) (800 680)) rect(ntie (-510 -450) (800 680))
@ -267,12 +267,12 @@ layout(
# Nets with their geometries # Nets with their geometries
net(1 name(BULK)) net(1 name(BULK))
net(2) net(2 name($I6))
net(3) net(3 name($I5))
net(4) net(4 name($I4))
net(5) net(5 name($I3))
net(6) net(6 name($I2))
net(7) net(7 name($I1))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(BULK)) pin(1 name(BULK))
@ -346,14 +346,14 @@ layout(
rect(metal1 (2280 -1120) (360 1120)) rect(metal1 (2280 -1120) (360 1120))
rect(metal2_lbl (-23940 1100) (0 0)) rect(metal2_lbl (-23940 1100) (0 0))
) )
net(5) net(5 name($I25))
net(6) net(6 name($I24))
net(7) net(7 name($I23))
net(8) net(8 name($I22))
net(9) net(9 name($I17))
net(10) net(10 name($I11))
net(11) net(11 name($I10))
net(12) net(12 name($I9))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(FB)) pin(1 name(FB))

View File

@ -116,7 +116,7 @@ layout(
rect((-1700 -2440) (3100 7820)) rect((-1700 -2440) (3100 7820))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(nwell (-1400 1800) (2800 3580)) rect(nwell (-1400 1800) (2800 3580))
rect(diff_cont (-1510 -650) (220 220)) rect(diff_cont (-1510 -650) (220 220))
rect(ntie (-510 -450) (800 680)) rect(ntie (-510 -450) (800 680))
@ -267,12 +267,12 @@ layout(
# Nets with their geometries # Nets with their geometries
net(1 name(BULK)) net(1 name(BULK))
net(2) net(2 name($2))
net(3) net(3 name($3))
net(4) net(4 name($4))
net(5) net(5 name($5))
net(6) net(6 name($6))
net(7) net(7 name($7))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(BULK)) pin(1 name(BULK))
@ -346,14 +346,14 @@ layout(
rect(metal1 (2280 -1120) (360 1120)) rect(metal1 (2280 -1120) (360 1120))
rect(metal2_lbl (-23940 1100) (0 0)) rect(metal2_lbl (-23940 1100) (0 0))
) )
net(5) net(5 name($5))
net(6) net(6 name($6))
net(7) net(7 name($7))
net(8) net(8 name($8))
net(9) net(9 name($9))
net(10) net(10 name($10))
net(11) net(11 name($11))
net(12) net(12 name($12))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(FB)) pin(1 name(FB))

View File

@ -116,7 +116,7 @@ layout(
rect((-1700 -2440) (3100 7820)) rect((-1700 -2440) (3100 7820))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(nwell (-1400 1800) (2800 3580)) rect(nwell (-1400 1800) (2800 3580))
rect(diff_cont (-1510 -650) (220 220)) rect(diff_cont (-1510 -650) (220 220))
rect(ntie (-510 -450) (800 680)) rect(ntie (-510 -450) (800 680))
@ -267,7 +267,7 @@ layout(
# Nets with their geometries # Nets with their geometries
net(1 name(BULK)) net(1 name(BULK))
net(2 net(2 name($2)
rect(diff_cont (4230 3290) (220 220)) rect(diff_cont (4230 3290) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
@ -289,7 +289,7 @@ layout(
rect(metal1 (-3000 -1560) (360 1560)) rect(metal1 (-3000 -1560) (360 1560))
rect(metal1 (-360 -1560) (360 1560)) rect(metal1 (-360 -1560) (360 1560))
) )
net(3 net(3 name($3)
rect(diff_cont (4230 890) (220 220)) rect(diff_cont (4230 890) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
@ -311,7 +311,7 @@ layout(
rect(metal1 (-3000 -1560) (360 1560)) rect(metal1 (-3000 -1560) (360 1560))
rect(metal1 (-360 -1560) (360 1560)) rect(metal1 (-360 -1560) (360 1560))
) )
net(4 net(4 name($4)
rect(diff_cont (790 890) (220 220)) rect(diff_cont (790 890) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
@ -329,8 +329,8 @@ layout(
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
) )
net(5) net(5 name($5))
net(6 net(6 name($6)
rect(diff_cont (3430 890) (220 220)) rect(diff_cont (3430 890) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
@ -348,7 +348,7 @@ layout(
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
) )
net(7) net(7 name($7))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(1 name(BULK)) pin(1 name(BULK))
@ -654,7 +654,7 @@ layout(
rect(metal1 (-360 -1560) (360 1560)) rect(metal1 (-360 -1560) (360 1560))
rect(metal2_lbl (-21300 -380) (0 0)) rect(metal2_lbl (-21300 -380) (0 0))
) )
net(5 net(5 name($5)
rect(diff_cont (1730 90) (220 220)) rect(diff_cont (1730 90) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
@ -672,7 +672,7 @@ layout(
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
) )
net(6 net(6 name($6)
rect(diff_cont (17570 90) (220 220)) rect(diff_cont (17570 90) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
@ -690,7 +690,7 @@ layout(
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
) )
net(7 net(7 name($7)
rect(diff_cont (12290 90) (220 220)) rect(diff_cont (12290 90) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
@ -708,7 +708,7 @@ layout(
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220))
) )
net(8 net(8 name($8)
rect(diff_cont (7010 90) (220 220)) rect(diff_cont (7010 90) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))
rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220))

Binary file not shown.

View File

@ -17,19 +17,38 @@ connect(l2, l3)
connect(l3, l4) connect(l3, l4)
connect(l4, l5) connect(l4, l5)
l1_measured = evaluate_nets(l1, { "l2" => l2, "l3" => l3, "l4" => l4, "l5" => l5 }, "put(5, area(l5)); put(0, area); put(100, area(l5)/area)")
l2_measured = evaluate_nets(l1, {}, "put(0, area*factor)", { "factor" => 1000.0 })
l3_measured = evaluate_nets(l1, {}, "put(0, net.name)")
l4_measured = evaluate_nets(l1, {}, "skip(net.name == n)", { "n" => "NET1" })
l1.output(1, 0) l1.output(1, 0)
l2.output(2, 0) l2.output(2, 0)
l3.output(3, 0) l3.output(3, 0)
l4.output(4, 0) l4.output(4, 0)
l5.output(5, 0) l5.output(5, 0)
l1_measured.output(100, 0) sec = { "l2" => l2, "l3" => l3, "l4" => l4, "l5" => l5 }
l2_measured.output(101, 0) l100_measured = evaluate_nets(l1, sec, "put(5, area(l5)); put(0, area); put(100, area(l5)/area)")
l3_measured.output(102, 0) l101_measured = evaluate_nets(l1, sec, "put(0, area*factor)", { "factor" => 1000.0 })
l4_measured.output(103, 0) l102_measured = evaluate_nets(l1, sec, "put(0, net.name)")
l103_measured = evaluate_nets(l1, sec, "skip(net.name == n)", { "n" => "NET1" })
l104_measured = evaluate_nets(l1, sec, "copy(net.name == n)", { "n" => "NET1" })
# default action is "skip", then copy primary if net name is "NET1"
l105_measured = evaluate_nets(l1, sec, "skip ; net.name == n && copy(layer = 0)", { "n" => "NET1" })
l106_measured = evaluate_nets(l1, sec, "copy(net.name == n, merged = true)", { "n" => "NET1" })
l107_measured = evaluate_nets(l1, sec, "copy(net.name == n, merged = false)", { "n" => "NET1" })
l108_measured = evaluate_nets(l1, sec, "copy(net.name == n, merged = false, layers = [l4, l5])", { "n" => "NET1" })
l109_measured = evaluate_nets(l1, sec, "copy(net.name == n, merged = false, layer = l5)", { "n" => "NET1" })
l110_measured = evaluate_nets(l1, sec, "copy(net.name == n, merged = false, limit = 0)", { "n" => "NET1" })
# default action is "skip", then copy all if net name is "NET1"
l111_measured = evaluate_nets(l1, sec, "skip ; net.name == n && copy", { "n" => "NET1" })
l100_measured.output(100, 0)
l101_measured.output(101, 0)
l102_measured.output(102, 0)
l103_measured.output(103, 0)
l104_measured.output(104, 0)
l105_measured.output(105, 0)
l106_measured.output(106, 0)
l107_measured.output(107, 0)
l108_measured.output(108, 0)
l109_measured.output(109, 0)
l110_measured.output(110, 0)
l111_measured.output(111, 0)

37
testdata/drc/drcSimpleTests_147.drc vendored Normal file
View File

@ -0,0 +1,37 @@
source $drc_test_source
report_netlist $drc_test_target
deep
l1 = input(1, 0)
l2 = input(2, 0)
l3 = input(3, 0)
l4 = input(4, 0)
l5 = input(5, 0)
connect(l1, l2)
connect(l2, l3)
connect(l3, l4)
connect(l4, l5)
l1.output(1, 0)
l2.output(2, 0)
l3.output(3, 0)
l4.output(4, 0)
l5.output(5, 0)
netlist
sec = { "l2" => l2, "l3" => l3, "l4" => l4, "l5" => l5 }
script = <<"END"
skip;
var ar=area(l5)/area;
db.add_log_entry(LogEntryData.new(Severity.Info, net, 'AR='+to_s(ar)))
END
evaluate_nets(l1, sec, script, { "n" => "NET1" })
netlist

BIN
testdata/drc/drcSimpleTests_147.gds vendored Normal file

Binary file not shown.

View File

@ -27,7 +27,7 @@ D(D$MOS MOS
) )
X(A X(A
R((-2800 -2500) (5600 5200)) R((-2800 -2500) (5600 5200))
N(1 N(1 I($1)
R(contact (-1900 2000) (600 600)) R(contact (-1900 2000) (600 600))
R(contact (-600 -600) (600 600)) R(contact (-600 -600) (600 600))
R(contact (2600 -600) (600 600)) R(contact (2600 -600) (600 600))
@ -36,13 +36,13 @@ X(A
R(contact (-600 -600) (600 600)) R(contact (-600 -600) (600 600))
R(sd (-2300 -700) (4000 800)) R(sd (-2300 -700) (4000 800))
) )
N(2 N(2 I($2)
R(contact (-1900 -2400) (600 600)) R(contact (-1900 -2400) (600 600))
R(contact (2600 -600) (600 600)) R(contact (2600 -600) (600 600))
R(contact (-2200 -600) (600 600)) R(contact (-2200 -600) (600 600))
R(sd (-2300 -700) (4000 800)) R(sd (-2300 -700) (4000 800))
) )
N(3 N(3 I($3)
R(poly (-2800 -1700) (5600 3600)) R(poly (-2800 -1700) (5600 3600))
) )
P(1) P(1)
@ -63,9 +63,9 @@ X(A
) )
X(AA X(AA
R((-2050 -1950) (5600 5200)) R((-2050 -1950) (5600 5200))
N(1) N(1 I($I3))
N(2) N(2 I($I2))
N(3) N(3 I($I1))
P(1) P(1)
P(2) P(2)
P(3) P(3)
@ -94,10 +94,10 @@ X(TOP
R(contact (-1200 -1600) (600 600)) R(contact (-1200 -1600) (600 600))
R(contact (1000 -600) (600 600)) R(contact (1000 -600) (600 600))
) )
N(3 N(3 I($3)
R(l1 (-2350 8300) (4000 850)) R(l1 (-2350 8300) (4000 850))
) )
N(4 N(4 I($4)
R(l1 (-2800 -2800) (800 4100)) R(l1 (-2800 -2800) (800 4100))
) )
X(1 AA Y(-1100 5900) X(1 AA Y(-1100 5900)

Binary file not shown.

Binary file not shown.

74
testdata/drc/drcSimpleTests_au147.l2n vendored Normal file
View File

@ -0,0 +1,74 @@
#%l2n-klayout
W(TOP)
U(0.001)
L(l1 '1/0')
L(l2 '2/0')
L(l3 '3/0')
L(l4 '4/0')
L(l5 '5/0')
C(l1 l1 l2)
C(l2 l1 l2 l3)
C(l3 l2 l3 l4)
C(l4 l3 l4 l5)
C(l5 l4 l5)
H(I B('AR=5') C(B) N(NET1))
H(I B('AR=0') C(B) N($4))
H(I B('AR=9.875') C(TOP) N($1))
H(I B('AR=9.5') C(TOP) N($I2))
X(A
R((0 0) (38000 12000))
N(1 I(NET2)
R(l1 (0 8000) (4000 4000))
R(l2 (-3000 -3000) (2000 2000))
R(l3 (-3000 -11000) (4000 12000))
R(l4 (-3000 -11000) (2000 2000))
R(l5 (-3000 -3000) (38000 4000))
R(l5 (-22000 -2000) (0 0))
)
P(1 I(NET2))
)
X(B
R((-8000 -14000) (48000 34000))
N(1 I(NET1)
R(l1 (12000 8000) (4000 4000))
R(l1 (-10000 -14000) (4000 4000))
R(l2 (3000 7000) (2000 2000))
R(l2 (-8000 -12000) (2000 2000))
R(l3 (3000 -3000) (4000 14000))
R(l3 (-10000 -14000) (10000 4000))
R(l4 (-3000 -3000) (2000 2000))
R(l5 (-3000 -15000) (4000 16000))
R(l5 (14000 -16000) (10000 4000))
R(l5 (-6000 -2000) (0 0))
)
N(2 I($2)
R(l3 (25000 -5000) (4000 7000))
R(l4 (-3000 -3000) (2000 2000))
R(l5 (-3000 -3000) (15000 4000))
)
N(3 I($4)
R(l1 (25000 -5000) (4000 18000))
)
N(4 I($5)
R(l3 (25000 6000) (4000 7000))
)
N(5 I($6)
R(l5 (25000 6000) (15000 4000))
)
N(6 I(NET2)
R(l5 (16000 18000) (0 0))
)
P(6 I(NET2))
X(1 A Y(-8000 -14000) P(0 1))
X(2 A M Y(-8000 20000) P(0 6))
)
X(TOP
R((-18000 -51000) (58000 108000))
N(1 I($1)
R(l5 (0 16000) (4000 11000))
)
N(2 I($I2))
X(1 B Y(0 0) P(0 1))
X(2 B O(180) Y(22000 43000) P(0 1))
X(3 B O(180) Y(22000 -31000) P(0 2))
)

View File

@ -188,7 +188,7 @@ layout(
rect((-577500 -1123000) (1868000 1796000)) rect((-577500 -1123000) (1868000 1796000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l2 (345500 455000) (256500 25000)) rect(l2 (345500 455000) (256500 25000))
rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-256500 -146000) (25000 146000))
rect(l2 (-47000 -183500) (75000 75000)) rect(l2 (-47000 -183500) (75000 75000))
@ -207,7 +207,7 @@ layout(
rect(l10 (-57500 -57500) (25000 25000)) rect(l10 (-57500 -57500) (25000 25000))
rect(l11 (-25000 -25000) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000))
) )
net(2 net(2 name($2)
rect(l2 (-148000 463000) (300000 25000)) rect(l2 (-148000 463000) (300000 25000))
) )
net(3 name($5) net(3 name($5)

View File

@ -118,7 +118,7 @@ layout(
rect((-577500 -1123000) (1868000 1796000)) rect((-577500 -1123000) (1868000 1796000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l2 (345500 455000) (256500 25000)) rect(l2 (345500 455000) (256500 25000))
rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-256500 -146000) (25000 146000))
rect(l2 (-47000 -183500) (75000 75000)) rect(l2 (-47000 -183500) (75000 75000))
@ -137,7 +137,7 @@ layout(
rect(l10 (-57500 -57500) (25000 25000)) rect(l10 (-57500 -57500) (25000 25000))
rect(l11 (-25000 -25000) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000))
) )
net(2 net(2 name($2)
rect(l2 (-148000 463000) (300000 25000)) rect(l2 (-148000 463000) (300000 25000))
) )
net(3 name($5) net(3 name($5)

View File

@ -192,7 +192,7 @@ layout(
rect((-577500 -1123000) (1868000 1796000)) rect((-577500 -1123000) (1868000 1796000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l2 (345500 455000) (256500 25000)) rect(l2 (345500 455000) (256500 25000))
rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-256500 -146000) (25000 146000))
rect(l2 (-47000 -183500) (75000 75000)) rect(l2 (-47000 -183500) (75000 75000))
@ -211,13 +211,13 @@ layout(
rect(l10 (-57500 -57500) (25000 25000)) rect(l10 (-57500 -57500) (25000 25000))
rect(l11 (-25000 -25000) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000))
) )
net(2 net(2 name($2)
rect(l2 (-148000 463000) (300000 25000)) rect(l2 (-148000 463000) (300000 25000))
) )
net(3 net(3 name($3)
rect(l2 (-401420 456500) (50730 78500)) rect(l2 (-401420 456500) (50730 78500))
) )
net(4 net(4 name($4)
rect(l2 (822690 427000) (63970 82000)) rect(l2 (822690 427000) (63970 82000))
) )
net(5 name($7) net(5 name($7)

View File

@ -122,7 +122,7 @@ layout(
rect((-577500 -1123000) (1868000 1796000)) rect((-577500 -1123000) (1868000 1796000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l2 (345500 455000) (256500 25000)) rect(l2 (345500 455000) (256500 25000))
rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-256500 -146000) (25000 146000))
rect(l2 (-47000 -183500) (75000 75000)) rect(l2 (-47000 -183500) (75000 75000))
@ -141,13 +141,13 @@ layout(
rect(l10 (-57500 -57500) (25000 25000)) rect(l10 (-57500 -57500) (25000 25000))
rect(l11 (-25000 -25000) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000))
) )
net(2 net(2 name($2)
rect(l2 (-148000 463000) (300000 25000)) rect(l2 (-148000 463000) (300000 25000))
) )
net(3 net(3 name($3)
rect(l2 (-401420 456500) (50730 78500)) rect(l2 (-401420 456500) (50730 78500))
) )
net(4 net(4 name($4)
rect(l2 (822690 427000) (63970 82000)) rect(l2 (822690 427000) (63970 82000))
) )
net(5 name($7) net(5 name($7)

View File

@ -188,7 +188,7 @@ layout(
rect((-577500 -1123000) (1868000 1796000)) rect((-577500 -1123000) (1868000 1796000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l2 (345500 455000) (256500 25000)) rect(l2 (345500 455000) (256500 25000))
rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-256500 -146000) (25000 146000))
rect(l2 (-47000 -183500) (75000 75000)) rect(l2 (-47000 -183500) (75000 75000))
@ -207,7 +207,7 @@ layout(
rect(l10 (-57500 -57500) (25000 25000)) rect(l10 (-57500 -57500) (25000 25000))
rect(l11 (-25000 -25000) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000))
) )
net(2 net(2 name($2)
rect(l2 (-148000 463000) (300000 25000)) rect(l2 (-148000 463000) (300000 25000))
) )
net(3 name($5) net(3 name($5)

View File

@ -118,7 +118,7 @@ layout(
rect((-577500 -1123000) (1868000 1796000)) rect((-577500 -1123000) (1868000 1796000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l2 (345500 455000) (256500 25000)) rect(l2 (345500 455000) (256500 25000))
rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-256500 -146000) (25000 146000))
rect(l2 (-47000 -183500) (75000 75000)) rect(l2 (-47000 -183500) (75000 75000))
@ -137,7 +137,7 @@ layout(
rect(l10 (-57500 -57500) (25000 25000)) rect(l10 (-57500 -57500) (25000 25000))
rect(l11 (-25000 -25000) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000))
) )
net(2 net(2 name($2)
rect(l2 (-148000 463000) (300000 25000)) rect(l2 (-148000 463000) (300000 25000))
) )
net(3 name($5) net(3 name($5)

View File

@ -185,7 +185,7 @@ layout(
rect((-577500 -1123000) (1868000 1796000)) rect((-577500 -1123000) (1868000 1796000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l2 (345500 455000) (256500 25000)) rect(l2 (345500 455000) (256500 25000))
rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-256500 -146000) (25000 146000))
rect(l2 (-47000 -183500) (75000 75000)) rect(l2 (-47000 -183500) (75000 75000))
@ -204,7 +204,7 @@ layout(
rect(l10 (-57500 -57500) (25000 25000)) rect(l10 (-57500 -57500) (25000 25000))
rect(l11 (-25000 -25000) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000))
) )
net(2 net(2 name($2)
rect(l2 (-148000 463000) (300000 25000)) rect(l2 (-148000 463000) (300000 25000))
) )
net(3 name($5) net(3 name($5)

View File

@ -115,7 +115,7 @@ layout(
rect((-577500 -1123000) (1868000 1796000)) rect((-577500 -1123000) (1868000 1796000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l2 (345500 455000) (256500 25000)) rect(l2 (345500 455000) (256500 25000))
rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-256500 -146000) (25000 146000))
rect(l2 (-47000 -183500) (75000 75000)) rect(l2 (-47000 -183500) (75000 75000))
@ -134,7 +134,7 @@ layout(
rect(l10 (-57500 -57500) (25000 25000)) rect(l10 (-57500 -57500) (25000 25000))
rect(l11 (-25000 -25000) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000))
) )
net(2 net(2 name($2)
rect(l2 (-148000 463000) (300000 25000)) rect(l2 (-148000 463000) (300000 25000))
) )
net(3 name($5) net(3 name($5)

View File

@ -188,7 +188,7 @@ layout(
rect((-577500 -1123000) (1868000 1796000)) rect((-577500 -1123000) (1868000 1796000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l2 (345500 455000) (256500 25000)) rect(l2 (345500 455000) (256500 25000))
rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-256500 -146000) (25000 146000))
rect(l2 (-47000 -183500) (75000 75000)) rect(l2 (-47000 -183500) (75000 75000))
@ -207,7 +207,7 @@ layout(
rect(l10 (-57500 -57500) (25000 25000)) rect(l10 (-57500 -57500) (25000 25000))
rect(l11 (-25000 -25000) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000))
) )
net(2 net(2 name($2)
rect(l2 (-148000 463000) (300000 25000)) rect(l2 (-148000 463000) (300000 25000))
) )
net(3 name($5) net(3 name($5)

View File

@ -118,7 +118,7 @@ layout(
rect((-577500 -1123000) (1868000 1796000)) rect((-577500 -1123000) (1868000 1796000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l2 (345500 455000) (256500 25000)) rect(l2 (345500 455000) (256500 25000))
rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-256500 -146000) (25000 146000))
rect(l2 (-47000 -183500) (75000 75000)) rect(l2 (-47000 -183500) (75000 75000))
@ -137,7 +137,7 @@ layout(
rect(l10 (-57500 -57500) (25000 25000)) rect(l10 (-57500 -57500) (25000 25000))
rect(l11 (-25000 -25000) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000))
) )
net(2 net(2 name($2)
rect(l2 (-148000 463000) (300000 25000)) rect(l2 (-148000 463000) (300000 25000))
) )
net(3 name($5) net(3 name($5)

View File

@ -188,7 +188,7 @@ layout(
rect((-577500 -1123000) (1868000 1796000)) rect((-577500 -1123000) (1868000 1796000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l2 (345500 455000) (256500 25000)) rect(l2 (345500 455000) (256500 25000))
rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-256500 -146000) (25000 146000))
rect(l2 (-47000 -183500) (75000 75000)) rect(l2 (-47000 -183500) (75000 75000))
@ -207,7 +207,7 @@ layout(
rect(l10 (-57500 -57500) (25000 25000)) rect(l10 (-57500 -57500) (25000 25000))
rect(l11 (-25000 -25000) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000))
) )
net(2 net(2 name($2)
rect(l9 (348500 26500) (25000 179000)) rect(l9 (348500 26500) (25000 179000))
rect(l9 (-57500 -58000) (90000 90000)) rect(l9 (-57500 -58000) (90000 90000))
rect(l9 (-86000 -288500) (90000 90000)) rect(l9 (-86000 -288500) (90000 90000))
@ -223,7 +223,7 @@ layout(
rect(l14 (186500 -16500) (25000 193000)) rect(l14 (186500 -16500) (25000 193000))
rect(l14 (-87500 -87500) (150000 150000)) rect(l14 (-87500 -87500) (150000 150000))
) )
net(3 net(3 name($3)
rect(l2 (-148000 463000) (300000 25000)) rect(l2 (-148000 463000) (300000 25000))
) )

View File

@ -118,7 +118,7 @@ layout(
rect((-577500 -1123000) (1868000 1796000)) rect((-577500 -1123000) (1868000 1796000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l2 (345500 455000) (256500 25000)) rect(l2 (345500 455000) (256500 25000))
rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-256500 -146000) (25000 146000))
rect(l2 (-47000 -183500) (75000 75000)) rect(l2 (-47000 -183500) (75000 75000))
@ -137,7 +137,7 @@ layout(
rect(l10 (-57500 -57500) (25000 25000)) rect(l10 (-57500 -57500) (25000 25000))
rect(l11 (-25000 -25000) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000))
) )
net(2 net(2 name($2)
rect(l9 (348500 26500) (25000 179000)) rect(l9 (348500 26500) (25000 179000))
rect(l9 (-57500 -58000) (90000 90000)) rect(l9 (-57500 -58000) (90000 90000))
rect(l9 (-86000 -288500) (90000 90000)) rect(l9 (-86000 -288500) (90000 90000))
@ -153,7 +153,7 @@ layout(
rect(l14 (186500 -16500) (25000 193000)) rect(l14 (186500 -16500) (25000 193000))
rect(l14 (-87500 -87500) (150000 150000)) rect(l14 (-87500 -87500) (150000 150000))
) )
net(3 net(3 name($3)
rect(l2 (-148000 463000) (300000 25000)) rect(l2 (-148000 463000) (300000 25000))
) )

View File

@ -44,7 +44,7 @@ layout(
rect((-18500 -14000) (44500 28000)) rect((-18500 -14000) (44500 28000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l1 (6000 -6000) (7000 1000)) rect(l1 (6000 -6000) (7000 1000))
rect(l1 (-1000 0) (1000 12000)) rect(l1 (-1000 0) (1000 12000))
rect(l1 (-1000 0) (5160 1000)) rect(l1 (-1000 0) (5160 1000))

View File

@ -44,7 +44,7 @@ layout(
rect((-18500 -14000) (44500 28000)) rect((-18500 -14000) (44500 28000))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l1 (6000 -6000) (7000 1000)) rect(l1 (6000 -6000) (7000 1000))
rect(l1 (-1000 0) (1000 12000)) rect(l1 (-1000 0) (1000 12000))
rect(l1 (-1000 0) (4550 1000)) rect(l1 (-1000 0) (4550 1000))

View File

@ -29,12 +29,12 @@ D(D$RPP1$1 RPP1
) )
X(A X(A
R((-200 -450) (1750 1350)) R((-200 -450) (1750 1350))
N(1 N(1 I($1)
R(l4 (-150 450) (100 100)) R(l4 (-150 450) (100 100))
R(l3 (-150 -150) (200 500)) R(l3 (-150 -150) (200 500))
R(l1 (-200 -500) (250 200)) R(l1 (-200 -500) (250 200))
) )
N(2 N(2 I($2)
R(l4 (650 450) (100 100)) R(l4 (650 450) (100 100))
R(l4 (-100 -900) (100 100)) R(l4 (-100 -900) (100 100))
R(l3 (-150 200) (200 650)) R(l3 (-150 200) (200 650))
@ -42,7 +42,7 @@ X(A
R(l1 (-250 300) (250 200)) R(l1 (-250 300) (250 200))
R(l1 (-200 -1000) (250 200)) R(l1 (-200 -1000) (250 200))
) )
N(3 N(3 I($3)
R(l4 (1450 -350) (100 100)) R(l4 (1450 -350) (100 100))
) )
P(1) P(1)
@ -60,12 +60,12 @@ X(A
) )
X(TOP X(TOP
R((-50 450) (3800 2600)) R((-50 450) (3800 2600))
N(1 N(1 I($1)
R(l4 (850 2050) (100 100)) R(l4 (850 2050) (100 100))
R(l3 (-150 -150) (500 200)) R(l3 (-150 -150) (500 200))
R(l1 (-500 -250) (200 250)) R(l1 (-500 -250) (200 250))
) )
N(2 N(2 I($2)
R(l4 (850 1250) (100 100)) R(l4 (850 1250) (100 100))
R(l4 (-100 -100) (100 100)) R(l4 (-100 -100) (100 100))
R(l4 (-900 -100) (100 100)) R(l4 (-900 -100) (100 100))
@ -74,14 +74,14 @@ X(TOP
R(l1 (300 -250) (200 300)) R(l1 (300 -250) (200 300))
R(l1 (-1000 -300) (200 250)) R(l1 (-1000 -300) (200 250))
) )
N(3 N(3 I($3)
R(l4 (50 450) (100 100)) R(l4 (50 450) (100 100))
) )
N(4 N(4 I($4)
R(l4 (850 450) (100 100)) R(l4 (850 450) (100 100))
) )
N(5) N(5 I($I2))
N(6) N(6 I($I1))
D(1 D$RPP1 D(1 D$RPP1
Y(800 750) Y(800 750)
E(R 0.555555555556) E(R 0.555555555556)

View File

@ -29,12 +29,12 @@ D(D$RPP1$1 RPP1
) )
X(A X(A
R((-200 -450) (1750 1350)) R((-200 -450) (1750 1350))
N(1 N(1 I($1)
R(l4 (-150 450) (100 100)) R(l4 (-150 450) (100 100))
R(l3 (-150 -150) (200 500)) R(l3 (-150 -150) (200 500))
R(l1 (-200 -500) (250 200)) R(l1 (-200 -500) (250 200))
) )
N(2 N(2 I($2)
R(l4 (650 450) (100 100)) R(l4 (650 450) (100 100))
R(l4 (-100 -900) (100 100)) R(l4 (-100 -900) (100 100))
R(l3 (-150 200) (200 650)) R(l3 (-150 200) (200 650))
@ -42,7 +42,7 @@ X(A
R(l1 (-250 300) (250 200)) R(l1 (-250 300) (250 200))
R(l1 (-200 -1000) (250 200)) R(l1 (-200 -1000) (250 200))
) )
N(3 N(3 I($3)
R(l4 (1450 -350) (100 100)) R(l4 (1450 -350) (100 100))
) )
P(1) P(1)
@ -60,12 +60,12 @@ X(A
) )
X(TOP X(TOP
R((-50 450) (3800 2600)) R((-50 450) (3800 2600))
N(1 N(1 I($1)
R(l4 (850 2050) (100 100)) R(l4 (850 2050) (100 100))
R(l3 (-150 -150) (500 200)) R(l3 (-150 -150) (500 200))
R(l1 (-500 -250) (200 250)) R(l1 (-500 -250) (200 250))
) )
N(2 N(2 I($2)
R(l4 (850 1250) (100 100)) R(l4 (850 1250) (100 100))
R(l4 (-100 -100) (100 100)) R(l4 (-100 -100) (100 100))
R(l4 (-900 -100) (100 100)) R(l4 (-900 -100) (100 100))
@ -74,14 +74,14 @@ X(TOP
R(l1 (300 -250) (200 300)) R(l1 (300 -250) (200 300))
R(l1 (-1000 -300) (200 250)) R(l1 (-1000 -300) (200 250))
) )
N(3 N(3 I($3)
R(l4 (50 450) (100 100)) R(l4 (50 450) (100 100))
) )
N(4 N(4 I($4)
R(l4 (850 450) (100 100)) R(l4 (850 450) (100 100))
) )
N(5) N(5 I($I2))
N(6) N(6 I($I1))
D(1 D$RPP1 D(1 D$RPP1
Y(800 750) Y(800 750)
E(R 0.555555555556) E(R 0.555555555556)

View File

@ -29,12 +29,12 @@ D(D$RPP1$1 RPP1
) )
X(A X(A
R((-200 -450) (1750 1350)) R((-200 -450) (1750 1350))
N(1 N(1 I($1)
R(l4 (-150 450) (100 100)) R(l4 (-150 450) (100 100))
R(l3 (-150 -150) (200 500)) R(l3 (-150 -150) (200 500))
R(l1 (-200 -500) (250 200)) R(l1 (-200 -500) (250 200))
) )
N(2 N(2 I($2)
R(l4 (650 450) (100 100)) R(l4 (650 450) (100 100))
R(l4 (-100 -900) (100 100)) R(l4 (-100 -900) (100 100))
R(l3 (-150 200) (200 650)) R(l3 (-150 200) (200 650))
@ -42,7 +42,7 @@ X(A
R(l1 (-250 300) (250 200)) R(l1 (-250 300) (250 200))
R(l1 (-200 -1000) (250 200)) R(l1 (-200 -1000) (250 200))
) )
N(3 N(3 I($3)
R(l4 (1450 -350) (100 100)) R(l4 (1450 -350) (100 100))
) )
P(1) P(1)
@ -60,12 +60,12 @@ X(A
) )
X(TOP X(TOP
R((-50 450) (3800 2600)) R((-50 450) (3800 2600))
N(1 N(1 I($1)
R(l4 (850 2050) (100 100)) R(l4 (850 2050) (100 100))
R(l3 (-150 -150) (500 200)) R(l3 (-150 -150) (500 200))
R(l1 (-500 -250) (200 250)) R(l1 (-500 -250) (200 250))
) )
N(2 N(2 I($2)
R(l4 (850 1250) (100 100)) R(l4 (850 1250) (100 100))
R(l4 (-100 -100) (100 100)) R(l4 (-100 -100) (100 100))
R(l4 (-900 -100) (100 100)) R(l4 (-900 -100) (100 100))
@ -74,14 +74,14 @@ X(TOP
R(l1 (300 -250) (200 300)) R(l1 (300 -250) (200 300))
R(l1 (-1000 -300) (200 250)) R(l1 (-1000 -300) (200 250))
) )
N(3 N(3 I($3)
R(l4 (50 450) (100 100)) R(l4 (50 450) (100 100))
) )
N(4 N(4 I($4)
R(l4 (850 450) (100 100)) R(l4 (850 450) (100 100))
) )
N(5) N(5 I($I2))
N(6) N(6 I($I1))
D(1 D$RPP1 D(1 D$RPP1
Y(800 750) Y(800 750)
E(R 0.555555555556) E(R 0.555555555556)

View File

@ -53,7 +53,7 @@ J(
) )
X(INV X(INV
R((-1500 -800) (3000 4600)) R((-1500 -800) (3000 4600))
N(1 N(1 I($1)
R(l6 (290 -310) (220 220)) R(l6 (290 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -62,7 +62,7 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l5 (-1375 -925) (775 950)) R(l5 (-1375 -925) (775 950))
) )
N(2 N(2 I($2)
R(l6 (290 2490) (220 220)) R(l6 (290 2490) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -71,12 +71,12 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l2 (-1375 -925) (775 950)) R(l2 (-1375 -925) (775 950))
) )
N(3 N(3 I($3)
R(l3 (-125 -250) (250 2500)) R(l3 (-125 -250) (250 2500))
R(l3 (-250 -3050) (250 1600)) R(l3 (-250 -3050) (250 1600))
R(l3 (-250 1200) (250 1600)) R(l3 (-250 1200) (250 1600))
) )
N(4 N(4 I($4)
R(l6 (-510 -310) (220 220)) R(l6 (-510 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l6 (-220 2180) (220 220)) R(l6 (-220 2180) (220 220))
@ -159,7 +159,7 @@ J(
) )
X(INVCHAIN X(INVCHAIN
R((-90 0) (4475 9200)) R((-90 0) (4475 9200))
N(1 N(1 I($1)
R(l3 (1625 1835) (2160 250)) R(l3 (1625 1835) (2160 250))
R(l3 (-250 0) (250 4990)) R(l3 (-250 0) (250 4990))
R(l3 (-1605 0) (1605 250)) R(l3 (-1605 0) (1605 250))

View File

@ -56,7 +56,7 @@ J(
) )
X(INV X(INV
R((-1500 -800) (3000 4600)) R((-1500 -800) (3000 4600))
N(1 N(1 I($1)
R(l6 (290 -310) (220 220)) R(l6 (290 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -65,7 +65,7 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l5 (-1375 -925) (775 950)) R(l5 (-1375 -925) (775 950))
) )
N(2 N(2 I($2)
R(l6 (290 2490) (220 220)) R(l6 (290 2490) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -74,12 +74,12 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l2 (-1375 -925) (775 950)) R(l2 (-1375 -925) (775 950))
) )
N(3 N(3 I($3)
R(l3 (-125 -250) (250 2500)) R(l3 (-125 -250) (250 2500))
R(l3 (-250 -3050) (250 1600)) R(l3 (-250 -3050) (250 1600))
R(l3 (-250 1200) (250 1600)) R(l3 (-250 1200) (250 1600))
) )
N(4 N(4 I($4)
R(l6 (-510 -310) (220 220)) R(l6 (-510 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l6 (-220 2180) (220 220)) R(l6 (-220 2180) (220 220))

View File

@ -56,7 +56,7 @@ J(
) )
X(INV X(INV
R((-1500 -800) (3000 4600)) R((-1500 -800) (3000 4600))
N(1 N(1 I($1)
R(l6 (290 -310) (220 220)) R(l6 (290 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -65,7 +65,7 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l5 (-1375 -925) (775 950)) R(l5 (-1375 -925) (775 950))
) )
N(2 N(2 I($2)
R(l6 (290 2490) (220 220)) R(l6 (290 2490) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -74,12 +74,12 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l2 (-1375 -925) (775 950)) R(l2 (-1375 -925) (775 950))
) )
N(3 N(3 I($3)
R(l3 (-125 -250) (250 2500)) R(l3 (-125 -250) (250 2500))
R(l3 (-250 -3050) (250 1600)) R(l3 (-250 -3050) (250 1600))
R(l3 (-250 1200) (250 1600)) R(l3 (-250 1200) (250 1600))
) )
N(4 N(4 I($4)
R(l6 (-510 -310) (220 220)) R(l6 (-510 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l6 (-220 2180) (220 220)) R(l6 (-220 2180) (220 220))

View File

@ -68,12 +68,12 @@ layout(
rect((100 10) (340 80)) rect((100 10) (340 80))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l1 (180 60) (90 30)) rect(l1 (180 60) (90 30))
rect(l2 (-160 -20) (90 10)) rect(l2 (-160 -20) (90 10))
rect(l2 (40 -10) (180 10)) rect(l2 (40 -10) (180 10))
) )
net(2 net(2 name($2)
rect(l1 (180 10) (90 30)) rect(l1 (180 10) (90 30))
rect(l2 (-160 -20) (90 10)) rect(l2 (-160 -20) (90 10))
rect(l2 (40 -10) (180 10)) rect(l2 (40 -10) (180 10))

View File

@ -119,7 +119,7 @@ layout(
rect(l2 (-275 -2150) (425 1500)) rect(l2 (-275 -2150) (425 1500))
rect(l2 (-400 -1500) (425 1500)) rect(l2 (-400 -1500) (425 1500))
) )
net(2 net(2 name($2)
rect(l8 (1810 1770) (180 180)) rect(l8 (1810 1770) (180 180))
rect(l8 (-180 370) (180 180)) rect(l8 (-180 370) (180 180))
rect(l8 (-1580 3760) (180 180)) rect(l8 (-1580 3760) (180 180))
@ -146,7 +146,7 @@ layout(
rect(l11 (-1150 -400) (0 0)) rect(l11 (-1150 -400) (0 0))
rect(l6 (-950 860) (425 950)) rect(l6 (-950 860) (425 950))
) )
net(4 net(4 name($4)
rect(l3 (-100 4500) (2600 3500)) rect(l3 (-100 4500) (2600 3500))
) )
net(5 name(b) net(5 name(b)

View File

@ -216,7 +216,7 @@ layout(
rect((-100 400) (5600 7600)) rect((-100 400) (5600 7600))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l11 (3100 2950) (950 300)) rect(l11 (3100 2950) (950 300))
) )
net(2 name(A) net(2 name(A)
@ -226,8 +226,8 @@ layout(
rect(l11 (2400 3100) (0 0)) rect(l11 (2400 3100) (0 0))
) )
net(4 name(SUBSTRATE)) net(4 name(SUBSTRATE))
net(5) net(5 name($I3))
net(6) net(6 name($I1))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(2 name(A)) pin(2 name(A))

View File

@ -53,7 +53,7 @@ J(
) )
X(INV X(INV
R((-1500 -800) (3000 4600)) R((-1500 -800) (3000 4600))
N(1 N(1 I($1)
R(l6 (290 -310) (220 220)) R(l6 (290 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -62,7 +62,7 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l5 (-1375 -925) (775 950)) R(l5 (-1375 -925) (775 950))
) )
N(2 N(2 I($2)
R(l6 (290 2490) (220 220)) R(l6 (290 2490) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -71,12 +71,12 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l2 (-1375 -925) (775 950)) R(l2 (-1375 -925) (775 950))
) )
N(3 N(3 I($3)
R(l3 (-125 -250) (250 2500)) R(l3 (-125 -250) (250 2500))
R(l3 (-250 -3050) (250 1600)) R(l3 (-250 -3050) (250 1600))
R(l3 (-250 1200) (250 1600)) R(l3 (-250 1200) (250 1600))
) )
N(4 N(4 I($4)
R(l6 (-510 -310) (220 220)) R(l6 (-510 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l6 (-220 2180) (220 220)) R(l6 (-220 2180) (220 220))
@ -118,12 +118,12 @@ J(
) )
X(INV2 X(INV2
R((0 0) (5500 4600)) R((0 0) (5500 4600))
N(1) N(1 I($I8))
N(2) N(2 I($I7))
N(3) N(3 I($I6))
N(4) N(4 I($I5))
N(5) N(5 I($I4))
N(6) N(6 I($I2))
P(1) P(1)
P(2) P(2)
P(3) P(3)
@ -163,8 +163,8 @@ J(
N(6 I('8') N(6 I('8')
R(l12 (4410 1920) (0 0)) R(l12 (4410 1920) (0 0))
) )
N(7) N(7 I($I4))
N(8) N(8 I($I2))
P(1 I('3')) P(1 I('3'))
P(2 I('5')) P(2 I('5'))
P(3 I('7')) P(3 I('7'))
@ -198,27 +198,27 @@ J(
R(l3 (-1295 925) (1235 350)) R(l3 (-1295 925) (1235 350))
R(l11 (-910 -150) (0 0)) R(l11 (-910 -150) (0 0))
) )
N(2 N(2 I($2)
R(l3 (445 805) (480 550)) R(l3 (445 805) (480 550))
R(l7 (-435 -365) (220 220)) R(l7 (-435 -365) (220 220))
R(l8 (-1065 -285) (1105 350)) R(l8 (-1065 -285) (1105 350))
) )
N(3 N(3 I($3)
R(l3 (1345 925) (1945 350)) R(l3 (1345 925) (1945 350))
R(l7 (-1885 -285) (220 220)) R(l7 (-1885 -285) (220 220))
R(l8 (-295 -370) (440 520)) R(l8 (-295 -370) (440 520))
) )
N(4 N(4 I($4)
R(l3 (3745 805) (480 550)) R(l3 (3745 805) (480 550))
R(l7 (-435 -365) (220 220)) R(l7 (-435 -365) (220 220))
R(l8 (-1065 -285) (1105 350)) R(l8 (-1065 -285) (1105 350))
) )
N(5 N(5 I($5)
R(l3 (4645 925) (1945 350)) R(l3 (4645 925) (1945 350))
R(l7 (-1885 -285) (220 220)) R(l7 (-1885 -285) (220 220))
R(l8 (-295 -370) (440 520)) R(l8 (-295 -370) (440 520))
) )
N(6 N(6 I($6)
R(l3 (7045 805) (480 550)) R(l3 (7045 805) (480 550))
R(l7 (-435 -365) (220 220)) R(l7 (-435 -365) (220 220))
R(l8 (-1065 -285) (1105 350)) R(l8 (-1065 -285) (1105 350))

View File

@ -216,7 +216,7 @@ layout(
rect((-100 400) (5600 7600)) rect((-100 400) (5600 7600))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(metal1 (3100 2950) (950 300)) rect(metal1 (3100 2950) (950 300))
) )
net(2 name(A) net(2 name(A)
@ -226,8 +226,8 @@ layout(
rect(metal1 (2400 3100) (0 0)) rect(metal1 (2400 3100) (0 0))
) )
net(4 name(SUBSTRATE)) net(4 name(SUBSTRATE))
net(5) net(5 name($I3))
net(6) net(6 name($I1))
# Outgoing pins and their connections to nets # Outgoing pins and their connections to nets
pin(2 name(A)) pin(2 name(A))

View File

@ -54,7 +54,7 @@ J(
) )
X(INV X(INV
R((-1500 -800) (3000 4600)) R((-1500 -800) (3000 4600))
N(1 N(1 I($1)
R(l6 (290 -310) (220 220)) R(l6 (290 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -63,7 +63,7 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l5 (-1375 -925) (775 950)) R(l5 (-1375 -925) (775 950))
) )
N(2 N(2 I($2)
R(l6 (290 2490) (220 220)) R(l6 (290 2490) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -72,12 +72,12 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l2 (-1375 -925) (775 950)) R(l2 (-1375 -925) (775 950))
) )
N(3 N(3 I($3)
R(l3 (-125 -250) (250 2500)) R(l3 (-125 -250) (250 2500))
R(l3 (-250 -3050) (250 1600)) R(l3 (-250 -3050) (250 1600))
R(l3 (-250 1200) (250 1600)) R(l3 (-250 1200) (250 1600))
) )
N(4 N(4 I($4)
R(l6 (-510 -310) (220 220)) R(l6 (-510 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l6 (-220 2180) (220 220)) R(l6 (-220 2180) (220 220))
@ -160,14 +160,14 @@ J(
) )
X(INVCHAIN X(INVCHAIN
R((-915 -15) (10415 9215)) R((-915 -15) (10415 9215))
N(1 N(1 I($1)
R(l3 (7340 1650) (2160 250)) R(l3 (7340 1650) (2160 250))
R(l3 (-250 0) (250 4990)) R(l3 (-250 0) (250 4990))
R(l3 (-1605 0) (1605 250)) R(l3 (-1605 0) (1605 250))
R(l7 (-1545 -250) (240 250)) R(l7 (-1545 -250) (240 250))
R(l8 (-560 -375) (690 510)) R(l8 (-560 -375) (690 510))
) )
N(2 N(2 I($2)
R(l3 (1625 1835) (2160 250)) R(l3 (1625 1835) (2160 250))
R(l3 (-250 0) (250 4990)) R(l3 (-250 0) (250 4990))
R(l3 (-1605 0) (1605 250)) R(l3 (-1605 0) (1605 250))
@ -225,21 +225,21 @@ J(
) )
X(TOP X(TOP
R((-305 350) (15415 9225)) R((-305 350) (15415 9225))
N(1 N(1 I($1)
R(l3 (12950 2130) (2160 250)) R(l3 (12950 2130) (2160 250))
R(l3 (-250 0) (250 4990)) R(l3 (-250 0) (250 4990))
R(l3 (-1605 0) (1605 250)) R(l3 (-1605 0) (1605 250))
R(l7 (-1545 -250) (240 250)) R(l7 (-1545 -250) (240 250))
R(l8 (-560 -375) (690 510)) R(l8 (-560 -375) (690 510))
) )
N(2 N(2 I($2)
R(l3 (12100 7300) (640 530)) R(l3 (12100 7300) (640 530))
R(l7 (-540 -415) (270 250)) R(l7 (-540 -415) (270 250))
R(l8 (-1695 -250) (1695 250)) R(l8 (-1695 -250) (1695 250))
R(l8 (-4075 -5650) (2630 250)) R(l8 (-4075 -5650) (2630 250))
R(l8 (-250 0) (250 5150)) R(l8 (-250 0) (250 5150))
) )
N(3 N(3 I($3)
R(l7 (6465 7325) (220 240)) R(l7 (6465 7325) (220 240))
R(l8 (-4100 -5365) (3125 250)) R(l8 (-4100 -5365) (3125 250))
R(l8 (-250 0) (250 4860)) R(l8 (-250 0) (250 4860))

View File

@ -54,7 +54,7 @@ J(
) )
X(INV X(INV
R((-1500 -800) (3000 4600)) R((-1500 -800) (3000 4600))
N(1 N(1 I($1)
R(l6 (290 -310) (220 220)) R(l6 (290 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -63,7 +63,7 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l5 (-1375 -925) (775 950)) R(l5 (-1375 -925) (775 950))
) )
N(2 N(2 I($2)
R(l6 (290 2490) (220 220)) R(l6 (290 2490) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -72,12 +72,12 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l2 (-1375 -925) (775 950)) R(l2 (-1375 -925) (775 950))
) )
N(3 N(3 I($3)
R(l3 (-125 -250) (250 2500)) R(l3 (-125 -250) (250 2500))
R(l3 (-250 -3050) (250 1600)) R(l3 (-250 -3050) (250 1600))
R(l3 (-250 1200) (250 1600)) R(l3 (-250 1200) (250 1600))
) )
N(4 N(4 I($4)
R(l6 (-510 -310) (220 220)) R(l6 (-510 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l6 (-220 2180) (220 220)) R(l6 (-220 2180) (220 220))
@ -160,14 +160,14 @@ J(
) )
X(INVCHAIN X(INVCHAIN
R((-915 -15) (10415 9215)) R((-915 -15) (10415 9215))
N(1 N(1 I($1)
R(l3 (7340 1650) (2160 250)) R(l3 (7340 1650) (2160 250))
R(l3 (-250 0) (250 4990)) R(l3 (-250 0) (250 4990))
R(l3 (-1605 0) (1605 250)) R(l3 (-1605 0) (1605 250))
R(l7 (-1545 -250) (240 250)) R(l7 (-1545 -250) (240 250))
R(l8 (-560 -375) (690 510)) R(l8 (-560 -375) (690 510))
) )
N(2 N(2 I($2)
R(l3 (1625 1835) (2160 250)) R(l3 (1625 1835) (2160 250))
R(l3 (-250 0) (250 4990)) R(l3 (-250 0) (250 4990))
R(l3 (-1605 0) (1605 250)) R(l3 (-1605 0) (1605 250))
@ -225,21 +225,21 @@ J(
) )
X(TOP X(TOP
R((-305 350) (15415 9225)) R((-305 350) (15415 9225))
N(1 N(1 I($1)
R(l3 (12950 2130) (2160 250)) R(l3 (12950 2130) (2160 250))
R(l3 (-250 0) (250 4990)) R(l3 (-250 0) (250 4990))
R(l3 (-1605 0) (1605 250)) R(l3 (-1605 0) (1605 250))
R(l7 (-1545 -250) (240 250)) R(l7 (-1545 -250) (240 250))
R(l8 (-560 -375) (690 510)) R(l8 (-560 -375) (690 510))
) )
N(2 N(2 I($2)
R(l3 (12100 7300) (640 530)) R(l3 (12100 7300) (640 530))
R(l7 (-540 -415) (270 250)) R(l7 (-540 -415) (270 250))
R(l8 (-1695 -250) (1695 250)) R(l8 (-1695 -250) (1695 250))
R(l8 (-4075 -5650) (2630 250)) R(l8 (-4075 -5650) (2630 250))
R(l8 (-250 0) (250 5150)) R(l8 (-250 0) (250 5150))
) )
N(3 N(3 I($3)
R(l7 (6465 7325) (220 240)) R(l7 (6465 7325) (220 240))
R(l8 (-4100 -5365) (3125 250)) R(l8 (-4100 -5365) (3125 250))
R(l8 (-250 0) (250 4860)) R(l8 (-250 0) (250 4860))

View File

@ -56,7 +56,7 @@ J(
) )
X(INV X(INV
R((-1500 -800) (3000 4600)) R((-1500 -800) (3000 4600))
N(1 N(1 I($1)
R(l6 (290 -310) (220 220)) R(l6 (290 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -65,7 +65,7 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l5 (-1375 -925) (775 950)) R(l5 (-1375 -925) (775 950))
) )
N(2 N(2 I($2)
R(l6 (290 2490) (220 220)) R(l6 (290 2490) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -74,12 +74,12 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l2 (-1375 -925) (775 950)) R(l2 (-1375 -925) (775 950))
) )
N(3 N(3 I($3)
R(l3 (-125 -250) (250 2500)) R(l3 (-125 -250) (250 2500))
R(l3 (-250 -3050) (250 1600)) R(l3 (-250 -3050) (250 1600))
R(l3 (-250 1200) (250 1600)) R(l3 (-250 1200) (250 1600))
) )
N(4 N(4 I($4)
R(l6 (-510 -310) (220 220)) R(l6 (-510 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l6 (-220 2180) (220 220)) R(l6 (-220 2180) (220 220))
@ -162,14 +162,14 @@ J(
) )
X(INVCHAIN X(INVCHAIN
R((-915 -15) (10415 9215)) R((-915 -15) (10415 9215))
N(1 N(1 I($1)
R(l3 (7340 1650) (2160 250)) R(l3 (7340 1650) (2160 250))
R(l3 (-250 0) (250 4990)) R(l3 (-250 0) (250 4990))
R(l3 (-1605 0) (1605 250)) R(l3 (-1605 0) (1605 250))
R(l7 (-1545 -250) (240 250)) R(l7 (-1545 -250) (240 250))
R(l8 (-560 -375) (690 510)) R(l8 (-560 -375) (690 510))
) )
N(2 N(2 I($2)
R(l3 (1625 1835) (2160 250)) R(l3 (1625 1835) (2160 250))
R(l3 (-250 0) (250 4990)) R(l3 (-250 0) (250 4990))
R(l3 (-1605 0) (1605 250)) R(l3 (-1605 0) (1605 250))
@ -228,21 +228,21 @@ J(
) )
X(TOP X(TOP
R((-305 350) (15415 9225)) R((-305 350) (15415 9225))
N(1 N(1 I($1)
R(l3 (12950 2130) (2160 250)) R(l3 (12950 2130) (2160 250))
R(l3 (-250 0) (250 4990)) R(l3 (-250 0) (250 4990))
R(l3 (-1605 0) (1605 250)) R(l3 (-1605 0) (1605 250))
R(l7 (-1545 -250) (240 250)) R(l7 (-1545 -250) (240 250))
R(l8 (-560 -375) (690 510)) R(l8 (-560 -375) (690 510))
) )
N(2 N(2 I($2)
R(l3 (12100 7300) (640 530)) R(l3 (12100 7300) (640 530))
R(l7 (-540 -415) (270 250)) R(l7 (-540 -415) (270 250))
R(l8 (-1695 -250) (1695 250)) R(l8 (-1695 -250) (1695 250))
R(l8 (-4075 -5650) (2630 250)) R(l8 (-4075 -5650) (2630 250))
R(l8 (-250 0) (250 5150)) R(l8 (-250 0) (250 5150))
) )
N(3 N(3 I($3)
R(l7 (6465 7325) (220 240)) R(l7 (6465 7325) (220 240))
R(l8 (-4100 -5365) (3125 250)) R(l8 (-4100 -5365) (3125 250))
R(l8 (-250 0) (250 4860)) R(l8 (-250 0) (250 4860))

View File

@ -53,7 +53,7 @@ J(
) )
X(INV X(INV
R((-1500 -800) (3000 4600)) R((-1500 -800) (3000 4600))
N(1 N(1 I($1)
R(l6 (290 -310) (220 220)) R(l6 (290 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -62,7 +62,7 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l5 (-1375 -925) (775 950)) R(l5 (-1375 -925) (775 950))
) )
N(2 N(2 I($2)
R(l6 (290 2490) (220 220)) R(l6 (290 2490) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l8 (-290 -690) (360 760)) R(l8 (-290 -690) (360 760))
@ -71,12 +71,12 @@ J(
R(l10 (-2025 -775) (3000 900)) R(l10 (-2025 -775) (3000 900))
R(l2 (-1375 -925) (775 950)) R(l2 (-1375 -925) (775 950))
) )
N(3 N(3 I($3)
R(l3 (-125 -250) (250 2500)) R(l3 (-125 -250) (250 2500))
R(l3 (-250 -3050) (250 1600)) R(l3 (-250 -3050) (250 1600))
R(l3 (-250 1200) (250 1600)) R(l3 (-250 1200) (250 1600))
) )
N(4 N(4 I($4)
R(l6 (-510 -310) (220 220)) R(l6 (-510 -310) (220 220))
R(l6 (-220 180) (220 220)) R(l6 (-220 180) (220 220))
R(l6 (-220 2180) (220 220)) R(l6 (-220 2180) (220 220))
@ -159,14 +159,14 @@ J(
) )
X(INVCHAIN X(INVCHAIN
R((-915 -15) (10415 9215)) R((-915 -15) (10415 9215))
N(1 N(1 I($1)
R(l3 (7340 1650) (2160 250)) R(l3 (7340 1650) (2160 250))
R(l3 (-250 0) (250 4990)) R(l3 (-250 0) (250 4990))
R(l3 (-1605 0) (1605 250)) R(l3 (-1605 0) (1605 250))
R(l7 (-1545 -250) (240 250)) R(l7 (-1545 -250) (240 250))
R(l8 (-560 -375) (690 510)) R(l8 (-560 -375) (690 510))
) )
N(2 N(2 I($2)
R(l3 (1625 1835) (2160 250)) R(l3 (1625 1835) (2160 250))
R(l3 (-250 0) (250 4990)) R(l3 (-250 0) (250 4990))
R(l3 (-1605 0) (1605 250)) R(l3 (-1605 0) (1605 250))
@ -225,13 +225,13 @@ J(
) )
X(TOP X(TOP
R((-305 350) (15415 9225)) R((-305 350) (15415 9225))
N(1 N(1 I($1)
R(l10 (3200 4800) (8800 400)) R(l10 (3200 4800) (8800 400))
R(l10 (-5110 -425) (0 0)) R(l10 (-5110 -425) (0 0))
R(l10 (-4295 30) (0 0)) R(l10 (-4295 30) (0 0))
R(l10 (9270 -80) (0 0)) R(l10 (9270 -80) (0 0))
) )
N(2 N(2 I($2)
R(l10 (-305 4435) (250 1220)) R(l10 (-305 4435) (250 1220))
R(l10 (3665 -4655) (2780 400)) R(l10 (3665 -4655) (2780 400))
R(l10 (-2780 6900) (2815 440)) R(l10 (-2780 6900) (2815 440))

View File

@ -133,7 +133,7 @@ layout(
rect(l11 (-300 -300) (400 400)) rect(l11 (-300 -300) (400 400))
text(l12 A (-200 -200)) text(l12 A (-200 -200))
) )
net(3 net(3 name($3)
rect(l8 (1300 300) (200 200)) rect(l8 (1300 300) (200 200))
rect(l8 (-200 -200) (200 200)) rect(l8 (-200 -200) (200 200))
rect(l8 (-200 300) (200 200)) rect(l8 (-200 300) (200 200))

View File

@ -133,7 +133,7 @@ layout(
rect(l11 (-300 -300) (400 400)) rect(l11 (-300 -300) (400 400))
text(l12 A (-200 -200)) text(l12 A (-200 -200))
) )
net(3 net(3 name($3)
rect(l8 (1300 300) (200 200)) rect(l8 (1300 300) (200 200))
rect(l8 (-200 -200) (200 200)) rect(l8 (-200 -200) (200 200))
rect(l8 (-200 300) (200 200)) rect(l8 (-200 300) (200 200))

View File

@ -133,7 +133,7 @@ layout(
rect(l11 (-300 -300) (400 400)) rect(l11 (-300 -300) (400 400))
text(l12 A (-200 -200)) text(l12 A (-200 -200))
) )
net(3 net(3 name($3)
rect(l8 (1300 300) (200 200)) rect(l8 (1300 300) (200 200))
rect(l8 (-200 -200) (200 200)) rect(l8 (-200 -200) (200 200))
rect(l8 (-200 300) (200 200)) rect(l8 (-200 300) (200 200))

View File

@ -133,7 +133,7 @@ layout(
rect(l11 (-300 -300) (400 400)) rect(l11 (-300 -300) (400 400))
text(l12 A (-200 -200)) text(l12 A (-200 -200))
) )
net(3 net(3 name($3)
rect(l8 (1300 300) (200 200)) rect(l8 (1300 300) (200 200))
rect(l8 (-200 -200) (200 200)) rect(l8 (-200 -200) (200 200))
rect(l8 (-200 300) (200 200)) rect(l8 (-200 300) (200 200))

View File

@ -44,7 +44,7 @@ layout(
rect((8285 720) (117975 57350)) rect((8285 720) (117975 57350))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l4 (120580 32490) (220 220)) rect(l4 (120580 32490) (220 220))
rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220))

View File

@ -44,7 +44,7 @@ layout(
rect((8285 720) (117975 57350)) rect((8285 720) (117975 57350))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l4 (120580 32490) (220 220)) rect(l4 (120580 32490) (220 220))
rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220))

View File

@ -44,7 +44,7 @@ layout(
rect((8285 720) (117975 57350)) rect((8285 720) (117975 57350))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l4 (120580 32490) (220 220)) rect(l4 (120580 32490) (220 220))
rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220))

View File

@ -44,7 +44,7 @@ layout(
rect((8285 720) (117975 57350)) rect((8285 720) (117975 57350))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l4 (120580 32490) (220 220)) rect(l4 (120580 32490) (220 220))
rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220))

View File

@ -44,7 +44,7 @@ layout(
rect((8285 720) (117975 57350)) rect((8285 720) (117975 57350))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l4 (120580 32490) (220 220)) rect(l4 (120580 32490) (220 220))
rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220))

View File

@ -44,7 +44,7 @@ layout(
rect((8285 720) (117975 57350)) rect((8285 720) (117975 57350))
# Nets with their geometries # Nets with their geometries
net(1 net(1 name($1)
rect(l4 (120580 32490) (220 220)) rect(l4 (120580 32490) (220 220))
rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220))

Some files were not shown because too many files have changed in this diff Show More