mirror of https://github.com/KLayout/klayout.git
Merge pull request #2257 from KLayout/evaluate_net-enhancements
Evaluate net enhancements
This commit is contained in:
commit
01d2ccbdc5
|
|
@ -407,14 +407,16 @@ void Circuit::join_nets (Net *net, Net *with)
|
|||
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 ()) {
|
||||
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
|
||||
net->set_name (join_names (net->name (), with->name ()));
|
||||
|
||||
|
|
|
|||
|
|
@ -1577,6 +1577,66 @@ connected_clusters<T>::add_connection (typename local_cluster<T>::id_type id, co
|
|||
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>
|
||||
void
|
||||
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];
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
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>
|
||||
|
|
|
|||
|
|
@ -844,6 +844,12 @@ public:
|
|||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
ClusterInstance (size_t id, const db::ClusterInstElement &inst_element)
|
||||
: ClusterInstElement (inst_element), m_id (id)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
ClusterInstance (size_t id)
|
||||
: ClusterInstElement (), m_id (id)
|
||||
{
|
||||
|
|
@ -1255,6 +1261,11 @@ public:
|
|||
*/
|
||||
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
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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 ()
|
||||
|| ! 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;
|
||||
}
|
||||
|
||||
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 ());
|
||||
|
||||
// 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)
|
||||
|
|
@ -1800,40 +1816,91 @@ LayoutToNetlist::compute_area_and_perimeter_of_net_shapes (db::cell_index_type c
|
|||
}
|
||||
|
||||
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);
|
||||
|
||||
db::Point ref;
|
||||
// count vertices and polygons and determine label reference point
|
||||
|
||||
size_t n = 0, npoly = 0;
|
||||
bool any_ref = false;
|
||||
db::EdgeProcessor ep;
|
||||
db::Point ref;
|
||||
|
||||
// count vertices and reserve space
|
||||
size_t n = 0;
|
||||
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);
|
||||
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) {
|
||||
|
||||
size_t p = 0;
|
||||
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 ();
|
||||
db::PolygonRef::polygon_edge_iterator e = pr.begin_edge ();
|
||||
if (! e.at_end ()) {
|
||||
// pick one reference point for the label
|
||||
auto p1 = (rci.trans () * *e).p1 ();
|
||||
if (! any_ref || p1 < ref) {
|
||||
ref = p1;
|
||||
any_ref = true;
|
||||
db::PolygonRef pr = rci->polygon_ref ();
|
||||
|
||||
n += pr.vertices ();
|
||||
++npoly;
|
||||
|
||||
db::PolygonRef::polygon_edge_iterator e = pr.begin_edge ();
|
||||
if (! e.at_end ()) {
|
||||
// pick one reference point for the label
|
||||
auto p1 = (rci.trans () * *e).p1 ();
|
||||
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);
|
||||
db::PolygonGenerator pg (sg, false);
|
||||
db::SimpleMerge op;
|
||||
ep.process (pg, op);
|
||||
if (n == 0) {
|
||||
|
||||
// nothing to do ...
|
||||
|
||||
} 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;
|
||||
}
|
||||
|
|
@ -2017,7 +2084,9 @@ db::Region LayoutToNetlist::antenna_check (const db::Region &gate, double gate_a
|
|||
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) {
|
||||
|
||||
|
|
@ -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_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) {
|
||||
if (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);
|
||||
|
||||
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) {
|
||||
|
||||
|
|
@ -2113,9 +2183,9 @@ LayoutToNetlist::measure_net (const db::Region &primary, const std::map<std::str
|
|||
eval.reset (*cid, *c);
|
||||
compiled_expr.execute ();
|
||||
|
||||
if (! eval.skip ()) {
|
||||
if (! eval.copy_layers ().empty ()) {
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* @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:
|
||||
// no copying
|
||||
|
|
|
|||
|
|
@ -188,7 +188,7 @@ namespace db
|
|||
* scale(<mag>) - magnification (default is 1) [short key: S]
|
||||
*
|
||||
* [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]:
|
||||
* description(<name>) - message text [short key: B]
|
||||
|
|
@ -199,6 +199,9 @@ namespace db
|
|||
* [message-cell]:
|
||||
* cell(<name>) - message cell [short key: C]
|
||||
*
|
||||
* [message-net]:
|
||||
* net(<name>) - message net name [short key: N]
|
||||
*
|
||||
* [message-category]:
|
||||
* cat(<name> <name>?) - message category with optional description [short key: X]
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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;
|
||||
|
||||
Brace br (this);
|
||||
|
|
@ -269,6 +281,8 @@ void LayoutToNetlistStandardReader::read_message_entry (db::LogEntryData &data)
|
|||
// continue
|
||||
} else if (read_message_cell (cell_name)) {
|
||||
// continue
|
||||
} else if (read_message_net (net_name)) {
|
||||
// continue
|
||||
} else if (read_message_cat (category_name, category_description)) {
|
||||
// continue
|
||||
} else if (read_message_geometry (geometry)) {
|
||||
|
|
@ -282,6 +296,7 @@ void LayoutToNetlistStandardReader::read_message_entry (db::LogEntryData &data)
|
|||
data.set_severity (severity);
|
||||
data.set_message (msg);
|
||||
data.set_cell_name (cell_name);
|
||||
data.set_net_name (net_name);
|
||||
data.set_category_description (category_description);
|
||||
data.set_category_name (category_name);
|
||||
data.set_geometry (geometry);
|
||||
|
|
|
|||
|
|
@ -164,6 +164,7 @@ private:
|
|||
db::Point read_point ();
|
||||
void read_message_entry (db::LogEntryData &data);
|
||||
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_cat (std::string &category_name, std::string &category_description);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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 ());
|
||||
}
|
||||
|
||||
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 ()) {
|
||||
TokenizedOutput o (stream, Keys::cat_key, true);
|
||||
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 << tl::to_string (id);
|
||||
if (! net.name ().empty ()) {
|
||||
TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.name ());
|
||||
} else if (net.id () != id) {
|
||||
TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.expanded_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 ());
|
||||
|
||||
*outp << endl;
|
||||
|
||||
|
|
@ -740,11 +741,10 @@ void std_writer_impl<Keys>::write (TokenizedOutput &stream, const db::Net &net,
|
|||
if (! outp) {
|
||||
|
||||
outp.reset (new TokenizedOutput (stream, Keys::net_key));
|
||||
*outp << tl::to_string (id);
|
||||
|
||||
if (! net.name ().empty ()) {
|
||||
TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.name ());
|
||||
}
|
||||
*outp << tl::to_string (id);
|
||||
// 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 ()) {
|
||||
*outp << endl;
|
||||
|
|
|
|||
|
|
@ -81,19 +81,25 @@ static LogEntryStringRepository s_strings;
|
|||
// LogEntryData implementation
|
||||
|
||||
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 ..
|
||||
}
|
||||
|
||||
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 ..
|
||||
}
|
||||
|
||||
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 ..
|
||||
}
|
||||
|
|
@ -104,6 +110,7 @@ LogEntryData::operator== (const LogEntryData &other) const
|
|||
return m_severity == other.m_severity &&
|
||||
m_message == other.m_message &&
|
||||
m_cell_name == other.m_cell_name &&
|
||||
m_net_name == other.m_net_name &&
|
||||
m_geometry == other.m_geometry &&
|
||||
m_category_name == other.m_category_name &&
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
LogEntryData::to_string (bool with_geometry) const
|
||||
{
|
||||
|
|
@ -179,10 +198,24 @@ LogEntryData::to_string (bool with_geometry) const
|
|||
}
|
||||
}
|
||||
|
||||
if (m_cell_name != 0) {
|
||||
res += tl::to_string (tr ("In cell "));
|
||||
res += cell_name ();
|
||||
res += ": ";
|
||||
if (m_net_name != 0) {
|
||||
if (m_cell_name != 0) {
|
||||
res += tl::to_string (tr ("In net "));
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -68,6 +68,11 @@ public:
|
|||
*/
|
||||
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
|
||||
*/
|
||||
|
|
@ -158,6 +163,16 @@ public:
|
|||
*/
|
||||
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
|
||||
*/
|
||||
|
|
@ -166,6 +181,7 @@ public:
|
|||
private:
|
||||
Severity m_severity;
|
||||
string_id_type m_cell_name;
|
||||
string_id_type m_net_name;
|
||||
string_id_type m_message;
|
||||
db::DPolygon m_geometry;
|
||||
string_id_type m_category_name, m_category_description;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
if (args.size () != 1) {
|
||||
throw tl::EvalError (tl::to_string (tr ("'skip' function takes one argument (flag)")), context);
|
||||
bool flag = true;
|
||||
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:
|
||||
|
|
@ -461,10 +580,11 @@ private:
|
|||
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)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
m_copy_merge = false;
|
||||
m_copy_max_polygons = std::numeric_limits<size_t>::max ();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -486,15 +606,24 @@ MeasureNetEval::init ()
|
|||
{
|
||||
define_function ("put", new NetPutFunction (this));
|
||||
define_function ("skip", new NetSkipFunction (this));
|
||||
define_function ("copy", new NetCopyFunction (this));
|
||||
define_function ("area", new NetAreaFunction (this));
|
||||
define_function ("perimeter", new NetPerimeterFunction (this));
|
||||
define_function ("net", new NetFunction (this));
|
||||
define_function ("db", new NetDbFunction (this));
|
||||
}
|
||||
|
||||
void
|
||||
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_cluster_id = cluster_id;
|
||||
m_area_and_perimeter_cache.clear ();
|
||||
|
|
@ -553,9 +682,18 @@ MeasureNetEval::perimeter_func (int layer_index) const
|
|||
}
|
||||
|
||||
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
|
||||
|
|
@ -586,4 +724,10 @@ MeasureNetEval::net_func () const
|
|||
}
|
||||
}
|
||||
|
||||
tl::Variant
|
||||
MeasureNetEval::db_func () const
|
||||
{
|
||||
return tl::Variant::make_variant_ref (mp_l2n);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ class DB_PUBLIC MeasureNetEval
|
|||
: public tl::Eval
|
||||
{
|
||||
public:
|
||||
MeasureNetEval (const db::LayoutToNetlist *l2n, double dbu);
|
||||
MeasureNetEval (db::LayoutToNetlist *l2n, double dbu);
|
||||
|
||||
void set_primary_layer (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;
|
||||
|
||||
bool skip () const
|
||||
{
|
||||
return m_skip;
|
||||
}
|
||||
const std::vector<unsigned int> copy_layers () const { return m_copy_layers; }
|
||||
size_t copy_max_polygons () const { return m_copy_max_polygons; }
|
||||
bool copy_merge () const { return m_copy_merge; }
|
||||
|
||||
db::PropertiesSet &prop_set_out () const
|
||||
{
|
||||
|
|
@ -145,7 +144,9 @@ private:
|
|||
friend class NetAreaFunction;
|
||||
friend class NetPerimeterFunction;
|
||||
friend class NetFunction;
|
||||
friend class NetDbFunction;
|
||||
friend class NetSkipFunction;
|
||||
friend class NetCopyFunction;
|
||||
|
||||
struct AreaAndPerimeter
|
||||
{
|
||||
|
|
@ -153,10 +154,12 @@ private:
|
|||
double area, perimeter;
|
||||
};
|
||||
|
||||
const db::LayoutToNetlist *mp_l2n;
|
||||
db::LayoutToNetlist *mp_l2n;
|
||||
double m_dbu;
|
||||
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::cell_index_type m_cell_index;
|
||||
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;
|
||||
|
||||
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;
|
||||
tl::Variant area_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 db_func () const;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 ())) {
|
||||
// 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
|
||||
can_drop = true;
|
||||
} 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; ) {
|
||||
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;
|
||||
}
|
||||
if (j == pi2) {
|
||||
|
|
|
|||
|
|
@ -1232,11 +1232,13 @@ Class<db::LayoutToNetlist> decl_dbLayoutToNetlist ("db", "LayoutToNetlist",
|
|||
"arbitrary values without having to encode them into the expression string.\n"
|
||||
"\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"
|
||||
"\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"
|
||||
"The expression may use the following functions:\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(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 '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 'db': the \\LayoutToDatabase object the netlist lives in @/li\n"
|
||||
"@/ul\n"
|
||||
"\n"
|
||||
"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."
|
||||
"\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
|
||||
gsi::method ("make_soft_connection_diodes=", &db::LayoutToNetlist::set_make_soft_connection_diodes, gsi::arg ("flag"), "@hide") +
|
||||
|
|
|
|||
|
|
@ -23,11 +23,53 @@
|
|||
#include "gsiDecl.h"
|
||||
#include "gsiEnums.h"
|
||||
#include "dbLog.h"
|
||||
#include "dbNet.h"
|
||||
#include "dbCircuit.h"
|
||||
|
||||
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",
|
||||
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,
|
||||
"@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 "
|
||||
"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,
|
||||
"@brief Gets the geometry.\n"
|
||||
"See \\geometry= for more details."
|
||||
|
|
|
|||
|
|
@ -3388,7 +3388,112 @@ TEST(14_JoinNets)
|
|||
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::LayerMap lmap;
|
||||
|
|
@ -3463,6 +3568,21 @@ TEST(15_MeasureNet)
|
|||
unsigned int l102 = ly.get_layer (db::LayerProperties (102, 0));
|
||||
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
|
||||
|
||||
std::string au = tl::testdata ();
|
||||
|
|
@ -3472,3 +3592,4 @@ TEST(15_MeasureNet)
|
|||
db::compare_layouts (_this, ly, au, db::NoNormalization);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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)");
|
||||
}
|
||||
|
||||
// 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
|
||||
TEST(200)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
</p><p>
|
||||
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
|
||||
certain nets or attach properties to the shapes during the evaluation.
|
||||
output. It is possible to customize the output further: you can
|
||||
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>
|
||||
Using the "put" function inside the expression, properties can be
|
||||
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
|
||||
antenna check for example.
|
||||
</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
|
||||
to encode variable values into the expression. For this, use the
|
||||
'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>
|
||||
<ul>
|
||||
<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>"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>
|
||||
|
|
@ -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
|
||||
dictionary.
|
||||
</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" && 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
|
||||
attaches the value as a property with name 'AR' to the shapes, copied from the 'gate' layer:
|
||||
</p><p>
|
||||
|
|
|
|||
|
|
@ -780,9 +780,15 @@ module DRC
|
|||
# The expression needs to be written in KLayout expression notations.
|
||||
#
|
||||
# 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
|
||||
# certain nets or attach properties to the shapes during the evaluation.
|
||||
#
|
||||
# output. It is possible to customize the output further: you can
|
||||
# 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
|
||||
# attached to the output shapes. The properties can be computed using
|
||||
# a number of net attributes - area and perimeter for example.
|
||||
|
|
@ -791,9 +797,6 @@ module DRC
|
|||
# 'net' function. This allows implementing a more elaborate
|
||||
# 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
|
||||
# to encode variable values into the expression. For this, use the
|
||||
# 'variables' argument and pass a hash with names and values. Each of
|
||||
|
|
@ -804,7 +807,9 @@ module DRC
|
|||
#
|
||||
# @ul
|
||||
# @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 "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
|
||||
|
|
@ -815,6 +820,46 @@ module DRC
|
|||
# Here, 'symbol' is the name given to the secondary layer in the secondary layer
|
||||
# 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
|
||||
# attaches the value as a property with name 'AR' to the shapes, copied from the 'gate' layer:
|
||||
#
|
||||
|
|
|
|||
|
|
@ -2076,3 +2076,35 @@ TEST(146d_edges_and_corners)
|
|||
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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -157,14 +157,9 @@ TextService::get_text () const
|
|||
void
|
||||
TextService::do_finish_edit ()
|
||||
{
|
||||
get_edit_layer ();
|
||||
|
||||
if (manager ()) {
|
||||
manager ()->transaction (tl::to_string (tr ("Create text")));
|
||||
}
|
||||
cell ().shapes (layer ()).insert (get_text ());
|
||||
if (manager ()) {
|
||||
manager ()->commit ();
|
||||
{
|
||||
db::Transaction transaction (manager (), tl::to_string (tr ("Create text")));
|
||||
cell ().shapes (layer ()).insert (get_text ());
|
||||
}
|
||||
|
||||
commit_recent ();
|
||||
|
|
|
|||
|
|
@ -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 <>
|
||||
struct test_arg_func<gsi::ObjectType>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -5608,7 +5608,7 @@ LayoutViewBase::paste ()
|
|||
|
||||
db::DBox sel_bbox = selection_bbox ();
|
||||
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
|
||||
pan_center (sel_bbox.center ());
|
||||
} else if (m_paste_display_mode == 2) {
|
||||
|
|
|
|||
|
|
@ -816,15 +816,31 @@ NetlistBrowserPage::log_selection_changed ()
|
|||
|
||||
QModelIndexList selection = log_view->selectionModel ()->selectedIndexes ();
|
||||
for (QModelIndexList::const_iterator i = selection.begin (); i != selection.end (); ++i) {
|
||||
if (i->column () == 0) {
|
||||
const db::LogEntryData *le = model->log_entry (*i);
|
||||
if (le && le->geometry () != db::DPolygon () && ! le->cell_name ().empty ()) {
|
||||
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 ()));
|
||||
}
|
||||
|
||||
if (i->column () != 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
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 ();
|
||||
|
|
@ -1291,6 +1307,7 @@ NetlistBrowserPage::clear_highlights ()
|
|||
m_current_path = lay::NetlistObjectsPath ();
|
||||
m_selected_paths.clear ();
|
||||
m_markers.clear ();
|
||||
m_net_markers.clear ();
|
||||
|
||||
update_highlights ();
|
||||
}
|
||||
|
|
@ -1350,6 +1367,31 @@ bbox_for_circuit (const db::Layout *layout, const db::Circuit *circuit)
|
|||
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
|
||||
NetlistBrowserPage::adjust_view ()
|
||||
{
|
||||
|
|
@ -1425,22 +1467,7 @@ NetlistBrowserPage::adjust_view ()
|
|||
|
||||
} else if (net) {
|
||||
|
||||
db::cell_index_type cell_index = net->circuit ()->cell_index ();
|
||||
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;
|
||||
|
||||
}
|
||||
ebox += bbox_for_net (mp_database.get (), circuit, net);
|
||||
|
||||
} else if (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 ()) {
|
||||
|
||||
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
|
||||
|
||||
// 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 ());
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
} 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;
|
||||
}
|
||||
} 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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) {
|
||||
|
||||
// computes the transformation supplied by the path
|
||||
|
|
|
|||
|
|
@ -246,6 +246,7 @@ private:
|
|||
lay::NetlistObjectsPath m_current_path;
|
||||
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 *, const db::Net *> > m_net_markers;
|
||||
lay::NetInfoDialog *mp_info_dialog;
|
||||
tl::DeferredMethod<NetlistBrowserPage> dm_update_highlights;
|
||||
tl::DeferredMethod<NetlistBrowserPage> dm_rerun_macro;
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ TEST(16_private)
|
|||
TEST(17_private)
|
||||
{
|
||||
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)
|
||||
|
|
@ -172,12 +172,12 @@ TEST(19_private)
|
|||
TEST(20_private)
|
||||
{
|
||||
// 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)
|
||||
{
|
||||
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
|
||||
|
|
|
|||
|
|
@ -3993,9 +3993,20 @@ Eval::eval_atomic (ExpressionParserContext &ex, std::unique_ptr<ExpressionNode>
|
|||
|
||||
do {
|
||||
|
||||
std::unique_ptr<ExpressionNode> v;
|
||||
eval_top (ex, v);
|
||||
n->add_child (v.release ());
|
||||
tl::Extractor exn = ex;
|
||||
std::string name;
|
||||
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 (")")) {
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -46,78 +46,94 @@ namespace tl
|
|||
* - 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>
|
||||
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:
|
||||
class const_iterator;
|
||||
|
||||
class 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;
|
||||
};
|
||||
typedef slist_node_type<T> node_type;
|
||||
typedef T value_type;
|
||||
typedef slist_const_iterator<T> const_iterator;
|
||||
typedef slist_iterator<T> iterator;
|
||||
|
||||
slist ()
|
||||
: mp_first (0), mp_last (0), m_size (0)
|
||||
|
|
@ -292,6 +308,15 @@ public:
|
|||
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:
|
||||
node_type *mp_first, *mp_last;
|
||||
size_t m_size;
|
||||
|
|
|
|||
|
|
@ -105,6 +105,16 @@ TEST(1_Basic)
|
|||
EXPECT_EQ (l2s (l2), "17,42");
|
||||
l2.pop_front ();
|
||||
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_front (MyClass1 (1));
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -113,7 +113,7 @@ circuit(INV2
|
|||
rect((-1700 -1640) (3100 6220))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(nwell (-1400 1800) (2800 2780))
|
||||
rect(diff_cont (-1510 -650) (220 220))
|
||||
rect(ntie (-510 -450) (800 680))
|
||||
|
|
@ -126,7 +126,7 @@ circuit(INV2
|
|||
rect(poly_lbl (-526 -1801) (2 2))
|
||||
rect(poly_cont (-831 -111) (220 220))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect(poly (275 -250) (250 2500))
|
||||
rect(poly (-305 -1430) (360 360))
|
||||
rect(poly (-305 820) (250 1600))
|
||||
|
|
@ -257,13 +257,13 @@ circuit(INV2PAIR
|
|||
|
||||
# Nets with their geometries
|
||||
net(1 name(BULK))
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(diff_cont (3430 3290) (220 220))
|
||||
rect(diff_cont (-220 180) (220 220))
|
||||
rect(diff_cont (-220 -3420) (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 (-220 180) (220 220))
|
||||
rect(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -277,7 +277,7 @@ circuit(INV2PAIR
|
|||
rect(metal1 (-3000 -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 (-220 180) (220 220))
|
||||
rect(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -291,20 +291,20 @@ circuit(INV2PAIR
|
|||
rect(metal1 (-3000 -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 (-220 -620) (220 220))
|
||||
rect(diff_cont (-220 -2620) (220 220))
|
||||
rect(diff_cont (-220 -620) (220 220))
|
||||
)
|
||||
net(6)
|
||||
net(7
|
||||
net(6 name($6))
|
||||
net(7 name($7)
|
||||
rect(diff_cont (5030 3690) (220 220))
|
||||
rect(diff_cont (-220 -620) (220 220))
|
||||
rect(diff_cont (-220 -2620) (220 220))
|
||||
rect(diff_cont (-220 -620) (220 220))
|
||||
)
|
||||
net(8)
|
||||
net(8 name($8))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(BULK))
|
||||
|
|
@ -507,25 +507,25 @@ circuit(RINGO
|
|||
rect(metal1 (-360 -760) (360 760))
|
||||
rect(metal2_lbl (-21301 -381) (2 2))
|
||||
)
|
||||
net(5
|
||||
net(5 name($5)
|
||||
rect(diff_cont (3330 2890) (220 220))
|
||||
rect(diff_cont (-220 -620) (220 220))
|
||||
rect(diff_cont (-220 -2620) (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 (-220 -620) (220 220))
|
||||
rect(diff_cont (-220 -2620) (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 (-220 -620) (220 220))
|
||||
rect(diff_cont (-220 -2620) (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 (-220 -620) (220 220))
|
||||
rect(diff_cont (-220 -2620) (220 220))
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ device(D$NMOS$3 NMOS
|
|||
circuit(INV2X
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect($3 (-125 700) (250 1500))
|
||||
rect($3 (-125 -1000) (800 500))
|
||||
rect($3 (-125 -1000) (250 1500))
|
||||
|
|
@ -140,7 +140,7 @@ circuit(INV2X
|
|||
rect($3 (550 -4500) (250 1600))
|
||||
rect($3 (-1050 -1600) (250 1600))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect($4 (1090 2590) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
rect($4 (-1820 -620) (220 220))
|
||||
|
|
@ -155,7 +155,7 @@ circuit(INV2X
|
|||
rect($1 (-975 -1075) (525 950))
|
||||
rect($1 (-2100 -950) (525 950))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect($4 (1090 -310) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
rect($4 (-1820 -620) (220 220))
|
||||
|
|
@ -170,7 +170,7 @@ circuit(INV2X
|
|||
rect($2 (-975 -1075) (525 950))
|
||||
rect($2 (-2100 -950) (525 950))
|
||||
)
|
||||
net(4
|
||||
net(4 name($4)
|
||||
rect($4 (290 2590) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
|
|
@ -238,7 +238,7 @@ circuit(INV2X
|
|||
circuit(NAND1X
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect($4 (290 2590) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
|
|
@ -254,7 +254,7 @@ circuit(NAND1X
|
|||
rect($1 (-1255 2045) (550 950))
|
||||
rect($2 (250 -3850) (525 950))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect($4 (1090 2590) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
rect($4 (-1820 -620) (220 220))
|
||||
|
|
@ -269,7 +269,7 @@ circuit(NAND1X
|
|||
rect($1 (-975 -1075) (525 950))
|
||||
rect($1 (-2100 -950) (525 950))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect($4 (-510 -310) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
rect($6 (-290 -690) (360 760))
|
||||
|
|
@ -278,17 +278,17 @@ circuit(NAND1X
|
|||
rect($8 (-810 -510) (3000 1200))
|
||||
rect($2 (-2550 -1075) (525 950))
|
||||
)
|
||||
net(4
|
||||
net(4 name($4)
|
||||
rect($3 (-125 700) (250 1500))
|
||||
rect($3 (-250 -100) (250 1600))
|
||||
rect($3 (-250 -4500) (250 1600))
|
||||
)
|
||||
net(5
|
||||
net(5 name($5)
|
||||
rect($3 (675 700) (250 1500))
|
||||
rect($3 (-250 -100) (250 1600))
|
||||
rect($3 (-250 -4500) (250 1600))
|
||||
)
|
||||
net(6
|
||||
net(6 name($6)
|
||||
rect($4 (290 -310) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
|
|
@ -359,7 +359,7 @@ circuit(NAND1X
|
|||
circuit(INV2ALT
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect($3 (675 600) (250 2300))
|
||||
rect($3 (-250 0) (1050 200))
|
||||
rect($3 (-1725 -1900) (800 500))
|
||||
|
|
@ -370,7 +370,7 @@ circuit(INV2ALT
|
|||
rect($3 (-2400 3350) (1600 250))
|
||||
rect($3 (-1825 -2325) (250 1600))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect($4 (290 -310) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
rect($4 (-220 2280) (220 220))
|
||||
|
|
@ -390,7 +390,7 @@ circuit(INV2ALT
|
|||
rect($2 (575 -2550) (950 525))
|
||||
rect($2 (-2050 -1825) (525 950))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect($4 (990 4590) (220 220))
|
||||
rect($4 (-620 -220) (220 220))
|
||||
rect($4 (-1320 -2220) (220 220))
|
||||
|
|
@ -405,7 +405,7 @@ circuit(INV2ALT
|
|||
rect($1 (625 2125) (950 525))
|
||||
rect($1 (-2025 -2525) (525 950))
|
||||
)
|
||||
net(4
|
||||
net(4 name($4)
|
||||
rect($4 (1390 190) (220 220))
|
||||
rect($4 (180 -220) (220 220))
|
||||
rect($4 (-2520 -720) (220 220))
|
||||
|
|
@ -471,7 +471,7 @@ circuit(INV2ALT
|
|||
circuit(RINGO
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect($3 (1700 1100) (1300 400))
|
||||
rect($4 (-2710 1090) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
|
|
@ -484,7 +484,7 @@ circuit(RINGO
|
|||
rect($5 (1290 890) (200 200))
|
||||
rect($6 (-1500 -300) (1600 400))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect($3 (4700 1100) (1300 400))
|
||||
rect($4 (-2710 1090) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
|
|
@ -497,7 +497,7 @@ circuit(RINGO
|
|||
rect($5 (1290 890) (200 200))
|
||||
rect($6 (-1500 -300) (1600 400))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect($3 (15000 1100) (1300 400))
|
||||
rect($4 (-4910 -1810) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
|
|
@ -510,7 +510,7 @@ circuit(RINGO
|
|||
rect($5 (3190 -2810) (200 200))
|
||||
rect($6 (-2400 -300) (2500 400))
|
||||
)
|
||||
net(4
|
||||
net(4 name($4)
|
||||
rect($3 (18000 1100) (1300 400))
|
||||
rect($4 (-2710 1090) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
|
|
@ -523,7 +523,7 @@ circuit(RINGO
|
|||
rect($5 (1290 890) (200 200))
|
||||
rect($6 (-1500 -300) (1600 400))
|
||||
)
|
||||
net(5
|
||||
net(5 name($5)
|
||||
rect($3 (21000 1100) (1300 400))
|
||||
rect($4 (-2710 1090) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
|
|
@ -536,7 +536,7 @@ circuit(RINGO
|
|||
rect($5 (1290 890) (200 200))
|
||||
rect($6 (-1500 -300) (1600 400))
|
||||
)
|
||||
net(6
|
||||
net(6 name($6)
|
||||
rect($3 (24000 1100) (1300 400))
|
||||
rect($4 (-2710 1090) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
|
|
@ -549,7 +549,7 @@ circuit(RINGO
|
|||
rect($5 (1290 890) (200 200))
|
||||
rect($6 (-1500 -300) (1600 400))
|
||||
)
|
||||
net(7
|
||||
net(7 name($7)
|
||||
rect($3 (27000 1100) (1300 400))
|
||||
rect($4 (-2710 1090) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
|
|
@ -583,7 +583,7 @@ circuit(RINGO
|
|||
rect($8 (-31600 -400) (400 900))
|
||||
rect($11 (16399 -701) (2 2))
|
||||
)
|
||||
net(9
|
||||
net(9 name($9)
|
||||
rect($3 (-1300 900) (1300 400))
|
||||
rect($4 (-2710 1290) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
|
|
@ -598,7 +598,7 @@ circuit(RINGO
|
|||
rect($3 (-4000 1200) (875 500))
|
||||
rect($9 (-476 -201) (2 2))
|
||||
)
|
||||
net(11
|
||||
net(11 name($11)
|
||||
rect($3 (9800 1100) (1300 400))
|
||||
rect($4 (-4810 1090) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ circuit(INV2
|
|||
rect($9 (-526 -1801) (2 2))
|
||||
rect($5 (-831 -111) (220 220))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect($3 (275 -250) (250 2500))
|
||||
rect($3 (-305 -1430) (360 360))
|
||||
rect($3 (-305 820) (250 1600))
|
||||
|
|
@ -144,7 +144,7 @@ circuit(INV2
|
|||
rect($1 (-276 524) (525 950))
|
||||
rect($2 (-525 -3750) (525 950))
|
||||
)
|
||||
net(4
|
||||
net(4 name($4)
|
||||
rect($4 (-110 -310) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
rect($4 (-220 -220) (220 220))
|
||||
|
|
@ -156,7 +156,7 @@ circuit(INV2
|
|||
rect($8 (-1525 -775) (2800 900))
|
||||
rect($2 (-1675 -925) (550 950))
|
||||
)
|
||||
net(5
|
||||
net(5 name($5)
|
||||
rect($4 (-110 2490) (220 220))
|
||||
rect($4 (-220 180) (220 220))
|
||||
rect($4 (-220 -220) (220 220))
|
||||
|
|
@ -367,55 +367,55 @@ circuit(RINGO
|
|||
rect($6 (-360 -760) (360 760))
|
||||
rect($11 (-23941 -381) (2 2))
|
||||
)
|
||||
net(4
|
||||
net(4 name($4)
|
||||
rect($4 (690 2890) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
rect($4 (-220 -2620) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
)
|
||||
net(5
|
||||
net(5 name($5)
|
||||
rect($4 (21810 2890) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
rect($4 (-220 -2620) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
)
|
||||
net(6
|
||||
net(6 name($6)
|
||||
rect($4 (19170 2890) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
rect($4 (-220 -2620) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
)
|
||||
net(7
|
||||
net(7 name($7)
|
||||
rect($4 (16530 2890) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
rect($4 (-220 -2620) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
)
|
||||
net(8
|
||||
net(8 name($8)
|
||||
rect($4 (13890 2890) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
rect($4 (-220 -2620) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
)
|
||||
net(9
|
||||
net(9 name($9)
|
||||
rect($4 (11250 2890) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
rect($4 (-220 -2620) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
)
|
||||
net(10
|
||||
net(10 name($10)
|
||||
rect($4 (8610 2890) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
rect($4 (-220 -2620) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
)
|
||||
net(11
|
||||
net(11 name($11)
|
||||
rect($4 (5970 2890) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
rect($4 (-220 -2620) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
)
|
||||
net(12
|
||||
net(12 name($12)
|
||||
rect($4 (3330 2890) (220 220))
|
||||
rect($4 (-220 -620) (220 220))
|
||||
rect($4 (-220 -2620) (220 220))
|
||||
|
|
|
|||
|
|
@ -333,7 +333,7 @@ circuit(TOP
|
|||
rect(l15 (-980 -270) (1080 370))
|
||||
rect(l16 (-540 -190) (0 0))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect(l11 (-5830 13120) (170 170))
|
||||
rect(l11 (-170 -850) (170 170))
|
||||
rect(l11 (-170 170) (170 170))
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ circuit(INV2
|
|||
text(poly_lbl IN (-525 -1800))
|
||||
rect(poly_cont (-830 -110) (220 220))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(poly (275 -250) (250 2500))
|
||||
rect(poly (-305 -1430) (360 360))
|
||||
rect(poly (-305 820) (250 1600))
|
||||
|
|
@ -127,7 +127,7 @@ circuit(INV2
|
|||
rect(psd (-275 525) (525 950))
|
||||
rect(nsd (-525 -3750) (525 950))
|
||||
)
|
||||
net(4
|
||||
net(4 name($4)
|
||||
rect(diff_cont (-110 -310) (220 220))
|
||||
rect(diff_cont (-220 180) (220 220))
|
||||
rect(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -139,7 +139,7 @@ circuit(INV2
|
|||
rect(metal2 (-1525 -775) (2800 900))
|
||||
rect(nsd (-1675 -925) (550 950))
|
||||
)
|
||||
net(5
|
||||
net(5 name($5)
|
||||
rect(diff_cont (-110 2490) (220 220))
|
||||
rect(diff_cont (-220 180) (220 220))
|
||||
rect(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -234,24 +234,24 @@ circuit(RINGO
|
|||
net(4 name(VDD)
|
||||
text(metal2_lbl VDD (0 2800))
|
||||
)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(8)
|
||||
net(9)
|
||||
net(10)
|
||||
net(11)
|
||||
net(12)
|
||||
net(13)
|
||||
net(14)
|
||||
net(15)
|
||||
net(16)
|
||||
net(17)
|
||||
net(18)
|
||||
net(19)
|
||||
net(20)
|
||||
net(21)
|
||||
net(22)
|
||||
net(5 name($5))
|
||||
net(6 name($6))
|
||||
net(7 name($7))
|
||||
net(8 name($8))
|
||||
net(9 name($9))
|
||||
net(10 name($10))
|
||||
net(11 name($11))
|
||||
net(12 name($12))
|
||||
net(13 name($13))
|
||||
net(14 name($14))
|
||||
net(15 name($15))
|
||||
net(16 name($16))
|
||||
net(17 name($17))
|
||||
net(18 name($18))
|
||||
net(19 name($19))
|
||||
net(20 name($20))
|
||||
net(21 name($21))
|
||||
net(22 name($22))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ X(INV2
|
|||
J(poly_lbl IN (-525 -1800))
|
||||
R(poly_cont (-830 -110) (220 220))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(poly (275 -250) (250 2500))
|
||||
R(poly (-305 -1430) (360 360))
|
||||
R(poly (-305 820) (250 1600))
|
||||
|
|
@ -108,7 +108,7 @@ X(INV2
|
|||
R(psd (-275 525) (525 950))
|
||||
R(nsd (-525 -3750) (525 950))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(diff_cont (-110 -310) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -120,7 +120,7 @@ X(INV2
|
|||
R(metal2 (-1525 -775) (2800 900))
|
||||
R(nsd (-1675 -925) (550 950))
|
||||
)
|
||||
N(5
|
||||
N(5 I($5)
|
||||
R(diff_cont (-110 2490) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -215,24 +215,24 @@ X(RINGO
|
|||
N(4 I(VDD)
|
||||
J(metal2_lbl VDD (0 2800))
|
||||
)
|
||||
N(5)
|
||||
N(6)
|
||||
N(7)
|
||||
N(8)
|
||||
N(9)
|
||||
N(10)
|
||||
N(11)
|
||||
N(12)
|
||||
N(13)
|
||||
N(14)
|
||||
N(15)
|
||||
N(16)
|
||||
N(17)
|
||||
N(18)
|
||||
N(19)
|
||||
N(20)
|
||||
N(21)
|
||||
N(22)
|
||||
N(5 I($5))
|
||||
N(6 I($6))
|
||||
N(7 I($7))
|
||||
N(8 I($8))
|
||||
N(9 I($9))
|
||||
N(10 I($10))
|
||||
N(11 I($11))
|
||||
N(12 I($12))
|
||||
N(13 I($13))
|
||||
N(14 I($14))
|
||||
N(15 I($15))
|
||||
N(16 I($16))
|
||||
N(17 I($17))
|
||||
N(18 I($18))
|
||||
N(19 I($19))
|
||||
N(20 I($20))
|
||||
N(21 I($21))
|
||||
N(22 I($22))
|
||||
P(1 I(FB))
|
||||
P(2 I(OSC))
|
||||
P(3 I(VSS))
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ X(INV2
|
|||
J(poly_lbl IN (-525 -1800))
|
||||
R(poly_cont (-830 -110) (220 220))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(poly (275 -250) (250 2500))
|
||||
R(poly (-305 -1430) (360 360))
|
||||
R(poly (-305 820) (250 1600))
|
||||
|
|
@ -108,7 +108,7 @@ X(INV2
|
|||
R(psd (-275 525) (525 950))
|
||||
R(nsd (-525 -3750) (525 950))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(diff_cont (-110 -310) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -120,7 +120,7 @@ X(INV2
|
|||
R(metal2 (-1525 -775) (2800 900))
|
||||
R(nsd (-1675 -925) (550 950))
|
||||
)
|
||||
N(5
|
||||
N(5 I($5)
|
||||
R(diff_cont (-110 2490) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -206,24 +206,24 @@ X(RINGO
|
|||
N(4 I(VDD)
|
||||
J(metal2_lbl VDD (0 2800))
|
||||
)
|
||||
N(5)
|
||||
N(6)
|
||||
N(7)
|
||||
N(8)
|
||||
N(9)
|
||||
N(10)
|
||||
N(11)
|
||||
N(12)
|
||||
N(13)
|
||||
N(14)
|
||||
N(15)
|
||||
N(16)
|
||||
N(17)
|
||||
N(18)
|
||||
N(19)
|
||||
N(20)
|
||||
N(21)
|
||||
N(22)
|
||||
N(5 I($5))
|
||||
N(6 I($6))
|
||||
N(7 I($7))
|
||||
N(8 I($8))
|
||||
N(9 I($9))
|
||||
N(10 I($10))
|
||||
N(11 I($11))
|
||||
N(12 I($12))
|
||||
N(13 I($13))
|
||||
N(14 I($14))
|
||||
N(15 I($15))
|
||||
N(16 I($16))
|
||||
N(17 I($17))
|
||||
N(18 I($18))
|
||||
N(19 I($19))
|
||||
N(20 I($20))
|
||||
N(21 I($21))
|
||||
N(22 I($22))
|
||||
P(1 I(FB))
|
||||
P(2 I(OSC))
|
||||
P(3 I(VSS))
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ circuit(INV2
|
|||
text(poly_lbl IN (-525 -1800))
|
||||
rect(poly_cont (-830 -110) (220 220))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(poly (275 -250) (250 2500))
|
||||
rect(poly (-305 -1430) (360 360))
|
||||
rect(poly (-305 820) (250 1600))
|
||||
|
|
@ -127,7 +127,7 @@ circuit(INV2
|
|||
rect(psd (-275 525) (525 950))
|
||||
rect(nsd (-525 -3750) (525 950))
|
||||
)
|
||||
net(4
|
||||
net(4 name($4)
|
||||
rect(diff_cont (-110 -310) (220 220))
|
||||
rect(diff_cont (-220 180) (220 220))
|
||||
rect(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -139,7 +139,7 @@ circuit(INV2
|
|||
rect(metal2 (-1525 -775) (2800 900))
|
||||
rect(nsd (-1675 -925) (550 950))
|
||||
)
|
||||
net(5
|
||||
net(5 name($5)
|
||||
rect(diff_cont (-110 2490) (220 220))
|
||||
rect(diff_cont (-220 180) (220 220))
|
||||
rect(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -234,24 +234,24 @@ circuit(RINGO
|
|||
net(4 name(VDD)
|
||||
text(metal2_lbl VDD (0 2800))
|
||||
)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(8)
|
||||
net(9)
|
||||
net(10)
|
||||
net(11)
|
||||
net(12)
|
||||
net(13)
|
||||
net(14)
|
||||
net(15)
|
||||
net(16)
|
||||
net(17)
|
||||
net(18)
|
||||
net(19)
|
||||
net(20)
|
||||
net(21)
|
||||
net(22)
|
||||
net(5 name($I46))
|
||||
net(6 name($I45))
|
||||
net(7 name($I44))
|
||||
net(8 name($I43))
|
||||
net(9 name($I42))
|
||||
net(10 name($I41))
|
||||
net(11 name($I40))
|
||||
net(12 name($I39))
|
||||
net(13 name($I38))
|
||||
net(14 name($I19))
|
||||
net(15 name($I8))
|
||||
net(16 name($I7))
|
||||
net(17 name($I6))
|
||||
net(18 name($I5))
|
||||
net(19 name($I4))
|
||||
net(20 name($I3))
|
||||
net(21 name($I2))
|
||||
net(22 name($I1))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ circuit(INV2
|
|||
rect((-1700 -1640) (3100 6220))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(nwell (-1400 1800) (2800 2780))
|
||||
rect(diff_cont (-1510 -650) (220 220))
|
||||
rect(ntie (-510 -450) (800 680))
|
||||
|
|
@ -126,7 +126,7 @@ circuit(INV2
|
|||
rect(poly_lbl (-525 -1800) (0 0))
|
||||
rect(poly_cont (-830 -110) (220 220))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect(poly (275 -250) (250 2500))
|
||||
rect(poly (-305 -1430) (360 360))
|
||||
rect(poly (-305 820) (250 1600))
|
||||
|
|
@ -257,14 +257,14 @@ circuit(INV2PAIR
|
|||
|
||||
# Nets with their geometries
|
||||
net(1 name(BULK))
|
||||
net(2)
|
||||
net(3)
|
||||
net(4)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(8)
|
||||
net(9)
|
||||
net(2 name($I8))
|
||||
net(3 name($I7))
|
||||
net(4 name($I6))
|
||||
net(5 name($I5))
|
||||
net(6 name($I4))
|
||||
net(7 name($I3))
|
||||
net(8 name($I2))
|
||||
net(9 name($I1))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(BULK))
|
||||
|
|
@ -340,14 +340,14 @@ circuit(RINGO
|
|||
rect(metal1 (2280 -1120) (360 1120))
|
||||
rect(metal2_lbl (-23940 300) (0 0))
|
||||
)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(8)
|
||||
net(9)
|
||||
net(10)
|
||||
net(11)
|
||||
net(12)
|
||||
net(5 name($I25))
|
||||
net(6 name($I24))
|
||||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ D(D$NMOS$1 NMOS
|
|||
)
|
||||
X(INV2
|
||||
R((-1700 -1640) (3100 6220))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(nwell (-1400 1800) (2800 2780))
|
||||
R(diff_cont (-1510 -650) (220 220))
|
||||
R(ntie (-510 -450) (800 680))
|
||||
|
|
@ -105,7 +105,7 @@ X(INV2
|
|||
R(poly_lbl (-525 -1800) (0 0))
|
||||
R(poly_cont (-830 -110) (220 220))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(poly (275 -250) (250 2500))
|
||||
R(poly (-305 -1430) (360 360))
|
||||
R(poly (-305 820) (250 1600))
|
||||
|
|
@ -227,14 +227,14 @@ X(INV2
|
|||
X(INV2PAIR
|
||||
R((0 -840) (5740 6220))
|
||||
N(1 I(BULK))
|
||||
N(2)
|
||||
N(3)
|
||||
N(4)
|
||||
N(5)
|
||||
N(6)
|
||||
N(7)
|
||||
N(8)
|
||||
N(9)
|
||||
N(2 I($I8))
|
||||
N(3 I($I7))
|
||||
N(4 I($I6))
|
||||
N(5 I($I5))
|
||||
N(6 I($I4))
|
||||
N(7 I($I3))
|
||||
N(8 I($I2))
|
||||
N(9 I($I1))
|
||||
P(1 I(BULK))
|
||||
P(2)
|
||||
P(4)
|
||||
|
|
@ -301,14 +301,14 @@ X(RINGO
|
|||
R(metal1 (2280 -1120) (360 1120))
|
||||
R(metal2_lbl (-23940 300) (0 0))
|
||||
)
|
||||
N(5)
|
||||
N(6)
|
||||
N(7)
|
||||
N(8)
|
||||
N(9)
|
||||
N(10)
|
||||
N(11)
|
||||
N(12)
|
||||
N(5 I($I25))
|
||||
N(6 I($I24))
|
||||
N(7 I($I23))
|
||||
N(8 I($I22))
|
||||
N(9 I($I17))
|
||||
N(10 I($I11))
|
||||
N(11 I($I10))
|
||||
N(12 I($I9))
|
||||
P(1 I(FB))
|
||||
P(2 I(OSC))
|
||||
P(3 I(VDD))
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ X(INV2
|
|||
J(poly_lbl IN (-525 -1800))
|
||||
R(poly_cont (-830 -110) (220 220))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(poly (275 -250) (250 2500))
|
||||
R(poly (-305 -1430) (360 360))
|
||||
R(poly (-305 820) (250 1600))
|
||||
|
|
@ -108,7 +108,7 @@ X(INV2
|
|||
R(psd (-275 525) (525 950))
|
||||
R(nsd (-525 -3750) (525 950))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(diff_cont (-110 -310) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -120,7 +120,7 @@ X(INV2
|
|||
R(metal2 (-1525 -775) (2800 900))
|
||||
R(nsd (-1675 -925) (550 950))
|
||||
)
|
||||
N(5
|
||||
N(5 I($5)
|
||||
R(diff_cont (-110 2490) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -215,24 +215,24 @@ X(RINGO
|
|||
N(4 I(VDD)
|
||||
J(metal2_lbl VDD (0 2800))
|
||||
)
|
||||
N(5)
|
||||
N(6)
|
||||
N(7)
|
||||
N(8)
|
||||
N(9)
|
||||
N(10)
|
||||
N(11)
|
||||
N(12)
|
||||
N(13)
|
||||
N(14)
|
||||
N(15)
|
||||
N(16)
|
||||
N(17)
|
||||
N(18)
|
||||
N(19)
|
||||
N(20)
|
||||
N(21)
|
||||
N(22)
|
||||
N(5 I($I46))
|
||||
N(6 I($I45))
|
||||
N(7 I($I44))
|
||||
N(8 I($I43))
|
||||
N(9 I($I42))
|
||||
N(10 I($I41))
|
||||
N(11 I($I40))
|
||||
N(12 I($I39))
|
||||
N(13 I($I38))
|
||||
N(14 I($I19))
|
||||
N(15 I($I8))
|
||||
N(16 I($I7))
|
||||
N(17 I($I6))
|
||||
N(18 I($I5))
|
||||
N(19 I($I4))
|
||||
N(20 I($I3))
|
||||
N(21 I($I2))
|
||||
N(22 I($I1))
|
||||
P(1 I(FB))
|
||||
P(2 I(OSC))
|
||||
P(3 I(VSS))
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ X(INV2
|
|||
J(poly_lbl IN (-525 -1800))
|
||||
R(poly_cont (-830 -110) (220 220))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(poly (275 -250) (250 2500))
|
||||
R(poly (-305 -1430) (360 360))
|
||||
R(poly (-305 820) (250 1600))
|
||||
|
|
@ -108,7 +108,7 @@ X(INV2
|
|||
R(psd (-275 525) (525 950))
|
||||
R(nsd (-525 -3750) (525 950))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(diff_cont (-110 -310) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -120,7 +120,7 @@ X(INV2
|
|||
R(metal2 (-1525 -775) (2800 900))
|
||||
R(nsd (-1675 -925) (550 950))
|
||||
)
|
||||
N(5
|
||||
N(5 I($5)
|
||||
R(diff_cont (-110 2490) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
|
|
@ -206,24 +206,24 @@ X(RINGO
|
|||
N(4 I(VDD)
|
||||
J(metal2_lbl VDD (0 2800))
|
||||
)
|
||||
N(5)
|
||||
N(6)
|
||||
N(7)
|
||||
N(8)
|
||||
N(9)
|
||||
N(10)
|
||||
N(11)
|
||||
N(12)
|
||||
N(13)
|
||||
N(14)
|
||||
N(15)
|
||||
N(16)
|
||||
N(17)
|
||||
N(18)
|
||||
N(19)
|
||||
N(20)
|
||||
N(21)
|
||||
N(22)
|
||||
N(5 I($I46))
|
||||
N(6 I($I45))
|
||||
N(7 I($I44))
|
||||
N(8 I($I43))
|
||||
N(9 I($I42))
|
||||
N(10 I($I41))
|
||||
N(11 I($I40))
|
||||
N(12 I($I39))
|
||||
N(13 I($I38))
|
||||
N(14 I($I19))
|
||||
N(15 I($I8))
|
||||
N(16 I($I7))
|
||||
N(17 I($I6))
|
||||
N(18 I($I5))
|
||||
N(19 I($I4))
|
||||
N(20 I($I3))
|
||||
N(21 I($I2))
|
||||
N(22 I($I1))
|
||||
P(1 I(FB))
|
||||
P(2 I(OSC))
|
||||
P(3 I(VSS))
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ layout(
|
|||
rect((-1700 -2440) (3100 7820))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(nwell (-1400 1800) (2800 3580))
|
||||
rect(diff_cont (-1510 -650) (220 220))
|
||||
rect(ntie (-510 -450) (800 680))
|
||||
|
|
@ -267,12 +267,12 @@ layout(
|
|||
|
||||
# Nets with their geometries
|
||||
net(1 name(BULK))
|
||||
net(2)
|
||||
net(3)
|
||||
net(4)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(2 name($I6))
|
||||
net(3 name($I5))
|
||||
net(4 name($I4))
|
||||
net(5 name($I3))
|
||||
net(6 name($I2))
|
||||
net(7 name($I1))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(BULK))
|
||||
|
|
@ -346,14 +346,14 @@ layout(
|
|||
rect(metal1 (2280 -1120) (360 1120))
|
||||
rect(metal2_lbl (-23940 1100) (0 0))
|
||||
)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(8)
|
||||
net(9)
|
||||
net(10)
|
||||
net(11)
|
||||
net(12)
|
||||
net(5 name($I25))
|
||||
net(6 name($I24))
|
||||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ layout(
|
|||
rect((-1700 -2440) (3100 7820))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(nwell (-1400 1800) (2800 3580))
|
||||
rect(diff_cont (-1510 -650) (220 220))
|
||||
rect(ntie (-510 -450) (800 680))
|
||||
|
|
@ -267,12 +267,12 @@ layout(
|
|||
|
||||
# Nets with their geometries
|
||||
net(1 name(BULK))
|
||||
net(2)
|
||||
net(3)
|
||||
net(4)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(2 name($I6))
|
||||
net(3 name($I5))
|
||||
net(4 name($I4))
|
||||
net(5 name($I3))
|
||||
net(6 name($I2))
|
||||
net(7 name($I1))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(BULK))
|
||||
|
|
@ -346,14 +346,14 @@ layout(
|
|||
rect(metal1 (2280 -1120) (360 1120))
|
||||
rect(metal2_lbl (-23940 1100) (0 0))
|
||||
)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(8)
|
||||
net(9)
|
||||
net(10)
|
||||
net(11)
|
||||
net(12)
|
||||
net(5 name($I25))
|
||||
net(6 name($I24))
|
||||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ layout(
|
|||
rect((-1700 -2440) (3100 7820))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(nwell (-1400 1800) (2800 3580))
|
||||
rect(diff_cont (-1510 -650) (220 220))
|
||||
rect(ntie (-510 -450) (800 680))
|
||||
|
|
@ -267,12 +267,12 @@ layout(
|
|||
|
||||
# Nets with their geometries
|
||||
net(1 name(BULK))
|
||||
net(2)
|
||||
net(3)
|
||||
net(4)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(2 name($I6))
|
||||
net(3 name($I5))
|
||||
net(4 name($I4))
|
||||
net(5 name($I3))
|
||||
net(6 name($I2))
|
||||
net(7 name($I1))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(BULK))
|
||||
|
|
@ -346,14 +346,14 @@ layout(
|
|||
rect(metal1 (2280 -1120) (360 1120))
|
||||
rect(metal2_lbl (-23940 1100) (0 0))
|
||||
)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(8)
|
||||
net(9)
|
||||
net(10)
|
||||
net(11)
|
||||
net(12)
|
||||
net(5 name($I25))
|
||||
net(6 name($I24))
|
||||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ layout(
|
|||
rect((-1700 -2440) (3100 7820))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(nwell (-1400 1800) (2800 3580))
|
||||
rect(diff_cont (-1510 -650) (220 220))
|
||||
rect(ntie (-510 -450) (800 680))
|
||||
|
|
@ -267,12 +267,12 @@ layout(
|
|||
|
||||
# Nets with their geometries
|
||||
net(1 name(BULK))
|
||||
net(2)
|
||||
net(3)
|
||||
net(4)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(2 name($I6))
|
||||
net(3 name($I5))
|
||||
net(4 name($I4))
|
||||
net(5 name($I3))
|
||||
net(6 name($I2))
|
||||
net(7 name($I1))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(BULK))
|
||||
|
|
@ -346,14 +346,14 @@ layout(
|
|||
rect(metal1 (2280 -1120) (360 1120))
|
||||
rect(metal2_lbl (-23940 1100) (0 0))
|
||||
)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(8)
|
||||
net(9)
|
||||
net(10)
|
||||
net(11)
|
||||
net(12)
|
||||
net(5 name($I25))
|
||||
net(6 name($I24))
|
||||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ layout(
|
|||
rect((-1700 -2440) (3100 7820))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(nwell (-1400 1800) (2800 3580))
|
||||
rect(diff_cont (-1510 -650) (220 220))
|
||||
rect(ntie (-510 -450) (800 680))
|
||||
|
|
@ -267,12 +267,12 @@ layout(
|
|||
|
||||
# Nets with their geometries
|
||||
net(1 name(BULK))
|
||||
net(2)
|
||||
net(3)
|
||||
net(4)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(2 name($I6))
|
||||
net(3 name($I5))
|
||||
net(4 name($I4))
|
||||
net(5 name($I3))
|
||||
net(6 name($I2))
|
||||
net(7 name($I1))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(BULK))
|
||||
|
|
@ -346,14 +346,14 @@ layout(
|
|||
rect(metal1 (2280 -1120) (360 1120))
|
||||
rect(metal2_lbl (-23940 1100) (0 0))
|
||||
)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(8)
|
||||
net(9)
|
||||
net(10)
|
||||
net(11)
|
||||
net(12)
|
||||
net(5 name($I25))
|
||||
net(6 name($I24))
|
||||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ layout(
|
|||
rect((-1700 -2440) (3100 7820))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(nwell (-1400 1800) (2800 3580))
|
||||
rect(diff_cont (-1510 -650) (220 220))
|
||||
rect(ntie (-510 -450) (800 680))
|
||||
|
|
@ -267,12 +267,12 @@ layout(
|
|||
|
||||
# Nets with their geometries
|
||||
net(1 name(BULK))
|
||||
net(2)
|
||||
net(3)
|
||||
net(4)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(2 name($I6))
|
||||
net(3 name($I5))
|
||||
net(4 name($I4))
|
||||
net(5 name($I3))
|
||||
net(6 name($I2))
|
||||
net(7 name($I1))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(BULK))
|
||||
|
|
@ -346,14 +346,14 @@ layout(
|
|||
rect(metal1 (2280 -1120) (360 1120))
|
||||
rect(metal2_lbl (-23940 1100) (0 0))
|
||||
)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(8)
|
||||
net(9)
|
||||
net(10)
|
||||
net(11)
|
||||
net(12)
|
||||
net(5 name($I25))
|
||||
net(6 name($I24))
|
||||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ layout(
|
|||
rect((-1700 -2440) (3100 7820))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(nwell (-1400 1800) (2800 3580))
|
||||
rect(diff_cont (-1510 -650) (220 220))
|
||||
rect(ntie (-510 -450) (800 680))
|
||||
|
|
@ -267,12 +267,12 @@ layout(
|
|||
|
||||
# Nets with their geometries
|
||||
net(1 name(BULK))
|
||||
net(2)
|
||||
net(3)
|
||||
net(4)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(2 name($I6))
|
||||
net(3 name($I5))
|
||||
net(4 name($I4))
|
||||
net(5 name($I3))
|
||||
net(6 name($I2))
|
||||
net(7 name($I1))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(BULK))
|
||||
|
|
@ -346,14 +346,14 @@ layout(
|
|||
rect(metal1 (2280 -1120) (360 1120))
|
||||
rect(metal2_lbl (-23940 1100) (0 0))
|
||||
)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(8)
|
||||
net(9)
|
||||
net(10)
|
||||
net(11)
|
||||
net(12)
|
||||
net(5 name($I25))
|
||||
net(6 name($I24))
|
||||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ layout(
|
|||
rect((-1700 -2440) (3100 7820))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(nwell (-1400 1800) (2800 3580))
|
||||
rect(diff_cont (-1510 -650) (220 220))
|
||||
rect(ntie (-510 -450) (800 680))
|
||||
|
|
@ -267,12 +267,12 @@ layout(
|
|||
|
||||
# Nets with their geometries
|
||||
net(1 name(BULK))
|
||||
net(2)
|
||||
net(3)
|
||||
net(4)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(2 name($I6))
|
||||
net(3 name($I5))
|
||||
net(4 name($I4))
|
||||
net(5 name($I3))
|
||||
net(6 name($I2))
|
||||
net(7 name($I1))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(BULK))
|
||||
|
|
@ -346,14 +346,14 @@ layout(
|
|||
rect(metal1 (2280 -1120) (360 1120))
|
||||
rect(metal2_lbl (-23940 1100) (0 0))
|
||||
)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(8)
|
||||
net(9)
|
||||
net(10)
|
||||
net(11)
|
||||
net(12)
|
||||
net(5 name($I25))
|
||||
net(6 name($I24))
|
||||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ layout(
|
|||
rect((-1700 -2440) (3100 7820))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(nwell (-1400 1800) (2800 3580))
|
||||
rect(diff_cont (-1510 -650) (220 220))
|
||||
rect(ntie (-510 -450) (800 680))
|
||||
|
|
@ -267,12 +267,12 @@ layout(
|
|||
|
||||
# Nets with their geometries
|
||||
net(1 name(BULK))
|
||||
net(2)
|
||||
net(3)
|
||||
net(4)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(2 name($2))
|
||||
net(3 name($3))
|
||||
net(4 name($4))
|
||||
net(5 name($5))
|
||||
net(6 name($6))
|
||||
net(7 name($7))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(BULK))
|
||||
|
|
@ -346,14 +346,14 @@ layout(
|
|||
rect(metal1 (2280 -1120) (360 1120))
|
||||
rect(metal2_lbl (-23940 1100) (0 0))
|
||||
)
|
||||
net(5)
|
||||
net(6)
|
||||
net(7)
|
||||
net(8)
|
||||
net(9)
|
||||
net(10)
|
||||
net(11)
|
||||
net(12)
|
||||
net(5 name($5))
|
||||
net(6 name($6))
|
||||
net(7 name($7))
|
||||
net(8 name($8))
|
||||
net(9 name($9))
|
||||
net(10 name($10))
|
||||
net(11 name($11))
|
||||
net(12 name($12))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ layout(
|
|||
rect((-1700 -2440) (3100 7820))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(nwell (-1400 1800) (2800 3580))
|
||||
rect(diff_cont (-1510 -650) (220 220))
|
||||
rect(ntie (-510 -450) (800 680))
|
||||
|
|
@ -267,7 +267,7 @@ layout(
|
|||
|
||||
# Nets with their geometries
|
||||
net(1 name(BULK))
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(diff_cont (4230 3290) (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 (-360 -1560) (360 1560))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect(diff_cont (4230 890) (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 (-360 -1560) (360 1560))
|
||||
)
|
||||
net(4
|
||||
net(4 name($4)
|
||||
rect(diff_cont (790 890) (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))
|
||||
)
|
||||
net(5)
|
||||
net(6
|
||||
net(5 name($5))
|
||||
net(6 name($6)
|
||||
rect(diff_cont (3430 890) (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))
|
||||
)
|
||||
net(7)
|
||||
net(7 name($7))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(BULK))
|
||||
|
|
@ -654,7 +654,7 @@ layout(
|
|||
rect(metal1 (-360 -1560) (360 1560))
|
||||
rect(metal2_lbl (-21300 -380) (0 0))
|
||||
)
|
||||
net(5
|
||||
net(5 name($5)
|
||||
rect(diff_cont (1730 90) (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))
|
||||
)
|
||||
net(6
|
||||
net(6 name($6)
|
||||
rect(diff_cont (17570 90) (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))
|
||||
)
|
||||
net(7
|
||||
net(7 name($7)
|
||||
rect(diff_cont (12290 90) (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))
|
||||
)
|
||||
net(8
|
||||
net(8 name($8)
|
||||
rect(diff_cont (7010 90) (220 220))
|
||||
rect(diff_cont (-220 -620) (220 220))
|
||||
rect(diff_cont (-220 -620) (220 220))
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -17,19 +17,38 @@ connect(l2, l3)
|
|||
connect(l3, l4)
|
||||
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)
|
||||
l2.output(2, 0)
|
||||
l3.output(3, 0)
|
||||
l4.output(4, 0)
|
||||
l5.output(5, 0)
|
||||
|
||||
l1_measured.output(100, 0)
|
||||
l2_measured.output(101, 0)
|
||||
l3_measured.output(102, 0)
|
||||
l4_measured.output(103, 0)
|
||||
sec = { "l2" => l2, "l3" => l3, "l4" => l4, "l5" => l5 }
|
||||
l100_measured = evaluate_nets(l1, sec, "put(5, area(l5)); put(0, area); put(100, area(l5)/area)")
|
||||
l101_measured = evaluate_nets(l1, sec, "put(0, area*factor)", { "factor" => 1000.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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
Binary file not shown.
|
|
@ -27,7 +27,7 @@ D(D$MOS MOS
|
|||
)
|
||||
X(A
|
||||
R((-2800 -2500) (5600 5200))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(contact (-1900 2000) (600 600))
|
||||
R(contact (-600 -600) (600 600))
|
||||
R(contact (2600 -600) (600 600))
|
||||
|
|
@ -36,13 +36,13 @@ X(A
|
|||
R(contact (-600 -600) (600 600))
|
||||
R(sd (-2300 -700) (4000 800))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(contact (-1900 -2400) (600 600))
|
||||
R(contact (2600 -600) (600 600))
|
||||
R(contact (-2200 -600) (600 600))
|
||||
R(sd (-2300 -700) (4000 800))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(poly (-2800 -1700) (5600 3600))
|
||||
)
|
||||
P(1)
|
||||
|
|
@ -63,9 +63,9 @@ X(A
|
|||
)
|
||||
X(AA
|
||||
R((-2050 -1950) (5600 5200))
|
||||
N(1)
|
||||
N(2)
|
||||
N(3)
|
||||
N(1 I($I3))
|
||||
N(2 I($I2))
|
||||
N(3 I($I1))
|
||||
P(1)
|
||||
P(2)
|
||||
P(3)
|
||||
|
|
@ -94,10 +94,10 @@ X(TOP
|
|||
R(contact (-1200 -1600) (600 600))
|
||||
R(contact (1000 -600) (600 600))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l1 (-2350 8300) (4000 850))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(l1 (-2800 -2800) (800 4100))
|
||||
)
|
||||
X(1 AA Y(-1100 5900)
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -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))
|
||||
)
|
||||
|
|
@ -188,7 +188,7 @@ layout(
|
|||
rect((-577500 -1123000) (1868000 1796000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l2 (345500 455000) (256500 25000))
|
||||
rect(l2 (-256500 -146000) (25000 146000))
|
||||
rect(l2 (-47000 -183500) (75000 75000))
|
||||
|
|
@ -207,7 +207,7 @@ layout(
|
|||
rect(l10 (-57500 -57500) (25000 25000))
|
||||
rect(l11 (-25000 -25000) (25000 25000))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l2 (-148000 463000) (300000 25000))
|
||||
)
|
||||
net(3 name($5)
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ layout(
|
|||
rect((-577500 -1123000) (1868000 1796000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l2 (345500 455000) (256500 25000))
|
||||
rect(l2 (-256500 -146000) (25000 146000))
|
||||
rect(l2 (-47000 -183500) (75000 75000))
|
||||
|
|
@ -137,7 +137,7 @@ layout(
|
|||
rect(l10 (-57500 -57500) (25000 25000))
|
||||
rect(l11 (-25000 -25000) (25000 25000))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l2 (-148000 463000) (300000 25000))
|
||||
)
|
||||
net(3 name($5)
|
||||
|
|
|
|||
|
|
@ -192,7 +192,7 @@ layout(
|
|||
rect((-577500 -1123000) (1868000 1796000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l2 (345500 455000) (256500 25000))
|
||||
rect(l2 (-256500 -146000) (25000 146000))
|
||||
rect(l2 (-47000 -183500) (75000 75000))
|
||||
|
|
@ -211,13 +211,13 @@ layout(
|
|||
rect(l10 (-57500 -57500) (25000 25000))
|
||||
rect(l11 (-25000 -25000) (25000 25000))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l2 (-148000 463000) (300000 25000))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect(l2 (-401420 456500) (50730 78500))
|
||||
)
|
||||
net(4
|
||||
net(4 name($4)
|
||||
rect(l2 (822690 427000) (63970 82000))
|
||||
)
|
||||
net(5 name($7)
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ layout(
|
|||
rect((-577500 -1123000) (1868000 1796000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l2 (345500 455000) (256500 25000))
|
||||
rect(l2 (-256500 -146000) (25000 146000))
|
||||
rect(l2 (-47000 -183500) (75000 75000))
|
||||
|
|
@ -141,13 +141,13 @@ layout(
|
|||
rect(l10 (-57500 -57500) (25000 25000))
|
||||
rect(l11 (-25000 -25000) (25000 25000))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l2 (-148000 463000) (300000 25000))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect(l2 (-401420 456500) (50730 78500))
|
||||
)
|
||||
net(4
|
||||
net(4 name($4)
|
||||
rect(l2 (822690 427000) (63970 82000))
|
||||
)
|
||||
net(5 name($7)
|
||||
|
|
|
|||
|
|
@ -188,7 +188,7 @@ layout(
|
|||
rect((-577500 -1123000) (1868000 1796000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l2 (345500 455000) (256500 25000))
|
||||
rect(l2 (-256500 -146000) (25000 146000))
|
||||
rect(l2 (-47000 -183500) (75000 75000))
|
||||
|
|
@ -207,7 +207,7 @@ layout(
|
|||
rect(l10 (-57500 -57500) (25000 25000))
|
||||
rect(l11 (-25000 -25000) (25000 25000))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l2 (-148000 463000) (300000 25000))
|
||||
)
|
||||
net(3 name($5)
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ layout(
|
|||
rect((-577500 -1123000) (1868000 1796000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l2 (345500 455000) (256500 25000))
|
||||
rect(l2 (-256500 -146000) (25000 146000))
|
||||
rect(l2 (-47000 -183500) (75000 75000))
|
||||
|
|
@ -137,7 +137,7 @@ layout(
|
|||
rect(l10 (-57500 -57500) (25000 25000))
|
||||
rect(l11 (-25000 -25000) (25000 25000))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l2 (-148000 463000) (300000 25000))
|
||||
)
|
||||
net(3 name($5)
|
||||
|
|
|
|||
|
|
@ -185,7 +185,7 @@ layout(
|
|||
rect((-577500 -1123000) (1868000 1796000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l2 (345500 455000) (256500 25000))
|
||||
rect(l2 (-256500 -146000) (25000 146000))
|
||||
rect(l2 (-47000 -183500) (75000 75000))
|
||||
|
|
@ -204,7 +204,7 @@ layout(
|
|||
rect(l10 (-57500 -57500) (25000 25000))
|
||||
rect(l11 (-25000 -25000) (25000 25000))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l2 (-148000 463000) (300000 25000))
|
||||
)
|
||||
net(3 name($5)
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ layout(
|
|||
rect((-577500 -1123000) (1868000 1796000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l2 (345500 455000) (256500 25000))
|
||||
rect(l2 (-256500 -146000) (25000 146000))
|
||||
rect(l2 (-47000 -183500) (75000 75000))
|
||||
|
|
@ -134,7 +134,7 @@ layout(
|
|||
rect(l10 (-57500 -57500) (25000 25000))
|
||||
rect(l11 (-25000 -25000) (25000 25000))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l2 (-148000 463000) (300000 25000))
|
||||
)
|
||||
net(3 name($5)
|
||||
|
|
|
|||
|
|
@ -188,7 +188,7 @@ layout(
|
|||
rect((-577500 -1123000) (1868000 1796000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l2 (345500 455000) (256500 25000))
|
||||
rect(l2 (-256500 -146000) (25000 146000))
|
||||
rect(l2 (-47000 -183500) (75000 75000))
|
||||
|
|
@ -207,7 +207,7 @@ layout(
|
|||
rect(l10 (-57500 -57500) (25000 25000))
|
||||
rect(l11 (-25000 -25000) (25000 25000))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l2 (-148000 463000) (300000 25000))
|
||||
)
|
||||
net(3 name($5)
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ layout(
|
|||
rect((-577500 -1123000) (1868000 1796000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l2 (345500 455000) (256500 25000))
|
||||
rect(l2 (-256500 -146000) (25000 146000))
|
||||
rect(l2 (-47000 -183500) (75000 75000))
|
||||
|
|
@ -137,7 +137,7 @@ layout(
|
|||
rect(l10 (-57500 -57500) (25000 25000))
|
||||
rect(l11 (-25000 -25000) (25000 25000))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l2 (-148000 463000) (300000 25000))
|
||||
)
|
||||
net(3 name($5)
|
||||
|
|
|
|||
|
|
@ -188,7 +188,7 @@ layout(
|
|||
rect((-577500 -1123000) (1868000 1796000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l2 (345500 455000) (256500 25000))
|
||||
rect(l2 (-256500 -146000) (25000 146000))
|
||||
rect(l2 (-47000 -183500) (75000 75000))
|
||||
|
|
@ -207,7 +207,7 @@ layout(
|
|||
rect(l10 (-57500 -57500) (25000 25000))
|
||||
rect(l11 (-25000 -25000) (25000 25000))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l9 (348500 26500) (25000 179000))
|
||||
rect(l9 (-57500 -58000) (90000 90000))
|
||||
rect(l9 (-86000 -288500) (90000 90000))
|
||||
|
|
@ -223,7 +223,7 @@ layout(
|
|||
rect(l14 (186500 -16500) (25000 193000))
|
||||
rect(l14 (-87500 -87500) (150000 150000))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect(l2 (-148000 463000) (300000 25000))
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ layout(
|
|||
rect((-577500 -1123000) (1868000 1796000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l2 (345500 455000) (256500 25000))
|
||||
rect(l2 (-256500 -146000) (25000 146000))
|
||||
rect(l2 (-47000 -183500) (75000 75000))
|
||||
|
|
@ -137,7 +137,7 @@ layout(
|
|||
rect(l10 (-57500 -57500) (25000 25000))
|
||||
rect(l11 (-25000 -25000) (25000 25000))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l9 (348500 26500) (25000 179000))
|
||||
rect(l9 (-57500 -58000) (90000 90000))
|
||||
rect(l9 (-86000 -288500) (90000 90000))
|
||||
|
|
@ -153,7 +153,7 @@ layout(
|
|||
rect(l14 (186500 -16500) (25000 193000))
|
||||
rect(l14 (-87500 -87500) (150000 150000))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect(l2 (-148000 463000) (300000 25000))
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ layout(
|
|||
rect((-18500 -14000) (44500 28000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l1 (6000 -6000) (7000 1000))
|
||||
rect(l1 (-1000 0) (1000 12000))
|
||||
rect(l1 (-1000 0) (5160 1000))
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ layout(
|
|||
rect((-18500 -14000) (44500 28000))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l1 (6000 -6000) (7000 1000))
|
||||
rect(l1 (-1000 0) (1000 12000))
|
||||
rect(l1 (-1000 0) (4550 1000))
|
||||
|
|
|
|||
|
|
@ -29,12 +29,12 @@ D(D$RPP1$1 RPP1
|
|||
)
|
||||
X(A
|
||||
R((-200 -450) (1750 1350))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l4 (-150 450) (100 100))
|
||||
R(l3 (-150 -150) (200 500))
|
||||
R(l1 (-200 -500) (250 200))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l4 (650 450) (100 100))
|
||||
R(l4 (-100 -900) (100 100))
|
||||
R(l3 (-150 200) (200 650))
|
||||
|
|
@ -42,7 +42,7 @@ X(A
|
|||
R(l1 (-250 300) (250 200))
|
||||
R(l1 (-200 -1000) (250 200))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l4 (1450 -350) (100 100))
|
||||
)
|
||||
P(1)
|
||||
|
|
@ -60,12 +60,12 @@ X(A
|
|||
)
|
||||
X(TOP
|
||||
R((-50 450) (3800 2600))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l4 (850 2050) (100 100))
|
||||
R(l3 (-150 -150) (500 200))
|
||||
R(l1 (-500 -250) (200 250))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l4 (850 1250) (100 100))
|
||||
R(l4 (-100 -100) (100 100))
|
||||
R(l4 (-900 -100) (100 100))
|
||||
|
|
@ -74,14 +74,14 @@ X(TOP
|
|||
R(l1 (300 -250) (200 300))
|
||||
R(l1 (-1000 -300) (200 250))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l4 (50 450) (100 100))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(l4 (850 450) (100 100))
|
||||
)
|
||||
N(5)
|
||||
N(6)
|
||||
N(5 I($I2))
|
||||
N(6 I($I1))
|
||||
D(1 D$RPP1
|
||||
Y(800 750)
|
||||
E(R 0.555555555556)
|
||||
|
|
|
|||
|
|
@ -29,12 +29,12 @@ D(D$RPP1$1 RPP1
|
|||
)
|
||||
X(A
|
||||
R((-200 -450) (1750 1350))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l4 (-150 450) (100 100))
|
||||
R(l3 (-150 -150) (200 500))
|
||||
R(l1 (-200 -500) (250 200))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l4 (650 450) (100 100))
|
||||
R(l4 (-100 -900) (100 100))
|
||||
R(l3 (-150 200) (200 650))
|
||||
|
|
@ -42,7 +42,7 @@ X(A
|
|||
R(l1 (-250 300) (250 200))
|
||||
R(l1 (-200 -1000) (250 200))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l4 (1450 -350) (100 100))
|
||||
)
|
||||
P(1)
|
||||
|
|
@ -60,12 +60,12 @@ X(A
|
|||
)
|
||||
X(TOP
|
||||
R((-50 450) (3800 2600))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l4 (850 2050) (100 100))
|
||||
R(l3 (-150 -150) (500 200))
|
||||
R(l1 (-500 -250) (200 250))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l4 (850 1250) (100 100))
|
||||
R(l4 (-100 -100) (100 100))
|
||||
R(l4 (-900 -100) (100 100))
|
||||
|
|
@ -74,14 +74,14 @@ X(TOP
|
|||
R(l1 (300 -250) (200 300))
|
||||
R(l1 (-1000 -300) (200 250))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l4 (50 450) (100 100))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(l4 (850 450) (100 100))
|
||||
)
|
||||
N(5)
|
||||
N(6)
|
||||
N(5 I($I2))
|
||||
N(6 I($I1))
|
||||
D(1 D$RPP1
|
||||
Y(800 750)
|
||||
E(R 0.555555555556)
|
||||
|
|
|
|||
|
|
@ -29,12 +29,12 @@ D(D$RPP1$1 RPP1
|
|||
)
|
||||
X(A
|
||||
R((-200 -450) (1750 1350))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l4 (-150 450) (100 100))
|
||||
R(l3 (-150 -150) (200 500))
|
||||
R(l1 (-200 -500) (250 200))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l4 (650 450) (100 100))
|
||||
R(l4 (-100 -900) (100 100))
|
||||
R(l3 (-150 200) (200 650))
|
||||
|
|
@ -42,7 +42,7 @@ X(A
|
|||
R(l1 (-250 300) (250 200))
|
||||
R(l1 (-200 -1000) (250 200))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l4 (1450 -350) (100 100))
|
||||
)
|
||||
P(1)
|
||||
|
|
@ -60,12 +60,12 @@ X(A
|
|||
)
|
||||
X(TOP
|
||||
R((-50 450) (3800 2600))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l4 (850 2050) (100 100))
|
||||
R(l3 (-150 -150) (500 200))
|
||||
R(l1 (-500 -250) (200 250))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l4 (850 1250) (100 100))
|
||||
R(l4 (-100 -100) (100 100))
|
||||
R(l4 (-900 -100) (100 100))
|
||||
|
|
@ -74,14 +74,14 @@ X(TOP
|
|||
R(l1 (300 -250) (200 300))
|
||||
R(l1 (-1000 -300) (200 250))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l4 (50 450) (100 100))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(l4 (850 450) (100 100))
|
||||
)
|
||||
N(5)
|
||||
N(6)
|
||||
N(5 I($I2))
|
||||
N(6 I($I1))
|
||||
D(1 D$RPP1
|
||||
Y(800 750)
|
||||
E(R 0.555555555556)
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ J(
|
|||
)
|
||||
X(INV
|
||||
R((-1500 -800) (3000 4600))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l6 (290 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -62,7 +62,7 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l5 (-1375 -925) (775 950))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l6 (290 2490) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -71,12 +71,12 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l2 (-1375 -925) (775 950))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l3 (-125 -250) (250 2500))
|
||||
R(l3 (-250 -3050) (250 1600))
|
||||
R(l3 (-250 1200) (250 1600))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(l6 (-510 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l6 (-220 2180) (220 220))
|
||||
|
|
@ -159,7 +159,7 @@ J(
|
|||
)
|
||||
X(INVCHAIN
|
||||
R((-90 0) (4475 9200))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l3 (1625 1835) (2160 250))
|
||||
R(l3 (-250 0) (250 4990))
|
||||
R(l3 (-1605 0) (1605 250))
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ J(
|
|||
)
|
||||
X(INV
|
||||
R((-1500 -800) (3000 4600))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l6 (290 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -65,7 +65,7 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l5 (-1375 -925) (775 950))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l6 (290 2490) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -74,12 +74,12 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l2 (-1375 -925) (775 950))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l3 (-125 -250) (250 2500))
|
||||
R(l3 (-250 -3050) (250 1600))
|
||||
R(l3 (-250 1200) (250 1600))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(l6 (-510 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l6 (-220 2180) (220 220))
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ J(
|
|||
)
|
||||
X(INV
|
||||
R((-1500 -800) (3000 4600))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l6 (290 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -65,7 +65,7 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l5 (-1375 -925) (775 950))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l6 (290 2490) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -74,12 +74,12 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l2 (-1375 -925) (775 950))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l3 (-125 -250) (250 2500))
|
||||
R(l3 (-250 -3050) (250 1600))
|
||||
R(l3 (-250 1200) (250 1600))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(l6 (-510 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l6 (-220 2180) (220 220))
|
||||
|
|
|
|||
|
|
@ -68,12 +68,12 @@ layout(
|
|||
rect((100 10) (340 80))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l1 (180 60) (90 30))
|
||||
rect(l2 (-160 -20) (90 10))
|
||||
rect(l2 (40 -10) (180 10))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l1 (180 10) (90 30))
|
||||
rect(l2 (-160 -20) (90 10))
|
||||
rect(l2 (40 -10) (180 10))
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ layout(
|
|||
rect(l2 (-275 -2150) (425 1500))
|
||||
rect(l2 (-400 -1500) (425 1500))
|
||||
)
|
||||
net(2
|
||||
net(2 name($2)
|
||||
rect(l8 (1810 1770) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-1580 3760) (180 180))
|
||||
|
|
@ -146,7 +146,7 @@ layout(
|
|||
rect(l11 (-1150 -400) (0 0))
|
||||
rect(l6 (-950 860) (425 950))
|
||||
)
|
||||
net(4
|
||||
net(4 name($4)
|
||||
rect(l3 (-100 4500) (2600 3500))
|
||||
)
|
||||
net(5 name(b)
|
||||
|
|
|
|||
|
|
@ -216,7 +216,7 @@ layout(
|
|||
rect((-100 400) (5600 7600))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l11 (3100 2950) (950 300))
|
||||
)
|
||||
net(2 name(A)
|
||||
|
|
@ -226,8 +226,8 @@ layout(
|
|||
rect(l11 (2400 3100) (0 0))
|
||||
)
|
||||
net(4 name(SUBSTRATE))
|
||||
net(5)
|
||||
net(6)
|
||||
net(5 name($I3))
|
||||
net(6 name($I1))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(2 name(A))
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ J(
|
|||
)
|
||||
X(INV
|
||||
R((-1500 -800) (3000 4600))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l6 (290 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -62,7 +62,7 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l5 (-1375 -925) (775 950))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l6 (290 2490) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -71,12 +71,12 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l2 (-1375 -925) (775 950))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l3 (-125 -250) (250 2500))
|
||||
R(l3 (-250 -3050) (250 1600))
|
||||
R(l3 (-250 1200) (250 1600))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(l6 (-510 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l6 (-220 2180) (220 220))
|
||||
|
|
@ -118,12 +118,12 @@ J(
|
|||
)
|
||||
X(INV2
|
||||
R((0 0) (5500 4600))
|
||||
N(1)
|
||||
N(2)
|
||||
N(3)
|
||||
N(4)
|
||||
N(5)
|
||||
N(6)
|
||||
N(1 I($I8))
|
||||
N(2 I($I7))
|
||||
N(3 I($I6))
|
||||
N(4 I($I5))
|
||||
N(5 I($I4))
|
||||
N(6 I($I2))
|
||||
P(1)
|
||||
P(2)
|
||||
P(3)
|
||||
|
|
@ -163,8 +163,8 @@ J(
|
|||
N(6 I('8')
|
||||
R(l12 (4410 1920) (0 0))
|
||||
)
|
||||
N(7)
|
||||
N(8)
|
||||
N(7 I($I4))
|
||||
N(8 I($I2))
|
||||
P(1 I('3'))
|
||||
P(2 I('5'))
|
||||
P(3 I('7'))
|
||||
|
|
@ -198,27 +198,27 @@ J(
|
|||
R(l3 (-1295 925) (1235 350))
|
||||
R(l11 (-910 -150) (0 0))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l3 (445 805) (480 550))
|
||||
R(l7 (-435 -365) (220 220))
|
||||
R(l8 (-1065 -285) (1105 350))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l3 (1345 925) (1945 350))
|
||||
R(l7 (-1885 -285) (220 220))
|
||||
R(l8 (-295 -370) (440 520))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(l3 (3745 805) (480 550))
|
||||
R(l7 (-435 -365) (220 220))
|
||||
R(l8 (-1065 -285) (1105 350))
|
||||
)
|
||||
N(5
|
||||
N(5 I($5)
|
||||
R(l3 (4645 925) (1945 350))
|
||||
R(l7 (-1885 -285) (220 220))
|
||||
R(l8 (-295 -370) (440 520))
|
||||
)
|
||||
N(6
|
||||
N(6 I($6)
|
||||
R(l3 (7045 805) (480 550))
|
||||
R(l7 (-435 -365) (220 220))
|
||||
R(l8 (-1065 -285) (1105 350))
|
||||
|
|
|
|||
|
|
@ -216,7 +216,7 @@ layout(
|
|||
rect((-100 400) (5600 7600))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(metal1 (3100 2950) (950 300))
|
||||
)
|
||||
net(2 name(A)
|
||||
|
|
@ -226,8 +226,8 @@ layout(
|
|||
rect(metal1 (2400 3100) (0 0))
|
||||
)
|
||||
net(4 name(SUBSTRATE))
|
||||
net(5)
|
||||
net(6)
|
||||
net(5 name($I3))
|
||||
net(6 name($I1))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(2 name(A))
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ J(
|
|||
)
|
||||
X(INV
|
||||
R((-1500 -800) (3000 4600))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l6 (290 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -63,7 +63,7 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l5 (-1375 -925) (775 950))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l6 (290 2490) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -72,12 +72,12 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l2 (-1375 -925) (775 950))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l3 (-125 -250) (250 2500))
|
||||
R(l3 (-250 -3050) (250 1600))
|
||||
R(l3 (-250 1200) (250 1600))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(l6 (-510 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l6 (-220 2180) (220 220))
|
||||
|
|
@ -160,14 +160,14 @@ J(
|
|||
)
|
||||
X(INVCHAIN
|
||||
R((-915 -15) (10415 9215))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l3 (7340 1650) (2160 250))
|
||||
R(l3 (-250 0) (250 4990))
|
||||
R(l3 (-1605 0) (1605 250))
|
||||
R(l7 (-1545 -250) (240 250))
|
||||
R(l8 (-560 -375) (690 510))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l3 (1625 1835) (2160 250))
|
||||
R(l3 (-250 0) (250 4990))
|
||||
R(l3 (-1605 0) (1605 250))
|
||||
|
|
@ -225,21 +225,21 @@ J(
|
|||
)
|
||||
X(TOP
|
||||
R((-305 350) (15415 9225))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l3 (12950 2130) (2160 250))
|
||||
R(l3 (-250 0) (250 4990))
|
||||
R(l3 (-1605 0) (1605 250))
|
||||
R(l7 (-1545 -250) (240 250))
|
||||
R(l8 (-560 -375) (690 510))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l3 (12100 7300) (640 530))
|
||||
R(l7 (-540 -415) (270 250))
|
||||
R(l8 (-1695 -250) (1695 250))
|
||||
R(l8 (-4075 -5650) (2630 250))
|
||||
R(l8 (-250 0) (250 5150))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l7 (6465 7325) (220 240))
|
||||
R(l8 (-4100 -5365) (3125 250))
|
||||
R(l8 (-250 0) (250 4860))
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ J(
|
|||
)
|
||||
X(INV
|
||||
R((-1500 -800) (3000 4600))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l6 (290 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -63,7 +63,7 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l5 (-1375 -925) (775 950))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l6 (290 2490) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -72,12 +72,12 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l2 (-1375 -925) (775 950))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l3 (-125 -250) (250 2500))
|
||||
R(l3 (-250 -3050) (250 1600))
|
||||
R(l3 (-250 1200) (250 1600))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(l6 (-510 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l6 (-220 2180) (220 220))
|
||||
|
|
@ -160,14 +160,14 @@ J(
|
|||
)
|
||||
X(INVCHAIN
|
||||
R((-915 -15) (10415 9215))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l3 (7340 1650) (2160 250))
|
||||
R(l3 (-250 0) (250 4990))
|
||||
R(l3 (-1605 0) (1605 250))
|
||||
R(l7 (-1545 -250) (240 250))
|
||||
R(l8 (-560 -375) (690 510))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l3 (1625 1835) (2160 250))
|
||||
R(l3 (-250 0) (250 4990))
|
||||
R(l3 (-1605 0) (1605 250))
|
||||
|
|
@ -225,21 +225,21 @@ J(
|
|||
)
|
||||
X(TOP
|
||||
R((-305 350) (15415 9225))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l3 (12950 2130) (2160 250))
|
||||
R(l3 (-250 0) (250 4990))
|
||||
R(l3 (-1605 0) (1605 250))
|
||||
R(l7 (-1545 -250) (240 250))
|
||||
R(l8 (-560 -375) (690 510))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l3 (12100 7300) (640 530))
|
||||
R(l7 (-540 -415) (270 250))
|
||||
R(l8 (-1695 -250) (1695 250))
|
||||
R(l8 (-4075 -5650) (2630 250))
|
||||
R(l8 (-250 0) (250 5150))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l7 (6465 7325) (220 240))
|
||||
R(l8 (-4100 -5365) (3125 250))
|
||||
R(l8 (-250 0) (250 4860))
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ J(
|
|||
)
|
||||
X(INV
|
||||
R((-1500 -800) (3000 4600))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l6 (290 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -65,7 +65,7 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l5 (-1375 -925) (775 950))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l6 (290 2490) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -74,12 +74,12 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l2 (-1375 -925) (775 950))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l3 (-125 -250) (250 2500))
|
||||
R(l3 (-250 -3050) (250 1600))
|
||||
R(l3 (-250 1200) (250 1600))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(l6 (-510 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l6 (-220 2180) (220 220))
|
||||
|
|
@ -162,14 +162,14 @@ J(
|
|||
)
|
||||
X(INVCHAIN
|
||||
R((-915 -15) (10415 9215))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l3 (7340 1650) (2160 250))
|
||||
R(l3 (-250 0) (250 4990))
|
||||
R(l3 (-1605 0) (1605 250))
|
||||
R(l7 (-1545 -250) (240 250))
|
||||
R(l8 (-560 -375) (690 510))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l3 (1625 1835) (2160 250))
|
||||
R(l3 (-250 0) (250 4990))
|
||||
R(l3 (-1605 0) (1605 250))
|
||||
|
|
@ -228,21 +228,21 @@ J(
|
|||
)
|
||||
X(TOP
|
||||
R((-305 350) (15415 9225))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l3 (12950 2130) (2160 250))
|
||||
R(l3 (-250 0) (250 4990))
|
||||
R(l3 (-1605 0) (1605 250))
|
||||
R(l7 (-1545 -250) (240 250))
|
||||
R(l8 (-560 -375) (690 510))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l3 (12100 7300) (640 530))
|
||||
R(l7 (-540 -415) (270 250))
|
||||
R(l8 (-1695 -250) (1695 250))
|
||||
R(l8 (-4075 -5650) (2630 250))
|
||||
R(l8 (-250 0) (250 5150))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l7 (6465 7325) (220 240))
|
||||
R(l8 (-4100 -5365) (3125 250))
|
||||
R(l8 (-250 0) (250 4860))
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ J(
|
|||
)
|
||||
X(INV
|
||||
R((-1500 -800) (3000 4600))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l6 (290 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -62,7 +62,7 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l5 (-1375 -925) (775 950))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l6 (290 2490) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l8 (-290 -690) (360 760))
|
||||
|
|
@ -71,12 +71,12 @@ J(
|
|||
R(l10 (-2025 -775) (3000 900))
|
||||
R(l2 (-1375 -925) (775 950))
|
||||
)
|
||||
N(3
|
||||
N(3 I($3)
|
||||
R(l3 (-125 -250) (250 2500))
|
||||
R(l3 (-250 -3050) (250 1600))
|
||||
R(l3 (-250 1200) (250 1600))
|
||||
)
|
||||
N(4
|
||||
N(4 I($4)
|
||||
R(l6 (-510 -310) (220 220))
|
||||
R(l6 (-220 180) (220 220))
|
||||
R(l6 (-220 2180) (220 220))
|
||||
|
|
@ -159,14 +159,14 @@ J(
|
|||
)
|
||||
X(INVCHAIN
|
||||
R((-915 -15) (10415 9215))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l3 (7340 1650) (2160 250))
|
||||
R(l3 (-250 0) (250 4990))
|
||||
R(l3 (-1605 0) (1605 250))
|
||||
R(l7 (-1545 -250) (240 250))
|
||||
R(l8 (-560 -375) (690 510))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l3 (1625 1835) (2160 250))
|
||||
R(l3 (-250 0) (250 4990))
|
||||
R(l3 (-1605 0) (1605 250))
|
||||
|
|
@ -225,13 +225,13 @@ J(
|
|||
)
|
||||
X(TOP
|
||||
R((-305 350) (15415 9225))
|
||||
N(1
|
||||
N(1 I($1)
|
||||
R(l10 (3200 4800) (8800 400))
|
||||
R(l10 (-5110 -425) (0 0))
|
||||
R(l10 (-4295 30) (0 0))
|
||||
R(l10 (9270 -80) (0 0))
|
||||
)
|
||||
N(2
|
||||
N(2 I($2)
|
||||
R(l10 (-305 4435) (250 1220))
|
||||
R(l10 (3665 -4655) (2780 400))
|
||||
R(l10 (-2780 6900) (2815 440))
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ layout(
|
|||
rect(l11 (-300 -300) (400 400))
|
||||
text(l12 A (-200 -200))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect(l8 (1300 300) (200 200))
|
||||
rect(l8 (-200 -200) (200 200))
|
||||
rect(l8 (-200 300) (200 200))
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ layout(
|
|||
rect(l11 (-300 -300) (400 400))
|
||||
text(l12 A (-200 -200))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect(l8 (1300 300) (200 200))
|
||||
rect(l8 (-200 -200) (200 200))
|
||||
rect(l8 (-200 300) (200 200))
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ layout(
|
|||
rect(l11 (-300 -300) (400 400))
|
||||
text(l12 A (-200 -200))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect(l8 (1300 300) (200 200))
|
||||
rect(l8 (-200 -200) (200 200))
|
||||
rect(l8 (-200 300) (200 200))
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ layout(
|
|||
rect(l11 (-300 -300) (400 400))
|
||||
text(l12 A (-200 -200))
|
||||
)
|
||||
net(3
|
||||
net(3 name($3)
|
||||
rect(l8 (1300 300) (200 200))
|
||||
rect(l8 (-200 -200) (200 200))
|
||||
rect(l8 (-200 300) (200 200))
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ layout(
|
|||
rect((8285 720) (117975 57350))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l4 (120580 32490) (220 220))
|
||||
rect(l4 (-220 -745) (220 220))
|
||||
rect(l4 (-220 -745) (220 220))
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ layout(
|
|||
rect((8285 720) (117975 57350))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l4 (120580 32490) (220 220))
|
||||
rect(l4 (-220 -745) (220 220))
|
||||
rect(l4 (-220 -745) (220 220))
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ layout(
|
|||
rect((8285 720) (117975 57350))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l4 (120580 32490) (220 220))
|
||||
rect(l4 (-220 -745) (220 220))
|
||||
rect(l4 (-220 -745) (220 220))
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ layout(
|
|||
rect((8285 720) (117975 57350))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l4 (120580 32490) (220 220))
|
||||
rect(l4 (-220 -745) (220 220))
|
||||
rect(l4 (-220 -745) (220 220))
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ layout(
|
|||
rect((8285 720) (117975 57350))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l4 (120580 32490) (220 220))
|
||||
rect(l4 (-220 -745) (220 220))
|
||||
rect(l4 (-220 -745) (220 220))
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ layout(
|
|||
rect((8285 720) (117975 57350))
|
||||
|
||||
# Nets with their geometries
|
||||
net(1
|
||||
net(1 name($1)
|
||||
rect(l4 (120580 32490) (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
Loading…
Reference in New Issue