diff --git a/scripts/extract_doc.rb b/scripts/extract_doc.rb index 9e01f759c..54e51bfb1 100755 --- a/scripts/extract_doc.rb +++ b/scripts/extract_doc.rb @@ -2,9 +2,10 @@ $script_call = $0 + " " + ARGV.join(" ") -$indir="src/drc/drc/built-in-macros" +$indirs = [ "src/drc/drc/built-in-macros", "src/lvs/lvs/built-in-macros" ] + $loc = "about" -$outfiles="src/lay/lay/doc" +$outfiles = "src/lay/lay/doc" def create_ref(mod, s) if s =~ /(.*)::(.*)#(.*)/ @@ -262,53 +263,57 @@ collectors = { "LVS" => Collector::new("lvs", "LVS Reference") } -Dir.entries($indir).each do |p| +$indirs.each do |indir| - if p !~ /\.rb$/ - next - end + Dir.entries(indir).each do |p| - infile = File.join($indir, p) - puts "Extracting doc from #{infile} .." + if p !~ /\.rb$/ + next + end - File.open(infile, "r") do |file| + infile = File.join(indir, p) + puts "Extracting doc from #{infile} .." - block = [] - collector = nil - line = 0 + File.open(infile, "r") do |file| - file.each_line do |l| + block = [] + collector = nil + line = 0 - line += 1 + file.each_line do |l| - begin + line += 1 - l = unescape(l) + begin - if ! collector - collectors.each do |k,c| - if l =~ /^\s*#\s*%#{k}%/ - collector = c - l = nil - block = [] - break + l = unescape(l) + + if ! collector + collectors.each do |k,c| + if l =~ /^\s*#\s*%#{k}%/ + collector = c + l = nil + block = [] + break + end end end - end - if l - if l =~ /^\s*#\s*(.*)\s*$/ - collector && block.push($1) - elsif l =~ /^\s*$/ - collector && collector.add_block(block) - collector = nil + if l + if l =~ /^\s*#\s*(.*)\s*$/ + collector && block.push($1) + elsif l =~ /^\s*$/ + collector && collector.add_block(block) + collector = nil + end end + + rescue => ex + puts "ERROR in line #{line}:\n" + ex.to_s + puts ex.backtrace # @@@ + exit 1 end - rescue => ex - puts "ERROR in line #{line}:\n" + ex.to_s - puts ex.backtrace # @@@ - exit 1 end end diff --git a/scripts/make_drc_doc.sh b/scripts/make_drc_lvs_doc.sh similarity index 100% rename from scripts/make_drc_doc.sh rename to scripts/make_drc_lvs_doc.sh diff --git a/src/db/db/dbCircuit.cc b/src/db/db/dbCircuit.cc index dd3c6dc03..f608a9f77 100644 --- a/src/db/db/dbCircuit.cc +++ b/src/db/db/dbCircuit.cc @@ -88,9 +88,7 @@ Circuit::~Circuit () // the default destructor will make the nets access "this" to unregister the // objects - hence we have to do this explicitly. - m_nets.clear (); - m_subcircuits.clear (); - m_devices.clear (); + clear (); } Circuit &Circuit::operator= (const Circuit &other) @@ -376,14 +374,22 @@ void Circuit::flatten_subcircuit (SubCircuit *subcircuit) db::Net *outside_net = 0; if (n->pin_count () > 0) { + size_t pin_id = n->begin_pins ()->pin_id (); outside_net = subcircuit->net_for_pin (pin_id); + } else { + outside_net = new db::Net (); if (! n->name ().empty ()) { outside_net->set_name (subcircuit->expanded_name () + "." + n->name ()); } add_net (outside_net); + + if (netlist ()->callbacks ()) { + outside_net->set_cluster_id (netlist ()->callbacks ()->link_net_to_parent_circuit (n.operator-> (), this, subcircuit->trans ())); + } + } net2net.insert (std::make_pair (n.operator-> (), outside_net)); diff --git a/src/db/db/dbDeviceClass.cc b/src/db/db/dbDeviceClass.cc index 322885071..7ff6619f3 100644 --- a/src/db/db/dbDeviceClass.cc +++ b/src/db/db/dbDeviceClass.cc @@ -97,6 +97,41 @@ EqualDeviceParameters &EqualDeviceParameters::operator+= (const EqualDeviceParam return *this; } +// -------------------------------------------------------------------------------- +// AllDeviceParametersAreEqual class implementation + +AllDeviceParametersAreEqual::AllDeviceParametersAreEqual (double relative) + : m_relative (relative) +{ + // .. nothing yet .. +} + +bool AllDeviceParametersAreEqual::less (const db::Device &a, const db::Device &b) const +{ + const std::vector ¶meters = a.device_class ()->parameter_definitions (); + for (std::vector::const_iterator c = parameters.begin (); c != parameters.end (); ++c) { + int cmp = compare_parameters (a.parameter_value (c->id ()), b.parameter_value (c->id ()), 0.0, m_relative); + if (cmp != 0) { + return cmp < 0; + } + } + + return false; +} + +bool AllDeviceParametersAreEqual::equal (const db::Device &a, const db::Device &b) const +{ + const std::vector ¶meters = a.device_class ()->parameter_definitions (); + for (std::vector::const_iterator c = parameters.begin (); c != parameters.end (); ++c) { + int cmp = compare_parameters (a.parameter_value (c->id ()), b.parameter_value (c->id ()), 0.0, m_relative); + if (cmp != 0) { + return false; + } + } + + return true; +} + // -------------------------------------------------------------------------------- // DeviceClass class implementation diff --git a/src/db/db/dbDeviceClass.h b/src/db/db/dbDeviceClass.h index bb433ea92..62530e712 100644 --- a/src/db/db/dbDeviceClass.h +++ b/src/db/db/dbDeviceClass.h @@ -286,6 +286,22 @@ private: std::vector > > m_compare_set; }; +/** + * @brief A parameter compare delegate that compares all parameters in a relative fashion + */ +class DB_PUBLIC AllDeviceParametersAreEqual + : public DeviceParameterCompareDelegate +{ +public: + AllDeviceParametersAreEqual (double relative); + + virtual bool less (const db::Device &a, const db::Device &b) const; + virtual bool equal (const db::Device &a, const db::Device &b) const; + +private: + double m_relative; +}; + /** * @brief A device class * diff --git a/src/db/db/dbHierNetworkProcessor.cc b/src/db/db/dbHierNetworkProcessor.cc index 2005b010c..f2e88a520 100644 --- a/src/db/db/dbHierNetworkProcessor.cc +++ b/src/db/db/dbHierNetworkProcessor.cc @@ -41,6 +41,25 @@ namespace db { +// ------------------------------------------------------------------------------ + +template void insert_transformed (db::Layout &layout, Container &shapes, const Shape &s, const Trans &t); + +template void insert_transformed (db::Layout &layout, Container &shapes, const db::PolygonRef &s, const Trans &t) +{ + db::Polygon poly = s.obj (); + poly.transform (s.trans ()); + if (! t.is_unity ()) { + poly.transform (t); + } + shapes.insert (db::PolygonRef (poly, layout.shape_repository ())); +} + +template void insert_transformed (db::Layout & /*layout*/, Container &shapes, const db::Edge &s, const Trans &t) +{ + shapes.insert (s.transformed (t)); +} + // ------------------------------------------------------------------------------ // Connectivity implementation @@ -993,7 +1012,6 @@ connected_clusters::join_cluster_with (typename local_cluster::id_type id, return; } - // join the shape clusters local_clusters::join_cluster_with (id, with_id); // handle the connections by translating @@ -2115,23 +2133,6 @@ hier_clusters::clusters_per_cell (db::cell_index_type cell_index) return c->second; } -template void insert_transformed (db::Layout &layout, db::Shapes &shapes, const Shape &s, const Trans &t); - -template void insert_transformed (db::Layout &layout, db::Shapes &shapes, const db::PolygonRef &s, const Trans &t) -{ - db::Polygon poly = s.obj (); - poly.transform (s.trans ()); - if (! t.is_unity ()) { - poly.transform (t); - } - shapes.insert (db::PolygonRef (poly, layout.shape_repository ())); -} - -template void insert_transformed (db::Layout & /*layout*/, db::Shapes &shapes, const db::Edge &s, const Trans &t) -{ - shapes.insert (s.transformed (t)); -} - template void hier_clusters::return_to_hierarchy (db::Layout &layout, const std::map &lm) const diff --git a/src/db/db/dbHierNetworkProcessor.h b/src/db/db/dbHierNetworkProcessor.h index 112648e9c..03d2df07c 100644 --- a/src/db/db/dbHierNetworkProcessor.h +++ b/src/db/db/dbHierNetworkProcessor.h @@ -522,6 +522,14 @@ public: return --m_next_dummy_id; } + /** + * @brief Gets a value indicating whether the given ID is a dummy ID + */ + bool is_dummy (typename local_cluster::id_type id) const + { + return id > m_clusters.size (); + } + private: void ensure_sorted (); @@ -600,12 +608,20 @@ public: return m_inst_prop_id; } + /** + * @brief Transform with the given transformation + */ + void transform (const db::ICplxTrans &tr) + { + m_inst_trans = tr * m_inst_trans; + } + /** * @brief Equality */ bool operator== (const ClusterInstElement &other) const { - return m_inst_cell_index == other.m_inst_cell_index && m_inst_trans == other.m_inst_trans && m_inst_prop_id == other.m_inst_prop_id; + return m_inst_cell_index == other.m_inst_cell_index && m_inst_trans.equal (other.m_inst_trans) && m_inst_prop_id == other.m_inst_prop_id; } /** @@ -624,8 +640,8 @@ public: if (m_inst_cell_index != other.m_inst_cell_index) { return m_inst_cell_index < other.m_inst_cell_index; } - if (m_inst_trans != other.m_inst_trans) { - return m_inst_trans < other.m_inst_trans; + if (! m_inst_trans.equal (other.m_inst_trans)) { + return m_inst_trans.less (other.m_inst_trans); } return m_inst_prop_id < other.m_inst_prop_id; } @@ -803,7 +819,7 @@ public: * The "with_id" cluster is removed. All connections of "with_id" are transferred to the * first one. All shapes of "with_id" are transferred to "id". */ - void join_cluster_with (typename local_cluster::id_type id, typename local_cluster::id_type with_id); + void join_cluster_with(typename local_cluster::id_type id, typename local_cluster::id_type with_id); /** * @brief An iterator delivering all clusters (even the connectors) diff --git a/src/db/db/dbLayoutToNetlist.cc b/src/db/db/dbLayoutToNetlist.cc index 4e339c96e..9138a3e4f 100644 --- a/src/db/db/dbLayoutToNetlist.cc +++ b/src/db/db/dbLayoutToNetlist.cc @@ -38,7 +38,7 @@ namespace db // the iterator provides the hierarchical selection (enabling/disabling cells etc.) LayoutToNetlist::LayoutToNetlist (const db::RecursiveShapeIterator &iter) - : m_iter (iter), m_layout_index (0), m_netlist_extracted (false), m_is_flat (false) + : m_iter (iter), m_layout_index (0), m_netlist_extracted (false), m_is_flat (false), m_device_scaling (1.0) { // check the iterator if (iter.has_complex_region () || iter.region () != db::Box::world ()) { @@ -58,7 +58,7 @@ LayoutToNetlist::LayoutToNetlist (const db::RecursiveShapeIterator &iter) } LayoutToNetlist::LayoutToNetlist (db::DeepShapeStore *dss, unsigned int layout_index) - : mp_dss (dss), m_layout_index (layout_index), m_netlist_extracted (false), m_is_flat (false) + : mp_dss (dss), m_layout_index (layout_index), m_netlist_extracted (false), m_is_flat (false), m_device_scaling (1.0) { if (dss->is_valid_layout_index (m_layout_index)) { m_iter = db::RecursiveShapeIterator (dss->layout (m_layout_index), dss->initial_cell (m_layout_index), std::set ()); @@ -66,7 +66,7 @@ LayoutToNetlist::LayoutToNetlist (db::DeepShapeStore *dss, unsigned int layout_i } LayoutToNetlist::LayoutToNetlist (const std::string &topcell_name, double dbu) - : m_iter (), m_netlist_extracted (false), m_is_flat (true) + : m_iter (), m_netlist_extracted (false), m_is_flat (true), m_device_scaling (1.0) { mp_internal_dss.reset (new db::DeepShapeStore (topcell_name, dbu)); mp_dss.reset (mp_internal_dss.get ()); @@ -77,7 +77,7 @@ LayoutToNetlist::LayoutToNetlist (const std::string &topcell_name, double dbu) LayoutToNetlist::LayoutToNetlist () : m_iter (), mp_internal_dss (new db::DeepShapeStore ()), mp_dss (mp_internal_dss.get ()), m_layout_index (0), - m_netlist_extracted (false), m_is_flat (false) + m_netlist_extracted (false), m_is_flat (false), m_device_scaling (1.0) { init (); } @@ -136,6 +136,16 @@ size_t LayoutToNetlist::max_vertex_count () const return dss ().max_vertex_count (); } +void LayoutToNetlist::set_device_scaling (double s) +{ + m_device_scaling = s; +} + +double LayoutToNetlist::device_scaling () const +{ + return m_device_scaling; +} + db::Region *LayoutToNetlist::make_layer (const std::string &n) { db::RecursiveShapeIterator si (m_iter); @@ -187,15 +197,37 @@ db::Region *LayoutToNetlist::make_polygon_layer (unsigned int layer_index, const return region.release (); } +size_t LayoutToNetlist::link_net_to_parent_circuit (const Net *subcircuit_net, Circuit *parent_circuit, const DCplxTrans &dtrans) +{ + if (! subcircuit_net->circuit () || ! has_internal_layout () || ! internal_layout ()->is_valid_cell_index (parent_circuit->cell_index ())) { + return 0; + } + + db::CplxTrans dbu_trans (internal_layout ()->dbu ()); + db::ICplxTrans trans = dbu_trans.inverted () * dtrans * dbu_trans; + + connected_clusters &parent_net_clusters = m_net_clusters.clusters_per_cell (parent_circuit->cell_index ()); + + size_t id = parent_net_clusters.insert_dummy (); // @@@ + + parent_net_clusters.add_connection (id, db::ClusterInstance (subcircuit_net->cluster_id (), subcircuit_net->circuit ()->cell_index (), trans, 0)); + return id; +} + +void LayoutToNetlist::ensure_netlist () +{ + if (! mp_netlist.get ()) { + mp_netlist.reset (new db::Netlist (this)); + } +} + void LayoutToNetlist::extract_devices (db::NetlistDeviceExtractor &extractor, const std::map &layers) { if (m_netlist_extracted) { throw tl::Exception (tl::to_string (tr ("The netlist has already been extracted"))); } - if (! mp_netlist.get ()) { - mp_netlist.reset (new db::Netlist ()); - } - extractor.extract (dss (), m_layout_index, layers, *mp_netlist, m_net_clusters); + ensure_netlist (); + extractor.extract (dss (), m_layout_index, layers, *mp_netlist, m_net_clusters, m_device_scaling); } void LayoutToNetlist::connect (const db::Region &l) @@ -267,9 +299,7 @@ void LayoutToNetlist::extract_netlist (const std::string &joined_net_names) if (m_netlist_extracted) { throw tl::Exception (tl::to_string (tr ("The netlist has already been extracted"))); } - if (! mp_netlist.get ()) { - mp_netlist.reset (new db::Netlist ()); - } + ensure_netlist (); db::NetlistExtractor netex; netex.extract_nets (dss (), m_layout_index, m_conn, *mp_netlist, m_net_clusters, joined_net_names); @@ -282,6 +312,11 @@ void LayoutToNetlist::set_netlist_extracted () m_netlist_extracted = true; } +bool LayoutToNetlist::has_internal_layout () const +{ + return mp_dss.get () && mp_dss->is_valid_layout_index (m_layout_index); +} + const db::Layout *LayoutToNetlist::internal_layout () const { ensure_layout (); @@ -530,9 +565,7 @@ db::Netlist *LayoutToNetlist::netlist () const db::Netlist *LayoutToNetlist::make_netlist () { - if (! mp_netlist.get ()) { - mp_netlist.reset (new db::Netlist ()); - } + ensure_netlist (); return mp_netlist.get (); } diff --git a/src/db/db/dbLayoutToNetlist.h b/src/db/db/dbLayoutToNetlist.h index cb5485a8b..e2287a301 100644 --- a/src/db/db/dbLayoutToNetlist.h +++ b/src/db/db/dbLayoutToNetlist.h @@ -70,7 +70,7 @@ namespace db * @li */ class DB_PUBLIC LayoutToNetlist - : public gsi::ObjectBase, public tl::Object + : public gsi::ObjectBase, public db::NetlistManipulationCallbacks { public: typedef std::map::const_iterator layer_iterator; @@ -220,6 +220,18 @@ public: */ size_t max_vertex_count () const; + /** + * @brief Sets the device scaling factor + * This factor will scale the physical properties of the extracted devices + * accordingly. The scale factor applies an isotropic shrink (<1) or expansion (>1). + */ + void set_device_scaling (double s); + + /** + * @brief Gets the device scaling factor + */ + double device_scaling () const; + /** * @brief Register a layer under the given name * This is a formal name for the layer. Using a name or layer properties @@ -397,6 +409,11 @@ public: return *mp_dss; } + /** + * @brief Returns true, if there a layout is set + */ + bool has_internal_layout () const; + /** * @brief Gets the internal layout */ @@ -711,6 +728,7 @@ private: std::map m_name_of_layer; bool m_netlist_extracted; bool m_is_flat; + double m_device_scaling; db::DeepLayer m_dummy_layer; struct CellReuseTableKey @@ -743,6 +761,7 @@ private: typedef std::map cell_reuse_table_type; void init (); + void ensure_netlist (); size_t search_net (const db::ICplxTrans &trans, const db::Cell *cell, const db::local_cluster &test_cluster, std::vector &rev_inst_path); void build_net_rec (const db::Net &net, db::Layout &target, cell_index_type circuit_cell, const db::CellMapping &cmap, const std::map &lmap, const char *net_cell_name_prefix, db::properties_id_type netname_propid, BuildNetHierarchyMode hier_mode, const char *cell_name_prefix, const char *device_cell_name_prefix, cell_reuse_table_type &reuse_table, const ICplxTrans &tr) const; void build_net_rec (const db::Net &net, db::Layout &target, db::Cell &target_cell, const std::map &lmap, const char *net_cell_name_prefix, db::properties_id_type netname_propid, BuildNetHierarchyMode hier_mode, const char *cell_name_prefix, const char *device_cell_name_prefix, cell_reuse_table_type &reuse_table, const ICplxTrans &tr) const; @@ -752,6 +771,9 @@ private: std::string make_new_name (const std::string &stem = std::string ()); db::properties_id_type make_netname_propid (db::Layout &ly, const tl::Variant &netname_prop, const db::Net &net) const; db::CellMapping make_cell_mapping_into (db::Layout &layout, db::Cell &cell, const std::vector *nets, bool with_device_cells); + + // implementation of NetlistManipulationCallbacks + virtual size_t link_net_to_parent_circuit (const Net *subcircuit_net, Circuit *parent_circuit, const DCplxTrans &trans); }; } diff --git a/src/db/db/dbNetlist.cc b/src/db/db/dbNetlist.cc index 9b245fbf1..6b536c817 100644 --- a/src/db/db/dbNetlist.cc +++ b/src/db/db/dbNetlist.cc @@ -30,8 +30,9 @@ namespace db // -------------------------------------------------------------------------------- // Netlist class implementation -Netlist::Netlist () - : m_valid_topology (false), m_lock_count (0), +Netlist::Netlist (NetlistManipulationCallbacks *callbacks) + : mp_callbacks (callbacks), + m_valid_topology (false), m_lock_count (0), m_circuit_by_name (this, &Netlist::begin_circuits, &Netlist::end_circuits), m_circuit_by_cell_index (this, &Netlist::begin_circuits, &Netlist::end_circuits), m_device_abstract_by_name (this, &Netlist::begin_device_abstracts, &Netlist::end_device_abstracts), diff --git a/src/db/db/dbNetlist.h b/src/db/db/dbNetlist.h index df443c2c0..da26bd399 100644 --- a/src/db/db/dbNetlist.h +++ b/src/db/db/dbNetlist.h @@ -35,6 +35,20 @@ namespace db { +/** + * @brief An interface which connects the netlist with a layout representation + * Specifically this interface allows manipulating the layout in sync with the netlist. + */ +class DB_PUBLIC NetlistManipulationCallbacks + : public tl::Object +{ +public: + NetlistManipulationCallbacks () { } + virtual ~NetlistManipulationCallbacks () { } + + virtual size_t link_net_to_parent_circuit (const db::Net *subcircuit_net, db::Circuit *parent_circuit, const db::DCplxTrans &trans) = 0; +}; + /** * @brief The netlist class * @@ -65,7 +79,7 @@ public: * * This constructor creates an empty hierarchical netlist */ - Netlist (); + Netlist (NetlistManipulationCallbacks *callbacks = 0); /** * @brief Copy constructor @@ -480,6 +494,7 @@ private: friend class Circuit; friend class DeviceAbstract; + tl::weak_ptr mp_callbacks; circuit_list m_circuits; device_class_list m_device_classes; device_abstract_list m_device_abstracts; @@ -494,6 +509,11 @@ private: object_by_attr > m_device_abstract_by_name; object_by_attr > m_device_abstract_by_cell_index; + db::NetlistManipulationCallbacks *callbacks () + { + return mp_callbacks.get (); + } + void invalidate_topology (); void validate_topology (); void circuits_changed (); diff --git a/src/db/db/dbNetlistCompare.cc b/src/db/db/dbNetlistCompare.cc index 11fb51ba2..c1ee28855 100644 --- a/src/db/db/dbNetlistCompare.cc +++ b/src/db/db/dbNetlistCompare.cc @@ -2083,6 +2083,49 @@ NetlistComparer::compare (const db::Netlist *a, const db::Netlist *b, NetlistCom return res; } +void +NetlistComparer::unmatched_circuits (db::Netlist *a, db::Netlist *b, std::vector &in_a, std::vector &in_b) const +{ + // we need to create a copy because this method is supposed to be const. + db::CircuitCategorizer circuit_categorizer = *mp_circuit_categorizer; + + std::map > cat2circuits; + + for (db::Netlist::circuit_iterator i = a->begin_circuits (); i != a->end_circuits (); ++i) { + size_t cat = circuit_categorizer.cat_for_circuit (i.operator-> ()); + if (cat && i->begin_refs () != i->end_refs ()) { + cat2circuits[cat].first = i.operator-> (); + } + } + + for (db::Netlist::circuit_iterator i = b->begin_circuits (); i != b->end_circuits (); ++i) { + size_t cat = circuit_categorizer.cat_for_circuit (i.operator-> ()); + if (cat && i->begin_refs () != i->end_refs ()) { + cat2circuits[cat].second = i.operator-> (); + } + } + + size_t na = 0, nb = 0; + for (std::map >::const_iterator i = cat2circuits.begin (); i != cat2circuits.end (); ++i) { + if (! i->second.first) { + ++nb; + } else if (! i->second.second) { + ++na; + } + } + + in_a.reserve (na); + in_b.reserve (nb); + + for (std::map >::const_iterator i = cat2circuits.begin (); i != cat2circuits.end (); ++i) { + if (! i->second.first) { + in_b.push_back (i->second.second); + } else if (! i->second.second) { + in_a.push_back (i->second.first); + } + } +} + bool NetlistComparer::compare (const db::Netlist *a, const db::Netlist *b) const { @@ -2368,6 +2411,42 @@ struct KeySize } }; +struct DeviceConnectionDistance +{ + typedef std::pair >, std::pair > value_type; + + double operator() (const value_type &a, const value_type &b) const + { + int d = 0.0; + for (std::vector >::const_iterator i = a.first.begin (), j = b.first.begin (); i != a.first.end () && j != b.first.end (); ++i, ++j) { + if (i->second != j->second || i->second == std::numeric_limits::max () || j->second == std::numeric_limits::max ()) { + ++d; + } + } + return double (d); + } +}; + +struct DeviceParametersCompare +{ + typedef std::pair >, std::pair > value_type; + + bool operator() (const value_type &a, const value_type &b) const + { + // category and parameters + return m_dc (a.second, b.second); + } + + bool equals (const value_type &a, const value_type &b) const + { + // category and parameters + return m_dc.equals (a.second, b.second); + } + +private: + db::DeviceCompare m_dc; +}; + template void align (Iter i1, Iter i2, Iter j1, Iter j2, Distance distance) { @@ -2403,12 +2482,12 @@ void align (Iter i1, Iter i2, Iter j1, Iter j2, Distance distance) any_swapped = false; - for (size_t m = n + 1; m < vj.size () - 1; ++m) { + for (size_t m = n + 1; m < vj.size (); ++m) { if (vi [n] == Iter () || vi [m] == Iter () || vj [n] == Iter () || vj [m] == Iter ()) { continue; } else if (distance (*vi [n], *vj [m]) + distance (*vi [m], *vj [n]) < distance (*vi [n], *vj [n]) + distance (*vi [m], *vj [m])) { // this will reduce the overall distance: - std::swap (vj [n], vj [m]); + std::swap (*vj [n], *vj [m]); any_swapped = true; } } @@ -2419,7 +2498,14 @@ void align (Iter i1, Iter i2, Iter j1, Iter j2, Distance distance) } bool -NetlistComparer::compare_circuits (const db::Circuit *c1, const db::Circuit *c2, db::DeviceCategorizer &device_categorizer, db::CircuitCategorizer &circuit_categorizer, db::CircuitPinMapper &circuit_pin_mapper, const std::vector > &net_identity, bool &pin_mismatch, std::map &c12_circuit_and_pin_mapping, std::map &c22_circuit_and_pin_mapping) const +NetlistComparer::compare_circuits (const db::Circuit *c1, const db::Circuit *c2, + db::DeviceCategorizer &device_categorizer, + db::CircuitCategorizer &circuit_categorizer, + db::CircuitPinMapper &circuit_pin_mapper, + const std::vector > &net_identity, + bool &pin_mismatch, + std::map &c12_circuit_and_pin_mapping, + std::map &c22_circuit_and_pin_mapping) const { db::DeviceFilter device_filter (m_cap_threshold, m_res_threshold); @@ -2562,7 +2648,16 @@ NetlistComparer::compare_circuits (const db::Circuit *c1, const db::Circuit *c2, } } + do_pin_assignment (c1, g1, c2, g2, c12_circuit_and_pin_mapping, c22_circuit_and_pin_mapping, pin_mismatch, good); + do_device_assignment (c1, g1, c2, g2, device_filter, device_categorizer, good); + do_subcircuit_assignment (c1, g1, c2, g2, circuit_categorizer, circuit_pin_mapper, c12_circuit_and_pin_mapping, c22_circuit_and_pin_mapping, good); + return good; +} + +void +NetlistComparer::do_pin_assignment (const db::Circuit *c1, const db::NetGraph &g1, const db::Circuit *c2, const db::NetGraph &g2, std::map &c12_circuit_and_pin_mapping, std::map &c22_circuit_and_pin_mapping, bool &pin_mismatch, bool &good) const +{ // Report pin assignment // This step also does the pin identity mapping. @@ -2742,10 +2837,18 @@ NetlistComparer::compare_circuits (const db::Circuit *c1, const db::Circuit *c2, } +} + +void +NetlistComparer::do_device_assignment (const db::Circuit *c1, const db::NetGraph &g1, const db::Circuit *c2, const db::NetGraph &g2, const db::DeviceFilter &device_filter, db::DeviceCategorizer &device_categorizer, bool &good) const +{ // Report device assignment std::multimap >, std::pair > device_map; + typedef std::vector >, std::pair > > unmatched_list; + unmatched_list unmatched_a, unmatched_b; + for (db::Circuit::const_device_iterator d = c1->begin_devices (); d != c1->end_devices (); ++d) { if (! device_filter.filter (d.operator-> ())) { @@ -2761,15 +2864,16 @@ NetlistComparer::compare_circuits (const db::Circuit *c1, const db::Circuit *c2, std::vector > k = compute_device_key (*d, g1); bool mapped = true; - for (std::vector >::iterator i = k.begin (); i != k.end () && mapped; ++i) { + for (std::vector >::iterator i = k.begin (); i != k.end (); ++i) { if (! g1.begin () [i->second].has_other ()) { + i->second = std::numeric_limits::max (); // normalization mapped = false; } } if (! mapped) { if (mp_logger) { - mp_logger->device_mismatch (d.operator-> (), 0); + unmatched_a.push_back (std::make_pair (k, std::make_pair (d.operator-> (), device_cat))); } good = false; } else { @@ -2796,6 +2900,7 @@ NetlistComparer::compare_circuits (const db::Circuit *c1, const db::Circuit *c2, bool mapped = true; for (std::vector >::iterator i = k.begin (); i != k.end (); ++i) { if (! g2.begin () [i->second].has_other ()) { + i->second = std::numeric_limits::max (); // normalization mapped = false; } else { i->second = g2.begin () [i->second].other_net_index (); @@ -2809,7 +2914,7 @@ NetlistComparer::compare_circuits (const db::Circuit *c1, const db::Circuit *c2, if (! mapped || dm == device_map.end () || dm->first != k) { if (mp_logger) { - mp_logger->device_mismatch (0, d.operator-> ()); + unmatched_b.push_back (std::make_pair (k, std::make_pair (d.operator-> (), device_cat))); } good = false; @@ -2843,12 +2948,90 @@ NetlistComparer::compare_circuits (const db::Circuit *c1, const db::Circuit *c2, for (std::multimap >, std::pair >::const_iterator dm = device_map.begin (); dm != device_map.end (); ++dm) { if (mp_logger) { - mp_logger->device_mismatch (dm->second.first, 0); + unmatched_a.push_back (*dm); } good = false; } + // try to do some better mapping of unmatched devices - they will still be reported as mismatching, but their pairing gives some hint + // what to fix. + if (mp_logger) { + + size_t max_analysis_set = 1000; + if (unmatched_a.size () + unmatched_b.size () > max_analysis_set) { + + // don't try too much analysis - this may be a waste of time + for (unmatched_list::const_iterator i = unmatched_a.begin (); i != unmatched_a.end (); ++i) { + mp_logger->device_mismatch (i->second.first, 0); + } + for (unmatched_list::const_iterator i = unmatched_b.begin (); i != unmatched_b.end (); ++i) { + mp_logger->device_mismatch (0, i->second.first); + } + + } else { + + DeviceParametersCompare cmp; + + std::sort (unmatched_a.begin (), unmatched_a.end (), cmp); + std::sort (unmatched_b.begin (), unmatched_b.end (), cmp); + + for (unmatched_list::iterator i = unmatched_a.begin (), j = unmatched_b.begin (); i != unmatched_a.end () || j != unmatched_b.end (); ) { + + while (j != unmatched_b.end () && (i == unmatched_a.end () || !cmp.equals (*j, *i))) { + mp_logger->device_mismatch (0, j->second.first); + ++j; + } + + while (i != unmatched_a.end () && (j == unmatched_b.end () || !cmp.equals (*i, *j))) { + mp_logger->device_mismatch (i->second.first, 0); + ++i; + } + + if (i == unmatched_a.end () && j == unmatched_b.end ()) { + break; + } + + unmatched_list::iterator ii = i, jj = j; + ++i, ++j; + size_t n = ii->first.size (); + tl_assert (n == jj->first.size ()); + + while (i != unmatched_a.end () && cmp.equals (*i, *ii)) { + ++i; + } + + while (j != unmatched_b.end () && cmp.equals (*j, *jj)) { + ++j; + } + + if (i - ii == size_t(2)) { + printf("@@@1\n"); fflush(stdout); + } + align (ii, i, jj, j, DeviceConnectionDistance ()); + + for ( ; ii != i && jj != j; ++ii, ++jj) { + mp_logger->device_mismatch (ii->second.first, jj->second.first); + } + + for ( ; jj != j; ++jj) { + mp_logger->device_mismatch (0, jj->second.first); + } + + for ( ; ii != i; ++ii) { + mp_logger->device_mismatch (ii->second.first, 0); + } + + } + + } + + } +} + +void +NetlistComparer::do_subcircuit_assignment (const db::Circuit *c1, const db::NetGraph &g1, const db::Circuit *c2, const db::NetGraph &g2, CircuitCategorizer &circuit_categorizer, const CircuitPinMapper &circuit_pin_mapper, std::map &c12_circuit_and_pin_mapping, std::map &c22_circuit_and_pin_mapping, bool &good) const +{ // Report subcircuit assignment std::multimap >, std::pair > subcircuit_map; @@ -3012,8 +3195,6 @@ NetlistComparer::compare_circuits (const db::Circuit *c1, const db::Circuit *c2, } } - - return good; } } diff --git a/src/db/db/dbNetlistCompare.h b/src/db/db/dbNetlistCompare.h index 7fa46f99a..774936442 100644 --- a/src/db/db/dbNetlistCompare.h +++ b/src/db/db/dbNetlistCompare.h @@ -33,9 +33,11 @@ namespace db { class CircuitPinMapper; +class DeviceFilter; class DeviceCategorizer; class CircuitCategorizer; class CircuitMapper; +class NetGraph; /** * @brief A receiver for netlist compare events @@ -266,6 +268,13 @@ public: return m_max_n_branch; } + /** + * @brief Gets the list of circuits without matching circuit in the other netlist + * The result can be used to flatten these circuits prior to compare. + * Mismatching top level circuits are not reported because they cannot be flattened. + */ + void unmatched_circuits (db::Netlist *a, db::Netlist *b, std::vector &in_a, std::vector &in_b) const; + /** * @brief Actually compares the two netlists */ @@ -285,6 +294,9 @@ protected: bool compare_circuits (const db::Circuit *c1, const db::Circuit *c2, db::DeviceCategorizer &device_categorizer, db::CircuitCategorizer &circuit_categorizer, db::CircuitPinMapper &circuit_pin_mapper, const std::vector > &net_identity, bool &pin_mismatch, std::map &c12_circuit_and_pin_mapping, std::map &c22_circuit_and_pin_mapping) const; bool all_subcircuits_verified (const db::Circuit *c, const std::set &verified_circuits) const; static void derive_pin_equivalence (const db::Circuit *ca, const db::Circuit *cb, CircuitPinMapper *circuit_pin_mapper); + void do_pin_assignment (const db::Circuit *c1, const db::NetGraph &g1, const db::Circuit *c2, const db::NetGraph &g2, std::map &c12_circuit_and_pin_mapping, std::map &c22_circuit_and_pin_mapping, bool &pin_mismatch, bool &good) const; + void do_device_assignment (const db::Circuit *c1, const db::NetGraph &g1, const db::Circuit *c2, const db::NetGraph &g2, const db::DeviceFilter &device_filter, DeviceCategorizer &device_categorizer, bool &good) const; + void do_subcircuit_assignment (const db::Circuit *c1, const db::NetGraph &g1, const db::Circuit *c2, const db::NetGraph &g2, CircuitCategorizer &circuit_categorizer, const db::CircuitPinMapper &circuit_pin_mapper, std::map &c12_circuit_and_pin_mapping, std::map &c22_circuit_and_pin_mapping, bool &good) const; mutable NetlistCompareLogger *mp_logger; std::map, std::vector > > m_same_nets; diff --git a/src/db/db/dbNetlistCrossReference.cc b/src/db/db/dbNetlistCrossReference.cc index 5b6ad9ee7..344969908 100644 --- a/src/db/db/dbNetlistCrossReference.cc +++ b/src/db/db/dbNetlistCrossReference.cc @@ -141,6 +141,36 @@ struct by_expanded_name_value_compare } }; +struct ByDeviceClassNameCompare +{ + int operator() (const db::Device &a, const db::Device &b) const + { + if ((a.device_class () == 0) != (b.device_class () == 0)) { + return a.device_class () == 0 ? -1 : 1; + } + if (a.device_class () == 0) { + return 0; + } else { + return string_value_compare (a.device_class ()->name (), b.device_class ()->name ()); + } + } +}; + +struct ByRefCircuitNameCompare +{ + int operator() (const db::SubCircuit &a, const db::SubCircuit &b) const + { + if ((a.circuit_ref () == 0) != (b.circuit_ref () == 0)) { + return a.circuit_ref () == 0 ? -1 : 1; + } + if (a.circuit_ref () == 0) { + return 0; + } else { + return string_value_compare (a.circuit_ref ()->name (), b.circuit_ref ()->name ()); + } + } +}; + template struct net_object_compare; @@ -246,11 +276,17 @@ struct SortNetSubCircuitPins } void -NetlistCrossReference::gen_end_netlist (const db::Netlist *, const db::Netlist *) +NetlistCrossReference::sort_netlist () { std::sort (m_circuits.begin (), m_circuits.end (), CircuitsCompareByName ()); } +void +NetlistCrossReference::gen_end_netlist (const db::Netlist *, const db::Netlist *) +{ + // .. nothing yet .. +} + void NetlistCrossReference::establish_pair (const db::Circuit *a, const db::Circuit *b) { @@ -323,16 +359,21 @@ NetlistCrossReference::gen_begin_circuit (const db::Circuit *a, const db::Circui establish_pair (a, b); } +void +NetlistCrossReference::sort_circuit () +{ + std::stable_sort (mp_per_circuit_data->devices.begin (), mp_per_circuit_data->devices.end (), pair_data_compare ()); + std::stable_sort (mp_per_circuit_data->subcircuits.begin (), mp_per_circuit_data->subcircuits.end (), pair_data_compare ()); + + std::stable_sort (mp_per_circuit_data->pins.begin (), mp_per_circuit_data->pins.end (), pair_data_compare > ()); + std::stable_sort (mp_per_circuit_data->nets.begin (), mp_per_circuit_data->nets.end (), pair_data_compare > ()); +} + void NetlistCrossReference::gen_end_circuit (const db::Circuit *, const db::Circuit *, Status status) { mp_per_circuit_data->status = status; - std::stable_sort (mp_per_circuit_data->devices.begin (), mp_per_circuit_data->devices.end (), pair_data_compare > ()); - std::stable_sort (mp_per_circuit_data->pins.begin (), mp_per_circuit_data->pins.end (), pair_data_compare > ()); - std::stable_sort (mp_per_circuit_data->subcircuits.begin (), mp_per_circuit_data->subcircuits.end (), pair_data_compare > ()); - std::stable_sort (mp_per_circuit_data->nets.begin (), mp_per_circuit_data->nets.end (), pair_data_compare > ()); - m_current_circuits = std::make_pair((const db::Circuit *)0, (const db::Circuit *)0); mp_per_circuit_data = 0; } diff --git a/src/db/db/dbNetlistCrossReference.h b/src/db/db/dbNetlistCrossReference.h index 176750208..3b1b8ae85 100644 --- a/src/db/db/dbNetlistCrossReference.h +++ b/src/db/db/dbNetlistCrossReference.h @@ -153,6 +153,7 @@ public: virtual void end_netlist (const db::Netlist *a, const db::Netlist *b) { + sort_netlist (); gen_end_netlist (a, b); } @@ -163,6 +164,7 @@ public: virtual void end_circuit (const db::Circuit *a, const db::Circuit *b, bool matching) { + sort_circuit (); gen_end_circuit (a, b, matching ? Match : NoMatch); } @@ -291,6 +293,8 @@ private: void establish_pair (const db::Device *a, const db::Device *b, Status status); void establish_pair (const db::Pin *a, const db::Pin *b, Status status); void establish_pair (const db::SubCircuit *a, const db::SubCircuit *b, Status status); + void sort_circuit (); + void sort_netlist (); void build_per_net_info (const std::pair &nets, PerNetData &data) const; void build_subcircuit_pin_refs (const std::pair &nets, PerNetData &data) const; diff --git a/src/db/db/dbNetlistDeviceExtractor.cc b/src/db/db/dbNetlistDeviceExtractor.cc index 77df10bd1..5f1bc66c0 100644 --- a/src/db/db/dbNetlistDeviceExtractor.cc +++ b/src/db/db/dbNetlistDeviceExtractor.cc @@ -75,7 +75,7 @@ std::string NetlistDeviceExtractorError::to_string () const // NetlistDeviceExtractor implementation NetlistDeviceExtractor::NetlistDeviceExtractor (const std::string &name) - : mp_layout (0), m_cell_index (0), mp_circuit (0) + : mp_layout (0), m_cell_index (0), m_device_scaling (1.0), mp_circuit (0) { m_name = name; m_terminal_id_propname_id = 0; @@ -110,6 +110,7 @@ void NetlistDeviceExtractor::initialize (db::Netlist *nl) { m_layer_definitions.clear (); mp_device_class = 0; + m_device_scaling = 1.0; m_terminal_id_propname_id = 0; m_device_id_propname_id = 0; m_device_class_propname_id = 0; @@ -123,7 +124,7 @@ static void insert_into_region (const db::PolygonRef &s, const db::ICplxTrans &t region.insert (s.obj ().transformed (tr * db::ICplxTrans (s.trans ()))); } -void NetlistDeviceExtractor::extract (db::DeepShapeStore &dss, unsigned int layout_index, const NetlistDeviceExtractor::input_layers &layer_map, db::Netlist &nl, hier_clusters_type &clusters) +void NetlistDeviceExtractor::extract (db::DeepShapeStore &dss, unsigned int layout_index, const NetlistDeviceExtractor::input_layers &layer_map, db::Netlist &nl, hier_clusters_type &clusters, double device_scaling) { initialize (&nl); @@ -183,13 +184,13 @@ void NetlistDeviceExtractor::extract (db::DeepShapeStore &dss, unsigned int layo } - extract_without_initialize (dss.layout (layout_index), dss.initial_cell (layout_index), clusters, layers); + extract_without_initialize (dss.layout (layout_index), dss.initial_cell (layout_index), clusters, layers, device_scaling); } -void NetlistDeviceExtractor::extract (db::Layout &layout, db::Cell &cell, const std::vector &layers, db::Netlist *nl, hier_clusters_type &clusters) +void NetlistDeviceExtractor::extract (db::Layout &layout, db::Cell &cell, const std::vector &layers, db::Netlist *nl, hier_clusters_type &clusters, double device_scaling) { initialize (nl); - extract_without_initialize (layout, cell, clusters, layers); + extract_without_initialize (layout, cell, clusters, layers, device_scaling); } namespace { @@ -202,7 +203,7 @@ struct ExtractorCacheValueType { } -void NetlistDeviceExtractor::extract_without_initialize (db::Layout &layout, db::Cell &cell, hier_clusters_type &clusters, const std::vector &layers) +void NetlistDeviceExtractor::extract_without_initialize (db::Layout &layout, db::Cell &cell, hier_clusters_type &clusters, const std::vector &layers, double device_scaling) { tl_assert (layers.size () == m_layer_definitions.size ()); @@ -212,6 +213,7 @@ void NetlistDeviceExtractor::extract_without_initialize (db::Layout &layout, db: mp_layout = &layout; m_layers = layers; mp_clusters = &clusters; + m_device_scaling = device_scaling; // terminal properties are kept in a property with the terminal_property_name name m_terminal_id_propname_id = mp_layout->properties_repository ().prop_name_id (terminal_id_property_name ()); diff --git a/src/db/db/dbNetlistDeviceExtractor.h b/src/db/db/dbNetlistDeviceExtractor.h index 1cec36080..5143b9c7f 100644 --- a/src/db/db/dbNetlistDeviceExtractor.h +++ b/src/db/db/dbNetlistDeviceExtractor.h @@ -263,7 +263,7 @@ public: * * NOTE: The extractor expects "PolygonRef" type layers. */ - void extract (Layout &layout, Cell &cell, const std::vector &layers, Netlist *netlist, hier_clusters_type &clusters); + void extract (Layout &layout, Cell &cell, const std::vector &layers, Netlist *netlist, hier_clusters_type &clusters, double device_scaling = 1.0); /** * @brief Extracts the devices from a list of regions @@ -272,7 +272,7 @@ public: * named regions for input. These regions need to be of deep region type and * originate from the same layout than the DeepShapeStore. */ - void extract (DeepShapeStore &dss, unsigned int layout_index, const input_layers &layers, Netlist &netlist, hier_clusters_type &clusters); + void extract (DeepShapeStore &dss, unsigned int layout_index, const input_layers &layers, Netlist &netlist, hier_clusters_type &clusters, double device_scaling = 1.0); /** * @brief Gets the error iterator, begin @@ -416,6 +416,16 @@ public: return mp_layout->dbu (); } + /** + * @brief Gets the scaled database unit + * Use this unit to compute device properties. It is the database unit multiplied with the + * device scaling factor. + */ + double sdbu () const + { + return m_device_scaling * mp_layout->dbu (); + } + /** * @brief Gets the layout the shapes are taken from * NOTE: this method is provided for testing purposes mainly. @@ -523,6 +533,7 @@ private: db::properties_id_type m_terminal_id_propname_id, m_device_id_propname_id, m_device_class_propname_id; hier_clusters_type *mp_clusters; db::cell_index_type m_cell_index; + double m_device_scaling; db::Circuit *mp_circuit; db::DeviceClass *mp_device_class; std::string m_name; @@ -542,7 +553,7 @@ private: */ void initialize (db::Netlist *nl); - void extract_without_initialize (db::Layout &layout, db::Cell &cell, hier_clusters_type &clusters, const std::vector &layers); + void extract_without_initialize (db::Layout &layout, db::Cell &cell, hier_clusters_type &clusters, const std::vector &layers, double device_scaling); void push_new_devices (const Vector &disp_cache); void push_cached_devices (const tl::vector &cached_devices, const db::Vector &disp_cache, const db::Vector &new_disp); }; diff --git a/src/db/db/dbNetlistDeviceExtractorClasses.cc b/src/db/db/dbNetlistDeviceExtractorClasses.cc index 75dc62542..394c74bad 100644 --- a/src/db/db/dbNetlistDeviceExtractorClasses.cc +++ b/src/db/db/dbNetlistDeviceExtractorClasses.cc @@ -112,8 +112,8 @@ void NetlistDeviceExtractorMOS3Transistor::extract_devices (const std::vectorset_trans (db::DCplxTrans ((p->box ().center () - db::Point ()) * dbu ())); - device->set_parameter_value (db::DeviceClassMOS3Transistor::param_id_W, dbu () * edges.length () * 0.5); - device->set_parameter_value (db::DeviceClassMOS3Transistor::param_id_L, dbu () * (p->perimeter () - edges.length ()) * 0.5); + device->set_parameter_value (db::DeviceClassMOS3Transistor::param_id_W, sdbu () * edges.length () * 0.5); + device->set_parameter_value (db::DeviceClassMOS3Transistor::param_id_L, sdbu () * (p->perimeter () - edges.length ()) * 0.5); int diff_index = 0; for (db::Region::const_iterator d = rdiff2gate.begin (); !d.at_end () && diff_index < 2; ++d, ++diff_index) { @@ -123,8 +123,8 @@ void NetlistDeviceExtractorMOS3Transistor::extract_devices (const std::vector 0); - device->set_parameter_value (diff_index == 0 ? db::DeviceClassMOS3Transistor::param_id_AS : db::DeviceClassMOS3Transistor::param_id_AD, dbu () * dbu () * d->area () / double (n)); - device->set_parameter_value (diff_index == 0 ? db::DeviceClassMOS3Transistor::param_id_PS : db::DeviceClassMOS3Transistor::param_id_PD, dbu () * d->perimeter () / double (n)); + device->set_parameter_value (diff_index == 0 ? db::DeviceClassMOS3Transistor::param_id_AS : db::DeviceClassMOS3Transistor::param_id_AD, sdbu () * sdbu () * d->area () / double (n)); + device->set_parameter_value (diff_index == 0 ? db::DeviceClassMOS3Transistor::param_id_PS : db::DeviceClassMOS3Transistor::param_id_PD, sdbu () * d->perimeter () / double (n)); unsigned int sd_index = diff_index == 0 ? source_terminal_geometry_index : drain_terminal_geometry_index; define_terminal (device, diff_index == 0 ? db::DeviceClassMOS3Transistor::terminal_id_S : db::DeviceClassMOS3Transistor::terminal_id_D, sd_index, *d); @@ -262,10 +262,10 @@ void NetlistDeviceExtractorResistor::extract_devices (const std::vectorset_parameter_value (db::DeviceClassResistor::param_id_R, m_sheet_rho * double (length) / double (width)); - device->set_parameter_value (db::DeviceClassResistor::param_id_L, dbu () * length); - device->set_parameter_value (db::DeviceClassResistor::param_id_W, dbu () * width); - device->set_parameter_value (db::DeviceClassResistor::param_id_A, dbu () * dbu () * p->area ()); - device->set_parameter_value (db::DeviceClassResistor::param_id_P, dbu () * p->perimeter ()); + device->set_parameter_value (db::DeviceClassResistor::param_id_L, sdbu () * length); + device->set_parameter_value (db::DeviceClassResistor::param_id_W, sdbu () * width); + device->set_parameter_value (db::DeviceClassResistor::param_id_A, sdbu () * sdbu () * p->area ()); + device->set_parameter_value (db::DeviceClassResistor::param_id_P, sdbu () * p->perimeter ()); int cont_index = 0; for (db::Region::const_iterator d = contacts_per_res.begin (); !d.at_end () && cont_index < 2; ++d, ++cont_index) { @@ -366,11 +366,11 @@ void NetlistDeviceExtractorCapacitor::extract_devices (const std::vectorset_trans (db::DCplxTrans ((p->box ().center () - db::Point ()) * dbu ())); - double area = p->area () * dbu () * dbu (); + double area = p->area () * sdbu () * sdbu (); device->set_parameter_value (db::DeviceClassCapacitor::param_id_C, m_area_cap * area); device->set_parameter_value (db::DeviceClassCapacitor::param_id_A, area); - device->set_parameter_value (db::DeviceClassCapacitor::param_id_P, dbu () * p->perimeter ()); + device->set_parameter_value (db::DeviceClassCapacitor::param_id_P, sdbu () * p->perimeter ()); define_terminal (device, db::DeviceClassCapacitor::terminal_id_A, a_terminal_geometry_index, *p); define_terminal (device, db::DeviceClassCapacitor::terminal_id_B, b_terminal_geometry_index, *p); @@ -498,11 +498,11 @@ void NetlistDeviceExtractorBJT3Transistor::extract_devices (const std::vectorarea (); - double pb = dbu () * p->perimeter (); + double ab = sdbu () * sdbu () * p->area (); + double pb = sdbu () * p->perimeter (); - double ac = dbu () * dbu () * rcollector2base.area (); - double pc = dbu () * rcollector2base.perimeter (); + double ac = sdbu () * sdbu () * rcollector2base.area (); + double pc = sdbu () * rcollector2base.perimeter (); for (db::Region::const_iterator pe = remitter2base.begin_merged (); !pe.at_end (); ++pe) { @@ -512,8 +512,8 @@ void NetlistDeviceExtractorBJT3Transistor::extract_devices (const std::vectorset_parameter_value (db::DeviceClassBJT3Transistor::param_id_NE, 1.0); - device->set_parameter_value (db::DeviceClassBJT3Transistor::param_id_AE, dbu () * dbu () * pe->area ()); - device->set_parameter_value (db::DeviceClassBJT3Transistor::param_id_PE, dbu () * pe->perimeter ()); + device->set_parameter_value (db::DeviceClassBJT3Transistor::param_id_AE, sdbu () * sdbu () * pe->area ()); + device->set_parameter_value (db::DeviceClassBJT3Transistor::param_id_PE, sdbu () * pe->perimeter ()); device->set_parameter_value (db::DeviceClassBJT3Transistor::param_id_AB, ab); device->set_parameter_value (db::DeviceClassBJT3Transistor::param_id_PB, pb); @@ -629,10 +629,10 @@ void NetlistDeviceExtractorDiode::extract_devices (const std::vector device->set_trans (db::DCplxTrans ((p->box ().center () - db::Point ()) * dbu ())); - double area = p->area () * dbu () * dbu (); + double area = p->area () * sdbu () * sdbu (); device->set_parameter_value (db::DeviceClassDiode::param_id_A, area); - device->set_parameter_value (db::DeviceClassDiode::param_id_P, dbu () * p->perimeter ()); + device->set_parameter_value (db::DeviceClassDiode::param_id_P, sdbu () * p->perimeter ()); define_terminal (device, db::DeviceClassDiode::terminal_id_A, a_terminal_geometry_index, *p); define_terminal (device, db::DeviceClassDiode::terminal_id_C, c_terminal_geometry_index, *p); diff --git a/src/db/db/dbNetlistSpiceReader.cc b/src/db/db/dbNetlistSpiceReader.cc index 7f7c4235c..50218d7d2 100644 --- a/src/db/db/dbNetlistSpiceReader.cc +++ b/src/db/db/dbNetlistSpiceReader.cc @@ -195,6 +195,7 @@ void NetlistSpiceReader::read (tl::InputStream &stream, db::Netlist &netlist) mp_netlist = &netlist; mp_circuit = 0; mp_nets_by_name.reset (0); + m_global_nets.clear (); try { @@ -343,6 +344,11 @@ bool NetlistSpiceReader::read_card () // ignore model statements + } else if (ex.test_without_case ("global")) { + + std::string n = read_name (ex); + m_global_nets.push_back (n); + } else if (ex.test_without_case ("subckt")) { std::string nc = read_name (ex); @@ -497,6 +503,10 @@ void NetlistSpiceReader::ensure_circuit () mp_circuit->set_name (".TOP"); mp_netlist->add_circuit (mp_circuit); + for (std::vector::const_iterator gn = m_global_nets.begin (); gn != m_global_nets.end (); ++gn) { + make_net (*gn); + } + } } @@ -737,16 +747,25 @@ void NetlistSpiceReader::read_subcircuit (const std::string &sc_name, const std: db::Circuit *cc = mp_netlist->circuit_by_name (nc_name); if (! cc) { + cc = new db::Circuit (); mp_netlist->add_circuit (cc); cc->set_name (nc_name); + + // we'll make the names later ... for (std::vector::const_iterator i = nets.begin (); i != nets.end (); ++i) { cc->add_pin (std::string ()); } + for (std::vector::const_iterator gn = m_global_nets.begin (); gn != m_global_nets.end (); ++gn) { + cc->add_pin (std::string ()); + } + } else { - if (cc->pin_count () != nets.size ()) { + + if (cc->pin_count () != nets.size () + m_global_nets.size ()) { error (tl::sprintf (tl::to_string (tr ("Pin count mismatch between circuit definition and circuit call: %d expected, got %d")), int (cc->pin_count ()), int (nets.size ()))); } + } db::SubCircuit *sc = new db::SubCircuit (cc, sc_name); @@ -755,6 +774,11 @@ void NetlistSpiceReader::read_subcircuit (const std::string &sc_name, const std: for (std::vector::const_iterator i = nets.begin (); i != nets.end (); ++i) { sc->connect_pin (i - nets.begin (), *i); } + + for (std::vector::const_iterator gn = m_global_nets.begin (); gn != m_global_nets.end (); ++gn) { + db::Net *net = make_net (*gn); + sc->connect_pin (gn - m_global_nets.begin () + nets.size (), net); + } } void NetlistSpiceReader::skip_circuit (tl::Extractor & /*ex*/) @@ -789,16 +813,23 @@ void NetlistSpiceReader::read_circuit (tl::Extractor &ex, const std::string &nc) db::Circuit *cc = mp_netlist->circuit_by_name (nc); if (! cc) { + cc = new db::Circuit (); mp_netlist->add_circuit (cc); cc->set_name (nc); for (std::vector::const_iterator i = nn.begin (); i != nn.end (); ++i) { cc->add_pin (std::string ()); } + for (std::vector::const_iterator gn = m_global_nets.begin (); gn != m_global_nets.end (); ++gn) { + cc->add_pin (std::string ()); + } + } else { - if (cc->pin_count () != nn.size ()) { + + if (cc->pin_count () != nn.size () + m_global_nets.size ()) { error (tl::sprintf (tl::to_string (tr ("Pin count mismatch between implicit (through call) and explicit circuit definition: %d expected, got %d")), int (cc->pin_count ()), int (nn.size ()))); } + } std::auto_ptr > n2n (mp_nets_by_name.release ()); @@ -806,13 +837,23 @@ void NetlistSpiceReader::read_circuit (tl::Extractor &ex, const std::string &nc) std::swap (cc, mp_circuit); + // produce the explicit pins for (std::vector::const_iterator i = nn.begin (); i != nn.end (); ++i) { db::Net *net = make_net (*i); // use the net name to name the pin (otherwise SPICE pins are always unnamed) + size_t pin_id = i - nn.begin (); if (! i->empty ()) { - mp_circuit->rename_pin (i - nn.begin (), net->name ()); + mp_circuit->rename_pin (pin_id, net->name ()); } - mp_circuit->connect_pin (i - nn.begin (), net); + mp_circuit->connect_pin (pin_id, net); + } + + // produce pins for the global nets + for (std::vector::const_iterator gn = m_global_nets.begin (); gn != m_global_nets.end (); ++gn) { + db::Net *net = make_net (*gn); + size_t pin_id = gn - m_global_nets.begin () + nn.size (); + mp_circuit->rename_pin (pin_id, net->name ()); + mp_circuit->connect_pin (pin_id, net); } while (! at_end ()) { diff --git a/src/db/db/dbNetlistSpiceReader.h b/src/db/db/dbNetlistSpiceReader.h index 056b2b2d4..95eca62e2 100644 --- a/src/db/db/dbNetlistSpiceReader.h +++ b/src/db/db/dbNetlistSpiceReader.h @@ -128,6 +128,7 @@ private: std::auto_ptr > mp_nets_by_name; std::string m_stored_line; std::map m_captured; + std::vector m_global_nets; void push_stream (const std::string &path); void pop_stream (); diff --git a/src/db/db/dbTestSupport.cc b/src/db/db/dbTestSupport.cc index 1d71cacca..86707a236 100644 --- a/src/db/db/dbTestSupport.cc +++ b/src/db/db/dbTestSupport.cc @@ -291,7 +291,7 @@ private: } }; -void DB_PUBLIC compare_netlist (tl::TestBase *_this, const db::Netlist &netlist, const std::string &au_nl_string) +void DB_PUBLIC compare_netlist (tl::TestBase *_this, const db::Netlist &netlist, const std::string &au_nl_string, bool exact_parameter_match) { db::Netlist au_nl; for (db::Netlist::const_device_class_iterator d = netlist.begin_device_classes (); d != netlist.end_device_classes (); ++d) { @@ -300,27 +300,29 @@ void DB_PUBLIC compare_netlist (tl::TestBase *_this, const db::Netlist &netlist, au_nl.from_string (au_nl_string); - db::NetlistComparer comp (0); - - if (! comp.compare (&netlist, &au_nl)) { - _this->raise ("Compare failed - see log for details.\n\nActual:\n" + netlist.to_string () + "\nGolden:\n" + au_nl_string); - // Compare once again - this time with logger - CompareLogger logger; - db::NetlistComparer comp (&logger); - comp.compare (&netlist, &au_nl); - } + compare_netlist (_this, netlist, au_nl, exact_parameter_match); } -void DB_PUBLIC compare_netlist (tl::TestBase *_this, const db::Netlist &netlist, const db::Netlist &netlist_au) +void DB_PUBLIC compare_netlist (tl::TestBase *_this, const db::Netlist &netlist, const db::Netlist &netlist_au, bool exact_parameter_match) { db::NetlistComparer comp (0); - if (! comp.compare (&netlist, &netlist_au)) { - _this->raise ("Compare failed - see log for details.\n\nActual:\n" + netlist.to_string () + "\nGolden:\n" + netlist_au.to_string ()); + db::Netlist netlist_copy (netlist); + + if (exact_parameter_match) { + // install a "all parameters are equal" device parameter comparer so we make sure the devices are compared exactly + for (db::Netlist::device_class_iterator dc = netlist_copy.begin_device_classes (); dc != netlist_copy.end_device_classes (); ++dc) { + db::DeviceClass &cls = *dc; + cls.set_parameter_compare_delegate (new db::AllDeviceParametersAreEqual (0.01)); + } + } + + if (! comp.compare (&netlist_copy, &netlist_au)) { + _this->raise ("Compare failed - see log for details.\n\nActual:\n" + netlist_copy.to_string () + "\nGolden:\n" + netlist_au.to_string ()); // Compare once again - this time with logger CompareLogger logger; db::NetlistComparer comp (&logger); - comp.compare (&netlist, &netlist_au); + comp.compare (&netlist_copy, &netlist_au); } } diff --git a/src/db/db/dbTestSupport.h b/src/db/db/dbTestSupport.h index e079cf05b..6a9278040 100644 --- a/src/db/db/dbTestSupport.h +++ b/src/db/db/dbTestSupport.h @@ -77,12 +77,12 @@ void DB_PUBLIC compare_layouts (tl::TestBase *_this, const db::Layout &layout, c /** * @brief Compares a netlist against a string */ -void DB_PUBLIC compare_netlist (tl::TestBase *_this, const db::Netlist &netlist, const std::string &au_nl_string); +void DB_PUBLIC compare_netlist (tl::TestBase *_this, const db::Netlist &netlist, const std::string &au_nl_string, bool exact_parameter_match = false); /** * @brief Compares a netlist against another netlist */ -void DB_PUBLIC compare_netlist (tl::TestBase *_this, const db::Netlist &netlist, const db::Netlist &netlist_au); +void DB_PUBLIC compare_netlist (tl::TestBase *_this, const db::Netlist &netlist, const db::Netlist &netlist_au, bool exact_parameter_match = false); } diff --git a/src/db/db/gsiDeclDbLayoutToNetlist.cc b/src/db/db/gsiDeclDbLayoutToNetlist.cc index e1369989f..02ba6b3c9 100644 --- a/src/db/db/gsiDeclDbLayoutToNetlist.cc +++ b/src/db/db/gsiDeclDbLayoutToNetlist.cc @@ -198,6 +198,15 @@ Class decl_dbLayoutToNetlist ("db", "LayoutToNetlist", gsi::method ("max_vertex_count", &db::LayoutToNetlist::max_vertex_count, "See \\max_vertex_count= for details about this attribute." ) + + gsi::method ("device_scaling=", &db::LayoutToNetlist::set_device_scaling, gsi::arg ("f"), + "@brief Sets the device scaling factor\n" + "This factor will scale the physical properties of the extracted devices\n" + "accordingly. The scale factor applies an isotropic shrink (<1) or expansion (>1).\n" + ) + + gsi::method ("device_scaling", &db::LayoutToNetlist::device_scaling, + "@brief Gets the device scaling factor\n" + "See \\device_scaling= for details about this attribute." + ) + gsi::method ("name", (const std::string &(db::LayoutToNetlist::*) () const) &db::LayoutToNetlist::name, "@brief Gets the name of the database\n" ) + diff --git a/src/db/db/gsiDeclDbNetlist.cc b/src/db/db/gsiDeclDbNetlist.cc index 911262002..9523e7b7f 100644 --- a/src/db/db/gsiDeclDbNetlist.cc +++ b/src/db/db/gsiDeclDbNetlist.cc @@ -283,6 +283,15 @@ Class decl_dbDevice ("db", "Device", gsi::method ("name", &db::Device::name, "@brief Gets the name of the device.\n" ) + + gsi::method ("trans=", &db::Device::set_trans, gsi::arg ("t"), + "@brief Sets the location of the device.\n" + "The device location is essentially describing the position of the device. The position is typically the center of some " + "recognition shape. In this case the transformation is a plain displacement to the center of this shape." + ) + + gsi::method ("trans", &db::Device::trans, + "@brief Gets the location of the device.\n" + "See \\trans= for details about this method." + ) + gsi::method ("expanded_name", &db::Device::expanded_name, "@brief Gets the expanded name of the device.\n" "The expanded name takes the name of the device. If the name is empty, the numeric ID will be used to build a name. " diff --git a/src/db/db/gsiDeclDbNetlistCompare.cc b/src/db/db/gsiDeclDbNetlistCompare.cc index d9dd10c2c..0afaf06de 100644 --- a/src/db/db/gsiDeclDbNetlistCompare.cc +++ b/src/db/db/gsiDeclDbNetlistCompare.cc @@ -452,6 +452,20 @@ static db::NetlistComparer *make_comparer1 (GenericNetlistCompareLogger *logger) return new db::NetlistComparer (logger); } +static std::vector unmatched_circuits_a (const db::NetlistComparer *comparer, db::Netlist *a, db::Netlist *b) +{ + std::vector res_a, res_b; + comparer->unmatched_circuits (a, b, res_a, res_b); + return res_a; +} + +static std::vector unmatched_circuits_b (const db::NetlistComparer *comparer, db::Netlist *a, db::Netlist *b) +{ + std::vector res_a, res_b; + comparer->unmatched_circuits (a, b, res_a, res_b); + return res_b; +} + Class decl_dbNetlistComparer ("db", "NetlistComparer", gsi::constructor ("new", &make_comparer0, "@brief Creates a new comparer object.\n" @@ -524,6 +538,16 @@ Class decl_dbNetlistComparer ("db", "NetlistComparer", "@brief Gets the maximum branch complexity\n" "See \\max_branch_complexity= for details." ) + + gsi::method_ext ("unmatched_circuits_a", &unmatched_circuits_a, gsi::arg ("a"), gsi::arg ("b"), + "@brief Returns a list of circuits in A for which there is not corresponding circuit in B\n" + "This list can be used to flatten these circuits so they do not participate in the compare process.\n" + "Top level circuits are not included as they cannot be flattened.\n" + ) + + gsi::method_ext ("unmatched_circuits_b", &unmatched_circuits_b, gsi::arg ("a"), gsi::arg ("b"), + "@brief Returns a list of circuits in B for which there is not corresponding circuit in A\n" + "This list can be used to flatten these circuits so they do not participate in the compare process.\n" + "Top level circuits are not included as they cannot be flattened.\n" + ) + gsi::method ("compare", (bool (db::NetlistComparer::*) (const db::Netlist *, const db::Netlist *) const) &db::NetlistComparer::compare, gsi::arg ("netlist_a"), gsi::arg ("netlist_b"), "@brief Compares two netlists.\n" "This method will perform the actual netlist compare. It will return true if both netlists are identical. " diff --git a/src/db/db/gsiDeclDbNetlistDeviceExtractor.cc b/src/db/db/gsiDeclDbNetlistDeviceExtractor.cc index 2afd835f0..0851b5f4f 100644 --- a/src/db/db/gsiDeclDbNetlistDeviceExtractor.cc +++ b/src/db/db/gsiDeclDbNetlistDeviceExtractor.cc @@ -331,6 +331,11 @@ Class decl_GenericDeviceExtractor (decl_dbNetlistDeviceE gsi::method ("dbu", &GenericDeviceExtractor::dbu, "@brief Gets the database unit\n" ) + + gsi::method ("sdbu", &GenericDeviceExtractor::sdbu, + "@brief Gets the scaled database unit\n" + "Use this unit to compute device properties. It is the database unit multiplied with the\n" + "device scaling factor." + ) + gsi::method ("error", (void (GenericDeviceExtractor::*) (const std::string &)) &GenericDeviceExtractor::error, gsi::arg ("message"), "@brief Issues an error with the given message\n" diff --git a/src/db/unit_tests/dbLayoutToNetlistTests.cc b/src/db/unit_tests/dbLayoutToNetlistTests.cc index 3fed04252..640552385 100644 --- a/src/db/unit_tests/dbLayoutToNetlistTests.cc +++ b/src/db/unit_tests/dbLayoutToNetlistTests.cc @@ -2755,3 +2755,258 @@ TEST(11_DuplicateInstances) "end;\n" ); } + +TEST(12_FlattenCircuitDoesFlattenLayout) +{ + db::Layout ly; + db::LayerMap lmap; + + unsigned int nwell = define_layer (ly, lmap, 1); + unsigned int active = define_layer (ly, lmap, 2); + unsigned int pplus = define_layer (ly, lmap, 10); + unsigned int nplus = define_layer (ly, lmap, 11); + unsigned int poly = define_layer (ly, lmap, 3); + unsigned int poly_lbl = define_layer (ly, lmap, 3, 1); + unsigned int diff_cont = define_layer (ly, lmap, 4); + unsigned int poly_cont = define_layer (ly, lmap, 5); + unsigned int metal1 = define_layer (ly, lmap, 6); + unsigned int metal1_lbl = define_layer (ly, lmap, 6, 1); + unsigned int via1 = define_layer (ly, lmap, 7); + unsigned int metal2 = define_layer (ly, lmap, 8); + unsigned int metal2_lbl = define_layer (ly, lmap, 8, 1); + + { + db::LoadLayoutOptions options; + options.get_options ().layer_map = lmap; + options.get_options ().create_other_layers = false; + + std::string fn (tl::testsrc ()); + fn = tl::combine_path (fn, "testdata"); + fn = tl::combine_path (fn, "algo"); + fn = tl::combine_path (fn, "device_extract_l5.gds"); + + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly, options); + } + + db::Cell &tc = ly.cell (*ly.begin_top_down ()); + db::LayoutToNetlist l2n (db::RecursiveShapeIterator (ly, tc, std::set ())); + + std::auto_ptr rbulk (l2n.make_layer ("bulk")); + std::auto_ptr rnwell (l2n.make_layer (nwell, "nwell")); + std::auto_ptr ractive (l2n.make_layer (active, "active")); + std::auto_ptr rpplus (l2n.make_layer (pplus, "pplus")); + std::auto_ptr rnplus (l2n.make_layer (nplus, "nplus")); + std::auto_ptr rpoly (l2n.make_polygon_layer (poly, "poly")); + std::auto_ptr rpoly_lbl (l2n.make_text_layer (poly_lbl, "poly_lbl")); + std::auto_ptr rdiff_cont (l2n.make_polygon_layer (diff_cont, "diff_cont")); + std::auto_ptr rpoly_cont (l2n.make_polygon_layer (poly_cont, "poly_cont")); + std::auto_ptr rmetal1 (l2n.make_polygon_layer (metal1, "metal1")); + std::auto_ptr rmetal1_lbl (l2n.make_text_layer (metal1_lbl, "metal1_lbl")); + std::auto_ptr rvia1 (l2n.make_polygon_layer (via1, "via1")); + std::auto_ptr rmetal2 (l2n.make_polygon_layer (metal2, "metal2")); + std::auto_ptr rmetal2_lbl (l2n.make_text_layer (metal2_lbl, "metal2_lbl")); + + // derived regions + + db::Region ractive_in_nwell = *ractive & *rnwell; + db::Region rpactive = ractive_in_nwell & *rpplus; + db::Region rntie = ractive_in_nwell & *rnplus; + db::Region rpgate = rpactive & *rpoly; + db::Region rpsd = rpactive - rpgate; + + db::Region ractive_outside_nwell = *ractive - *rnwell; + db::Region rnactive = ractive_outside_nwell & *rnplus; + db::Region rptie = ractive_outside_nwell & *rpplus; + db::Region rngate = rnactive & *rpoly; + db::Region rnsd = rnactive - rngate; + + // return the computed layers into the original layout and write it for debugging purposes + + unsigned int lgate = ly.insert_layer (db::LayerProperties (20, 0)); // 20/0 -> Gate + unsigned int lsd = ly.insert_layer (db::LayerProperties (21, 0)); // 21/0 -> Source/Drain + unsigned int lpdiff = ly.insert_layer (db::LayerProperties (22, 0)); // 22/0 -> P Diffusion + unsigned int lndiff = ly.insert_layer (db::LayerProperties (23, 0)); // 23/0 -> N Diffusion + unsigned int lptie = ly.insert_layer (db::LayerProperties (24, 0)); // 24/0 -> P Tie + unsigned int lntie = ly.insert_layer (db::LayerProperties (25, 0)); // 25/0 -> N Tie + + rpgate.insert_into (&ly, tc.cell_index (), lgate); + rngate.insert_into (&ly, tc.cell_index (), lgate); + rpsd.insert_into (&ly, tc.cell_index (), lsd); + rnsd.insert_into (&ly, tc.cell_index (), lsd); + rpsd.insert_into (&ly, tc.cell_index (), lpdiff); + rnsd.insert_into (&ly, tc.cell_index (), lndiff); + rpsd.insert_into (&ly, tc.cell_index (), lptie); + rnsd.insert_into (&ly, tc.cell_index (), lntie); + + db::NetlistDeviceExtractorMOS4Transistor pmos_ex ("PMOS"); + db::NetlistDeviceExtractorMOS4Transistor nmos_ex ("NMOS"); + + // device extraction + + db::NetlistDeviceExtractor::input_layers dl; + + dl["SD"] = &rpsd; + dl["G"] = &rpgate; + dl["P"] = rpoly.get (); // not needed for extraction but to return terminal shapes + dl["W"] = rnwell.get (); + l2n.extract_devices (pmos_ex, dl); + + dl["SD"] = &rnsd; + dl["G"] = &rngate; + dl["P"] = rpoly.get (); // not needed for extraction but to return terminal shapes + dl["W"] = rbulk.get (); + l2n.extract_devices (nmos_ex, dl); + + // net extraction + + l2n.register_layer (rpsd, "psd"); + l2n.register_layer (rnsd, "nsd"); + l2n.register_layer (rptie, "ptie"); + l2n.register_layer (rntie, "ntie"); + + // Intra-layer + l2n.connect (rpsd); + l2n.connect (rnsd); + l2n.connect (*rnwell); + l2n.connect (*rpoly); + l2n.connect (*rdiff_cont); + l2n.connect (*rpoly_cont); + l2n.connect (*rmetal1); + l2n.connect (*rvia1); + l2n.connect (*rmetal2); + l2n.connect (rptie); + l2n.connect (rntie); + // Inter-layer + l2n.connect (rpsd, *rdiff_cont); + l2n.connect (rnsd, *rdiff_cont); + l2n.connect (*rpoly, *rpoly_cont); + l2n.connect (*rpoly_cont, *rmetal1); + l2n.connect (*rdiff_cont, *rmetal1); + l2n.connect (*rdiff_cont, rptie); + l2n.connect (*rdiff_cont, rntie); + l2n.connect (*rnwell, rntie); + l2n.connect (*rmetal1, *rvia1); + l2n.connect (*rvia1, *rmetal2); + l2n.connect (*rpoly, *rpoly_lbl); // attaches labels + l2n.connect (*rmetal1, *rmetal1_lbl); // attaches labels + l2n.connect (*rmetal2, *rmetal2_lbl); // attaches labels + // Global + l2n.connect_global (rptie, "BULK"); + l2n.connect_global (*rbulk, "BULK"); + + // create some mess - we have to keep references to the layers to make them not disappear + rmetal1_lbl.reset (0); + rmetal2_lbl.reset (0); + rpoly_lbl.reset (0); + + l2n.extract_netlist (); + + l2n.netlist ()->flatten_circuit (l2n.netlist ()->circuit_by_name ("INV2")); + l2n.netlist ()->flatten_circuit (l2n.netlist ()->circuit_by_name ("INV2PAIR")); + l2n.netlist ()->flatten_circuit (l2n.netlist ()->circuit_by_name ("TRANS")); + + // debug layers produced for nets + // 201/0 -> Well + // 203/0 -> Poly + // 204/0 -> Diffusion contacts + // 205/0 -> Poly contacts + // 206/0 -> Metal1 + // 207/0 -> Via1 + // 208/0 -> Metal2 + // 210/0 -> N source/drain + // 211/0 -> P source/drain + // 212/0 -> N tie + // 213/0 -> P tie + std::map dump_map; + dump_map [&rpsd ] = ly.insert_layer (db::LayerProperties (210, 0)); + dump_map [&rnsd ] = ly.insert_layer (db::LayerProperties (211, 0)); + dump_map [&rptie ] = ly.insert_layer (db::LayerProperties (212, 0)); + dump_map [&rntie ] = ly.insert_layer (db::LayerProperties (213, 0)); + dump_map [rbulk.get () ] = ly.insert_layer (db::LayerProperties (214, 0)); + dump_map [rnwell.get () ] = ly.insert_layer (db::LayerProperties (201, 0)); + dump_map [rpoly.get () ] = ly.insert_layer (db::LayerProperties (203, 0)); + dump_map [rdiff_cont.get ()] = ly.insert_layer (db::LayerProperties (204, 0)); + dump_map [rpoly_cont.get ()] = ly.insert_layer (db::LayerProperties (205, 0)); + dump_map [rmetal1.get () ] = ly.insert_layer (db::LayerProperties (206, 0)); + dump_map [rvia1.get () ] = ly.insert_layer (db::LayerProperties (207, 0)); + dump_map [rmetal2.get () ] = ly.insert_layer (db::LayerProperties (208, 0)); + + // write nets to layout + db::CellMapping cm = l2n.cell_mapping_into (ly, tc); + dump_nets_to_layout (l2n, ly, dump_map, cm); + + dump_map.clear (); + dump_map [&rpsd ] = ly.insert_layer (db::LayerProperties (310, 0)); + dump_map [&rnsd ] = ly.insert_layer (db::LayerProperties (311, 0)); + dump_map [&rptie ] = ly.insert_layer (db::LayerProperties (312, 0)); + dump_map [&rntie ] = ly.insert_layer (db::LayerProperties (313, 0)); + dump_map [rbulk.get () ] = ly.insert_layer (db::LayerProperties (314, 0)); + dump_map [rnwell.get () ] = ly.insert_layer (db::LayerProperties (301, 0)); + dump_map [rpoly.get () ] = ly.insert_layer (db::LayerProperties (303, 0)); + dump_map [rdiff_cont.get ()] = ly.insert_layer (db::LayerProperties (304, 0)); + dump_map [rpoly_cont.get ()] = ly.insert_layer (db::LayerProperties (305, 0)); + dump_map [rmetal1.get () ] = ly.insert_layer (db::LayerProperties (306, 0)); + dump_map [rvia1.get () ] = ly.insert_layer (db::LayerProperties (307, 0)); + dump_map [rmetal2.get () ] = ly.insert_layer (db::LayerProperties (308, 0)); + + dump_recursive_nets_to_layout (l2n, ly, dump_map, cm); + + // compare netlist as string + CHECKPOINT (); + db::compare_netlist (_this, *l2n.netlist (), + "circuit RINGO ();\n" + " device PMOS $1 (S=FB,G=$I7,D=VDD,B=VDD) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device PMOS $2 (S=VDD,G=$I7,D=FB,B=VDD) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device NMOS $3 (S=FB,G=$I7,D=VSS,B=VSS) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device NMOS $4 (S=VSS,G=$I7,D=FB,B=VSS) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device PMOS $5 (S=OSC,G=FB,D=VDD,B=VDD) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device PMOS $6 (S=VDD,G=FB,D=OSC,B=VDD) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device NMOS $7 (S=OSC,G=FB,D=VSS,B=VSS) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device NMOS $8 (S=VSS,G=FB,D=OSC,B=VSS) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device PMOS $9 (S=$I22,G=FB,D=VDD,B=VDD) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device PMOS $10 (S=VDD,G=FB,D=$I22,B=VDD) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device NMOS $11 (S=$I22,G=FB,D=VSS,B=VSS) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device NMOS $12 (S=VSS,G=FB,D=$I22,B=VSS) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device PMOS $13 (S=$I13,G=$I22,D=VDD,B=VDD) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device PMOS $14 (S=VDD,G=$I22,D=$I13,B=VDD) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device NMOS $15 (S=$I13,G=$I22,D=VSS,B=VSS) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device NMOS $16 (S=VSS,G=$I22,D=$I13,B=VSS) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device PMOS $17 (S=$I23,G=$I13,D=VDD,B=VDD) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device PMOS $18 (S=VDD,G=$I13,D=$I23,B=VDD) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device NMOS $19 (S=$I23,G=$I13,D=VSS,B=VSS) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device NMOS $20 (S=VSS,G=$I13,D=$I23,B=VSS) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device PMOS $21 (S=$I5,G=$I23,D=VDD,B=VDD) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device PMOS $22 (S=VDD,G=$I23,D=$I5,B=VDD) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device NMOS $23 (S=$I5,G=$I23,D=VSS,B=VSS) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device NMOS $24 (S=VSS,G=$I23,D=$I5,B=VSS) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device PMOS $25 (S=$I24,G=$I5,D=VDD,B=VDD) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device PMOS $26 (S=VDD,G=$I5,D=$I24,B=VDD) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device NMOS $27 (S=$I24,G=$I5,D=VSS,B=VSS) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device NMOS $28 (S=VSS,G=$I5,D=$I24,B=VSS) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device PMOS $29 (S=$I6,G=$I24,D=VDD,B=VDD) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device PMOS $30 (S=VDD,G=$I24,D=$I6,B=VDD) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device NMOS $31 (S=$I6,G=$I24,D=VSS,B=VSS) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device NMOS $32 (S=VSS,G=$I24,D=$I6,B=VSS) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device PMOS $33 (S=$I25,G=$I6,D=VDD,B=VDD) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device PMOS $34 (S=VDD,G=$I6,D=$I25,B=VDD) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device NMOS $35 (S=$I25,G=$I6,D=VSS,B=VSS) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device NMOS $36 (S=VSS,G=$I6,D=$I25,B=VSS) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device PMOS $37 (S=$I7,G=$I25,D=VDD,B=VDD) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device PMOS $38 (S=VDD,G=$I25,D=$I7,B=VDD) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + " device NMOS $39 (S=$I7,G=$I25,D=VSS,B=VSS) (L=0.25,W=1.75,AS=0.91875,AD=0.48125,PS=4.55,PD=2.3);\n" + " device NMOS $40 (S=VSS,G=$I25,D=$I7,B=VSS) (L=0.25,W=1.75,AS=0.48125,AD=0.91875,PS=2.3,PD=4.55);\n" + "end;\n" + ); + + // compare the collected test data + + std::string au = tl::testsrc (); + au = tl::combine_path (au, "testdata"); + au = tl::combine_path (au, "algo"); + au = tl::combine_path (au, "device_extract_au5_flattened_circuits.gds"); + + db::compare_layouts (_this, ly, au); +} + diff --git a/src/db/unit_tests/dbNetlistCompareTests.cc b/src/db/unit_tests/dbNetlistCompareTests.cc index d01980573..60267320e 100644 --- a/src/db/unit_tests/dbNetlistCompareTests.cc +++ b/src/db/unit_tests/dbNetlistCompareTests.cc @@ -586,8 +586,8 @@ TEST(1_SimpleInverterSkippedDevices) "match_pins $3 $2\n" "match_devices $3 $1\n" "match_devices_with_different_parameters $2 $2\n" - "device_mismatch (null) $3\n" "match_devices $1 $4\n" + "device_mismatch (null) $3\n" "end_circuit INV INV NOMATCH" ); EXPECT_EQ (good, false); @@ -622,8 +622,8 @@ TEST(1_SimpleInverterSkippedDevices) " terminal $3[S]:$1[D]\n" " pin $3:$2\n" " device (null):$3 [Mismatch]\n" - " device $3:$1 [Match]\n" " device $2:$2 [MatchWithWarning]\n" + " device $3:$1 [Match]\n" " device $1:$4 [Match]\n" ); EXPECT_EQ (good, false); @@ -1283,13 +1283,13 @@ TEST(6_BufferTwoPathsAdditionalDevices) "match_pins $3 $2\n" "match_devices $5 $1\n" "match_devices $7 $2\n" - "device_mismatch (null) $3\n" "match_devices $1 $4\n" "match_devices $3 $5\n" "match_devices $6 $6\n" "match_devices $8 $7\n" "match_devices $2 $8\n" "match_devices $4 $9\n" + "device_mismatch (null) $3\n" "device_mismatch $9 (null)\n" "end_circuit BUF BUF NOMATCH" ); @@ -1414,8 +1414,8 @@ TEST(7_ResistorsPlusOneDevice) "match_pins $2 $2\n" "match_devices $1 $1\n" "match_devices $3 $2\n" - "device_mismatch (null) $3\n" "match_devices $2 $4\n" + "device_mismatch (null) $3\n" "end_circuit TRIANGLE TRIANGLE NOMATCH" ); EXPECT_EQ (good, false); @@ -1496,9 +1496,8 @@ TEST(8_DiodesDontMatchOnSwappedPins) "match_pins $1 $0\n" "match_pins $2 $1\n" "match_devices $1 $1\n" - "device_mismatch (null) $2\n" "match_devices $3 $3\n" - "device_mismatch $2 (null)\n" + "device_mismatch $2 $2\n" "end_circuit TRIANGLE TRIANGLE NOMATCH" ); EXPECT_EQ (good, false); @@ -1676,8 +1675,7 @@ TEST(11_MismatchingSubcircuits) "match_pins $2 $0\n" "match_pins $3 $2\n" "match_devices $2 $1\n" - "device_mismatch (null) $2\n" - "device_mismatch $1 (null)\n" + "device_mismatch $1 $2\n" "end_circuit INV INV NOMATCH\n" "begin_circuit TOP TOP\n" "match_nets OUT OUT\n" @@ -1709,13 +1707,11 @@ TEST(11_MismatchingSubcircuits) " pin $3:$2 [Match]\n" " net IN:IN [Mismatch]\n" " terminal (null):$2[S]\n" - " terminal (null):$2[G]\n" - " terminal $1[G]:(null)\n" + " terminal $1[G]:$2[G]\n" " terminal $2[G]:$1[G]\n" " pin $0:$1\n" " net OUT:OUT [Mismatch]\n" - " terminal (null):$2[D]\n" - " terminal $1[D]:(null)\n" + " terminal $1[D]:$2[D]\n" " terminal $2[D]:$1[S]\n" " pin $1:$3\n" " net VDD:VDD [Mismatch]\n" @@ -1724,9 +1720,8 @@ TEST(11_MismatchingSubcircuits) " net VSS:VSS [Match]\n" " terminal $2[S]:$1[D]\n" " pin $3:$2\n" - " device (null):$2 [Mismatch]\n" - " device $1:(null) [Mismatch]\n" " device $2:$1 [Match]\n" + " device $1:$2 [Mismatch]\n" "TOP:TOP [Match]:\n" " pin $0:$2 [Match]\n" " pin $1:$0 [Match]\n" @@ -2106,10 +2101,10 @@ TEST(14_Subcircuit2NandMismatchNoSwap) " net VSS:VSS [Match]\n" " terminal $3[S]:$3[S]\n" " pin $4:$4\n" - " device $1:$1 [Match]\n" - " device $2:$2 [Match]\n" " device $3:$3 [Match]\n" " device $4:$4 [Match]\n" + " device $1:$1 [Match]\n" + " device $2:$2 [Match]\n" "TOP:TOP [NoMatch]:\n" " pin (null):$0 [Mismatch]\n" " pin $0:(null) [Mismatch]\n" diff --git a/src/db/unit_tests/dbNetlistExtractorTests.cc b/src/db/unit_tests/dbNetlistExtractorTests.cc index 7bc49b804..e841c2cb8 100644 --- a/src/db/unit_tests/dbNetlistExtractorTests.cc +++ b/src/db/unit_tests/dbNetlistExtractorTests.cc @@ -1066,10 +1066,11 @@ TEST(4_ResAndCapExtraction) " device PMOS $2 (S=VDD,G=IN,D=$3) (L=0.4,W=2.3,AS=1.38,AD=1.38,PS=5.8,PD=5.8);\n" " device NMOS $3 (S=VSS,G=$4,D=OUT) (L=0.4,W=4.6,AS=2.185,AD=2.185,PS=8.8,PD=8.8);\n" " device MIM_CAP $5 (A=$4,B=VSS) (C=2.622e-14,A=26.22,P=29.8);\n" - " device POLY_RES $7 (A=$3,B=$4) (R=750,A=2.4,P=13.6);\n" - " device POLY_RES $9 (A=$4,B=VSS) (R=1825,A=5.84,P=30);\n" + " device POLY_RES $7 (A=$3,B=$4) (R=750,L=12,W=0.8,A=2.4,P=13.6);\n" + " device POLY_RES $9 (A=$4,B=VSS) (R=1825,L=29.2,W=0.8,A=5.84,P=30);\n" " device NMOS $10 (S=VSS,G=IN,D=$3) (L=0.4,W=3.1,AS=1.86,AD=1.86,PS=7.4,PD=7.4);\n" - "end;\n" + "end;\n", + true /*exact parameter compare*/ ); // compare the collected test data @@ -1339,10 +1340,11 @@ TEST(5_ResAndCapWithBulkExtraction) " device NMOS $3 (S=VSS,G=$4,D=OUT,B=BULK) (L=0.4,W=4.6,AS=2.185,AD=2.185,PS=8.8,PD=8.8);\n" " device MIM_CAP_SUBSTRATE $5 (A=$4,B=VSS,W=BULK) (C=1.334e-14,A=13.34,P=15);\n" " device MIM_CAP_NWELL $6 (A=$4,B=VSS,W=NWELL) (C=1.288e-14,A=12.88,P=14.8);\n" - " device POLY_RES_NWELL $7 (A=$3,B=$4,W=NWELL) (R=750,A=2.4,P=13.6);\n" - " device POLY_RES_SUBSTRATE $9 (A=$4,B=VSS,W=BULK) (R=1825,A=5.84,P=30);\n" + " device POLY_RES_NWELL $7 (A=$3,B=$4,W=NWELL) (R=750,L=12,W=0.8,A=2.4,P=13.6);\n" + " device POLY_RES_SUBSTRATE $9 (A=$4,B=VSS,W=BULK) (R=1825,L=29.2,W=0.8,A=5.84,P=30);\n" " device NMOS $10 (S=VSS,G=IN,D=$3,B=BULK) (L=0.4,W=3.1,AS=1.86,AD=1.86,PS=7.4,PD=7.4);\n" - "end;\n" + "end;\n", + true /*exact parameter compare*/ ); // compare the collected test data @@ -1582,9 +1584,10 @@ TEST(6_BJT3TransistorExtraction) " device PMOS $3 (S=VDD,G=IN,D=$3,B=VDD) (L=0.4,W=2.3,AS=1.38,AD=1.38,PS=5.8,PD=5.8);\n" " device NMOS $4 (S=VSS,G=$4,D=OUT,B=BULK) (L=0.4,W=4.6,AS=2.185,AD=2.185,PS=8.8,PD=8.8);\n" " device PNP $6 (C=BULK,B=$3,E=$3) (AE=3.06,PE=7,AB=25.2,PB=21.2,AC=25.2,PC=21.2,NE=1);\n" - " device PNP $7 (C=BULK,B=$3,E=$4) (AE=6.12,PE=14,AB=50.4,PB=42.4,AC=50.4,PC=42.4,NE=2);\n" + " device PNP $7 (C=BULK,B=$3,E=$4) (AE=6.12,PE=14,AB=25.2,PB=21.2,AC=25.2,PC=21.2,NE=2);\n" " device NMOS $9 (S=VSS,G=IN,D=$3,B=BULK) (L=0.4,W=3.1,AS=1.86,AD=1.86,PS=7.4,PD=7.4);\n" - "end;\n" + "end;\n", + true /*exact parameter compare*/ ); // compare the collected test data @@ -1716,7 +1719,140 @@ TEST(7_DiodeExtraction) db::compare_netlist (_this, nl, "circuit TOP (A=A,C=C);\n" " device DIODE $1 (A=A,C=C) (A=9.18,P=21);\n" - "end;\n" + "end;\n", + true /*exact parameter compare*/ + ); + + // compare the collected test data + + std::string au = tl::testsrc (); + au = tl::combine_path (au, "testdata"); + au = tl::combine_path (au, "algo"); + au = tl::combine_path (au, "diode_devices_nets.gds"); + + db::compare_layouts (_this, ly, au); +} + +TEST(8_DiodeExtractionScaled) +{ + db::Layout ly; + db::LayerMap lmap; + + unsigned int nwell = define_layer (ly, lmap, 1); + unsigned int active = define_layer (ly, lmap, 2); + unsigned int diff_cont = define_layer (ly, lmap, 4); + unsigned int metal1 = define_layer (ly, lmap, 6); + unsigned int metal1_lbl = define_layer (ly, lmap, 6, 1); + unsigned int pplus = define_layer (ly, lmap, 9); + unsigned int nplus = define_layer (ly, lmap, 10); + + { + db::LoadLayoutOptions options; + options.get_options ().layer_map = lmap; + options.get_options ().create_other_layers = false; + + std::string fn (tl::testsrc ()); + fn = tl::combine_path (fn, "testdata"); + fn = tl::combine_path (fn, "algo"); + fn = tl::combine_path (fn, "diode_devices_test.oas"); + + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly, options); + } + + db::Cell &tc = ly.cell (*ly.begin_top_down ()); + + db::DeepShapeStore dss; + dss.set_text_enlargement (1); + dss.set_text_property_name (tl::Variant ("LABEL")); + + // original layers + db::Region rnwell (db::RecursiveShapeIterator (ly, tc, nwell), dss); + db::Region ractive (db::RecursiveShapeIterator (ly, tc, active), dss); + db::Region rdiff_cont (db::RecursiveShapeIterator (ly, tc, diff_cont), dss); + db::Region rmetal1 (db::RecursiveShapeIterator (ly, tc, metal1), dss); + db::Region rmetal1_lbl (db::RecursiveShapeIterator (ly, tc, metal1_lbl), dss); + db::Region rpplus (db::RecursiveShapeIterator (ly, tc, pplus), dss); + db::Region rnplus (db::RecursiveShapeIterator (ly, tc, nplus), dss); + + // derived regions + + db::Region rn = ractive & rnwell; + db::Region rntie = rnwell & rnplus; + + // return the computed layers into the original layout and write it for debugging purposes + + unsigned int ln = ly.insert_layer (db::LayerProperties (10, 0)); // 10/0 -> N layer + unsigned int lntie = ly.insert_layer (db::LayerProperties (11, 0)); // 11/0 -> N contact + rn.insert_into (&ly, tc.cell_index (), ln); + rntie.insert_into (&ly, tc.cell_index (), lntie); + + // perform the extraction + + db::Netlist nl; + db::hier_clusters cl; + + db::NetlistDeviceExtractorDiode diode_ex ("DIODE"); + + db::NetlistDeviceExtractor::input_layers dl; + + dl["N"] = &rn; + dl["P"] = &rpplus; + dl["tC"] = &rnwell; + diode_ex.extract (dss, 0, dl, nl, cl, 2.0); + + // perform the net extraction + + db::NetlistExtractor net_ex; + + db::Connectivity conn; + // Intra-layer + conn.connect (rnwell); + conn.connect (rntie); + conn.connect (rpplus); + conn.connect (rdiff_cont); + conn.connect (rmetal1); + // Inter-layer + conn.connect (rntie, rnwell); + conn.connect (rntie, rdiff_cont); + conn.connect (rpplus, rdiff_cont); + conn.connect (rdiff_cont, rmetal1); + conn.connect (rmetal1, rmetal1_lbl); // attaches labels + + // extract the nets + + net_ex.extract_nets (dss, 0, conn, nl, cl, "*"); + + // cleanup + completion + nl.combine_devices (); + nl.make_top_level_pins (); + nl.purge (); + + EXPECT_EQ (all_net_names_unique (nl), true); + + // debug layers produced for nets + // 201/0 -> n well + // 204/0 -> Diffusion contacts + // 206/0 -> Metal1 + // 210/0 -> N tiedown + std::map dump_map; + dump_map [layer_of (rntie) ] = ly.insert_layer (db::LayerProperties (210, 0)); + dump_map [layer_of (rnwell) ] = ly.insert_layer (db::LayerProperties (201, 0)); + dump_map [layer_of (rdiff_cont)] = ly.insert_layer (db::LayerProperties (204, 0)); + dump_map [layer_of (rmetal1) ] = ly.insert_layer (db::LayerProperties (206, 0)); + + // write nets to layout + db::CellMapping cm = dss.cell_mapping_to_original (0, &ly, tc.cell_index ()); + dump_nets_to_layout (nl, cl, ly, dump_map, cm, true /*with device cells*/); + + // compare netlist as string + CHECKPOINT (); + db::compare_netlist (_this, nl, + "circuit TOP (A=A,C=C);\n" + " device DIODE $1 (A=A,C=C) (A=36.72,P=42);\n" + "end;\n", + true /*exact parameter compare*/ ); // compare the collected test data diff --git a/src/db/unit_tests/dbNetlistReaderTests.cc b/src/db/unit_tests/dbNetlistReaderTests.cc index 8683d27d6..c39e477a6 100644 --- a/src/db/unit_tests/dbNetlistReaderTests.cc +++ b/src/db/unit_tests/dbNetlistReaderTests.cc @@ -255,3 +255,42 @@ TEST(6_ReaderWithDelegate) "end;\n" ); } + +TEST(7_GlobalNets) +{ + db::Netlist nl; + + std::string path = tl::combine_path (tl::combine_path (tl::combine_path (tl::testsrc (), "testdata"), "algo"), "nreader7.cir"); + + MyNetlistReaderDelegate delegate; + db::NetlistSpiceReader reader (&delegate); + tl::InputStream is (path); + reader.read (is, nl); + + EXPECT_EQ (nl.to_string (), + "circuit RINGO (FB=FB,OUT=OUT,ENABLE=ENABLE,VDD=VDD,VSS=VSS);\n" + " subcircuit ND2X1 $1 (OUT='1',B=FB,A=ENABLE,VDD=VDD,VSS=VSS);\n" + " subcircuit INVX1 $2 (OUT='2',IN='1',VDD=VDD,VSS=VSS);\n" + " subcircuit INVX1 $3 (OUT='3',IN='2',VDD=VDD,VSS=VSS);\n" + " subcircuit INVX1 $4 (OUT='4',IN='3',VDD=VDD,VSS=VSS);\n" + " subcircuit INVX1 $5 (OUT='5',IN='4',VDD=VDD,VSS=VSS);\n" + " subcircuit INVX1 $6 (OUT='6',IN='5',VDD=VDD,VSS=VSS);\n" + " subcircuit INVX1 $7 (OUT='7',IN='6',VDD=VDD,VSS=VSS);\n" + " subcircuit INVX1 $8 (OUT='8',IN='7',VDD=VDD,VSS=VSS);\n" + " subcircuit INVX1 $9 (OUT='9',IN='8',VDD=VDD,VSS=VSS);\n" + " subcircuit INVX1 $10 (OUT='10',IN='9',VDD=VDD,VSS=VSS);\n" + " subcircuit INVX1 $11 (OUT=FB,IN='10',VDD=VDD,VSS=VSS);\n" + " subcircuit INVX1 $12 (OUT=OUT,IN=FB,VDD=VDD,VSS=VSS);\n" + "end;\n" + "circuit ND2X1 (OUT=OUT,B=B,A=A,VDD=VDD,VSS=VSS);\n" + " device MLVPMOS $1 (S=OUT,G=A,D=VDD,B=VDD) (L=0.25,W=1.5,AS=0.6375,AD=0.3375,PS=3.85,PD=1.95);\n" + " device MLVPMOS $2 (S=VDD,G=B,D=OUT,B=VDD) (L=0.25,W=1.5,AS=0.3375,AD=0.6375,PS=1.95,PD=3.85);\n" + " device MLVNMOS $3 (S=VSS,G=A,D=INT,B=VSS) (L=0.25,W=0.95,AS=0.40375,AD=0.21375,PS=2.75,PD=1.4);\n" + " device MLVNMOS $4 (S=INT,G=B,D=OUT,B=VSS) (L=0.25,W=0.95,AS=0.21375,AD=0.40375,PS=1.4,PD=2.75);\n" + "end;\n" + "circuit INVX1 (OUT=OUT,IN=IN,VDD=VDD,VSS=VSS);\n" + " device MLVPMOS $1 (S=VDD,G=IN,D=OUT,B=VDD) (L=0.25,W=1.5,AS=0.6375,AD=0.6375,PS=3.85,PD=3.85);\n" + " device MLVNMOS $2 (S=VSS,G=IN,D=OUT,B=VSS) (L=0.25,W=0.95,AS=0.40375,AD=0.40375,PS=2.75,PD=2.75);\n" + "end;\n" + ); +} diff --git a/src/drc/drc/built-in-macros/_drc_engine.rb b/src/drc/drc/built-in-macros/_drc_engine.rb index 81de7f124..9ffaf7d79 100644 --- a/src/drc/drc/built-in-macros/_drc_engine.rb +++ b/src/drc/drc/built-in-macros/_drc_engine.rb @@ -1159,6 +1159,12 @@ CODE # @synopsis l2n_data # See \Netter#l2n_data for a description of that function. + # %DRC% + # @name device_scaling + # @brief Specifies a dimension scale factor for the geometrical device properties + # @synopsis device_scaling(factor) + # See \Netter#device_scaling for a description of that function. + # %DRC% # @name extract_devices # @brief Extracts devices for a given device extractor and device layer selection @@ -1173,7 +1179,7 @@ CODE # yet, this method will trigger the extraction process. # See \Netter#netlist for a description of this function. - %w(connect connect_global clear_connections connect_implicit antenna_check l2n_data extract_devices netlist).each do |f| + %w(connect connect_global clear_connections connect_implicit antenna_check l2n_data device_scaling extract_devices netlist).each do |f| eval <<"CODE" def #{f}(*args) _netter.#{f}(*args) diff --git a/src/drc/drc/built-in-macros/_drc_netter.rb b/src/drc/drc/built-in-macros/_drc_netter.rb index 9d4712261..400acd91b 100644 --- a/src/drc/drc/built-in-macros/_drc_netter.rb +++ b/src/drc/drc/built-in-macros/_drc_netter.rb @@ -68,6 +68,7 @@ module DRC @connect_implicit = [] @l2n = nil @lnum = 0 + @device_scaling = 1.0 end # %DRC% @@ -169,7 +170,8 @@ module DRC layer_selection.is_a?(Hash) || raise("Second argument of Netter#extract_devices must be a hash") ls = {} - layer_selection.each do |n,l| + layer_selection.keys.sort.each do |n| + l = layer_selection[n] l.requires_region("Netter#extract_devices (#{n} layer)") register_layer(l.data) ls[n.to_s] = l.data @@ -178,6 +180,19 @@ module DRC @engine._cmd(@l2n, :extract_devices, devex, ls) end + + # %DRC% + # @name device_scaling + # @brief Specifies a dimension scale factor for the geometrical device properties + # @synopsis device_scaling(factor) + # Specifying a factor of 2 will make all devices being extracted as if the + # geometries were two times larger. This feature is useful when the drawn layout + # does not correspond to the physical dimensions. + + def device_scaling(factor) + @device_scaling = factor + @l2n && @l2n.device_scaling = factor + end # %DRC% # @name clear_connections @@ -378,6 +393,7 @@ module DRC if !@l2n @layers = {} _make_data + @l2n.device_scaling = @device_scaling end end diff --git a/src/lay/lay/doc/about/drc_ref_global.xml b/src/lay/lay/doc/about/drc_ref_global.xml index 2521e3296..0b3b3b2a6 100644 --- a/src/lay/lay/doc/about/drc_ref_global.xml +++ b/src/lay/lay/doc/about/drc_ref_global.xml @@ -29,7 +29,7 @@ See Netter#antenna_check f
  • bjt3(name)
  • -Use this class with device_extract to specify extraction of a +Use this class with extract_devices to specify extraction of a bipolar junction transistor

    "bjt4" - Supplies the BJT4 transistor extractor class

    @@ -39,7 +39,7 @@ bipolar junction transistor
  • bjt4(name)
  • -Use this class with device_extract to specify extraction of a +Use this class with extract_devices to specify extraction of a bipolar junction transistor with a substrate terminal

    "box" - Creates a box object

    @@ -59,17 +59,17 @@ This function creates a box object. The arguments are the same than for the
  • capacitor(name, area_cap)
  • -Use this class with device_extract to specify extraction of a capacitor. +Use this class with extract_devices to specify extraction of a capacitor. The area_cap argument is the capacitance in Farad per square micrometer.

    "capacitor_with_bulk" - Supplies the capacitor extractor class that includes a bulk terminal

    Usage:

      -
    • capacitor_with_bulk(name)
    • +
    • capacitor_with_bulk(name, area_cap)

    -Use this class with device_extract to specify extraction of a capacitor +Use this class with extract_devices to specify extraction of a capacitor with a bulk terminal. The area_cap argument is the capacitance in Farad per square micrometer.

    @@ -185,6 +185,15 @@ implied always. Sometimes cell variants will be created.

    Deep mode can be cancelled with tiles or flat.

    +

    "device_scaling" - Specifies a dimension scale factor for the geometrical device properties

    + +

    Usage:

    +
      +
    • device_scaling(factor)
    • +
    +

    +See Netter#device_scaling for a description of that function. +

    "diode" - Supplies the diode extractor class

    Usage:

    @@ -192,7 +201,7 @@ Deep mode can be cancelled with
    tiles or fl
  • diode(name)
  • -Use this class with device_extract to specify extraction of a +Use this class with extract_devices to specify extraction of a planar diode

    "edge" - Creates an edge object

    @@ -396,7 +405,7 @@ filled with Layer#insert.
  • mos3(name)
  • -Use this class with device_extract to specify extraction of a +Use this class with extract_devices to specify extraction of a three-terminal MOS transistor

    "mos4" - Supplies the MOS4 transistor extractor class

    @@ -406,7 +415,7 @@ three-terminal MOS transistor
  • mos4(name)
  • -Use this class with device_extract to specify extraction of a +Use this class with extract_devices to specify extraction of a four-terminal MOS transistor

    "netlist" - Obtains the extracted netlist from the default Netter

    @@ -537,7 +546,7 @@ third parameter.

    Usage:

      -
    • report_netlist([ filename ])
    • +
    • report_netlist([ filename [, long ] ])

    This method applies to runsets creating a netlist through @@ -547,6 +556,8 @@ netlist plus the net and device shapes are turned into a layout-to-netlist report (L2N database) and shown in the netlist browser window. If a file name is given, the report will also be written to the given file. +If a file name is given and "long" is true, a verbose +version of the L2N DB format will be used.

    "resistor" - Supplies the resistor extractor class

    @@ -555,17 +566,17 @@ will also be written to the given file.
  • resistor(name, sheet_rho)
  • -Use this class with device_extract to specify extraction of a resistor. +Use this class with extract_devices to specify extraction of a resistor. The sheet_rho value is the sheet resistance in ohms/square.

    "resistor_with_bulk" - Supplies the resistor extractor class that includes a bulk terminal

    Usage:

      -
    • resistor_with_bulk(name)
    • +
    • resistor_with_bulk(name, sheet_rho)

    -Use this class with device_extract to specify extraction of a resistor +Use this class with extract_devices to specify extraction of a resistor with a bulk terminal. The sheet_rho value is the sheet resistance in ohms/square.

    diff --git a/src/lay/lay/doc/about/drc_ref_netter.xml b/src/lay/lay/doc/about/drc_ref_netter.xml index 1fa008d21..a131bad28 100644 --- a/src/lay/lay/doc/about/drc_ref_netter.xml +++ b/src/lay/lay/doc/about/drc_ref_netter.xml @@ -186,23 +186,29 @@ to shapes belonging to tie-down diodes.
  • connect_implicit(label_pattern)
  • -Use this method to supply a glob pattern for labels which create implicit net connections +Use this method to supply label strings which create implicit net connections on the top level circuit. This feature is useful to connect identically labelled nets -while a component isn't integrated yet. If the component is integrated, net may be connected +while a component isn't integrated yet. If the component is integrated, nets may be connected on a higher hierarchy level - e.g. by a power mesh. Inside the component this net consists of individual islands. To properly perform netlist extraction and comparison, these islands need to be connected even though there isn't a physical connection. "connect_implicit" can achive this if these islands are labelled with the same text on the top level of the component.

    -Glob pattern are used which resemble shell file pattern: "*" is for all labels, "VDD" -for all "VDD" labels (pattern act case sensitive). "VDD*" is for all labels beginning -with "VDD" (still different labels will be connected to different nets!). "{VDD,VSS}" -is either "VDD" or "VSS". -

    -The search pattern is applied on the next net extraction. The search pattern is cleared +The implicit connections are applied on the next net extraction and cleared on "clear_connections".

    +

    "device_scaling" - Specifies a dimension scale factor for the geometrical device properties

    + +

    Usage:

    +
      +
    • device_scaling(factor)
    • +
    +

    +Specifying a factor of 2 will make all devices being extracted as if the +geometries were two times larger. This feature is useful when the drawn layout +does not correspond to the physical dimensions. +

    "extract_devices" - Extracts devices based on the given extractor class, name and device layer selection

    Usage:

    diff --git a/src/lay/lay/doc/about/lvs_ref_global.xml b/src/lay/lay/doc/about/lvs_ref_global.xml index d99c2fb74..4ea1fa4fb 100644 --- a/src/lay/lay/doc/about/lvs_ref_global.xml +++ b/src/lay/lay/doc/about/lvs_ref_global.xml @@ -19,6 +19,15 @@ layers or specification of the layout source. For more details about the DRC functions see
    DRC::global.

    +

    "align" - Aligns the extracted netlist vs. the schematic by flattening circuits where required

    + +

    Usage:

    +
      +
    • align
    • +
    +

    +See Netter#align for a description of that function. +

    "compare" - Compares the extracted netlist vs. the schematic

    Usage:

    @@ -37,6 +46,24 @@ See
    Netter#compare for a descrip

    See Netter#equivalent_pins for a description of that function.

    +

    "max_branch_complexity" - Configures the maximum branch complexity for ambiguous net matching

    + +

    Usage:

    +
      +
    • max_branch_complexity(n)
    • +
    +

    +See Netter#max_branch_complexity for a description of that function. +

    +

    "max_depth" - Configures the maximum search depth for net match deduction

    + +

    Usage:

    +
      +
    • max_depth(n)
    • +
    +

    +See Netter#max_depth for a description of that function. +

    "max_res" - Ignores resistors with a resistance above a certain value

    Usage:

    @@ -68,13 +95,14 @@ See
    Netter for more details

    Usage:

      -
    • report_lvs([ filename ])
    • +
    • report_lvs([ filename [, long ] ])

    After the comparison step, the LVS database will be shown in the netlist database browser in a cross-reference view. If a filename is given, the LVS database is also written to -this file. +this file. If a file name is given and "long" is true, a +verbose version of the LVS DB format will be used.

    If this method is called together with report_netlist and two files each, two files can be generated - one for the extracted netlist (L2N database) and one for the diff --git a/src/lay/lay/doc/about/lvs_ref_netter.xml b/src/lay/lay/doc/about/lvs_ref_netter.xml index 98a3cd859..604805c0c 100644 --- a/src/lay/lay/doc/about/lvs_ref_netter.xml +++ b/src/lay/lay/doc/about/lvs_ref_netter.xml @@ -43,6 +43,31 @@ end

    +

    "align" - Aligns the extracted netlist vs. the schematic

    + +

    Usage:

    +
      +
    • align
    • +
    +

    +The align method will modify the netlists in case of missing +corresponding circuits. It will flatten these circuits, thus +improving the equivalence between the netlists. Top level circuits +are not flattened. +

    +This feature is in particular useful to remove structural cells +like device PCells, reuse blocks etc. +

    +This method will also remove schematic circuits for which there is +no corresponding layout cell. In the extreme case of flat layout this +will result in a flat vs. flat compare. +

    +"netlist.flatten_circuit(...)" or "schematic.flatten_circuit(...)" +are other (explicit) ways to flatten circuits. +

    +Please note that flattening circuits has some side effects such +as loss of details in the cross reference and net layout. +

    "compare" - Compares the extracted netlist vs. the schematic

    Usage:

    @@ -54,6 +79,9 @@ Before using this method, a schematic netlist has to be loaded with
    same_nets, same_circuits, same_device_classes and equivalent_pins.

    +The compare method will also modify the netlists in case of missing +corresponding circuits: the unpaired circuit will be flattened then. +

    This method will return true, if the netlists are equivalent and false otherwise.

    @@ -61,7 +89,7 @@ otherwise.

    Usage:

      -
    • equivalent_pins(circuit, pins ...)
    • +
    • equivalent_pins(circuit, pin ...)

    This method will mark the given pins as equivalent. This gives the compare algorithm @@ -70,9 +98,15 @@ is used to declare inputs from gates are equivalent where are are logically, but physically (e.g. in a CMOS NAND gate):

    -netter.equivalent_pins("NAND2", "A", "B")
    +netter.equivalent_pins("NAND2", 0, 1)
     

    +The circuit argument is either a circuit name (a string) or a Circuit object +from the schematic netlist. +

    +The pin arguments are zero-based pin numbers, where 0 is the first number, 1 the second etc. +If the netlist provides named pins, names can be used instead of numbers. +

    Before this method can be used, a schematic netlist needs to be loaded with schematic.

    @@ -86,6 +120,23 @@ Before this method can be used, a schematic netlist needs to be loaded with The LayoutVsSchematic object provides access to the internal details of the netter object.

    +

    "max_depth" - Configures the maximum search depth for net match deduction

    + +

    Usage:

    +
      +
    • max_depth(n)
    • +
    +

    +The netlist compare algorithm works recursively: once a net +equivalence is established, additional matches are derived from +this equivalence. Such equivalences in turn are used to derive +new equivalences and so on. The maximum depth parameter configures +the number of recursions the algorithm performs before picking +the next net. With higher values for the depth, the algorithm +pursues this "deduction path" in greater depth while with +smaller values, the algorithm prefers picking nets in a random fashion +as the seeds for this deduction path. The default value is 8. +

    "max_res" - Ignores resistors with a resistance above a certain value

    Usage:

    @@ -117,6 +168,9 @@ This method will force an equivalence between the two circuits. By default, circuits are identified by name. If names are different, this method allows establishing an explicit correspondence.

    +One of the circuits may be nil. In this case, the corresponding +other circuit is mapped to "nothing", i.e. ignored. +

    Before this method can be used, a schematic netlist needs to be loaded with schematic.

    @@ -132,6 +186,9 @@ Device classes are also known as "models". By default, device classes are identified by name. If names are different, this method allows establishing an explicit correspondence.

    +One of the device classes may be nil. In this case, the corresponding +other device class is mapped to "nothing", i.e. ignored. +

    Before this method can be used, a schematic netlist needs to be loaded with schematic.

    @@ -145,7 +202,11 @@ Before this method can be used, a schematic netlist needs to be loaded with

    This method will force an equivalence between the net_a and net_b from circuit_a and circuit_b (circuit in the three-argument form is for both circuit_a and circuit_b). -Circuit and nets are string giving a circuit and net by name. +

    +In the four-argument form, the circuits can be either given by name or as Circuit +objects. In the three-argument form, the circuit has to be given by name. +Nets can be either given by name or as Net objects. +

    After using this function, the compare algorithm will consider these nets equivalent. Use this method to provide hints for the comparer in cases which are difficult to resolve otherwise. @@ -153,15 +214,19 @@ resolve otherwise. Before this method can be used, a schematic netlist needs to be loaded with schematic.

    -

    "schematic" - Reads the reference netlist

    +

    "schematic" - Gets, sets or reads the reference netlist

    Usage:

    • schematic(filename)
    • schematic(filename, reader)
    • schematic(netlist)
    • +
    • schematic

    +If no argument is given, the current schematic netlist is returned. nil is +returned if no schematic netlist is set yet. +

    If a filename is given (first two forms), the netlist is read from the given file. If no reader is provided, Spice format will be assumed. The reader object is a NetlistReader object and allows detailed customization of the reader process. diff --git a/src/lay/lay/doc/manual/lvs_intro.xml b/src/lay/lay/doc/manual/lvs_intro.xml index 791254eb8..d3278dd8e 100644 --- a/src/lay/lay/doc/manual/lvs_intro.xml +++ b/src/lay/lay/doc/manual/lvs_intro.xml @@ -342,8 +342,7 @@ connect_global(nwell, "NWELL")

    schematic("inv.cir")

    - And with this we can trigger the compare step (this will implicitly trigger the netlist - extraction from the layout too): + Finally after having set this up, we can trigger the compare step:

    compare
    @@ -357,7 +356,7 @@ connect_global(nwell, "NWELL") target_netlist("inv_extracted.cir", write_spice, "Extracted by KLayout")

    - The extracted netlist is pretty much the same than the reference netlist, but + Since we have a LVS match, the extracted netlist is pretty much the same than the reference netlist, but enhanced by some geometrical parameters such as source and drain area and perimeter:

    @@ -390,8 +389,8 @@ M$2 2 1 4 6 NMOS L=0.25U W=0.9U AS=0.405P AD=0.405P PS=2.7U PD=2.7U Tie-down diodes are contacts over active regions. The active regions are implanted p+ on the substrate and n+ within the n well (the opposite implant type of transistors). With this doping profile, the metal contact won't form - a Schottky barrier to the Silicon bulk and pretty much behave like an ohmic contact - (so in fact, the "diode" isn't a real diode in the sense of a rectifier). + a Schottky barrier to the Silicon bulk and behave like an ohmic contact. + So in fact, the "diode" isn't a real diode in the sense of a rectifier.

    diff --git a/src/lay/lay/doc/manual/lvs_tweaks.xml b/src/lay/lay/doc/manual/lvs_tweaks.xml index 99c2a6d60..997104258 100644 --- a/src/lay/lay/doc/manual/lvs_tweaks.xml +++ b/src/lay/lay/doc/manual/lvs_tweaks.xml @@ -115,6 +115,31 @@ For example, "NMOS*" will flatten all circuits starting with "NMOS".

    +

    Automatic circuit flattening (netlist alignment)

    + +

    + Instead of flattening circuits explicitly, automatic flattening is provided through + the align method. +

    + +

    + The "align" step is optional, hence useful: it will identify cells in the + layout without a corresponding schematic circuit and flatten them. "Flatten" + means their content is replicated inside their parent circuits and finally + the cell's corresponding circuit is removed. This is useful when the layout + contains structural cells: such cells are inserted not because the schematic + requires them as circuit building blocks, but because layout is easier to + create with these cells. Such cells can be PCells for devices or replication cells + which avoid duplicate layout work. +

    + +

    + The "align" method will also flatten schematic circuits for which there is no + layout cell: +

    + +
    align
    +

    Black boxing (circuit abstraction)

    diff --git a/src/laybasic/laybasic/layNetlistBrowserModel.cc b/src/laybasic/laybasic/layNetlistBrowserModel.cc index 0bb2b2e23..6c7741aef 100644 --- a/src/laybasic/laybasic/layNetlistBrowserModel.cc +++ b/src/laybasic/laybasic/layNetlistBrowserModel.cc @@ -821,13 +821,10 @@ std::string formatted_value (double v) } static -std::string device_string (const db::Device *device) +std::string device_parameter_string (const db::Device *device) { - if (! device || ! device->device_class ()) { - return std::string (); - } + std::string s; - std::string s = device->device_class ()->name (); bool first = true; const std::vector &pd = device->device_class ()->parameter_definitions (); for (std::vector::const_iterator p = pd.begin (); p != pd.end (); ++p) { @@ -849,6 +846,16 @@ std::string device_string (const db::Device *device) return s; } +static +std::string device_string (const db::Device *device) +{ + if (! device || ! device->device_class ()) { + return std::string (); + } + + return device->device_class ()->name () + device_parameter_string (device); +} + static std::string device_class_string (const db::Device *device, bool dash_for_empty = false) { @@ -862,13 +869,20 @@ std::string device_class_string (const db::Device *device, bool dash_for_empty = } static -std::string devices_string (const std::pair &devices, bool is_single) +std::string devices_string (const std::pair &devices, bool is_single, bool with_parameters) { if (devices.first || devices.second) { - std::string s = device_class_string (devices.first, ! is_single); + std::string s; + s = device_class_string (devices.first, ! is_single); + if (with_parameters) { + s += device_parameter_string (devices.first); + } if (! is_single) { std::string t = device_class_string (devices.second, ! is_single); + if (with_parameters) { + t += device_parameter_string (devices.second); + } if (t != s) { s += var_sep; s += t; @@ -1149,6 +1163,11 @@ IndexedNetlistModel::net_pair nets_from_device_terminals (const IndexedNetlistMo const std::string field_sep (" / "); +static QString escaped (const std::string &s) +{ + return tl::to_qstring (tl::escaped_to_html (s)); +} + QString NetlistBrowserModel::text (const QModelIndex &index) const { @@ -1161,9 +1180,9 @@ NetlistBrowserModel::text (const QModelIndex &index) const // + dual mode: name(a)/name(b) | name(a) | name(b) IndexedNetlistModel::circuit_pair circuits = circuits_from_id (id); if (index.column () == m_object_column) { - return tl::to_qstring (str_from_names (circuits, mp_indexer->is_single ())); + return escaped (str_from_names (circuits, mp_indexer->is_single ())); } else if (!mp_indexer->is_single () && (index.column () == m_first_column || index.column () == m_second_column)) { - return tl::to_qstring (str_from_name (index.column () == m_first_column ? circuits.first : circuits.second)); + return escaped (str_from_name (index.column () == m_first_column ? circuits.first : circuits.second)); } } else if (is_id_circuit_pin (id)) { @@ -1173,9 +1192,9 @@ NetlistBrowserModel::text (const QModelIndex &index) const // + dual mode: xname(a)/xname(b) | xname(a) | xname(b) IndexedNetlistModel::pin_pair pins = pins_from_id (id); if (index.column () == m_object_column) { - return tl::to_qstring (str_from_expanded_names (pins, mp_indexer->is_single ())); + return escaped (str_from_expanded_names (pins, mp_indexer->is_single ())); } else if (!mp_indexer->is_single () && (index.column () == m_first_column || index.column () == m_second_column)) { - return tl::to_qstring (str_from_expanded_name (index.column () == m_first_column ? pins.first : pins.second)); + return escaped (str_from_expanded_name (index.column () == m_first_column ? pins.first : pins.second)); } } else if (is_id_circuit_pin_net (id)) { @@ -1186,7 +1205,7 @@ NetlistBrowserModel::text (const QModelIndex &index) const IndexedNetlistModel::net_pair nets = nets_from_circuit_pins (circuits, pins); if (index.column () == m_object_column) { - return tl::to_qstring (str_from_expanded_names (nets, mp_indexer->is_single ())); + return escaped (str_from_expanded_names (nets, mp_indexer->is_single ())); } else if (index.column () == m_first_column || index.column () == m_second_column) { return make_link_to (nets, index.column ()); } @@ -1199,19 +1218,19 @@ NetlistBrowserModel::text (const QModelIndex &index) const if (mp_indexer->is_single ()) { if (index.column () == m_object_column) { - return tl::to_qstring (device_string (devices.first)); + return escaped (device_string (devices.first)); } else if (index.column () == m_first_column) { - return tl::to_qstring (str_from_expanded_name (devices.first)); + return escaped (str_from_expanded_name (devices.first)); } } else { if (index.column () == m_object_column) { - return tl::to_qstring (devices_string (devices, mp_indexer->is_single ())); + return escaped (devices_string (devices, mp_indexer->is_single (), false /*without parameters*/)); } else if (index.column () == m_first_column) { - return tl::to_qstring (str_from_expanded_name (devices.first) + field_sep + device_string (devices.first)); + return escaped (str_from_expanded_name (devices.first) + field_sep + device_string (devices.first)); } else if (index.column () == m_second_column) { - return tl::to_qstring (str_from_expanded_name (devices.second) + field_sep + device_string (devices.second)); + return escaped (str_from_expanded_name (devices.second) + field_sep + device_string (devices.second)); } } @@ -1227,7 +1246,7 @@ NetlistBrowserModel::text (const QModelIndex &index) const if (index.column () == m_object_column) { - return tl::to_qstring (str_from_names (termdefs, mp_indexer->is_single ())); + return escaped (str_from_names (termdefs, mp_indexer->is_single ())); } else if (index.column () == m_first_column || index.column () == m_second_column) { @@ -1244,9 +1263,9 @@ NetlistBrowserModel::text (const QModelIndex &index) const if (index.column () == m_object_column) { return make_link_to (circuit_refs); } else if (index.column () == m_first_column) { - return tl::to_qstring (str_from_expanded_name (subcircuits.first)); + return escaped (str_from_expanded_name (subcircuits.first)); } else if (index.column () == m_second_column) { - return tl::to_qstring (str_from_expanded_name (subcircuits.second)); + return escaped (str_from_expanded_name (subcircuits.second)); } } else if (is_id_circuit_subcircuit_pin (id)) { @@ -1267,11 +1286,11 @@ NetlistBrowserModel::text (const QModelIndex &index) const // circuit/net: header column = node count, second column net name IndexedNetlistModel::net_pair nets = nets_from_id (id); if (index.column () == m_object_column) { - return tl::to_qstring (str_from_expanded_names (nets, mp_indexer->is_single ())); + return escaped (str_from_expanded_names (nets, mp_indexer->is_single ())); } else if (index.column () == m_first_column && nets.first) { - return tl::to_qstring (nets.first->expanded_name () + " (" + tl::to_string (nets.first->pin_count () + nets.first->terminal_count () + nets.first->subcircuit_pin_count ()) + ")"); + return escaped (nets.first->expanded_name () + " (" + tl::to_string (nets.first->pin_count () + nets.first->terminal_count () + nets.first->subcircuit_pin_count ()) + ")"); } else if (index.column () == m_second_column && nets.second) { - return tl::to_qstring (nets.second->expanded_name () + " (" + tl::to_string (nets.second->pin_count () + nets.second->terminal_count () + nets.second->subcircuit_pin_count ()) + ")"); + return escaped (nets.second->expanded_name () + " (" + tl::to_string (nets.second->pin_count () + nets.second->terminal_count () + nets.second->subcircuit_pin_count ()) + ")"); } } else if (is_id_circuit_net_pin (id)) { @@ -1325,9 +1344,9 @@ NetlistBrowserModel::text (const QModelIndex &index) const std::pair termdefs = terminal_defs_from_terminal_refs (refs); if (mp_indexer->is_single ()) { - return tl::to_qstring (str_from_name (termdefs.first) + field_sep + device_string (devices.first)); + return escaped (str_from_name (termdefs.first) + field_sep + device_string (devices.first)); } else { - return tl::to_qstring (str_from_names (termdefs, mp_indexer->is_single ()) + field_sep + devices_string (devices, mp_indexer->is_single ())); + return escaped (str_from_names (termdefs, mp_indexer->is_single ()) + field_sep + devices_string (devices, mp_indexer->is_single (), true /*with parameters*/)); } } else if (index.column () == m_first_column || index.column () == m_second_column) { @@ -1346,7 +1365,7 @@ NetlistBrowserModel::text (const QModelIndex &index) const if (index.column () == m_object_column) { - return tl::to_qstring (str_from_names (termdefs, mp_indexer->is_single ())); + return escaped (str_from_names (termdefs, mp_indexer->is_single ())); } else if (index.column () == m_first_column || index.column () == m_second_column) { @@ -1434,6 +1453,20 @@ NetlistBrowserModel::status (const QModelIndex &index) const size_t index = circuit_device_index_from_id (id); return mp_indexer->device_from_index (circuits, index).second; + } else if (is_id_circuit_device_terminal (id)) { + + IndexedNetlistModel::device_pair devices = devices_from_id (id); + std::pair device_classes = device_classes_from_devices (devices); + size_t terminal = circuit_device_terminal_index_from_id (id); + + std::pair termdefs = terminal_defs_from_device_classes (device_classes, terminal); + + if (! is_valid_net_pair (nets_from_device_terminals (devices, termdefs))) { + // This indicates a wrong connection: the nets are associated in a way which is a not + // corresponding to a mapped net pair. Report Mismatch here. + return db::NetlistCrossReference::NoMatch; + } + } else if (is_id_circuit_subcircuit (id)) { IndexedNetlistModel::circuit_pair circuits = circuits_from_id (id); @@ -1455,7 +1488,7 @@ NetlistBrowserModel::status (const QModelIndex &index) const if (! is_valid_net_pair (nets_from_subcircuit_pins (subcircuits, pins))) { // This indicates a wrong connection: the nets are associated in a way which is a not // corresponding to a mapped net pair. Report Mismatch here. - return db::NetlistCrossReference::MatchWithWarning; + return db::NetlistCrossReference::NoMatch; } } else if (is_id_circuit_net (id)) { @@ -1472,6 +1505,21 @@ NetlistBrowserModel::status (const QModelIndex &index) const return mp_indexer->device_from_index (circuits, mp_indexer->device_index (devices)).second; + } else if (is_id_circuit_net_device_terminal_others (id)) { + + IndexedNetlistModel::net_terminal_pair termrefs = net_terminalrefs_from_id (id); + size_t other_index = circuit_net_device_terminal_other_index_from_id (id); + + IndexedNetlistModel::device_pair devices = devices_from_termrefs (termrefs); + std::pair device_classes = device_classes_from_devices (devices); + std::pair termdefs = terminal_defs_from_device_classes (device_classes, other_index); + + if (! is_valid_net_pair (nets_from_device_terminals (devices, termdefs))) { + // This indicates a wrong connection: the nets are associated in a way which is a not + // corresponding to a mapped net pair. Report Mismatch here. + return db::NetlistCrossReference::NoMatch; + } + } else if (is_id_circuit_net_subcircuit_pin (id)) { IndexedNetlistModel::circuit_pair circuits = circuits_from_id (id); @@ -1492,7 +1540,7 @@ NetlistBrowserModel::status (const QModelIndex &index) const if (! is_valid_net_pair (nets_from_subcircuit_pins (subcircuits, pins))) { // This indicates a wrong connection: the nets are associated in a way which is a not // corresponding to a mapped net pair. Report Mismatch here. - return db::NetlistCrossReference::MatchWithWarning; + return db::NetlistCrossReference::NoMatch; } } diff --git a/src/laybasic/laybasic/layNetlistCrossReferenceModel.cc b/src/laybasic/laybasic/layNetlistCrossReferenceModel.cc index 6532afed4..0c28f51e3 100644 --- a/src/laybasic/laybasic/layNetlistCrossReferenceModel.cc +++ b/src/laybasic/laybasic/layNetlistCrossReferenceModel.cc @@ -532,6 +532,11 @@ std::string NetlistCrossReferenceModel::device_status_hint (const circuit_pair & "Devices are identified by the nets they are attached to. Unmatched devices mean that\n" "at least one terminal net isn't matched with a corresponding net from the other netlist.\n" "Make all terminal nets match and the devices will match too.")); + } else { + return tl::to_string (tr ("Devices don't match topologically.\n" + "Check the terminal connections to identify the terminals not being connected to\n" + "corresponding nets. Either the devices are not connected correctly or the nets\n" + "need to be fixed before the devices will match too.")); } } else if (cps.second == db::NetlistCrossReference::MatchWithWarning) { return tl::to_string (tr ("Topologically matching devices are found here but either the parameters or the\n" diff --git a/src/laybasic/unit_tests/layNetlistBrowserModelTests.cc b/src/laybasic/unit_tests/layNetlistBrowserModelTests.cc index 65642f6d8..7fac3d3a7 100644 --- a/src/laybasic/unit_tests/layNetlistBrowserModelTests.cc +++ b/src/laybasic/unit_tests/layNetlistBrowserModelTests.cc @@ -289,7 +289,7 @@ TEST (2) // INV2, net 1 has one pin and one terminal at BULK EXPECT_EQ (tl::to_string (model->data (model->index (0, 0, inv2Net0Index), Qt::UserRole).toString ()), "B|B|PMOS|PMOS|$1|$1"); - EXPECT_EQ (tl::to_string (model->data (model->index (0, 0, inv2Net0Index), Qt::DisplayRole).toString ()), "B / PMOS"); + EXPECT_EQ (tl::to_string (model->data (model->index (0, 0, inv2Net0Index), Qt::DisplayRole).toString ()), "B / PMOS [L=0.25, W=3.5]"); EXPECT_EQ (tl::to_string (model->data (model->index (0, 2, inv2Net0Index), Qt::DisplayRole).toString ()), "$1"); EXPECT_EQ (tl::to_string (model->data (model->index (0, 3, inv2Net0Index), Qt::DisplayRole).toString ()), "$1"); diff --git a/src/lvs/lvs/built-in-macros/_lvs_engine.rb b/src/lvs/lvs/built-in-macros/_lvs_engine.rb index bc928d1e6..b7a1dc2b7 100644 --- a/src/lvs/lvs/built-in-macros/_lvs_engine.rb +++ b/src/lvs/lvs/built-in-macros/_lvs_engine.rb @@ -94,6 +94,12 @@ module LVS # @synopsis compare # See \Netter#compare for a description of that function. + # %LVS% + # @name align + # @brief Aligns the extracted netlist vs. the schematic by flattening circuits where required + # @synopsis align + # See \Netter#align for a description of that function. + # %LVS% # @name same_nets # @brief Establishes an equivalence between the nets @@ -143,7 +149,7 @@ module LVS # @synopsis max_depth(n) # See \Netter#max_depth for a description of that function. - %w(schematic compare same_nets same_circuits same_device_classes equivalent_pins min_caps max_res max_depth max_branch_complexity).each do |f| + %w(schematic compare align same_nets same_circuits same_device_classes equivalent_pins min_caps max_res max_depth max_branch_complexity).each do |f| eval <<"CODE" def #{f}(*args) _netter.#{f}(*args) diff --git a/src/lvs/lvs/built-in-macros/_lvs_netter.rb b/src/lvs/lvs/built-in-macros/_lvs_netter.rb index 16014e9d0..4b445e3da 100644 --- a/src/lvs/lvs/built-in-macros/_lvs_netter.rb +++ b/src/lvs/lvs/built-in-macros/_lvs_netter.rb @@ -91,6 +91,46 @@ module LVS data end + # %LVS% + # @name align + # @brief Aligns the extracted netlist vs. the schematic + # @synopsis align + # The align method will modify the netlists in case of missing + # corresponding circuits. It will flatten these circuits, thus + # improving the equivalence between the netlists. Top level circuits + # are not flattened. + # + # This feature is in particular useful to remove structural cells + # like device PCells, reuse blocks etc. + # + # This method will also remove schematic circuits for which there is + # no corresponding layout cell. In the extreme case of flat layout this + # will result in a flat vs. flat compare. + # + # "netlist.flatten_circuit(...)" or "schematic.flatten_circuit(...)" + # are other (explicit) ways to flatten circuits. + # + # Please note that flattening circuits has some side effects such + # as loss of details in the cross reference and net layout. + + def align + + nl = _ensure_two_netlists + + # flatten layout cells for which there is no corresponding schematic circuit + @comparer.unmatched_circuits_a(*nl).each do |c| + @engine.info("Flatten layout cell (no schematic): #{c.name}") + nl[0].flatten_circuit(c) + end + + # flatten schematic circuits for which there is no corresponding layout cell + @comparer.unmatched_circuits_b(*nl).each do |c| + @engine.info("Flatten schematic circuit (no layout): #{c.name}") + nl[1].flatten_circuit(c) + end + + end + # %LVS% # @name compare # @brief Compares the extracted netlist vs. the schematic @@ -99,12 +139,19 @@ module LVS # The compare can be configured in more details using \same_nets, \same_circuits, # \same_device_classes and \equivalent_pins. # + # The compare method will also modify the netlists in case of missing + # corresponding circuits: the unpaired circuit will be flattened then. + # # This method will return true, if the netlists are equivalent and false # otherwise. def compare - lvs_data.reference = _ensure_two_netlists[1] + + nl = _ensure_two_netlists + lvs_data.reference = nl[1] + lvs_data.compare(@comparer) + end def _ensure_two_netlists diff --git a/src/lvs/lvs/templates/lvs.lym b/src/lvs/lvs/templates/lvs.lym index 09e9ea06c..7b74b5643 100644 --- a/src/lvs/lvs/templates/lvs.lym +++ b/src/lvs/lvs/templates/lvs.lym @@ -101,6 +101,9 @@ connect_global(ptie, "SUBSTRATE") # Netlist normalization netlist.simplify +# Hierarchy alignment (flatten out unmatched cells) +align + # Netlist vs. netlist compare diff --git a/src/lvs/unit_tests/lvsSimpleTests.cc b/src/lvs/unit_tests/lvsSimpleTests.cc index 7e14387b5..5c3319b22 100644 --- a/src/lvs/unit_tests/lvsSimpleTests.cc +++ b/src/lvs/unit_tests/lvsSimpleTests.cc @@ -118,3 +118,14 @@ TEST(9_blackboxing) { run_test (_this, "ringo_simple_blackboxing", "ringo_for_blackboxing.gds"); } + +TEST(10_simplification_with_align) +{ + run_test (_this, "ringo_simple_simplification_with_align", "ringo_for_simplification.gds"); +} + +TEST(11_device_scaling) +{ + run_test (_this, "ringo_simple_device_scaling", "ringo.gds"); +} + diff --git a/src/lvs/unit_tests/lvsTests.cc b/src/lvs/unit_tests/lvsTests.cc index d3ce9fa7c..d4fc23a89 100644 --- a/src/lvs/unit_tests/lvsTests.cc +++ b/src/lvs/unit_tests/lvsTests.cc @@ -30,10 +30,10 @@ #include "lymMacro.h" #include "tlFileUtils.h" -void run_test (tl::TestBase *_this, const std::string &suffix, const std::string &layout) +void run_test (tl::TestBase *_this, const std::string &lvs_rs, const std::string &suffix, const std::string &layout) { std::string rs = tl::testsrc (); - rs += "/testdata/lvs/" + suffix + ".lvs"; + rs += "/testdata/lvs/" + lvs_rs; std::string src = tl::testsrc (); src += "/testdata/lvs/" + layout; @@ -100,5 +100,12 @@ void run_test (tl::TestBase *_this, const std::string &suffix, const std::string TEST(1_full) { - run_test (_this, "vexriscv", "vexriscv.oas.gz"); + test_is_long_runner (); + run_test (_this, "vexriscv.lvs", "vexriscv", "vexriscv.oas.gz"); +} + +TEST(2_fullWithAlign) +{ + test_is_long_runner (); + run_test (_this, "vexriscv_align.lvs", "vexriscv", "vexriscv.oas.gz"); } diff --git a/testdata/algo/device_extract_au5_flattened_circuits.gds b/testdata/algo/device_extract_au5_flattened_circuits.gds new file mode 100644 index 000000000..40dc8210f Binary files /dev/null and b/testdata/algo/device_extract_au5_flattened_circuits.gds differ diff --git a/testdata/algo/lvs_test1_au.lvsdb.1 b/testdata/algo/lvs_test1_au.lvsdb.1 index b20b9b77b..5f45d3819 100644 --- a/testdata/algo/lvs_test1_au.lvsdb.1 +++ b/testdata/algo/lvs_test1_au.lvsdb.1 @@ -954,8 +954,8 @@ xref( pin(2 2 match) pin(4 4 match) pin(3 3 match) - device(1 1 match) device(3 2 match) + device(1 1 match) ) ) circuit(INV2PAIR INV2PAIR match diff --git a/testdata/algo/lvs_test1_au.lvsdb.2 b/testdata/algo/lvs_test1_au.lvsdb.2 index f0a135237..cf52cf8cd 100644 --- a/testdata/algo/lvs_test1_au.lvsdb.2 +++ b/testdata/algo/lvs_test1_au.lvsdb.2 @@ -954,8 +954,8 @@ xref( pin(2 2 match) pin(4 4 match) pin(3 3 match) - device(1 1 match) device(3 2 match) + device(1 1 match) ) ) circuit(INV2PAIR INV2PAIR match diff --git a/testdata/algo/lvs_test1b_au.lvsdb.1 b/testdata/algo/lvs_test1b_au.lvsdb.1 index 58faa611b..ca44150de 100644 --- a/testdata/algo/lvs_test1b_au.lvsdb.1 +++ b/testdata/algo/lvs_test1b_au.lvsdb.1 @@ -954,8 +954,8 @@ xref( pin(2 2 match) pin(4 4 match) pin(3 3 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(INV2PAIR INV2PAIR match diff --git a/testdata/algo/lvs_test1b_au.lvsdb.2 b/testdata/algo/lvs_test1b_au.lvsdb.2 index dbcdf7f3e..2db900155 100644 --- a/testdata/algo/lvs_test1b_au.lvsdb.2 +++ b/testdata/algo/lvs_test1b_au.lvsdb.2 @@ -954,8 +954,8 @@ xref( pin(2 2 match) pin(4 4 match) pin(3 3 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(INV2PAIR INV2PAIR match diff --git a/testdata/algo/lvs_test2_au.lvsdb.1 b/testdata/algo/lvs_test2_au.lvsdb.1 index 7e3552182..85ec734bf 100644 --- a/testdata/algo/lvs_test2_au.lvsdb.1 +++ b/testdata/algo/lvs_test2_au.lvsdb.1 @@ -980,8 +980,8 @@ xref( pin(2 2 match) pin(4 4 match) pin(3 3 match) - device(1 1 match) device(3 2 match) + device(1 1 match) ) ) circuit(INV2PAIR INV2PAIR nomatch diff --git a/testdata/algo/lvs_test2_au.lvsdb.2 b/testdata/algo/lvs_test2_au.lvsdb.2 index 73670ff54..9dacebd21 100644 --- a/testdata/algo/lvs_test2_au.lvsdb.2 +++ b/testdata/algo/lvs_test2_au.lvsdb.2 @@ -980,8 +980,8 @@ xref( pin(2 2 match) pin(4 4 match) pin(3 3 match) - device(1 1 match) device(3 2 match) + device(1 1 match) ) ) circuit(INV2PAIR INV2PAIR nomatch diff --git a/testdata/algo/lvs_test2b_au.lvsdb.1 b/testdata/algo/lvs_test2b_au.lvsdb.1 index e1a8825f8..f0a00dfb1 100644 --- a/testdata/algo/lvs_test2b_au.lvsdb.1 +++ b/testdata/algo/lvs_test2b_au.lvsdb.1 @@ -980,8 +980,8 @@ xref( pin(2 2 match) pin(4 4 match) pin(3 3 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(INV2PAIR INV2PAIR nomatch diff --git a/testdata/algo/lvs_test2b_au.lvsdb.2 b/testdata/algo/lvs_test2b_au.lvsdb.2 index 6f4b5e8d3..1cf9af670 100644 --- a/testdata/algo/lvs_test2b_au.lvsdb.2 +++ b/testdata/algo/lvs_test2b_au.lvsdb.2 @@ -980,8 +980,8 @@ xref( pin(2 2 match) pin(4 4 match) pin(3 3 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(INV2PAIR INV2PAIR nomatch diff --git a/testdata/algo/nreader7.cir b/testdata/algo/nreader7.cir new file mode 100644 index 000000000..210af361c --- /dev/null +++ b/testdata/algo/nreader7.cir @@ -0,0 +1,31 @@ +* RINGO netlist with global nets + +.GLOBAL VDD +.GLOBAL VSS + +.SUBCKT RINGO FB OUT ENABLE +X$1 1 FB ENABLE ND2X1 +X$2 2 1 INVX1 +X$3 3 2 INVX1 +X$4 4 3 INVX1 +X$5 5 4 INVX1 +X$6 6 5 INVX1 +X$7 7 6 INVX1 +X$8 8 7 INVX1 +X$9 9 8 INVX1 +X$10 10 9 INVX1 +X$11 FB 10 INVX1 +X$12 OUT FB INVX1 +.ENDS RINGO + +.SUBCKT ND2X1 OUT B A +M$1 OUT A VDD VDD MLVPMOS L=0.25U W=1.5U AS=0.6375P AD=0.3375P PS=3.85U PD=1.95U +M$2 VDD B OUT VDD MLVPMOS L=0.25U W=1.5U AS=0.3375P AD=0.6375P PS=1.95U PD=3.85U +M$3 VSS A INT VSS MLVNMOS L=0.25U W=0.95U AS=0.40375P AD=0.21375P PS=2.75U PD=1.4U +M$4 INT B OUT VSS MLVNMOS L=0.25U W=0.95U AS=0.21375P AD=0.40375P PS=1.4U PD=2.75U +.ENDS ND2X1 + +.SUBCKT INVX1 OUT IN +M$1 VDD IN OUT VDD MLVPMOS L=0.25U W=1.5U AS=0.6375P AD=0.6375P PS=3.85U PD=3.85U +M$2 VSS IN OUT VSS MLVNMOS L=0.25U W=0.95U AS=0.40375P AD=0.40375P PS=2.75U PD=2.75U +.ENDS INVX1 diff --git a/testdata/drc/drcSimpleTests_11.drc b/testdata/drc/drcSimpleTests_11.drc index e9a059603..9f23a1b5f 100644 --- a/testdata/drc/drcSimpleTests_11.drc +++ b/testdata/drc/drcSimpleTests_11.drc @@ -91,8 +91,8 @@ class CustomResistorExtraction < RBA::GenericDeviceExtractor # -> W = p-sqrt(p*p-A) # (p=P/4) - p = 0.25 * r.perimeter - a = r.area + p = sdbu * 0.25 * r.perimeter + a = sdbu * sdbu * r.area d = Math.sqrt(p * p - a) l = p + d @@ -102,7 +102,10 @@ class CustomResistorExtraction < RBA::GenericDeviceExtractor device = create_device + device.trans = RBA::DCplxTrans::new(RBA::CplxTrans::new(dbu) * (r.bbox.center - RBA::Point::new)); + device.set_parameter(RBA::DeviceClassResistor::PARAM_R, @sheet_rho * l / w); + device.set_parameter(RBA::DeviceClassResistor::PARAM_A, a); define_terminal(device, RBA::DeviceClassResistor::TERMINAL_A, conductor_geometry_index, terminals[0]); define_terminal(device, RBA::DeviceClassResistor::TERMINAL_B, conductor_geometry_index, terminals[1]); diff --git a/testdata/lvs/inv.lvsdb b/testdata/lvs/inv.lvsdb index 33c6d5e86..4b8431f79 100644 --- a/testdata/lvs/inv.lvsdb +++ b/testdata/lvs/inv.lvsdb @@ -18,21 +18,21 @@ layout( layer(l12 'METAL2 (9/0)') layer(l13 'METAL2_LABEL (9/1)') layer(l7) - layer(l1) - layer(l5) + layer(l2) + layer(l6) # Mask layer connectivity connect(l3 l3) connect(l4 l4 l8) - connect(l8 l4 l8 l9 l1 l5) + connect(l8 l4 l8 l9 l2 l6) connect(l9 l8 l9 l10 l11) connect(l10 l9 l10) connect(l11 l9 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) - connect(l5 l8 l5) + connect(l2 l8 l2) + connect(l6 l8 l6) # Global nets and connectivity global(l3 NWELL) @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PMOS PMOS terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$NMOS NMOS terminal(S - rect(l5 (-575 -450) (450 900)) + rect(l6 (-575 -450) (450 900)) ) terminal(G rect(l4 (-125 -450) (250 900)) ) terminal(D - rect(l5 (125 -450) (450 900)) + rect(l6 (125 -450) (450 900)) ) terminal(B rect(l7 (-125 -450) (250 900)) @@ -98,7 +98,7 @@ layout( rect(l11 (-200 300) (200 200)) rect(l12 (-750 -850) (2000 1000)) rect(l13 (-101 -851) (2 2)) - rect(l5 (-1451 49) (450 900)) + rect(l6 (-1451 49) (450 900)) ) net(3 name(VDD) rect(l8 (550 4350) (200 200)) @@ -109,7 +109,7 @@ layout( rect(l11 (-200 300) (200 200)) rect(l12 (-750 -850) (2000 1000)) rect(l13 (-151 -851) (2 2)) - rect(l1 (-1401 -851) (450 1500)) + rect(l2 (-1401 -851) (450 1500)) ) net(4 name(OUT) rect(l8 (1300 4350) (200 200)) @@ -122,8 +122,8 @@ layout( rect(l9 (-300 -2900) (450 400)) rect(l9 (-450 -1550) (300 850)) rect(l10 (-51 499) (2 2)) - rect(l1 (-351 2649) (450 1500)) - rect(l5 (-450 -5500) (450 900)) + rect(l2 (-351 2649) (450 1500)) + rect(l6 (-450 -5500) (450 900)) ) net(5 name(NWELL) rect(l3 (0 2950) (2000 3200)) diff --git a/testdata/lvs/inv2.lvsdb b/testdata/lvs/inv2.lvsdb index 594a5e685..782d6282e 100644 --- a/testdata/lvs/inv2.lvsdb +++ b/testdata/lvs/inv2.lvsdb @@ -11,34 +11,34 @@ J( L(l14 'METAL2 (9/0)') L(l15 'METAL2_LABEL (9/1)') L(l7) - L(l1) + L(l2) L(l9) - L(l5) + L(l6) L(l10) C(l3 l3 l9) C(l4 l4 l8) - C(l8 l4 l8 l11 l1 l9 l5 l10) + C(l8 l4 l8 l11 l2 l9 l6 l10) C(l11 l8 l11 l12 l13) C(l12 l11 l12) C(l13 l11 l13 l14) C(l14 l13 l14 l15) C(l15 l14 l15) C(l7 l7) - C(l1 l8 l1) + C(l2 l8 l2) C(l9 l3 l8 l9) - C(l5 l8 l5) + C(l6 l8 l6) C(l10 l8 l10) G(l7 SUBSTRATE) G(l10 SUBSTRATE) D(D$PMOS PMOS T(S - R(l1 (-575 -750) (450 1500)) + R(l2 (-575 -750) (450 1500)) ) T(G R(l4 (-125 -750) (250 1500)) ) T(D - R(l1 (125 -750) (450 1500)) + R(l2 (125 -750) (450 1500)) ) T(B R(l3 (-125 -750) (250 1500)) @@ -46,13 +46,13 @@ J( ) D(D$NMOS NMOS T(S - R(l5 (-575 -450) (450 900)) + R(l6 (-575 -450) (450 900)) ) T(G R(l4 (-125 -450) (250 900)) ) T(D - R(l5 (125 -450) (450 900)) + R(l6 (125 -450) (450 900)) ) T(B R(l7 (-125 -450) (250 900)) @@ -84,7 +84,7 @@ J( R(l13 (-200 300) (200 200)) R(l14 (-2350 -850) (3000 1000)) R(l15 (-151 -851) (2 2)) - R(l1 (-2401 -851) (450 1500)) + R(l2 (-2401 -851) (450 1500)) R(l9 (1050 -1200) (600 1200)) ) N(3 I(OUT) @@ -98,8 +98,8 @@ J( R(l11 (-300 -2900) (450 400)) R(l11 (-450 -1550) (300 850)) R(l12 (-51 499) (2 2)) - R(l1 (-351 2649) (450 1500)) - R(l5 (-450 -5500) (450 900)) + R(l2 (-351 2649) (450 1500)) + R(l6 (-450 -5500) (450 900)) ) N(4 I(VSS) R(l8 (550 300) (200 200)) @@ -114,7 +114,7 @@ J( R(l13 (-200 300) (200 200)) R(l14 (-2350 -850) (3000 1000)) R(l15 (-151 -851) (2 2)) - R(l5 (-2401 49) (450 900)) + R(l6 (-2401 49) (450 900)) R(l10 (1050 -900) (600 1200)) ) D(1 D$PMOS diff --git a/testdata/lvs/ringo_scaled.cir b/testdata/lvs/ringo_scaled.cir new file mode 100644 index 000000000..3cb10be81 --- /dev/null +++ b/testdata/lvs/ringo_scaled.cir @@ -0,0 +1,27 @@ + +.SUBCKT RINGO VSS VDD FB ENABLE OUT +X$1 VDD 1 VSS VDD FB ENABLE VSS ND2X1 +X$2 VDD 2 VSS VDD 1 VSS INVX1 +X$3 VDD 3 VSS VDD 2 VSS INVX1 +X$4 VDD 4 VSS VDD 3 VSS INVX1 +X$5 VDD 5 VSS VDD 4 VSS INVX1 +X$6 VDD 6 VSS VDD 5 VSS INVX1 +X$7 VDD 7 VSS VDD 6 VSS INVX1 +X$8 VDD 8 VSS VDD 7 VSS INVX1 +X$9 VDD 9 VSS VDD 8 VSS INVX1 +X$10 VDD 10 VSS VDD 9 VSS INVX1 +X$11 VDD FB VSS VDD 10 VSS INVX1 +X$12 VDD OUT VSS VDD FB VSS INVX1 +.ENDS RINGO + +.SUBCKT ND2X1 VDD OUT VSS NWELL B A BULK +M$1 OUT A VDD NWELL PMOS L=0.5U W=3U +M$2 VDD B OUT NWELL PMOS L=0.5U W=3U +M$3 VSS A 1 BULK NMOS L=0.5U W=1.9U +M$4 1 B OUT BULK NMOS L=0.5U W=1.9U +.ENDS ND2X1 + +.SUBCKT INVX1 VDD OUT VSS NWELL IN BULK +M$1 VDD IN OUT NWELL PMOS L=0.5U W=3U +M$2 VSS IN OUT BULK NMOS L=0.5U W=1.9U +.ENDS INVX1 diff --git a/testdata/lvs/ringo_simple.lvsdb.1 b/testdata/lvs/ringo_simple.lvsdb.1 index 9ed4f2480..a68dae475 100644 --- a/testdata/lvs/ringo_simple.lvsdb.1 +++ b/testdata/lvs/ringo_simple.lvsdb.1 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PMOS PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PMOS$1 PMOS terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PMOS$2 PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NMOS NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NMOS$1 NMOS terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NMOS$2 NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-1750 -1450) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1750 -1450) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -364,63 +364,63 @@ layout( net(1 rect(l8 (4710 3010) (180 180)) rect(l11 (-850 -240) (610 300)) - rect(l1 (-2550 1800) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-2550 1800) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(2 rect(l8 (6510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (8310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (10110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 rect(l8 (11910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 rect(l8 (13710 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(7 rect(l8 (15510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(8 rect(l8 (17310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(9 rect(l8 (19110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(10 rect(l8 (20910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 name(FB) rect(l8 (22710 3010) (180 180)) @@ -434,8 +434,8 @@ layout( rect(l13 (-17921 -201) (2 2)) rect(l13 (-221 -201) (400 400)) rect(l13 (17740 -400) (400 400)) - rect(l1 (-245 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(12 name(VDD) rect(l3 (500 4500) (1400 3500)) @@ -457,19 +457,19 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23025 -2550) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (1275 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) + rect(l2 (-23025 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) rect(l9 (-21975 -450) (500 1500)) rect(l9 (22900 -1500) (500 1500)) ) @@ -478,8 +478,8 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-101 -101) (2 2)) rect(l13 (-201 -201) (400 400)) - rect(l1 (-625 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-625 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(14 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -504,18 +504,18 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l5 (-23700 460) (425 950)) - rect(l5 (1975 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) + rect(l6 (-23700 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) rect(l10 (-21975 -2210) (500 1500)) rect(l10 (22900 -1500) (500 1500)) ) @@ -905,8 +905,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(ND2X1 ND2X1 match @@ -926,10 +926,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(RINGO RINGO match @@ -954,10 +954,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(10 10 match) - circuit(11 11 match) - circuit(12 12 match) circuit(2 2 match) circuit(3 3 match) circuit(4 4 match) @@ -966,6 +962,10 @@ xref( circuit(7 7 match) circuit(8 8 match) circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple.lvsdb.2 b/testdata/lvs/ringo_simple.lvsdb.2 index 2d8585635..834cc43fe 100644 --- a/testdata/lvs/ringo_simple.lvsdb.2 +++ b/testdata/lvs/ringo_simple.lvsdb.2 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PMOS PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PMOS$1 PMOS terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PMOS$2 PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NMOS NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NMOS$1 NMOS terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NMOS$2 NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-375 -1450) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-375 -1450) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -364,63 +364,63 @@ layout( net(1 rect(l8 (4710 3010) (180 180)) rect(l11 (-850 -240) (610 300)) - rect(l1 (-1175 1800) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-1175 1800) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(2 rect(l8 (6510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (8310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (10110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 rect(l8 (11910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 rect(l8 (13710 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(7 rect(l8 (15510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(8 rect(l8 (17310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(9 rect(l8 (19110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(10 rect(l8 (20910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 name(FB) rect(l8 (22710 3010) (180 180)) @@ -434,8 +434,8 @@ layout( rect(l13 (-17921 -201) (2 2)) rect(l13 (-221 -201) (400 400)) rect(l13 (17740 -400) (400 400)) - rect(l1 (-245 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(12 name(VDD) rect(l3 (500 4500) (1400 3500)) @@ -457,19 +457,19 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23025 -2550) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (1275 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) + rect(l2 (-23025 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) rect(l9 (-21975 -450) (500 1500)) rect(l9 (22900 -1500) (500 1500)) ) @@ -478,8 +478,8 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-101 -101) (2 2)) rect(l13 (-201 -201) (400 400)) - rect(l1 (-625 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-625 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(14 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -504,18 +504,18 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l5 (-23700 460) (425 950)) - rect(l5 (1975 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) + rect(l6 (-23700 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) rect(l10 (-21975 -2210) (500 1500)) rect(l10 (22900 -1500) (500 1500)) ) @@ -905,8 +905,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(ND2X1 ND2X1 match @@ -926,10 +926,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(RINGO RINGO match @@ -954,10 +954,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(10 10 match) - circuit(11 11 match) - circuit(12 12 match) circuit(2 2 match) circuit(3 3 match) circuit(4 4 match) @@ -966,6 +962,10 @@ xref( circuit(7 7 match) circuit(8 8 match) circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_blackboxing.lvsdb b/testdata/lvs/ringo_simple_blackboxing.lvsdb index 172b60755..0e9ead554 100644 --- a/testdata/lvs/ringo_simple_blackboxing.lvsdb +++ b/testdata/lvs/ringo_simple_blackboxing.lvsdb @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7 '13/0') - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -185,10 +185,22 @@ layout( rect(l8 (17310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) ) - net(12) - net(13) - net(14) - net(15) + net(12 + rect(l8 (10110 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + ) + net(13 + rect(l8 (11910 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + ) + net(14 + rect(l8 (13710 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + ) + net(15 + rect(l8 (15510 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + ) # Outgoing pins and their connections to nets pin(5 name(FB)) @@ -525,10 +537,6 @@ xref( pin(2 4 match) pin(1 0 match) pin(4 1 match) - circuit(1 1 match) - circuit(5 10 match) - circuit(6 11 match) - circuit(7 12 match) circuit(2 2 match) circuit(3 3 match) circuit(17 4 match) @@ -537,6 +545,10 @@ xref( circuit(20 7 match) circuit(21 8 match) circuit(4 9 match) + circuit(5 10 match) + circuit(6 11 match) + circuit(7 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_device_scaling.cir b/testdata/lvs/ringo_simple_device_scaling.cir new file mode 100644 index 000000000..44196cb11 --- /dev/null +++ b/testdata/lvs/ringo_simple_device_scaling.cir @@ -0,0 +1,83 @@ +* Extracted by KLayout + +* cell RINGO +* pin FB +* pin VDD +* pin OUT +* pin ENABLE +* pin VSS +.SUBCKT RINGO 11 12 13 14 15 +* net 11 FB +* net 12 VDD +* net 13 OUT +* net 14 ENABLE +* net 15 VSS +* cell instance $1 r0 *1 1.8,0 +X$1 12 1 15 12 11 14 15 ND2X1 +* cell instance $2 r0 *1 4.2,0 +X$2 12 2 15 12 1 15 INVX1 +* cell instance $3 r0 *1 6,0 +X$3 12 3 15 12 2 15 INVX1 +* cell instance $4 r0 *1 7.8,0 +X$4 12 4 15 12 3 15 INVX1 +* cell instance $5 r0 *1 9.6,0 +X$5 12 5 15 12 4 15 INVX1 +* cell instance $6 r0 *1 11.4,0 +X$6 12 6 15 12 5 15 INVX1 +* cell instance $7 r0 *1 13.2,0 +X$7 12 7 15 12 6 15 INVX1 +* cell instance $8 r0 *1 15,0 +X$8 12 8 15 12 7 15 INVX1 +* cell instance $9 r0 *1 16.8,0 +X$9 12 9 15 12 8 15 INVX1 +* cell instance $10 r0 *1 18.6,0 +X$10 12 10 15 12 9 15 INVX1 +* cell instance $11 r0 *1 20.4,0 +X$11 12 11 15 12 10 15 INVX1 +* cell instance $12 r0 *1 22.2,0 +X$12 12 13 15 12 11 15 INVX1 +.ENDS RINGO + +* cell INVX1 +* pin VDD +* pin OUT +* pin VSS +* pin +* pin IN +* pin SUBSTRATE +.SUBCKT INVX1 1 2 3 4 5 6 +* net 1 VDD +* net 2 OUT +* net 3 VSS +* net 5 IN +* net 6 SUBSTRATE +* device instance $1 r0 *1 0.85,5.8 PMOS +M$1 1 5 2 4 PMOS L=0.5U W=3U AS=2.55P AD=2.55P PS=7.7U PD=7.7U +* device instance $2 r0 *1 0.85,2.135 NMOS +M$2 3 5 2 6 NMOS L=0.5U W=1.9U AS=1.615P AD=1.615P PS=5.5U PD=5.5U +.ENDS INVX1 + +* cell ND2X1 +* pin VDD +* pin OUT +* pin VSS +* pin +* pin B +* pin A +* pin SUBSTRATE +.SUBCKT ND2X1 1 2 3 4 5 6 7 +* net 1 VDD +* net 2 OUT +* net 3 VSS +* net 5 B +* net 6 A +* net 7 SUBSTRATE +* device instance $1 r0 *1 0.85,5.8 PMOS +M$1 2 6 1 4 PMOS L=0.5U W=3U AS=2.55P AD=1.35P PS=7.7U PD=3.9U +* device instance $2 r0 *1 1.55,5.8 PMOS +M$2 1 5 2 4 PMOS L=0.5U W=3U AS=1.35P AD=2.55P PS=3.9U PD=7.7U +* device instance $3 r0 *1 0.85,2.135 NMOS +M$3 3 6 8 7 NMOS L=0.5U W=1.9U AS=1.615P AD=0.855P PS=5.5U PD=2.8U +* device instance $4 r0 *1 1.55,2.135 NMOS +M$4 8 5 2 7 NMOS L=0.5U W=1.9U AS=0.855P AD=1.615P PS=2.8U PD=5.5U +.ENDS ND2X1 diff --git a/testdata/lvs/ringo_simple_device_scaling.lvs b/testdata/lvs/ringo_simple_device_scaling.lvs new file mode 100644 index 000000000..afb3caebb --- /dev/null +++ b/testdata/lvs/ringo_simple_device_scaling.lvs @@ -0,0 +1,76 @@ + +source($lvs_test_source, "RINGO") + +report_lvs($lvs_test_target_lvsdb, true) + +target_netlist($lvs_test_target_cir, write_spice, "Extracted by KLayout") + +schematic("ringo_scaled.cir") + +deep + +# Drawing layers + +nwell = input(1, 0) +active = input(2, 0) +pplus = input(3, 0) +nplus = input(4, 0) +poly = input(5, 0) +contact = input(8, 0) +metal1 = input(9, 0) +via1 = input(10, 0) +metal2 = input(11, 0) + +# Bulk layer for terminal provisioning + +bulk = polygon_layer + +# Computed layers + +active_in_nwell = active & nwell +pactive = active_in_nwell & pplus +pgate = pactive & poly +psd = pactive - pgate +ntie = active_in_nwell & nplus + +active_outside_nwell = active - nwell +nactive = active_outside_nwell & nplus +ngate = nactive & poly +nsd = nactive - ngate +ptie = active_outside_nwell & pplus + +# Device extraction + +device_scaling(2.0) + +# PMOS transistor device extraction +extract_devices(mos4("PMOS"), { "SD" => psd, "G" => pgate, "W" => nwell, + "tS" => psd, "tD" => psd, "tG" => poly, "tW" => nwell }) + +# NMOS transistor device extraction +extract_devices(mos4("NMOS"), { "SD" => nsd, "G" => ngate, "W" => bulk, + "tS" => nsd, "tD" => nsd, "tG" => poly, "tW" => bulk }) + +# Define connectivity for netlist extraction + +# Inter-layer +connect(psd, contact) +connect(nsd, contact) +connect(poly, contact) +connect(ntie, contact) +connect(nwell, ntie) +connect(ptie, contact) +connect(contact, metal1) +connect(metal1, via1) +connect(via1, metal2) + +# Global +connect_global(bulk, "SUBSTRATE") +connect_global(ptie, "SUBSTRATE") + +# Compare section + +netlist.simplify + +compare + diff --git a/testdata/lvs/ringo_simple_device_scaling.lvsdb.1 b/testdata/lvs/ringo_simple_device_scaling.lvsdb.1 new file mode 100644 index 000000000..d4ba4694d --- /dev/null +++ b/testdata/lvs/ringo_simple_device_scaling.lvsdb.1 @@ -0,0 +1,971 @@ +#%lvsdb-klayout + +# Layout +layout( + top(RINGO) + unit(0.001) + + # Layer section + # This section lists the mask layers (drawing or derived) and their connections. + + # Mask layers + layer(l3 '1/0') + layer(l4 '5/0') + layer(l8 '8/0') + layer(l11 '9/0') + layer(l12 '10/0') + layer(l13 '11/0') + layer(l7) + layer(l2) + layer(l9) + layer(l6) + layer(l10) + + # Mask layer connectivity + connect(l3 l3 l9) + connect(l4 l4 l8) + connect(l8 l4 l8 l11 l2 l9 l6 l10) + connect(l11 l8 l11 l12) + connect(l12 l11 l12 l13) + connect(l13 l12 l13) + connect(l7 l7) + connect(l2 l8 l2) + connect(l9 l3 l8 l9) + connect(l6 l8 l6) + connect(l10 l8 l10) + + # Global nets and connectivity + global(l7 SUBSTRATE) + global(l10 SUBSTRATE) + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Device abstracts section + # Device abstracts list the pin shapes of the devices. + device(D$PMOS PMOS + terminal(S + rect(l2 (-550 -750) (425 1500)) + ) + terminal(G + rect(l4 (-125 -750) (250 1500)) + ) + terminal(D + rect(l2 (125 -750) (450 1500)) + ) + terminal(B + rect(l3 (-125 -750) (250 1500)) + ) + ) + device(D$PMOS$1 PMOS + terminal(S + rect(l2 (-575 -750) (450 1500)) + ) + terminal(G + rect(l4 (-125 -750) (250 1500)) + ) + terminal(D + rect(l2 (125 -750) (425 1500)) + ) + terminal(B + rect(l3 (-125 -750) (250 1500)) + ) + ) + device(D$PMOS$2 PMOS + terminal(S + rect(l2 (-550 -750) (425 1500)) + ) + terminal(G + rect(l4 (-125 -750) (250 1500)) + ) + terminal(D + rect(l2 (125 -750) (425 1500)) + ) + terminal(B + rect(l3 (-125 -750) (250 1500)) + ) + ) + device(D$NMOS NMOS + terminal(S + rect(l6 (-550 -475) (425 950)) + ) + terminal(G + rect(l4 (-125 -475) (250 950)) + ) + terminal(D + rect(l6 (125 -475) (450 950)) + ) + terminal(B + rect(l7 (-125 -475) (250 950)) + ) + ) + device(D$NMOS$1 NMOS + terminal(S + rect(l6 (-575 -475) (450 950)) + ) + terminal(G + rect(l4 (-125 -475) (250 950)) + ) + terminal(D + rect(l6 (125 -475) (425 950)) + ) + terminal(B + rect(l7 (-125 -475) (250 950)) + ) + ) + device(D$NMOS$2 NMOS + terminal(S + rect(l6 (-550 -475) (425 950)) + ) + terminal(G + rect(l4 (-125 -475) (250 950)) + ) + terminal(D + rect(l6 (125 -475) (425 950)) + ) + terminal(B + rect(l7 (-125 -475) (250 950)) + ) + ) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(ND2X1 + + # Circuit boundary + rect((-100 400) (2600 7600)) + + # Nets with their geometries + net(1 name(VDD) + rect(l8 (1110 5160) (180 180)) + rect(l8 (-180 920) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l11 (-240 -790) (300 1700)) + rect(l11 (-1350 0) (2400 800)) + rect(l11 (-1151 -401) (2 2)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + ) + net(2 name(OUT) + rect(l8 (1810 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (-1580 3760) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (1220 920) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (-180 370) (180 180)) + polygon(l11 (-240 -4180) (0 1390) (490 0) (0 -300) (-190 0) (0 -1090)) + rect(l11 (-110 1390) (300 1400)) + polygon(l11 (-1890 0) (0 600) (300 0) (0 -300) (1590 0) (0 -300)) + rect(l11 (-141 -501) (2 2)) + rect(l11 (-1751 1099) (300 1400)) + rect(l11 (1100 -1700) (300 300)) + rect(l11 (-300 0) (300 1400)) + rect(l2 (-1750 -1450) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(3 name(VSS) + rect(l8 (410 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -1300) (300 1360)) + rect(l11 (-650 -2160) (2400 800)) + rect(l11 (-1151 -401) (2 2)) + rect(l6 (-951 859) (425 950)) + ) + net(4 + rect(l3 (-100 4500) (2600 3500)) + ) + net(5 name(B) + rect(l4 (1425 2860) (250 1940)) + rect(l4 (-345 -950) (300 300)) + rect(l4 (-205 650) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-250 -5390) (250 1450)) + rect(l8 (-285 1050) (180 180)) + rect(l11 (-71 -91) (2 2)) + rect(l11 (-171 -151) (300 300)) + ) + net(6 name(A) + rect(l4 (725 2860) (250 1940)) + rect(l4 (-325 -1850) (300 300)) + rect(l4 (-225 1550) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-250 -5390) (250 1450)) + rect(l8 (-265 150) (180 180)) + rect(l11 (-91 -91) (2 2)) + rect(l11 (-151 -151) (300 300)) + ) + net(7 name(SUBSTRATE)) + net(8 + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) + ) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4) + pin(5 name(B)) + pin(6 name(A)) + pin(7 name(SUBSTRATE)) + + # Devices and their connections + device(1 D$PMOS + location(850 5800) + param(L 0.5) + param(W 3) + param(AS 2.55) + param(AD 1.35) + param(PS 7.7) + param(PD 3.9) + terminal(S 2) + terminal(G 6) + terminal(D 1) + terminal(B 4) + ) + device(2 D$PMOS$1 + location(1550 5800) + param(L 0.5) + param(W 3) + param(AS 1.35) + param(AD 2.55) + param(PS 3.9) + param(PD 7.7) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(3 D$NMOS + location(850 2135) + param(L 0.5) + param(W 1.9) + param(AS 1.615) + param(AD 0.855) + param(PS 5.5) + param(PD 2.8) + terminal(S 3) + terminal(G 6) + terminal(D 8) + terminal(B 7) + ) + device(4 D$NMOS$1 + location(1550 2135) + param(L 0.5) + param(W 1.9) + param(AS 0.855) + param(AD 1.615) + param(PS 2.8) + param(PD 5.5) + terminal(S 8) + terminal(G 5) + terminal(D 2) + terminal(B 7) + ) + + ) + circuit(INVX1 + + # Circuit boundary + rect((-100 400) (2000 7600)) + + # Nets with their geometries + net(1 name(VDD) + rect(l8 (410 6260) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l11 (-240 -240) (300 1400)) + rect(l11 (-650 300) (1800 800)) + rect(l11 (-1450 -1100) (300 300)) + rect(l11 (299 399) (2 2)) + rect(l2 (-651 -2151) (425 1500)) + ) + net(2 name(OUT) + rect(l8 (1110 5160) (180 180)) + rect(l8 (-180 920) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -4120) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -790) (300 4790)) + rect(l11 (-151 -2501) (2 2)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(3 name(VSS) + rect(l8 (410 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -1300) (300 1360)) + rect(l11 (-650 -2160) (1800 800)) + rect(l11 (-851 -401) (2 2)) + rect(l6 (-651 859) (425 950)) + ) + net(4 + rect(l3 (-100 4500) (2000 3500)) + ) + net(5 name(IN) + rect(l4 (725 2860) (250 1940)) + rect(l4 (-525 -1850) (300 300)) + rect(l4 (-25 1550) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-250 -5390) (250 1450)) + rect(l8 (-465 150) (180 180)) + rect(l11 (-91 -91) (2 2)) + rect(l11 (-151 -151) (300 300)) + ) + net(6 name(SUBSTRATE)) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4) + pin(5 name(IN)) + pin(6 name(SUBSTRATE)) + + # Devices and their connections + device(1 D$PMOS$2 + location(850 5800) + param(L 0.5) + param(W 3) + param(AS 2.55) + param(AD 2.55) + param(PS 7.7) + param(PD 7.7) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(2 D$NMOS$2 + location(850 2135) + param(L 0.5) + param(W 1.9) + param(AS 1.615) + param(AD 1.615) + param(PS 5.5) + param(PD 5.5) + terminal(S 3) + terminal(G 5) + terminal(D 2) + terminal(B 6) + ) + + ) + circuit(RINGO + + # Circuit boundary + rect((0 350) (25800 7650)) + + # Nets with their geometries + net(1 + rect(l8 (4710 3010) (180 180)) + rect(l11 (-850 -240) (610 300)) + rect(l2 (-2550 1800) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(2 + rect(l8 (6510 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(3 + rect(l8 (8310 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(4 + rect(l8 (10110 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(5 + rect(l8 (11910 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(6 + rect(l8 (13710 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(7 + rect(l8 (15510 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(8 + rect(l8 (17310 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(9 + rect(l8 (19110 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(10 + rect(l8 (20910 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(11 name(FB) + rect(l8 (22710 3010) (180 180)) + rect(l8 (-19700 720) (180 180)) + rect(l11 (18380 -1140) (900 300)) + rect(l11 (-19530 590) (320 320)) + rect(l11 (17820 -320) (320 320)) + rect(l12 (-18400 -260) (200 200)) + rect(l12 (17940 -200) (200 200)) + rect(l13 (-18040 -300) (17740 400)) + rect(l13 (-17921 -201) (2 2)) + rect(l13 (-221 -201) (400 400)) + rect(l13 (17740 -400) (400 400)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(12 name(VDD) + rect(l3 (500 4500) (1400 3500)) + rect(l3 (-1900 -3500) (600 3500)) + rect(l3 (23300 -3500) (1400 3500)) + rect(l3 (-100 -3500) (600 3500)) + rect(l8 (-24690 -1240) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (23220 370) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l11 (-21741 859) (2 2)) + rect(l11 (-2351 -451) (1200 800)) + rect(l11 (-750 -1450) (300 1400)) + rect(l11 (-101 -351) (2 2)) + rect(l11 (-1251 -401) (600 800)) + rect(l11 (23400 -800) (1200 800)) + rect(l11 (-750 -1450) (300 1400)) + rect(l11 (-101 -351) (2 2)) + rect(l11 (549 -401) (600 800)) + rect(l2 (-23025 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l9 (-21975 -450) (500 1500)) + rect(l9 (22900 -1500) (500 1500)) + ) + net(13 name(OUT) + rect(l11 (23440 3840) (320 320)) + rect(l12 (-260 -260) (200 200)) + rect(l13 (-101 -101) (2 2)) + rect(l13 (-201 -201) (400 400)) + rect(l2 (-625 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(14 name(ENABLE) + rect(l8 (2510 3010) (180 180)) + rect(l11 (-250 -250) (320 320)) + rect(l12 (-260 -260) (200 200)) + rect(l13 (-101 -101) (2 2)) + rect(l13 (-201 -201) (400 400)) + ) + net(15 name(VSS) + rect(l8 (1110 1610) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (23220 370) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-21741 -391) (2 2)) + rect(l11 (-1901 -401) (300 1400)) + rect(l11 (-750 -1450) (1200 800)) + rect(l11 (-551 -401) (2 2)) + rect(l11 (-1251 -401) (600 800)) + rect(l11 (23850 -750) (300 1400)) + rect(l11 (-750 -1450) (1200 800)) + rect(l11 (-551 -401) (2 2)) + rect(l11 (549 -401) (600 800)) + rect(l6 (-23700 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l10 (-21975 -2210) (500 1500)) + rect(l10 (22900 -1500) (500 1500)) + ) + + # Outgoing pins and their connections to nets + pin(11 name(FB)) + pin(12 name(VDD)) + pin(13 name(OUT)) + pin(14 name(ENABLE)) + pin(15 name(VSS)) + + # Subcircuits and their connections + circuit(1 ND2X1 location(1800 0) + pin(0 12) + pin(1 1) + pin(2 15) + pin(3 12) + pin(4 11) + pin(5 14) + pin(6 15) + ) + circuit(2 INVX1 location(4200 0) + pin(0 12) + pin(1 2) + pin(2 15) + pin(3 12) + pin(4 1) + pin(5 15) + ) + circuit(3 INVX1 location(6000 0) + pin(0 12) + pin(1 3) + pin(2 15) + pin(3 12) + pin(4 2) + pin(5 15) + ) + circuit(4 INVX1 location(7800 0) + pin(0 12) + pin(1 4) + pin(2 15) + pin(3 12) + pin(4 3) + pin(5 15) + ) + circuit(5 INVX1 location(9600 0) + pin(0 12) + pin(1 5) + pin(2 15) + pin(3 12) + pin(4 4) + pin(5 15) + ) + circuit(6 INVX1 location(11400 0) + pin(0 12) + pin(1 6) + pin(2 15) + pin(3 12) + pin(4 5) + pin(5 15) + ) + circuit(7 INVX1 location(13200 0) + pin(0 12) + pin(1 7) + pin(2 15) + pin(3 12) + pin(4 6) + pin(5 15) + ) + circuit(8 INVX1 location(15000 0) + pin(0 12) + pin(1 8) + pin(2 15) + pin(3 12) + pin(4 7) + pin(5 15) + ) + circuit(9 INVX1 location(16800 0) + pin(0 12) + pin(1 9) + pin(2 15) + pin(3 12) + pin(4 8) + pin(5 15) + ) + circuit(10 INVX1 location(18600 0) + pin(0 12) + pin(1 10) + pin(2 15) + pin(3 12) + pin(4 9) + pin(5 15) + ) + circuit(11 INVX1 location(20400 0) + pin(0 12) + pin(1 11) + pin(2 15) + pin(3 12) + pin(4 10) + pin(5 15) + ) + circuit(12 INVX1 location(22200 0) + pin(0 12) + pin(1 13) + pin(2 15) + pin(3 12) + pin(4 11) + pin(5 15) + ) + + ) +) + +# Reference netlist +reference( + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(ND2X1 + + # Nets + net(1 name(VDD)) + net(2 name(OUT)) + net(3 name(VSS)) + net(4 name(NWELL)) + net(5 name(B)) + net(6 name(A)) + net(7 name(BULK)) + net(8 name('1')) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4 name(NWELL)) + pin(5 name(B)) + pin(6 name(A)) + pin(7 name(BULK)) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.5) + param(W 3) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 2) + terminal(G 6) + terminal(D 1) + terminal(B 4) + ) + device(2 PMOS + name($2) + param(L 0.5) + param(W 3) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(3 NMOS + name($3) + param(L 0.5) + param(W 1.9) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 3) + terminal(G 6) + terminal(D 8) + terminal(B 7) + ) + device(4 NMOS + name($4) + param(L 0.5) + param(W 1.9) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 8) + terminal(G 5) + terminal(D 2) + terminal(B 7) + ) + + ) + circuit(INVX1 + + # Nets + net(1 name(VDD)) + net(2 name(OUT)) + net(3 name(VSS)) + net(4 name(NWELL)) + net(5 name(IN)) + net(6 name(BULK)) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4 name(NWELL)) + pin(5 name(IN)) + pin(6 name(BULK)) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.5) + param(W 3) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(2 NMOS + name($2) + param(L 0.5) + param(W 1.9) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 3) + terminal(G 5) + terminal(D 2) + terminal(B 6) + ) + + ) + circuit(RINGO + + # Nets + net(1 name(VSS)) + net(2 name(VDD)) + net(3 name(FB)) + net(4 name(ENABLE)) + net(5 name(OUT)) + net(6 name('1')) + net(7 name('2')) + net(8 name('3')) + net(9 name('4')) + net(10 name('5')) + net(11 name('6')) + net(12 name('7')) + net(13 name('8')) + net(14 name('9')) + net(15 name('10')) + + # Outgoing pins and their connections to nets + pin(1 name(VSS)) + pin(2 name(VDD)) + pin(3 name(FB)) + pin(4 name(ENABLE)) + pin(5 name(OUT)) + + # Subcircuits and their connections + circuit(1 ND2X1 name($1) + pin(0 2) + pin(1 6) + pin(2 1) + pin(3 2) + pin(4 3) + pin(5 4) + pin(6 1) + ) + circuit(2 INVX1 name($2) + pin(0 2) + pin(1 7) + pin(2 1) + pin(3 2) + pin(4 6) + pin(5 1) + ) + circuit(3 INVX1 name($3) + pin(0 2) + pin(1 8) + pin(2 1) + pin(3 2) + pin(4 7) + pin(5 1) + ) + circuit(4 INVX1 name($4) + pin(0 2) + pin(1 9) + pin(2 1) + pin(3 2) + pin(4 8) + pin(5 1) + ) + circuit(5 INVX1 name($5) + pin(0 2) + pin(1 10) + pin(2 1) + pin(3 2) + pin(4 9) + pin(5 1) + ) + circuit(6 INVX1 name($6) + pin(0 2) + pin(1 11) + pin(2 1) + pin(3 2) + pin(4 10) + pin(5 1) + ) + circuit(7 INVX1 name($7) + pin(0 2) + pin(1 12) + pin(2 1) + pin(3 2) + pin(4 11) + pin(5 1) + ) + circuit(8 INVX1 name($8) + pin(0 2) + pin(1 13) + pin(2 1) + pin(3 2) + pin(4 12) + pin(5 1) + ) + circuit(9 INVX1 name($9) + pin(0 2) + pin(1 14) + pin(2 1) + pin(3 2) + pin(4 13) + pin(5 1) + ) + circuit(10 INVX1 name($10) + pin(0 2) + pin(1 15) + pin(2 1) + pin(3 2) + pin(4 14) + pin(5 1) + ) + circuit(11 INVX1 name($11) + pin(0 2) + pin(1 3) + pin(2 1) + pin(3 2) + pin(4 15) + pin(5 1) + ) + circuit(12 INVX1 name($12) + pin(0 2) + pin(1 5) + pin(2 1) + pin(3 2) + pin(4 3) + pin(5 1) + ) + + ) +) + +# Cross reference +xref( + circuit(INVX1 INVX1 match + xref( + net(4 4 match) + net(5 5 match) + net(2 2 match) + net(6 6 match) + net(1 1 match) + net(3 3 match) + pin(3 3 match) + pin(4 4 match) + pin(1 1 match) + pin(5 5 match) + pin(0 0 match) + pin(2 2 match) + device(2 2 match) + device(1 1 match) + ) + ) + circuit(ND2X1 ND2X1 match + xref( + net(8 8 match) + net(4 4 match) + net(6 6 match) + net(5 5 match) + net(2 2 match) + net(7 7 match) + net(1 1 match) + net(3 3 match) + pin(3 3 match) + pin(5 5 match) + pin(4 4 match) + pin(1 1 match) + pin(6 6 match) + pin(0 0 match) + pin(2 2 match) + device(3 3 match) + device(4 4 match) + device(1 1 match) + device(2 2 match) + ) + ) + circuit(RINGO RINGO match + xref( + net(1 6 match) + net(10 15 match) + net(2 7 match) + net(3 8 match) + net(4 9 match) + net(5 10 match) + net(6 11 match) + net(7 12 match) + net(8 13 match) + net(9 14 match) + net(14 4 match) + net(11 3 match) + net(13 5 match) + net(12 2 match) + net(15 1 match) + pin(3 3 match) + pin(0 2 match) + pin(2 4 match) + pin(1 1 match) + pin(4 0 match) + circuit(2 2 match) + circuit(3 3 match) + circuit(4 4 match) + circuit(5 5 match) + circuit(6 6 match) + circuit(7 7 match) + circuit(8 8 match) + circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) + ) + ) +) diff --git a/testdata/lvs/ringo_simple_device_scaling.lvsdb.2 b/testdata/lvs/ringo_simple_device_scaling.lvsdb.2 new file mode 100644 index 000000000..354c9386a --- /dev/null +++ b/testdata/lvs/ringo_simple_device_scaling.lvsdb.2 @@ -0,0 +1,971 @@ +#%lvsdb-klayout + +# Layout +layout( + top(RINGO) + unit(0.001) + + # Layer section + # This section lists the mask layers (drawing or derived) and their connections. + + # Mask layers + layer(l3 '1/0') + layer(l4 '5/0') + layer(l8 '8/0') + layer(l11 '9/0') + layer(l12 '10/0') + layer(l13 '11/0') + layer(l7) + layer(l2) + layer(l9) + layer(l6) + layer(l10) + + # Mask layer connectivity + connect(l3 l3 l9) + connect(l4 l4 l8) + connect(l8 l4 l8 l11 l2 l9 l6 l10) + connect(l11 l8 l11 l12) + connect(l12 l11 l12 l13) + connect(l13 l12 l13) + connect(l7 l7) + connect(l2 l8 l2) + connect(l9 l3 l8 l9) + connect(l6 l8 l6) + connect(l10 l8 l10) + + # Global nets and connectivity + global(l7 SUBSTRATE) + global(l10 SUBSTRATE) + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Device abstracts section + # Device abstracts list the pin shapes of the devices. + device(D$PMOS PMOS + terminal(S + rect(l2 (-550 -750) (425 1500)) + ) + terminal(G + rect(l4 (-125 -750) (250 1500)) + ) + terminal(D + rect(l2 (125 -750) (450 1500)) + ) + terminal(B + rect(l3 (-125 -750) (250 1500)) + ) + ) + device(D$PMOS$1 PMOS + terminal(S + rect(l2 (-575 -750) (450 1500)) + ) + terminal(G + rect(l4 (-125 -750) (250 1500)) + ) + terminal(D + rect(l2 (125 -750) (425 1500)) + ) + terminal(B + rect(l3 (-125 -750) (250 1500)) + ) + ) + device(D$PMOS$2 PMOS + terminal(S + rect(l2 (-550 -750) (425 1500)) + ) + terminal(G + rect(l4 (-125 -750) (250 1500)) + ) + terminal(D + rect(l2 (125 -750) (425 1500)) + ) + terminal(B + rect(l3 (-125 -750) (250 1500)) + ) + ) + device(D$NMOS NMOS + terminal(S + rect(l6 (-550 -475) (425 950)) + ) + terminal(G + rect(l4 (-125 -475) (250 950)) + ) + terminal(D + rect(l6 (125 -475) (450 950)) + ) + terminal(B + rect(l7 (-125 -475) (250 950)) + ) + ) + device(D$NMOS$1 NMOS + terminal(S + rect(l6 (-575 -475) (450 950)) + ) + terminal(G + rect(l4 (-125 -475) (250 950)) + ) + terminal(D + rect(l6 (125 -475) (425 950)) + ) + terminal(B + rect(l7 (-125 -475) (250 950)) + ) + ) + device(D$NMOS$2 NMOS + terminal(S + rect(l6 (-550 -475) (425 950)) + ) + terminal(G + rect(l4 (-125 -475) (250 950)) + ) + terminal(D + rect(l6 (125 -475) (425 950)) + ) + terminal(B + rect(l7 (-125 -475) (250 950)) + ) + ) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(ND2X1 + + # Circuit boundary + rect((-100 400) (2600 7600)) + + # Nets with their geometries + net(1 name(VDD) + rect(l8 (1110 5160) (180 180)) + rect(l8 (-180 920) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l11 (-240 -790) (300 1700)) + rect(l11 (-1350 0) (2400 800)) + rect(l11 (-1151 -401) (2 2)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + ) + net(2 name(OUT) + rect(l8 (1810 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (-1580 3760) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (1220 920) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (-180 370) (180 180)) + polygon(l11 (-240 -4180) (0 1390) (490 0) (0 -300) (-190 0) (0 -1090)) + rect(l11 (-110 1390) (300 1400)) + polygon(l11 (-1890 0) (0 600) (300 0) (0 -300) (1590 0) (0 -300)) + rect(l11 (-141 -501) (2 2)) + rect(l11 (-1751 1099) (300 1400)) + rect(l11 (1100 -1700) (300 300)) + rect(l11 (-300 0) (300 1400)) + rect(l2 (-375 -1450) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) + ) + net(3 name(VSS) + rect(l8 (410 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -1300) (300 1360)) + rect(l11 (-650 -2160) (2400 800)) + rect(l11 (-1151 -401) (2 2)) + rect(l6 (-951 859) (425 950)) + ) + net(4 + rect(l3 (-100 4500) (2600 3500)) + ) + net(5 name(B) + rect(l4 (1425 2860) (250 1940)) + rect(l4 (-345 -950) (300 300)) + rect(l4 (-205 650) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-250 -5390) (250 1450)) + rect(l8 (-285 1050) (180 180)) + rect(l11 (-71 -91) (2 2)) + rect(l11 (-171 -151) (300 300)) + ) + net(6 name(A) + rect(l4 (725 2860) (250 1940)) + rect(l4 (-325 -1850) (300 300)) + rect(l4 (-225 1550) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-250 -5390) (250 1450)) + rect(l8 (-265 150) (180 180)) + rect(l11 (-91 -91) (2 2)) + rect(l11 (-151 -151) (300 300)) + ) + net(7 name(SUBSTRATE)) + net(8 + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) + ) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4) + pin(5 name(B)) + pin(6 name(A)) + pin(7 name(SUBSTRATE)) + + # Devices and their connections + device(1 D$PMOS + location(850 5800) + param(L 0.5) + param(W 3) + param(AS 2.55) + param(AD 1.35) + param(PS 7.7) + param(PD 3.9) + terminal(S 2) + terminal(G 6) + terminal(D 1) + terminal(B 4) + ) + device(2 D$PMOS$1 + location(1550 5800) + param(L 0.5) + param(W 3) + param(AS 1.35) + param(AD 2.55) + param(PS 3.9) + param(PD 7.7) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(3 D$NMOS + location(850 2135) + param(L 0.5) + param(W 1.9) + param(AS 1.615) + param(AD 0.855) + param(PS 5.5) + param(PD 2.8) + terminal(S 3) + terminal(G 6) + terminal(D 8) + terminal(B 7) + ) + device(4 D$NMOS$1 + location(1550 2135) + param(L 0.5) + param(W 1.9) + param(AS 0.855) + param(AD 1.615) + param(PS 2.8) + param(PD 5.5) + terminal(S 8) + terminal(G 5) + terminal(D 2) + terminal(B 7) + ) + + ) + circuit(INVX1 + + # Circuit boundary + rect((-100 400) (2000 7600)) + + # Nets with their geometries + net(1 name(VDD) + rect(l8 (410 6260) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l11 (-240 -240) (300 1400)) + rect(l11 (-650 300) (1800 800)) + rect(l11 (-1450 -1100) (300 300)) + rect(l11 (299 399) (2 2)) + rect(l2 (-651 -2151) (425 1500)) + ) + net(2 name(OUT) + rect(l8 (1110 5160) (180 180)) + rect(l8 (-180 920) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -4120) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -790) (300 4790)) + rect(l11 (-151 -2501) (2 2)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(3 name(VSS) + rect(l8 (410 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -1300) (300 1360)) + rect(l11 (-650 -2160) (1800 800)) + rect(l11 (-851 -401) (2 2)) + rect(l6 (-651 859) (425 950)) + ) + net(4 + rect(l3 (-100 4500) (2000 3500)) + ) + net(5 name(IN) + rect(l4 (725 2860) (250 1940)) + rect(l4 (-525 -1850) (300 300)) + rect(l4 (-25 1550) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-250 -5390) (250 1450)) + rect(l8 (-465 150) (180 180)) + rect(l11 (-91 -91) (2 2)) + rect(l11 (-151 -151) (300 300)) + ) + net(6 name(SUBSTRATE)) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4) + pin(5 name(IN)) + pin(6 name(SUBSTRATE)) + + # Devices and their connections + device(1 D$PMOS$2 + location(850 5800) + param(L 0.5) + param(W 3) + param(AS 2.55) + param(AD 2.55) + param(PS 7.7) + param(PD 7.7) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(2 D$NMOS$2 + location(850 2135) + param(L 0.5) + param(W 1.9) + param(AS 1.615) + param(AD 1.615) + param(PS 5.5) + param(PD 5.5) + terminal(S 3) + terminal(G 5) + terminal(D 2) + terminal(B 6) + ) + + ) + circuit(RINGO + + # Circuit boundary + rect((0 350) (25800 7650)) + + # Nets with their geometries + net(1 + rect(l8 (4710 3010) (180 180)) + rect(l11 (-850 -240) (610 300)) + rect(l2 (-1175 1800) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) + ) + net(2 + rect(l8 (6510 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(3 + rect(l8 (8310 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(4 + rect(l8 (10110 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(5 + rect(l8 (11910 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(6 + rect(l8 (13710 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(7 + rect(l8 (15510 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(8 + rect(l8 (17310 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(9 + rect(l8 (19110 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(10 + rect(l8 (20910 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(11 name(FB) + rect(l8 (22710 3010) (180 180)) + rect(l8 (-19700 720) (180 180)) + rect(l11 (18380 -1140) (900 300)) + rect(l11 (-19530 590) (320 320)) + rect(l11 (17820 -320) (320 320)) + rect(l12 (-18400 -260) (200 200)) + rect(l12 (17940 -200) (200 200)) + rect(l13 (-18040 -300) (17740 400)) + rect(l13 (-17921 -201) (2 2)) + rect(l13 (-221 -201) (400 400)) + rect(l13 (17740 -400) (400 400)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(12 name(VDD) + rect(l3 (500 4500) (1400 3500)) + rect(l3 (-1900 -3500) (600 3500)) + rect(l3 (23300 -3500) (1400 3500)) + rect(l3 (-100 -3500) (600 3500)) + rect(l8 (-24690 -1240) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (23220 370) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l11 (-21741 859) (2 2)) + rect(l11 (-2351 -451) (1200 800)) + rect(l11 (-750 -1450) (300 1400)) + rect(l11 (-101 -351) (2 2)) + rect(l11 (-1251 -401) (600 800)) + rect(l11 (23400 -800) (1200 800)) + rect(l11 (-750 -1450) (300 1400)) + rect(l11 (-101 -351) (2 2)) + rect(l11 (549 -401) (600 800)) + rect(l2 (-23025 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l9 (-21975 -450) (500 1500)) + rect(l9 (22900 -1500) (500 1500)) + ) + net(13 name(OUT) + rect(l11 (23440 3840) (320 320)) + rect(l12 (-260 -260) (200 200)) + rect(l13 (-101 -101) (2 2)) + rect(l13 (-201 -201) (400 400)) + rect(l2 (-625 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(14 name(ENABLE) + rect(l8 (2510 3010) (180 180)) + rect(l11 (-250 -250) (320 320)) + rect(l12 (-260 -260) (200 200)) + rect(l13 (-101 -101) (2 2)) + rect(l13 (-201 -201) (400 400)) + ) + net(15 name(VSS) + rect(l8 (1110 1610) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (23220 370) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-21741 -391) (2 2)) + rect(l11 (-1901 -401) (300 1400)) + rect(l11 (-750 -1450) (1200 800)) + rect(l11 (-551 -401) (2 2)) + rect(l11 (-1251 -401) (600 800)) + rect(l11 (23850 -750) (300 1400)) + rect(l11 (-750 -1450) (1200 800)) + rect(l11 (-551 -401) (2 2)) + rect(l11 (549 -401) (600 800)) + rect(l6 (-23700 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l10 (-21975 -2210) (500 1500)) + rect(l10 (22900 -1500) (500 1500)) + ) + + # Outgoing pins and their connections to nets + pin(11 name(FB)) + pin(12 name(VDD)) + pin(13 name(OUT)) + pin(14 name(ENABLE)) + pin(15 name(VSS)) + + # Subcircuits and their connections + circuit(1 ND2X1 location(1800 0) + pin(0 12) + pin(1 1) + pin(2 15) + pin(3 12) + pin(4 11) + pin(5 14) + pin(6 15) + ) + circuit(2 INVX1 location(4200 0) + pin(0 12) + pin(1 2) + pin(2 15) + pin(3 12) + pin(4 1) + pin(5 15) + ) + circuit(3 INVX1 location(6000 0) + pin(0 12) + pin(1 3) + pin(2 15) + pin(3 12) + pin(4 2) + pin(5 15) + ) + circuit(4 INVX1 location(7800 0) + pin(0 12) + pin(1 4) + pin(2 15) + pin(3 12) + pin(4 3) + pin(5 15) + ) + circuit(5 INVX1 location(9600 0) + pin(0 12) + pin(1 5) + pin(2 15) + pin(3 12) + pin(4 4) + pin(5 15) + ) + circuit(6 INVX1 location(11400 0) + pin(0 12) + pin(1 6) + pin(2 15) + pin(3 12) + pin(4 5) + pin(5 15) + ) + circuit(7 INVX1 location(13200 0) + pin(0 12) + pin(1 7) + pin(2 15) + pin(3 12) + pin(4 6) + pin(5 15) + ) + circuit(8 INVX1 location(15000 0) + pin(0 12) + pin(1 8) + pin(2 15) + pin(3 12) + pin(4 7) + pin(5 15) + ) + circuit(9 INVX1 location(16800 0) + pin(0 12) + pin(1 9) + pin(2 15) + pin(3 12) + pin(4 8) + pin(5 15) + ) + circuit(10 INVX1 location(18600 0) + pin(0 12) + pin(1 10) + pin(2 15) + pin(3 12) + pin(4 9) + pin(5 15) + ) + circuit(11 INVX1 location(20400 0) + pin(0 12) + pin(1 11) + pin(2 15) + pin(3 12) + pin(4 10) + pin(5 15) + ) + circuit(12 INVX1 location(22200 0) + pin(0 12) + pin(1 13) + pin(2 15) + pin(3 12) + pin(4 11) + pin(5 15) + ) + + ) +) + +# Reference netlist +reference( + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(ND2X1 + + # Nets + net(1 name(VDD)) + net(2 name(OUT)) + net(3 name(VSS)) + net(4 name(NWELL)) + net(5 name(B)) + net(6 name(A)) + net(7 name(BULK)) + net(8 name('1')) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4 name(NWELL)) + pin(5 name(B)) + pin(6 name(A)) + pin(7 name(BULK)) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.5) + param(W 3) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 2) + terminal(G 6) + terminal(D 1) + terminal(B 4) + ) + device(2 PMOS + name($2) + param(L 0.5) + param(W 3) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(3 NMOS + name($3) + param(L 0.5) + param(W 1.9) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 3) + terminal(G 6) + terminal(D 8) + terminal(B 7) + ) + device(4 NMOS + name($4) + param(L 0.5) + param(W 1.9) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 8) + terminal(G 5) + terminal(D 2) + terminal(B 7) + ) + + ) + circuit(INVX1 + + # Nets + net(1 name(VDD)) + net(2 name(OUT)) + net(3 name(VSS)) + net(4 name(NWELL)) + net(5 name(IN)) + net(6 name(BULK)) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4 name(NWELL)) + pin(5 name(IN)) + pin(6 name(BULK)) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.5) + param(W 3) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(2 NMOS + name($2) + param(L 0.5) + param(W 1.9) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 3) + terminal(G 5) + terminal(D 2) + terminal(B 6) + ) + + ) + circuit(RINGO + + # Nets + net(1 name(VSS)) + net(2 name(VDD)) + net(3 name(FB)) + net(4 name(ENABLE)) + net(5 name(OUT)) + net(6 name('1')) + net(7 name('2')) + net(8 name('3')) + net(9 name('4')) + net(10 name('5')) + net(11 name('6')) + net(12 name('7')) + net(13 name('8')) + net(14 name('9')) + net(15 name('10')) + + # Outgoing pins and their connections to nets + pin(1 name(VSS)) + pin(2 name(VDD)) + pin(3 name(FB)) + pin(4 name(ENABLE)) + pin(5 name(OUT)) + + # Subcircuits and their connections + circuit(1 ND2X1 name($1) + pin(0 2) + pin(1 6) + pin(2 1) + pin(3 2) + pin(4 3) + pin(5 4) + pin(6 1) + ) + circuit(2 INVX1 name($2) + pin(0 2) + pin(1 7) + pin(2 1) + pin(3 2) + pin(4 6) + pin(5 1) + ) + circuit(3 INVX1 name($3) + pin(0 2) + pin(1 8) + pin(2 1) + pin(3 2) + pin(4 7) + pin(5 1) + ) + circuit(4 INVX1 name($4) + pin(0 2) + pin(1 9) + pin(2 1) + pin(3 2) + pin(4 8) + pin(5 1) + ) + circuit(5 INVX1 name($5) + pin(0 2) + pin(1 10) + pin(2 1) + pin(3 2) + pin(4 9) + pin(5 1) + ) + circuit(6 INVX1 name($6) + pin(0 2) + pin(1 11) + pin(2 1) + pin(3 2) + pin(4 10) + pin(5 1) + ) + circuit(7 INVX1 name($7) + pin(0 2) + pin(1 12) + pin(2 1) + pin(3 2) + pin(4 11) + pin(5 1) + ) + circuit(8 INVX1 name($8) + pin(0 2) + pin(1 13) + pin(2 1) + pin(3 2) + pin(4 12) + pin(5 1) + ) + circuit(9 INVX1 name($9) + pin(0 2) + pin(1 14) + pin(2 1) + pin(3 2) + pin(4 13) + pin(5 1) + ) + circuit(10 INVX1 name($10) + pin(0 2) + pin(1 15) + pin(2 1) + pin(3 2) + pin(4 14) + pin(5 1) + ) + circuit(11 INVX1 name($11) + pin(0 2) + pin(1 3) + pin(2 1) + pin(3 2) + pin(4 15) + pin(5 1) + ) + circuit(12 INVX1 name($12) + pin(0 2) + pin(1 5) + pin(2 1) + pin(3 2) + pin(4 3) + pin(5 1) + ) + + ) +) + +# Cross reference +xref( + circuit(INVX1 INVX1 match + xref( + net(4 4 match) + net(5 5 match) + net(2 2 match) + net(6 6 match) + net(1 1 match) + net(3 3 match) + pin(3 3 match) + pin(4 4 match) + pin(1 1 match) + pin(5 5 match) + pin(0 0 match) + pin(2 2 match) + device(2 2 match) + device(1 1 match) + ) + ) + circuit(ND2X1 ND2X1 match + xref( + net(8 8 match) + net(4 4 match) + net(6 6 match) + net(5 5 match) + net(2 2 match) + net(7 7 match) + net(1 1 match) + net(3 3 match) + pin(3 3 match) + pin(5 5 match) + pin(4 4 match) + pin(1 1 match) + pin(6 6 match) + pin(0 0 match) + pin(2 2 match) + device(3 3 match) + device(4 4 match) + device(1 1 match) + device(2 2 match) + ) + ) + circuit(RINGO RINGO match + xref( + net(1 6 match) + net(10 15 match) + net(2 7 match) + net(3 8 match) + net(4 9 match) + net(5 10 match) + net(6 11 match) + net(7 12 match) + net(8 13 match) + net(9 14 match) + net(14 4 match) + net(11 3 match) + net(13 5 match) + net(12 2 match) + net(15 1 match) + pin(3 3 match) + pin(0 2 match) + pin(2 4 match) + pin(1 1 match) + pin(4 0 match) + circuit(2 2 match) + circuit(3 3 match) + circuit(4 4 match) + circuit(5 5 match) + circuit(6 6 match) + circuit(7 7 match) + circuit(8 8 match) + circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) + ) + ) +) diff --git a/testdata/lvs/ringo_simple_implicit_connections.lvsdb.1 b/testdata/lvs/ringo_simple_implicit_connections.lvsdb.1 index 8fc6d3364..2760c734e 100644 --- a/testdata/lvs/ringo_simple_implicit_connections.lvsdb.1 +++ b/testdata/lvs/ringo_simple_implicit_connections.lvsdb.1 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PMOS PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PMOS$1 PMOS terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PMOS$2 PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NMOS NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NMOS$1 NMOS terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NMOS$2 NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-1750 -1450) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1750 -1450) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -364,63 +364,63 @@ layout( net(1 rect(l8 (5210 3010) (180 180)) rect(l11 (-1350 -240) (1160 300)) - rect(l1 (-3100 1800) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-3100 1800) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(2 rect(l8 (7010 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (8810 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (10610 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 rect(l8 (12410 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 rect(l8 (14210 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(7 rect(l8 (16010 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(8 rect(l8 (17810 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(9 rect(l8 (19610 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(10 rect(l8 (21410 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 name(FB) rect(l8 (25210 3010) (180 180)) @@ -434,8 +434,8 @@ layout( rect(l13 (-19071 -201) (2 2)) rect(l13 (-171 -201) (400 400)) rect(l13 (18490 -400) (400 400)) - rect(l1 (-545 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-545 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(12 name(VDD) rect(l3 (22600 4500) (1400 3500)) @@ -466,19 +466,19 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23300 -2550) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (-18850 -1500) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (21775 -1500) (425 1500)) + rect(l2 (-23300 -2550) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (-18850 -1500) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (21775 -1500) (425 1500)) rect(l9 (-2375 -450) (500 1500)) rect(l9 (-22600 -1500) (500 1500)) rect(l9 (25400 -1500) (500 1500)) @@ -488,8 +488,8 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-151 -101) (2 2)) rect(l13 (-151 -201) (400 400)) - rect(l1 (-675 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-675 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(14 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -522,18 +522,18 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (-1251 -401) (600 800)) - rect(l5 (24400 460) (425 950)) - rect(l5 (-20425 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (-19525 -950) (425 950)) + rect(l6 (24400 460) (425 950)) + rect(l6 (-20425 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (-19525 -950) (425 950)) rect(l10 (24325 -2210) (500 1500)) rect(l10 (-4300 -1500) (500 1500)) rect(l10 (-22600 -1500) (500 1500)) @@ -924,8 +924,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(ND2X1 ND2X1 match @@ -945,10 +945,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(RINGO RINGO match @@ -973,10 +973,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(10 10 match) - circuit(11 11 match) - circuit(12 12 match) circuit(2 2 match) circuit(3 3 match) circuit(4 4 match) @@ -985,6 +981,10 @@ xref( circuit(7 7 match) circuit(8 8 match) circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_implicit_connections.lvsdb.2 b/testdata/lvs/ringo_simple_implicit_connections.lvsdb.2 index 03e96d090..4a0b7e13e 100644 --- a/testdata/lvs/ringo_simple_implicit_connections.lvsdb.2 +++ b/testdata/lvs/ringo_simple_implicit_connections.lvsdb.2 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PMOS PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PMOS$1 PMOS terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PMOS$2 PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NMOS NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NMOS$1 NMOS terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NMOS$2 NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-375 -1450) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-375 -1450) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -364,63 +364,63 @@ layout( net(1 rect(l8 (5210 3010) (180 180)) rect(l11 (-1350 -240) (1160 300)) - rect(l1 (-1725 1800) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-1725 1800) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(2 rect(l8 (7010 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (8810 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (10610 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 rect(l8 (12410 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 rect(l8 (14210 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(7 rect(l8 (16010 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(8 rect(l8 (17810 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(9 rect(l8 (19610 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(10 rect(l8 (21410 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 name(FB) rect(l8 (25210 3010) (180 180)) @@ -434,8 +434,8 @@ layout( rect(l13 (-19071 -201) (2 2)) rect(l13 (-171 -201) (400 400)) rect(l13 (18490 -400) (400 400)) - rect(l1 (-545 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-545 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(12 name(VDD) rect(l3 (22600 4500) (1400 3500)) @@ -466,19 +466,19 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23300 -2550) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (-18850 -1500) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (21775 -1500) (425 1500)) + rect(l2 (-23300 -2550) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (-18850 -1500) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (21775 -1500) (425 1500)) rect(l9 (-2375 -450) (500 1500)) rect(l9 (-22600 -1500) (500 1500)) rect(l9 (25400 -1500) (500 1500)) @@ -488,8 +488,8 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-151 -101) (2 2)) rect(l13 (-151 -201) (400 400)) - rect(l1 (-675 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-675 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(14 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -522,18 +522,18 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (-1251 -401) (600 800)) - rect(l5 (24400 460) (425 950)) - rect(l5 (-20425 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (-19525 -950) (425 950)) + rect(l6 (24400 460) (425 950)) + rect(l6 (-20425 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (-19525 -950) (425 950)) rect(l10 (24325 -2210) (500 1500)) rect(l10 (-4300 -1500) (500 1500)) rect(l10 (-22600 -1500) (500 1500)) @@ -924,8 +924,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(ND2X1 ND2X1 match @@ -945,10 +945,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(RINGO RINGO match @@ -973,10 +973,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(10 10 match) - circuit(11 11 match) - circuit(12 12 match) circuit(2 2 match) circuit(3 3 match) circuit(4 4 match) @@ -985,6 +981,10 @@ xref( circuit(7 7 match) circuit(8 8 match) circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_io.lvsdb.1 b/testdata/lvs/ringo_simple_io.lvsdb.1 index bff5f1a20..edb8e90ce 100644 --- a/testdata/lvs/ringo_simple_io.lvsdb.1 +++ b/testdata/lvs/ringo_simple_io.lvsdb.1 @@ -9,32 +9,32 @@ J( L(l12 '10/0') L(l13 '11/0') L(l7) - L(l1) + L(l2) L(l9) - L(l5) + L(l6) L(l10) C(l3 l3 l9) C(l4 l4 l8) - C(l8 l4 l8 l11 l1 l9 l5 l10) + C(l8 l4 l8 l11 l2 l9 l6 l10) C(l11 l8 l11 l12) C(l12 l11 l12 l13) C(l13 l12 l13) C(l7 l7) - C(l1 l8 l1) + C(l2 l8 l2) C(l9 l3 l8 l9) - C(l5 l8 l5) + C(l6 l8 l6) C(l10 l8 l10) G(l7 SUBSTRATE) G(l10 SUBSTRATE) D(D$PMOS PMOS T(S - R(l1 (-550 -750) (425 1500)) + R(l2 (-550 -750) (425 1500)) ) T(G R(l4 (-125 -750) (250 1500)) ) T(D - R(l1 (125 -750) (450 1500)) + R(l2 (125 -750) (450 1500)) ) T(B R(l3 (-125 -750) (250 1500)) @@ -42,13 +42,13 @@ J( ) D(D$PMOS$1 PMOS T(S - R(l1 (-575 -750) (450 1500)) + R(l2 (-575 -750) (450 1500)) ) T(G R(l4 (-125 -750) (250 1500)) ) T(D - R(l1 (125 -750) (425 1500)) + R(l2 (125 -750) (425 1500)) ) T(B R(l3 (-125 -750) (250 1500)) @@ -56,13 +56,13 @@ J( ) D(D$PMOS$2 PMOS T(S - R(l1 (-550 -750) (425 1500)) + R(l2 (-550 -750) (425 1500)) ) T(G R(l4 (-125 -750) (250 1500)) ) T(D - R(l1 (125 -750) (425 1500)) + R(l2 (125 -750) (425 1500)) ) T(B R(l3 (-125 -750) (250 1500)) @@ -70,13 +70,13 @@ J( ) D(D$NMOS NMOS T(S - R(l5 (-550 -475) (425 950)) + R(l6 (-550 -475) (425 950)) ) T(G R(l4 (-125 -475) (250 950)) ) T(D - R(l5 (125 -475) (450 950)) + R(l6 (125 -475) (450 950)) ) T(B R(l7 (-125 -475) (250 950)) @@ -84,13 +84,13 @@ J( ) D(D$NMOS$1 NMOS T(S - R(l5 (-575 -475) (450 950)) + R(l6 (-575 -475) (450 950)) ) T(G R(l4 (-125 -475) (250 950)) ) T(D - R(l5 (125 -475) (425 950)) + R(l6 (125 -475) (425 950)) ) T(B R(l7 (-125 -475) (250 950)) @@ -98,13 +98,13 @@ J( ) D(D$NMOS$2 NMOS T(S - R(l5 (-550 -475) (425 950)) + R(l6 (-550 -475) (425 950)) ) T(G R(l4 (-125 -475) (250 950)) ) T(D - R(l5 (125 -475) (425 950)) + R(l6 (125 -475) (425 950)) ) T(B R(l7 (-125 -475) (250 950)) @@ -119,8 +119,8 @@ J( R(l11 (-240 -790) (300 1700)) R(l11 (-1350 0) (2400 800)) R(l11 (-1151 -401) (2 2)) - R(l1 (-276 -2151) (425 1500)) - R(l1 (-400 -1500) (425 1500)) + R(l2 (-276 -2151) (425 1500)) + R(l2 (-400 -1500) (425 1500)) ) N(2 I(OUT) R(l8 (1810 1770) (180 180)) @@ -138,9 +138,9 @@ J( R(l11 (-1751 1099) (300 1400)) R(l11 (1100 -1700) (300 300)) R(l11 (-300 0) (300 1400)) - R(l1 (-1750 -1450) (425 1500)) - R(l1 (950 -1500) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1750 -1450) (425 1500)) + R(l2 (950 -1500) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(3 I(VSS) R(l8 (410 1770) (180 180)) @@ -148,7 +148,7 @@ J( R(l11 (-240 -1300) (300 1360)) R(l11 (-650 -2160) (2400 800)) R(l11 (-1151 -401) (2 2)) - R(l5 (-951 859) (425 950)) + R(l6 (-951 859) (425 950)) ) N(4 R(l3 (-100 4500) (2600 3500)) @@ -175,8 +175,8 @@ J( ) N(7 I(SUBSTRATE)) N(8 - R(l5 (975 1660) (425 950)) - R(l5 (-400 -950) (425 950)) + R(l6 (975 1660) (425 950)) + R(l6 (-400 -950) (425 950)) ) P(1 I(VDD)) P(2 I(OUT)) @@ -248,7 +248,7 @@ J( R(l11 (-650 300) (1800 800)) R(l11 (-1450 -1100) (300 300)) R(l11 (299 399) (2 2)) - R(l1 (-651 -2151) (425 1500)) + R(l2 (-651 -2151) (425 1500)) ) N(2 I(OUT) R(l8 (1110 5160) (180 180)) @@ -258,8 +258,8 @@ J( R(l8 (-180 370) (180 180)) R(l11 (-240 -790) (300 4790)) R(l11 (-151 -2501) (2 2)) - R(l1 (-226 1049) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-226 1049) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(3 I(VSS) R(l8 (410 1770) (180 180)) @@ -267,7 +267,7 @@ J( R(l11 (-240 -1300) (300 1360)) R(l11 (-650 -2160) (1800 800)) R(l11 (-851 -401) (2 2)) - R(l5 (-651 859) (425 950)) + R(l6 (-651 859) (425 950)) ) N(4 R(l3 (-100 4500) (2000 3500)) @@ -321,63 +321,63 @@ J( N(1 R(l8 (4710 3010) (180 180)) R(l11 (-850 -240) (610 300)) - R(l1 (-2550 1800) (425 1500)) - R(l1 (950 -1500) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-2550 1800) (425 1500)) + R(l2 (950 -1500) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(2 R(l8 (6510 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(3 R(l8 (8310 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(4 R(l8 (10110 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(5 R(l8 (11910 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(6 R(l8 (13710 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(7 R(l8 (15510 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(8 R(l8 (17310 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(9 R(l8 (19110 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(10 R(l8 (20910 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(11 I(FB) R(l8 (22710 3010) (180 180)) @@ -391,8 +391,8 @@ J( R(l13 (-17921 -201) (2 2)) R(l13 (-221 -201) (400 400)) R(l13 (17740 -400) (400 400)) - R(l1 (-245 850) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-245 850) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(12 I(VDD) R(l3 (500 4500) (1400 3500)) @@ -414,19 +414,19 @@ J( R(l11 (-750 -1450) (300 1400)) R(l11 (-101 -351) (2 2)) R(l11 (549 -401) (600 800)) - R(l1 (-23025 -2550) (425 1500)) - R(l1 (-400 -1500) (425 1500)) - R(l1 (1275 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) + R(l2 (-23025 -2550) (425 1500)) + R(l2 (-400 -1500) (425 1500)) + R(l2 (1275 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) R(l9 (-21975 -450) (500 1500)) R(l9 (22900 -1500) (500 1500)) ) @@ -435,8 +435,8 @@ J( R(l12 (-260 -260) (200 200)) R(l13 (-101 -101) (2 2)) R(l13 (-201 -201) (400 400)) - R(l1 (-625 850) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-625 850) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(14 I(ENABLE) R(l8 (2510 3010) (180 180)) @@ -461,18 +461,18 @@ J( R(l11 (-750 -1450) (1200 800)) R(l11 (-551 -401) (2 2)) R(l11 (549 -401) (600 800)) - R(l5 (-23700 460) (425 950)) - R(l5 (1975 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) + R(l6 (-23700 460) (425 950)) + R(l6 (1975 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) R(l10 (-21975 -2210) (500 1500)) R(l10 (22900 -1500) (500 1500)) ) @@ -825,8 +825,8 @@ Z( P(5 5 1) P(0 0 1) P(2 2 1) - D(1 1 1) D(2 2 1) + D(1 1 1) ) ) X(ND2X1 ND2X1 1 @@ -846,10 +846,10 @@ Z( P(6 6 1) P(0 0 1) P(2 2 1) - D(1 1 1) - D(2 2 1) D(3 3 1) D(4 4 1) + D(1 1 1) + D(2 2 1) ) ) X(RINGO RINGO 1 @@ -874,10 +874,6 @@ Z( P(2 4 1) P(1 1 1) P(4 0 1) - X(1 1 1) - X(10 10 1) - X(11 11 1) - X(12 12 1) X(2 2 1) X(3 3 1) X(4 4 1) @@ -886,6 +882,10 @@ Z( X(7 7 1) X(8 8 1) X(9 9 1) + X(10 10 1) + X(11 11 1) + X(12 12 1) + X(1 1 1) ) ) ) diff --git a/testdata/lvs/ringo_simple_io.lvsdb.2 b/testdata/lvs/ringo_simple_io.lvsdb.2 index 64c35b1c6..1db7e627a 100644 --- a/testdata/lvs/ringo_simple_io.lvsdb.2 +++ b/testdata/lvs/ringo_simple_io.lvsdb.2 @@ -9,32 +9,32 @@ J( L(l12 '10/0') L(l13 '11/0') L(l7) - L(l1) + L(l2) L(l9) - L(l5) + L(l6) L(l10) C(l3 l3 l9) C(l4 l4 l8) - C(l8 l4 l8 l11 l1 l9 l5 l10) + C(l8 l4 l8 l11 l2 l9 l6 l10) C(l11 l8 l11 l12) C(l12 l11 l12 l13) C(l13 l12 l13) C(l7 l7) - C(l1 l8 l1) + C(l2 l8 l2) C(l9 l3 l8 l9) - C(l5 l8 l5) + C(l6 l8 l6) C(l10 l8 l10) G(l7 SUBSTRATE) G(l10 SUBSTRATE) D(D$PMOS PMOS T(S - R(l1 (-550 -750) (425 1500)) + R(l2 (-550 -750) (425 1500)) ) T(G R(l4 (-125 -750) (250 1500)) ) T(D - R(l1 (125 -750) (450 1500)) + R(l2 (125 -750) (450 1500)) ) T(B R(l3 (-125 -750) (250 1500)) @@ -42,13 +42,13 @@ J( ) D(D$PMOS$1 PMOS T(S - R(l1 (-575 -750) (450 1500)) + R(l2 (-575 -750) (450 1500)) ) T(G R(l4 (-125 -750) (250 1500)) ) T(D - R(l1 (125 -750) (425 1500)) + R(l2 (125 -750) (425 1500)) ) T(B R(l3 (-125 -750) (250 1500)) @@ -56,13 +56,13 @@ J( ) D(D$PMOS$2 PMOS T(S - R(l1 (-550 -750) (425 1500)) + R(l2 (-550 -750) (425 1500)) ) T(G R(l4 (-125 -750) (250 1500)) ) T(D - R(l1 (125 -750) (425 1500)) + R(l2 (125 -750) (425 1500)) ) T(B R(l3 (-125 -750) (250 1500)) @@ -70,13 +70,13 @@ J( ) D(D$NMOS NMOS T(S - R(l5 (-550 -475) (425 950)) + R(l6 (-550 -475) (425 950)) ) T(G R(l4 (-125 -475) (250 950)) ) T(D - R(l5 (125 -475) (450 950)) + R(l6 (125 -475) (450 950)) ) T(B R(l7 (-125 -475) (250 950)) @@ -84,13 +84,13 @@ J( ) D(D$NMOS$1 NMOS T(S - R(l5 (-575 -475) (450 950)) + R(l6 (-575 -475) (450 950)) ) T(G R(l4 (-125 -475) (250 950)) ) T(D - R(l5 (125 -475) (425 950)) + R(l6 (125 -475) (425 950)) ) T(B R(l7 (-125 -475) (250 950)) @@ -98,13 +98,13 @@ J( ) D(D$NMOS$2 NMOS T(S - R(l5 (-550 -475) (425 950)) + R(l6 (-550 -475) (425 950)) ) T(G R(l4 (-125 -475) (250 950)) ) T(D - R(l5 (125 -475) (425 950)) + R(l6 (125 -475) (425 950)) ) T(B R(l7 (-125 -475) (250 950)) @@ -119,8 +119,8 @@ J( R(l11 (-240 -790) (300 1700)) R(l11 (-1350 0) (2400 800)) R(l11 (-1151 -401) (2 2)) - R(l1 (-276 -2151) (425 1500)) - R(l1 (-400 -1500) (425 1500)) + R(l2 (-276 -2151) (425 1500)) + R(l2 (-400 -1500) (425 1500)) ) N(2 I(OUT) R(l8 (1810 1770) (180 180)) @@ -138,9 +138,9 @@ J( R(l11 (-1751 1099) (300 1400)) R(l11 (1100 -1700) (300 300)) R(l11 (-300 0) (300 1400)) - R(l1 (-375 -1450) (425 1500)) - R(l1 (-1800 -1500) (425 1500)) - R(l5 (950 -4890) (425 950)) + R(l2 (-375 -1450) (425 1500)) + R(l2 (-1800 -1500) (425 1500)) + R(l6 (950 -4890) (425 950)) ) N(3 I(VSS) R(l8 (410 1770) (180 180)) @@ -148,7 +148,7 @@ J( R(l11 (-240 -1300) (300 1360)) R(l11 (-650 -2160) (2400 800)) R(l11 (-1151 -401) (2 2)) - R(l5 (-951 859) (425 950)) + R(l6 (-951 859) (425 950)) ) N(4 R(l3 (-100 4500) (2600 3500)) @@ -175,8 +175,8 @@ J( ) N(7 I(SUBSTRATE)) N(8 - R(l5 (975 1660) (425 950)) - R(l5 (-400 -950) (425 950)) + R(l6 (975 1660) (425 950)) + R(l6 (-400 -950) (425 950)) ) P(1 I(VDD)) P(2 I(OUT)) @@ -248,7 +248,7 @@ J( R(l11 (-650 300) (1800 800)) R(l11 (-1450 -1100) (300 300)) R(l11 (299 399) (2 2)) - R(l1 (-651 -2151) (425 1500)) + R(l2 (-651 -2151) (425 1500)) ) N(2 I(OUT) R(l8 (1110 5160) (180 180)) @@ -258,8 +258,8 @@ J( R(l8 (-180 370) (180 180)) R(l11 (-240 -790) (300 4790)) R(l11 (-151 -2501) (2 2)) - R(l1 (-226 1049) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-226 1049) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(3 I(VSS) R(l8 (410 1770) (180 180)) @@ -267,7 +267,7 @@ J( R(l11 (-240 -1300) (300 1360)) R(l11 (-650 -2160) (1800 800)) R(l11 (-851 -401) (2 2)) - R(l5 (-651 859) (425 950)) + R(l6 (-651 859) (425 950)) ) N(4 R(l3 (-100 4500) (2000 3500)) @@ -321,63 +321,63 @@ J( N(1 R(l8 (4710 3010) (180 180)) R(l11 (-850 -240) (610 300)) - R(l1 (-1175 1800) (425 1500)) - R(l1 (-1800 -1500) (425 1500)) - R(l5 (950 -4890) (425 950)) + R(l2 (-1175 1800) (425 1500)) + R(l2 (-1800 -1500) (425 1500)) + R(l6 (950 -4890) (425 950)) ) N(2 R(l8 (6510 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(3 R(l8 (8310 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(4 R(l8 (10110 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(5 R(l8 (11910 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(6 R(l8 (13710 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(7 R(l8 (15510 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(8 R(l8 (17310 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(9 R(l8 (19110 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(10 R(l8 (20910 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(11 I(FB) R(l8 (22710 3010) (180 180)) @@ -391,8 +391,8 @@ J( R(l13 (-17921 -201) (2 2)) R(l13 (-221 -201) (400 400)) R(l13 (17740 -400) (400 400)) - R(l1 (-245 850) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-245 850) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(12 I(VDD) R(l3 (500 4500) (1400 3500)) @@ -414,19 +414,19 @@ J( R(l11 (-750 -1450) (300 1400)) R(l11 (-101 -351) (2 2)) R(l11 (549 -401) (600 800)) - R(l1 (-23025 -2550) (425 1500)) - R(l1 (-400 -1500) (425 1500)) - R(l1 (1275 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) + R(l2 (-23025 -2550) (425 1500)) + R(l2 (-400 -1500) (425 1500)) + R(l2 (1275 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) R(l9 (-21975 -450) (500 1500)) R(l9 (22900 -1500) (500 1500)) ) @@ -435,8 +435,8 @@ J( R(l12 (-260 -260) (200 200)) R(l13 (-101 -101) (2 2)) R(l13 (-201 -201) (400 400)) - R(l1 (-625 850) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-625 850) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(14 I(ENABLE) R(l8 (2510 3010) (180 180)) @@ -461,18 +461,18 @@ J( R(l11 (-750 -1450) (1200 800)) R(l11 (-551 -401) (2 2)) R(l11 (549 -401) (600 800)) - R(l5 (-23700 460) (425 950)) - R(l5 (1975 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) + R(l6 (-23700 460) (425 950)) + R(l6 (1975 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) R(l10 (-21975 -2210) (500 1500)) R(l10 (22900 -1500) (500 1500)) ) @@ -825,8 +825,8 @@ Z( P(5 5 1) P(0 0 1) P(2 2 1) - D(1 1 1) D(2 2 1) + D(1 1 1) ) ) X(ND2X1 ND2X1 1 @@ -846,10 +846,10 @@ Z( P(6 6 1) P(0 0 1) P(2 2 1) - D(1 1 1) - D(2 2 1) D(3 3 1) D(4 4 1) + D(1 1 1) + D(2 2 1) ) ) X(RINGO RINGO 1 @@ -874,10 +874,6 @@ Z( P(2 4 1) P(1 1 1) P(4 0 1) - X(1 1 1) - X(10 10 1) - X(11 11 1) - X(12 12 1) X(2 2 1) X(3 3 1) X(4 4 1) @@ -886,6 +882,10 @@ Z( X(7 7 1) X(8 8 1) X(9 9 1) + X(10 10 1) + X(11 11 1) + X(12 12 1) + X(1 1 1) ) ) ) diff --git a/testdata/lvs/ringo_simple_io2.l2n.1 b/testdata/lvs/ringo_simple_io2.l2n.1 index 7bf5f3726..3d7cc23b1 100644 --- a/testdata/lvs/ringo_simple_io2.l2n.1 +++ b/testdata/lvs/ringo_simple_io2.l2n.1 @@ -8,32 +8,32 @@ L(l11 '9/0') L(l12 '10/0') L(l13 '11/0') L(l7) -L(l1) +L(l2) L(l9) -L(l5) +L(l6) L(l10) C(l3 l3 l9) C(l4 l4 l8) -C(l8 l4 l8 l11 l1 l9 l5 l10) +C(l8 l4 l8 l11 l2 l9 l6 l10) C(l11 l8 l11 l12) C(l12 l11 l12 l13) C(l13 l12 l13) C(l7 l7) -C(l1 l8 l1) +C(l2 l8 l2) C(l9 l3 l8 l9) -C(l5 l8 l5) +C(l6 l8 l6) C(l10 l8 l10) G(l7 SUBSTRATE) G(l10 SUBSTRATE) D(D$PMOS PMOS T(S - R(l1 (-550 -750) (425 1500)) + R(l2 (-550 -750) (425 1500)) ) T(G R(l4 (-125 -750) (250 1500)) ) T(D - R(l1 (125 -750) (450 1500)) + R(l2 (125 -750) (450 1500)) ) T(B R(l3 (-125 -750) (250 1500)) @@ -41,13 +41,13 @@ D(D$PMOS PMOS ) D(D$PMOS$1 PMOS T(S - R(l1 (-575 -750) (450 1500)) + R(l2 (-575 -750) (450 1500)) ) T(G R(l4 (-125 -750) (250 1500)) ) T(D - R(l1 (125 -750) (425 1500)) + R(l2 (125 -750) (425 1500)) ) T(B R(l3 (-125 -750) (250 1500)) @@ -55,13 +55,13 @@ D(D$PMOS$1 PMOS ) D(D$PMOS$2 PMOS T(S - R(l1 (-550 -750) (425 1500)) + R(l2 (-550 -750) (425 1500)) ) T(G R(l4 (-125 -750) (250 1500)) ) T(D - R(l1 (125 -750) (425 1500)) + R(l2 (125 -750) (425 1500)) ) T(B R(l3 (-125 -750) (250 1500)) @@ -69,13 +69,13 @@ D(D$PMOS$2 PMOS ) D(D$NMOS NMOS T(S - R(l5 (-550 -475) (425 950)) + R(l6 (-550 -475) (425 950)) ) T(G R(l4 (-125 -475) (250 950)) ) T(D - R(l5 (125 -475) (450 950)) + R(l6 (125 -475) (450 950)) ) T(B R(l7 (-125 -475) (250 950)) @@ -83,13 +83,13 @@ D(D$NMOS NMOS ) D(D$NMOS$1 NMOS T(S - R(l5 (-575 -475) (450 950)) + R(l6 (-575 -475) (450 950)) ) T(G R(l4 (-125 -475) (250 950)) ) T(D - R(l5 (125 -475) (425 950)) + R(l6 (125 -475) (425 950)) ) T(B R(l7 (-125 -475) (250 950)) @@ -97,13 +97,13 @@ D(D$NMOS$1 NMOS ) D(D$NMOS$2 NMOS T(S - R(l5 (-550 -475) (425 950)) + R(l6 (-550 -475) (425 950)) ) T(G R(l4 (-125 -475) (250 950)) ) T(D - R(l5 (125 -475) (425 950)) + R(l6 (125 -475) (425 950)) ) T(B R(l7 (-125 -475) (250 950)) @@ -118,8 +118,8 @@ X(ND2X1 R(l11 (-240 -790) (300 1700)) R(l11 (-1350 0) (2400 800)) R(l11 (-1151 -401) (2 2)) - R(l1 (-276 -2151) (425 1500)) - R(l1 (-400 -1500) (425 1500)) + R(l2 (-276 -2151) (425 1500)) + R(l2 (-400 -1500) (425 1500)) ) N(2 I(OUT) R(l8 (1810 1770) (180 180)) @@ -137,9 +137,9 @@ X(ND2X1 R(l11 (-1751 1099) (300 1400)) R(l11 (1100 -1700) (300 300)) R(l11 (-300 0) (300 1400)) - R(l1 (-1750 -1450) (425 1500)) - R(l1 (950 -1500) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1750 -1450) (425 1500)) + R(l2 (950 -1500) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(3 I(VSS) R(l8 (410 1770) (180 180)) @@ -147,7 +147,7 @@ X(ND2X1 R(l11 (-240 -1300) (300 1360)) R(l11 (-650 -2160) (2400 800)) R(l11 (-1151 -401) (2 2)) - R(l5 (-951 859) (425 950)) + R(l6 (-951 859) (425 950)) ) N(4 R(l3 (-100 4500) (2600 3500)) @@ -174,8 +174,8 @@ X(ND2X1 ) N(7 I(SUBSTRATE)) N(8 - R(l5 (975 1660) (425 950)) - R(l5 (-400 -950) (425 950)) + R(l6 (975 1660) (425 950)) + R(l6 (-400 -950) (425 950)) ) P(1 I(VDD)) P(2 I(OUT)) @@ -247,7 +247,7 @@ X(INVX1 R(l11 (-650 300) (1800 800)) R(l11 (-1450 -1100) (300 300)) R(l11 (299 399) (2 2)) - R(l1 (-651 -2151) (425 1500)) + R(l2 (-651 -2151) (425 1500)) ) N(2 I(OUT) R(l8 (1110 5160) (180 180)) @@ -257,8 +257,8 @@ X(INVX1 R(l8 (-180 370) (180 180)) R(l11 (-240 -790) (300 4790)) R(l11 (-151 -2501) (2 2)) - R(l1 (-226 1049) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-226 1049) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(3 I(VSS) R(l8 (410 1770) (180 180)) @@ -266,7 +266,7 @@ X(INVX1 R(l11 (-240 -1300) (300 1360)) R(l11 (-650 -2160) (1800 800)) R(l11 (-851 -401) (2 2)) - R(l5 (-651 859) (425 950)) + R(l6 (-651 859) (425 950)) ) N(4 R(l3 (-100 4500) (2000 3500)) @@ -320,63 +320,63 @@ X(RINGO N(1 R(l8 (4710 3010) (180 180)) R(l11 (-850 -240) (610 300)) - R(l1 (-2550 1800) (425 1500)) - R(l1 (950 -1500) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-2550 1800) (425 1500)) + R(l2 (950 -1500) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(2 R(l8 (6510 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(3 R(l8 (8310 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(4 R(l8 (10110 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(5 R(l8 (11910 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(6 R(l8 (13710 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(7 R(l8 (15510 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(8 R(l8 (17310 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(9 R(l8 (19110 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(10 R(l8 (20910 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(11 I(FB) R(l8 (22710 3010) (180 180)) @@ -390,8 +390,8 @@ X(RINGO R(l13 (-17921 -201) (2 2)) R(l13 (-221 -201) (400 400)) R(l13 (17740 -400) (400 400)) - R(l1 (-245 850) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-245 850) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(12 I(VDD) R(l3 (500 4500) (1400 3500)) @@ -413,19 +413,19 @@ X(RINGO R(l11 (-750 -1450) (300 1400)) R(l11 (-101 -351) (2 2)) R(l11 (549 -401) (600 800)) - R(l1 (-23025 -2550) (425 1500)) - R(l1 (-400 -1500) (425 1500)) - R(l1 (1275 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) + R(l2 (-23025 -2550) (425 1500)) + R(l2 (-400 -1500) (425 1500)) + R(l2 (1275 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) R(l9 (-21975 -450) (500 1500)) R(l9 (22900 -1500) (500 1500)) ) @@ -434,8 +434,8 @@ X(RINGO R(l12 (-260 -260) (200 200)) R(l13 (-101 -101) (2 2)) R(l13 (-201 -201) (400 400)) - R(l1 (-625 850) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-625 850) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(14 I(ENABLE) R(l8 (2510 3010) (180 180)) @@ -460,18 +460,18 @@ X(RINGO R(l11 (-750 -1450) (1200 800)) R(l11 (-551 -401) (2 2)) R(l11 (549 -401) (600 800)) - R(l5 (-23700 460) (425 950)) - R(l5 (1975 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) + R(l6 (-23700 460) (425 950)) + R(l6 (1975 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) R(l10 (-21975 -2210) (500 1500)) R(l10 (22900 -1500) (500 1500)) ) diff --git a/testdata/lvs/ringo_simple_io2.l2n.2 b/testdata/lvs/ringo_simple_io2.l2n.2 index 9c5f6aa2a..715c73183 100644 --- a/testdata/lvs/ringo_simple_io2.l2n.2 +++ b/testdata/lvs/ringo_simple_io2.l2n.2 @@ -8,32 +8,32 @@ L(l11 '9/0') L(l12 '10/0') L(l13 '11/0') L(l7) -L(l1) +L(l2) L(l9) -L(l5) +L(l6) L(l10) C(l3 l3 l9) C(l4 l4 l8) -C(l8 l4 l8 l11 l1 l9 l5 l10) +C(l8 l4 l8 l11 l2 l9 l6 l10) C(l11 l8 l11 l12) C(l12 l11 l12 l13) C(l13 l12 l13) C(l7 l7) -C(l1 l8 l1) +C(l2 l8 l2) C(l9 l3 l8 l9) -C(l5 l8 l5) +C(l6 l8 l6) C(l10 l8 l10) G(l7 SUBSTRATE) G(l10 SUBSTRATE) D(D$PMOS PMOS T(S - R(l1 (-550 -750) (425 1500)) + R(l2 (-550 -750) (425 1500)) ) T(G R(l4 (-125 -750) (250 1500)) ) T(D - R(l1 (125 -750) (450 1500)) + R(l2 (125 -750) (450 1500)) ) T(B R(l3 (-125 -750) (250 1500)) @@ -41,13 +41,13 @@ D(D$PMOS PMOS ) D(D$PMOS$1 PMOS T(S - R(l1 (-575 -750) (450 1500)) + R(l2 (-575 -750) (450 1500)) ) T(G R(l4 (-125 -750) (250 1500)) ) T(D - R(l1 (125 -750) (425 1500)) + R(l2 (125 -750) (425 1500)) ) T(B R(l3 (-125 -750) (250 1500)) @@ -55,13 +55,13 @@ D(D$PMOS$1 PMOS ) D(D$PMOS$2 PMOS T(S - R(l1 (-550 -750) (425 1500)) + R(l2 (-550 -750) (425 1500)) ) T(G R(l4 (-125 -750) (250 1500)) ) T(D - R(l1 (125 -750) (425 1500)) + R(l2 (125 -750) (425 1500)) ) T(B R(l3 (-125 -750) (250 1500)) @@ -69,13 +69,13 @@ D(D$PMOS$2 PMOS ) D(D$NMOS NMOS T(S - R(l5 (-550 -475) (425 950)) + R(l6 (-550 -475) (425 950)) ) T(G R(l4 (-125 -475) (250 950)) ) T(D - R(l5 (125 -475) (450 950)) + R(l6 (125 -475) (450 950)) ) T(B R(l7 (-125 -475) (250 950)) @@ -83,13 +83,13 @@ D(D$NMOS NMOS ) D(D$NMOS$1 NMOS T(S - R(l5 (-575 -475) (450 950)) + R(l6 (-575 -475) (450 950)) ) T(G R(l4 (-125 -475) (250 950)) ) T(D - R(l5 (125 -475) (425 950)) + R(l6 (125 -475) (425 950)) ) T(B R(l7 (-125 -475) (250 950)) @@ -97,13 +97,13 @@ D(D$NMOS$1 NMOS ) D(D$NMOS$2 NMOS T(S - R(l5 (-550 -475) (425 950)) + R(l6 (-550 -475) (425 950)) ) T(G R(l4 (-125 -475) (250 950)) ) T(D - R(l5 (125 -475) (425 950)) + R(l6 (125 -475) (425 950)) ) T(B R(l7 (-125 -475) (250 950)) @@ -118,8 +118,8 @@ X(ND2X1 R(l11 (-240 -790) (300 1700)) R(l11 (-1350 0) (2400 800)) R(l11 (-1151 -401) (2 2)) - R(l1 (-276 -2151) (425 1500)) - R(l1 (-400 -1500) (425 1500)) + R(l2 (-276 -2151) (425 1500)) + R(l2 (-400 -1500) (425 1500)) ) N(2 I(OUT) R(l8 (1810 1770) (180 180)) @@ -137,9 +137,9 @@ X(ND2X1 R(l11 (-1751 1099) (300 1400)) R(l11 (1100 -1700) (300 300)) R(l11 (-300 0) (300 1400)) - R(l1 (-375 -1450) (425 1500)) - R(l1 (-1800 -1500) (425 1500)) - R(l5 (950 -4890) (425 950)) + R(l2 (-375 -1450) (425 1500)) + R(l2 (-1800 -1500) (425 1500)) + R(l6 (950 -4890) (425 950)) ) N(3 I(VSS) R(l8 (410 1770) (180 180)) @@ -147,7 +147,7 @@ X(ND2X1 R(l11 (-240 -1300) (300 1360)) R(l11 (-650 -2160) (2400 800)) R(l11 (-1151 -401) (2 2)) - R(l5 (-951 859) (425 950)) + R(l6 (-951 859) (425 950)) ) N(4 R(l3 (-100 4500) (2600 3500)) @@ -174,8 +174,8 @@ X(ND2X1 ) N(7 I(SUBSTRATE)) N(8 - R(l5 (975 1660) (425 950)) - R(l5 (-400 -950) (425 950)) + R(l6 (975 1660) (425 950)) + R(l6 (-400 -950) (425 950)) ) P(1 I(VDD)) P(2 I(OUT)) @@ -247,7 +247,7 @@ X(INVX1 R(l11 (-650 300) (1800 800)) R(l11 (-1450 -1100) (300 300)) R(l11 (299 399) (2 2)) - R(l1 (-651 -2151) (425 1500)) + R(l2 (-651 -2151) (425 1500)) ) N(2 I(OUT) R(l8 (1110 5160) (180 180)) @@ -257,8 +257,8 @@ X(INVX1 R(l8 (-180 370) (180 180)) R(l11 (-240 -790) (300 4790)) R(l11 (-151 -2501) (2 2)) - R(l1 (-226 1049) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-226 1049) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(3 I(VSS) R(l8 (410 1770) (180 180)) @@ -266,7 +266,7 @@ X(INVX1 R(l11 (-240 -1300) (300 1360)) R(l11 (-650 -2160) (1800 800)) R(l11 (-851 -401) (2 2)) - R(l5 (-651 859) (425 950)) + R(l6 (-651 859) (425 950)) ) N(4 R(l3 (-100 4500) (2000 3500)) @@ -320,63 +320,63 @@ X(RINGO N(1 R(l8 (4710 3010) (180 180)) R(l11 (-850 -240) (610 300)) - R(l1 (-1175 1800) (425 1500)) - R(l1 (-1800 -1500) (425 1500)) - R(l5 (950 -4890) (425 950)) + R(l2 (-1175 1800) (425 1500)) + R(l2 (-1800 -1500) (425 1500)) + R(l6 (950 -4890) (425 950)) ) N(2 R(l8 (6510 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(3 R(l8 (8310 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(4 R(l8 (10110 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(5 R(l8 (11910 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(6 R(l8 (13710 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(7 R(l8 (15510 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(8 R(l8 (17310 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(9 R(l8 (19110 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(10 R(l8 (20910 3010) (180 180)) R(l11 (-1140 -240) (900 300)) - R(l1 (-1275 1800) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-1275 1800) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(11 I(FB) R(l8 (22710 3010) (180 180)) @@ -390,8 +390,8 @@ X(RINGO R(l13 (-17921 -201) (2 2)) R(l13 (-221 -201) (400 400)) R(l13 (17740 -400) (400 400)) - R(l1 (-245 850) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-245 850) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(12 I(VDD) R(l3 (500 4500) (1400 3500)) @@ -413,19 +413,19 @@ X(RINGO R(l11 (-750 -1450) (300 1400)) R(l11 (-101 -351) (2 2)) R(l11 (549 -401) (600 800)) - R(l1 (-23025 -2550) (425 1500)) - R(l1 (-400 -1500) (425 1500)) - R(l1 (1275 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) - R(l1 (1375 -1500) (425 1500)) + R(l2 (-23025 -2550) (425 1500)) + R(l2 (-400 -1500) (425 1500)) + R(l2 (1275 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) + R(l2 (1375 -1500) (425 1500)) R(l9 (-21975 -450) (500 1500)) R(l9 (22900 -1500) (500 1500)) ) @@ -434,8 +434,8 @@ X(RINGO R(l12 (-260 -260) (200 200)) R(l13 (-101 -101) (2 2)) R(l13 (-201 -201) (400 400)) - R(l1 (-625 850) (425 1500)) - R(l5 (-425 -4890) (425 950)) + R(l2 (-625 850) (425 1500)) + R(l6 (-425 -4890) (425 950)) ) N(14 I(ENABLE) R(l8 (2510 3010) (180 180)) @@ -460,18 +460,18 @@ X(RINGO R(l11 (-750 -1450) (1200 800)) R(l11 (-551 -401) (2 2)) R(l11 (549 -401) (600 800)) - R(l5 (-23700 460) (425 950)) - R(l5 (1975 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) - R(l5 (1375 -950) (425 950)) + R(l6 (-23700 460) (425 950)) + R(l6 (1975 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) + R(l6 (1375 -950) (425 950)) R(l10 (-21975 -2210) (500 1500)) R(l10 (22900 -1500) (500 1500)) ) diff --git a/testdata/lvs/ringo_simple_io2.lvsdb.1 b/testdata/lvs/ringo_simple_io2.lvsdb.1 index 9ed4f2480..a68dae475 100644 --- a/testdata/lvs/ringo_simple_io2.lvsdb.1 +++ b/testdata/lvs/ringo_simple_io2.lvsdb.1 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PMOS PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PMOS$1 PMOS terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PMOS$2 PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NMOS NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NMOS$1 NMOS terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NMOS$2 NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-1750 -1450) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1750 -1450) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -364,63 +364,63 @@ layout( net(1 rect(l8 (4710 3010) (180 180)) rect(l11 (-850 -240) (610 300)) - rect(l1 (-2550 1800) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-2550 1800) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(2 rect(l8 (6510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (8310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (10110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 rect(l8 (11910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 rect(l8 (13710 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(7 rect(l8 (15510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(8 rect(l8 (17310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(9 rect(l8 (19110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(10 rect(l8 (20910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 name(FB) rect(l8 (22710 3010) (180 180)) @@ -434,8 +434,8 @@ layout( rect(l13 (-17921 -201) (2 2)) rect(l13 (-221 -201) (400 400)) rect(l13 (17740 -400) (400 400)) - rect(l1 (-245 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(12 name(VDD) rect(l3 (500 4500) (1400 3500)) @@ -457,19 +457,19 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23025 -2550) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (1275 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) + rect(l2 (-23025 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) rect(l9 (-21975 -450) (500 1500)) rect(l9 (22900 -1500) (500 1500)) ) @@ -478,8 +478,8 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-101 -101) (2 2)) rect(l13 (-201 -201) (400 400)) - rect(l1 (-625 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-625 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(14 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -504,18 +504,18 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l5 (-23700 460) (425 950)) - rect(l5 (1975 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) + rect(l6 (-23700 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) rect(l10 (-21975 -2210) (500 1500)) rect(l10 (22900 -1500) (500 1500)) ) @@ -905,8 +905,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(ND2X1 ND2X1 match @@ -926,10 +926,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(RINGO RINGO match @@ -954,10 +954,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(10 10 match) - circuit(11 11 match) - circuit(12 12 match) circuit(2 2 match) circuit(3 3 match) circuit(4 4 match) @@ -966,6 +962,10 @@ xref( circuit(7 7 match) circuit(8 8 match) circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_io2.lvsdb.2 b/testdata/lvs/ringo_simple_io2.lvsdb.2 index 2d8585635..834cc43fe 100644 --- a/testdata/lvs/ringo_simple_io2.lvsdb.2 +++ b/testdata/lvs/ringo_simple_io2.lvsdb.2 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PMOS PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PMOS$1 PMOS terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PMOS$2 PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NMOS NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NMOS$1 NMOS terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NMOS$2 NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-375 -1450) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-375 -1450) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -364,63 +364,63 @@ layout( net(1 rect(l8 (4710 3010) (180 180)) rect(l11 (-850 -240) (610 300)) - rect(l1 (-1175 1800) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-1175 1800) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(2 rect(l8 (6510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (8310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (10110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 rect(l8 (11910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 rect(l8 (13710 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(7 rect(l8 (15510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(8 rect(l8 (17310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(9 rect(l8 (19110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(10 rect(l8 (20910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 name(FB) rect(l8 (22710 3010) (180 180)) @@ -434,8 +434,8 @@ layout( rect(l13 (-17921 -201) (2 2)) rect(l13 (-221 -201) (400 400)) rect(l13 (17740 -400) (400 400)) - rect(l1 (-245 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(12 name(VDD) rect(l3 (500 4500) (1400 3500)) @@ -457,19 +457,19 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23025 -2550) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (1275 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) + rect(l2 (-23025 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) rect(l9 (-21975 -450) (500 1500)) rect(l9 (22900 -1500) (500 1500)) ) @@ -478,8 +478,8 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-101 -101) (2 2)) rect(l13 (-201 -201) (400 400)) - rect(l1 (-625 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-625 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(14 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -504,18 +504,18 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l5 (-23700 460) (425 950)) - rect(l5 (1975 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) + rect(l6 (-23700 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) rect(l10 (-21975 -2210) (500 1500)) rect(l10 (22900 -1500) (500 1500)) ) @@ -905,8 +905,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(ND2X1 ND2X1 match @@ -926,10 +926,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(RINGO RINGO match @@ -954,10 +954,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(10 10 match) - circuit(11 11 match) - circuit(12 12 match) circuit(2 2 match) circuit(3 3 match) circuit(4 4 match) @@ -966,6 +962,10 @@ xref( circuit(7 7 match) circuit(8 8 match) circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_net_and_circuit_equivalence.lvsdb.1 b/testdata/lvs/ringo_simple_net_and_circuit_equivalence.lvsdb.1 index 925edd988..bee7ccfc8 100644 --- a/testdata/lvs/ringo_simple_net_and_circuit_equivalence.lvsdb.1 +++ b/testdata/lvs/ringo_simple_net_and_circuit_equivalence.lvsdb.1 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PMOS PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PMOS$1 PMOS terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PMOS$2 PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NMOS NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NMOS$1 NMOS terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NMOS$2 NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-1750 -1450) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1750 -1450) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -364,63 +364,63 @@ layout( net(1 rect(l8 (4710 3010) (180 180)) rect(l11 (-850 -240) (610 300)) - rect(l1 (-2550 1800) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-2550 1800) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(2 rect(l8 (6510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (8310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (10110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 rect(l8 (11910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 rect(l8 (13710 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(7 rect(l8 (15510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(8 rect(l8 (17310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(9 rect(l8 (19110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(10 rect(l8 (20910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 name(FB) rect(l8 (22710 3010) (180 180)) @@ -434,8 +434,8 @@ layout( rect(l13 (-17921 -201) (2 2)) rect(l13 (-221 -201) (400 400)) rect(l13 (17740 -400) (400 400)) - rect(l1 (-245 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(12 name(VDD) rect(l3 (500 4500) (1400 3500)) @@ -457,19 +457,19 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23025 -2550) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (1275 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) + rect(l2 (-23025 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) rect(l9 (-21975 -450) (500 1500)) rect(l9 (22900 -1500) (500 1500)) ) @@ -478,8 +478,8 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-101 -101) (2 2)) rect(l13 (-201 -201) (400 400)) - rect(l1 (-625 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-625 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(14 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -504,18 +504,18 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l5 (-23700 460) (425 950)) - rect(l5 (1975 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) + rect(l6 (-23700 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) rect(l10 (-21975 -2210) (500 1500)) rect(l10 (22900 -1500) (500 1500)) ) @@ -905,8 +905,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(nd2X1 ND2X1 match @@ -926,10 +926,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(top RINGO match @@ -953,10 +953,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(10 10 match) - circuit(11 11 match) - circuit(12 12 match) circuit(2 2 match) circuit(3 3 match) circuit(4 4 match) @@ -965,6 +961,10 @@ xref( circuit(7 7 match) circuit(8 8 match) circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_net_and_circuit_equivalence.lvsdb.2 b/testdata/lvs/ringo_simple_net_and_circuit_equivalence.lvsdb.2 index 4930f20f1..f57553a48 100644 --- a/testdata/lvs/ringo_simple_net_and_circuit_equivalence.lvsdb.2 +++ b/testdata/lvs/ringo_simple_net_and_circuit_equivalence.lvsdb.2 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PMOS PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PMOS$1 PMOS terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PMOS$2 PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NMOS NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NMOS$1 NMOS terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NMOS$2 NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-375 -1450) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-375 -1450) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -364,63 +364,63 @@ layout( net(1 rect(l8 (4710 3010) (180 180)) rect(l11 (-850 -240) (610 300)) - rect(l1 (-1175 1800) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-1175 1800) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(2 rect(l8 (6510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (8310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (10110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 rect(l8 (11910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 rect(l8 (13710 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(7 rect(l8 (15510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(8 rect(l8 (17310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(9 rect(l8 (19110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(10 rect(l8 (20910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 name(FB) rect(l8 (22710 3010) (180 180)) @@ -434,8 +434,8 @@ layout( rect(l13 (-17921 -201) (2 2)) rect(l13 (-221 -201) (400 400)) rect(l13 (17740 -400) (400 400)) - rect(l1 (-245 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(12 name(VDD) rect(l3 (500 4500) (1400 3500)) @@ -457,19 +457,19 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23025 -2550) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (1275 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) + rect(l2 (-23025 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) rect(l9 (-21975 -450) (500 1500)) rect(l9 (22900 -1500) (500 1500)) ) @@ -478,8 +478,8 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-101 -101) (2 2)) rect(l13 (-201 -201) (400 400)) - rect(l1 (-625 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-625 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(14 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -504,18 +504,18 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l5 (-23700 460) (425 950)) - rect(l5 (1975 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) + rect(l6 (-23700 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) rect(l10 (-21975 -2210) (500 1500)) rect(l10 (22900 -1500) (500 1500)) ) @@ -905,8 +905,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(nd2X1 ND2X1 match @@ -926,10 +926,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(top RINGO match @@ -953,10 +953,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(10 10 match) - circuit(11 11 match) - circuit(12 12 match) circuit(2 2 match) circuit(3 3 match) circuit(4 4 match) @@ -965,6 +961,10 @@ xref( circuit(7 7 match) circuit(8 8 match) circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_pin_swapping.lvsdb.1 b/testdata/lvs/ringo_simple_pin_swapping.lvsdb.1 index 2315835c9..4c98e224d 100644 --- a/testdata/lvs/ringo_simple_pin_swapping.lvsdb.1 +++ b/testdata/lvs/ringo_simple_pin_swapping.lvsdb.1 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PMOS PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PMOS$1 PMOS terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PMOS$2 PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NMOS NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NMOS$1 NMOS terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NMOS$2 NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-1750 -1450) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1750 -1450) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -364,63 +364,63 @@ layout( net(1 rect(l8 (4710 3010) (180 180)) rect(l11 (-850 -240) (610 300)) - rect(l1 (-2550 1800) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-2550 1800) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(2 rect(l8 (6510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (8310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (10110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 rect(l8 (11910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 rect(l8 (13710 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(7 rect(l8 (15510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(8 rect(l8 (17310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(9 rect(l8 (19110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(10 rect(l8 (20910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 name(FB) rect(l8 (22710 3010) (180 180)) @@ -434,8 +434,8 @@ layout( rect(l13 (-17921 -201) (2 2)) rect(l13 (-221 -201) (400 400)) rect(l13 (17740 -400) (400 400)) - rect(l1 (-245 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(12 name(VDD) rect(l3 (500 4500) (1400 3500)) @@ -457,19 +457,19 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23025 -2550) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (1275 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) + rect(l2 (-23025 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) rect(l9 (-21975 -450) (500 1500)) rect(l9 (22900 -1500) (500 1500)) ) @@ -478,8 +478,8 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-101 -101) (2 2)) rect(l13 (-201 -201) (400 400)) - rect(l1 (-625 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-625 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(14 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -504,18 +504,18 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l5 (-23700 460) (425 950)) - rect(l5 (1975 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) + rect(l6 (-23700 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) rect(l10 (-21975 -2210) (500 1500)) rect(l10 (22900 -1500) (500 1500)) ) @@ -905,8 +905,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(ND2X1 ND2X1 match @@ -926,10 +926,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(RINGO RINGO match @@ -954,10 +954,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(10 10 match) - circuit(11 11 match) - circuit(12 12 match) circuit(2 2 match) circuit(3 3 match) circuit(4 4 match) @@ -966,6 +962,10 @@ xref( circuit(7 7 match) circuit(8 8 match) circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_pin_swapping.lvsdb.2 b/testdata/lvs/ringo_simple_pin_swapping.lvsdb.2 index 57fb8a644..45cc8683d 100644 --- a/testdata/lvs/ringo_simple_pin_swapping.lvsdb.2 +++ b/testdata/lvs/ringo_simple_pin_swapping.lvsdb.2 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PMOS PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PMOS$1 PMOS terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PMOS$2 PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NMOS NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NMOS$1 NMOS terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NMOS$2 NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-375 -1450) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-375 -1450) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -364,63 +364,63 @@ layout( net(1 rect(l8 (4710 3010) (180 180)) rect(l11 (-850 -240) (610 300)) - rect(l1 (-1175 1800) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-1175 1800) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(2 rect(l8 (6510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (8310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (10110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 rect(l8 (11910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 rect(l8 (13710 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(7 rect(l8 (15510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(8 rect(l8 (17310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(9 rect(l8 (19110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(10 rect(l8 (20910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 name(FB) rect(l8 (22710 3010) (180 180)) @@ -434,8 +434,8 @@ layout( rect(l13 (-17921 -201) (2 2)) rect(l13 (-221 -201) (400 400)) rect(l13 (17740 -400) (400 400)) - rect(l1 (-245 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(12 name(VDD) rect(l3 (500 4500) (1400 3500)) @@ -457,19 +457,19 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23025 -2550) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (1275 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) + rect(l2 (-23025 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) rect(l9 (-21975 -450) (500 1500)) rect(l9 (22900 -1500) (500 1500)) ) @@ -478,8 +478,8 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-101 -101) (2 2)) rect(l13 (-201 -201) (400 400)) - rect(l1 (-625 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-625 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(14 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -504,18 +504,18 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l5 (-23700 460) (425 950)) - rect(l5 (1975 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) + rect(l6 (-23700 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) rect(l10 (-21975 -2210) (500 1500)) rect(l10 (22900 -1500) (500 1500)) ) @@ -905,8 +905,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(ND2X1 ND2X1 match @@ -926,10 +926,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(RINGO RINGO match @@ -954,10 +954,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(10 10 match) - circuit(11 11 match) - circuit(12 12 match) circuit(2 2 match) circuit(3 3 match) circuit(4 4 match) @@ -966,6 +962,10 @@ xref( circuit(7 7 match) circuit(8 8 match) circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_same_device_classes.lvsdb.1 b/testdata/lvs/ringo_simple_same_device_classes.lvsdb.1 index 8027c048c..7fc246d6a 100644 --- a/testdata/lvs/ringo_simple_same_device_classes.lvsdb.1 +++ b/testdata/lvs/ringo_simple_same_device_classes.lvsdb.1 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PM PM terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PM$1 PM terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PM$2 PM terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NM NM terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NM$1 NM terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NM$2 NM terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-1750 -1450) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1750 -1450) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -364,63 +364,63 @@ layout( net(1 rect(l8 (4710 3010) (180 180)) rect(l11 (-850 -240) (610 300)) - rect(l1 (-2550 1800) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-2550 1800) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(2 rect(l8 (6510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (8310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (10110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 rect(l8 (11910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 rect(l8 (13710 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(7 rect(l8 (15510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(8 rect(l8 (17310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(9 rect(l8 (19110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(10 rect(l8 (20910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 name(FB) rect(l8 (22710 3010) (180 180)) @@ -434,8 +434,8 @@ layout( rect(l13 (-17921 -201) (2 2)) rect(l13 (-221 -201) (400 400)) rect(l13 (17740 -400) (400 400)) - rect(l1 (-245 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(12 name(VDD) rect(l3 (500 4500) (1400 3500)) @@ -457,19 +457,19 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23025 -2550) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (1275 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) + rect(l2 (-23025 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) rect(l9 (-21975 -450) (500 1500)) rect(l9 (22900 -1500) (500 1500)) ) @@ -478,8 +478,8 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-101 -101) (2 2)) rect(l13 (-201 -201) (400 400)) - rect(l1 (-625 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-625 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(14 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -504,18 +504,18 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l5 (-23700 460) (425 950)) - rect(l5 (1975 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) + rect(l6 (-23700 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) rect(l10 (-21975 -2210) (500 1500)) rect(l10 (22900 -1500) (500 1500)) ) @@ -905,8 +905,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(ND2X1 ND2X1 match @@ -926,10 +926,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(RINGO RINGO match @@ -954,10 +954,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(10 10 match) - circuit(11 11 match) - circuit(12 12 match) circuit(2 2 match) circuit(3 3 match) circuit(4 4 match) @@ -966,6 +962,10 @@ xref( circuit(7 7 match) circuit(8 8 match) circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_same_device_classes.lvsdb.2 b/testdata/lvs/ringo_simple_same_device_classes.lvsdb.2 index 847ff7f63..7ea0be0cd 100644 --- a/testdata/lvs/ringo_simple_same_device_classes.lvsdb.2 +++ b/testdata/lvs/ringo_simple_same_device_classes.lvsdb.2 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PM PM terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PM$1 PM terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PM$2 PM terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NM NM terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NM$1 NM terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NM$2 NM terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-375 -1450) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-375 -1450) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -364,63 +364,63 @@ layout( net(1 rect(l8 (4710 3010) (180 180)) rect(l11 (-850 -240) (610 300)) - rect(l1 (-1175 1800) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-1175 1800) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(2 rect(l8 (6510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (8310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (10110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 rect(l8 (11910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 rect(l8 (13710 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(7 rect(l8 (15510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(8 rect(l8 (17310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(9 rect(l8 (19110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(10 rect(l8 (20910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 name(FB) rect(l8 (22710 3010) (180 180)) @@ -434,8 +434,8 @@ layout( rect(l13 (-17921 -201) (2 2)) rect(l13 (-221 -201) (400 400)) rect(l13 (17740 -400) (400 400)) - rect(l1 (-245 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(12 name(VDD) rect(l3 (500 4500) (1400 3500)) @@ -457,19 +457,19 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23025 -2550) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (1275 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) + rect(l2 (-23025 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) rect(l9 (-21975 -450) (500 1500)) rect(l9 (22900 -1500) (500 1500)) ) @@ -478,8 +478,8 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-101 -101) (2 2)) rect(l13 (-201 -201) (400 400)) - rect(l1 (-625 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-625 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(14 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -504,18 +504,18 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l5 (-23700 460) (425 950)) - rect(l5 (1975 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) + rect(l6 (-23700 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) rect(l10 (-21975 -2210) (500 1500)) rect(l10 (22900 -1500) (500 1500)) ) @@ -905,8 +905,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(ND2X1 ND2X1 match @@ -926,10 +926,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(RINGO RINGO match @@ -954,10 +954,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(10 10 match) - circuit(11 11 match) - circuit(12 12 match) circuit(2 2 match) circuit(3 3 match) circuit(4 4 match) @@ -966,6 +962,10 @@ xref( circuit(7 7 match) circuit(8 8 match) circuit(9 9 match) + circuit(10 10 match) + circuit(11 11 match) + circuit(12 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_simplification.lvsdb.1 b/testdata/lvs/ringo_simple_simplification.lvsdb.1 index 278aa58a8..b0e4b5871 100644 --- a/testdata/lvs/ringo_simple_simplification.lvsdb.1 +++ b/testdata/lvs/ringo_simple_simplification.lvsdb.1 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PMOS PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PMOS$1 PMOS terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PMOS$2 PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NMOS NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NMOS$1 NMOS terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NMOS$2 NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-1750 -1450) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1750 -1450) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -389,8 +389,8 @@ layout( rect(l11 (1100 -300) (300 300)) rect(l11 (-1101 399) (2 2)) rect(l11 (799 -2101) (300 1400)) - rect(l1 (-1750 -1450) (425 1500)) - rect(l1 (950 -1500) (425 1500)) + rect(l2 (-1750 -1450) (425 1500)) + rect(l2 (950 -1500) (425 1500)) ) net(3 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -400,10 +400,10 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l5 (-450 -4890) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l6 (-450 -4890) (425 950)) + rect(l6 (-400 -950) (425 950)) ) net(4 name(VSS) rect(l8 (410 1770) (180 180)) @@ -414,8 +414,8 @@ layout( rect(l11 (-650 -2160) (2400 800)) rect(l11 (-650 0) (300 1360)) rect(l11 (-1101 -1761) (2 2)) - rect(l5 (-651 859) (425 950)) - rect(l5 (950 -950) (425 950)) + rect(l6 (-651 859) (425 950)) + rect(l6 (950 -950) (425 950)) ) net(5 rect(l3 (-100 4500) (2600 3500)) @@ -486,27 +486,27 @@ layout( net(1 rect(l8 (4710 3010) (180 180)) rect(l11 (-850 -240) (610 300)) - rect(l1 (-2550 1800) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-2550 1800) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(2 rect(l8 (6510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (19110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (20910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 name(FB) rect(l8 (22710 3010) (180 180)) @@ -520,8 +520,8 @@ layout( rect(l13 (-17921 -201) (2 2)) rect(l13 (-221 -201) (400 400)) rect(l13 (17740 -400) (400 400)) - rect(l1 (-245 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 name(VDD) rect(l3 (1100 4500) (1400 3500)) @@ -543,20 +543,20 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23625 -2550) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (1275 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (3175 -1500) (425 1500)) - rect(l1 (-2225 -1500) (425 1500)) - rect(l1 (3175 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (3175 -1500) (425 1500)) - rect(l1 (950 -1500) (425 1500)) - rect(l1 (-3600 -1500) (425 1500)) + rect(l2 (-23625 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (3175 -1500) (425 1500)) + rect(l2 (-2225 -1500) (425 1500)) + rect(l2 (3175 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (3175 -1500) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l2 (-3600 -1500) (425 1500)) rect(l9 (-19575 -450) (500 1500)) rect(l9 (22900 -1500) (500 1500)) ) @@ -565,10 +565,10 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-101 -101) (2 2)) rect(l13 (-201 -201) (400 400)) - rect(l1 (-625 850) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l5 (-450 -4890) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l2 (-625 850) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l6 (-450 -4890) (425 950)) + rect(l6 (-400 -950) (425 950)) ) net(8 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -593,38 +593,58 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l5 (-24300 460) (425 950)) - rect(l5 (1975 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (3175 -950) (425 950)) - rect(l5 (-2225 -950) (425 950)) - rect(l5 (3175 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (3175 -950) (425 950)) - rect(l5 (950 -950) (425 950)) - rect(l5 (-3600 -950) (425 950)) + rect(l6 (-24300 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (3175 -950) (425 950)) + rect(l6 (-2225 -950) (425 950)) + rect(l6 (3175 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (3175 -950) (425 950)) + rect(l6 (950 -950) (425 950)) + rect(l6 (-3600 -950) (425 950)) rect(l10 (-19575 -2210) (500 1500)) rect(l10 (22900 -1500) (500 1500)) ) net(10 rect(l8 (8310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 rect(l8 (17310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(12 + rect(l8 (10110 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(13 + rect(l8 (11910 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(14 + rect(l8 (13710 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(15 + rect(l8 (15510 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) - net(12) - net(13) - net(14) - net(15) # Outgoing pins and their connections to nets pin(5 name(FB)) @@ -1058,8 +1078,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(INVX2 INVX2 match @@ -1076,8 +1096,8 @@ xref( pin(5 5 match) pin(1 0 match) pin(3 2 match) - device(1 1 match) device(3 2 match) + device(1 1 match) ) ) circuit(ND2X1 ND2X1 match @@ -1097,10 +1117,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(RINGO RINGO match @@ -1125,10 +1145,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(5 10 match) - circuit(6 11 match) - circuit(7 12 match) circuit(2 2 match) circuit(3 3 match) circuit(17 4 match) @@ -1137,6 +1153,10 @@ xref( circuit(20 7 match) circuit(21 8 match) circuit(4 9 match) + circuit(5 10 match) + circuit(6 11 match) + circuit(7 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_simplification.lvsdb.2 b/testdata/lvs/ringo_simple_simplification.lvsdb.2 index 169191238..2492067a3 100644 --- a/testdata/lvs/ringo_simple_simplification.lvsdb.2 +++ b/testdata/lvs/ringo_simple_simplification.lvsdb.2 @@ -16,22 +16,22 @@ layout( layer(l12 '10/0') layer(l13 '11/0') layer(l7) - layer(l1) + layer(l2) layer(l9) - layer(l5) + layer(l6) layer(l10) # Mask layer connectivity connect(l3 l3 l9) connect(l4 l4 l8) - connect(l8 l4 l8 l11 l1 l9 l5 l10) + connect(l8 l4 l8 l11 l2 l9 l6 l10) connect(l11 l8 l11 l12) connect(l12 l11 l12 l13) connect(l13 l12 l13) connect(l7 l7) - connect(l1 l8 l1) + connect(l2 l8 l2) connect(l9 l3 l8 l9) - connect(l5 l8 l5) + connect(l6 l8 l6) connect(l10 l8 l10) # Global nets and connectivity @@ -46,13 +46,13 @@ layout( # Device abstracts list the pin shapes of the devices. device(D$PMOS PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (450 1500)) + rect(l2 (125 -750) (450 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -60,13 +60,13 @@ layout( ) device(D$PMOS$1 PMOS terminal(S - rect(l1 (-575 -750) (450 1500)) + rect(l2 (-575 -750) (450 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -74,13 +74,13 @@ layout( ) device(D$PMOS$2 PMOS terminal(S - rect(l1 (-550 -750) (425 1500)) + rect(l2 (-550 -750) (425 1500)) ) terminal(G rect(l4 (-125 -750) (250 1500)) ) terminal(D - rect(l1 (125 -750) (425 1500)) + rect(l2 (125 -750) (425 1500)) ) terminal(B rect(l3 (-125 -750) (250 1500)) @@ -88,13 +88,13 @@ layout( ) device(D$NMOS NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (450 950)) + rect(l6 (125 -475) (450 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -102,13 +102,13 @@ layout( ) device(D$NMOS$1 NMOS terminal(S - rect(l5 (-575 -475) (450 950)) + rect(l6 (-575 -475) (450 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -116,13 +116,13 @@ layout( ) device(D$NMOS$2 NMOS terminal(S - rect(l5 (-550 -475) (425 950)) + rect(l6 (-550 -475) (425 950)) ) terminal(G rect(l4 (-125 -475) (250 950)) ) terminal(D - rect(l5 (125 -475) (425 950)) + rect(l6 (125 -475) (425 950)) ) terminal(B rect(l7 (-125 -475) (250 950)) @@ -144,8 +144,8 @@ layout( rect(l11 (-240 -790) (300 1700)) rect(l11 (-1350 0) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l1 (-276 -2151) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) ) net(2 name(OUT) rect(l8 (1810 1770) (180 180)) @@ -163,9 +163,9 @@ layout( rect(l11 (-1751 1099) (300 1400)) rect(l11 (1100 -1700) (300 300)) rect(l11 (-300 0) (300 1400)) - rect(l1 (-375 -1450) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-375 -1450) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -173,7 +173,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (2400 800)) rect(l11 (-1151 -401) (2 2)) - rect(l5 (-951 859) (425 950)) + rect(l6 (-951 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2600 3500)) @@ -200,8 +200,8 @@ layout( ) net(7 name(SUBSTRATE)) net(8 - rect(l5 (975 1660) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) ) # Outgoing pins and their connections to nets @@ -282,7 +282,7 @@ layout( rect(l11 (-650 300) (1800 800)) rect(l11 (-1450 -1100) (300 300)) rect(l11 (299 399) (2 2)) - rect(l1 (-651 -2151) (425 1500)) + rect(l2 (-651 -2151) (425 1500)) ) net(2 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -292,8 +292,8 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 name(VSS) rect(l8 (410 1770) (180 180)) @@ -301,7 +301,7 @@ layout( rect(l11 (-240 -1300) (300 1360)) rect(l11 (-650 -2160) (1800 800)) rect(l11 (-851 -401) (2 2)) - rect(l5 (-651 859) (425 950)) + rect(l6 (-651 859) (425 950)) ) net(4 rect(l3 (-100 4500) (2000 3500)) @@ -389,8 +389,8 @@ layout( rect(l11 (1100 -300) (300 300)) rect(l11 (-1101 399) (2 2)) rect(l11 (799 -2101) (300 1400)) - rect(l1 (-375 -1450) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) + rect(l2 (-375 -1450) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) ) net(3 name(OUT) rect(l8 (1110 5160) (180 180)) @@ -400,10 +400,10 @@ layout( rect(l8 (-180 370) (180 180)) rect(l11 (-240 -790) (300 4790)) rect(l11 (-151 -2501) (2 2)) - rect(l1 (-226 1049) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l5 (-450 -4890) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l2 (-226 1049) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l6 (-450 -4890) (425 950)) + rect(l6 (-400 -950) (425 950)) ) net(4 name(VSS) rect(l8 (410 1770) (180 180)) @@ -414,8 +414,8 @@ layout( rect(l11 (-650 -2160) (2400 800)) rect(l11 (-650 0) (300 1360)) rect(l11 (-1101 -1761) (2 2)) - rect(l5 (724 859) (425 950)) - rect(l5 (-1800 -950) (425 950)) + rect(l6 (724 859) (425 950)) + rect(l6 (-1800 -950) (425 950)) ) net(5 rect(l3 (-100 4500) (2600 3500)) @@ -486,27 +486,27 @@ layout( net(1 rect(l8 (4710 3010) (180 180)) rect(l11 (-850 -240) (610 300)) - rect(l1 (-1175 1800) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l5 (950 -4890) (425 950)) + rect(l2 (-1175 1800) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) ) net(2 rect(l8 (6510 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(3 rect(l8 (19110 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(4 rect(l8 (20910 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(5 name(FB) rect(l8 (22710 3010) (180 180)) @@ -520,8 +520,8 @@ layout( rect(l13 (-17921 -201) (2 2)) rect(l13 (-221 -201) (400 400)) rect(l13 (17740 -400) (400 400)) - rect(l1 (-245 850) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(6 name(VDD) rect(l3 (1100 4500) (1400 3500)) @@ -543,20 +543,20 @@ layout( rect(l11 (-750 -1450) (300 1400)) rect(l11 (-101 -351) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l1 (-23625 -2550) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l1 (1275 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (3175 -1500) (425 1500)) - rect(l1 (-2225 -1500) (425 1500)) - rect(l1 (3175 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (1375 -1500) (425 1500)) - rect(l1 (4550 -1500) (425 1500)) - rect(l1 (-1800 -1500) (425 1500)) - rect(l1 (-2225 -1500) (425 1500)) + rect(l2 (-23625 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (3175 -1500) (425 1500)) + rect(l2 (-2225 -1500) (425 1500)) + rect(l2 (3175 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (4550 -1500) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l2 (-2225 -1500) (425 1500)) rect(l9 (-19575 -450) (500 1500)) rect(l9 (22900 -1500) (500 1500)) ) @@ -565,10 +565,10 @@ layout( rect(l12 (-260 -260) (200 200)) rect(l13 (-101 -101) (2 2)) rect(l13 (-201 -201) (400 400)) - rect(l1 (-625 850) (425 1500)) - rect(l1 (-400 -1500) (425 1500)) - rect(l5 (-450 -4890) (425 950)) - rect(l5 (-400 -950) (425 950)) + rect(l2 (-625 850) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l6 (-450 -4890) (425 950)) + rect(l6 (-400 -950) (425 950)) ) net(8 name(ENABLE) rect(l8 (2510 3010) (180 180)) @@ -593,38 +593,58 @@ layout( rect(l11 (-750 -1450) (1200 800)) rect(l11 (-551 -401) (2 2)) rect(l11 (549 -401) (600 800)) - rect(l5 (-24300 460) (425 950)) - rect(l5 (1975 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (3175 -950) (425 950)) - rect(l5 (-2225 -950) (425 950)) - rect(l5 (3175 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (1375 -950) (425 950)) - rect(l5 (4550 -950) (425 950)) - rect(l5 (-1800 -950) (425 950)) - rect(l5 (-2225 -950) (425 950)) + rect(l6 (-24300 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (3175 -950) (425 950)) + rect(l6 (-2225 -950) (425 950)) + rect(l6 (3175 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (4550 -950) (425 950)) + rect(l6 (-1800 -950) (425 950)) + rect(l6 (-2225 -950) (425 950)) rect(l10 (-19575 -2210) (500 1500)) rect(l10 (22900 -1500) (500 1500)) ) net(10 rect(l8 (8310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) net(11 rect(l8 (17310 3010) (180 180)) rect(l11 (-1140 -240) (900 300)) - rect(l1 (-1275 1800) (425 1500)) - rect(l5 (-425 -4890) (425 950)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(12 + rect(l8 (10110 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(13 + rect(l8 (11910 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(14 + rect(l8 (13710 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(15 + rect(l8 (15510 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) ) - net(12) - net(13) - net(14) - net(15) # Outgoing pins and their connections to nets pin(5 name(FB)) @@ -1058,8 +1078,8 @@ xref( pin(5 5 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) device(2 2 match) + device(1 1 match) ) ) circuit(INVX2 INVX2 match @@ -1076,8 +1096,8 @@ xref( pin(5 5 match) pin(1 0 match) pin(3 2 match) - device(1 1 match) device(3 2 match) + device(1 1 match) ) ) circuit(ND2X1 ND2X1 match @@ -1097,10 +1117,10 @@ xref( pin(6 6 match) pin(0 0 match) pin(2 2 match) - device(1 1 match) - device(2 2 match) device(3 3 match) device(4 4 match) + device(1 1 match) + device(2 2 match) ) ) circuit(RINGO RINGO match @@ -1125,10 +1145,6 @@ xref( pin(2 4 match) pin(1 1 match) pin(4 0 match) - circuit(1 1 match) - circuit(5 10 match) - circuit(6 11 match) - circuit(7 12 match) circuit(2 2 match) circuit(3 3 match) circuit(17 4 match) @@ -1137,6 +1153,10 @@ xref( circuit(20 7 match) circuit(21 8 match) circuit(4 9 match) + circuit(5 10 match) + circuit(6 11 match) + circuit(7 12 match) + circuit(1 1 match) ) ) ) diff --git a/testdata/lvs/ringo_simple_simplification_with_align.cir b/testdata/lvs/ringo_simple_simplification_with_align.cir new file mode 100644 index 000000000..c24088217 --- /dev/null +++ b/testdata/lvs/ringo_simple_simplification_with_align.cir @@ -0,0 +1,102 @@ +* Extracted by KLayout + +* cell RINGO +* pin FB +* pin VDD +* pin OUT +* pin ENABLE +* pin VSS +.SUBCKT RINGO 5 6 7 8 9 +* net 5 FB +* net 6 VDD +* net 7 OUT +* net 8 ENABLE +* net 9 VSS +* cell instance $1 r0 *1 1.8,0 +X$1 6 1 9 6 5 8 9 ND2X1 +* cell instance $2 r0 *1 4.2,0 +X$2 6 2 9 6 1 9 INVX1 +* cell instance $3 r0 *1 6,0 +X$3 6 10 9 6 2 9 INVX1 +* cell instance $4 r0 *1 16.8,0 +X$4 6 3 9 6 11 9 INVX1 +* cell instance $5 r0 *1 18.6,0 +X$5 6 4 9 6 3 9 INVX1 +* cell instance $6 r0 *1 20.4,0 +X$6 6 5 9 6 4 9 INVX1 +* cell instance $7 r0 *1 22.2,0 +X$7 5 6 7 9 6 9 INVX2 +* cell instance $17 r0 *1 7.8,0 +X$17 6 12 9 6 10 9 INVX1 +* cell instance $18 r0 *1 9.6,0 +X$18 6 13 9 6 12 9 INVX1 +* cell instance $19 r0 *1 11.4,0 +X$19 6 14 9 6 13 9 INVX1 +* cell instance $20 r0 *1 13.2,0 +X$20 6 15 9 6 14 9 INVX1 +* cell instance $21 r0 *1 15,0 +X$21 6 11 9 6 15 9 INVX1 +.ENDS RINGO + +* cell INVX2 +* pin IN +* pin VDD +* pin OUT +* pin VSS +* pin +* pin SUBSTRATE +.SUBCKT INVX2 1 2 3 4 5 6 +* net 1 IN +* net 2 VDD +* net 3 OUT +* net 4 VSS +* net 6 SUBSTRATE +* device instance $1 r0 *1 0.85,5.8 PMOS +M$1 2 1 3 5 PMOS L=0.25U W=3U AS=0.975P AD=0.975P PS=5.8U PD=5.8U +* device instance $3 r0 *1 0.85,2.135 NMOS +M$3 4 1 3 6 NMOS L=0.25U W=1.9U AS=0.6175P AD=0.6175P PS=4.15U PD=4.15U +.ENDS INVX2 + +* cell INVX1 +* pin VDD +* pin OUT +* pin VSS +* pin +* pin IN +* pin SUBSTRATE +.SUBCKT INVX1 1 2 3 4 5 6 +* net 1 VDD +* net 2 OUT +* net 3 VSS +* net 5 IN +* net 6 SUBSTRATE +* device instance $1 r0 *1 0.85,5.8 PMOS +M$1 1 5 2 4 PMOS L=0.25U W=1.5U AS=0.6375P AD=0.6375P PS=3.85U PD=3.85U +* device instance $2 r0 *1 0.85,2.135 NMOS +M$2 3 5 2 6 NMOS L=0.25U W=0.95U AS=0.40375P AD=0.40375P PS=2.75U PD=2.75U +.ENDS INVX1 + +* cell ND2X1 +* pin VDD +* pin OUT +* pin VSS +* pin +* pin B +* pin A +* pin SUBSTRATE +.SUBCKT ND2X1 1 2 3 4 5 6 7 +* net 1 VDD +* net 2 OUT +* net 3 VSS +* net 5 B +* net 6 A +* net 7 SUBSTRATE +* device instance $1 r0 *1 0.85,5.8 PMOS +M$1 2 6 1 4 PMOS L=0.25U W=1.5U AS=0.6375P AD=0.3375P PS=3.85U PD=1.95U +* device instance $2 r0 *1 1.55,5.8 PMOS +M$2 1 5 2 4 PMOS L=0.25U W=1.5U AS=0.3375P AD=0.6375P PS=1.95U PD=3.85U +* device instance $3 r0 *1 0.85,2.135 NMOS +M$3 3 6 8 7 NMOS L=0.25U W=0.95U AS=0.40375P AD=0.21375P PS=2.75U PD=1.4U +* device instance $4 r0 *1 1.55,2.135 NMOS +M$4 8 5 2 7 NMOS L=0.25U W=0.95U AS=0.21375P AD=0.40375P PS=1.4U PD=2.75U +.ENDS ND2X1 diff --git a/testdata/lvs/ringo_simple_simplification_with_align.lvs b/testdata/lvs/ringo_simple_simplification_with_align.lvs new file mode 100644 index 000000000..4591cf3e6 --- /dev/null +++ b/testdata/lvs/ringo_simple_simplification_with_align.lvs @@ -0,0 +1,76 @@ + +source($lvs_test_source, "RINGO") + +report_lvs($lvs_test_target_lvsdb, true) + +target_netlist($lvs_test_target_cir, write_spice, "Extracted by KLayout") + +schematic("ringo_for_simplification.cir") + +deep + +# Drawing layers + +nwell = input(1, 0) +active = input(2, 0) +pplus = input(3, 0) +nplus = input(4, 0) +poly = input(5, 0) +contact = input(8, 0) +metal1 = input(9, 0) +via1 = input(10, 0) +metal2 = input(11, 0) + +# Bulk layer for terminal provisioning + +bulk = polygon_layer + +# Computed layers + +active_in_nwell = active & nwell +pactive = active_in_nwell & pplus +pgate = pactive & poly +psd = pactive - pgate +ntie = active_in_nwell & nplus + +active_outside_nwell = active - nwell +nactive = active_outside_nwell & nplus +ngate = nactive & poly +nsd = nactive - ngate +ptie = active_outside_nwell & pplus + +# Device extraction + +# PMOS transistor device extraction +extract_devices(mos4("PMOS"), { "SD" => psd, "G" => pgate, "W" => nwell, + "tS" => psd, "tD" => psd, "tG" => poly, "tW" => nwell }) + +# NMOS transistor device extraction +extract_devices(mos4("NMOS"), { "SD" => nsd, "G" => ngate, "W" => bulk, + "tS" => nsd, "tD" => nsd, "tG" => poly, "tW" => bulk }) + +# Define connectivity for netlist extraction + +# Inter-layer +connect(psd, contact) +connect(nsd, contact) +connect(poly, contact) +connect(ntie, contact) +connect(nwell, ntie) +connect(ptie, contact) +connect(contact, metal1) +connect(metal1, via1) +connect(via1, metal2) + +# Global +connect_global(bulk, "SUBSTRATE") +connect_global(ptie, "SUBSTRATE") + +# Compare section + +align + +netlist.simplify + +compare + diff --git a/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.1 b/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.1 new file mode 100644 index 000000000..b0e4b5871 --- /dev/null +++ b/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.1 @@ -0,0 +1,1162 @@ +#%lvsdb-klayout + +# Layout +layout( + top(RINGO) + unit(0.001) + + # Layer section + # This section lists the mask layers (drawing or derived) and their connections. + + # Mask layers + layer(l3 '1/0') + layer(l4 '5/0') + layer(l8 '8/0') + layer(l11 '9/0') + layer(l12 '10/0') + layer(l13 '11/0') + layer(l7) + layer(l2) + layer(l9) + layer(l6) + layer(l10) + + # Mask layer connectivity + connect(l3 l3 l9) + connect(l4 l4 l8) + connect(l8 l4 l8 l11 l2 l9 l6 l10) + connect(l11 l8 l11 l12) + connect(l12 l11 l12 l13) + connect(l13 l12 l13) + connect(l7 l7) + connect(l2 l8 l2) + connect(l9 l3 l8 l9) + connect(l6 l8 l6) + connect(l10 l8 l10) + + # Global nets and connectivity + global(l7 SUBSTRATE) + global(l10 SUBSTRATE) + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Device abstracts section + # Device abstracts list the pin shapes of the devices. + device(D$PMOS PMOS + terminal(S + rect(l2 (-550 -750) (425 1500)) + ) + terminal(G + rect(l4 (-125 -750) (250 1500)) + ) + terminal(D + rect(l2 (125 -750) (450 1500)) + ) + terminal(B + rect(l3 (-125 -750) (250 1500)) + ) + ) + device(D$PMOS$1 PMOS + terminal(S + rect(l2 (-575 -750) (450 1500)) + ) + terminal(G + rect(l4 (-125 -750) (250 1500)) + ) + terminal(D + rect(l2 (125 -750) (425 1500)) + ) + terminal(B + rect(l3 (-125 -750) (250 1500)) + ) + ) + device(D$PMOS$2 PMOS + terminal(S + rect(l2 (-550 -750) (425 1500)) + ) + terminal(G + rect(l4 (-125 -750) (250 1500)) + ) + terminal(D + rect(l2 (125 -750) (425 1500)) + ) + terminal(B + rect(l3 (-125 -750) (250 1500)) + ) + ) + device(D$NMOS NMOS + terminal(S + rect(l6 (-550 -475) (425 950)) + ) + terminal(G + rect(l4 (-125 -475) (250 950)) + ) + terminal(D + rect(l6 (125 -475) (450 950)) + ) + terminal(B + rect(l7 (-125 -475) (250 950)) + ) + ) + device(D$NMOS$1 NMOS + terminal(S + rect(l6 (-575 -475) (450 950)) + ) + terminal(G + rect(l4 (-125 -475) (250 950)) + ) + terminal(D + rect(l6 (125 -475) (425 950)) + ) + terminal(B + rect(l7 (-125 -475) (250 950)) + ) + ) + device(D$NMOS$2 NMOS + terminal(S + rect(l6 (-550 -475) (425 950)) + ) + terminal(G + rect(l4 (-125 -475) (250 950)) + ) + terminal(D + rect(l6 (125 -475) (425 950)) + ) + terminal(B + rect(l7 (-125 -475) (250 950)) + ) + ) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(ND2X1 + + # Circuit boundary + rect((-100 400) (2600 7600)) + + # Nets with their geometries + net(1 name(VDD) + rect(l8 (1110 5160) (180 180)) + rect(l8 (-180 920) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l11 (-240 -790) (300 1700)) + rect(l11 (-1350 0) (2400 800)) + rect(l11 (-1151 -401) (2 2)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + ) + net(2 name(OUT) + rect(l8 (1810 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (-1580 3760) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (1220 920) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (-180 370) (180 180)) + polygon(l11 (-240 -4180) (0 1390) (490 0) (0 -300) (-190 0) (0 -1090)) + rect(l11 (-110 1390) (300 1400)) + polygon(l11 (-1890 0) (0 600) (300 0) (0 -300) (1590 0) (0 -300)) + rect(l11 (-141 -501) (2 2)) + rect(l11 (-1751 1099) (300 1400)) + rect(l11 (1100 -1700) (300 300)) + rect(l11 (-300 0) (300 1400)) + rect(l2 (-1750 -1450) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(3 name(VSS) + rect(l8 (410 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -1300) (300 1360)) + rect(l11 (-650 -2160) (2400 800)) + rect(l11 (-1151 -401) (2 2)) + rect(l6 (-951 859) (425 950)) + ) + net(4 + rect(l3 (-100 4500) (2600 3500)) + ) + net(5 name(B) + rect(l4 (1425 2860) (250 1940)) + rect(l4 (-345 -950) (300 300)) + rect(l4 (-205 650) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-250 -5390) (250 1450)) + rect(l8 (-285 1050) (180 180)) + rect(l11 (-71 -91) (2 2)) + rect(l11 (-171 -151) (300 300)) + ) + net(6 name(A) + rect(l4 (725 2860) (250 1940)) + rect(l4 (-325 -1850) (300 300)) + rect(l4 (-225 1550) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-250 -5390) (250 1450)) + rect(l8 (-265 150) (180 180)) + rect(l11 (-91 -91) (2 2)) + rect(l11 (-151 -151) (300 300)) + ) + net(7 name(SUBSTRATE)) + net(8 + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) + ) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4) + pin(5 name(B)) + pin(6 name(A)) + pin(7 name(SUBSTRATE)) + + # Devices and their connections + device(1 D$PMOS + location(850 5800) + param(L 0.25) + param(W 1.5) + param(AS 0.6375) + param(AD 0.3375) + param(PS 3.85) + param(PD 1.95) + terminal(S 2) + terminal(G 6) + terminal(D 1) + terminal(B 4) + ) + device(2 D$PMOS$1 + location(1550 5800) + param(L 0.25) + param(W 1.5) + param(AS 0.3375) + param(AD 0.6375) + param(PS 1.95) + param(PD 3.85) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(3 D$NMOS + location(850 2135) + param(L 0.25) + param(W 0.95) + param(AS 0.40375) + param(AD 0.21375) + param(PS 2.75) + param(PD 1.4) + terminal(S 3) + terminal(G 6) + terminal(D 8) + terminal(B 7) + ) + device(4 D$NMOS$1 + location(1550 2135) + param(L 0.25) + param(W 0.95) + param(AS 0.21375) + param(AD 0.40375) + param(PS 1.4) + param(PD 2.75) + terminal(S 8) + terminal(G 5) + terminal(D 2) + terminal(B 7) + ) + + ) + circuit(INVX1 + + # Circuit boundary + rect((-100 400) (2000 7600)) + + # Nets with their geometries + net(1 name(VDD) + rect(l8 (410 6260) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l11 (-240 -240) (300 1400)) + rect(l11 (-650 300) (1800 800)) + rect(l11 (-1450 -1100) (300 300)) + rect(l11 (299 399) (2 2)) + rect(l2 (-651 -2151) (425 1500)) + ) + net(2 name(OUT) + rect(l8 (1110 5160) (180 180)) + rect(l8 (-180 920) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -4120) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -790) (300 4790)) + rect(l11 (-151 -2501) (2 2)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(3 name(VSS) + rect(l8 (410 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -1300) (300 1360)) + rect(l11 (-650 -2160) (1800 800)) + rect(l11 (-851 -401) (2 2)) + rect(l6 (-651 859) (425 950)) + ) + net(4 + rect(l3 (-100 4500) (2000 3500)) + ) + net(5 name(IN) + rect(l4 (725 2860) (250 1940)) + rect(l4 (-525 -1850) (300 300)) + rect(l4 (-25 1550) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-250 -5390) (250 1450)) + rect(l8 (-465 150) (180 180)) + rect(l11 (-91 -91) (2 2)) + rect(l11 (-151 -151) (300 300)) + ) + net(6 name(SUBSTRATE)) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4) + pin(5 name(IN)) + pin(6 name(SUBSTRATE)) + + # Devices and their connections + device(1 D$PMOS$2 + location(850 5800) + param(L 0.25) + param(W 1.5) + param(AS 0.6375) + param(AD 0.6375) + param(PS 3.85) + param(PD 3.85) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(2 D$NMOS$2 + location(850 2135) + param(L 0.25) + param(W 0.95) + param(AS 0.40375) + param(AD 0.40375) + param(PS 2.75) + param(PD 2.75) + terminal(S 3) + terminal(G 5) + terminal(D 2) + terminal(B 6) + ) + + ) + circuit(INVX2 + + # Circuit boundary + rect((-100 400) (2600 7600)) + + # Nets with their geometries + net(1 name(IN) + rect(l4 (725 2860) (250 1940)) + rect(l4 (-225 -1300) (675 450)) + rect(l4 (0 -1100) (250 1950)) + rect(l4 (-1225 -1850) (300 300)) + rect(l4 (675 1550) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-950 -2000) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (450 -5390) (250 1450)) + rect(l4 (-950 -1450) (250 1450)) + rect(l8 (-465 150) (180 180)) + rect(l11 (-91 -91) (2 2)) + rect(l11 (-151 -151) (300 300)) + ) + net(2 name(VDD) + rect(l8 (410 6260) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (1220 920) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l11 (-1640 -240) (300 1400)) + rect(l11 (-650 300) (2400 800)) + rect(l11 (-2050 -1100) (300 300)) + rect(l11 (1100 -300) (300 300)) + rect(l11 (-1101 399) (2 2)) + rect(l11 (799 -2101) (300 1400)) + rect(l2 (-1750 -1450) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + ) + net(3 name(OUT) + rect(l8 (1110 5160) (180 180)) + rect(l8 (-180 920) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -4120) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -790) (300 4790)) + rect(l11 (-151 -2501) (2 2)) + rect(l2 (-226 1049) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l6 (-450 -4890) (425 950)) + rect(l6 (-400 -950) (425 950)) + ) + net(4 name(VSS) + rect(l8 (410 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (1220 -730) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-1640 -1300) (300 1360)) + rect(l11 (-650 -2160) (2400 800)) + rect(l11 (-650 0) (300 1360)) + rect(l11 (-1101 -1761) (2 2)) + rect(l6 (-651 859) (425 950)) + rect(l6 (950 -950) (425 950)) + ) + net(5 + rect(l3 (-100 4500) (2600 3500)) + ) + net(6 name(SUBSTRATE)) + + # Outgoing pins and their connections to nets + pin(1 name(IN)) + pin(2 name(VDD)) + pin(3 name(OUT)) + pin(4 name(VSS)) + pin(5) + pin(6 name(SUBSTRATE)) + + # Devices and their connections + device(1 D$PMOS + device(D$PMOS$1 location(700 0)) + connect(0 S S) + connect(1 S D) + connect(0 G G) + connect(1 G G) + connect(0 D D) + connect(1 D S) + connect(0 B B) + connect(1 B B) + location(850 5800) + param(L 0.25) + param(W 3) + param(AS 0.975) + param(AD 0.975) + param(PS 5.8) + param(PD 5.8) + terminal(S 2) + terminal(G 1) + terminal(D 3) + terminal(B 5) + ) + device(3 D$NMOS + device(D$NMOS$1 location(700 0)) + connect(0 S S) + connect(1 S D) + connect(0 G G) + connect(1 G G) + connect(0 D D) + connect(1 D S) + connect(0 B B) + connect(1 B B) + location(850 2135) + param(L 0.25) + param(W 1.9) + param(AS 0.6175) + param(AD 0.6175) + param(PS 4.15) + param(PD 4.15) + terminal(S 4) + terminal(G 1) + terminal(D 3) + terminal(B 6) + ) + + ) + circuit(RINGO + + # Circuit boundary + rect((600 350) (25800 7650)) + + # Nets with their geometries + net(1 + rect(l8 (4710 3010) (180 180)) + rect(l11 (-850 -240) (610 300)) + rect(l2 (-2550 1800) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(2 + rect(l8 (6510 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(3 + rect(l8 (19110 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(4 + rect(l8 (20910 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(5 name(FB) + rect(l8 (22710 3010) (180 180)) + rect(l8 (-19700 720) (180 180)) + rect(l11 (18380 -1140) (900 300)) + rect(l11 (-19530 590) (320 320)) + rect(l11 (17820 -320) (320 320)) + rect(l12 (-18400 -260) (200 200)) + rect(l12 (17940 -200) (200 200)) + rect(l13 (-18040 -300) (17740 400)) + rect(l13 (-17921 -201) (2 2)) + rect(l13 (-221 -201) (400 400)) + rect(l13 (17740 -400) (400 400)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(6 name(VDD) + rect(l3 (1100 4500) (1400 3500)) + rect(l3 (-1900 -3500) (600 3500)) + rect(l3 (23300 -3500) (1400 3500)) + rect(l3 (-100 -3500) (600 3500)) + rect(l8 (-24690 -1240) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (23220 370) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l11 (-22341 859) (2 2)) + rect(l11 (-1751 -451) (1200 800)) + rect(l11 (-750 -1450) (300 1400)) + rect(l11 (-101 -351) (2 2)) + rect(l11 (-1251 -401) (600 800)) + rect(l11 (23400 -800) (1200 800)) + rect(l11 (-750 -1450) (300 1400)) + rect(l11 (-101 -351) (2 2)) + rect(l11 (549 -401) (600 800)) + rect(l2 (-23625 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (3175 -1500) (425 1500)) + rect(l2 (-2225 -1500) (425 1500)) + rect(l2 (3175 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (3175 -1500) (425 1500)) + rect(l2 (950 -1500) (425 1500)) + rect(l2 (-3600 -1500) (425 1500)) + rect(l9 (-19575 -450) (500 1500)) + rect(l9 (22900 -1500) (500 1500)) + ) + net(7 name(OUT) + rect(l11 (23440 3840) (320 320)) + rect(l12 (-260 -260) (200 200)) + rect(l13 (-101 -101) (2 2)) + rect(l13 (-201 -201) (400 400)) + rect(l2 (-625 850) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l6 (-450 -4890) (425 950)) + rect(l6 (-400 -950) (425 950)) + ) + net(8 name(ENABLE) + rect(l8 (2510 3010) (180 180)) + rect(l11 (-250 -250) (320 320)) + rect(l12 (-260 -260) (200 200)) + rect(l13 (-101 -101) (2 2)) + rect(l13 (-201 -201) (400 400)) + ) + net(9 name(VSS) + rect(l8 (1710 1610) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (23220 370) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-22341 -391) (2 2)) + rect(l11 (-1301 -401) (300 1400)) + rect(l11 (-750 -1450) (1200 800)) + rect(l11 (-551 -401) (2 2)) + rect(l11 (-1251 -401) (600 800)) + rect(l11 (23850 -750) (300 1400)) + rect(l11 (-750 -1450) (1200 800)) + rect(l11 (-551 -401) (2 2)) + rect(l11 (549 -401) (600 800)) + rect(l6 (-24300 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (3175 -950) (425 950)) + rect(l6 (-2225 -950) (425 950)) + rect(l6 (3175 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (3175 -950) (425 950)) + rect(l6 (950 -950) (425 950)) + rect(l6 (-3600 -950) (425 950)) + rect(l10 (-19575 -2210) (500 1500)) + rect(l10 (22900 -1500) (500 1500)) + ) + net(10 + rect(l8 (8310 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(11 + rect(l8 (17310 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(12 + rect(l8 (10110 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(13 + rect(l8 (11910 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(14 + rect(l8 (13710 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(15 + rect(l8 (15510 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + + # Outgoing pins and their connections to nets + pin(5 name(FB)) + pin(6 name(VDD)) + pin(7 name(OUT)) + pin(8 name(ENABLE)) + pin(9 name(VSS)) + + # Subcircuits and their connections + circuit(1 ND2X1 location(1800 0) + pin(0 6) + pin(1 1) + pin(2 9) + pin(3 6) + pin(4 5) + pin(5 8) + pin(6 9) + ) + circuit(2 INVX1 location(4200 0) + pin(0 6) + pin(1 2) + pin(2 9) + pin(3 6) + pin(4 1) + pin(5 9) + ) + circuit(3 INVX1 location(6000 0) + pin(0 6) + pin(1 10) + pin(2 9) + pin(3 6) + pin(4 2) + pin(5 9) + ) + circuit(4 INVX1 location(16800 0) + pin(0 6) + pin(1 3) + pin(2 9) + pin(3 6) + pin(4 11) + pin(5 9) + ) + circuit(5 INVX1 location(18600 0) + pin(0 6) + pin(1 4) + pin(2 9) + pin(3 6) + pin(4 3) + pin(5 9) + ) + circuit(6 INVX1 location(20400 0) + pin(0 6) + pin(1 5) + pin(2 9) + pin(3 6) + pin(4 4) + pin(5 9) + ) + circuit(7 INVX2 location(22200 0) + pin(0 5) + pin(1 6) + pin(2 7) + pin(3 9) + pin(4 6) + pin(5 9) + ) + circuit(17 INVX1 location(7800 0) + pin(0 6) + pin(1 12) + pin(2 9) + pin(3 6) + pin(4 10) + pin(5 9) + ) + circuit(18 INVX1 location(9600 0) + pin(0 6) + pin(1 13) + pin(2 9) + pin(3 6) + pin(4 12) + pin(5 9) + ) + circuit(19 INVX1 location(11400 0) + pin(0 6) + pin(1 14) + pin(2 9) + pin(3 6) + pin(4 13) + pin(5 9) + ) + circuit(20 INVX1 location(13200 0) + pin(0 6) + pin(1 15) + pin(2 9) + pin(3 6) + pin(4 14) + pin(5 9) + ) + circuit(21 INVX1 location(15000 0) + pin(0 6) + pin(1 11) + pin(2 9) + pin(3 6) + pin(4 15) + pin(5 9) + ) + + ) +) + +# Reference netlist +reference( + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(ND2X1 + + # Nets + net(1 name(VDD)) + net(2 name(OUT)) + net(3 name(VSS)) + net(4 name(NWELL)) + net(5 name(B)) + net(6 name(A)) + net(7 name(BULK)) + net(8 name('1')) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4 name(NWELL)) + pin(5 name(B)) + pin(6 name(A)) + pin(7 name(BULK)) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.25) + param(W 1.5) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 2) + terminal(G 6) + terminal(D 1) + terminal(B 4) + ) + device(2 PMOS + name($2) + param(L 0.25) + param(W 1.5) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(3 NMOS + name($3) + param(L 0.25) + param(W 0.95) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 3) + terminal(G 6) + terminal(D 8) + terminal(B 7) + ) + device(4 NMOS + name($4) + param(L 0.25) + param(W 0.95) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 8) + terminal(G 5) + terminal(D 2) + terminal(B 7) + ) + + ) + circuit(INVX1 + + # Nets + net(1 name(VDD)) + net(2 name(OUT)) + net(3 name(VSS)) + net(4 name(NWELL)) + net(5 name(IN)) + net(6 name(BULK)) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4 name(NWELL)) + pin(5 name(IN)) + pin(6 name(BULK)) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.25) + param(W 1.5) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(2 NMOS + name($2) + param(L 0.25) + param(W 0.95) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 3) + terminal(G 5) + terminal(D 2) + terminal(B 6) + ) + + ) + circuit(INVX2 + + # Nets + net(1 name(VDD)) + net(2 name(OUT)) + net(3 name(VSS)) + net(4 name(NWELL)) + net(5 name(IN)) + net(6 name(BULK)) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4 name(NWELL)) + pin(5 name(IN)) + pin(6 name(BULK)) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.25) + param(W 3) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(2 NMOS + name($2) + param(L 0.25) + param(W 1.9) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 3) + terminal(G 5) + terminal(D 2) + terminal(B 6) + ) + + ) + circuit(RINGO + + # Nets + net(1 name(VSS)) + net(2 name(VDD)) + net(3 name(FB)) + net(4 name(ENABLE)) + net(5 name(OUT)) + net(6 name('1')) + net(7 name('2')) + net(8 name('3')) + net(9 name('4')) + net(10 name('5')) + net(11 name('6')) + net(12 name('7')) + net(13 name('8')) + net(14 name('9')) + net(15 name('10')) + + # Outgoing pins and their connections to nets + pin(1 name(VSS)) + pin(2 name(VDD)) + pin(3 name(FB)) + pin(4 name(ENABLE)) + pin(5 name(OUT)) + + # Subcircuits and their connections + circuit(1 ND2X1 name($1) + pin(0 2) + pin(1 6) + pin(2 1) + pin(3 2) + pin(4 3) + pin(5 4) + pin(6 1) + ) + circuit(2 INVX1 name($2) + pin(0 2) + pin(1 7) + pin(2 1) + pin(3 2) + pin(4 6) + pin(5 1) + ) + circuit(3 INVX1 name($3) + pin(0 2) + pin(1 8) + pin(2 1) + pin(3 2) + pin(4 7) + pin(5 1) + ) + circuit(4 INVX1 name($4) + pin(0 2) + pin(1 9) + pin(2 1) + pin(3 2) + pin(4 8) + pin(5 1) + ) + circuit(5 INVX1 name($5) + pin(0 2) + pin(1 10) + pin(2 1) + pin(3 2) + pin(4 9) + pin(5 1) + ) + circuit(6 INVX1 name($6) + pin(0 2) + pin(1 11) + pin(2 1) + pin(3 2) + pin(4 10) + pin(5 1) + ) + circuit(7 INVX1 name($7) + pin(0 2) + pin(1 12) + pin(2 1) + pin(3 2) + pin(4 11) + pin(5 1) + ) + circuit(8 INVX1 name($8) + pin(0 2) + pin(1 13) + pin(2 1) + pin(3 2) + pin(4 12) + pin(5 1) + ) + circuit(9 INVX1 name($9) + pin(0 2) + pin(1 14) + pin(2 1) + pin(3 2) + pin(4 13) + pin(5 1) + ) + circuit(10 INVX1 name($10) + pin(0 2) + pin(1 15) + pin(2 1) + pin(3 2) + pin(4 14) + pin(5 1) + ) + circuit(11 INVX1 name($11) + pin(0 2) + pin(1 3) + pin(2 1) + pin(3 2) + pin(4 15) + pin(5 1) + ) + circuit(12 INVX2 name($12) + pin(0 2) + pin(1 5) + pin(2 1) + pin(3 2) + pin(4 3) + pin(5 1) + ) + + ) +) + +# Cross reference +xref( + circuit(INVX1 INVX1 match + xref( + net(4 4 match) + net(5 5 match) + net(2 2 match) + net(6 6 match) + net(1 1 match) + net(3 3 match) + pin(3 3 match) + pin(4 4 match) + pin(1 1 match) + pin(5 5 match) + pin(0 0 match) + pin(2 2 match) + device(2 2 match) + device(1 1 match) + ) + ) + circuit(INVX2 INVX2 match + xref( + net(5 4 match) + net(1 5 match) + net(3 2 match) + net(6 6 match) + net(2 1 match) + net(4 3 match) + pin(4 3 match) + pin(0 4 match) + pin(2 1 match) + pin(5 5 match) + pin(1 0 match) + pin(3 2 match) + device(3 2 match) + device(1 1 match) + ) + ) + circuit(ND2X1 ND2X1 match + xref( + net(8 8 match) + net(4 4 match) + net(6 6 match) + net(5 5 match) + net(2 2 match) + net(7 7 match) + net(1 1 match) + net(3 3 match) + pin(3 3 match) + pin(5 5 match) + pin(4 4 match) + pin(1 1 match) + pin(6 6 match) + pin(0 0 match) + pin(2 2 match) + device(3 3 match) + device(4 4 match) + device(1 1 match) + device(2 2 match) + ) + ) + circuit(RINGO RINGO match + xref( + net(1 6 match) + net(4 15 match) + net(2 7 match) + net(10 8 match) + net(12 9 match) + net(13 10 match) + net(14 11 match) + net(15 12 match) + net(11 13 match) + net(3 14 match) + net(8 4 match) + net(5 3 match) + net(7 5 match) + net(6 2 match) + net(9 1 match) + pin(3 3 match) + pin(0 2 match) + pin(2 4 match) + pin(1 1 match) + pin(4 0 match) + circuit(2 2 match) + circuit(3 3 match) + circuit(17 4 match) + circuit(18 5 match) + circuit(19 6 match) + circuit(20 7 match) + circuit(21 8 match) + circuit(4 9 match) + circuit(5 10 match) + circuit(6 11 match) + circuit(7 12 match) + circuit(1 1 match) + ) + ) +) diff --git a/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.2 b/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.2 new file mode 100644 index 000000000..2492067a3 --- /dev/null +++ b/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.2 @@ -0,0 +1,1162 @@ +#%lvsdb-klayout + +# Layout +layout( + top(RINGO) + unit(0.001) + + # Layer section + # This section lists the mask layers (drawing or derived) and their connections. + + # Mask layers + layer(l3 '1/0') + layer(l4 '5/0') + layer(l8 '8/0') + layer(l11 '9/0') + layer(l12 '10/0') + layer(l13 '11/0') + layer(l7) + layer(l2) + layer(l9) + layer(l6) + layer(l10) + + # Mask layer connectivity + connect(l3 l3 l9) + connect(l4 l4 l8) + connect(l8 l4 l8 l11 l2 l9 l6 l10) + connect(l11 l8 l11 l12) + connect(l12 l11 l12 l13) + connect(l13 l12 l13) + connect(l7 l7) + connect(l2 l8 l2) + connect(l9 l3 l8 l9) + connect(l6 l8 l6) + connect(l10 l8 l10) + + # Global nets and connectivity + global(l7 SUBSTRATE) + global(l10 SUBSTRATE) + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Device abstracts section + # Device abstracts list the pin shapes of the devices. + device(D$PMOS PMOS + terminal(S + rect(l2 (-550 -750) (425 1500)) + ) + terminal(G + rect(l4 (-125 -750) (250 1500)) + ) + terminal(D + rect(l2 (125 -750) (450 1500)) + ) + terminal(B + rect(l3 (-125 -750) (250 1500)) + ) + ) + device(D$PMOS$1 PMOS + terminal(S + rect(l2 (-575 -750) (450 1500)) + ) + terminal(G + rect(l4 (-125 -750) (250 1500)) + ) + terminal(D + rect(l2 (125 -750) (425 1500)) + ) + terminal(B + rect(l3 (-125 -750) (250 1500)) + ) + ) + device(D$PMOS$2 PMOS + terminal(S + rect(l2 (-550 -750) (425 1500)) + ) + terminal(G + rect(l4 (-125 -750) (250 1500)) + ) + terminal(D + rect(l2 (125 -750) (425 1500)) + ) + terminal(B + rect(l3 (-125 -750) (250 1500)) + ) + ) + device(D$NMOS NMOS + terminal(S + rect(l6 (-550 -475) (425 950)) + ) + terminal(G + rect(l4 (-125 -475) (250 950)) + ) + terminal(D + rect(l6 (125 -475) (450 950)) + ) + terminal(B + rect(l7 (-125 -475) (250 950)) + ) + ) + device(D$NMOS$1 NMOS + terminal(S + rect(l6 (-575 -475) (450 950)) + ) + terminal(G + rect(l4 (-125 -475) (250 950)) + ) + terminal(D + rect(l6 (125 -475) (425 950)) + ) + terminal(B + rect(l7 (-125 -475) (250 950)) + ) + ) + device(D$NMOS$2 NMOS + terminal(S + rect(l6 (-550 -475) (425 950)) + ) + terminal(G + rect(l4 (-125 -475) (250 950)) + ) + terminal(D + rect(l6 (125 -475) (425 950)) + ) + terminal(B + rect(l7 (-125 -475) (250 950)) + ) + ) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(ND2X1 + + # Circuit boundary + rect((-100 400) (2600 7600)) + + # Nets with their geometries + net(1 name(VDD) + rect(l8 (1110 5160) (180 180)) + rect(l8 (-180 920) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l11 (-240 -790) (300 1700)) + rect(l11 (-1350 0) (2400 800)) + rect(l11 (-1151 -401) (2 2)) + rect(l2 (-276 -2151) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + ) + net(2 name(OUT) + rect(l8 (1810 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (-1580 3760) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (1220 920) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (-180 370) (180 180)) + polygon(l11 (-240 -4180) (0 1390) (490 0) (0 -300) (-190 0) (0 -1090)) + rect(l11 (-110 1390) (300 1400)) + polygon(l11 (-1890 0) (0 600) (300 0) (0 -300) (1590 0) (0 -300)) + rect(l11 (-141 -501) (2 2)) + rect(l11 (-1751 1099) (300 1400)) + rect(l11 (1100 -1700) (300 300)) + rect(l11 (-300 0) (300 1400)) + rect(l2 (-375 -1450) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) + ) + net(3 name(VSS) + rect(l8 (410 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -1300) (300 1360)) + rect(l11 (-650 -2160) (2400 800)) + rect(l11 (-1151 -401) (2 2)) + rect(l6 (-951 859) (425 950)) + ) + net(4 + rect(l3 (-100 4500) (2600 3500)) + ) + net(5 name(B) + rect(l4 (1425 2860) (250 1940)) + rect(l4 (-345 -950) (300 300)) + rect(l4 (-205 650) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-250 -5390) (250 1450)) + rect(l8 (-285 1050) (180 180)) + rect(l11 (-71 -91) (2 2)) + rect(l11 (-171 -151) (300 300)) + ) + net(6 name(A) + rect(l4 (725 2860) (250 1940)) + rect(l4 (-325 -1850) (300 300)) + rect(l4 (-225 1550) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-250 -5390) (250 1450)) + rect(l8 (-265 150) (180 180)) + rect(l11 (-91 -91) (2 2)) + rect(l11 (-151 -151) (300 300)) + ) + net(7 name(SUBSTRATE)) + net(8 + rect(l6 (975 1660) (425 950)) + rect(l6 (-400 -950) (425 950)) + ) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4) + pin(5 name(B)) + pin(6 name(A)) + pin(7 name(SUBSTRATE)) + + # Devices and their connections + device(1 D$PMOS + location(850 5800) + param(L 0.25) + param(W 1.5) + param(AS 0.6375) + param(AD 0.3375) + param(PS 3.85) + param(PD 1.95) + terminal(S 2) + terminal(G 6) + terminal(D 1) + terminal(B 4) + ) + device(2 D$PMOS$1 + location(1550 5800) + param(L 0.25) + param(W 1.5) + param(AS 0.3375) + param(AD 0.6375) + param(PS 1.95) + param(PD 3.85) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(3 D$NMOS + location(850 2135) + param(L 0.25) + param(W 0.95) + param(AS 0.40375) + param(AD 0.21375) + param(PS 2.75) + param(PD 1.4) + terminal(S 3) + terminal(G 6) + terminal(D 8) + terminal(B 7) + ) + device(4 D$NMOS$1 + location(1550 2135) + param(L 0.25) + param(W 0.95) + param(AS 0.21375) + param(AD 0.40375) + param(PS 1.4) + param(PD 2.75) + terminal(S 8) + terminal(G 5) + terminal(D 2) + terminal(B 7) + ) + + ) + circuit(INVX1 + + # Circuit boundary + rect((-100 400) (2000 7600)) + + # Nets with their geometries + net(1 name(VDD) + rect(l8 (410 6260) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l11 (-240 -240) (300 1400)) + rect(l11 (-650 300) (1800 800)) + rect(l11 (-1450 -1100) (300 300)) + rect(l11 (299 399) (2 2)) + rect(l2 (-651 -2151) (425 1500)) + ) + net(2 name(OUT) + rect(l8 (1110 5160) (180 180)) + rect(l8 (-180 920) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -4120) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -790) (300 4790)) + rect(l11 (-151 -2501) (2 2)) + rect(l2 (-226 1049) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(3 name(VSS) + rect(l8 (410 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -1300) (300 1360)) + rect(l11 (-650 -2160) (1800 800)) + rect(l11 (-851 -401) (2 2)) + rect(l6 (-651 859) (425 950)) + ) + net(4 + rect(l3 (-100 4500) (2000 3500)) + ) + net(5 name(IN) + rect(l4 (725 2860) (250 1940)) + rect(l4 (-525 -1850) (300 300)) + rect(l4 (-25 1550) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-250 -5390) (250 1450)) + rect(l8 (-465 150) (180 180)) + rect(l11 (-91 -91) (2 2)) + rect(l11 (-151 -151) (300 300)) + ) + net(6 name(SUBSTRATE)) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4) + pin(5 name(IN)) + pin(6 name(SUBSTRATE)) + + # Devices and their connections + device(1 D$PMOS$2 + location(850 5800) + param(L 0.25) + param(W 1.5) + param(AS 0.6375) + param(AD 0.6375) + param(PS 3.85) + param(PD 3.85) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(2 D$NMOS$2 + location(850 2135) + param(L 0.25) + param(W 0.95) + param(AS 0.40375) + param(AD 0.40375) + param(PS 2.75) + param(PD 2.75) + terminal(S 3) + terminal(G 5) + terminal(D 2) + terminal(B 6) + ) + + ) + circuit(INVX2 + + # Circuit boundary + rect((-100 400) (2600 7600)) + + # Nets with their geometries + net(1 name(IN) + rect(l4 (725 2860) (250 1940)) + rect(l4 (-225 -1300) (675 450)) + rect(l4 (0 -1100) (250 1950)) + rect(l4 (-1225 -1850) (300 300)) + rect(l4 (675 1550) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (-950 -2000) (250 2000)) + rect(l4 (-250 -2000) (250 2000)) + rect(l4 (450 -5390) (250 1450)) + rect(l4 (-950 -1450) (250 1450)) + rect(l8 (-465 150) (180 180)) + rect(l11 (-91 -91) (2 2)) + rect(l11 (-151 -151) (300 300)) + ) + net(2 name(VDD) + rect(l8 (410 6260) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (1220 920) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l11 (-1640 -240) (300 1400)) + rect(l11 (-650 300) (2400 800)) + rect(l11 (-2050 -1100) (300 300)) + rect(l11 (1100 -300) (300 300)) + rect(l11 (-1101 399) (2 2)) + rect(l11 (799 -2101) (300 1400)) + rect(l2 (-375 -1450) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + ) + net(3 name(OUT) + rect(l8 (1110 5160) (180 180)) + rect(l8 (-180 920) (180 180)) + rect(l8 (-180 -730) (180 180)) + rect(l8 (-180 -4120) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-240 -790) (300 4790)) + rect(l11 (-151 -2501) (2 2)) + rect(l2 (-226 1049) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l6 (-450 -4890) (425 950)) + rect(l6 (-400 -950) (425 950)) + ) + net(4 name(VSS) + rect(l8 (410 1770) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (1220 -730) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-1640 -1300) (300 1360)) + rect(l11 (-650 -2160) (2400 800)) + rect(l11 (-650 0) (300 1360)) + rect(l11 (-1101 -1761) (2 2)) + rect(l6 (724 859) (425 950)) + rect(l6 (-1800 -950) (425 950)) + ) + net(5 + rect(l3 (-100 4500) (2600 3500)) + ) + net(6 name(SUBSTRATE)) + + # Outgoing pins and their connections to nets + pin(1 name(IN)) + pin(2 name(VDD)) + pin(3 name(OUT)) + pin(4 name(VSS)) + pin(5) + pin(6 name(SUBSTRATE)) + + # Devices and their connections + device(1 D$PMOS + device(D$PMOS$1 location(700 0)) + connect(0 S S) + connect(1 S D) + connect(0 G G) + connect(1 G G) + connect(0 D D) + connect(1 D S) + connect(0 B B) + connect(1 B B) + location(850 5800) + param(L 0.25) + param(W 3) + param(AS 0.975) + param(AD 0.975) + param(PS 5.8) + param(PD 5.8) + terminal(S 2) + terminal(G 1) + terminal(D 3) + terminal(B 5) + ) + device(3 D$NMOS + device(D$NMOS$1 location(700 0)) + connect(0 S S) + connect(1 S D) + connect(0 G G) + connect(1 G G) + connect(0 D D) + connect(1 D S) + connect(0 B B) + connect(1 B B) + location(850 2135) + param(L 0.25) + param(W 1.9) + param(AS 0.6175) + param(AD 0.6175) + param(PS 4.15) + param(PD 4.15) + terminal(S 4) + terminal(G 1) + terminal(D 3) + terminal(B 6) + ) + + ) + circuit(RINGO + + # Circuit boundary + rect((600 350) (25800 7650)) + + # Nets with their geometries + net(1 + rect(l8 (4710 3010) (180 180)) + rect(l11 (-850 -240) (610 300)) + rect(l2 (-1175 1800) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l6 (950 -4890) (425 950)) + ) + net(2 + rect(l8 (6510 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(3 + rect(l8 (19110 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(4 + rect(l8 (20910 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(5 name(FB) + rect(l8 (22710 3010) (180 180)) + rect(l8 (-19700 720) (180 180)) + rect(l11 (18380 -1140) (900 300)) + rect(l11 (-19530 590) (320 320)) + rect(l11 (17820 -320) (320 320)) + rect(l12 (-18400 -260) (200 200)) + rect(l12 (17940 -200) (200 200)) + rect(l13 (-18040 -300) (17740 400)) + rect(l13 (-17921 -201) (2 2)) + rect(l13 (-221 -201) (400 400)) + rect(l13 (17740 -400) (400 400)) + rect(l2 (-245 850) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(6 name(VDD) + rect(l3 (1100 4500) (1400 3500)) + rect(l3 (-1900 -3500) (600 3500)) + rect(l3 (23300 -3500) (1400 3500)) + rect(l3 (-100 -3500) (600 3500)) + rect(l8 (-24690 -1240) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (23220 370) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l11 (-22341 859) (2 2)) + rect(l11 (-1751 -451) (1200 800)) + rect(l11 (-750 -1450) (300 1400)) + rect(l11 (-101 -351) (2 2)) + rect(l11 (-1251 -401) (600 800)) + rect(l11 (23400 -800) (1200 800)) + rect(l11 (-750 -1450) (300 1400)) + rect(l11 (-101 -351) (2 2)) + rect(l11 (549 -401) (600 800)) + rect(l2 (-23625 -2550) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l2 (1275 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (3175 -1500) (425 1500)) + rect(l2 (-2225 -1500) (425 1500)) + rect(l2 (3175 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (1375 -1500) (425 1500)) + rect(l2 (4550 -1500) (425 1500)) + rect(l2 (-1800 -1500) (425 1500)) + rect(l2 (-2225 -1500) (425 1500)) + rect(l9 (-19575 -450) (500 1500)) + rect(l9 (22900 -1500) (500 1500)) + ) + net(7 name(OUT) + rect(l11 (23440 3840) (320 320)) + rect(l12 (-260 -260) (200 200)) + rect(l13 (-101 -101) (2 2)) + rect(l13 (-201 -201) (400 400)) + rect(l2 (-625 850) (425 1500)) + rect(l2 (-400 -1500) (425 1500)) + rect(l6 (-450 -4890) (425 950)) + rect(l6 (-400 -950) (425 950)) + ) + net(8 name(ENABLE) + rect(l8 (2510 3010) (180 180)) + rect(l11 (-250 -250) (320 320)) + rect(l12 (-260 -260) (200 200)) + rect(l13 (-101 -101) (2 2)) + rect(l13 (-201 -201) (400 400)) + ) + net(9 name(VSS) + rect(l8 (1710 1610) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l8 (23220 370) (180 180)) + rect(l8 (-180 -1280) (180 180)) + rect(l8 (-180 370) (180 180)) + rect(l11 (-22341 -391) (2 2)) + rect(l11 (-1301 -401) (300 1400)) + rect(l11 (-750 -1450) (1200 800)) + rect(l11 (-551 -401) (2 2)) + rect(l11 (-1251 -401) (600 800)) + rect(l11 (23850 -750) (300 1400)) + rect(l11 (-750 -1450) (1200 800)) + rect(l11 (-551 -401) (2 2)) + rect(l11 (549 -401) (600 800)) + rect(l6 (-24300 460) (425 950)) + rect(l6 (1975 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (3175 -950) (425 950)) + rect(l6 (-2225 -950) (425 950)) + rect(l6 (3175 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (1375 -950) (425 950)) + rect(l6 (4550 -950) (425 950)) + rect(l6 (-1800 -950) (425 950)) + rect(l6 (-2225 -950) (425 950)) + rect(l10 (-19575 -2210) (500 1500)) + rect(l10 (22900 -1500) (500 1500)) + ) + net(10 + rect(l8 (8310 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(11 + rect(l8 (17310 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(12 + rect(l8 (10110 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(13 + rect(l8 (11910 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(14 + rect(l8 (13710 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + net(15 + rect(l8 (15510 3010) (180 180)) + rect(l11 (-1140 -240) (900 300)) + rect(l2 (-1275 1800) (425 1500)) + rect(l6 (-425 -4890) (425 950)) + ) + + # Outgoing pins and their connections to nets + pin(5 name(FB)) + pin(6 name(VDD)) + pin(7 name(OUT)) + pin(8 name(ENABLE)) + pin(9 name(VSS)) + + # Subcircuits and their connections + circuit(1 ND2X1 location(1800 0) + pin(0 6) + pin(1 1) + pin(2 9) + pin(3 6) + pin(4 5) + pin(5 8) + pin(6 9) + ) + circuit(2 INVX1 location(4200 0) + pin(0 6) + pin(1 2) + pin(2 9) + pin(3 6) + pin(4 1) + pin(5 9) + ) + circuit(3 INVX1 location(6000 0) + pin(0 6) + pin(1 10) + pin(2 9) + pin(3 6) + pin(4 2) + pin(5 9) + ) + circuit(4 INVX1 location(16800 0) + pin(0 6) + pin(1 3) + pin(2 9) + pin(3 6) + pin(4 11) + pin(5 9) + ) + circuit(5 INVX1 location(18600 0) + pin(0 6) + pin(1 4) + pin(2 9) + pin(3 6) + pin(4 3) + pin(5 9) + ) + circuit(6 INVX1 location(20400 0) + pin(0 6) + pin(1 5) + pin(2 9) + pin(3 6) + pin(4 4) + pin(5 9) + ) + circuit(7 INVX2 location(22200 0) + pin(0 5) + pin(1 6) + pin(2 7) + pin(3 9) + pin(4 6) + pin(5 9) + ) + circuit(17 INVX1 location(7800 0) + pin(0 6) + pin(1 12) + pin(2 9) + pin(3 6) + pin(4 10) + pin(5 9) + ) + circuit(18 INVX1 location(9600 0) + pin(0 6) + pin(1 13) + pin(2 9) + pin(3 6) + pin(4 12) + pin(5 9) + ) + circuit(19 INVX1 location(11400 0) + pin(0 6) + pin(1 14) + pin(2 9) + pin(3 6) + pin(4 13) + pin(5 9) + ) + circuit(20 INVX1 location(13200 0) + pin(0 6) + pin(1 15) + pin(2 9) + pin(3 6) + pin(4 14) + pin(5 9) + ) + circuit(21 INVX1 location(15000 0) + pin(0 6) + pin(1 11) + pin(2 9) + pin(3 6) + pin(4 15) + pin(5 9) + ) + + ) +) + +# Reference netlist +reference( + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(ND2X1 + + # Nets + net(1 name(VDD)) + net(2 name(OUT)) + net(3 name(VSS)) + net(4 name(NWELL)) + net(5 name(B)) + net(6 name(A)) + net(7 name(BULK)) + net(8 name('1')) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4 name(NWELL)) + pin(5 name(B)) + pin(6 name(A)) + pin(7 name(BULK)) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.25) + param(W 1.5) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 2) + terminal(G 6) + terminal(D 1) + terminal(B 4) + ) + device(2 PMOS + name($2) + param(L 0.25) + param(W 1.5) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(3 NMOS + name($3) + param(L 0.25) + param(W 0.95) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 3) + terminal(G 6) + terminal(D 8) + terminal(B 7) + ) + device(4 NMOS + name($4) + param(L 0.25) + param(W 0.95) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 8) + terminal(G 5) + terminal(D 2) + terminal(B 7) + ) + + ) + circuit(INVX1 + + # Nets + net(1 name(VDD)) + net(2 name(OUT)) + net(3 name(VSS)) + net(4 name(NWELL)) + net(5 name(IN)) + net(6 name(BULK)) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4 name(NWELL)) + pin(5 name(IN)) + pin(6 name(BULK)) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.25) + param(W 1.5) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(2 NMOS + name($2) + param(L 0.25) + param(W 0.95) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 3) + terminal(G 5) + terminal(D 2) + terminal(B 6) + ) + + ) + circuit(INVX2 + + # Nets + net(1 name(VDD)) + net(2 name(OUT)) + net(3 name(VSS)) + net(4 name(NWELL)) + net(5 name(IN)) + net(6 name(BULK)) + + # Outgoing pins and their connections to nets + pin(1 name(VDD)) + pin(2 name(OUT)) + pin(3 name(VSS)) + pin(4 name(NWELL)) + pin(5 name(IN)) + pin(6 name(BULK)) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.25) + param(W 3) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 1) + terminal(G 5) + terminal(D 2) + terminal(B 4) + ) + device(2 NMOS + name($2) + param(L 0.25) + param(W 1.9) + param(AS 0) + param(AD 0) + param(PS 0) + param(PD 0) + terminal(S 3) + terminal(G 5) + terminal(D 2) + terminal(B 6) + ) + + ) + circuit(RINGO + + # Nets + net(1 name(VSS)) + net(2 name(VDD)) + net(3 name(FB)) + net(4 name(ENABLE)) + net(5 name(OUT)) + net(6 name('1')) + net(7 name('2')) + net(8 name('3')) + net(9 name('4')) + net(10 name('5')) + net(11 name('6')) + net(12 name('7')) + net(13 name('8')) + net(14 name('9')) + net(15 name('10')) + + # Outgoing pins and their connections to nets + pin(1 name(VSS)) + pin(2 name(VDD)) + pin(3 name(FB)) + pin(4 name(ENABLE)) + pin(5 name(OUT)) + + # Subcircuits and their connections + circuit(1 ND2X1 name($1) + pin(0 2) + pin(1 6) + pin(2 1) + pin(3 2) + pin(4 3) + pin(5 4) + pin(6 1) + ) + circuit(2 INVX1 name($2) + pin(0 2) + pin(1 7) + pin(2 1) + pin(3 2) + pin(4 6) + pin(5 1) + ) + circuit(3 INVX1 name($3) + pin(0 2) + pin(1 8) + pin(2 1) + pin(3 2) + pin(4 7) + pin(5 1) + ) + circuit(4 INVX1 name($4) + pin(0 2) + pin(1 9) + pin(2 1) + pin(3 2) + pin(4 8) + pin(5 1) + ) + circuit(5 INVX1 name($5) + pin(0 2) + pin(1 10) + pin(2 1) + pin(3 2) + pin(4 9) + pin(5 1) + ) + circuit(6 INVX1 name($6) + pin(0 2) + pin(1 11) + pin(2 1) + pin(3 2) + pin(4 10) + pin(5 1) + ) + circuit(7 INVX1 name($7) + pin(0 2) + pin(1 12) + pin(2 1) + pin(3 2) + pin(4 11) + pin(5 1) + ) + circuit(8 INVX1 name($8) + pin(0 2) + pin(1 13) + pin(2 1) + pin(3 2) + pin(4 12) + pin(5 1) + ) + circuit(9 INVX1 name($9) + pin(0 2) + pin(1 14) + pin(2 1) + pin(3 2) + pin(4 13) + pin(5 1) + ) + circuit(10 INVX1 name($10) + pin(0 2) + pin(1 15) + pin(2 1) + pin(3 2) + pin(4 14) + pin(5 1) + ) + circuit(11 INVX1 name($11) + pin(0 2) + pin(1 3) + pin(2 1) + pin(3 2) + pin(4 15) + pin(5 1) + ) + circuit(12 INVX2 name($12) + pin(0 2) + pin(1 5) + pin(2 1) + pin(3 2) + pin(4 3) + pin(5 1) + ) + + ) +) + +# Cross reference +xref( + circuit(INVX1 INVX1 match + xref( + net(4 4 match) + net(5 5 match) + net(2 2 match) + net(6 6 match) + net(1 1 match) + net(3 3 match) + pin(3 3 match) + pin(4 4 match) + pin(1 1 match) + pin(5 5 match) + pin(0 0 match) + pin(2 2 match) + device(2 2 match) + device(1 1 match) + ) + ) + circuit(INVX2 INVX2 match + xref( + net(5 4 match) + net(1 5 match) + net(3 2 match) + net(6 6 match) + net(2 1 match) + net(4 3 match) + pin(4 3 match) + pin(0 4 match) + pin(2 1 match) + pin(5 5 match) + pin(1 0 match) + pin(3 2 match) + device(3 2 match) + device(1 1 match) + ) + ) + circuit(ND2X1 ND2X1 match + xref( + net(8 8 match) + net(4 4 match) + net(6 6 match) + net(5 5 match) + net(2 2 match) + net(7 7 match) + net(1 1 match) + net(3 3 match) + pin(3 3 match) + pin(5 5 match) + pin(4 4 match) + pin(1 1 match) + pin(6 6 match) + pin(0 0 match) + pin(2 2 match) + device(3 3 match) + device(4 4 match) + device(1 1 match) + device(2 2 match) + ) + ) + circuit(RINGO RINGO match + xref( + net(1 6 match) + net(4 15 match) + net(2 7 match) + net(10 8 match) + net(12 9 match) + net(13 10 match) + net(14 11 match) + net(15 12 match) + net(11 13 match) + net(3 14 match) + net(8 4 match) + net(5 3 match) + net(7 5 match) + net(6 2 match) + net(9 1 match) + pin(3 3 match) + pin(0 2 match) + pin(2 4 match) + pin(1 1 match) + pin(4 0 match) + circuit(2 2 match) + circuit(3 3 match) + circuit(17 4 match) + circuit(18 5 match) + circuit(19 6 match) + circuit(20 7 match) + circuit(21 8 match) + circuit(4 9 match) + circuit(5 10 match) + circuit(6 11 match) + circuit(7 12 match) + circuit(1 1 match) + ) + ) +) diff --git a/testdata/lvs/vexriscv_align.lvs b/testdata/lvs/vexriscv_align.lvs new file mode 100644 index 000000000..194924b80 --- /dev/null +++ b/testdata/lvs/vexriscv_align.lvs @@ -0,0 +1,111 @@ + +source($lvs_test_source) + +# will get pretty big: +# report_lvs($lvs_test_target_lvsdb, true) + +target_netlist($lvs_test_target_cir, write_spice(true), "Extracted by KLayout") + +schematic("vexriscv_schematic.cir.gz") + +deep + +# Drawing layers + +nwell = input(1, 0) +pactive = input(4, 0) +nactive = input(3, 0) +ntie = input(5, 0) +ptie = input(6, 0) + +poly = input(7, 0) +cont = input(10, 0) +metal1 = input(11, 0) +via1 = input(14, 0) +metal2 = input(16, 0) +via2 = input(18, 0) +metal3 = input(19, 0) +via3 = input(21, 0) +metal4 = input(22, 0) +via4 = input(25, 0) +metal5 = input(26, 0) + +# Bulk layer for terminal provisioning + +bulk = polygon_layer + +# Computed layers + +poly_cont = cont & poly +diff_cont = cont - poly + +pgate = pactive & poly +psd = pactive - pgate + +ngate = nactive & poly +nsd = nactive - ngate + +# Device extraction + +# PMOS transistor device extraction +extract_devices(mos4("PMOS"), { "SD" => psd, "G" => pgate, "W" => nwell, + "tS" => psd, "tD" => psd, "tG" => poly, "tW" => nwell }) + +# NMOS transistor device extraction +extract_devices(mos4("NMOS"), { "SD" => nsd, "G" => ngate, "W" => bulk, + "tS" => nsd, "tD" => nsd, "tG" => poly, "tW" => bulk }) + +# Define connectivity for netlist extraction + +# Inter-layer +connect(psd, diff_cont) +connect(nsd, diff_cont) +connect(poly, poly_cont) +connect(poly_cont, metal1) +connect(diff_cont, metal1) +connect(diff_cont, ntie) +connect(diff_cont, ptie) +connect(nwell, ntie) +connect(metal1, via1) +connect(via1, metal2) +connect(metal2, via2) +connect(via2, metal3) +connect(metal3, via3) +connect(via3, metal4) +connect(metal4, via4) +connect(via4, metal5) + +# Global +connect_global(ptie, "BULK") +connect_global(bulk, "BULK") + +# Implicit +connect_implicit("VDD") +connect_implicit("VSS") + +# Compare section + +same_device_classes("PMOS", "TP") +same_device_classes("NMOS", "TN") + +# Ignore all caps from the schematic +same_device_classes(nil, "CAP") + +# Increase the default complexity from 100 to 200 +# This is required because the clock tree is incorrect and exhibits manifold ambiguities +# (the netlists are just samples, not necessarily functional). +# The algorithm needs enough freedom to follow all these branches and different variants. +max_branch_complexity(200) + +schematic.combine_devices + +netlist.combine_devices + +align + +if ! compare + raise "Netlists don't match" +else + puts "Congratulations! Netlists match." +end + diff --git a/testdata/ruby/dbNetlistCompare.rb b/testdata/ruby/dbNetlistCompare.rb index 4b383acc6..be77f5bb4 100644 --- a/testdata/ruby/dbNetlistCompare.rb +++ b/testdata/ruby/dbNetlistCompare.rb @@ -954,8 +954,8 @@ match_pins $2 $0 match_pins $3 $2 match_devices $3 $1 match_devices_with_different_parameters $2 $2 -device_mismatch (null) $3 match_devices $1 $4 +device_mismatch (null) $3 end_circuit INV INV NOMATCH END