From 5b0e9f146f54b35af4c47b10b29a35bbca52ac25 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Tue, 23 Dec 2025 18:46:08 +0100 Subject: [PATCH 01/19] Fixing issue #2252 (internal error on netlist compare) --- src/db/db/dbNetlistCompare.cc | 43 +++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/db/db/dbNetlistCompare.cc b/src/db/db/dbNetlistCompare.cc index b9ffa9cd6..9349ae896 100644 --- a/src/db/db/dbNetlistCompare.cc +++ b/src/db/db/dbNetlistCompare.cc @@ -1862,34 +1862,37 @@ NetlistComparer::do_subcircuit_assignment (const db::Circuit *c1, const db::NetG } 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 ()); + } else if (i->first.size () == j->first.size ()) { - while (i != unmatched_a.end () && i->first.size () == n) { - ++i; - } + unmatched_list::iterator ii = i, jj = j; + ++i, ++j; + size_t n = ii->first.size (); - while (j != unmatched_b.end () && j->first.size () == n) { - ++j; - } + while (i != unmatched_a.end () && i->first.size () == n) { + ++i; + } - align (ii, i, jj, j, KeyDistance ()); + while (j != unmatched_b.end () && j->first.size () == n) { + ++j; + } - for ( ; ii != i && jj != j; ++ii, ++jj) { - mp_logger->subcircuit_mismatch (ii->second, jj->second); - } + align (ii, i, jj, j, KeyDistance ()); - for ( ; jj != j; ++jj) { - mp_logger->subcircuit_mismatch (0, jj->second); - } + for ( ; ii != i && jj != j; ++ii, ++jj) { + mp_logger->subcircuit_mismatch (ii->second, jj->second); + } + + for ( ; jj != j; ++jj) { + mp_logger->subcircuit_mismatch (0, jj->second); + } + + for ( ; ii != i; ++ii) { + mp_logger->subcircuit_mismatch (ii->second, 0); + } - for ( ; ii != i; ++ii) { - mp_logger->subcircuit_mismatch (ii->second, 0); } } From 84457474b970c14d53632b15eafc7b2adac1924e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jan 2026 21:02:01 +0000 Subject: [PATCH 02/19] Bump actions/upload-artifact from 5 to 6 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 847788b91..4959722c2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -98,7 +98,7 @@ jobs: mv ./wheelhouse/.ccache $HOST_CCACHE_DIR ls -la $HOST_CCACHE_DIR ccache -s - - uses: actions/upload-artifact@v5 + - uses: actions/upload-artifact@v6 with: name: artifact-${{ matrix.os }}-${{ matrix.cibw_arch }}-${{ strategy.job-index }} path: ./wheelhouse/*.whl @@ -113,7 +113,7 @@ jobs: - name: Build SDist run: pipx run build --sdist - - uses: actions/upload-artifact@v5 + - uses: actions/upload-artifact@v6 with: name: artifact-sdist path: dist/*.tar.gz From 42be74574412b26ae18e13bf919e19f381afa267 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jan 2026 21:02:05 +0000 Subject: [PATCH 03/19] Bump actions/download-artifact from 6 to 7 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 6 to 7. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 847788b91..521f415fd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -122,7 +122,7 @@ jobs: needs: [build, make_sdist] runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: merge-multiple: true path: dist @@ -139,7 +139,7 @@ jobs: runs-on: ubuntu-latest if: github.event_name == 'release' && github.event.action == 'published' steps: - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: merge-multiple: true path: dist From 407bbbcf62d43cb506f8e7388ce7ee6116824be8 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 3 Jan 2026 01:21:30 +0100 Subject: [PATCH 04/19] More options on 'evaluate_nets' expressions, i.e. 'copy'. See documentation for details. --- src/db/db/dbLayoutToNetlist.cc | 108 ++++++++++++++----- src/db/db/dbLayoutToNetlist.h | 9 +- src/db/db/dbMeasureEval.cc | 120 +++++++++++++++++++-- src/db/db/dbMeasureEval.h | 15 +-- src/db/db/gsiDeclDbLayoutToNetlist.cc | 49 ++++++++- src/doc/doc/about/drc_ref_netter.xml | 56 ++++++++-- src/drc/drc/built-in-macros/_drc_netter.rb | 58 ++++++++-- src/tl/tl/tlExpression.cc | 17 ++- testdata/drc/drcSimpleTests_142.drc | 37 +++++-- testdata/drc/drcSimpleTests_au142.gds | Bin 3320 -> 5416 bytes testdata/drc/drcSimpleTests_au142d.gds | Bin 3050 -> 5146 bytes 11 files changed, 397 insertions(+), 72 deletions(-) diff --git a/src/db/db/dbLayoutToNetlist.cc b/src/db/db/dbLayoutToNetlist.cc index 043f1629c..a83234e2b 100644 --- a/src/db/db/dbLayoutToNetlist.cc +++ b/src/db/db/dbLayoutToNetlist.cc @@ -1800,40 +1800,87 @@ LayoutToNetlist::compute_area_and_perimeter_of_net_shapes (db::cell_index_type c } db::Point -LayoutToNetlist::get_merged_shapes_of_net (db::cell_index_type ci, size_t cid, unsigned int layer_id, db::Shapes &shapes, db::properties_id_type prop_id) const +LayoutToNetlist::get_shapes_of_net (db::cell_index_type ci, size_t cid, const std::vector &layer_ids, bool merge, size_t max_polygons, db::Shapes &shapes, db::properties_id_type prop_id) const { const db::Layout *layout = &dss ().const_layout (m_layout_index); - db::Point ref; + // count vertices and polygons and determine label reference point + + size_t n = 0, npoly = 0; bool any_ref = false; - db::EdgeProcessor ep; + db::Point ref; - // count vertices and reserve space - size_t n = 0; - for (db::recursive_cluster_shape_iterator rci (m_net_clusters, layer_id, ci, cid); !rci.at_end (); ++rci) { - n += rci->polygon_ref ().vertices (); - } - ep.reserve (n); + for (auto l = layer_ids.begin (); l != layer_ids.end (); ++l) { + for (db::recursive_cluster_shape_iterator rci (m_net_clusters, *l, ci, cid); !rci.at_end (); ++rci) { - size_t p = 0; - for (db::recursive_cluster_shape_iterator rci (m_net_clusters, layer_id, ci, cid); !rci.at_end (); ++rci) { - db::PolygonRef pr = rci->polygon_ref (); - db::PolygonRef::polygon_edge_iterator e = pr.begin_edge (); - if (! e.at_end ()) { - // pick one reference point for the label - auto p1 = (rci.trans () * *e).p1 (); - if (! any_ref || p1 < ref) { - ref = p1; - any_ref = true; + db::PolygonRef pr = rci->polygon_ref (); + + n += pr.vertices (); + ++npoly; + + db::PolygonRef::polygon_edge_iterator e = pr.begin_edge (); + if (! e.at_end ()) { + // pick one reference point for the label + auto p1 = (rci.trans () * *e).p1 (); + if (! any_ref || p1 < ref) { + ref = p1; + any_ref = true; + } } - ep.insert_with_trans (pr, rci.trans (), ++p); + } } - db::PolygonRefToShapesGenerator sg (const_cast (layout), &shapes, prop_id); - db::PolygonGenerator pg (sg, false); - db::SimpleMerge op; - ep.process (pg, op); + if (npoly >= max_polygons) { + + db::Box bbox; + + for (auto l = layer_ids.begin (); l != layer_ids.end (); ++l) { + for (db::recursive_cluster_shape_iterator rci (m_net_clusters, *l, ci, cid); !rci.at_end (); ++rci) { + db::PolygonRef pr = rci->polygon_ref (); + bbox += rci.trans () * pr.box (); + } + } + + if (prop_id != 0) { + shapes.insert (db::BoxWithProperties (bbox, prop_id)); + } else { + shapes.insert (bbox); + } + + } else if (merge) { + + db::EdgeProcessor ep; + ep.reserve (n); + + size_t p = 0; + for (auto l = layer_ids.begin (); l != layer_ids.end (); ++l) { + for (db::recursive_cluster_shape_iterator rci (m_net_clusters, *l, ci, cid); !rci.at_end (); ++rci) { + db::PolygonRef pr = rci->polygon_ref (); + db::PolygonRef::polygon_edge_iterator e = pr.begin_edge (); + if (! e.at_end ()) { + ep.insert_with_trans (pr, rci.trans (), ++p); + } + } + } + + db::PolygonRefToShapesGenerator sg (const_cast (layout), &shapes, prop_id); + db::PolygonGenerator pg (sg, false); + db::SimpleMerge op; + ep.process (pg, op); + + } else { + + db::PolygonRefToShapesGenerator sg (const_cast (layout), &shapes, prop_id); + + for (auto l = layer_ids.begin (); l != layer_ids.end (); ++l) { + for (db::recursive_cluster_shape_iterator rci (m_net_clusters, *l, ci, cid); !rci.at_end (); ++rci) { + db::PolygonRef pr = rci->polygon_ref (); + sg.put (pr.instantiate ().transformed (rci.trans ())); + } + } + + } return ref; } @@ -2017,7 +2064,9 @@ db::Region LayoutToNetlist::antenna_check (const db::Region &gate, double gate_a prop_id = db::properties_id (ps); } - db::Point ref = get_merged_shapes_of_net (*cid, *c, layer_of (metal), shapes, prop_id); + std::vector layers; + layers.push_back (layer_of (metal)); + db::Point ref = get_shapes_of_net (*cid, *c, layers, true, std::numeric_limits::max (), shapes, prop_id); if (values) { @@ -2074,7 +2123,9 @@ LayoutToNetlist::measure_net (const db::Region &primary, const std::mapfirst, v->second); } - eval.set_primary_layer (layer_of (primary)); + unsigned int primary_layer = layer_of (primary); + eval.set_primary_layer (primary_layer); + for (auto s = secondary.begin (); s != secondary.end (); ++s) { if (s->second) { eval.set_secondary_layer (s->first, layer_of (*s->second)); @@ -2088,7 +2139,6 @@ LayoutToNetlist::measure_net (const db::Region &primary, const std::map::max, + * the polygons will be replaced by a bounding box if the number of polygons exceeds the number given by the limit */ - db::Point get_merged_shapes_of_net (db::cell_index_type ci, size_t cid, unsigned int layer_id, db::Shapes &shapes, db::properties_id_type prop_id) const; + db::Point get_shapes_of_net (db::cell_index_type ci, size_t cid, const std::vector &layer_ids, bool merged, size_t max_polygons, db::Shapes &shapes, db::properties_id_type prop_id) const; private: // no copying diff --git a/src/db/db/dbMeasureEval.cc b/src/db/db/dbMeasureEval.cc index b2a29c10b..25426f5d6 100644 --- a/src/db/db/dbMeasureEval.cc +++ b/src/db/db/dbMeasureEval.cc @@ -385,10 +385,107 @@ public: virtual void execute (const tl::ExpressionParserContext &context, tl::Variant & /*out*/, const std::vector &args, const std::map * /*kwargs*/) const { - if (args.size () != 1) { - throw tl::EvalError (tl::to_string (tr ("'skip' function takes one argument (flag)")), context); + bool flag = true; + if (args.size () > 1) { + throw tl::EvalError (tl::to_string (tr ("'skip' function takes one optional argument (flag)")), context); + } else if (args.size () == 1) { + flag = args [0].to_bool (); } - mp_eval->skip_func (args [0].to_bool ()); + + std::vector layers; + if (! flag && ! mp_eval->layer_indexes ().empty ()) { + layers.push_back (0); + } + mp_eval->copy_func (layers, true, std::numeric_limits::max ()); + } + +private: + MeasureNetEval *mp_eval; +}; + +/** + * @brief A function to specify the copy behaviour + * + * With the copy behavior, the polygons emitted by the "evaluate_nets" method + * are specified. The function accepts up to one positional argument and + * three optional keyword arguments (limit, layers and merged). + * Together with "skip", it maps to the following behavior: + * + * skip() -> copy(layers=[]) + * skip(true) -> copy(layers=[]) + * skip(false) -> copy(layers=[primary], merged=true, limit=unlimited) + * copy() -> copy(layers=[all], merged=true, limit=unlimited) + * copy(false) -> copy(layers=[]) + * copy(true) -> copy(layers=[all], merged=true, limit=unlimited) + * copy(true, merged=m) -> copy(layers=[all], merged=m, limit=unlimited) + * copy(layers=l) -> copy(layers=[l], merged=true, limit=unlimited) (l is a layer symbol) + * copy(layers=[l]) -> copy(layers=[l], merged=true, limit=unlimited) ([l] is an array of layer symbols) + * copy(layers=.., merged=m) -> copy(layers=.., merged=m, limit=unlimited) + * copy(layers=.., merged=.., limit=n) -> copy(layers=.., merged=.., limit=n) + * + * The primary layer is "0", so "skip(false)" is identical to "copy(layer=0)" + */ + +class NetCopyFunction + : public tl::EvalFunction +{ +public: + NetCopyFunction (MeasureNetEval *eval) + : mp_eval (eval) + { + // .. nothing yet .. + } + + virtual bool supports_keyword_parameters () const { return true; } + + virtual void execute (const tl::ExpressionParserContext &context, tl::Variant & /*out*/, const std::vector &args, const std::map *kwargs) const + { + bool flag = true; + size_t limit = std::numeric_limits::max (); + std::vector layers; + bool merged = true; + + if (args.size () > 1) { + throw tl::EvalError (tl::to_string (tr ("'copy' function takes one optional argument (flag) and the following keyword arguments: 'limit', 'layers', 'layer' or 'merged'")), context); + } else if (args.size () == 1) { + flag = args [0].to_bool (); + } + + // default for "layers" is 'all' + for (unsigned int i = 0; i < (unsigned int) mp_eval->layer_indexes ().size (); ++i) { + layers.push_back (i); + } + + if (kwargs) { + for (auto k = kwargs->begin (); k != kwargs->end (); ++k) { + if (k->first == "limit") { + limit = k->second.to (); + } else if (k->first == "merged") { + merged = k->second.to_bool (); + } else if (k->first == "layers") { + const tl::Variant &v = k->second; + if (! v.is_list ()) { + throw tl::EvalError (tl::to_string (tr ("'copy' function's 'layers' keyword argument expects an array of layer symbols")), context); + } + layers.clear (); + for (auto l = v.begin (); l != v.end (); ++l) { + layers.push_back (l->to_uint ()); + } + } else if (k->first == "layer") { + layers.clear (); + layers.push_back (k->second.to_uint ()); + } else { + throw tl::EvalError (tl::to_string (tr ("'copy' function takes one optional argument (flag) and the following keyword arguments: 'limit', 'layers', 'layer' or 'merged'")), context); + } + } + } + + if (! flag) { + // clear layers to indicate we don't want to copy + layers.clear (); + } + + mp_eval->copy_func (layers, merged, limit); } private: @@ -464,7 +561,8 @@ private: MeasureNetEval::MeasureNetEval (const db::LayoutToNetlist *l2n, double dbu) : tl::Eval (), mp_l2n (l2n), m_dbu (dbu) { - // .. nothing yet .. + m_copy_merge = false; + m_copy_max_polygons = std::numeric_limits::max (); } void @@ -486,6 +584,7 @@ MeasureNetEval::init () { define_function ("put", new NetPutFunction (this)); define_function ("skip", new NetSkipFunction (this)); + define_function ("copy", new NetCopyFunction (this)); define_function ("area", new NetAreaFunction (this)); define_function ("perimeter", new NetPerimeterFunction (this)); define_function ("net", new NetFunction (this)); @@ -494,7 +593,12 @@ MeasureNetEval::init () void MeasureNetEval::reset (db::cell_index_type cell_index, size_t cluster_id) const { - m_skip = false; + // default action: copy primary layer, merged, no limit + m_copy_layers.clear (); + m_copy_layers.push_back (0); + m_copy_merge = true; + m_copy_max_polygons = std::numeric_limits::max (); + m_cell_index = cell_index; m_cluster_id = cluster_id; m_area_and_perimeter_cache.clear (); @@ -553,9 +657,11 @@ MeasureNetEval::perimeter_func (int layer_index) const } void -MeasureNetEval::skip_func (bool f) const +MeasureNetEval::copy_func (const std::vector &layer_indexes, bool merge, size_t max_polygons) const { - m_skip = f; + m_copy_layers = layer_indexes; + m_copy_merge = merge; + m_copy_max_polygons = max_polygons; } tl::Variant diff --git a/src/db/db/dbMeasureEval.h b/src/db/db/dbMeasureEval.h index 0abbc0140..882d422fc 100644 --- a/src/db/db/dbMeasureEval.h +++ b/src/db/db/dbMeasureEval.h @@ -130,10 +130,9 @@ public: void reset (db::cell_index_type cell_index, size_t cluster_id) const; - bool skip () const - { - return m_skip; - } + const std::vector copy_layers () const { return m_copy_layers; } + size_t copy_max_polygons () const { return m_copy_max_polygons; } + bool copy_merge () const { return m_copy_merge; } db::PropertiesSet &prop_set_out () const { @@ -146,6 +145,7 @@ private: friend class NetPerimeterFunction; friend class NetFunction; friend class NetSkipFunction; + friend class NetCopyFunction; struct AreaAndPerimeter { @@ -156,7 +156,9 @@ private: const db::LayoutToNetlist *mp_l2n; double m_dbu; std::vector m_layers; - mutable bool m_skip; + mutable std::vector m_copy_layers; + mutable bool m_copy_merge; + mutable size_t m_copy_max_polygons; mutable db::PropertiesSet m_prop_set_out; mutable db::cell_index_type m_cell_index; mutable size_t m_cluster_id; @@ -164,11 +166,12 @@ private: mutable std::unique_ptr, const db::Net *> > m_nets_per_cell_and_cluster_id; AreaAndPerimeter compute_area_and_perimeter (int layer_index) const; + const std::vector &layer_indexes () const { return m_layers; } void put_func (const tl::Variant &name, const tl::Variant &value) const; tl::Variant area_func (int layer_index) const; tl::Variant perimeter_func (int layer_index) const; - void skip_func (bool f) const; + void copy_func (const std::vector &layer_indexes, bool merge, size_t max_polygons) const; tl::Variant net_func () const; }; diff --git a/src/db/db/gsiDeclDbLayoutToNetlist.cc b/src/db/db/gsiDeclDbLayoutToNetlist.cc index c5c6e38cb..34be0b7c8 100644 --- a/src/db/db/gsiDeclDbLayoutToNetlist.cc +++ b/src/db/db/gsiDeclDbLayoutToNetlist.cc @@ -1232,11 +1232,13 @@ Class decl_dbLayoutToNetlist ("db", "LayoutToNetlist", "arbitrary values without having to encode them into the expression string.\n" "\n" "It will look at nets connecting to shapes on the primary layer and execute the expression for each\n" - "of those nets. After that it will copy the primary shapes of the net to the output with the properties\n" + "of those nets. After that it will copy the merged primary shapes of the net to the output with the properties\n" "placed by 'put' attached to them.\n" "\n" "It is possible to skip primary shapes of a specific net by calling the 'skip' function with a 'true'\n" - "value.\n" + "value. It is also possible to configure the output in more detail, i.e. to skip other or all layers, to\n" + "replace the output by the net's bounding box above a certain complexity, or to select merged polygons or " + "unmerged ones, by using 'copy' instead of 'skip'. See below for more details.\n" "\n" "The expression may use the following functions:\n" "\n" @@ -1246,12 +1248,53 @@ Class decl_dbLayoutToNetlist ("db", "LayoutToNetlist", "@li 'perimeter': the perimeter of the primary-layer shapes on the net in um @/li\n" "@li 'perimeter(name)': the perimeter of the secondary-layer shapes. 'name' is a symbol with the name given in the secondary-layer map @/li\n" "@li 'put(name, value)': places the value as property 'name' on the output shapes @/li\n" - "@li 'skip(flag)': will skip the primary shapes of that net when called with a true value @/li\n" + "@li 'skip' or 'skip(flag)': will skip the primary shapes of that net when called with a true value or without one. See also 'copy'. @/li\n" + "@li 'copy(...)': see below for details @/li\n" "@li 'net': the \\Net object of the current net @/li\n" "@/ul\n" "\n" "If given, the 'dbu' argument gives the database unit to use for converting shape dimensions into micrometer units. " "If this value is 0, the area and perimeters are calculated in database units. If no DBU is specified, the value is determined automatically." + "\n" + "'copy' and 'skip' control the polygon output. Here are the options:\n" + "\n" + "@ul\n" + "@li 'skip' or 'skip(true)': skip output, identical to 'copy(layers=[])' @/li\n" + "@li 'skip(false)': copy the shapes from the primary layer, identical to 'copy(layer=0)' @/li\n" + "@li 'copy' or 'copy(true)': copy all shapes from the net, merged into a single polygon.\n" + " Note: this is not equivalent to 'skip(false)', as in the latter case, only the primary layer's\n" + " shapes are copied @/li\n" + "@li 'copy(false)': equivalent to 'skip(true)' @/li\n" + "@li 'copy(merged=false)': copies all shapes from all layers of the net, without merging.\n" + " 'merged' is a keyword argument that can be combined with other arguments. @/li\n" + "@li 'copy(limit=number)': if the net has less than 'number' polygons on the selected layers, \n" + " copy them to the output. For more polygons, emit the bounding box of the net for the \n" + " given layers.\n" + " 'limit' is a keyword argument that can be combined with other arguments. @/li\n" + "@li 'copy(layer=symbol)': copies all shapes from the layer denoted by the symbol.\n" + " The primary layer has value zero (0), so 'copy(layer=0)' copies the shapes from the primary layer.\n" + " 'layer' is a keyword argument that can be combined with other arguments, except 'layers'. @/li\n" + "@li 'copy(layers=[symbol, symbol, ...])': copies all shapes from the layers denoted by the symbols.\n" + " 'layers' is a keyword argument that can be combined with other arguments, except 'layer'. @/li\n" + "@/ul\n" + "\n" + "When mixing 'skip' and 'copy', the last active specification controls the output. The following\n" + "expressions are equivalent:\n" + "\n" + "@code\n" + "copy(net.name == 'VDD')\n" + "@/code\n" + "\n" + "and\n" + "\n" + "@code\n" + "skip ; net.name == 'VDD' && copy\n" + "@/code\n" + "\n" + "where the second expression establishes 'skip' as the default and conditionally executes 'copy',\n" + "overriding 'skip'.\n" + "\n" + "The 'copy' function was added and the 'skip' argument was made optional in version 0.30.6." ) + // test API gsi::method ("make_soft_connection_diodes=", &db::LayoutToNetlist::set_make_soft_connection_diodes, gsi::arg ("flag"), "@hide") + diff --git a/src/doc/doc/about/drc_ref_netter.xml b/src/doc/doc/about/drc_ref_netter.xml index 009b97ce4..5f557bd4a 100644 --- a/src/doc/doc/about/drc_ref_netter.xml +++ b/src/doc/doc/about/drc_ref_netter.xml @@ -355,8 +355,14 @@ It visits each net and evaluates the given expression on the net. The expression needs to be written in KLayout expression notations.

The default action is to copy the shapes of the primary layer to the -output. This action can be modified in some ways: skip shapes of -certain nets or attach properties to the shapes during the evaluation. +output. It is possible to customize the output further: you can +conditionally skip the output or copy all shapes of the net from +all layers the output. You can choose to emit individual polygons +or merge all polygons from a net (all layers or a subset) into +a single polygon. The latter is the default. +

+You can also choose to emit the bounding box of the net if the number of polygons +on the net exceeds a certain limit.

Using the "put" function inside the expression, properties can be attached to the output shapes. The properties can be computed using @@ -366,9 +372,6 @@ Also the Net object representing the net is av 'net' function. This allows implementing a more elaborate antenna check for example.

-Also, the expression can choose to drop shapes and not copy them to -the output by calling the "skip" function with a "true" argument. -

Arbitrary values can be passed as variables, which removes the need to encode variable values into the expression. For this, use the 'variables' argument and pass a hash with names and values. Each of @@ -379,7 +382,8 @@ The following functions are available inside the expressions:

  • "net" - the Net object of the current net
  • -
  • "skip(flag)" - if called with a 'true' argument, the primary layer's shapes are not copied for this net
  • +
  • "skip" or "skip(flag)" - if called with a 'true' argument (the default), the primary layer's shapes are not copied for this net
  • +
  • "copy(...)" - configures polygon output in a more elaborate way than "skip" (see below)
  • "put(name, value)" - places the value as a property with name 'name' (this must be a string) on the output shapes
  • "area" - the combined area of the primary layer's shapes on the net in square micrometer units
  • "area(symbol)" - the combined area of the secondary layer's shapes on the net in square micrometer units
  • @@ -390,6 +394,46 @@ The following functions are available inside the expressions: Here, 'symbol' is the name given to the secondary layer in the secondary layer dictionary.

    +"copy" and "skip" control the polygon output. Here are the options: +

    +

      +
    • "skip" or "skip(true): skip output, identical to "copy(layers=[])"
    • +
    • "skip(false)": copy the shapes from the primary layer, identical to "copy(layer=0)"
    • +
    • "copy" or "copy(true)": copy all shapes from the net, merged into a single polygon. +Note: this is not equivalent to "skip(false)", as in the latter case, only the primary layer's +shapes are copied
    • +
    • "copy(false)": equivalent to "skip(true)"
    • +
    • "copy(merged=false)": copies all shapes from all layers of the net, without merging. +"merged" is a keyword argument that can be combined with other arguments.
    • +
    • "copy(limit=number)": if the net has less than "number" polygons on the selected layers, +copy them to the output. For more polygons, emit the bounding box of the net for the +given layers. +"limit" is a keyword argument that can be combined with other arguments.
    • +
    • "copy(layer=symbol)": copies all shapes from the layer denoted by the symbol. +The primary layer has value zero (0), so "copy(layer=0)" copies the shapes from the primary layer. +"layer" is a keyword argument that can be combined with other arguments, except "layers".
    • +
    • "copy(layers=[symbol, symbol, ...])": copies all shapes from the layers denoted by the symbols. +"layers" is a keyword argument that can be combined with other arguments, except "layer".
    • +
    +

    +When mixing "skip" and "copy", the last active specification controls the output. The following +expressions are equivalent: +

    +

    +copy(net.name == "VDD")
    +
    +

    +and +

    +

    +skip ; net.name == "VDD" && copy
    +
    +

    +where the second expression establishes "skip" as the default and conditionally executes "copy", +overriding "skip". +

    +

    Antenna check example

    +

    The following example emulates an antenna check. It computes the area ratio of metal vs. gate area and attaches the value as a property with name 'AR' to the shapes, copied from the 'gate' layer:

    diff --git a/src/drc/drc/built-in-macros/_drc_netter.rb b/src/drc/drc/built-in-macros/_drc_netter.rb index eac15165d..efb9853ee 100644 --- a/src/drc/drc/built-in-macros/_drc_netter.rb +++ b/src/drc/drc/built-in-macros/_drc_netter.rb @@ -780,9 +780,15 @@ module DRC # The expression needs to be written in KLayout expression notations. # # The default action is to copy the shapes of the primary layer to the - # output. This action can be modified in some ways: skip shapes of - # certain nets or attach properties to the shapes during the evaluation. - # + # output. It is possible to customize the output further: you can + # conditionally skip the output or copy all shapes of the net from + # all layers the output. You can choose to emit individual polygons + # or merge all polygons from a net (all layers or a subset) into + # a single polygon. The latter is the default. + # + # You can also choose to emit the bounding box of the net if the number of polygons + # on the net exceeds a certain limit. + # # Using the "put" function inside the expression, properties can be # attached to the output shapes. The properties can be computed using # a number of net attributes - area and perimeter for example. @@ -791,9 +797,6 @@ module DRC # 'net' function. This allows implementing a more elaborate # antenna check for example. # - # Also, the expression can choose to drop shapes and not copy them to - # the output by calling the "skip" function with a "true" argument. - # # Arbitrary values can be passed as variables, which removes the need # to encode variable values into the expression. For this, use the # 'variables' argument and pass a hash with names and values. Each of @@ -804,7 +807,8 @@ module DRC # # @ul # @li "net" - the RBA::Net object of the current net @/li - # @li "skip(flag)" - if called with a 'true' argument, the primary layer's shapes are not copied for this net @/li + # @li "skip" or "skip(flag)" - if called with a 'true' argument (the default), the primary layer's shapes are not copied for this net @/li + # @li "copy(...)" - configures polygon output in a more elaborate way than "skip" (see below) @/li # @li "put(name, value)" - places the value as a property with name 'name' (this must be a string) on the output shapes @/li # @li "area" - the combined area of the primary layer's shapes on the net in square micrometer units @/li # @li "area(symbol)" - the combined area of the secondary layer's shapes on the net in square micrometer units @/li @@ -815,6 +819,46 @@ module DRC # Here, 'symbol' is the name given to the secondary layer in the secondary layer # dictionary. # + # "copy" and "skip" control the polygon output. Here are the options: + # + # @ul + # @li "skip" or "skip(true): skip output, identical to "copy(layers=[])" @/li + # @li "skip(false)": copy the shapes from the primary layer, identical to "copy(layer=0)" @/li + # @li "copy" or "copy(true)": copy all shapes from the net, merged into a single polygon. + # Note: this is not equivalent to "skip(false)", as in the latter case, only the primary layer's + # shapes are copied @/li + # @li "copy(false)": equivalent to "skip(true)" @/li + # @li "copy(merged=false)": copies all shapes from all layers of the net, without merging. + # "merged" is a keyword argument that can be combined with other arguments. @/li + # @li "copy(limit=number)": if the net has less than "number" polygons on the selected layers, + # copy them to the output. For more polygons, emit the bounding box of the net for the + # given layers. + # "limit" is a keyword argument that can be combined with other arguments. @/li + # @li "copy(layer=symbol)": copies all shapes from the layer denoted by the symbol. + # The primary layer has value zero (0), so "copy(layer=0)" copies the shapes from the primary layer. + # "layer" is a keyword argument that can be combined with other arguments, except "layers". @/li + # @li "copy(layers=[symbol, symbol, ...])": copies all shapes from the layers denoted by the symbols. + # "layers" is a keyword argument that can be combined with other arguments, except "layer". @/li + # @/ul + # + # When mixing "skip" and "copy", the last active specification controls the output. The following + # expressions are equivalent: + # + # @code + # copy(net.name == "VDD") + # @/code + # + # and + # + # @code + # skip ; net.name == "VDD" && copy + # @/code + # + # where the second expression establishes "skip" as the default and conditionally executes "copy", + # overriding "skip". + # + # @h4 Antenna check example @/h4 + # # The following example emulates an antenna check. It computes the area ratio of metal vs. gate area and # attaches the value as a property with name 'AR' to the shapes, copied from the 'gate' layer: # diff --git a/src/tl/tl/tlExpression.cc b/src/tl/tl/tlExpression.cc index bb42ad65b..cb64bfd3c 100644 --- a/src/tl/tl/tlExpression.cc +++ b/src/tl/tl/tlExpression.cc @@ -3993,9 +3993,20 @@ Eval::eval_atomic (ExpressionParserContext &ex, std::unique_ptr do { - std::unique_ptr v; - eval_top (ex, v); - n->add_child (v.release ()); + tl::Extractor exn = ex; + std::string name; + if (exn.try_read_word (name, "_") && exn.test ("=")) { + // keyword parameter -> read name again to skip it + ex.read_word (name, "_"); + ex.expect ("="); + } else { + name.clear (); + } + + std::unique_ptr a; + eval_assign (ex, a); + a->set_name (name); + n->add_child (a.release ()); if (ex.test (")")) { break; diff --git a/testdata/drc/drcSimpleTests_142.drc b/testdata/drc/drcSimpleTests_142.drc index a5be915aa..5ae12ea9f 100644 --- a/testdata/drc/drcSimpleTests_142.drc +++ b/testdata/drc/drcSimpleTests_142.drc @@ -17,19 +17,38 @@ connect(l2, l3) connect(l3, l4) connect(l4, l5) -l1_measured = evaluate_nets(l1, { "l2" => l2, "l3" => l3, "l4" => l4, "l5" => l5 }, "put(5, area(l5)); put(0, area); put(100, area(l5)/area)") -l2_measured = evaluate_nets(l1, {}, "put(0, area*factor)", { "factor" => 1000.0 }) -l3_measured = evaluate_nets(l1, {}, "put(0, net.name)") -l4_measured = evaluate_nets(l1, {}, "skip(net.name == n)", { "n" => "NET1" }) - l1.output(1, 0) l2.output(2, 0) l3.output(3, 0) l4.output(4, 0) l5.output(5, 0) -l1_measured.output(100, 0) -l2_measured.output(101, 0) -l3_measured.output(102, 0) -l4_measured.output(103, 0) +sec = { "l2" => l2, "l3" => l3, "l4" => l4, "l5" => l5 } +l100_measured = evaluate_nets(l1, sec, "put(5, area(l5)); put(0, area); put(100, area(l5)/area)") +l101_measured = evaluate_nets(l1, sec, "put(0, area*factor)", { "factor" => 1000.0 }) +l102_measured = evaluate_nets(l1, sec, "put(0, net.name)") +l103_measured = evaluate_nets(l1, sec, "skip(net.name == n)", { "n" => "NET1" }) +l104_measured = evaluate_nets(l1, sec, "copy(net.name == n)", { "n" => "NET1" }) +# default action is "skip", then copy primary if net name is "NET1" +l105_measured = evaluate_nets(l1, sec, "skip ; net.name == n && copy(layer = 0)", { "n" => "NET1" }) +l106_measured = evaluate_nets(l1, sec, "copy(net.name == n, merged = true)", { "n" => "NET1" }) +l107_measured = evaluate_nets(l1, sec, "copy(net.name == n, merged = false)", { "n" => "NET1" }) +l108_measured = evaluate_nets(l1, sec, "copy(net.name == n, merged = false, layers = [l4, l5])", { "n" => "NET1" }) +l109_measured = evaluate_nets(l1, sec, "copy(net.name == n, merged = false, layer = l5)", { "n" => "NET1" }) +l110_measured = evaluate_nets(l1, sec, "copy(net.name == n, merged = false, limit = 0)", { "n" => "NET1" }) +# default action is "skip", then copy all if net name is "NET1" +l111_measured = evaluate_nets(l1, sec, "skip ; net.name == n && copy", { "n" => "NET1" }) + +l100_measured.output(100, 0) +l101_measured.output(101, 0) +l102_measured.output(102, 0) +l103_measured.output(103, 0) +l104_measured.output(104, 0) +l105_measured.output(105, 0) +l106_measured.output(106, 0) +l107_measured.output(107, 0) +l108_measured.output(108, 0) +l109_measured.output(109, 0) +l110_measured.output(110, 0) +l111_measured.output(111, 0) diff --git a/testdata/drc/drcSimpleTests_au142.gds b/testdata/drc/drcSimpleTests_au142.gds index 3f17b1990a1a918c46436af436b77c48099caf41..62c69c6621d89cb9fba0d15d3e1f558322c834a4 100644 GIT binary patch delta 681 zcmew%xk4+7fsKKQDS|X%rVB=+C$Y5aOV`5-ns1acP|Np^(|Nl=0Os-=T)4K72 zfkE%V|Nk)hhXDhFc)|bw5SoF3{Q^iHL{HwwB&GpUHpc;?97LZCfSJa?BFMnN0<|r3 zat@@{HW z0=vv)4rXPL95YBXhXt$-OzNLw3{nIXK_~)pfI_)o siCkm}AcxgHI1d^cI*14X1tlc3=QzMfsKKQDS|{L4=vr&auACb78W*k6c#2@ z(8-@bX=R`w!NSCn!h#r!D=a8X)|odq?Cg8I6Ca--w#hHicNR2jLpc6sIF-D&8|#q*3Y;{e$_fH{)J zxy{iu&R%FEANbcb769~Z0~}j{Jrp})_PFDxH9xZh(9;V*cySk?WzC`35j8)f`RsXr z|7uM0vzkwSRfV2;V!Qr2obg=N#=@>&NzBT(95bzbrDJ@OuSddCVd4tK+eJ z(x38|^dtYvV}fFj#NYEzJkg(WpZJ1e7yaWZ%#A6(!tD3Ew_DbJ?XLc=j zb}*(?XLeDO%B(}N?<|42L^aM7O#g83o`ZbBl>1Q#8o?P0W&mrLx)+oe+A*s`J0#U& zPW>Uh(3zAPBsED;?1+c-qEBFr3cBZIs9aSHHPU+FdyHOO#k(*wshU&9S7sfGUGJnc z=%P{@C`(i@Mk9TpxXdSxeltbCSPZRO&DUU@>zJ>hh}JP*L$Sm8hRU_}+hCkLCI`--Z8Aoo#zWu+)lg(alN^=Iy$lY7tgm7cnf zoF23vYvmpYuSe{7Kj{4^e%(13%da!*H2?8`rsorO&Y^b z6i?58g8tj%C+NQw-`XF+`DFY(L1)ogL3-!$c>NOe@5+BPpLPGK&SOpe<=lnOli0Bj zjp0)*l0I4bW`e(I%)@O5=@mrqt6BPUAaJ>Hn{kQVJ*Ix&Hw$vfPnEqSwIe$eb z;z=LReY=c%>wl`xUjqFUKaqZl&-I(XQ@Bp+{9$|K`^Dq)KHa|S_7tC{L4=vr&auUcg#iHd78o}G From 17a525f39fc077006732c5bb976de8dcc057eb34 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 4 Jan 2026 15:34:48 +0100 Subject: [PATCH 05/19] Fixed a typo --- src/db/db/gsiDeclDbLayoutToNetlist.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/db/db/gsiDeclDbLayoutToNetlist.cc b/src/db/db/gsiDeclDbLayoutToNetlist.cc index 34be0b7c8..506e7dc32 100644 --- a/src/db/db/gsiDeclDbLayoutToNetlist.cc +++ b/src/db/db/gsiDeclDbLayoutToNetlist.cc @@ -1236,7 +1236,7 @@ Class decl_dbLayoutToNetlist ("db", "LayoutToNetlist", "placed by 'put' attached to them.\n" "\n" "It is possible to skip primary shapes of a specific net by calling the 'skip' function with a 'true'\n" - "value. It is also possible to configure the output in more detail, i.e. to skip other or all layers, to\n" + "value. It is also possible to configure the output in more detail, i.e. to copy other or all layers, to\n" "replace the output by the net's bounding box above a certain complexity, or to select merged polygons or " "unmerged ones, by using 'copy' instead of 'skip'. See below for more details.\n" "\n" From 60a5dc1b8a3b67423c1de2b47ce90fc39daf8d1d Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 4 Jan 2026 17:07:38 +0100 Subject: [PATCH 06/19] Bugfix of 'evaluate_nets' function, added tests --- src/db/db/dbMeasureEval.cc | 13 +- src/db/unit_tests/dbLayoutToNetlistTests.cc | 15 + testdata/algo/lvs_test1_au.lvsdb.2 | 646 ------------------- testdata/algo/lvs_test1b_au.lvsdb.2 | 646 ------------------- testdata/algo/lvs_test2_au.lvsdb.2 | 677 -------------------- testdata/algo/lvs_test2b_au.lvsdb.2 | 677 -------------------- testdata/algo/measure_net_au.oas | Bin 763 -> 869 bytes 7 files changed, 26 insertions(+), 2648 deletions(-) delete mode 100644 testdata/algo/lvs_test1_au.lvsdb.2 delete mode 100644 testdata/algo/lvs_test1b_au.lvsdb.2 delete mode 100644 testdata/algo/lvs_test2_au.lvsdb.2 delete mode 100644 testdata/algo/lvs_test2b_au.lvsdb.2 diff --git a/src/db/db/dbMeasureEval.cc b/src/db/db/dbMeasureEval.cc index 25426f5d6..7bb2d45cc 100644 --- a/src/db/db/dbMeasureEval.cc +++ b/src/db/db/dbMeasureEval.cc @@ -595,7 +595,9 @@ MeasureNetEval::reset (db::cell_index_type cell_index, size_t cluster_id) const { // default action: copy primary layer, merged, no limit m_copy_layers.clear (); - m_copy_layers.push_back (0); + if (! m_layers.empty ()) { + m_copy_layers.push_back (m_layers.front ()); + } m_copy_merge = true; m_copy_max_polygons = std::numeric_limits::max (); @@ -659,7 +661,14 @@ MeasureNetEval::perimeter_func (int layer_index) const void MeasureNetEval::copy_func (const std::vector &layer_indexes, bool merge, size_t max_polygons) const { - m_copy_layers = layer_indexes; + m_copy_layers.clear (); + m_copy_layers.reserve (layer_indexes.size ()); + for (auto l = layer_indexes.begin (); l != layer_indexes.end (); ++l) { + if (size_t (*l) < m_layers.size ()) { + m_copy_layers.push_back (m_layers [*l]); + } + } + m_copy_merge = merge; m_copy_max_polygons = max_polygons; } diff --git a/src/db/unit_tests/dbLayoutToNetlistTests.cc b/src/db/unit_tests/dbLayoutToNetlistTests.cc index 9852c088d..2ed2ebf85 100644 --- a/src/db/unit_tests/dbLayoutToNetlistTests.cc +++ b/src/db/unit_tests/dbLayoutToNetlistTests.cc @@ -3463,6 +3463,21 @@ TEST(15_MeasureNet) unsigned int l102 = ly.get_layer (db::LayerProperties (102, 0)); l3_net_func.insert_into (&ly, tc.cell_index (), l102); + db::Region l4_net_func = l2n.measure_net (*rl1, secondary, "copy(merged=false, layers=[l2,l3,l4,l5])", std::map ()); + + unsigned int l103 = ly.get_layer (db::LayerProperties (103, 0)); + l4_net_func.insert_into (&ly, tc.cell_index (), l103); + + db::Region l5_net_func = l2n.measure_net (*rl1, secondary, "copy(net.name=='NET2', layer=l5)", std::map ()); + + unsigned int l104 = ly.get_layer (db::LayerProperties (104, 0)); + l5_net_func.insert_into (&ly, tc.cell_index (), l104); + + db::Region l6_net_func = l2n.measure_net (*rl1, secondary, "copy(net.name=='NET2', limit=0)", std::map ()); + + unsigned int l105 = ly.get_layer (db::LayerProperties (105, 0)); + l6_net_func.insert_into (&ly, tc.cell_index (), l105); + // compare the collected test data std::string au = tl::testdata (); diff --git a/testdata/algo/lvs_test1_au.lvsdb.2 b/testdata/algo/lvs_test1_au.lvsdb.2 deleted file mode 100644 index eb03fd506..000000000 --- a/testdata/algo/lvs_test1_au.lvsdb.2 +++ /dev/null @@ -1,646 +0,0 @@ -#%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(bulk) - layer(nwell '1/0') - layer(poly '3/0') - layer(poly_lbl '3/1') - layer(diff_cont '4/0') - layer(poly_cont '5/0') - layer(metal1 '6/0') - layer(metal1_lbl '6/1') - layer(via1 '7/0') - layer(metal2 '8/0') - layer(metal2_lbl '8/1') - layer(ntie) - layer(psd) - layer(ptie) - layer(nsd) - - # Mask layer connectivity - connect(nwell nwell ntie) - connect(poly poly poly_lbl poly_cont) - connect(poly_lbl poly) - connect(diff_cont diff_cont metal1 ntie psd ptie nsd) - connect(poly_cont poly poly_cont metal1) - connect(metal1 diff_cont poly_cont metal1 metal1_lbl via1) - connect(metal1_lbl metal1) - connect(via1 metal1 via1 metal2) - connect(metal2 via1 metal2 metal2_lbl) - connect(metal2_lbl metal2) - connect(ntie nwell diff_cont ntie) - connect(psd diff_cont psd) - connect(ptie diff_cont ptie) - connect(nsd diff_cont nsd) - - # Global nets and connectivity - global(bulk BULK) - global(ptie BULK) - - # 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(psd (-650 -875) (525 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(psd (125 -875) (550 1750)) - ) - terminal(B - rect(nwell (-125 -875) (250 1750)) - ) - ) - device(D$PMOS$1 PMOS - terminal(S - rect(psd (-675 -875) (550 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(psd (125 -875) (525 1750)) - ) - terminal(B - rect(nwell (-125 -875) (250 1750)) - ) - ) - device(D$NMOS NMOS - terminal(S - rect(nsd (-650 -875) (525 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(nsd (125 -875) (550 1750)) - ) - terminal(B - rect(bulk (-125 -875) (250 1750)) - ) - ) - device(D$NMOS$1 NMOS - terminal(S - rect(nsd (-675 -875) (550 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(nsd (125 -875) (525 1750)) - ) - terminal(B - rect(bulk (-125 -875) (250 1750)) - ) - ) - - # Circuit section - # Circuits are the hierarchical building blocks of the netlist. - circuit(INV2 - - # Circuit boundary - rect((-1700 -2440) (3100 7820)) - - # Nets with their geometries - net(1 - rect(nwell (-1400 1800) (2800 3580)) - rect(diff_cont (-1510 -650) (220 220)) - rect(ntie (-510 -450) (800 680)) - ) - net(2 name(IN) - rect(poly (-525 -250) (250 2500)) - rect(poly (-1425 -630) (2100 360)) - rect(poly (-125 -2230) (250 2500)) - rect(poly (-1050 -3850) (250 2400)) - rect(poly (550 1200) (250 2400)) - rect(poly (-250 -6000) (250 2400)) - rect(poly (-1050 1200) (250 2400)) - rect(poly_lbl (-525 -2600) (0 0)) - rect(poly_cont (-830 -110) (220 220)) - ) - net(3 name(OUT) - rect(diff_cont (-910 90) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (1380 3380) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 -3820) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-1820 3380) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(metal1 (1310 -3710) (360 2220)) - rect(metal1 (-1900 -800) (2220 360)) - rect(metal1 (-2280 -2400) (360 2840)) - rect(metal1 (-360 -3600) (360 1560)) - rect(metal1 (1240 2040) (360 1560)) - rect(metal1 (-360 -5160) (360 1560)) - rect(metal1 (-1960 2040) (360 1560)) - rect(metal1_lbl (1420 -2180) (0 0)) - rect(psd (-1850 525) (525 1750)) - rect(psd (1050 -1750) (525 1750)) - rect(nsd (-2100 -5350) (525 1750)) - rect(nsd (1050 -1750) (525 1750)) - ) - net(4 name(VSS) - rect(diff_cont (-110 90) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 980) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(metal1 (-290 -290) (360 1560)) - rect(metal1 (-360 -1560) (360 1560)) - rect(via1 (-305 -705) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(via1 (-250 -1450) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(metal2 (-1525 -775) (2800 1700)) - rect(metal2_lbl (-160 -540) (0 0)) - rect(nsd (-1515 -1185) (550 1750)) - ) - net(5 name(VDD) - rect(diff_cont (-110 2490) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 -1420) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(metal1 (-290 -1490) (360 1560)) - rect(metal1 (-360 -1560) (360 1560)) - rect(via1 (-305 -1505) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(metal2 (-1525 -1575) (2800 1700)) - rect(metal2_lbl (-150 -1250) (0 0)) - rect(psd (-1525 -475) (550 1750)) - ) - net(6 name(BULK) - rect(diff_cont (-110 -2160) (220 220)) - rect(ptie (-510 -450) (800 680)) - ) - - # Outgoing pins and their connections to nets - pin(1) - pin(2 name(IN)) - pin(3 name(OUT)) - pin(4 name(VSS)) - pin(5 name(VDD)) - pin(6 name(BULK)) - - # Devices and their connections - device(1 D$PMOS - device(D$PMOS$1 location(800 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(-400 3200) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 3) - terminal(G 2) - terminal(D 5) - terminal(B 1) - ) - device(3 D$NMOS - device(D$NMOS$1 location(800 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(-400 -400) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 3) - terminal(G 2) - terminal(D 4) - terminal(B 6) - ) - - ) - circuit(INV2PAIR - - # Circuit boundary - rect((0 -1640) (5740 7820)) - - # Nets with their geometries - net(1 name(BULK)) - net(2) - net(3) - net(4) - net(5) - net(6) - net(7) - - # Outgoing pins and their connections to nets - pin(1 name(BULK)) - pin(2) - pin(3) - pin(4) - pin(5) - pin(6) - pin(7) - - # Subcircuits and their connections - circuit(1 INV2 location(1700 800) - pin(0 7) - pin(1 5) - pin(2 4) - pin(3 3) - pin(4 2) - pin(5 1) - ) - circuit(2 INV2 location(4340 800) - pin(0 7) - pin(1 4) - pin(2 6) - pin(3 3) - pin(4 2) - pin(5 1) - ) - - ) - circuit(RINGO - - # Circuit boundary - rect((-1720 -2440) (26880 7820)) - - # Nets with their geometries - net(1 name(FB) - rect(metal1 (-1700 1620) (360 360)) - rect(via1 (-305 -305) (250 250)) - rect(via1 (23190 -250) (250 250)) - rect(metal2 (-23765 -325) (23840 400)) - rect(metal2_lbl (-22120 -200) (0 0)) - ) - net(2 name(OSC) - rect(via1 (24435 1675) (250 250)) - rect(metal2 (-325 -325) (400 400)) - rect(metal2_lbl (-200 -200) (0 0)) - ) - net(3 name(VDD) - rect(metal1 (-180 3900) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal2_lbl (-23940 -2220) (0 0)) - ) - net(4 name(VSS) - rect(metal1 (-180 -2220) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal2_lbl (-23940 1100) (0 0)) - ) - net(5) - net(6) - net(7) - net(8) - net(9) - net(10) - net(11) - net(12) - - # Outgoing pins and their connections to nets - pin(1 name(FB)) - pin(2 name(OSC)) - pin(3 name(VDD)) - pin(4 name(VSS)) - - # Subcircuits and their connections - circuit(1 INV2PAIR location(19420 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 1) - pin(4 10) - pin(5 2) - pin(6 3) - ) - circuit(2 INV2PAIR location(-1700 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 8) - pin(4 1) - pin(5 9) - pin(6 3) - ) - circuit(3 INV2PAIR location(3580 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 7) - pin(4 9) - pin(5 12) - pin(6 3) - ) - circuit(4 INV2PAIR location(8860 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 6) - pin(4 12) - pin(5 11) - pin(6 3) - ) - circuit(5 INV2PAIR location(14140 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 5) - pin(4 11) - pin(5 10) - pin(6 3) - ) - - ) -) - -# Reference netlist -reference( - - # Device class section - class(PMOS MOS4) - class(NMOS MOS4) - - # Circuit section - # Circuits are the hierarchical building blocks of the netlist. - circuit(INV2 - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('5')) - net(6 name('6')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - pin(5 name('5')) - pin(6 name('6')) - - # Devices and their connections - device(1 PMOS - name($1) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 5) - terminal(G 2) - terminal(D 3) - terminal(B 1) - ) - device(2 NMOS - name($3) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 4) - terminal(G 2) - terminal(D 3) - terminal(B 6) - ) - - ) - circuit(INV2PAIR - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('5')) - net(6 name('6')) - net(7 name('7')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - pin(5 name('5')) - pin(6 name('6')) - pin(7 name('7')) - - # Subcircuits and their connections - circuit(1 INV2 name($1) - pin(0 7) - pin(1 5) - pin(2 4) - pin(3 3) - pin(4 2) - pin(5 1) - ) - circuit(2 INV2 name($2) - pin(0 7) - pin(1 4) - pin(2 6) - pin(3 3) - pin(4 2) - pin(5 1) - ) - - ) - circuit(RINGO - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('6')) - net(6 name('100')) - net(7 name('5')) - net(8 name('101')) - net(9 name('8')) - net(10 name('102')) - net(11 name('7')) - net(12 name('103')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - - # Subcircuits and their connections - circuit(1 INV2PAIR name($1) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 1) - pin(4 5) - pin(5 2) - pin(6 3) - ) - circuit(2 INV2PAIR name($2) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 6) - pin(4 1) - pin(5 7) - pin(6 3) - ) - circuit(3 INV2PAIR name($3) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 8) - pin(4 7) - pin(5 9) - pin(6 3) - ) - circuit(4 INV2PAIR name($4) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 10) - pin(4 9) - pin(5 11) - pin(6 3) - ) - circuit(5 INV2PAIR name($5) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 12) - pin(4 11) - pin(5 5) - pin(6 3) - ) - - ) -) - -# Cross reference -xref( - circuit(INV2 INV2 match - xref( - net(1 1 match) - net(6 6 match) - net(2 2 match) - net(3 3 match) - net(5 5 match) - net(4 4 match) - pin(0 0 match) - pin(5 5 match) - pin(1 1 match) - pin(2 2 match) - pin(4 4 match) - pin(3 3 match) - device(3 2 match) - device(1 1 match) - ) - ) - circuit(INV2PAIR INV2PAIR match - xref( - net(2 2 match) - net(3 3 match) - net(4 4 match) - net(5 5 match) - net(6 6 match) - net(7 7 match) - net(1 1 match) - pin(1 1 match) - pin(2 2 match) - pin(3 3 match) - pin(4 4 match) - pin(5 5 match) - pin(6 6 match) - pin(0 0 match) - circuit(1 1 match) - circuit(2 2 match) - ) - ) - circuit(RINGO RINGO match - xref( - net(8 6 match) - net(7 8 match) - net(6 10 match) - net(5 12 match) - net(9 7 match) - net(10 5 match) - net(11 11 match) - net(12 9 match) - net(1 1 match) - net(2 2 match) - net(3 3 match) - net(4 4 match) - pin(0 0 match) - pin(1 1 match) - pin(2 2 match) - pin(3 3 match) - circuit(1 1 match) - circuit(2 2 match) - circuit(3 3 match) - circuit(4 4 match) - circuit(5 5 match) - ) - ) -) diff --git a/testdata/algo/lvs_test1b_au.lvsdb.2 b/testdata/algo/lvs_test1b_au.lvsdb.2 deleted file mode 100644 index 5ca795b84..000000000 --- a/testdata/algo/lvs_test1b_au.lvsdb.2 +++ /dev/null @@ -1,646 +0,0 @@ -#%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(bulk) - layer(nwell '1/0') - layer(poly '3/0') - layer(poly_lbl '3/1') - layer(diff_cont '4/0') - layer(poly_cont '5/0') - layer(metal1 '6/0') - layer(metal1_lbl '6/1') - layer(via1 '7/0') - layer(metal2 '8/0') - layer(metal2_lbl '8/1') - layer(ntie) - layer(psd) - layer(ptie) - layer(nsd) - - # Mask layer connectivity - connect(nwell nwell ntie) - connect(poly poly poly_lbl poly_cont) - connect(poly_lbl poly) - connect(diff_cont diff_cont metal1 ntie psd ptie nsd) - connect(poly_cont poly poly_cont metal1) - connect(metal1 diff_cont poly_cont metal1 metal1_lbl via1) - connect(metal1_lbl metal1) - connect(via1 metal1 via1 metal2) - connect(metal2 via1 metal2 metal2_lbl) - connect(metal2_lbl metal2) - connect(ntie nwell diff_cont ntie) - connect(psd diff_cont psd) - connect(ptie diff_cont ptie) - connect(nsd diff_cont nsd) - - # Global nets and connectivity - global(bulk BULK) - global(ptie BULK) - - # 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(psd (-650 -875) (525 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(psd (125 -875) (550 1750)) - ) - terminal(B - rect(nwell (-125 -875) (250 1750)) - ) - ) - device(D$PMOS$1 PMOS - terminal(S - rect(psd (-675 -875) (550 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(psd (125 -875) (525 1750)) - ) - terminal(B - rect(nwell (-125 -875) (250 1750)) - ) - ) - device(D$NMOS NMOS - terminal(S - rect(nsd (-650 -875) (525 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(nsd (125 -875) (550 1750)) - ) - terminal(B - rect(bulk (-125 -875) (250 1750)) - ) - ) - device(D$NMOS$1 NMOS - terminal(S - rect(nsd (-675 -875) (550 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(nsd (125 -875) (525 1750)) - ) - terminal(B - rect(bulk (-125 -875) (250 1750)) - ) - ) - - # Circuit section - # Circuits are the hierarchical building blocks of the netlist. - circuit(INV2 - - # Circuit boundary - rect((-1700 -2440) (3100 7820)) - - # Nets with their geometries - net(1 - rect(nwell (-1400 1800) (2800 3580)) - rect(diff_cont (-1510 -650) (220 220)) - rect(ntie (-510 -450) (800 680)) - ) - net(2 name(IN) - rect(poly (-525 -250) (250 2500)) - rect(poly (-1425 -630) (2100 360)) - rect(poly (-125 -2230) (250 2500)) - rect(poly (-1050 -3850) (250 2400)) - rect(poly (550 1200) (250 2400)) - rect(poly (-250 -6000) (250 2400)) - rect(poly (-1050 1200) (250 2400)) - rect(poly_lbl (-525 -2600) (0 0)) - rect(poly_cont (-830 -110) (220 220)) - ) - net(3 name(OUT) - rect(diff_cont (-910 90) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (1380 3380) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 -3820) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-1820 3380) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(metal1 (1310 -3710) (360 2220)) - rect(metal1 (-1900 -800) (2220 360)) - rect(metal1 (-2280 -2400) (360 2840)) - rect(metal1 (-360 -3600) (360 1560)) - rect(metal1 (1240 2040) (360 1560)) - rect(metal1 (-360 -5160) (360 1560)) - rect(metal1 (-1960 2040) (360 1560)) - rect(metal1_lbl (1420 -2180) (0 0)) - rect(psd (-1850 525) (525 1750)) - rect(psd (1050 -1750) (525 1750)) - rect(nsd (-2100 -5350) (525 1750)) - rect(nsd (1050 -1750) (525 1750)) - ) - net(4 name(VSS) - rect(diff_cont (-110 90) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 980) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(metal1 (-290 -290) (360 1560)) - rect(metal1 (-360 -1560) (360 1560)) - rect(via1 (-305 -705) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(via1 (-250 -1450) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(metal2 (-1525 -775) (2800 1700)) - rect(metal2_lbl (-160 -540) (0 0)) - rect(nsd (-1515 -1185) (550 1750)) - ) - net(5 name(VDD) - rect(diff_cont (-110 2490) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 -1420) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(metal1 (-290 -1490) (360 1560)) - rect(metal1 (-360 -1560) (360 1560)) - rect(via1 (-305 -1505) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(metal2 (-1525 -1575) (2800 1700)) - rect(metal2_lbl (-150 -1250) (0 0)) - rect(psd (-1525 -475) (550 1750)) - ) - net(6 name(BULK) - rect(diff_cont (-110 -2160) (220 220)) - rect(ptie (-510 -450) (800 680)) - ) - - # Outgoing pins and their connections to nets - pin(1) - pin(2 name(IN)) - pin(3 name(OUT)) - pin(4 name(VSS)) - pin(5 name(VDD)) - pin(6 name(BULK)) - - # Devices and their connections - device(1 D$PMOS - device(D$PMOS$1 location(800 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(-400 3200) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 3) - terminal(G 2) - terminal(D 5) - terminal(B 1) - ) - device(2 D$NMOS - device(D$NMOS$1 location(800 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(-400 -400) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 3) - terminal(G 2) - terminal(D 4) - terminal(B 6) - ) - - ) - circuit(INV2PAIR - - # Circuit boundary - rect((0 -1640) (5740 7820)) - - # Nets with their geometries - net(1 name(BULK)) - net(2) - net(3) - net(4) - net(5) - net(6) - net(7) - - # Outgoing pins and their connections to nets - pin(1 name(BULK)) - pin(2) - pin(3) - pin(4) - pin(5) - pin(6) - pin(7) - - # Subcircuits and their connections - circuit(1 INV2 location(1700 800) - pin(0 7) - pin(1 5) - pin(2 4) - pin(3 3) - pin(4 2) - pin(5 1) - ) - circuit(2 INV2 location(4340 800) - pin(0 7) - pin(1 4) - pin(2 6) - pin(3 3) - pin(4 2) - pin(5 1) - ) - - ) - circuit(RINGO - - # Circuit boundary - rect((-1720 -2440) (26880 7820)) - - # Nets with their geometries - net(1 name(FB) - rect(metal1 (-1700 1620) (360 360)) - rect(via1 (-305 -305) (250 250)) - rect(via1 (23190 -250) (250 250)) - rect(metal2 (-23765 -325) (23840 400)) - rect(metal2_lbl (-22120 -200) (0 0)) - ) - net(2 name(OSC) - rect(via1 (24435 1675) (250 250)) - rect(metal2 (-325 -325) (400 400)) - rect(metal2_lbl (-200 -200) (0 0)) - ) - net(3 name(VDD) - rect(metal1 (-180 3900) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal2_lbl (-23940 -2220) (0 0)) - ) - net(4 name(VSS) - rect(metal1 (-180 -2220) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal2_lbl (-23940 1100) (0 0)) - ) - net(5) - net(6) - net(7) - net(8) - net(9) - net(10) - net(11) - net(12) - - # Outgoing pins and their connections to nets - pin(1 name(FB)) - pin(2 name(OSC)) - pin(3 name(VDD)) - pin(4 name(VSS)) - - # Subcircuits and their connections - circuit(1 INV2PAIR location(19420 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 1) - pin(4 10) - pin(5 2) - pin(6 3) - ) - circuit(2 INV2PAIR location(-1700 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 8) - pin(4 1) - pin(5 9) - pin(6 3) - ) - circuit(3 INV2PAIR location(3580 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 7) - pin(4 9) - pin(5 12) - pin(6 3) - ) - circuit(4 INV2PAIR location(8860 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 6) - pin(4 12) - pin(5 11) - pin(6 3) - ) - circuit(5 INV2PAIR location(14140 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 5) - pin(4 11) - pin(5 10) - pin(6 3) - ) - - ) -) - -# Reference netlist -reference( - - # Device class section - class(PMOS MOS4) - class(NMOS MOS4) - - # Circuit section - # Circuits are the hierarchical building blocks of the netlist. - circuit(INV2 - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('5')) - net(6 name('6')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - pin(5 name('5')) - pin(6 name('6')) - - # Devices and their connections - device(1 PMOS - name($1) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 5) - terminal(G 2) - terminal(D 3) - terminal(B 1) - ) - device(2 NMOS - name($3) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 4) - terminal(G 2) - terminal(D 3) - terminal(B 6) - ) - - ) - circuit(INV2PAIR - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('5')) - net(6 name('6')) - net(7 name('7')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - pin(5 name('5')) - pin(6 name('6')) - pin(7 name('7')) - - # Subcircuits and their connections - circuit(1 INV2 name($1) - pin(0 7) - pin(1 5) - pin(2 4) - pin(3 3) - pin(4 2) - pin(5 1) - ) - circuit(2 INV2 name($2) - pin(0 7) - pin(1 4) - pin(2 6) - pin(3 3) - pin(4 2) - pin(5 1) - ) - - ) - circuit(RINGO - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('6')) - net(6 name('100')) - net(7 name('5')) - net(8 name('101')) - net(9 name('8')) - net(10 name('102')) - net(11 name('7')) - net(12 name('103')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - - # Subcircuits and their connections - circuit(1 INV2PAIR name($1) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 1) - pin(4 5) - pin(5 2) - pin(6 3) - ) - circuit(2 INV2PAIR name($2) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 6) - pin(4 1) - pin(5 7) - pin(6 3) - ) - circuit(3 INV2PAIR name($3) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 8) - pin(4 7) - pin(5 9) - pin(6 3) - ) - circuit(4 INV2PAIR name($4) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 10) - pin(4 9) - pin(5 11) - pin(6 3) - ) - circuit(5 INV2PAIR name($5) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 12) - pin(4 11) - pin(5 5) - pin(6 3) - ) - - ) -) - -# Cross reference -xref( - circuit(INV2 INV2 match - xref( - net(1 1 match) - net(6 6 match) - net(2 2 match) - net(3 3 match) - net(5 5 match) - net(4 4 match) - pin(0 0 match) - pin(5 5 match) - pin(1 1 match) - pin(2 2 match) - pin(4 4 match) - pin(3 3 match) - device(2 2 match) - device(1 1 match) - ) - ) - circuit(INV2PAIR INV2PAIR match - xref( - net(2 2 match) - net(3 3 match) - net(4 4 match) - net(5 5 match) - net(6 6 match) - net(7 7 match) - net(1 1 match) - pin(1 1 match) - pin(2 2 match) - pin(3 3 match) - pin(4 4 match) - pin(5 5 match) - pin(6 6 match) - pin(0 0 match) - circuit(1 1 match) - circuit(2 2 match) - ) - ) - circuit(RINGO RINGO match - xref( - net(8 6 match) - net(7 8 match) - net(6 10 match) - net(5 12 match) - net(9 7 match) - net(10 5 match) - net(11 11 match) - net(12 9 match) - net(1 1 match) - net(2 2 match) - net(3 3 match) - net(4 4 match) - pin(0 0 match) - pin(1 1 match) - pin(2 2 match) - pin(3 3 match) - circuit(1 1 match) - circuit(2 2 match) - circuit(3 3 match) - circuit(4 4 match) - circuit(5 5 match) - ) - ) -) diff --git a/testdata/algo/lvs_test2_au.lvsdb.2 b/testdata/algo/lvs_test2_au.lvsdb.2 deleted file mode 100644 index 969594ebe..000000000 --- a/testdata/algo/lvs_test2_au.lvsdb.2 +++ /dev/null @@ -1,677 +0,0 @@ -#%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(bulk) - layer(nwell '1/0') - layer(poly '3/0') - layer(poly_lbl '3/1') - layer(diff_cont '4/0') - layer(poly_cont '5/0') - layer(metal1 '6/0') - layer(metal1_lbl '6/1') - layer(via1 '7/0') - layer(metal2 '8/0') - layer(metal2_lbl '8/1') - layer(ntie) - layer(psd) - layer(ptie) - layer(nsd) - - # Mask layer connectivity - connect(nwell nwell ntie) - connect(poly poly poly_lbl poly_cont) - connect(poly_lbl poly) - connect(diff_cont diff_cont metal1 ntie psd ptie nsd) - connect(poly_cont poly poly_cont metal1) - connect(metal1 diff_cont poly_cont metal1 metal1_lbl via1) - connect(metal1_lbl metal1) - connect(via1 metal1 via1 metal2) - connect(metal2 via1 metal2 metal2_lbl) - connect(metal2_lbl metal2) - connect(ntie nwell diff_cont ntie) - connect(psd diff_cont psd) - connect(ptie diff_cont ptie) - connect(nsd diff_cont nsd) - - # Global nets and connectivity - global(bulk BULK) - global(ptie BULK) - - # 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(psd (-650 -875) (525 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(psd (125 -875) (550 1750)) - ) - terminal(B - rect(nwell (-125 -875) (250 1750)) - ) - ) - device(D$PMOS$1 PMOS - terminal(S - rect(psd (-675 -875) (550 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(psd (125 -875) (525 1750)) - ) - terminal(B - rect(nwell (-125 -875) (250 1750)) - ) - ) - device(D$NMOS NMOS - terminal(S - rect(nsd (-650 -875) (525 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(nsd (125 -875) (550 1750)) - ) - terminal(B - rect(bulk (-125 -875) (250 1750)) - ) - ) - device(D$NMOS$1 NMOS - terminal(S - rect(nsd (-675 -875) (550 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(nsd (125 -875) (525 1750)) - ) - terminal(B - rect(bulk (-125 -875) (250 1750)) - ) - ) - - # Circuit section - # Circuits are the hierarchical building blocks of the netlist. - circuit(INV2 - - # Circuit boundary - rect((-1700 -2440) (3100 7820)) - - # Nets with their geometries - net(1 - rect(nwell (-1400 1800) (2800 3580)) - rect(diff_cont (-1510 -650) (220 220)) - rect(ntie (-510 -450) (800 680)) - ) - net(2 name(IN) - rect(poly (-525 -250) (250 2500)) - rect(poly (-1425 -630) (2100 360)) - rect(poly (-125 -2230) (250 2500)) - rect(poly (-1050 -3850) (250 2400)) - rect(poly (550 1200) (250 2400)) - rect(poly (-250 -6000) (250 2400)) - rect(poly (-1050 1200) (250 2400)) - rect(poly_lbl (-525 -2600) (0 0)) - rect(poly_cont (-830 -110) (220 220)) - ) - net(3 name(OUT) - rect(diff_cont (-910 90) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (1380 3380) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 -3820) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-1820 3380) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(metal1 (1310 -3710) (360 2220)) - rect(metal1 (-1900 -800) (2220 360)) - rect(metal1 (-2280 -2400) (360 2840)) - rect(metal1 (-360 -3600) (360 1560)) - rect(metal1 (1240 2040) (360 1560)) - rect(metal1 (-360 -5160) (360 1560)) - rect(metal1 (-1960 2040) (360 1560)) - rect(metal1_lbl (1420 -2180) (0 0)) - rect(psd (-1850 525) (525 1750)) - rect(psd (1050 -1750) (525 1750)) - rect(nsd (-2100 -5350) (525 1750)) - rect(nsd (1050 -1750) (525 1750)) - ) - net(4 name(VSS) - rect(diff_cont (-110 90) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 980) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(metal1 (-290 -290) (360 1560)) - rect(metal1 (-360 -1560) (360 1560)) - rect(via1 (-305 -705) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(via1 (-250 -1450) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(metal2 (-1525 -775) (2800 1700)) - rect(metal2_lbl (-160 -540) (0 0)) - rect(nsd (-1515 -1185) (550 1750)) - ) - net(5 name(VDD) - rect(diff_cont (-110 2490) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 -1420) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(metal1 (-290 -1490) (360 1560)) - rect(metal1 (-360 -1560) (360 1560)) - rect(via1 (-305 -1505) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(metal2 (-1525 -1575) (2800 1700)) - rect(metal2_lbl (-150 -1250) (0 0)) - rect(psd (-1525 -475) (550 1750)) - ) - net(6 name(BULK) - rect(diff_cont (-110 -2160) (220 220)) - rect(ptie (-510 -450) (800 680)) - ) - - # Outgoing pins and their connections to nets - pin(1) - pin(2 name(IN)) - pin(3 name(OUT)) - pin(4 name(VSS)) - pin(5 name(VDD)) - pin(6 name(BULK)) - - # Devices and their connections - device(1 D$PMOS - device(D$PMOS$1 location(800 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(-400 3200) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 3) - terminal(G 2) - terminal(D 5) - terminal(B 1) - ) - device(3 D$NMOS - device(D$NMOS$1 location(800 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(-400 -400) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 3) - terminal(G 2) - terminal(D 4) - terminal(B 6) - ) - - ) - circuit(INV2PAIR - - # Circuit boundary - rect((0 -1640) (5740 7820)) - - # Nets with their geometries - net(1 name(BULK)) - net(2) - net(3) - net(4) - net(5) - net(6) - net(7) - - # Outgoing pins and their connections to nets - pin(1 name(BULK)) - pin(2) - pin(3) - pin(4) - pin(5) - pin(6) - pin(7) - - # Subcircuits and their connections - circuit(1 INV2 location(1700 800) - pin(0 7) - pin(1 5) - pin(2 4) - pin(3 3) - pin(4 2) - pin(5 1) - ) - circuit(2 INV2 location(4340 800) - pin(0 7) - pin(1 4) - pin(2 6) - pin(3 3) - pin(4 2) - pin(5 1) - ) - - ) - circuit(RINGO - - # Circuit boundary - rect((-1720 -2440) (26880 7820)) - - # Nets with their geometries - net(1 name(FB) - rect(metal1 (-1700 1620) (360 360)) - rect(via1 (-305 -305) (250 250)) - rect(via1 (23190 -250) (250 250)) - rect(metal2 (-23765 -325) (23840 400)) - rect(metal2_lbl (-22120 -200) (0 0)) - ) - net(2 name(OSC) - rect(via1 (24435 1675) (250 250)) - rect(metal2 (-325 -325) (400 400)) - rect(metal2_lbl (-200 -200) (0 0)) - ) - net(3 name(VDD) - rect(metal1 (-180 3900) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal2_lbl (-23940 -2220) (0 0)) - ) - net(4 name(VSS) - rect(metal1 (-180 -2220) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal2_lbl (-23940 1100) (0 0)) - ) - net(5) - net(6) - net(7) - net(8) - net(9) - net(10) - net(11) - net(12) - - # Outgoing pins and their connections to nets - pin(1 name(FB)) - pin(2 name(OSC)) - pin(3 name(VDD)) - pin(4 name(VSS)) - - # Subcircuits and their connections - circuit(1 INV2PAIR location(19420 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 1) - pin(4 10) - pin(5 2) - pin(6 3) - ) - circuit(2 INV2PAIR location(-1700 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 8) - pin(4 1) - pin(5 9) - pin(6 3) - ) - circuit(3 INV2PAIR location(3580 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 7) - pin(4 9) - pin(5 12) - pin(6 3) - ) - circuit(4 INV2PAIR location(8860 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 6) - pin(4 12) - pin(5 11) - pin(6 3) - ) - circuit(5 INV2PAIR location(14140 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 5) - pin(4 11) - pin(5 10) - pin(6 3) - ) - - ) -) - -# Reference netlist -reference( - - # Device class section - class(PMOS MOS4) - class(NMOS MOS4) - - # Circuit section - # Circuits are the hierarchical building blocks of the netlist. - circuit(INV2 - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('5')) - net(6 name('6')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - pin(5 name('5')) - pin(6 name('6')) - - # Devices and their connections - device(1 PMOS - name($1) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 5) - terminal(G 2) - terminal(D 3) - terminal(B 1) - ) - device(2 NMOS - name($3) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 4) - terminal(G 2) - terminal(D 3) - terminal(B 6) - ) - - ) - circuit(INV2PAIR - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('5')) - net(6 name('6')) - net(7 name('7')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - pin(5 name('5')) - pin(6 name('6')) - pin(7 name('7')) - - # Subcircuits and their connections - circuit(1 INV2 name($2) - pin(0 7) - pin(1 4) - pin(2 6) - pin(3 3) - pin(4 2) - pin(5 1) - ) - - ) - circuit(INV2PAIRX - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('5')) - net(6 name('6')) - net(7 name('7')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - pin(5 name('5')) - pin(6 name('6')) - pin(7 name('7')) - - # Subcircuits and their connections - circuit(1 INV2 name($2) - pin(0 7) - pin(1 4) - pin(2 6) - pin(3 3) - pin(4 2) - pin(5 1) - ) - - ) - circuit(RINGO - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('6')) - net(6 name('5')) - net(7 name('101')) - net(8 name('8')) - net(9 name('102')) - net(10 name('7')) - net(11 name('103')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - - # Subcircuits and their connections - circuit(1 INV2PAIR name($1) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 1) - pin(4 5) - pin(5 2) - pin(6 3) - ) - circuit(2 INV2PAIR name($2) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 1) - pin(4 1) - pin(5 6) - pin(6 3) - ) - circuit(3 INV2PAIR name($3) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 7) - pin(4 6) - pin(5 8) - pin(6 3) - ) - circuit(4 INV2PAIR name($4) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 9) - pin(4 8) - pin(5 10) - pin(6 3) - ) - circuit(5 INV2PAIR name($5) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 11) - pin(4 10) - pin(5 5) - pin(6 3) - ) - - ) -) - -# Cross reference -xref( - circuit(() INV2PAIRX mismatch - xref( - ) - ) - circuit(INV2 INV2 match - xref( - net(1 1 match) - net(6 6 match) - net(2 2 match) - net(3 3 match) - net(5 5 match) - net(4 4 match) - pin(0 0 match) - pin(5 5 match) - pin(1 1 match) - pin(2 2 match) - pin(4 4 match) - pin(3 3 match) - device(3 2 match) - device(1 1 match) - ) - ) - circuit(INV2PAIR INV2PAIR nomatch - xref( - net(2 2 mismatch) - net(3 3 mismatch) - net(4 4 mismatch) - net(5 5 mismatch) - net(6 6 match) - net(7 7 mismatch) - net(1 1 mismatch) - pin(1 1 match) - pin(2 2 match) - pin(3 3 match) - pin(4 4 match) - pin(5 5 match) - pin(6 6 match) - pin(0 0 match) - circuit(1 () mismatch) - circuit(2 1 match) - ) - ) - circuit(RINGO RINGO nomatch - log( - entry(error description('Net $I22 is not matching any net from reference netlist')) - entry(error description('Net FB is not matching any net from reference netlist')) - ) - xref( - net(8 () mismatch) - net(7 7 match) - net(6 9 match) - net(5 11 match) - net(9 6 match) - net(10 5 match) - net(11 10 match) - net(12 8 match) - net(1 1 mismatch) - net(2 2 match) - net(3 3 match) - net(4 4 match) - pin(0 0 match) - pin(1 1 match) - pin(2 2 match) - pin(3 3 match) - circuit(() 2 mismatch) - circuit(2 () mismatch) - circuit(1 1 match) - circuit(3 3 match) - circuit(4 4 match) - circuit(5 5 match) - ) - ) -) diff --git a/testdata/algo/lvs_test2b_au.lvsdb.2 b/testdata/algo/lvs_test2b_au.lvsdb.2 deleted file mode 100644 index 47e45e369..000000000 --- a/testdata/algo/lvs_test2b_au.lvsdb.2 +++ /dev/null @@ -1,677 +0,0 @@ -#%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(bulk) - layer(nwell '1/0') - layer(poly '3/0') - layer(poly_lbl '3/1') - layer(diff_cont '4/0') - layer(poly_cont '5/0') - layer(metal1 '6/0') - layer(metal1_lbl '6/1') - layer(via1 '7/0') - layer(metal2 '8/0') - layer(metal2_lbl '8/1') - layer(ntie) - layer(psd) - layer(ptie) - layer(nsd) - - # Mask layer connectivity - connect(nwell nwell ntie) - connect(poly poly poly_lbl poly_cont) - connect(poly_lbl poly) - connect(diff_cont diff_cont metal1 ntie psd ptie nsd) - connect(poly_cont poly poly_cont metal1) - connect(metal1 diff_cont poly_cont metal1 metal1_lbl via1) - connect(metal1_lbl metal1) - connect(via1 metal1 via1 metal2) - connect(metal2 via1 metal2 metal2_lbl) - connect(metal2_lbl metal2) - connect(ntie nwell diff_cont ntie) - connect(psd diff_cont psd) - connect(ptie diff_cont ptie) - connect(nsd diff_cont nsd) - - # Global nets and connectivity - global(bulk BULK) - global(ptie BULK) - - # 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(psd (-650 -875) (525 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(psd (125 -875) (550 1750)) - ) - terminal(B - rect(nwell (-125 -875) (250 1750)) - ) - ) - device(D$PMOS$1 PMOS - terminal(S - rect(psd (-675 -875) (550 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(psd (125 -875) (525 1750)) - ) - terminal(B - rect(nwell (-125 -875) (250 1750)) - ) - ) - device(D$NMOS NMOS - terminal(S - rect(nsd (-650 -875) (525 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(nsd (125 -875) (550 1750)) - ) - terminal(B - rect(bulk (-125 -875) (250 1750)) - ) - ) - device(D$NMOS$1 NMOS - terminal(S - rect(nsd (-675 -875) (550 1750)) - ) - terminal(G - rect(poly (-125 -875) (250 1750)) - ) - terminal(D - rect(nsd (125 -875) (525 1750)) - ) - terminal(B - rect(bulk (-125 -875) (250 1750)) - ) - ) - - # Circuit section - # Circuits are the hierarchical building blocks of the netlist. - circuit(INV2 - - # Circuit boundary - rect((-1700 -2440) (3100 7820)) - - # Nets with their geometries - net(1 - rect(nwell (-1400 1800) (2800 3580)) - rect(diff_cont (-1510 -650) (220 220)) - rect(ntie (-510 -450) (800 680)) - ) - net(2 name(IN) - rect(poly (-525 -250) (250 2500)) - rect(poly (-1425 -630) (2100 360)) - rect(poly (-125 -2230) (250 2500)) - rect(poly (-1050 -3850) (250 2400)) - rect(poly (550 1200) (250 2400)) - rect(poly (-250 -6000) (250 2400)) - rect(poly (-1050 1200) (250 2400)) - rect(poly_lbl (-525 -2600) (0 0)) - rect(poly_cont (-830 -110) (220 220)) - ) - net(3 name(OUT) - rect(diff_cont (-910 90) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (1380 3380) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 -3820) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-1820 3380) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(metal1 (1310 -3710) (360 2220)) - rect(metal1 (-1900 -800) (2220 360)) - rect(metal1 (-2280 -2400) (360 2840)) - rect(metal1 (-360 -3600) (360 1560)) - rect(metal1 (1240 2040) (360 1560)) - rect(metal1 (-360 -5160) (360 1560)) - rect(metal1 (-1960 2040) (360 1560)) - rect(metal1_lbl (1420 -2180) (0 0)) - rect(psd (-1850 525) (525 1750)) - rect(psd (1050 -1750) (525 1750)) - rect(nsd (-2100 -5350) (525 1750)) - rect(nsd (1050 -1750) (525 1750)) - ) - net(4 name(VSS) - rect(diff_cont (-110 90) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 980) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(diff_cont (-220 -620) (220 220)) - rect(metal1 (-290 -290) (360 1560)) - rect(metal1 (-360 -1560) (360 1560)) - rect(via1 (-305 -705) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(via1 (-250 -1450) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(metal2 (-1525 -775) (2800 1700)) - rect(metal2_lbl (-160 -540) (0 0)) - rect(nsd (-1515 -1185) (550 1750)) - ) - net(5 name(VDD) - rect(diff_cont (-110 2490) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 -1420) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(diff_cont (-220 180) (220 220)) - rect(metal1 (-290 -1490) (360 1560)) - rect(metal1 (-360 -1560) (360 1560)) - rect(via1 (-305 -1505) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(via1 (-250 150) (250 250)) - rect(metal2 (-1525 -1575) (2800 1700)) - rect(metal2_lbl (-150 -1250) (0 0)) - rect(psd (-1525 -475) (550 1750)) - ) - net(6 name(BULK) - rect(diff_cont (-110 -2160) (220 220)) - rect(ptie (-510 -450) (800 680)) - ) - - # Outgoing pins and their connections to nets - pin(1) - pin(2 name(IN)) - pin(3 name(OUT)) - pin(4 name(VSS)) - pin(5 name(VDD)) - pin(6 name(BULK)) - - # Devices and their connections - device(1 D$PMOS - device(D$PMOS$1 location(800 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(-400 3200) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 3) - terminal(G 2) - terminal(D 5) - terminal(B 1) - ) - device(2 D$NMOS - device(D$NMOS$1 location(800 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(-400 -400) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 3) - terminal(G 2) - terminal(D 4) - terminal(B 6) - ) - - ) - circuit(INV2PAIR - - # Circuit boundary - rect((0 -1640) (5740 7820)) - - # Nets with their geometries - net(1 name(BULK)) - net(2) - net(3) - net(4) - net(5) - net(6) - net(7) - - # Outgoing pins and their connections to nets - pin(1 name(BULK)) - pin(2) - pin(3) - pin(4) - pin(5) - pin(6) - pin(7) - - # Subcircuits and their connections - circuit(1 INV2 location(1700 800) - pin(0 7) - pin(1 5) - pin(2 4) - pin(3 3) - pin(4 2) - pin(5 1) - ) - circuit(2 INV2 location(4340 800) - pin(0 7) - pin(1 4) - pin(2 6) - pin(3 3) - pin(4 2) - pin(5 1) - ) - - ) - circuit(RINGO - - # Circuit boundary - rect((-1720 -2440) (26880 7820)) - - # Nets with their geometries - net(1 name(FB) - rect(metal1 (-1700 1620) (360 360)) - rect(via1 (-305 -305) (250 250)) - rect(via1 (23190 -250) (250 250)) - rect(metal2 (-23765 -325) (23840 400)) - rect(metal2_lbl (-22120 -200) (0 0)) - ) - net(2 name(OSC) - rect(via1 (24435 1675) (250 250)) - rect(metal2 (-325 -325) (400 400)) - rect(metal2_lbl (-200 -200) (0 0)) - ) - net(3 name(VDD) - rect(metal1 (-180 3900) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal2_lbl (-23940 -2220) (0 0)) - ) - net(4 name(VSS) - rect(metal1 (-180 -2220) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal1 (2280 -1120) (360 1120)) - rect(metal2_lbl (-23940 1100) (0 0)) - ) - net(5) - net(6) - net(7) - net(8) - net(9) - net(10) - net(11) - net(12) - - # Outgoing pins and their connections to nets - pin(1 name(FB)) - pin(2 name(OSC)) - pin(3 name(VDD)) - pin(4 name(VSS)) - - # Subcircuits and their connections - circuit(1 INV2PAIR location(19420 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 1) - pin(4 10) - pin(5 2) - pin(6 3) - ) - circuit(2 INV2PAIR location(-1700 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 8) - pin(4 1) - pin(5 9) - pin(6 3) - ) - circuit(3 INV2PAIR location(3580 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 7) - pin(4 9) - pin(5 12) - pin(6 3) - ) - circuit(4 INV2PAIR location(8860 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 6) - pin(4 12) - pin(5 11) - pin(6 3) - ) - circuit(5 INV2PAIR location(14140 -800) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 5) - pin(4 11) - pin(5 10) - pin(6 3) - ) - - ) -) - -# Reference netlist -reference( - - # Device class section - class(PMOS MOS4) - class(NMOS MOS4) - - # Circuit section - # Circuits are the hierarchical building blocks of the netlist. - circuit(INV2 - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('5')) - net(6 name('6')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - pin(5 name('5')) - pin(6 name('6')) - - # Devices and their connections - device(1 PMOS - name($1) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 5) - terminal(G 2) - terminal(D 3) - terminal(B 1) - ) - device(2 NMOS - name($3) - param(L 0.25) - param(W 3.5) - param(AS 1.4) - param(AD 1.4) - param(PS 6.85) - param(PD 6.85) - terminal(S 4) - terminal(G 2) - terminal(D 3) - terminal(B 6) - ) - - ) - circuit(INV2PAIR - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('5')) - net(6 name('6')) - net(7 name('7')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - pin(5 name('5')) - pin(6 name('6')) - pin(7 name('7')) - - # Subcircuits and their connections - circuit(1 INV2 name($2) - pin(0 7) - pin(1 4) - pin(2 6) - pin(3 3) - pin(4 2) - pin(5 1) - ) - - ) - circuit(INV2PAIRX - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('5')) - net(6 name('6')) - net(7 name('7')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - pin(5 name('5')) - pin(6 name('6')) - pin(7 name('7')) - - # Subcircuits and their connections - circuit(1 INV2 name($2) - pin(0 7) - pin(1 4) - pin(2 6) - pin(3 3) - pin(4 2) - pin(5 1) - ) - - ) - circuit(RINGO - - # Nets - net(1 name('1')) - net(2 name('2')) - net(3 name('3')) - net(4 name('4')) - net(5 name('6')) - net(6 name('5')) - net(7 name('101')) - net(8 name('8')) - net(9 name('102')) - net(10 name('7')) - net(11 name('103')) - - # Outgoing pins and their connections to nets - pin(1 name('1')) - pin(2 name('2')) - pin(3 name('3')) - pin(4 name('4')) - - # Subcircuits and their connections - circuit(1 INV2PAIR name($1) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 1) - pin(4 5) - pin(5 2) - pin(6 3) - ) - circuit(2 INV2PAIR name($2) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 1) - pin(4 1) - pin(5 6) - pin(6 3) - ) - circuit(3 INV2PAIR name($3) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 7) - pin(4 6) - pin(5 8) - pin(6 3) - ) - circuit(4 INV2PAIR name($4) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 9) - pin(4 8) - pin(5 10) - pin(6 3) - ) - circuit(5 INV2PAIR name($5) - pin(0 4) - pin(1 3) - pin(2 4) - pin(3 11) - pin(4 10) - pin(5 5) - pin(6 3) - ) - - ) -) - -# Cross reference -xref( - circuit(() INV2PAIRX mismatch - xref( - ) - ) - circuit(INV2 INV2 match - xref( - net(1 1 match) - net(6 6 match) - net(2 2 match) - net(3 3 match) - net(5 5 match) - net(4 4 match) - pin(0 0 match) - pin(5 5 match) - pin(1 1 match) - pin(2 2 match) - pin(4 4 match) - pin(3 3 match) - device(2 2 match) - device(1 1 match) - ) - ) - circuit(INV2PAIR INV2PAIR nomatch - xref( - net(2 2 mismatch) - net(3 3 mismatch) - net(4 4 mismatch) - net(5 5 mismatch) - net(6 6 match) - net(7 7 mismatch) - net(1 1 mismatch) - pin(1 1 match) - pin(2 2 match) - pin(3 3 match) - pin(4 4 match) - pin(5 5 match) - pin(6 6 match) - pin(0 0 match) - circuit(1 () mismatch) - circuit(2 1 match) - ) - ) - circuit(RINGO RINGO nomatch - log( - entry(error description('Net $I22 is not matching any net from reference netlist')) - entry(error description('Net FB is not matching any net from reference netlist')) - ) - xref( - net(8 () mismatch) - net(7 7 match) - net(6 9 match) - net(5 11 match) - net(9 6 match) - net(10 5 match) - net(11 10 match) - net(12 8 match) - net(1 1 mismatch) - net(2 2 match) - net(3 3 match) - net(4 4 match) - pin(0 0 match) - pin(1 1 match) - pin(2 2 match) - pin(3 3 match) - circuit(() 2 mismatch) - circuit(2 () mismatch) - circuit(1 1 match) - circuit(3 3 match) - circuit(4 4 match) - circuit(5 5 match) - ) - ) -) diff --git a/testdata/algo/measure_net_au.oas b/testdata/algo/measure_net_au.oas index da1540dc421e7c2694d498b5041cebf53b179810..7dbc99398ac99c9e1df85aa7ca60c7f9e0d4aa42 100644 GIT binary patch delta 402 zcmV;D0d4;K1?2{i<$vY_=mK3)JxD@P6h7xZpPCoBYWF!QZ>Y`1AwnS}nwo@$pv57` zeg>f>5aPjeX=>2Tpy4{V*e1BVw!q~HK_N)bwaKk$>f9%lb*FQ`^ZlHAZh8(aXEwp~ zo;P6f6+ziSt!H!aMKU2v{x$knMyD#L%oqK}Sb%g4Wxs5OD1V2K{fun3s|%4lS9ZVQ z4N*=bzG#ndEI2&YQ_?ZJ7s@7yHufqRdC;x~PX@(miR+ML^%6`7p4kJHO(a0wFspoo z%&T~nmg73PtQmvwtZnDAQAp*oG3cUILPk`t5)SlB0??#gBK-i?*0wn9B%M!3wj`bLEVf+hCCD|WhE+xq51eyDZ1P+lNYHesjFpjhw4*fUG zSnC7~sn214N7t~gZjtuFA*gYtLxRb|pl9m(HS8(eX)~|6blK3g}7Bd#VFAR w3qRVR`_95om4|0k(nov&0|7xC7XS#S0Rsb6Pf#2e00#)+0RjQh1e5;({A)nGZ2$lO delta 277 zcmV+w0qXwc2Kxn&<$u@${s9yGz|dIx@D`(B;DH@XBKH{?7RWz{T`14ZaDktfOT^+r z595V4=81kHcbP8mZ^*sK&mdCEyg>ej8CaB?;YX;DNW}y{h$fMO1@aqm5A0?Xxyy2a zf5K_Ti~QUSCsGAOYFTHLE|3Rm0U3P2PDmtTg5QHH%s^{FT7Md9fm(#C8CV$}TxU86 zWL7W&1s2R?617ZWWIAAXz^<{jp;ktWm7M_$lpSQm*cb$4#Ml{TFp63*G69tyumd{? zp@@M2q{suP2reLM12gSmEH~o?epwb?E}#YmR**^qkZ~UvMJ-d2%|q70Aj+8ras~%K bGn%CWyi6zxWdj8G8Iw=~7Xs%4lW79{u�w From c50b56f868ad909432aa758dd734c421fd6b3497 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 4 Jan 2026 17:10:08 +0100 Subject: [PATCH 07/19] Shortcutting evalute_nets if there is nothing to do. --- src/db/db/dbLayoutToNetlist.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/db/db/dbLayoutToNetlist.cc b/src/db/db/dbLayoutToNetlist.cc index a83234e2b..52637e829 100644 --- a/src/db/db/dbLayoutToNetlist.cc +++ b/src/db/db/dbLayoutToNetlist.cc @@ -1831,7 +1831,11 @@ LayoutToNetlist::get_shapes_of_net (db::cell_index_type ci, size_t cid, const st } } - if (npoly >= max_polygons) { + if (n == 0) { + + // nothing to do ... + + } else if (npoly >= max_polygons) { db::Box bbox; From b44bab9943924076ff115f1328a17b2479941914 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 4 Jan 2026 17:10:35 +0100 Subject: [PATCH 08/19] Making net name mandatory (using expanded_name) for L2N format, so that we can refer to net name in log entries later --- src/db/db/dbLayoutToNetlistWriter.cc | 14 ++-- src/lvs/unit_tests/lvsTests.cc | 6 +- testdata/algo/l2n_reader_au.txt | 26 +++--- testdata/algo/l2n_reader_au_4.l2n | 46 +++++------ testdata/algo/l2n_reader_au_5.l2n | 24 +++--- testdata/algo/l2n_reader_au_7.l2n | 2 +- testdata/algo/l2n_reader_in.txt | 42 +++++----- testdata/algo/l2n_reader_in_p.txt | 42 +++++----- testdata/algo/l2n_reader_in_s.txt | 42 +++++----- testdata/algo/l2n_writer_au.txt | 42 +++++----- testdata/algo/l2n_writer_au_2b.txt | 36 ++++----- testdata/algo/l2n_writer_au_2s.txt | 36 ++++----- testdata/algo/l2n_writer_au_p.txt | 42 +++++----- testdata/algo/l2n_writer_au_s.txt | 42 +++++----- testdata/algo/lvs_test1_au.lvsdb.1 | 30 +++---- testdata/algo/lvs_test1b_au.lvsdb.1 | 30 +++---- testdata/algo/lvs_test2_au.lvsdb.1 | 30 +++---- testdata/algo/lvs_test2b_au.lvsdb.1 | 30 +++---- testdata/algo/lvs_test3_au.lvsdb | 30 +++---- testdata/drc/drcSimpleTests_au122.l2n | 16 ++-- testdata/lvs/bbdevices1.lvsdb | 4 +- testdata/lvs/bbdevices1b.lvsdb | 4 +- testdata/lvs/bbdevices2.lvsdb | 8 +- testdata/lvs/bbdevices2b.lvsdb | 8 +- testdata/lvs/bbdevices3.lvsdb | 4 +- testdata/lvs/bbdevices3b.lvsdb | 4 +- testdata/lvs/bbdevices4.lvsdb | 4 +- testdata/lvs/bbdevices4b.lvsdb | 4 +- testdata/lvs/bbdevices5.lvsdb | 4 +- testdata/lvs/bbdevices5b.lvsdb | 4 +- testdata/lvs/bbdevices6.lvsdb | 6 +- testdata/lvs/bbdevices6b.lvsdb | 6 +- testdata/lvs/blackbox3.lvsdb | 2 +- testdata/lvs/blackbox5.lvsdb | 2 +- testdata/lvs/custom_resistors.l2n.1 | 18 ++--- testdata/lvs/custom_resistors.l2n.2 | 18 ++--- testdata/lvs/custom_resistors.l2n.3 | 18 ++--- testdata/lvs/double_height.lvsdb | 10 +-- testdata/lvs/double_height2.lvsdb | 8 +- testdata/lvs/double_height2_texts.lvsdb | 8 +- testdata/lvs/empty_subcells.lvsdb | 4 +- testdata/lvs/flag_missing_ports.lvsdb | 4 +- testdata/lvs/floating.lvsdb | 6 +- testdata/lvs/invchain_cheat.lvsdb | 34 ++++---- testdata/lvs/layer_names.lvsdb | 6 +- testdata/lvs/must_connect1.lvsdb | 18 ++--- testdata/lvs/must_connect1_tl.lvsdb | 18 ++--- testdata/lvs/must_connect2.lvsdb | 18 ++--- testdata/lvs/must_connect3.lvsdb | 16 ++-- testdata/lvs/nand2_split_gate.lvsdb.1 | 2 +- testdata/lvs/nand2_split_gate.lvsdb.2 | 2 +- testdata/lvs/nand2_split_gate_early.lvsdb.1 | 2 +- testdata/lvs/nand2_split_gate_early.lvsdb.2 | 2 +- testdata/lvs/res_combine1.lvsdb.1 | 2 +- testdata/lvs/res_combine1.lvsdb.2 | 2 +- testdata/lvs/res_combine1.lvsdb.3 | 2 +- testdata/lvs/res_combine1.lvsdb.4 | 2 +- testdata/lvs/res_combine1.lvsdb.5 | 2 +- testdata/lvs/res_combine1.lvsdb.6 | 2 +- testdata/lvs/res_combine2.lvsdb.1 | 2 +- testdata/lvs/res_combine2.lvsdb.2 | 2 +- testdata/lvs/res_combine2.lvsdb.3 | 2 +- testdata/lvs/res_combine2.lvsdb.4 | 2 +- testdata/lvs/res_combine2.lvsdb.5 | 2 +- testdata/lvs/res_combine2.lvsdb.6 | 2 +- testdata/lvs/res_combine3.lvsdb.1 | 2 +- testdata/lvs/res_combine3.lvsdb.2 | 2 +- testdata/lvs/res_combine3.lvsdb.3 | 2 +- testdata/lvs/res_combine3.lvsdb.4 | 2 +- testdata/lvs/res_combine3.lvsdb.5 | 2 +- testdata/lvs/res_combine3.lvsdb.6 | 2 +- testdata/lvs/ringo_device_subcircuits.lvsdb.1 | 24 +++--- testdata/lvs/ringo_device_subcircuits.lvsdb.2 | 24 +++--- testdata/lvs/ringo_layout_var.lvsdb.1 | 26 +++--- testdata/lvs/ringo_layout_var.lvsdb.2 | 26 +++--- testdata/lvs/ringo_mixed_hierarchy.lvsdb | 4 +- testdata/lvs/ringo_simple.lvsdb.1 | 24 +++--- testdata/lvs/ringo_simple.lvsdb.2 | 24 +++--- testdata/lvs/ringo_simple_blackboxing.lvsdb | 8 +- .../lvs/ringo_simple_blackboxing_netter.lvsdb | 8 +- testdata/lvs/ringo_simple_compare2.lvsdb.1 | 24 +++--- testdata/lvs/ringo_simple_compare2.lvsdb.2 | 24 +++--- .../lvs/ringo_simple_device_scaling.lvsdb.1 | 24 +++--- .../lvs/ringo_simple_device_scaling.lvsdb.2 | 24 +++--- testdata/lvs/ringo_simple_dmos.lvsdb.1 | 26 +++--- testdata/lvs/ringo_simple_dmos.lvsdb.2 | 26 +++--- testdata/lvs/ringo_simple_dmos_fixed.lvsdb.1 | 26 +++--- testdata/lvs/ringo_simple_dmos_fixed.lvsdb.2 | 26 +++--- .../lvs/ringo_simple_dummy_device.lvsdb.1 | 4 +- .../lvs/ringo_simple_dummy_device.lvsdb.2 | 4 +- .../ringo_simple_implicit_connections.lvsdb.1 | 24 +++--- .../ringo_simple_implicit_connections.lvsdb.2 | 24 +++--- testdata/lvs/ringo_simple_io.lvsdb.1 | 24 +++--- testdata/lvs/ringo_simple_io.lvsdb.2 | 24 +++--- testdata/lvs/ringo_simple_io2.l2n.1 | 24 +++--- testdata/lvs/ringo_simple_io2.l2n.2 | 24 +++--- testdata/lvs/ringo_simple_io2.lvsdb.1 | 24 +++--- testdata/lvs/ringo_simple_io2.lvsdb.2 | 24 +++--- ...simple_net_and_circuit_equivalence.lvsdb.1 | 24 +++--- ...simple_net_and_circuit_equivalence.lvsdb.2 | 24 +++--- .../lvs/ringo_simple_pin_swapping.lvsdb.1 | 24 +++--- .../lvs/ringo_simple_pin_swapping.lvsdb.2 | 24 +++--- .../ringo_simple_same_device_classes.lvsdb.1 | 24 +++--- .../ringo_simple_same_device_classes.lvsdb.2 | 24 +++--- .../lvs/ringo_simple_simplification.lvsdb.1 | 14 ++-- .../lvs/ringo_simple_simplification.lvsdb.2 | 14 ++-- ...o_simple_simplification_with_align.lvsdb.1 | 14 ++-- ...o_simple_simplification_with_align.lvsdb.2 | 14 ++-- testdata/lvs/ringo_simple_with_tol.lvsdb.1 | 24 +++--- testdata/lvs/ringo_simple_with_tol.lvsdb.2 | 24 +++--- .../lvs/ringo_simple_with_tol_early.lvsdb.1 | 24 +++--- .../lvs/ringo_simple_with_tol_early.lvsdb.2 | 24 +++--- testdata/lvs/soft_connect1.l2n | 12 +-- testdata/lvs/soft_connect1a.l2n | 12 +-- testdata/lvs/soft_connect2.l2n | 12 +-- testdata/lvs/soft_connect3.l2n | 18 ++--- testdata/lvs/soft_connect4.l2n | 4 +- testdata/lvs/soft_connect5.l2n | 4 +- testdata/lvs/soft_connect6.l2n | 4 +- testdata/lvs/stray_texts1.l2n | 16 ++-- testdata/lvs/stray_texts2.l2n | 16 ++-- testdata/lvs/test_22a.lvsdb.1 | 32 ++++---- testdata/lvs/test_22a.lvsdb.2 | 32 ++++---- testdata/lvs/test_22a.lvsdb.3 | 80 +++++++++---------- testdata/lvs/test_22b.lvsdb.1 | 32 ++++---- testdata/lvs/test_22b.lvsdb.2 | 32 ++++---- testdata/lvs/test_22b.lvsdb.3 | 80 +++++++++---------- testdata/lvs/test_22c.lvsdb.1 | 8 +- testdata/lvs/test_22c.lvsdb.2 | 8 +- testdata/lvs/test_22c.lvsdb.3 | 8 +- testdata/lvs/test_22d.lvsdb.1 | 8 +- testdata/lvs/test_22d.lvsdb.2 | 8 +- testdata/lvs/test_22d.lvsdb.3 | 8 +- 133 files changed, 1107 insertions(+), 1111 deletions(-) diff --git a/src/db/db/dbLayoutToNetlistWriter.cc b/src/db/db/dbLayoutToNetlistWriter.cc index 092e998bb..0b734b7a0 100644 --- a/src/db/db/dbLayoutToNetlistWriter.cc +++ b/src/db/db/dbLayoutToNetlistWriter.cc @@ -708,11 +708,8 @@ void std_writer_impl::write (TokenizedOutput &stream, const db::Net &net, outp.reset (new TokenizedOutput (stream, Keys::net_key)); *outp << tl::to_string (id); - if (! net.name ().empty ()) { - TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.name ()); - } else if (net.id () != id) { - TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.expanded_name ()); - } + // NOTE: we always write the expanded name, so we can refer to it in log entries + TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.expanded_name ()); *outp << endl; @@ -740,11 +737,10 @@ void std_writer_impl::write (TokenizedOutput &stream, const db::Net &net, if (! outp) { outp.reset (new TokenizedOutput (stream, Keys::net_key)); - *outp << tl::to_string (id); - if (! net.name ().empty ()) { - TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.name ()); - } + *outp << tl::to_string (id); + // NOTE: we always write the expanded name, so we can refer to it in log entries + TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.expanded_name ()); if (net.begin_properties () != net.end_properties ()) { *outp << endl; diff --git a/src/lvs/unit_tests/lvsTests.cc b/src/lvs/unit_tests/lvsTests.cc index c1aac0071..1d22da642 100644 --- a/src/lvs/unit_tests/lvsTests.cc +++ b/src/lvs/unit_tests/lvsTests.cc @@ -154,7 +154,7 @@ TEST(16_private) TEST(17_private) { test_is_long_runner (); - run_test (_this, "test_17.lylvs", "test_17b.cir.gz", "test_17.gds.gz", true, "test_17b_5.lvsdb"); + run_test (_this, "test_17.lylvs", "test_17b.cir.gz", "test_17.gds.gz", true, "test_17b_6.lvsdb"); } TEST(18_private) @@ -172,12 +172,12 @@ TEST(19_private) TEST(20_private) { // test_is_long_runner (); - run_test (_this, "test_20.lylvs", "test_20.cir.gz", "test_20.gds.gz", true, "test_20_4.lvsdb"); + run_test (_this, "test_20.lylvs", "test_20.cir.gz", "test_20.gds.gz", true, "test_20_5.lvsdb"); } TEST(21_private) { - run_test (_this, "test_21.lylvs", "test_21.cir.gz", "test_21.gds.gz", true, "test_21_6.lvsdb"); + run_test (_this, "test_21.lylvs", "test_21.cir.gz", "test_21.gds.gz", true, "test_21_7.lvsdb"); } // issue #1021 diff --git a/testdata/algo/l2n_reader_au.txt b/testdata/algo/l2n_reader_au.txt index 2c615dffc..d0a1d1bad 100644 --- a/testdata/algo/l2n_reader_au.txt +++ b/testdata/algo/l2n_reader_au.txt @@ -113,7 +113,7 @@ circuit(INV2 rect((-1700 -1640) (3100 6220)) # Nets with their geometries - net(1 + net(1 name($1) rect(nwell (-1400 1800) (2800 2780)) rect(diff_cont (-1510 -650) (220 220)) rect(ntie (-510 -450) (800 680)) @@ -126,7 +126,7 @@ circuit(INV2 rect(poly_lbl (-526 -1801) (2 2)) rect(poly_cont (-831 -111) (220 220)) ) - net(3 + net(3 name($3) rect(poly (275 -250) (250 2500)) rect(poly (-305 -1430) (360 360)) rect(poly (-305 820) (250 1600)) @@ -257,13 +257,13 @@ circuit(INV2PAIR # Nets with their geometries net(1 name(BULK)) - net(2 + net(2 name($2) rect(diff_cont (3430 3290) (220 220)) rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 -3420) (220 220)) rect(diff_cont (-220 180) (220 220)) ) - net(3 + net(3 name($3) rect(diff_cont (4230 3290) (220 220)) rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 -220) (220 220)) @@ -277,7 +277,7 @@ circuit(INV2PAIR rect(metal1 (-3000 -760) (360 760)) rect(metal1 (-360 -760) (360 760)) ) - net(4 + net(4 name($4) rect(diff_cont (4230 490) (220 220)) rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 -220) (220 220)) @@ -291,20 +291,20 @@ circuit(INV2PAIR rect(metal1 (-3000 -760) (360 760)) rect(metal1 (-360 -760) (360 760)) ) - net(5 + net(5 name($5) rect(diff_cont (2390 3690) (220 220)) rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -2620) (220 220)) rect(diff_cont (-220 -620) (220 220)) ) - net(6) - net(7 + net(6 name($6)) + net(7 name($7) rect(diff_cont (5030 3690) (220 220)) rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -2620) (220 220)) rect(diff_cont (-220 -620) (220 220)) ) - net(8) + net(8 name($8)) # Outgoing pins and their connections to nets pin(1 name(BULK)) @@ -507,25 +507,25 @@ circuit(RINGO rect(metal1 (-360 -760) (360 760)) rect(metal2_lbl (-21301 -381) (2 2)) ) - net(5 + net(5 name($5) rect(diff_cont (3330 2890) (220 220)) rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -2620) (220 220)) rect(diff_cont (-220 -620) (220 220)) ) - net(6 + net(6 name($6) rect(diff_cont (19170 2890) (220 220)) rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -2620) (220 220)) rect(diff_cont (-220 -620) (220 220)) ) - net(7 + net(7 name($7) rect(diff_cont (13890 2890) (220 220)) rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -2620) (220 220)) rect(diff_cont (-220 -620) (220 220)) ) - net(8 + net(8 name($8) rect(diff_cont (8610 2890) (220 220)) rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -2620) (220 220)) diff --git a/testdata/algo/l2n_reader_au_4.l2n b/testdata/algo/l2n_reader_au_4.l2n index 67424186c..0e9dc8d4a 100644 --- a/testdata/algo/l2n_reader_au_4.l2n +++ b/testdata/algo/l2n_reader_au_4.l2n @@ -131,7 +131,7 @@ device(D$NMOS$3 NMOS circuit(INV2X # Nets with their geometries - net(1 + net(1 name($1) rect($3 (-125 700) (250 1500)) rect($3 (-125 -1000) (800 500)) rect($3 (-125 -1000) (250 1500)) @@ -140,7 +140,7 @@ circuit(INV2X rect($3 (550 -4500) (250 1600)) rect($3 (-1050 -1600) (250 1600)) ) - net(2 + net(2 name($2) rect($4 (1090 2590) (220 220)) rect($4 (-220 180) (220 220)) rect($4 (-1820 -620) (220 220)) @@ -155,7 +155,7 @@ circuit(INV2X rect($1 (-975 -1075) (525 950)) rect($1 (-2100 -950) (525 950)) ) - net(3 + net(3 name($3) rect($4 (1090 -310) (220 220)) rect($4 (-220 180) (220 220)) rect($4 (-1820 -620) (220 220)) @@ -170,7 +170,7 @@ circuit(INV2X rect($2 (-975 -1075) (525 950)) rect($2 (-2100 -950) (525 950)) ) - net(4 + net(4 name($4) rect($4 (290 2590) (220 220)) rect($4 (-220 180) (220 220)) rect($4 (-220 -620) (220 220)) @@ -238,7 +238,7 @@ circuit(INV2X circuit(NAND1X # Nets with their geometries - net(1 + net(1 name($1) rect($4 (290 2590) (220 220)) rect($4 (-220 180) (220 220)) rect($4 (-220 -620) (220 220)) @@ -254,7 +254,7 @@ circuit(NAND1X rect($1 (-1255 2045) (550 950)) rect($2 (250 -3850) (525 950)) ) - net(2 + net(2 name($2) rect($4 (1090 2590) (220 220)) rect($4 (-220 180) (220 220)) rect($4 (-1820 -620) (220 220)) @@ -269,7 +269,7 @@ circuit(NAND1X rect($1 (-975 -1075) (525 950)) rect($1 (-2100 -950) (525 950)) ) - net(3 + net(3 name($3) rect($4 (-510 -310) (220 220)) rect($4 (-220 180) (220 220)) rect($6 (-290 -690) (360 760)) @@ -278,17 +278,17 @@ circuit(NAND1X rect($8 (-810 -510) (3000 1200)) rect($2 (-2550 -1075) (525 950)) ) - net(4 + net(4 name($4) rect($3 (-125 700) (250 1500)) rect($3 (-250 -100) (250 1600)) rect($3 (-250 -4500) (250 1600)) ) - net(5 + net(5 name($5) rect($3 (675 700) (250 1500)) rect($3 (-250 -100) (250 1600)) rect($3 (-250 -4500) (250 1600)) ) - net(6 + net(6 name($6) rect($4 (290 -310) (220 220)) rect($4 (-220 180) (220 220)) rect($4 (-220 -620) (220 220)) @@ -359,7 +359,7 @@ circuit(NAND1X circuit(INV2ALT # Nets with their geometries - net(1 + net(1 name($1) rect($3 (675 600) (250 2300)) rect($3 (-250 0) (1050 200)) rect($3 (-1725 -1900) (800 500)) @@ -370,7 +370,7 @@ circuit(INV2ALT rect($3 (-2400 3350) (1600 250)) rect($3 (-1825 -2325) (250 1600)) ) - net(2 + net(2 name($2) rect($4 (290 -310) (220 220)) rect($4 (-220 180) (220 220)) rect($4 (-220 2280) (220 220)) @@ -390,7 +390,7 @@ circuit(INV2ALT rect($2 (575 -2550) (950 525)) rect($2 (-2050 -1825) (525 950)) ) - net(3 + net(3 name($3) rect($4 (990 4590) (220 220)) rect($4 (-620 -220) (220 220)) rect($4 (-1320 -2220) (220 220)) @@ -405,7 +405,7 @@ circuit(INV2ALT rect($1 (625 2125) (950 525)) rect($1 (-2025 -2525) (525 950)) ) - net(4 + net(4 name($4) rect($4 (1390 190) (220 220)) rect($4 (180 -220) (220 220)) rect($4 (-2520 -720) (220 220)) @@ -471,7 +471,7 @@ circuit(INV2ALT circuit(RINGO # Nets with their geometries - net(1 + net(1 name($1) rect($3 (1700 1100) (1300 400)) rect($4 (-2710 1090) (220 220)) rect($4 (-220 180) (220 220)) @@ -484,7 +484,7 @@ circuit(RINGO rect($5 (1290 890) (200 200)) rect($6 (-1500 -300) (1600 400)) ) - net(2 + net(2 name($2) rect($3 (4700 1100) (1300 400)) rect($4 (-2710 1090) (220 220)) rect($4 (-220 180) (220 220)) @@ -497,7 +497,7 @@ circuit(RINGO rect($5 (1290 890) (200 200)) rect($6 (-1500 -300) (1600 400)) ) - net(3 + net(3 name($3) rect($3 (15000 1100) (1300 400)) rect($4 (-4910 -1810) (220 220)) rect($4 (-220 180) (220 220)) @@ -510,7 +510,7 @@ circuit(RINGO rect($5 (3190 -2810) (200 200)) rect($6 (-2400 -300) (2500 400)) ) - net(4 + net(4 name($4) rect($3 (18000 1100) (1300 400)) rect($4 (-2710 1090) (220 220)) rect($4 (-220 180) (220 220)) @@ -523,7 +523,7 @@ circuit(RINGO rect($5 (1290 890) (200 200)) rect($6 (-1500 -300) (1600 400)) ) - net(5 + net(5 name($5) rect($3 (21000 1100) (1300 400)) rect($4 (-2710 1090) (220 220)) rect($4 (-220 180) (220 220)) @@ -536,7 +536,7 @@ circuit(RINGO rect($5 (1290 890) (200 200)) rect($6 (-1500 -300) (1600 400)) ) - net(6 + net(6 name($6) rect($3 (24000 1100) (1300 400)) rect($4 (-2710 1090) (220 220)) rect($4 (-220 180) (220 220)) @@ -549,7 +549,7 @@ circuit(RINGO rect($5 (1290 890) (200 200)) rect($6 (-1500 -300) (1600 400)) ) - net(7 + net(7 name($7) rect($3 (27000 1100) (1300 400)) rect($4 (-2710 1090) (220 220)) rect($4 (-220 180) (220 220)) @@ -583,7 +583,7 @@ circuit(RINGO rect($8 (-31600 -400) (400 900)) rect($11 (16399 -701) (2 2)) ) - net(9 + net(9 name($9) rect($3 (-1300 900) (1300 400)) rect($4 (-2710 1290) (220 220)) rect($4 (-220 180) (220 220)) @@ -598,7 +598,7 @@ circuit(RINGO rect($3 (-4000 1200) (875 500)) rect($9 (-476 -201) (2 2)) ) - net(11 + net(11 name($11) rect($3 (9800 1100) (1300 400)) rect($4 (-4810 1090) (220 220)) rect($4 (-220 180) (220 220)) diff --git a/testdata/algo/l2n_reader_au_5.l2n b/testdata/algo/l2n_reader_au_5.l2n index 8b514b029..c641eb466 100644 --- a/testdata/algo/l2n_reader_au_5.l2n +++ b/testdata/algo/l2n_reader_au_5.l2n @@ -115,7 +115,7 @@ circuit(INV2 rect($9 (-526 -1801) (2 2)) rect($5 (-831 -111) (220 220)) ) - net(2 + net(2 name($2) rect($3 (275 -250) (250 2500)) rect($3 (-305 -1430) (360 360)) rect($3 (-305 820) (250 1600)) @@ -144,7 +144,7 @@ circuit(INV2 rect($1 (-276 524) (525 950)) rect($2 (-525 -3750) (525 950)) ) - net(4 + net(4 name($4) rect($4 (-110 -310) (220 220)) rect($4 (-220 180) (220 220)) rect($4 (-220 -220) (220 220)) @@ -156,7 +156,7 @@ circuit(INV2 rect($8 (-1525 -775) (2800 900)) rect($2 (-1675 -925) (550 950)) ) - net(5 + net(5 name($5) rect($4 (-110 2490) (220 220)) rect($4 (-220 180) (220 220)) rect($4 (-220 -220) (220 220)) @@ -367,55 +367,55 @@ circuit(RINGO rect($6 (-360 -760) (360 760)) rect($11 (-23941 -381) (2 2)) ) - net(4 + net(4 name($4) rect($4 (690 2890) (220 220)) rect($4 (-220 -620) (220 220)) rect($4 (-220 -2620) (220 220)) rect($4 (-220 -620) (220 220)) ) - net(5 + net(5 name($5) rect($4 (21810 2890) (220 220)) rect($4 (-220 -620) (220 220)) rect($4 (-220 -2620) (220 220)) rect($4 (-220 -620) (220 220)) ) - net(6 + net(6 name($6) rect($4 (19170 2890) (220 220)) rect($4 (-220 -620) (220 220)) rect($4 (-220 -2620) (220 220)) rect($4 (-220 -620) (220 220)) ) - net(7 + net(7 name($7) rect($4 (16530 2890) (220 220)) rect($4 (-220 -620) (220 220)) rect($4 (-220 -2620) (220 220)) rect($4 (-220 -620) (220 220)) ) - net(8 + net(8 name($8) rect($4 (13890 2890) (220 220)) rect($4 (-220 -620) (220 220)) rect($4 (-220 -2620) (220 220)) rect($4 (-220 -620) (220 220)) ) - net(9 + net(9 name($9) rect($4 (11250 2890) (220 220)) rect($4 (-220 -620) (220 220)) rect($4 (-220 -2620) (220 220)) rect($4 (-220 -620) (220 220)) ) - net(10 + net(10 name($10) rect($4 (8610 2890) (220 220)) rect($4 (-220 -620) (220 220)) rect($4 (-220 -2620) (220 220)) rect($4 (-220 -620) (220 220)) ) - net(11 + net(11 name($11) rect($4 (5970 2890) (220 220)) rect($4 (-220 -620) (220 220)) rect($4 (-220 -2620) (220 220)) rect($4 (-220 -620) (220 220)) ) - net(12 + net(12 name($12) rect($4 (3330 2890) (220 220)) rect($4 (-220 -620) (220 220)) rect($4 (-220 -2620) (220 220)) diff --git a/testdata/algo/l2n_reader_au_7.l2n b/testdata/algo/l2n_reader_au_7.l2n index e4a9f1a1b..c2528e43b 100644 --- a/testdata/algo/l2n_reader_au_7.l2n +++ b/testdata/algo/l2n_reader_au_7.l2n @@ -333,7 +333,7 @@ circuit(TOP rect(l15 (-980 -270) (1080 370)) rect(l16 (-540 -190) (0 0)) ) - net(3 + net(3 name($3) rect(l11 (-5830 13120) (170 170)) rect(l11 (-170 -850) (170 170)) rect(l11 (-170 170) (170 170)) diff --git a/testdata/algo/l2n_reader_in.txt b/testdata/algo/l2n_reader_in.txt index 15276f97a..5c15403a0 100644 --- a/testdata/algo/l2n_reader_in.txt +++ b/testdata/algo/l2n_reader_in.txt @@ -98,7 +98,7 @@ circuit(INV2 text(poly_lbl IN (-525 -1800)) rect(poly_cont (-830 -110) (220 220)) ) - net(2 + net(2 name($2) rect(poly (275 -250) (250 2500)) rect(poly (-305 -1430) (360 360)) rect(poly (-305 820) (250 1600)) @@ -127,7 +127,7 @@ circuit(INV2 rect(psd (-275 525) (525 950)) rect(nsd (-525 -3750) (525 950)) ) - net(4 + net(4 name($4) rect(diff_cont (-110 -310) (220 220)) rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 -220) (220 220)) @@ -139,7 +139,7 @@ circuit(INV2 rect(metal2 (-1525 -775) (2800 900)) rect(nsd (-1675 -925) (550 950)) ) - net(5 + net(5 name($5) rect(diff_cont (-110 2490) (220 220)) rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 -220) (220 220)) @@ -234,24 +234,24 @@ circuit(RINGO net(4 name(VDD) text(metal2_lbl VDD (0 2800)) ) - net(5) - net(6) - net(7) - net(8) - net(9) - net(10) - net(11) - net(12) - net(13) - net(14) - net(15) - net(16) - net(17) - net(18) - net(19) - net(20) - net(21) - net(22) + net(5 name($5)) + net(6 name($6)) + net(7 name($7)) + net(8 name($8)) + net(9 name($9)) + net(10 name($10)) + net(11 name($11)) + net(12 name($12)) + net(13 name($13)) + net(14 name($14)) + net(15 name($15)) + net(16 name($16)) + net(17 name($17)) + net(18 name($18)) + net(19 name($19)) + net(20 name($20)) + net(21 name($21)) + net(22 name($22)) # Outgoing pins and their connections to nets pin(1 name(FB)) diff --git a/testdata/algo/l2n_reader_in_p.txt b/testdata/algo/l2n_reader_in_p.txt index 84e52624e..596256d9f 100644 --- a/testdata/algo/l2n_reader_in_p.txt +++ b/testdata/algo/l2n_reader_in_p.txt @@ -79,7 +79,7 @@ X(INV2 J(poly_lbl IN (-525 -1800)) R(poly_cont (-830 -110) (220 220)) ) - N(2 + N(2 I($2) R(poly (275 -250) (250 2500)) R(poly (-305 -1430) (360 360)) R(poly (-305 820) (250 1600)) @@ -108,7 +108,7 @@ X(INV2 R(psd (-275 525) (525 950)) R(nsd (-525 -3750) (525 950)) ) - N(4 + N(4 I($4) R(diff_cont (-110 -310) (220 220)) R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 -220) (220 220)) @@ -120,7 +120,7 @@ X(INV2 R(metal2 (-1525 -775) (2800 900)) R(nsd (-1675 -925) (550 950)) ) - N(5 + N(5 I($5) R(diff_cont (-110 2490) (220 220)) R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 -220) (220 220)) @@ -215,24 +215,24 @@ X(RINGO N(4 I(VDD) J(metal2_lbl VDD (0 2800)) ) - N(5) - N(6) - N(7) - N(8) - N(9) - N(10) - N(11) - N(12) - N(13) - N(14) - N(15) - N(16) - N(17) - N(18) - N(19) - N(20) - N(21) - N(22) + N(5 I($5)) + N(6 I($6)) + N(7 I($7)) + N(8 I($8)) + N(9 I($9)) + N(10 I($10)) + N(11 I($11)) + N(12 I($12)) + N(13 I($13)) + N(14 I($14)) + N(15 I($15)) + N(16 I($16)) + N(17 I($17)) + N(18 I($18)) + N(19 I($19)) + N(20 I($20)) + N(21 I($21)) + N(22 I($22)) P(1 I(FB)) P(2 I(OSC)) P(3 I(VSS)) diff --git a/testdata/algo/l2n_reader_in_s.txt b/testdata/algo/l2n_reader_in_s.txt index fe37600ce..5039abb5b 100644 --- a/testdata/algo/l2n_reader_in_s.txt +++ b/testdata/algo/l2n_reader_in_s.txt @@ -79,7 +79,7 @@ X(INV2 J(poly_lbl IN (-525 -1800)) R(poly_cont (-830 -110) (220 220)) ) - N(2 + N(2 I($2) R(poly (275 -250) (250 2500)) R(poly (-305 -1430) (360 360)) R(poly (-305 820) (250 1600)) @@ -108,7 +108,7 @@ X(INV2 R(psd (-275 525) (525 950)) R(nsd (-525 -3750) (525 950)) ) - N(4 + N(4 I($4) R(diff_cont (-110 -310) (220 220)) R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 -220) (220 220)) @@ -120,7 +120,7 @@ X(INV2 R(metal2 (-1525 -775) (2800 900)) R(nsd (-1675 -925) (550 950)) ) - N(5 + N(5 I($5) R(diff_cont (-110 2490) (220 220)) R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 -220) (220 220)) @@ -206,24 +206,24 @@ X(RINGO N(4 I(VDD) J(metal2_lbl VDD (0 2800)) ) - N(5) - N(6) - N(7) - N(8) - N(9) - N(10) - N(11) - N(12) - N(13) - N(14) - N(15) - N(16) - N(17) - N(18) - N(19) - N(20) - N(21) - N(22) + N(5 I($5)) + N(6 I($6)) + N(7 I($7)) + N(8 I($8)) + N(9 I($9)) + N(10 I($10)) + N(11 I($11)) + N(12 I($12)) + N(13 I($13)) + N(14 I($14)) + N(15 I($15)) + N(16 I($16)) + N(17 I($17)) + N(18 I($18)) + N(19 I($19)) + N(20 I($20)) + N(21 I($21)) + N(22 I($22)) P(1 I(FB)) P(2 I(OSC)) P(3 I(VSS)) diff --git a/testdata/algo/l2n_writer_au.txt b/testdata/algo/l2n_writer_au.txt index 15276f97a..23b74e85a 100644 --- a/testdata/algo/l2n_writer_au.txt +++ b/testdata/algo/l2n_writer_au.txt @@ -98,7 +98,7 @@ circuit(INV2 text(poly_lbl IN (-525 -1800)) rect(poly_cont (-830 -110) (220 220)) ) - net(2 + net(2 name($2) rect(poly (275 -250) (250 2500)) rect(poly (-305 -1430) (360 360)) rect(poly (-305 820) (250 1600)) @@ -127,7 +127,7 @@ circuit(INV2 rect(psd (-275 525) (525 950)) rect(nsd (-525 -3750) (525 950)) ) - net(4 + net(4 name($4) rect(diff_cont (-110 -310) (220 220)) rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 -220) (220 220)) @@ -139,7 +139,7 @@ circuit(INV2 rect(metal2 (-1525 -775) (2800 900)) rect(nsd (-1675 -925) (550 950)) ) - net(5 + net(5 name($5) rect(diff_cont (-110 2490) (220 220)) rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 -220) (220 220)) @@ -234,24 +234,24 @@ circuit(RINGO net(4 name(VDD) text(metal2_lbl VDD (0 2800)) ) - net(5) - net(6) - net(7) - net(8) - net(9) - net(10) - net(11) - net(12) - net(13) - net(14) - net(15) - net(16) - net(17) - net(18) - net(19) - net(20) - net(21) - net(22) + net(5 name($I46)) + net(6 name($I45)) + net(7 name($I44)) + net(8 name($I43)) + net(9 name($I42)) + net(10 name($I41)) + net(11 name($I40)) + net(12 name($I39)) + net(13 name($I38)) + net(14 name($I19)) + net(15 name($I8)) + net(16 name($I7)) + net(17 name($I6)) + net(18 name($I5)) + net(19 name($I4)) + net(20 name($I3)) + net(21 name($I2)) + net(22 name($I1)) # Outgoing pins and their connections to nets pin(1 name(FB)) diff --git a/testdata/algo/l2n_writer_au_2b.txt b/testdata/algo/l2n_writer_au_2b.txt index d0986d5a1..0137b1b11 100644 --- a/testdata/algo/l2n_writer_au_2b.txt +++ b/testdata/algo/l2n_writer_au_2b.txt @@ -113,7 +113,7 @@ circuit(INV2 rect((-1700 -1640) (3100 6220)) # Nets with their geometries - net(1 + net(1 name($1) rect(nwell (-1400 1800) (2800 2780)) rect(diff_cont (-1510 -650) (220 220)) rect(ntie (-510 -450) (800 680)) @@ -126,7 +126,7 @@ circuit(INV2 rect(poly_lbl (-525 -1800) (0 0)) rect(poly_cont (-830 -110) (220 220)) ) - net(3 + net(3 name($3) rect(poly (275 -250) (250 2500)) rect(poly (-305 -1430) (360 360)) rect(poly (-305 820) (250 1600)) @@ -257,14 +257,14 @@ circuit(INV2PAIR # Nets with their geometries net(1 name(BULK)) - net(2) - net(3) - net(4) - net(5) - net(6) - net(7) - net(8) - net(9) + net(2 name($I8)) + net(3 name($I7)) + net(4 name($I6)) + net(5 name($I5)) + net(6 name($I4)) + net(7 name($I3)) + net(8 name($I2)) + net(9 name($I1)) # Outgoing pins and their connections to nets pin(1 name(BULK)) @@ -340,14 +340,14 @@ circuit(RINGO rect(metal1 (2280 -1120) (360 1120)) rect(metal2_lbl (-23940 300) (0 0)) ) - net(5) - net(6) - net(7) - net(8) - net(9) - net(10) - net(11) - net(12) + net(5 name($I25)) + net(6 name($I24)) + net(7 name($I23)) + net(8 name($I22)) + net(9 name($I17)) + net(10 name($I11)) + net(11 name($I10)) + net(12 name($I9)) # Outgoing pins and their connections to nets pin(1 name(FB)) diff --git a/testdata/algo/l2n_writer_au_2s.txt b/testdata/algo/l2n_writer_au_2s.txt index e221c3892..b03978d7e 100644 --- a/testdata/algo/l2n_writer_au_2s.txt +++ b/testdata/algo/l2n_writer_au_2s.txt @@ -92,7 +92,7 @@ D(D$NMOS$1 NMOS ) X(INV2 R((-1700 -1640) (3100 6220)) - N(1 + N(1 I($1) R(nwell (-1400 1800) (2800 2780)) R(diff_cont (-1510 -650) (220 220)) R(ntie (-510 -450) (800 680)) @@ -105,7 +105,7 @@ X(INV2 R(poly_lbl (-525 -1800) (0 0)) R(poly_cont (-830 -110) (220 220)) ) - N(3 + N(3 I($3) R(poly (275 -250) (250 2500)) R(poly (-305 -1430) (360 360)) R(poly (-305 820) (250 1600)) @@ -227,14 +227,14 @@ X(INV2 X(INV2PAIR R((0 -840) (5740 6220)) N(1 I(BULK)) - N(2) - N(3) - N(4) - N(5) - N(6) - N(7) - N(8) - N(9) + N(2 I($I8)) + N(3 I($I7)) + N(4 I($I6)) + N(5 I($I5)) + N(6 I($I4)) + N(7 I($I3)) + N(8 I($I2)) + N(9 I($I1)) P(1 I(BULK)) P(2) P(4) @@ -301,14 +301,14 @@ X(RINGO R(metal1 (2280 -1120) (360 1120)) R(metal2_lbl (-23940 300) (0 0)) ) - N(5) - N(6) - N(7) - N(8) - N(9) - N(10) - N(11) - N(12) + N(5 I($I25)) + N(6 I($I24)) + N(7 I($I23)) + N(8 I($I22)) + N(9 I($I17)) + N(10 I($I11)) + N(11 I($I10)) + N(12 I($I9)) P(1 I(FB)) P(2 I(OSC)) P(3 I(VDD)) diff --git a/testdata/algo/l2n_writer_au_p.txt b/testdata/algo/l2n_writer_au_p.txt index 84e52624e..8be488e3f 100644 --- a/testdata/algo/l2n_writer_au_p.txt +++ b/testdata/algo/l2n_writer_au_p.txt @@ -79,7 +79,7 @@ X(INV2 J(poly_lbl IN (-525 -1800)) R(poly_cont (-830 -110) (220 220)) ) - N(2 + N(2 I($2) R(poly (275 -250) (250 2500)) R(poly (-305 -1430) (360 360)) R(poly (-305 820) (250 1600)) @@ -108,7 +108,7 @@ X(INV2 R(psd (-275 525) (525 950)) R(nsd (-525 -3750) (525 950)) ) - N(4 + N(4 I($4) R(diff_cont (-110 -310) (220 220)) R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 -220) (220 220)) @@ -120,7 +120,7 @@ X(INV2 R(metal2 (-1525 -775) (2800 900)) R(nsd (-1675 -925) (550 950)) ) - N(5 + N(5 I($5) R(diff_cont (-110 2490) (220 220)) R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 -220) (220 220)) @@ -215,24 +215,24 @@ X(RINGO N(4 I(VDD) J(metal2_lbl VDD (0 2800)) ) - N(5) - N(6) - N(7) - N(8) - N(9) - N(10) - N(11) - N(12) - N(13) - N(14) - N(15) - N(16) - N(17) - N(18) - N(19) - N(20) - N(21) - N(22) + N(5 I($I46)) + N(6 I($I45)) + N(7 I($I44)) + N(8 I($I43)) + N(9 I($I42)) + N(10 I($I41)) + N(11 I($I40)) + N(12 I($I39)) + N(13 I($I38)) + N(14 I($I19)) + N(15 I($I8)) + N(16 I($I7)) + N(17 I($I6)) + N(18 I($I5)) + N(19 I($I4)) + N(20 I($I3)) + N(21 I($I2)) + N(22 I($I1)) P(1 I(FB)) P(2 I(OSC)) P(3 I(VSS)) diff --git a/testdata/algo/l2n_writer_au_s.txt b/testdata/algo/l2n_writer_au_s.txt index fe37600ce..d63409be9 100644 --- a/testdata/algo/l2n_writer_au_s.txt +++ b/testdata/algo/l2n_writer_au_s.txt @@ -79,7 +79,7 @@ X(INV2 J(poly_lbl IN (-525 -1800)) R(poly_cont (-830 -110) (220 220)) ) - N(2 + N(2 I($2) R(poly (275 -250) (250 2500)) R(poly (-305 -1430) (360 360)) R(poly (-305 820) (250 1600)) @@ -108,7 +108,7 @@ X(INV2 R(psd (-275 525) (525 950)) R(nsd (-525 -3750) (525 950)) ) - N(4 + N(4 I($4) R(diff_cont (-110 -310) (220 220)) R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 -220) (220 220)) @@ -120,7 +120,7 @@ X(INV2 R(metal2 (-1525 -775) (2800 900)) R(nsd (-1675 -925) (550 950)) ) - N(5 + N(5 I($5) R(diff_cont (-110 2490) (220 220)) R(diff_cont (-220 180) (220 220)) R(diff_cont (-220 -220) (220 220)) @@ -206,24 +206,24 @@ X(RINGO N(4 I(VDD) J(metal2_lbl VDD (0 2800)) ) - N(5) - N(6) - N(7) - N(8) - N(9) - N(10) - N(11) - N(12) - N(13) - N(14) - N(15) - N(16) - N(17) - N(18) - N(19) - N(20) - N(21) - N(22) + N(5 I($I46)) + N(6 I($I45)) + N(7 I($I44)) + N(8 I($I43)) + N(9 I($I42)) + N(10 I($I41)) + N(11 I($I40)) + N(12 I($I39)) + N(13 I($I38)) + N(14 I($I19)) + N(15 I($I8)) + N(16 I($I7)) + N(17 I($I6)) + N(18 I($I5)) + N(19 I($I4)) + N(20 I($I3)) + N(21 I($I2)) + N(22 I($I1)) P(1 I(FB)) P(2 I(OSC)) P(3 I(VSS)) diff --git a/testdata/algo/lvs_test1_au.lvsdb.1 b/testdata/algo/lvs_test1_au.lvsdb.1 index dab36afd2..56f72cfa1 100644 --- a/testdata/algo/lvs_test1_au.lvsdb.1 +++ b/testdata/algo/lvs_test1_au.lvsdb.1 @@ -116,7 +116,7 @@ layout( rect((-1700 -2440) (3100 7820)) # Nets with their geometries - net(1 + net(1 name($1) rect(nwell (-1400 1800) (2800 3580)) rect(diff_cont (-1510 -650) (220 220)) rect(ntie (-510 -450) (800 680)) @@ -267,12 +267,12 @@ layout( # Nets with their geometries net(1 name(BULK)) - net(2) - net(3) - net(4) - net(5) - net(6) - net(7) + net(2 name($I6)) + net(3 name($I5)) + net(4 name($I4)) + net(5 name($I3)) + net(6 name($I2)) + net(7 name($I1)) # Outgoing pins and their connections to nets pin(1 name(BULK)) @@ -346,14 +346,14 @@ layout( rect(metal1 (2280 -1120) (360 1120)) rect(metal2_lbl (-23940 1100) (0 0)) ) - net(5) - net(6) - net(7) - net(8) - net(9) - net(10) - net(11) - net(12) + net(5 name($I25)) + net(6 name($I24)) + net(7 name($I23)) + net(8 name($I22)) + net(9 name($I17)) + net(10 name($I11)) + net(11 name($I10)) + net(12 name($I9)) # Outgoing pins and their connections to nets pin(1 name(FB)) diff --git a/testdata/algo/lvs_test1b_au.lvsdb.1 b/testdata/algo/lvs_test1b_au.lvsdb.1 index cd1225bf0..531ff69f8 100644 --- a/testdata/algo/lvs_test1b_au.lvsdb.1 +++ b/testdata/algo/lvs_test1b_au.lvsdb.1 @@ -116,7 +116,7 @@ layout( rect((-1700 -2440) (3100 7820)) # Nets with their geometries - net(1 + net(1 name($1) rect(nwell (-1400 1800) (2800 3580)) rect(diff_cont (-1510 -650) (220 220)) rect(ntie (-510 -450) (800 680)) @@ -267,12 +267,12 @@ layout( # Nets with their geometries net(1 name(BULK)) - net(2) - net(3) - net(4) - net(5) - net(6) - net(7) + net(2 name($I6)) + net(3 name($I5)) + net(4 name($I4)) + net(5 name($I3)) + net(6 name($I2)) + net(7 name($I1)) # Outgoing pins and their connections to nets pin(1 name(BULK)) @@ -346,14 +346,14 @@ layout( rect(metal1 (2280 -1120) (360 1120)) rect(metal2_lbl (-23940 1100) (0 0)) ) - net(5) - net(6) - net(7) - net(8) - net(9) - net(10) - net(11) - net(12) + net(5 name($I25)) + net(6 name($I24)) + net(7 name($I23)) + net(8 name($I22)) + net(9 name($I17)) + net(10 name($I11)) + net(11 name($I10)) + net(12 name($I9)) # Outgoing pins and their connections to nets pin(1 name(FB)) diff --git a/testdata/algo/lvs_test2_au.lvsdb.1 b/testdata/algo/lvs_test2_au.lvsdb.1 index a24505189..ab2e809b0 100644 --- a/testdata/algo/lvs_test2_au.lvsdb.1 +++ b/testdata/algo/lvs_test2_au.lvsdb.1 @@ -116,7 +116,7 @@ layout( rect((-1700 -2440) (3100 7820)) # Nets with their geometries - net(1 + net(1 name($1) rect(nwell (-1400 1800) (2800 3580)) rect(diff_cont (-1510 -650) (220 220)) rect(ntie (-510 -450) (800 680)) @@ -267,12 +267,12 @@ layout( # Nets with their geometries net(1 name(BULK)) - net(2) - net(3) - net(4) - net(5) - net(6) - net(7) + net(2 name($I6)) + net(3 name($I5)) + net(4 name($I4)) + net(5 name($I3)) + net(6 name($I2)) + net(7 name($I1)) # Outgoing pins and their connections to nets pin(1 name(BULK)) @@ -346,14 +346,14 @@ layout( rect(metal1 (2280 -1120) (360 1120)) rect(metal2_lbl (-23940 1100) (0 0)) ) - net(5) - net(6) - net(7) - net(8) - net(9) - net(10) - net(11) - net(12) + net(5 name($I25)) + net(6 name($I24)) + net(7 name($I23)) + net(8 name($I22)) + net(9 name($I17)) + net(10 name($I11)) + net(11 name($I10)) + net(12 name($I9)) # Outgoing pins and their connections to nets pin(1 name(FB)) diff --git a/testdata/algo/lvs_test2b_au.lvsdb.1 b/testdata/algo/lvs_test2b_au.lvsdb.1 index ee2bd4020..ed6529e45 100644 --- a/testdata/algo/lvs_test2b_au.lvsdb.1 +++ b/testdata/algo/lvs_test2b_au.lvsdb.1 @@ -116,7 +116,7 @@ layout( rect((-1700 -2440) (3100 7820)) # Nets with their geometries - net(1 + net(1 name($1) rect(nwell (-1400 1800) (2800 3580)) rect(diff_cont (-1510 -650) (220 220)) rect(ntie (-510 -450) (800 680)) @@ -267,12 +267,12 @@ layout( # Nets with their geometries net(1 name(BULK)) - net(2) - net(3) - net(4) - net(5) - net(6) - net(7) + net(2 name($I6)) + net(3 name($I5)) + net(4 name($I4)) + net(5 name($I3)) + net(6 name($I2)) + net(7 name($I1)) # Outgoing pins and their connections to nets pin(1 name(BULK)) @@ -346,14 +346,14 @@ layout( rect(metal1 (2280 -1120) (360 1120)) rect(metal2_lbl (-23940 1100) (0 0)) ) - net(5) - net(6) - net(7) - net(8) - net(9) - net(10) - net(11) - net(12) + net(5 name($I25)) + net(6 name($I24)) + net(7 name($I23)) + net(8 name($I22)) + net(9 name($I17)) + net(10 name($I11)) + net(11 name($I10)) + net(12 name($I9)) # Outgoing pins and their connections to nets pin(1 name(FB)) diff --git a/testdata/algo/lvs_test3_au.lvsdb b/testdata/algo/lvs_test3_au.lvsdb index 617d84271..dab89637b 100644 --- a/testdata/algo/lvs_test3_au.lvsdb +++ b/testdata/algo/lvs_test3_au.lvsdb @@ -116,7 +116,7 @@ layout( rect((-1700 -2440) (3100 7820)) # Nets with their geometries - net(1 + net(1 name($1) rect(nwell (-1400 1800) (2800 3580)) rect(diff_cont (-1510 -650) (220 220)) rect(ntie (-510 -450) (800 680)) @@ -267,12 +267,12 @@ layout( # Nets with their geometries net(1 name(BULK)) - net(2) - net(3) - net(4) - net(5) - net(6) - net(7) + net(2 name($2)) + net(3 name($3)) + net(4 name($4)) + net(5 name($5)) + net(6 name($6)) + net(7 name($7)) # Outgoing pins and their connections to nets pin(1 name(BULK)) @@ -346,14 +346,14 @@ layout( rect(metal1 (2280 -1120) (360 1120)) rect(metal2_lbl (-23940 1100) (0 0)) ) - net(5) - net(6) - net(7) - net(8) - net(9) - net(10) - net(11) - net(12) + net(5 name($5)) + net(6 name($6)) + net(7 name($7)) + net(8 name($8)) + net(9 name($9)) + net(10 name($10)) + net(11 name($11)) + net(12 name($12)) # Outgoing pins and their connections to nets pin(1 name(FB)) diff --git a/testdata/drc/drcSimpleTests_au122.l2n b/testdata/drc/drcSimpleTests_au122.l2n index d34f94a3f..469ce6ba3 100644 --- a/testdata/drc/drcSimpleTests_au122.l2n +++ b/testdata/drc/drcSimpleTests_au122.l2n @@ -27,7 +27,7 @@ D(D$MOS MOS ) X(A R((-2800 -2500) (5600 5200)) - N(1 + N(1 I($1) R(contact (-1900 2000) (600 600)) R(contact (-600 -600) (600 600)) R(contact (2600 -600) (600 600)) @@ -36,13 +36,13 @@ X(A R(contact (-600 -600) (600 600)) R(sd (-2300 -700) (4000 800)) ) - N(2 + N(2 I($2) R(contact (-1900 -2400) (600 600)) R(contact (2600 -600) (600 600)) R(contact (-2200 -600) (600 600)) R(sd (-2300 -700) (4000 800)) ) - N(3 + N(3 I($3) R(poly (-2800 -1700) (5600 3600)) ) P(1) @@ -63,9 +63,9 @@ X(A ) X(AA R((-2050 -1950) (5600 5200)) - N(1) - N(2) - N(3) + N(1 I($I3)) + N(2 I($I2)) + N(3 I($I1)) P(1) P(2) P(3) @@ -94,10 +94,10 @@ X(TOP R(contact (-1200 -1600) (600 600)) R(contact (1000 -600) (600 600)) ) - N(3 + N(3 I($3) R(l1 (-2350 8300) (4000 850)) ) - N(4 + N(4 I($4) R(l1 (-2800 -2800) (800 4100)) ) X(1 AA Y(-1100 5900) diff --git a/testdata/lvs/bbdevices1.lvsdb b/testdata/lvs/bbdevices1.lvsdb index 71177629c..5b56c62b6 100644 --- a/testdata/lvs/bbdevices1.lvsdb +++ b/testdata/lvs/bbdevices1.lvsdb @@ -188,7 +188,7 @@ layout( rect((-577500 -1123000) (1868000 1796000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l2 (345500 455000) (256500 25000)) rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-47000 -183500) (75000 75000)) @@ -207,7 +207,7 @@ layout( rect(l10 (-57500 -57500) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000)) ) - net(2 + net(2 name($2) rect(l2 (-148000 463000) (300000 25000)) ) net(3 name($5) diff --git a/testdata/lvs/bbdevices1b.lvsdb b/testdata/lvs/bbdevices1b.lvsdb index ec7a60026..8005ca7b5 100644 --- a/testdata/lvs/bbdevices1b.lvsdb +++ b/testdata/lvs/bbdevices1b.lvsdb @@ -118,7 +118,7 @@ layout( rect((-577500 -1123000) (1868000 1796000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l2 (345500 455000) (256500 25000)) rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-47000 -183500) (75000 75000)) @@ -137,7 +137,7 @@ layout( rect(l10 (-57500 -57500) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000)) ) - net(2 + net(2 name($2) rect(l2 (-148000 463000) (300000 25000)) ) net(3 name($5) diff --git a/testdata/lvs/bbdevices2.lvsdb b/testdata/lvs/bbdevices2.lvsdb index 0f2a44006..407117c0e 100644 --- a/testdata/lvs/bbdevices2.lvsdb +++ b/testdata/lvs/bbdevices2.lvsdb @@ -192,7 +192,7 @@ layout( rect((-577500 -1123000) (1868000 1796000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l2 (345500 455000) (256500 25000)) rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-47000 -183500) (75000 75000)) @@ -211,13 +211,13 @@ layout( rect(l10 (-57500 -57500) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000)) ) - net(2 + net(2 name($2) rect(l2 (-148000 463000) (300000 25000)) ) - net(3 + net(3 name($3) rect(l2 (-401420 456500) (50730 78500)) ) - net(4 + net(4 name($4) rect(l2 (822690 427000) (63970 82000)) ) net(5 name($7) diff --git a/testdata/lvs/bbdevices2b.lvsdb b/testdata/lvs/bbdevices2b.lvsdb index 9cd9cc391..459b27469 100644 --- a/testdata/lvs/bbdevices2b.lvsdb +++ b/testdata/lvs/bbdevices2b.lvsdb @@ -122,7 +122,7 @@ layout( rect((-577500 -1123000) (1868000 1796000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l2 (345500 455000) (256500 25000)) rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-47000 -183500) (75000 75000)) @@ -141,13 +141,13 @@ layout( rect(l10 (-57500 -57500) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000)) ) - net(2 + net(2 name($2) rect(l2 (-148000 463000) (300000 25000)) ) - net(3 + net(3 name($3) rect(l2 (-401420 456500) (50730 78500)) ) - net(4 + net(4 name($4) rect(l2 (822690 427000) (63970 82000)) ) net(5 name($7) diff --git a/testdata/lvs/bbdevices3.lvsdb b/testdata/lvs/bbdevices3.lvsdb index 3ab3475c0..def2c167b 100644 --- a/testdata/lvs/bbdevices3.lvsdb +++ b/testdata/lvs/bbdevices3.lvsdb @@ -188,7 +188,7 @@ layout( rect((-577500 -1123000) (1868000 1796000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l2 (345500 455000) (256500 25000)) rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-47000 -183500) (75000 75000)) @@ -207,7 +207,7 @@ layout( rect(l10 (-57500 -57500) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000)) ) - net(2 + net(2 name($2) rect(l2 (-148000 463000) (300000 25000)) ) net(3 name($5) diff --git a/testdata/lvs/bbdevices3b.lvsdb b/testdata/lvs/bbdevices3b.lvsdb index f60bc5bab..54f8a1495 100644 --- a/testdata/lvs/bbdevices3b.lvsdb +++ b/testdata/lvs/bbdevices3b.lvsdb @@ -118,7 +118,7 @@ layout( rect((-577500 -1123000) (1868000 1796000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l2 (345500 455000) (256500 25000)) rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-47000 -183500) (75000 75000)) @@ -137,7 +137,7 @@ layout( rect(l10 (-57500 -57500) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000)) ) - net(2 + net(2 name($2) rect(l2 (-148000 463000) (300000 25000)) ) net(3 name($5) diff --git a/testdata/lvs/bbdevices4.lvsdb b/testdata/lvs/bbdevices4.lvsdb index 0a74172f8..b56688d9f 100644 --- a/testdata/lvs/bbdevices4.lvsdb +++ b/testdata/lvs/bbdevices4.lvsdb @@ -185,7 +185,7 @@ layout( rect((-577500 -1123000) (1868000 1796000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l2 (345500 455000) (256500 25000)) rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-47000 -183500) (75000 75000)) @@ -204,7 +204,7 @@ layout( rect(l10 (-57500 -57500) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000)) ) - net(2 + net(2 name($2) rect(l2 (-148000 463000) (300000 25000)) ) net(3 name($5) diff --git a/testdata/lvs/bbdevices4b.lvsdb b/testdata/lvs/bbdevices4b.lvsdb index ba1dfd285..a711228ae 100644 --- a/testdata/lvs/bbdevices4b.lvsdb +++ b/testdata/lvs/bbdevices4b.lvsdb @@ -115,7 +115,7 @@ layout( rect((-577500 -1123000) (1868000 1796000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l2 (345500 455000) (256500 25000)) rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-47000 -183500) (75000 75000)) @@ -134,7 +134,7 @@ layout( rect(l10 (-57500 -57500) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000)) ) - net(2 + net(2 name($2) rect(l2 (-148000 463000) (300000 25000)) ) net(3 name($5) diff --git a/testdata/lvs/bbdevices5.lvsdb b/testdata/lvs/bbdevices5.lvsdb index 6b5dee81b..3eae842f5 100644 --- a/testdata/lvs/bbdevices5.lvsdb +++ b/testdata/lvs/bbdevices5.lvsdb @@ -188,7 +188,7 @@ layout( rect((-577500 -1123000) (1868000 1796000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l2 (345500 455000) (256500 25000)) rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-47000 -183500) (75000 75000)) @@ -207,7 +207,7 @@ layout( rect(l10 (-57500 -57500) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000)) ) - net(2 + net(2 name($2) rect(l2 (-148000 463000) (300000 25000)) ) net(3 name($5) diff --git a/testdata/lvs/bbdevices5b.lvsdb b/testdata/lvs/bbdevices5b.lvsdb index 7e9f9b4c0..44b974382 100644 --- a/testdata/lvs/bbdevices5b.lvsdb +++ b/testdata/lvs/bbdevices5b.lvsdb @@ -118,7 +118,7 @@ layout( rect((-577500 -1123000) (1868000 1796000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l2 (345500 455000) (256500 25000)) rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-47000 -183500) (75000 75000)) @@ -137,7 +137,7 @@ layout( rect(l10 (-57500 -57500) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000)) ) - net(2 + net(2 name($2) rect(l2 (-148000 463000) (300000 25000)) ) net(3 name($5) diff --git a/testdata/lvs/bbdevices6.lvsdb b/testdata/lvs/bbdevices6.lvsdb index b0264ad49..a788c4b0f 100644 --- a/testdata/lvs/bbdevices6.lvsdb +++ b/testdata/lvs/bbdevices6.lvsdb @@ -188,7 +188,7 @@ layout( rect((-577500 -1123000) (1868000 1796000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l2 (345500 455000) (256500 25000)) rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-47000 -183500) (75000 75000)) @@ -207,7 +207,7 @@ layout( rect(l10 (-57500 -57500) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000)) ) - net(2 + net(2 name($2) rect(l9 (348500 26500) (25000 179000)) rect(l9 (-57500 -58000) (90000 90000)) rect(l9 (-86000 -288500) (90000 90000)) @@ -223,7 +223,7 @@ layout( rect(l14 (186500 -16500) (25000 193000)) rect(l14 (-87500 -87500) (150000 150000)) ) - net(3 + net(3 name($3) rect(l2 (-148000 463000) (300000 25000)) ) diff --git a/testdata/lvs/bbdevices6b.lvsdb b/testdata/lvs/bbdevices6b.lvsdb index b75d0a8e5..afab7208e 100644 --- a/testdata/lvs/bbdevices6b.lvsdb +++ b/testdata/lvs/bbdevices6b.lvsdb @@ -118,7 +118,7 @@ layout( rect((-577500 -1123000) (1868000 1796000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l2 (345500 455000) (256500 25000)) rect(l2 (-256500 -146000) (25000 146000)) rect(l2 (-47000 -183500) (75000 75000)) @@ -137,7 +137,7 @@ layout( rect(l10 (-57500 -57500) (25000 25000)) rect(l11 (-25000 -25000) (25000 25000)) ) - net(2 + net(2 name($2) rect(l9 (348500 26500) (25000 179000)) rect(l9 (-57500 -58000) (90000 90000)) rect(l9 (-86000 -288500) (90000 90000)) @@ -153,7 +153,7 @@ layout( rect(l14 (186500 -16500) (25000 193000)) rect(l14 (-87500 -87500) (150000 150000)) ) - net(3 + net(3 name($3) rect(l2 (-148000 463000) (300000 25000)) ) diff --git a/testdata/lvs/blackbox3.lvsdb b/testdata/lvs/blackbox3.lvsdb index 0ea7fb1e5..6e03427ab 100644 --- a/testdata/lvs/blackbox3.lvsdb +++ b/testdata/lvs/blackbox3.lvsdb @@ -44,7 +44,7 @@ layout( rect((-18500 -14000) (44500 28000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l1 (6000 -6000) (7000 1000)) rect(l1 (-1000 0) (1000 12000)) rect(l1 (-1000 0) (5160 1000)) diff --git a/testdata/lvs/blackbox5.lvsdb b/testdata/lvs/blackbox5.lvsdb index 6d8f88e0a..9519d4150 100644 --- a/testdata/lvs/blackbox5.lvsdb +++ b/testdata/lvs/blackbox5.lvsdb @@ -44,7 +44,7 @@ layout( rect((-18500 -14000) (44500 28000)) # Nets with their geometries - net(1 + net(1 name($1) rect(l1 (6000 -6000) (7000 1000)) rect(l1 (-1000 0) (1000 12000)) rect(l1 (-1000 0) (4550 1000)) diff --git a/testdata/lvs/custom_resistors.l2n.1 b/testdata/lvs/custom_resistors.l2n.1 index 1047b4c0a..fd0a94687 100644 --- a/testdata/lvs/custom_resistors.l2n.1 +++ b/testdata/lvs/custom_resistors.l2n.1 @@ -29,12 +29,12 @@ D(D$RPP1$1 RPP1 ) X(A R((-200 -450) (1750 1350)) - N(1 + N(1 I($1) R(l4 (-150 450) (100 100)) R(l3 (-150 -150) (200 500)) R(l1 (-200 -500) (250 200)) ) - N(2 + N(2 I($2) R(l4 (650 450) (100 100)) R(l4 (-100 -900) (100 100)) R(l3 (-150 200) (200 650)) @@ -42,7 +42,7 @@ X(A R(l1 (-250 300) (250 200)) R(l1 (-200 -1000) (250 200)) ) - N(3 + N(3 I($3) R(l4 (1450 -350) (100 100)) ) P(1) @@ -60,12 +60,12 @@ X(A ) X(TOP R((-50 450) (3800 2600)) - N(1 + N(1 I($1) R(l4 (850 2050) (100 100)) R(l3 (-150 -150) (500 200)) R(l1 (-500 -250) (200 250)) ) - N(2 + N(2 I($2) R(l4 (850 1250) (100 100)) R(l4 (-100 -100) (100 100)) R(l4 (-900 -100) (100 100)) @@ -74,14 +74,14 @@ X(TOP R(l1 (300 -250) (200 300)) R(l1 (-1000 -300) (200 250)) ) - N(3 + N(3 I($3) R(l4 (50 450) (100 100)) ) - N(4 + N(4 I($4) R(l4 (850 450) (100 100)) ) - N(5) - N(6) + N(5 I($I2)) + N(6 I($I1)) D(1 D$RPP1 Y(800 750) E(R 0.555555555556) diff --git a/testdata/lvs/custom_resistors.l2n.2 b/testdata/lvs/custom_resistors.l2n.2 index 17deb7617..df87bc89f 100644 --- a/testdata/lvs/custom_resistors.l2n.2 +++ b/testdata/lvs/custom_resistors.l2n.2 @@ -29,12 +29,12 @@ D(D$RPP1$1 RPP1 ) X(A R((-200 -450) (1750 1350)) - N(1 + N(1 I($1) R(l4 (-150 450) (100 100)) R(l3 (-150 -150) (200 500)) R(l1 (-200 -500) (250 200)) ) - N(2 + N(2 I($2) R(l4 (650 450) (100 100)) R(l4 (-100 -900) (100 100)) R(l3 (-150 200) (200 650)) @@ -42,7 +42,7 @@ X(A R(l1 (-250 300) (250 200)) R(l1 (-200 -1000) (250 200)) ) - N(3 + N(3 I($3) R(l4 (1450 -350) (100 100)) ) P(1) @@ -60,12 +60,12 @@ X(A ) X(TOP R((-50 450) (3800 2600)) - N(1 + N(1 I($1) R(l4 (850 2050) (100 100)) R(l3 (-150 -150) (500 200)) R(l1 (-500 -250) (200 250)) ) - N(2 + N(2 I($2) R(l4 (850 1250) (100 100)) R(l4 (-100 -100) (100 100)) R(l4 (-900 -100) (100 100)) @@ -74,14 +74,14 @@ X(TOP R(l1 (300 -250) (200 300)) R(l1 (-1000 -300) (200 250)) ) - N(3 + N(3 I($3) R(l4 (50 450) (100 100)) ) - N(4 + N(4 I($4) R(l4 (850 450) (100 100)) ) - N(5) - N(6) + N(5 I($I2)) + N(6 I($I1)) D(1 D$RPP1 Y(800 750) E(R 0.555555555556) diff --git a/testdata/lvs/custom_resistors.l2n.3 b/testdata/lvs/custom_resistors.l2n.3 index 01f44b800..d75bc9430 100644 --- a/testdata/lvs/custom_resistors.l2n.3 +++ b/testdata/lvs/custom_resistors.l2n.3 @@ -29,12 +29,12 @@ D(D$RPP1$1 RPP1 ) X(A R((-200 -450) (1750 1350)) - N(1 + N(1 I($1) R(l4 (-150 450) (100 100)) R(l3 (-150 -150) (200 500)) R(l1 (-200 -500) (250 200)) ) - N(2 + N(2 I($2) R(l4 (650 450) (100 100)) R(l4 (-100 -900) (100 100)) R(l3 (-150 200) (200 650)) @@ -42,7 +42,7 @@ X(A R(l1 (-250 300) (250 200)) R(l1 (-200 -1000) (250 200)) ) - N(3 + N(3 I($3) R(l4 (1450 -350) (100 100)) ) P(1) @@ -60,12 +60,12 @@ X(A ) X(TOP R((-50 450) (3800 2600)) - N(1 + N(1 I($1) R(l4 (850 2050) (100 100)) R(l3 (-150 -150) (500 200)) R(l1 (-500 -250) (200 250)) ) - N(2 + N(2 I($2) R(l4 (850 1250) (100 100)) R(l4 (-100 -100) (100 100)) R(l4 (-900 -100) (100 100)) @@ -74,14 +74,14 @@ X(TOP R(l1 (300 -250) (200 300)) R(l1 (-1000 -300) (200 250)) ) - N(3 + N(3 I($3) R(l4 (50 450) (100 100)) ) - N(4 + N(4 I($4) R(l4 (850 450) (100 100)) ) - N(5) - N(6) + N(5 I($I2)) + N(6 I($I1)) D(1 D$RPP1 Y(800 750) E(R 0.555555555556) diff --git a/testdata/lvs/double_height.lvsdb b/testdata/lvs/double_height.lvsdb index 2ad29707b..f9b66a23d 100644 --- a/testdata/lvs/double_height.lvsdb +++ b/testdata/lvs/double_height.lvsdb @@ -53,7 +53,7 @@ J( ) X(INV R((-1500 -800) (3000 4600)) - N(1 + N(1 I($1) R(l6 (290 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -62,7 +62,7 @@ J( R(l10 (-2025 -775) (3000 900)) R(l5 (-1375 -925) (775 950)) ) - N(2 + N(2 I($2) R(l6 (290 2490) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -71,12 +71,12 @@ J( R(l10 (-2025 -775) (3000 900)) R(l2 (-1375 -925) (775 950)) ) - N(3 + N(3 I($3) R(l3 (-125 -250) (250 2500)) R(l3 (-250 -3050) (250 1600)) R(l3 (-250 1200) (250 1600)) ) - N(4 + N(4 I($4) R(l6 (-510 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) @@ -159,7 +159,7 @@ J( ) X(INVCHAIN R((-90 0) (4475 9200)) - N(1 + N(1 I($1) R(l3 (1625 1835) (2160 250)) R(l3 (-250 0) (250 4990)) R(l3 (-1605 0) (1605 250)) diff --git a/testdata/lvs/double_height2.lvsdb b/testdata/lvs/double_height2.lvsdb index ff5e4200a..9f2453268 100644 --- a/testdata/lvs/double_height2.lvsdb +++ b/testdata/lvs/double_height2.lvsdb @@ -56,7 +56,7 @@ J( ) X(INV R((-1500 -800) (3000 4600)) - N(1 + N(1 I($1) R(l6 (290 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -65,7 +65,7 @@ J( R(l10 (-2025 -775) (3000 900)) R(l5 (-1375 -925) (775 950)) ) - N(2 + N(2 I($2) R(l6 (290 2490) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -74,12 +74,12 @@ J( R(l10 (-2025 -775) (3000 900)) R(l2 (-1375 -925) (775 950)) ) - N(3 + N(3 I($3) R(l3 (-125 -250) (250 2500)) R(l3 (-250 -3050) (250 1600)) R(l3 (-250 1200) (250 1600)) ) - N(4 + N(4 I($4) R(l6 (-510 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) diff --git a/testdata/lvs/double_height2_texts.lvsdb b/testdata/lvs/double_height2_texts.lvsdb index c5b5b94bf..8462d465e 100644 --- a/testdata/lvs/double_height2_texts.lvsdb +++ b/testdata/lvs/double_height2_texts.lvsdb @@ -56,7 +56,7 @@ J( ) X(INV R((-1500 -800) (3000 4600)) - N(1 + N(1 I($1) R(l6 (290 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -65,7 +65,7 @@ J( R(l10 (-2025 -775) (3000 900)) R(l5 (-1375 -925) (775 950)) ) - N(2 + N(2 I($2) R(l6 (290 2490) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -74,12 +74,12 @@ J( R(l10 (-2025 -775) (3000 900)) R(l2 (-1375 -925) (775 950)) ) - N(3 + N(3 I($3) R(l3 (-125 -250) (250 2500)) R(l3 (-250 -3050) (250 1600)) R(l3 (-250 1200) (250 1600)) ) - N(4 + N(4 I($4) R(l6 (-510 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) diff --git a/testdata/lvs/empty_subcells.lvsdb b/testdata/lvs/empty_subcells.lvsdb index 5a0306ccb..38b62dfbf 100644 --- a/testdata/lvs/empty_subcells.lvsdb +++ b/testdata/lvs/empty_subcells.lvsdb @@ -68,12 +68,12 @@ layout( rect((100 10) (340 80)) # Nets with their geometries - net(1 + net(1 name($1) rect(l1 (180 60) (90 30)) rect(l2 (-160 -20) (90 10)) rect(l2 (40 -10) (180 10)) ) - net(2 + net(2 name($2) rect(l1 (180 10) (90 30)) rect(l2 (-160 -20) (90 10)) rect(l2 (40 -10) (180 10)) diff --git a/testdata/lvs/flag_missing_ports.lvsdb b/testdata/lvs/flag_missing_ports.lvsdb index 10baa7f3a..dc0daa191 100644 --- a/testdata/lvs/flag_missing_ports.lvsdb +++ b/testdata/lvs/flag_missing_ports.lvsdb @@ -119,7 +119,7 @@ layout( rect(l2 (-275 -2150) (425 1500)) rect(l2 (-400 -1500) (425 1500)) ) - net(2 + net(2 name($2) rect(l8 (1810 1770) (180 180)) rect(l8 (-180 370) (180 180)) rect(l8 (-1580 3760) (180 180)) @@ -146,7 +146,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(b) diff --git a/testdata/lvs/floating.lvsdb b/testdata/lvs/floating.lvsdb index 3822292b2..0c5917576 100644 --- a/testdata/lvs/floating.lvsdb +++ b/testdata/lvs/floating.lvsdb @@ -216,7 +216,7 @@ layout( rect((-100 400) (5600 7600)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (3100 2950) (950 300)) ) net(2 name(A) @@ -226,8 +226,8 @@ layout( rect(l11 (2400 3100) (0 0)) ) net(4 name(SUBSTRATE)) - net(5) - net(6) + net(5 name($I3)) + net(6 name($I1)) # Outgoing pins and their connections to nets pin(2 name(A)) diff --git a/testdata/lvs/invchain_cheat.lvsdb b/testdata/lvs/invchain_cheat.lvsdb index bf85c951c..0350f7576 100644 --- a/testdata/lvs/invchain_cheat.lvsdb +++ b/testdata/lvs/invchain_cheat.lvsdb @@ -53,7 +53,7 @@ J( ) X(INV R((-1500 -800) (3000 4600)) - N(1 + N(1 I($1) R(l6 (290 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -62,7 +62,7 @@ J( R(l10 (-2025 -775) (3000 900)) R(l5 (-1375 -925) (775 950)) ) - N(2 + N(2 I($2) R(l6 (290 2490) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -71,12 +71,12 @@ J( R(l10 (-2025 -775) (3000 900)) R(l2 (-1375 -925) (775 950)) ) - N(3 + N(3 I($3) R(l3 (-125 -250) (250 2500)) R(l3 (-250 -3050) (250 1600)) R(l3 (-250 1200) (250 1600)) ) - N(4 + N(4 I($4) R(l6 (-510 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) @@ -118,12 +118,12 @@ J( ) X(INV2 R((0 0) (5500 4600)) - N(1) - N(2) - N(3) - N(4) - N(5) - N(6) + N(1 I($I8)) + N(2 I($I7)) + N(3 I($I6)) + N(4 I($I5)) + N(5 I($I4)) + N(6 I($I2)) P(1) P(2) P(3) @@ -163,8 +163,8 @@ J( N(6 I('8') R(l12 (4410 1920) (0 0)) ) - N(7) - N(8) + N(7 I($I4)) + N(8 I($I2)) P(1 I('3')) P(2 I('5')) P(3 I('7')) @@ -198,27 +198,27 @@ J( R(l3 (-1295 925) (1235 350)) R(l11 (-910 -150) (0 0)) ) - N(2 + N(2 I($2) R(l3 (445 805) (480 550)) R(l7 (-435 -365) (220 220)) R(l8 (-1065 -285) (1105 350)) ) - N(3 + N(3 I($3) R(l3 (1345 925) (1945 350)) R(l7 (-1885 -285) (220 220)) R(l8 (-295 -370) (440 520)) ) - N(4 + N(4 I($4) R(l3 (3745 805) (480 550)) R(l7 (-435 -365) (220 220)) R(l8 (-1065 -285) (1105 350)) ) - N(5 + N(5 I($5) R(l3 (4645 925) (1945 350)) R(l7 (-1885 -285) (220 220)) R(l8 (-295 -370) (440 520)) ) - N(6 + N(6 I($6) R(l3 (7045 805) (480 550)) R(l7 (-435 -365) (220 220)) R(l8 (-1065 -285) (1105 350)) diff --git a/testdata/lvs/layer_names.lvsdb b/testdata/lvs/layer_names.lvsdb index 1a9df5bf6..b864403fa 100644 --- a/testdata/lvs/layer_names.lvsdb +++ b/testdata/lvs/layer_names.lvsdb @@ -216,7 +216,7 @@ layout( rect((-100 400) (5600 7600)) # Nets with their geometries - net(1 + net(1 name($1) rect(metal1 (3100 2950) (950 300)) ) net(2 name(A) @@ -226,8 +226,8 @@ layout( rect(metal1 (2400 3100) (0 0)) ) net(4 name(SUBSTRATE)) - net(5) - net(6) + net(5 name($I3)) + net(6 name($I1)) # Outgoing pins and their connections to nets pin(2 name(A)) diff --git a/testdata/lvs/must_connect1.lvsdb b/testdata/lvs/must_connect1.lvsdb index 26eeb011f..7126a9445 100644 --- a/testdata/lvs/must_connect1.lvsdb +++ b/testdata/lvs/must_connect1.lvsdb @@ -54,7 +54,7 @@ J( ) X(INV R((-1500 -800) (3000 4600)) - N(1 + N(1 I($1) R(l6 (290 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -63,7 +63,7 @@ J( R(l10 (-2025 -775) (3000 900)) R(l5 (-1375 -925) (775 950)) ) - N(2 + N(2 I($2) R(l6 (290 2490) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -72,12 +72,12 @@ J( R(l10 (-2025 -775) (3000 900)) R(l2 (-1375 -925) (775 950)) ) - N(3 + N(3 I($3) R(l3 (-125 -250) (250 2500)) R(l3 (-250 -3050) (250 1600)) R(l3 (-250 1200) (250 1600)) ) - N(4 + N(4 I($4) R(l6 (-510 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) @@ -160,14 +160,14 @@ J( ) X(INVCHAIN R((-915 -15) (10415 9215)) - N(1 + N(1 I($1) R(l3 (7340 1650) (2160 250)) R(l3 (-250 0) (250 4990)) R(l3 (-1605 0) (1605 250)) R(l7 (-1545 -250) (240 250)) R(l8 (-560 -375) (690 510)) ) - N(2 + N(2 I($2) R(l3 (1625 1835) (2160 250)) R(l3 (-250 0) (250 4990)) R(l3 (-1605 0) (1605 250)) @@ -225,21 +225,21 @@ J( ) X(TOP R((-305 350) (15415 9225)) - N(1 + N(1 I($1) R(l3 (12950 2130) (2160 250)) R(l3 (-250 0) (250 4990)) R(l3 (-1605 0) (1605 250)) R(l7 (-1545 -250) (240 250)) R(l8 (-560 -375) (690 510)) ) - N(2 + N(2 I($2) R(l3 (12100 7300) (640 530)) R(l7 (-540 -415) (270 250)) R(l8 (-1695 -250) (1695 250)) R(l8 (-4075 -5650) (2630 250)) R(l8 (-250 0) (250 5150)) ) - N(3 + N(3 I($3) R(l7 (6465 7325) (220 240)) R(l8 (-4100 -5365) (3125 250)) R(l8 (-250 0) (250 4860)) diff --git a/testdata/lvs/must_connect1_tl.lvsdb b/testdata/lvs/must_connect1_tl.lvsdb index fa6a8ab2c..06886d1ad 100644 --- a/testdata/lvs/must_connect1_tl.lvsdb +++ b/testdata/lvs/must_connect1_tl.lvsdb @@ -54,7 +54,7 @@ J( ) X(INV R((-1500 -800) (3000 4600)) - N(1 + N(1 I($1) R(l6 (290 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -63,7 +63,7 @@ J( R(l10 (-2025 -775) (3000 900)) R(l5 (-1375 -925) (775 950)) ) - N(2 + N(2 I($2) R(l6 (290 2490) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -72,12 +72,12 @@ J( R(l10 (-2025 -775) (3000 900)) R(l2 (-1375 -925) (775 950)) ) - N(3 + N(3 I($3) R(l3 (-125 -250) (250 2500)) R(l3 (-250 -3050) (250 1600)) R(l3 (-250 1200) (250 1600)) ) - N(4 + N(4 I($4) R(l6 (-510 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) @@ -160,14 +160,14 @@ J( ) X(INVCHAIN R((-915 -15) (10415 9215)) - N(1 + N(1 I($1) R(l3 (7340 1650) (2160 250)) R(l3 (-250 0) (250 4990)) R(l3 (-1605 0) (1605 250)) R(l7 (-1545 -250) (240 250)) R(l8 (-560 -375) (690 510)) ) - N(2 + N(2 I($2) R(l3 (1625 1835) (2160 250)) R(l3 (-250 0) (250 4990)) R(l3 (-1605 0) (1605 250)) @@ -225,21 +225,21 @@ J( ) X(TOP R((-305 350) (15415 9225)) - N(1 + N(1 I($1) R(l3 (12950 2130) (2160 250)) R(l3 (-250 0) (250 4990)) R(l3 (-1605 0) (1605 250)) R(l7 (-1545 -250) (240 250)) R(l8 (-560 -375) (690 510)) ) - N(2 + N(2 I($2) R(l3 (12100 7300) (640 530)) R(l7 (-540 -415) (270 250)) R(l8 (-1695 -250) (1695 250)) R(l8 (-4075 -5650) (2630 250)) R(l8 (-250 0) (250 5150)) ) - N(3 + N(3 I($3) R(l7 (6465 7325) (220 240)) R(l8 (-4100 -5365) (3125 250)) R(l8 (-250 0) (250 4860)) diff --git a/testdata/lvs/must_connect2.lvsdb b/testdata/lvs/must_connect2.lvsdb index 9357d2c35..f73599655 100644 --- a/testdata/lvs/must_connect2.lvsdb +++ b/testdata/lvs/must_connect2.lvsdb @@ -56,7 +56,7 @@ J( ) X(INV R((-1500 -800) (3000 4600)) - N(1 + N(1 I($1) R(l6 (290 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -65,7 +65,7 @@ J( R(l10 (-2025 -775) (3000 900)) R(l5 (-1375 -925) (775 950)) ) - N(2 + N(2 I($2) R(l6 (290 2490) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -74,12 +74,12 @@ J( R(l10 (-2025 -775) (3000 900)) R(l2 (-1375 -925) (775 950)) ) - N(3 + N(3 I($3) R(l3 (-125 -250) (250 2500)) R(l3 (-250 -3050) (250 1600)) R(l3 (-250 1200) (250 1600)) ) - N(4 + N(4 I($4) R(l6 (-510 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) @@ -162,14 +162,14 @@ J( ) X(INVCHAIN R((-915 -15) (10415 9215)) - N(1 + N(1 I($1) R(l3 (7340 1650) (2160 250)) R(l3 (-250 0) (250 4990)) R(l3 (-1605 0) (1605 250)) R(l7 (-1545 -250) (240 250)) R(l8 (-560 -375) (690 510)) ) - N(2 + N(2 I($2) R(l3 (1625 1835) (2160 250)) R(l3 (-250 0) (250 4990)) R(l3 (-1605 0) (1605 250)) @@ -228,21 +228,21 @@ J( ) X(TOP R((-305 350) (15415 9225)) - N(1 + N(1 I($1) R(l3 (12950 2130) (2160 250)) R(l3 (-250 0) (250 4990)) R(l3 (-1605 0) (1605 250)) R(l7 (-1545 -250) (240 250)) R(l8 (-560 -375) (690 510)) ) - N(2 + N(2 I($2) R(l3 (12100 7300) (640 530)) R(l7 (-540 -415) (270 250)) R(l8 (-1695 -250) (1695 250)) R(l8 (-4075 -5650) (2630 250)) R(l8 (-250 0) (250 5150)) ) - N(3 + N(3 I($3) R(l7 (6465 7325) (220 240)) R(l8 (-4100 -5365) (3125 250)) R(l8 (-250 0) (250 4860)) diff --git a/testdata/lvs/must_connect3.lvsdb b/testdata/lvs/must_connect3.lvsdb index 19782493b..003f4aa50 100644 --- a/testdata/lvs/must_connect3.lvsdb +++ b/testdata/lvs/must_connect3.lvsdb @@ -53,7 +53,7 @@ J( ) X(INV R((-1500 -800) (3000 4600)) - N(1 + N(1 I($1) R(l6 (290 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -62,7 +62,7 @@ J( R(l10 (-2025 -775) (3000 900)) R(l5 (-1375 -925) (775 950)) ) - N(2 + N(2 I($2) R(l6 (290 2490) (220 220)) R(l6 (-220 180) (220 220)) R(l8 (-290 -690) (360 760)) @@ -71,12 +71,12 @@ J( R(l10 (-2025 -775) (3000 900)) R(l2 (-1375 -925) (775 950)) ) - N(3 + N(3 I($3) R(l3 (-125 -250) (250 2500)) R(l3 (-250 -3050) (250 1600)) R(l3 (-250 1200) (250 1600)) ) - N(4 + N(4 I($4) R(l6 (-510 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) @@ -159,14 +159,14 @@ J( ) X(INVCHAIN R((-915 -15) (10415 9215)) - N(1 + N(1 I($1) R(l3 (7340 1650) (2160 250)) R(l3 (-250 0) (250 4990)) R(l3 (-1605 0) (1605 250)) R(l7 (-1545 -250) (240 250)) R(l8 (-560 -375) (690 510)) ) - N(2 + N(2 I($2) R(l3 (1625 1835) (2160 250)) R(l3 (-250 0) (250 4990)) R(l3 (-1605 0) (1605 250)) @@ -225,13 +225,13 @@ J( ) X(TOP R((-305 350) (15415 9225)) - N(1 + N(1 I($1) R(l10 (3200 4800) (8800 400)) R(l10 (-5110 -425) (0 0)) R(l10 (-4295 30) (0 0)) R(l10 (9270 -80) (0 0)) ) - N(2 + N(2 I($2) R(l10 (-305 4435) (250 1220)) R(l10 (3665 -4655) (2780 400)) R(l10 (-2780 6900) (2815 440)) diff --git a/testdata/lvs/nand2_split_gate.lvsdb.1 b/testdata/lvs/nand2_split_gate.lvsdb.1 index 0ade4db56..0016b563b 100644 --- a/testdata/lvs/nand2_split_gate.lvsdb.1 +++ b/testdata/lvs/nand2_split_gate.lvsdb.1 @@ -133,7 +133,7 @@ layout( rect(l11 (-300 -300) (400 400)) text(l12 A (-200 -200)) ) - net(3 + net(3 name($3) rect(l8 (1300 300) (200 200)) rect(l8 (-200 -200) (200 200)) rect(l8 (-200 300) (200 200)) diff --git a/testdata/lvs/nand2_split_gate.lvsdb.2 b/testdata/lvs/nand2_split_gate.lvsdb.2 index 0c99205ab..916c8a33c 100644 --- a/testdata/lvs/nand2_split_gate.lvsdb.2 +++ b/testdata/lvs/nand2_split_gate.lvsdb.2 @@ -133,7 +133,7 @@ layout( rect(l11 (-300 -300) (400 400)) text(l12 A (-200 -200)) ) - net(3 + net(3 name($3) rect(l8 (1300 300) (200 200)) rect(l8 (-200 -200) (200 200)) rect(l8 (-200 300) (200 200)) diff --git a/testdata/lvs/nand2_split_gate_early.lvsdb.1 b/testdata/lvs/nand2_split_gate_early.lvsdb.1 index 0ade4db56..0016b563b 100644 --- a/testdata/lvs/nand2_split_gate_early.lvsdb.1 +++ b/testdata/lvs/nand2_split_gate_early.lvsdb.1 @@ -133,7 +133,7 @@ layout( rect(l11 (-300 -300) (400 400)) text(l12 A (-200 -200)) ) - net(3 + net(3 name($3) rect(l8 (1300 300) (200 200)) rect(l8 (-200 -200) (200 200)) rect(l8 (-200 300) (200 200)) diff --git a/testdata/lvs/nand2_split_gate_early.lvsdb.2 b/testdata/lvs/nand2_split_gate_early.lvsdb.2 index 0c99205ab..916c8a33c 100644 --- a/testdata/lvs/nand2_split_gate_early.lvsdb.2 +++ b/testdata/lvs/nand2_split_gate_early.lvsdb.2 @@ -133,7 +133,7 @@ layout( rect(l11 (-300 -300) (400 400)) text(l12 A (-200 -200)) ) - net(3 + net(3 name($3) rect(l8 (1300 300) (200 200)) rect(l8 (-200 -200) (200 200)) rect(l8 (-200 300) (200 200)) diff --git a/testdata/lvs/res_combine1.lvsdb.1 b/testdata/lvs/res_combine1.lvsdb.1 index be2dcbb47..c90222ede 100644 --- a/testdata/lvs/res_combine1.lvsdb.1 +++ b/testdata/lvs/res_combine1.lvsdb.1 @@ -44,7 +44,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine1.lvsdb.2 b/testdata/lvs/res_combine1.lvsdb.2 index 725a958ca..51a640e6d 100644 --- a/testdata/lvs/res_combine1.lvsdb.2 +++ b/testdata/lvs/res_combine1.lvsdb.2 @@ -44,7 +44,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine1.lvsdb.3 b/testdata/lvs/res_combine1.lvsdb.3 index 594bea880..00967a2b9 100644 --- a/testdata/lvs/res_combine1.lvsdb.3 +++ b/testdata/lvs/res_combine1.lvsdb.3 @@ -44,7 +44,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine1.lvsdb.4 b/testdata/lvs/res_combine1.lvsdb.4 index f9b232132..fac3dc94d 100644 --- a/testdata/lvs/res_combine1.lvsdb.4 +++ b/testdata/lvs/res_combine1.lvsdb.4 @@ -44,7 +44,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine1.lvsdb.5 b/testdata/lvs/res_combine1.lvsdb.5 index d7a796e89..cbb05935b 100644 --- a/testdata/lvs/res_combine1.lvsdb.5 +++ b/testdata/lvs/res_combine1.lvsdb.5 @@ -44,7 +44,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine1.lvsdb.6 b/testdata/lvs/res_combine1.lvsdb.6 index 456048215..2298c03fd 100644 --- a/testdata/lvs/res_combine1.lvsdb.6 +++ b/testdata/lvs/res_combine1.lvsdb.6 @@ -44,7 +44,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine2.lvsdb.1 b/testdata/lvs/res_combine2.lvsdb.1 index 877dec9ae..3016b7509 100644 --- a/testdata/lvs/res_combine2.lvsdb.1 +++ b/testdata/lvs/res_combine2.lvsdb.1 @@ -40,7 +40,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine2.lvsdb.2 b/testdata/lvs/res_combine2.lvsdb.2 index 8019fd0ca..0727eb8e8 100644 --- a/testdata/lvs/res_combine2.lvsdb.2 +++ b/testdata/lvs/res_combine2.lvsdb.2 @@ -40,7 +40,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine2.lvsdb.3 b/testdata/lvs/res_combine2.lvsdb.3 index ce3c2a3de..373d67535 100644 --- a/testdata/lvs/res_combine2.lvsdb.3 +++ b/testdata/lvs/res_combine2.lvsdb.3 @@ -40,7 +40,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine2.lvsdb.4 b/testdata/lvs/res_combine2.lvsdb.4 index ac3e9baa4..b53567902 100644 --- a/testdata/lvs/res_combine2.lvsdb.4 +++ b/testdata/lvs/res_combine2.lvsdb.4 @@ -40,7 +40,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine2.lvsdb.5 b/testdata/lvs/res_combine2.lvsdb.5 index 6f538c7ef..e0ce48f65 100644 --- a/testdata/lvs/res_combine2.lvsdb.5 +++ b/testdata/lvs/res_combine2.lvsdb.5 @@ -40,7 +40,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine2.lvsdb.6 b/testdata/lvs/res_combine2.lvsdb.6 index 0b94b61ee..035e6f33c 100644 --- a/testdata/lvs/res_combine2.lvsdb.6 +++ b/testdata/lvs/res_combine2.lvsdb.6 @@ -40,7 +40,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine3.lvsdb.1 b/testdata/lvs/res_combine3.lvsdb.1 index d067edf33..aa98fc515 100644 --- a/testdata/lvs/res_combine3.lvsdb.1 +++ b/testdata/lvs/res_combine3.lvsdb.1 @@ -40,7 +40,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine3.lvsdb.2 b/testdata/lvs/res_combine3.lvsdb.2 index 14254a034..f8d3d174e 100644 --- a/testdata/lvs/res_combine3.lvsdb.2 +++ b/testdata/lvs/res_combine3.lvsdb.2 @@ -40,7 +40,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine3.lvsdb.3 b/testdata/lvs/res_combine3.lvsdb.3 index c4c6ed4e3..ce4f60f01 100644 --- a/testdata/lvs/res_combine3.lvsdb.3 +++ b/testdata/lvs/res_combine3.lvsdb.3 @@ -40,7 +40,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine3.lvsdb.4 b/testdata/lvs/res_combine3.lvsdb.4 index c8ae0cd34..f04346bc2 100644 --- a/testdata/lvs/res_combine3.lvsdb.4 +++ b/testdata/lvs/res_combine3.lvsdb.4 @@ -40,7 +40,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine3.lvsdb.5 b/testdata/lvs/res_combine3.lvsdb.5 index 073211088..319e0c750 100644 --- a/testdata/lvs/res_combine3.lvsdb.5 +++ b/testdata/lvs/res_combine3.lvsdb.5 @@ -40,7 +40,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/res_combine3.lvsdb.6 b/testdata/lvs/res_combine3.lvsdb.6 index abb6d99e0..c77f35c23 100644 --- a/testdata/lvs/res_combine3.lvsdb.6 +++ b/testdata/lvs/res_combine3.lvsdb.6 @@ -40,7 +40,7 @@ layout( rect((8285 720) (117975 57350)) # Nets with their geometries - net(1 + net(1 name($1) rect(l4 (120580 32490) (220 220)) rect(l4 (-220 -745) (220 220)) rect(l4 (-220 -745) (220 220)) diff --git a/testdata/lvs/ringo_device_subcircuits.lvsdb.1 b/testdata/lvs/ringo_device_subcircuits.lvsdb.1 index a53138333..b3e9d8cf3 100644 --- a/testdata/lvs/ringo_device_subcircuits.lvsdb.1 +++ b/testdata/lvs/ringo_device_subcircuits.lvsdb.1 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_device_subcircuits.lvsdb.2 b/testdata/lvs/ringo_device_subcircuits.lvsdb.2 index c74e25058..d01baf5b0 100644 --- a/testdata/lvs/ringo_device_subcircuits.lvsdb.2 +++ b/testdata/lvs/ringo_device_subcircuits.lvsdb.2 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_layout_var.lvsdb.1 b/testdata/lvs/ringo_layout_var.lvsdb.1 index 276675045..09a84c082 100644 --- a/testdata/lvs/ringo_layout_var.lvsdb.1 +++ b/testdata/lvs/ringo_layout_var.lvsdb.1 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -390,7 +390,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -448,34 +448,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_layout_var.lvsdb.2 b/testdata/lvs/ringo_layout_var.lvsdb.2 index 2238cd24b..fb9e4a5a0 100644 --- a/testdata/lvs/ringo_layout_var.lvsdb.2 +++ b/testdata/lvs/ringo_layout_var.lvsdb.2 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -390,7 +390,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -448,34 +448,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_mixed_hierarchy.lvsdb b/testdata/lvs/ringo_mixed_hierarchy.lvsdb index 7824c9d2c..aaa1a946e 100644 --- a/testdata/lvs/ringo_mixed_hierarchy.lvsdb +++ b/testdata/lvs/ringo_mixed_hierarchy.lvsdb @@ -166,7 +166,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -288,7 +288,7 @@ layout( rect(l9 (-2275 -450) (500 1500)) rect(l9 (22900 -1500) (500 1500)) ) - net(4 + net(4 name($4) rect(l8 (3610 1770) (180 180)) rect(l8 (-180 370) (180 180)) rect(l8 (-1580 3760) (180 180)) diff --git a/testdata/lvs/ringo_simple.lvsdb.1 b/testdata/lvs/ringo_simple.lvsdb.1 index 30cbf6980..c7c49dbe7 100644 --- a/testdata/lvs/ringo_simple.lvsdb.1 +++ b/testdata/lvs/ringo_simple.lvsdb.1 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple.lvsdb.2 b/testdata/lvs/ringo_simple.lvsdb.2 index 94c1f9904..ef872de19 100644 --- a/testdata/lvs/ringo_simple.lvsdb.2 +++ b/testdata/lvs/ringo_simple.lvsdb.2 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_blackboxing.lvsdb b/testdata/lvs/ringo_simple_blackboxing.lvsdb index a76727f22..d572caf85 100644 --- a/testdata/lvs/ringo_simple_blackboxing.lvsdb +++ b/testdata/lvs/ringo_simple_blackboxing.lvsdb @@ -92,16 +92,16 @@ layout( rect((600 250) (25800 7750)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (18150 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (19950 2950) (900 300)) ) net(5 name(FB) diff --git a/testdata/lvs/ringo_simple_blackboxing_netter.lvsdb b/testdata/lvs/ringo_simple_blackboxing_netter.lvsdb index a76727f22..d572caf85 100644 --- a/testdata/lvs/ringo_simple_blackboxing_netter.lvsdb +++ b/testdata/lvs/ringo_simple_blackboxing_netter.lvsdb @@ -92,16 +92,16 @@ layout( rect((600 250) (25800 7750)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (18150 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (19950 2950) (900 300)) ) net(5 name(FB) diff --git a/testdata/lvs/ringo_simple_compare2.lvsdb.1 b/testdata/lvs/ringo_simple_compare2.lvsdb.1 index 30cbf6980..c7c49dbe7 100644 --- a/testdata/lvs/ringo_simple_compare2.lvsdb.1 +++ b/testdata/lvs/ringo_simple_compare2.lvsdb.1 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_compare2.lvsdb.2 b/testdata/lvs/ringo_simple_compare2.lvsdb.2 index 94c1f9904..ef872de19 100644 --- a/testdata/lvs/ringo_simple_compare2.lvsdb.2 +++ b/testdata/lvs/ringo_simple_compare2.lvsdb.2 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_device_scaling.lvsdb.1 b/testdata/lvs/ringo_simple_device_scaling.lvsdb.1 index 3c8750631..7741c19d1 100644 --- a/testdata/lvs/ringo_simple_device_scaling.lvsdb.1 +++ b/testdata/lvs/ringo_simple_device_scaling.lvsdb.1 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_device_scaling.lvsdb.2 b/testdata/lvs/ringo_simple_device_scaling.lvsdb.2 index 6c89b4e06..9c45bc1f1 100644 --- a/testdata/lvs/ringo_simple_device_scaling.lvsdb.2 +++ b/testdata/lvs/ringo_simple_device_scaling.lvsdb.2 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_dmos.lvsdb.1 b/testdata/lvs/ringo_simple_dmos.lvsdb.1 index 155a4128c..a32be3a4b 100644 --- a/testdata/lvs/ringo_simple_dmos.lvsdb.1 +++ b/testdata/lvs/ringo_simple_dmos.lvsdb.1 @@ -179,11 +179,11 @@ layout( rect(l13 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l8 (975 1660) (425 950)) rect(l8 (-400 -950) (425 950)) ) - net(5 + net(5 name($5) rect(l4 (-100 4500) (2600 3500)) ) net(6 name(B) @@ -307,7 +307,7 @@ layout( rect(l13 (-850 -400) (0 0)) rect(l8 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l4 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -365,34 +365,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l13 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l13 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l13 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l13 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l13 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l13 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l13 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l13 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l13 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l13 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_dmos.lvsdb.2 b/testdata/lvs/ringo_simple_dmos.lvsdb.2 index 64a000533..bce38cb9d 100644 --- a/testdata/lvs/ringo_simple_dmos.lvsdb.2 +++ b/testdata/lvs/ringo_simple_dmos.lvsdb.2 @@ -179,11 +179,11 @@ layout( rect(l13 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l8 (1000 1660) (425 950)) rect(l8 (-450 -950) (425 950)) ) - net(5 + net(5 name($5) rect(l4 (-100 4500) (2600 3500)) ) net(6 name(B) @@ -307,7 +307,7 @@ layout( rect(l13 (-850 -400) (0 0)) rect(l8 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l4 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -365,34 +365,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l13 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l13 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l13 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l13 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l13 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l13 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l13 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l13 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l13 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l13 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_dmos_fixed.lvsdb.1 b/testdata/lvs/ringo_simple_dmos_fixed.lvsdb.1 index f5a1b048e..8ef823a92 100644 --- a/testdata/lvs/ringo_simple_dmos_fixed.lvsdb.1 +++ b/testdata/lvs/ringo_simple_dmos_fixed.lvsdb.1 @@ -181,13 +181,13 @@ layout( rect(l8 (-950 860) (208 950)) rect(l8 (0 -950) (217 950)) ) - net(4 + net(4 name($4) rect(l8 (1208 1660) (192 950)) rect(l8 (-192 -950) (217 950)) rect(l6 (-425 -950) (208 950)) rect(l6 (-233 -950) (233 950)) ) - net(5 + net(5 name($5) rect(l4 (-100 4500) (2600 3500)) ) net(6 name(B) @@ -313,7 +313,7 @@ layout( rect(l8 (-650 860) (208 950)) rect(l8 (0 -950) (217 950)) ) - net(4 + net(4 name($4) rect(l4 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -371,34 +371,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l13 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l13 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l13 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l13 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l13 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l13 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l13 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l13 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l13 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l13 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_dmos_fixed.lvsdb.2 b/testdata/lvs/ringo_simple_dmos_fixed.lvsdb.2 index 65550776c..e8b7f3655 100644 --- a/testdata/lvs/ringo_simple_dmos_fixed.lvsdb.2 +++ b/testdata/lvs/ringo_simple_dmos_fixed.lvsdb.2 @@ -181,13 +181,13 @@ layout( rect(l8 (-950 860) (208 950)) rect(l8 (0 -950) (217 950)) ) - net(4 + net(4 name($4) rect(l8 (1208 1660) (192 950)) rect(l8 (-192 -950) (217 950)) rect(l6 (-425 -950) (208 950)) rect(l6 (-233 -950) (233 950)) ) - net(5 + net(5 name($5) rect(l4 (-100 4500) (2600 3500)) ) net(6 name(B) @@ -313,7 +313,7 @@ layout( rect(l8 (-650 860) (208 950)) rect(l8 (0 -950) (217 950)) ) - net(4 + net(4 name($4) rect(l4 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -371,34 +371,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l13 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l13 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l13 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l13 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l13 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l13 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l13 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l13 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l13 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l13 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_dummy_device.lvsdb.1 b/testdata/lvs/ringo_simple_dummy_device.lvsdb.1 index 10f93fc33..34f8ebd41 100644 --- a/testdata/lvs/ringo_simple_dummy_device.lvsdb.1 +++ b/testdata/lvs/ringo_simple_dummy_device.lvsdb.1 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) diff --git a/testdata/lvs/ringo_simple_dummy_device.lvsdb.2 b/testdata/lvs/ringo_simple_dummy_device.lvsdb.2 index 4abffb39a..dbecf1b84 100644 --- a/testdata/lvs/ringo_simple_dummy_device.lvsdb.2 +++ b/testdata/lvs/ringo_simple_dummy_device.lvsdb.2 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) diff --git a/testdata/lvs/ringo_simple_implicit_connections.lvsdb.1 b/testdata/lvs/ringo_simple_implicit_connections.lvsdb.1 index 74a756054..cd3ac06ea 100644 --- a/testdata/lvs/ringo_simple_implicit_connections.lvsdb.1 +++ b/testdata/lvs/ringo_simple_implicit_connections.lvsdb.1 @@ -178,7 +178,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -306,7 +306,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -364,34 +364,34 @@ layout( rect((0 350) (28300 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (1160 300)) ) - net(2 + net(2 name($2) rect(l11 (6050 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7850 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9650 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (11450 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (13250 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (15050 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16850 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18650 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (20450 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_implicit_connections.lvsdb.2 b/testdata/lvs/ringo_simple_implicit_connections.lvsdb.2 index 0657be4d3..dcfb4d716 100644 --- a/testdata/lvs/ringo_simple_implicit_connections.lvsdb.2 +++ b/testdata/lvs/ringo_simple_implicit_connections.lvsdb.2 @@ -178,7 +178,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -306,7 +306,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -364,34 +364,34 @@ layout( rect((0 350) (28300 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (1160 300)) ) - net(2 + net(2 name($2) rect(l11 (6050 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7850 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9650 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (11450 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (13250 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (15050 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16850 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18650 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (20450 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_io.lvsdb.1 b/testdata/lvs/ringo_simple_io.lvsdb.1 index 9b2db59ba..584f02e4e 100644 --- a/testdata/lvs/ringo_simple_io.lvsdb.1 +++ b/testdata/lvs/ringo_simple_io.lvsdb.1 @@ -152,7 +152,7 @@ J( R(l11 (-1150 -400) (0 0)) R(l6 (-950 860) (425 950)) ) - N(4 + N(4 I($4) R(l3 (-100 4500) (2600 3500)) ) N(5 I(B) @@ -271,7 +271,7 @@ J( R(l11 (-850 -400) (0 0)) R(l6 (-650 860) (425 950)) ) - N(4 + N(4 I($4) R(l3 (-100 4500) (2000 3500)) ) N(5 I(IN) @@ -320,34 +320,34 @@ J( ) X(RINGO R((0 350) (25800 7650)) - N(1 + N(1 I($1) R(l11 (4040 2950) (610 300)) ) - N(2 + N(2 I($2) R(l11 (5550 2950) (900 300)) ) - N(3 + N(3 I($3) R(l11 (7350 2950) (900 300)) ) - N(4 + N(4 I($4) R(l11 (9150 2950) (900 300)) ) - N(5 + N(5 I($5) R(l11 (10950 2950) (900 300)) ) - N(6 + N(6 I($6) R(l11 (12750 2950) (900 300)) ) - N(7 + N(7 I($7) R(l11 (14550 2950) (900 300)) ) - N(8 + N(8 I($8) R(l11 (16350 2950) (900 300)) ) - N(9 + N(9 I($9) R(l11 (18150 2950) (900 300)) ) - N(10 + N(10 I($10) R(l11 (19950 2950) (900 300)) ) N(11 I(FB) diff --git a/testdata/lvs/ringo_simple_io.lvsdb.2 b/testdata/lvs/ringo_simple_io.lvsdb.2 index 3dd69d78c..d4ce3d5dc 100644 --- a/testdata/lvs/ringo_simple_io.lvsdb.2 +++ b/testdata/lvs/ringo_simple_io.lvsdb.2 @@ -152,7 +152,7 @@ J( R(l11 (-1150 -400) (0 0)) R(l6 (-950 860) (425 950)) ) - N(4 + N(4 I($4) R(l3 (-100 4500) (2600 3500)) ) N(5 I(B) @@ -271,7 +271,7 @@ J( R(l11 (-850 -400) (0 0)) R(l6 (-650 860) (425 950)) ) - N(4 + N(4 I($4) R(l3 (-100 4500) (2000 3500)) ) N(5 I(IN) @@ -320,34 +320,34 @@ J( ) X(RINGO R((0 350) (25800 7650)) - N(1 + N(1 I($1) R(l11 (4040 2950) (610 300)) ) - N(2 + N(2 I($2) R(l11 (5550 2950) (900 300)) ) - N(3 + N(3 I($3) R(l11 (7350 2950) (900 300)) ) - N(4 + N(4 I($4) R(l11 (9150 2950) (900 300)) ) - N(5 + N(5 I($5) R(l11 (10950 2950) (900 300)) ) - N(6 + N(6 I($6) R(l11 (12750 2950) (900 300)) ) - N(7 + N(7 I($7) R(l11 (14550 2950) (900 300)) ) - N(8 + N(8 I($8) R(l11 (16350 2950) (900 300)) ) - N(9 + N(9 I($9) R(l11 (18150 2950) (900 300)) ) - N(10 + N(10 I($10) R(l11 (19950 2950) (900 300)) ) N(11 I(FB) diff --git a/testdata/lvs/ringo_simple_io2.l2n.1 b/testdata/lvs/ringo_simple_io2.l2n.1 index ef8092802..d766d4aec 100644 --- a/testdata/lvs/ringo_simple_io2.l2n.1 +++ b/testdata/lvs/ringo_simple_io2.l2n.1 @@ -151,7 +151,7 @@ X(ND2X1 R(l11 (-1150 -400) (0 0)) R(l6 (-950 860) (425 950)) ) - N(4 + N(4 I($4) R(l3 (-100 4500) (2600 3500)) ) N(5 I(B) @@ -270,7 +270,7 @@ X(INVX1 R(l11 (-850 -400) (0 0)) R(l6 (-650 860) (425 950)) ) - N(4 + N(4 I($4) R(l3 (-100 4500) (2000 3500)) ) N(5 I(IN) @@ -319,34 +319,34 @@ X(INVX1 ) X(RINGO R((0 350) (25800 7650)) - N(1 + N(1 I($1) R(l11 (4040 2950) (610 300)) ) - N(2 + N(2 I($2) R(l11 (5550 2950) (900 300)) ) - N(3 + N(3 I($3) R(l11 (7350 2950) (900 300)) ) - N(4 + N(4 I($4) R(l11 (9150 2950) (900 300)) ) - N(5 + N(5 I($5) R(l11 (10950 2950) (900 300)) ) - N(6 + N(6 I($6) R(l11 (12750 2950) (900 300)) ) - N(7 + N(7 I($7) R(l11 (14550 2950) (900 300)) ) - N(8 + N(8 I($8) R(l11 (16350 2950) (900 300)) ) - N(9 + N(9 I($9) R(l11 (18150 2950) (900 300)) ) - N(10 + N(10 I($10) R(l11 (19950 2950) (900 300)) ) N(11 I(FB) diff --git a/testdata/lvs/ringo_simple_io2.l2n.2 b/testdata/lvs/ringo_simple_io2.l2n.2 index 871a19bb3..3fe66dec6 100644 --- a/testdata/lvs/ringo_simple_io2.l2n.2 +++ b/testdata/lvs/ringo_simple_io2.l2n.2 @@ -151,7 +151,7 @@ X(ND2X1 R(l11 (-1150 -400) (0 0)) R(l6 (-950 860) (425 950)) ) - N(4 + N(4 I($4) R(l3 (-100 4500) (2600 3500)) ) N(5 I(B) @@ -270,7 +270,7 @@ X(INVX1 R(l11 (-850 -400) (0 0)) R(l6 (-650 860) (425 950)) ) - N(4 + N(4 I($4) R(l3 (-100 4500) (2000 3500)) ) N(5 I(IN) @@ -319,34 +319,34 @@ X(INVX1 ) X(RINGO R((0 350) (25800 7650)) - N(1 + N(1 I($1) R(l11 (4040 2950) (610 300)) ) - N(2 + N(2 I($2) R(l11 (5550 2950) (900 300)) ) - N(3 + N(3 I($3) R(l11 (7350 2950) (900 300)) ) - N(4 + N(4 I($4) R(l11 (9150 2950) (900 300)) ) - N(5 + N(5 I($5) R(l11 (10950 2950) (900 300)) ) - N(6 + N(6 I($6) R(l11 (12750 2950) (900 300)) ) - N(7 + N(7 I($7) R(l11 (14550 2950) (900 300)) ) - N(8 + N(8 I($8) R(l11 (16350 2950) (900 300)) ) - N(9 + N(9 I($9) R(l11 (18150 2950) (900 300)) ) - N(10 + N(10 I($10) R(l11 (19950 2950) (900 300)) ) N(11 I(FB) diff --git a/testdata/lvs/ringo_simple_io2.lvsdb.1 b/testdata/lvs/ringo_simple_io2.lvsdb.1 index 30cbf6980..c7c49dbe7 100644 --- a/testdata/lvs/ringo_simple_io2.lvsdb.1 +++ b/testdata/lvs/ringo_simple_io2.lvsdb.1 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_io2.lvsdb.2 b/testdata/lvs/ringo_simple_io2.lvsdb.2 index 94c1f9904..ef872de19 100644 --- a/testdata/lvs/ringo_simple_io2.lvsdb.2 +++ b/testdata/lvs/ringo_simple_io2.lvsdb.2 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) 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 835c6f61c..82d084acd 100644 --- a/testdata/lvs/ringo_simple_net_and_circuit_equivalence.lvsdb.1 +++ b/testdata/lvs/ringo_simple_net_and_circuit_equivalence.lvsdb.1 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) 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 6e73c3fdf..2f1d004f9 100644 --- a/testdata/lvs/ringo_simple_net_and_circuit_equivalence.lvsdb.2 +++ b/testdata/lvs/ringo_simple_net_and_circuit_equivalence.lvsdb.2 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_pin_swapping.lvsdb.1 b/testdata/lvs/ringo_simple_pin_swapping.lvsdb.1 index 9a08296ca..540484692 100644 --- a/testdata/lvs/ringo_simple_pin_swapping.lvsdb.1 +++ b/testdata/lvs/ringo_simple_pin_swapping.lvsdb.1 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_pin_swapping.lvsdb.2 b/testdata/lvs/ringo_simple_pin_swapping.lvsdb.2 index dbeab1f69..99f73ad33 100644 --- a/testdata/lvs/ringo_simple_pin_swapping.lvsdb.2 +++ b/testdata/lvs/ringo_simple_pin_swapping.lvsdb.2 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_same_device_classes.lvsdb.1 b/testdata/lvs/ringo_simple_same_device_classes.lvsdb.1 index 95ce47712..0b35a65e1 100644 --- a/testdata/lvs/ringo_simple_same_device_classes.lvsdb.1 +++ b/testdata/lvs/ringo_simple_same_device_classes.lvsdb.1 @@ -177,7 +177,7 @@ layout( rect(l17 (-1150 -400) (0 0)) rect(l9 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -305,7 +305,7 @@ layout( rect(l17 (-850 -400) (0 0)) rect(l9 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -363,34 +363,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l17 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l17 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l17 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l17 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l17 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l17 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l17 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l17 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l17 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l17 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_same_device_classes.lvsdb.2 b/testdata/lvs/ringo_simple_same_device_classes.lvsdb.2 index 08ae6e339..01a5f5ee4 100644 --- a/testdata/lvs/ringo_simple_same_device_classes.lvsdb.2 +++ b/testdata/lvs/ringo_simple_same_device_classes.lvsdb.2 @@ -177,7 +177,7 @@ layout( rect(l17 (-1150 -400) (0 0)) rect(l9 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -305,7 +305,7 @@ layout( rect(l17 (-850 -400) (0 0)) rect(l9 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -363,34 +363,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l17 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l17 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l17 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l17 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l17 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l17 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l17 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l17 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l17 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l17 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_simplification.lvsdb.1 b/testdata/lvs/ringo_simple_simplification.lvsdb.1 index fc1c945d2..673eeb9e6 100644 --- a/testdata/lvs/ringo_simple_simplification.lvsdb.1 +++ b/testdata/lvs/ringo_simple_simplification.lvsdb.1 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -417,7 +417,7 @@ layout( rect(l6 (-650 860) (425 950)) rect(l6 (950 -950) (425 950)) ) - net(5 + net(5 name($5) rect(l3 (-100 4500) (2600 3500)) ) net(6 name(SUBSTRATE)) @@ -483,16 +483,16 @@ layout( rect((600 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (18150 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (19950 2950) (900 300)) ) net(5 name(FB) diff --git a/testdata/lvs/ringo_simple_simplification.lvsdb.2 b/testdata/lvs/ringo_simple_simplification.lvsdb.2 index 494dbfa62..86f2734bf 100644 --- a/testdata/lvs/ringo_simple_simplification.lvsdb.2 +++ b/testdata/lvs/ringo_simple_simplification.lvsdb.2 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -417,7 +417,7 @@ layout( rect(l6 (725 860) (425 950)) rect(l6 (-1800 -950) (425 950)) ) - net(5 + net(5 name($5) rect(l3 (-100 4500) (2600 3500)) ) net(6 name(SUBSTRATE)) @@ -483,16 +483,16 @@ layout( rect((600 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (18150 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (19950 2950) (900 300)) ) net(5 name(FB) diff --git a/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.1 b/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.1 index 2d9fdbac8..e92e8e9a5 100644 --- a/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.1 +++ b/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.1 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -417,7 +417,7 @@ layout( rect(l6 (-650 860) (425 950)) rect(l6 (950 -950) (425 950)) ) - net(5 + net(5 name($5) rect(l3 (-100 4500) (2600 3500)) ) net(6 name(SUBSTRATE)) @@ -483,16 +483,16 @@ layout( rect((600 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (18150 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (19950 2950) (900 300)) ) net(5 name(FB) diff --git a/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.2 b/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.2 index e374d9100..a0eab7f51 100644 --- a/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.2 +++ b/testdata/lvs/ringo_simple_simplification_with_align.lvsdb.2 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -417,7 +417,7 @@ layout( rect(l6 (725 860) (425 950)) rect(l6 (-1800 -950) (425 950)) ) - net(5 + net(5 name($5) rect(l3 (-100 4500) (2600 3500)) ) net(6 name(SUBSTRATE)) @@ -483,16 +483,16 @@ layout( rect((600 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (18150 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (19950 2950) (900 300)) ) net(5 name(FB) diff --git a/testdata/lvs/ringo_simple_with_tol.lvsdb.1 b/testdata/lvs/ringo_simple_with_tol.lvsdb.1 index 98d8bdee9..ce2a291d8 100644 --- a/testdata/lvs/ringo_simple_with_tol.lvsdb.1 +++ b/testdata/lvs/ringo_simple_with_tol.lvsdb.1 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_with_tol.lvsdb.2 b/testdata/lvs/ringo_simple_with_tol.lvsdb.2 index 1ea753c38..03805ce69 100644 --- a/testdata/lvs/ringo_simple_with_tol.lvsdb.2 +++ b/testdata/lvs/ringo_simple_with_tol.lvsdb.2 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_with_tol_early.lvsdb.1 b/testdata/lvs/ringo_simple_with_tol_early.lvsdb.1 index 98d8bdee9..ce2a291d8 100644 --- a/testdata/lvs/ringo_simple_with_tol_early.lvsdb.1 +++ b/testdata/lvs/ringo_simple_with_tol_early.lvsdb.1 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/ringo_simple_with_tol_early.lvsdb.2 b/testdata/lvs/ringo_simple_with_tol_early.lvsdb.2 index 1ea753c38..03805ce69 100644 --- a/testdata/lvs/ringo_simple_with_tol_early.lvsdb.2 +++ b/testdata/lvs/ringo_simple_with_tol_early.lvsdb.2 @@ -175,7 +175,7 @@ layout( rect(l11 (-1150 -400) (0 0)) rect(l6 (-950 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2600 3500)) ) net(5 name(B) @@ -303,7 +303,7 @@ layout( rect(l11 (-850 -400) (0 0)) rect(l6 (-650 860) (425 950)) ) - net(4 + net(4 name($4) rect(l3 (-100 4500) (2000 3500)) ) net(5 name(IN) @@ -361,34 +361,34 @@ layout( rect((0 350) (25800 7650)) # Nets with their geometries - net(1 + net(1 name($1) rect(l11 (4040 2950) (610 300)) ) - net(2 + net(2 name($2) rect(l11 (5550 2950) (900 300)) ) - net(3 + net(3 name($3) rect(l11 (7350 2950) (900 300)) ) - net(4 + net(4 name($4) rect(l11 (9150 2950) (900 300)) ) - net(5 + net(5 name($5) rect(l11 (10950 2950) (900 300)) ) - net(6 + net(6 name($6) rect(l11 (12750 2950) (900 300)) ) - net(7 + net(7 name($7) rect(l11 (14550 2950) (900 300)) ) - net(8 + net(8 name($8) rect(l11 (16350 2950) (900 300)) ) - net(9 + net(9 name($9) rect(l11 (18150 2950) (900 300)) ) - net(10 + net(10 name($10) rect(l11 (19950 2950) (900 300)) ) net(11 name(FB) diff --git a/testdata/lvs/soft_connect1.l2n b/testdata/lvs/soft_connect1.l2n index 2e2c95ba8..364e0248a 100644 --- a/testdata/lvs/soft_connect1.l2n +++ b/testdata/lvs/soft_connect1.l2n @@ -75,7 +75,7 @@ D(D$NMOS NMOS ) X(INV R((-1500 -800) (3000 4600)) - N(1 + N(1 I($1) R(l8 (290 -310) (220 220)) R(l8 (-220 180) (220 220)) R(l12 (-290 -690) (360 760)) @@ -84,7 +84,7 @@ X(INV R(l14 (-2025 -775) (3000 900)) R(l6 (-1375 -925) (775 950)) ) - N(2 + N(2 I($2) R(l8 (290 2490) (220 220)) R(l8 (-220 180) (220 220)) R(l12 (-290 -690) (360 760)) @@ -93,15 +93,15 @@ X(INV R(l14 (-2025 -775) (3000 900)) R(l2 (-1375 -925) (775 950)) ) - N(3 + N(3 I($3) R(l3 (-1500 1800) (3000 2000)) ) - N(4 + N(4 I($4) R(l4 (-125 -250) (250 2500)) R(l4 (-250 -3050) (250 1600)) R(l4 (-250 1200) (250 1600)) ) - N(5 + N(5 I($5) R(l8 (-510 -310) (220 220)) R(l8 (-220 180) (220 220)) R(l8 (-220 2180) (220 220)) @@ -148,7 +148,7 @@ X(INV ) X(TOP R((600 800) (8880 4600)) - N(1 + N(1 I($1) R(l4 (2920 2600) (2880 400)) R(l11 (-300 -300) (200 200)) R(l12 (-300 -300) (690 400)) diff --git a/testdata/lvs/soft_connect1a.l2n b/testdata/lvs/soft_connect1a.l2n index c65a7d112..9e486321c 100644 --- a/testdata/lvs/soft_connect1a.l2n +++ b/testdata/lvs/soft_connect1a.l2n @@ -76,7 +76,7 @@ D(D$NMOS NMOS ) X(INV R((-1500 -800) (3000 4600)) - N(1 + N(1 I($1) R(l8 (290 -310) (220 220)) R(l8 (-220 180) (220 220)) R(l12 (-290 -690) (360 760)) @@ -85,7 +85,7 @@ X(INV R(l14 (-2025 -775) (3000 900)) R(l6 (-1375 -925) (775 950)) ) - N(2 + N(2 I($2) R(l8 (290 2490) (220 220)) R(l8 (-220 180) (220 220)) R(l12 (-290 -690) (360 760)) @@ -94,15 +94,15 @@ X(INV R(l14 (-2025 -775) (3000 900)) R(l2 (-1375 -925) (775 950)) ) - N(3 + N(3 I($3) R(l3 (-1500 1800) (3000 2000)) ) - N(4 + N(4 I($4) R(l4 (-125 -250) (250 2500)) R(l4 (-250 -3050) (250 1600)) R(l4 (-250 1200) (250 1600)) ) - N(5 + N(5 I($5) R(l8 (-510 -310) (220 220)) R(l8 (-220 180) (220 220)) R(l8 (-220 2180) (220 220)) @@ -149,7 +149,7 @@ X(INV ) X(TOP R((600 800) (8880 4600)) - N(1 + N(1 I($1) R(l4 (2920 2600) (2880 400)) R(l11 (-300 -300) (200 200)) R(l12 (-300 -300) (690 400)) diff --git a/testdata/lvs/soft_connect2.l2n b/testdata/lvs/soft_connect2.l2n index d75ed206d..2e8d13389 100644 --- a/testdata/lvs/soft_connect2.l2n +++ b/testdata/lvs/soft_connect2.l2n @@ -69,7 +69,7 @@ D(D$NMOS NMOS ) X(INV R((-1500 -800) (3000 4600)) - N(1 + N(1 I($1) R(l8 (290 -310) (220 220)) R(l8 (-220 180) (220 220)) R(l12 (-290 -690) (360 760)) @@ -78,7 +78,7 @@ X(INV R(l14 (-2025 -775) (3000 900)) R(l6 (-1375 -925) (775 950)) ) - N(2 + N(2 I($2) R(l8 (290 2490) (220 220)) R(l8 (-220 180) (220 220)) R(l12 (-290 -690) (360 760)) @@ -87,15 +87,15 @@ X(INV R(l14 (-2025 -775) (3000 900)) R(l2 (-1375 -925) (775 950)) ) - N(3 + N(3 I($3) R(l3 (-1500 1800) (3000 2000)) ) - N(4 + N(4 I($4) R(l4 (-125 -250) (250 2500)) R(l4 (-250 -3050) (250 1600)) R(l4 (-250 1200) (250 1600)) ) - N(5 + N(5 I($5) R(l8 (-510 -310) (220 220)) R(l8 (-220 180) (220 220)) R(l8 (-220 2180) (220 220)) @@ -142,7 +142,7 @@ X(INV ) X(TOP R((600 800) (8880 4600)) - N(1 + N(1 I($1) R(l4 (2920 2600) (2880 400)) R(l11 (-300 -300) (200 200)) R(l12 (-300 -300) (690 400)) diff --git a/testdata/lvs/soft_connect3.l2n b/testdata/lvs/soft_connect3.l2n index ff7a71bcc..fa0b6f009 100644 --- a/testdata/lvs/soft_connect3.l2n +++ b/testdata/lvs/soft_connect3.l2n @@ -75,7 +75,7 @@ D(D$NMOS NMOS ) X(NTRANS R((-1000 -800) (2000 1600)) - N(1 + N(1 I($1) R(l8 (-510 -310) (220 220)) R(l8 (-220 180) (220 220)) R(l12 (-290 -690) (360 760)) @@ -111,7 +111,7 @@ X(NTRANS ) X(PTRANS R((-1000 -800) (2000 1600)) - N(1 + N(1 I($1) R(l8 (-510 -310) (220 220)) R(l8 (-220 180) (220 220)) R(l12 (-290 -690) (360 760)) @@ -126,7 +126,7 @@ X(PTRANS N(3 I($5) R(l4 (-125 -800) (250 1600)) ) - N(4) + N(4 I($I3)) P(1) P(2) P(3) @@ -147,23 +147,23 @@ X(PTRANS ) X(INV R((-1500 -800) (3000 4600)) - N(1 + N(1 I($1) R(l13 (275 -325) (250 250)) R(l13 (-250 150) (250 250)) R(l14 (-2025 -775) (3000 900)) ) - N(2 + N(2 I($2) R(l13 (275 2475) (250 250)) R(l13 (-250 150) (250 250)) R(l14 (-2025 -775) (3000 900)) ) - N(3 + N(3 I($3) R(l3 (-1500 1800) (3000 2000)) ) - N(4 + N(4 I($4) R(l4 (-125 -250) (250 2500)) ) - N(5 + N(5 I($5) R(l12 (-580 -420) (360 2840)) ) N(6 I(SUBSTRATE)) @@ -188,7 +188,7 @@ X(INV ) X(TOP R((600 800) (8880 4600)) - N(1 + N(1 I($1) R(l4 (2920 2600) (2880 400)) R(l11 (-300 -300) (200 200)) R(l12 (-300 -300) (690 400)) diff --git a/testdata/lvs/soft_connect4.l2n b/testdata/lvs/soft_connect4.l2n index 5cc59c0c3..2e123173b 100644 --- a/testdata/lvs/soft_connect4.l2n +++ b/testdata/lvs/soft_connect4.l2n @@ -90,7 +90,7 @@ X(INV R(l14 (-200 -900) (1000 900)) R(l6 (-2175 -925) (775 950)) ) - N(2 + N(2 I($2) R(l3 (-1500 1800) (3000 2000)) R(l3 (-200 -2000) (1000 2000)) R(l8 (-2010 -1310) (220 220)) @@ -157,7 +157,7 @@ X(INV ) X(TOP R((1500 800) (9080 4600)) - N(1 + N(1 I($1) R(l4 (2920 2600) (3980 400)) R(l11 (-300 -300) (200 200)) R(l12 (-300 -300) (690 400)) diff --git a/testdata/lvs/soft_connect5.l2n b/testdata/lvs/soft_connect5.l2n index bbe544f80..4a5d4bd14 100644 --- a/testdata/lvs/soft_connect5.l2n +++ b/testdata/lvs/soft_connect5.l2n @@ -90,7 +90,7 @@ X(INV R(l14 (-200 -900) (1000 900)) R(l6 (-2175 -925) (775 950)) ) - N(2 + N(2 I($2) R(l3 (-1500 1800) (3000 2000)) R(l3 (-200 -2000) (1000 2000)) R(l8 (-2010 -1310) (220 220)) @@ -157,7 +157,7 @@ X(INV ) X(TOP R((1500 800) (9080 4600)) - N(1 + N(1 I($1) R(l4 (2920 2600) (3980 400)) R(l11 (-300 -300) (200 200)) R(l12 (-300 -300) (690 400)) diff --git a/testdata/lvs/soft_connect6.l2n b/testdata/lvs/soft_connect6.l2n index 0d3e3a9ad..157ffc74c 100644 --- a/testdata/lvs/soft_connect6.l2n +++ b/testdata/lvs/soft_connect6.l2n @@ -75,7 +75,7 @@ D(D$NMOS NMOS ) X(INV R((-1500 -800) (3800 4600)) - N(1 + N(1 I($1) R(l8 (-1090 2490) (220 220)) R(l8 (-220 180) (220 220)) R(l8 (360 -3420) (220 220)) @@ -160,7 +160,7 @@ X(INV ) X(TOP R((1500 800) (9080 4600)) - N(1 + N(1 I($1) R(l4 (2920 2600) (3980 400)) R(l11 (-300 -300) (200 200)) R(l12 (-260 -300) (360 1600)) diff --git a/testdata/lvs/stray_texts1.l2n b/testdata/lvs/stray_texts1.l2n index 312542798..526057696 100644 --- a/testdata/lvs/stray_texts1.l2n +++ b/testdata/lvs/stray_texts1.l2n @@ -49,10 +49,10 @@ X(MIDDLE N(2 I(F) J(l1 F (3000 510)) ) - N(3) - N(4) - N(5) - N(6) + N(3 I($I4)) + N(4 I($I3)) + N(5 I($I2)) + N(6 I($I1)) P(1 I(B)) P(3) P(4) @@ -69,12 +69,12 @@ X(MIDDLE ) X(TOP R((-1280 -190) (4350 840)) - N(1 + N(1 I($1) R(l3 (-680 -160) (170 760)) R(l3 (-170 -790) (860 270)) R(l3 (-200 -270) (220 780)) ) - N(2 + N(2 I($2) R(l3 (530 -180) (220 790)) R(l3 (-220 -790) (790 180)) R(l3 (-260 -180) (260 810)) @@ -82,10 +82,10 @@ X(TOP N(3 I(E) J(l1 E (2400 460)) ) - N(4 + N(4 I($4) R(l3 (-1280 -150) (210 750)) ) - N(5 + N(5 I($5) R(l3 (1660 -190) (240 840)) ) X(1 MIDDLE Y(-30 -40) diff --git a/testdata/lvs/stray_texts2.l2n b/testdata/lvs/stray_texts2.l2n index 92dd849ea..77a1bb3b4 100644 --- a/testdata/lvs/stray_texts2.l2n +++ b/testdata/lvs/stray_texts2.l2n @@ -47,10 +47,10 @@ X(MIDDLE N(2 I(F) R(l1 (3000 510) (0 0)) ) - N(3) - N(4) - N(5) - N(6) + N(3 I($I4)) + N(4 I($I3)) + N(5 I($I2)) + N(6 I($I1)) P(1 I(B)) P(3) P(4) @@ -67,12 +67,12 @@ X(MIDDLE ) X(TOP R((-1280 -190) (4350 840)) - N(1 + N(1 I($1) R(l2 (-680 -160) (170 760)) R(l2 (-170 -790) (860 270)) R(l2 (-200 -270) (220 780)) ) - N(2 + N(2 I($2) R(l2 (530 -180) (220 790)) R(l2 (-220 -790) (790 180)) R(l2 (-260 -180) (260 810)) @@ -80,10 +80,10 @@ X(TOP N(3 I(E) R(l1 (2400 460) (0 0)) ) - N(4 + N(4 I($4) R(l2 (-1280 -150) (210 750)) ) - N(5 + N(5 I($5) R(l2 (1660 -190) (240 840)) ) X(1 MIDDLE Y(-30 -40) diff --git a/testdata/lvs/test_22a.lvsdb.1 b/testdata/lvs/test_22a.lvsdb.1 index 6f083ffa0..6ae452175 100644 --- a/testdata/lvs/test_22a.lvsdb.1 +++ b/testdata/lvs/test_22a.lvsdb.1 @@ -655,12 +655,12 @@ layout( rect(l23 (-110 -170) (170 170)) rect(l23 (-170 -170) (170 170)) ) - net(10 + net(10 name($10) rect(l7 (290 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(11 + net(11 name($11) polygon(l2 (1365 1725) (0 760) (420 0) (0 -340) (105 0) (0 -420)) rect(l2 (-445 -1330) (445 420)) polygon(l9 (-405 -370) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -671,7 +671,7 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(12 + net(12 name($12) rect(l2 (290 395) (445 420)) polygon(l2 (-445 910) (0 420) (105 0) (0 340) (420 0) (0 -760)) polygon(l9 (-290 -1280) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -682,17 +682,17 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(13 + net(13 name($13) rect(l7 (940 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(14 + net(14 name($14) rect(l7 (2470 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(15 + net(15 name($15) polygon(l2 (3545 1725) (0 760) (420 0) (0 -340) (105 0) (0 -420)) rect(l2 (-445 -1330) (445 420)) polygon(l9 (-405 -370) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -703,7 +703,7 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(16 + net(16 name($16) rect(l2 (2470 395) (445 420)) polygon(l2 (-445 910) (0 420) (105 0) (0 340) (420 0) (0 -760)) polygon(l9 (-290 -1280) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -714,17 +714,17 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(17 + net(17 name($17) rect(l7 (3120 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(18 + net(18 name($18) rect(l7 (4650 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(19 + net(19 name($19) polygon(l2 (5725 1725) (0 760) (420 0) (0 -340) (105 0) (0 -420)) rect(l2 (-445 -1330) (445 420)) polygon(l9 (-405 -370) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -735,7 +735,7 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(20 + net(20 name($20) polygon(l2 (4650 1725) (0 420) (105 0) (0 340) (420 0) (0 -760)) rect(l2 (-525 -1330) (445 420)) polygon(l9 (-210 -370) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -746,17 +746,17 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(21 + net(21 name($21) rect(l7 (5300 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(22 + net(22 name($22) rect(l7 (6830 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(23 + net(23 name($23) rect(l2 (7985 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -767,7 +767,7 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(24 + net(24 name($24) rect(l2 (6830 395) (445 420)) polygon(l2 (-445 910) (0 420) (105 0) (0 340) (420 0) (0 -760)) polygon(l9 (-290 -1280) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -778,7 +778,7 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(25 + net(25 name($25) rect(l7 (7480 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) diff --git a/testdata/lvs/test_22a.lvsdb.2 b/testdata/lvs/test_22a.lvsdb.2 index b6914388f..643fa0a8a 100644 --- a/testdata/lvs/test_22a.lvsdb.2 +++ b/testdata/lvs/test_22a.lvsdb.2 @@ -655,7 +655,7 @@ layout( rect(l23 (-110 -170) (170 170)) rect(l23 (-170 -170) (170 170)) ) - net(10 + net(10 name($10) rect(l2 (1445 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -666,12 +666,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(11 + net(11 name($11) rect(l7 (290 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(12 + net(12 name($12) rect(l2 (290 395) (445 420)) polygon(l2 (-445 910) (0 420) (105 0) (0 340) (420 0) (0 -760)) polygon(l9 (-290 -1280) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -682,17 +682,17 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(13 + net(13 name($13) rect(l7 (940 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(14 + net(14 name($14) rect(l7 (2470 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(15 + net(15 name($15) polygon(l2 (3545 1725) (0 760) (420 0) (0 -340) (105 0) (0 -420)) rect(l2 (-445 -1330) (445 420)) polygon(l9 (-405 -370) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -703,7 +703,7 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(16 + net(16 name($16) polygon(l2 (2470 1725) (0 420) (105 0) (0 340) (420 0) (0 -760)) rect(l2 (-525 -1330) (445 420)) polygon(l9 (-210 -370) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -714,12 +714,12 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(17 + net(17 name($17) rect(l7 (3120 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(18 + net(18 name($18) rect(l2 (5805 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -730,12 +730,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(19 + net(19 name($19) rect(l7 (4650 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(20 + net(20 name($20) rect(l2 (4650 395) (445 420)) polygon(l2 (-445 910) (0 420) (105 0) (0 340) (420 0) (0 -760)) polygon(l9 (-290 -1280) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -746,12 +746,12 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(21 + net(21 name($21) rect(l7 (5300 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(22 + net(22 name($22) rect(l2 (7985 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -762,12 +762,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(23 + net(23 name($23) rect(l7 (6830 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(24 + net(24 name($24) polygon(l2 (6830 1725) (0 420) (105 0) (0 340) (420 0) (0 -760)) rect(l2 (-525 -1330) (445 420)) polygon(l9 (-210 -370) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -778,7 +778,7 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(25 + net(25 name($25) rect(l7 (7480 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) diff --git a/testdata/lvs/test_22a.lvsdb.3 b/testdata/lvs/test_22a.lvsdb.3 index 87bbe1b42..efcbfe0ec 100644 --- a/testdata/lvs/test_22a.lvsdb.3 +++ b/testdata/lvs/test_22a.lvsdb.3 @@ -655,7 +655,7 @@ layout( rect(l23 (-110 -170) (170 170)) rect(l23 (-170 -170) (170 170)) ) - net(10 + net(10 name($10) rect(l2 (1445 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -666,12 +666,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(11 + net(11 name($11) rect(l7 (290 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(12 + net(12 name($12) polygon(l2 (290 1725) (0 420) (105 0) (0 340) (420 0) (0 -760)) rect(l2 (-525 -1330) (445 420)) polygon(l9 (-210 -370) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -682,12 +682,12 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(13 + net(13 name($13) rect(l7 (940 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(14 + net(14 name($14) polygon(l2 (3545 1725) (0 760) (420 0) (0 -340) (105 0) (0 -420)) rect(l2 (-445 -1330) (445 420)) polygon(l9 (-405 -370) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -698,12 +698,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(15 + net(15 name($15) rect(l7 (2470 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(16 + net(16 name($16) rect(l2 (2470 395) (445 420)) polygon(l2 (-445 910) (0 420) (105 0) (0 340) (420 0) (0 -760)) polygon(l9 (-290 -1280) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -714,12 +714,12 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(17 + net(17 name($17) rect(l7 (3120 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(18 + net(18 name($18) rect(l2 (5805 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -730,12 +730,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(19 + net(19 name($19) rect(l7 (4650 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(20 + net(20 name($20) polygon(l2 (4650 1725) (0 420) (105 0) (0 340) (420 0) (0 -760)) rect(l2 (-525 -1330) (445 420)) polygon(l9 (-210 -370) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -746,12 +746,12 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(21 + net(21 name($21) rect(l7 (5300 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(22 + net(22 name($22) rect(l2 (7985 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -762,12 +762,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(23 + net(23 name($23) rect(l7 (6830 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(24 + net(24 name($24) polygon(l2 (6830 1725) (0 420) (105 0) (0 340) (420 0) (0 -760)) rect(l2 (-525 -1330) (445 420)) polygon(l9 (-210 -370) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -778,7 +778,7 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(25 + net(25 name($25) rect(l7 (7480 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) @@ -832,16 +832,16 @@ layout( rect(l24 (2030 -150) (150 150)) rect(l24 (2030 -150) (150 150)) ) - net(27 + net(27 name($27) polygon(l7 (955 2305) (0 180) (-690 0) (0 150) (1650 0) (0 -150) (-690 0) (0 -180)) ) - net(28 + net(28 name($28) polygon(l7 (7495 2305) (0 180) (-690 0) (0 150) (1650 0) (0 -150) (-690 0) (0 -180)) ) - net(29 + net(29 name($29) polygon(l7 (3135 2305) (0 180) (-690 0) (0 150) (1650 0) (0 -150) (-690 0) (0 -180)) ) - net(30 + net(30 name($30) polygon(l7 (5315 2305) (0 180) (-690 0) (0 150) (1650 0) (0 -150) (-690 0) (0 -180)) ) net(31 name('wl[1]') @@ -893,7 +893,7 @@ layout( rect(l24 (2030 -150) (150 150)) rect(l24 (2030 -150) (150 150)) ) - net(32 + net(32 name($32) polygon(l2 (395 3065) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) polygon(l9 (-210 -1620) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) @@ -904,12 +904,12 @@ layout( rect(l22 (0 -270) (950 150)) rect(l22 (0 -840) (150 2010)) ) - net(33 + net(33 name($33) rect(l7 (940 3965) (950 150)) rect(l7 (-1280 -150) (330 270)) rect(l7 (950 -960) (150 2010)) ) - net(34 + net(34 name($34) polygon(l2 (2575 3065) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) polygon(l9 (-210 -1620) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) @@ -920,12 +920,12 @@ layout( rect(l22 (0 -270) (950 150)) rect(l22 (0 -840) (150 2010)) ) - net(35 + net(35 name($35) rect(l7 (3120 3965) (950 150)) rect(l7 (-1280 -150) (330 270)) rect(l7 (950 -960) (150 2010)) ) - net(36 + net(36 name($36) polygon(l2 (4755 3065) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) polygon(l9 (-210 -1620) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) @@ -936,12 +936,12 @@ layout( rect(l22 (0 -270) (950 150)) rect(l22 (0 -840) (150 2010)) ) - net(37 + net(37 name($37) rect(l7 (5300 3965) (950 150)) rect(l7 (-1280 -150) (330 270)) rect(l7 (950 -960) (150 2010)) ) - net(38 + net(38 name($38) polygon(l2 (6935 3065) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) polygon(l9 (-210 -1620) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) @@ -952,12 +952,12 @@ layout( rect(l22 (0 -270) (950 150)) rect(l22 (0 -840) (150 2010)) ) - net(39 + net(39 name($39) rect(l7 (7480 3965) (950 150)) rect(l7 (-1280 -150) (330 270)) rect(l7 (950 -960) (150 2010)) ) - net(40 + net(40 name($40) polygon(l2 (7905 3065) (0 760) (525 0) (0 -420) (-105 0) (0 -340)) rect(l2 (-340 1670) (445 420)) polygon(l9 (-405 -1620) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) @@ -968,19 +968,19 @@ layout( rect(l22 (-1100 -1320) (150 2010)) rect(l22 (950 -960) (330 270)) ) - net(41 + net(41 name($41) polygon(l7 (265 2915) (0 150) (690 0) (0 180) (270 0) (0 -180) (690 0) (0 -150)) ) - net(42 + net(42 name($42) polygon(l7 (6805 2915) (0 150) (690 0) (0 180) (270 0) (0 -180) (690 0) (0 -150)) ) - net(43 + net(43 name($43) polygon(l7 (2445 2915) (0 150) (690 0) (0 180) (270 0) (0 -180) (690 0) (0 -150)) ) - net(44 + net(44 name($44) polygon(l7 (4625 2915) (0 150) (690 0) (0 180) (270 0) (0 -180) (690 0) (0 -150)) ) - net(45 + net(45 name($45) polygon(l2 (1365 3065) (0 760) (525 0) (0 -420) (-105 0) (0 -340)) rect(l2 (-340 1670) (445 420)) polygon(l9 (-405 -1620) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) @@ -991,17 +991,17 @@ layout( rect(l22 (-1100 -1320) (150 2010)) rect(l22 (950 -960) (330 270)) ) - net(46 + net(46 name($46) rect(l7 (290 4445) (950 150)) rect(l7 (-1100 -1320) (150 2010)) rect(l7 (950 -960) (330 270)) ) - net(47 + net(47 name($47) rect(l7 (2470 4445) (950 150)) rect(l7 (-1100 -1320) (150 2010)) rect(l7 (950 -960) (330 270)) ) - net(48 + net(48 name($48) polygon(l2 (3545 3065) (0 760) (525 0) (0 -420) (-105 0) (0 -340)) rect(l2 (-340 1670) (445 420)) polygon(l9 (-405 -1620) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) @@ -1012,7 +1012,7 @@ layout( rect(l22 (-1100 -1320) (150 2010)) rect(l22 (950 -960) (330 270)) ) - net(49 + net(49 name($49) polygon(l2 (5725 3065) (0 760) (525 0) (0 -420) (-105 0) (0 -340)) rect(l2 (-340 1670) (445 420)) polygon(l9 (-405 -1620) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) @@ -1023,12 +1023,12 @@ layout( rect(l22 (-1100 -1320) (150 2010)) rect(l22 (950 -960) (330 270)) ) - net(50 + net(50 name($50) rect(l7 (4650 4445) (950 150)) rect(l7 (-1100 -1320) (150 2010)) rect(l7 (950 -960) (330 270)) ) - net(51 + net(51 name($51) rect(l7 (6830 4445) (950 150)) rect(l7 (-1100 -1320) (150 2010)) rect(l7 (950 -960) (330 270)) diff --git a/testdata/lvs/test_22b.lvsdb.1 b/testdata/lvs/test_22b.lvsdb.1 index 45724cbcf..8901b4620 100644 --- a/testdata/lvs/test_22b.lvsdb.1 +++ b/testdata/lvs/test_22b.lvsdb.1 @@ -655,12 +655,12 @@ layout( rect(l23 (-110 -170) (170 170)) rect(l23 (-170 -170) (170 170)) ) - net(10 + net(10 name($10) rect(l7 (290 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(11 + net(11 name($11) polygon(l2 (1365 1725) (0 760) (420 0) (0 -340) (105 0) (0 -420)) rect(l2 (-445 -1330) (445 420)) polygon(l9 (-405 -370) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -671,7 +671,7 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(12 + net(12 name($12) rect(l2 (290 395) (445 420)) polygon(l2 (-445 910) (0 420) (105 0) (0 340) (420 0) (0 -760)) polygon(l9 (-290 -1280) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -682,17 +682,17 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(13 + net(13 name($13) rect(l7 (940 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(14 + net(14 name($14) rect(l7 (2470 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(15 + net(15 name($15) polygon(l2 (3545 1725) (0 760) (420 0) (0 -340) (105 0) (0 -420)) rect(l2 (-445 -1330) (445 420)) polygon(l9 (-405 -370) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -703,7 +703,7 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(16 + net(16 name($16) rect(l2 (2470 395) (445 420)) polygon(l2 (-445 910) (0 420) (105 0) (0 340) (420 0) (0 -760)) polygon(l9 (-290 -1280) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -714,17 +714,17 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(17 + net(17 name($17) rect(l7 (3120 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(18 + net(18 name($18) rect(l7 (4650 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(19 + net(19 name($19) polygon(l2 (5725 1725) (0 760) (420 0) (0 -340) (105 0) (0 -420)) rect(l2 (-445 -1330) (445 420)) polygon(l9 (-405 -370) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -735,7 +735,7 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(20 + net(20 name($20) polygon(l2 (4650 1725) (0 420) (105 0) (0 340) (420 0) (0 -760)) rect(l2 (-525 -1330) (445 420)) polygon(l9 (-210 -370) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -746,17 +746,17 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(21 + net(21 name($21) rect(l7 (5300 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(22 + net(22 name($22) rect(l7 (6830 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(23 + net(23 name($23) rect(l2 (7985 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -767,7 +767,7 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(24 + net(24 name($24) rect(l2 (6830 395) (445 420)) polygon(l2 (-445 910) (0 420) (105 0) (0 340) (420 0) (0 -760)) polygon(l9 (-290 -1280) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -778,7 +778,7 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(25 + net(25 name($25) rect(l7 (7480 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) diff --git a/testdata/lvs/test_22b.lvsdb.2 b/testdata/lvs/test_22b.lvsdb.2 index 7c718f649..330c08995 100644 --- a/testdata/lvs/test_22b.lvsdb.2 +++ b/testdata/lvs/test_22b.lvsdb.2 @@ -655,7 +655,7 @@ layout( rect(l23 (-110 -170) (170 170)) rect(l23 (-170 -170) (170 170)) ) - net(10 + net(10 name($10) rect(l2 (1445 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -666,12 +666,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(11 + net(11 name($11) rect(l7 (290 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(12 + net(12 name($12) rect(l2 (290 395) (445 420)) polygon(l2 (-445 910) (0 420) (105 0) (0 340) (420 0) (0 -760)) polygon(l9 (-290 -1280) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -682,17 +682,17 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(13 + net(13 name($13) rect(l7 (940 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(14 + net(14 name($14) rect(l7 (2470 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(15 + net(15 name($15) polygon(l2 (3545 1725) (0 760) (420 0) (0 -340) (105 0) (0 -420)) rect(l2 (-445 -1330) (445 420)) polygon(l9 (-405 -370) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -703,7 +703,7 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(16 + net(16 name($16) polygon(l2 (2470 1725) (0 420) (105 0) (0 340) (420 0) (0 -760)) rect(l2 (-525 -1330) (445 420)) polygon(l9 (-210 -370) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -714,12 +714,12 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(17 + net(17 name($17) rect(l7 (3120 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(18 + net(18 name($18) rect(l2 (5805 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -730,12 +730,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(19 + net(19 name($19) rect(l7 (4650 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(20 + net(20 name($20) rect(l2 (4650 395) (445 420)) polygon(l2 (-445 910) (0 420) (105 0) (0 340) (420 0) (0 -760)) polygon(l9 (-290 -1280) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -746,12 +746,12 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(21 + net(21 name($21) rect(l7 (5300 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(22 + net(22 name($22) rect(l2 (7985 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -762,12 +762,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(23 + net(23 name($23) rect(l7 (6830 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(24 + net(24 name($24) polygon(l2 (6830 1725) (0 420) (105 0) (0 340) (420 0) (0 -760)) rect(l2 (-525 -1330) (445 420)) polygon(l9 (-210 -370) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -778,7 +778,7 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(25 + net(25 name($25) rect(l7 (7480 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) diff --git a/testdata/lvs/test_22b.lvsdb.3 b/testdata/lvs/test_22b.lvsdb.3 index f2960ffe8..3eef3951a 100644 --- a/testdata/lvs/test_22b.lvsdb.3 +++ b/testdata/lvs/test_22b.lvsdb.3 @@ -655,7 +655,7 @@ layout( rect(l23 (-110 -170) (170 170)) rect(l23 (-170 -170) (170 170)) ) - net(10 + net(10 name($10) rect(l2 (1445 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -666,12 +666,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(11 + net(11 name($11) rect(l7 (290 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(12 + net(12 name($12) polygon(l2 (290 1725) (0 420) (105 0) (0 340) (420 0) (0 -760)) rect(l2 (-525 -1330) (445 420)) polygon(l9 (-210 -370) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -682,12 +682,12 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(13 + net(13 name($13) rect(l7 (940 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(14 + net(14 name($14) polygon(l2 (3545 1725) (0 760) (420 0) (0 -340) (105 0) (0 -420)) rect(l2 (-445 -1330) (445 420)) polygon(l9 (-405 -370) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -698,12 +698,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(15 + net(15 name($15) rect(l7 (2470 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(16 + net(16 name($16) rect(l2 (2470 395) (445 420)) polygon(l2 (-445 910) (0 420) (105 0) (0 340) (420 0) (0 -760)) polygon(l9 (-290 -1280) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -714,12 +714,12 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(17 + net(17 name($17) rect(l7 (3120 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(18 + net(18 name($18) rect(l2 (5805 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -730,12 +730,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(19 + net(19 name($19) rect(l7 (4650 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(20 + net(20 name($20) polygon(l2 (4650 1725) (0 420) (105 0) (0 340) (420 0) (0 -760)) rect(l2 (-525 -1330) (445 420)) polygon(l9 (-210 -370) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -746,12 +746,12 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(21 + net(21 name($21) rect(l7 (5300 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) ) - net(22 + net(22 name($22) rect(l2 (7985 395) (445 420)) polygon(l2 (-525 910) (0 760) (420 0) (0 -340) (105 0) (0 -420)) polygon(l9 (-405 -1280) (0 560) (-245 0) (0 170) (245 0) (0 840) (170 0) (0 -1570)) @@ -762,12 +762,12 @@ layout( rect(l22 (-1100 -840) (150 2010)) rect(l22 (950 -1320) (330 270)) ) - net(23 + net(23 name($23) rect(l7 (6830 955) (950 150)) rect(l7 (-1100 -840) (150 2010)) rect(l7 (950 -1320) (330 270)) ) - net(24 + net(24 name($24) polygon(l2 (6830 1725) (0 420) (105 0) (0 340) (420 0) (0 -760)) rect(l2 (-525 -1330) (445 420)) polygon(l9 (-210 -370) (0 1570) (170 0) (0 -480) (245 0) (0 -170) (-245 0) (0 -920)) @@ -778,7 +778,7 @@ layout( rect(l22 (0 -150) (950 150)) rect(l22 (0 -1320) (150 2010)) ) - net(25 + net(25 name($25) rect(l7 (7480 1435) (950 150)) rect(l7 (-1280 -270) (330 270)) rect(l7 (950 -1320) (150 2010)) @@ -832,16 +832,16 @@ layout( rect(l24 (2030 -150) (150 150)) rect(l24 (2030 -150) (150 150)) ) - net(27 + net(27 name($27) polygon(l7 (955 2305) (0 180) (-690 0) (0 150) (1650 0) (0 -150) (-690 0) (0 -180)) ) - net(28 + net(28 name($28) polygon(l7 (7495 2305) (0 180) (-690 0) (0 150) (1650 0) (0 -150) (-690 0) (0 -180)) ) - net(29 + net(29 name($29) polygon(l7 (3135 2305) (0 180) (-690 0) (0 150) (1650 0) (0 -150) (-690 0) (0 -180)) ) - net(30 + net(30 name($30) polygon(l7 (5315 2305) (0 180) (-690 0) (0 150) (1650 0) (0 -150) (-690 0) (0 -180)) ) net(31 name('wl[1]') @@ -893,7 +893,7 @@ layout( rect(l24 (2030 -150) (150 150)) rect(l24 (2030 -150) (150 150)) ) - net(32 + net(32 name($32) polygon(l2 (395 3065) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) polygon(l9 (-210 -1620) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) @@ -904,12 +904,12 @@ layout( rect(l22 (0 -270) (950 150)) rect(l22 (0 -840) (150 2010)) ) - net(33 + net(33 name($33) rect(l7 (940 3965) (950 150)) rect(l7 (-1280 -150) (330 270)) rect(l7 (950 -960) (150 2010)) ) - net(34 + net(34 name($34) polygon(l2 (2575 3065) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) polygon(l9 (-210 -1620) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) @@ -920,12 +920,12 @@ layout( rect(l22 (0 -270) (950 150)) rect(l22 (0 -840) (150 2010)) ) - net(35 + net(35 name($35) rect(l7 (3120 3965) (950 150)) rect(l7 (-1280 -150) (330 270)) rect(l7 (950 -960) (150 2010)) ) - net(36 + net(36 name($36) polygon(l2 (4755 3065) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) polygon(l9 (-210 -1620) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) @@ -936,12 +936,12 @@ layout( rect(l22 (0 -270) (950 150)) rect(l22 (0 -840) (150 2010)) ) - net(37 + net(37 name($37) rect(l7 (5300 3965) (950 150)) rect(l7 (-1280 -150) (330 270)) rect(l7 (950 -960) (150 2010)) ) - net(38 + net(38 name($38) polygon(l2 (6935 3065) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) polygon(l9 (-210 -1620) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) @@ -952,12 +952,12 @@ layout( rect(l22 (0 -270) (950 150)) rect(l22 (0 -840) (150 2010)) ) - net(39 + net(39 name($39) rect(l7 (7480 3965) (950 150)) rect(l7 (-1280 -150) (330 270)) rect(l7 (950 -960) (150 2010)) ) - net(40 + net(40 name($40) polygon(l2 (7905 3065) (0 760) (525 0) (0 -420) (-105 0) (0 -340)) rect(l2 (-340 1670) (445 420)) polygon(l9 (-405 -1620) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) @@ -968,19 +968,19 @@ layout( rect(l22 (-1100 -1320) (150 2010)) rect(l22 (950 -960) (330 270)) ) - net(41 + net(41 name($41) polygon(l7 (265 2915) (0 150) (690 0) (0 180) (270 0) (0 -180) (690 0) (0 -150)) ) - net(42 + net(42 name($42) polygon(l7 (6805 2915) (0 150) (690 0) (0 180) (270 0) (0 -180) (690 0) (0 -150)) ) - net(43 + net(43 name($43) polygon(l7 (2445 2915) (0 150) (690 0) (0 180) (270 0) (0 -180) (690 0) (0 -150)) ) - net(44 + net(44 name($44) polygon(l7 (4625 2915) (0 150) (690 0) (0 180) (270 0) (0 -180) (690 0) (0 -150)) ) - net(45 + net(45 name($45) polygon(l2 (1365 3065) (0 760) (525 0) (0 -420) (-105 0) (0 -340)) rect(l2 (-340 1670) (445 420)) polygon(l9 (-405 -1620) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) @@ -991,17 +991,17 @@ layout( rect(l22 (-1100 -1320) (150 2010)) rect(l22 (950 -960) (330 270)) ) - net(46 + net(46 name($46) rect(l7 (290 4445) (950 150)) rect(l7 (-1100 -1320) (150 2010)) rect(l7 (950 -960) (330 270)) ) - net(47 + net(47 name($47) rect(l7 (2470 4445) (950 150)) rect(l7 (-1100 -1320) (150 2010)) rect(l7 (950 -960) (330 270)) ) - net(48 + net(48 name($48) polygon(l2 (3545 3065) (0 760) (525 0) (0 -420) (-105 0) (0 -340)) rect(l2 (-340 1670) (445 420)) polygon(l9 (-405 -1620) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) @@ -1012,7 +1012,7 @@ layout( rect(l22 (-1100 -1320) (150 2010)) rect(l22 (950 -960) (330 270)) ) - net(49 + net(49 name($49) polygon(l2 (5725 3065) (0 760) (525 0) (0 -420) (-105 0) (0 -340)) rect(l2 (-340 1670) (445 420)) polygon(l9 (-405 -1620) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) @@ -1023,12 +1023,12 @@ layout( rect(l22 (-1100 -1320) (150 2010)) rect(l22 (950 -960) (330 270)) ) - net(50 + net(50 name($50) rect(l7 (4650 4445) (950 150)) rect(l7 (-1100 -1320) (150 2010)) rect(l7 (950 -960) (330 270)) ) - net(51 + net(51 name($51) rect(l7 (6830 4445) (950 150)) rect(l7 (-1100 -1320) (150 2010)) rect(l7 (950 -960) (330 270)) diff --git a/testdata/lvs/test_22c.lvsdb.1 b/testdata/lvs/test_22c.lvsdb.1 index 0fef41270..11a8df549 100644 --- a/testdata/lvs/test_22c.lvsdb.1 +++ b/testdata/lvs/test_22c.lvsdb.1 @@ -181,17 +181,17 @@ layout( rect((-385 -485) (2950 3565)) # Nets with their geometries - net(1 + net(1 name($1) rect(l7 (1890 500) (150 2010)) rect(l7 (-1100 -1320) (950 150)) rect(l7 (-1280 -150) (330 270)) ) - net(2 + net(2 name($2) rect(l7 (1240 1550) (330 270)) rect(l7 (-1280 -150) (950 150)) rect(l7 (-1100 -1320) (150 2010)) ) - net(3 + net(3 name($3) polygon(l9 (525 760) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) rect(l21 (-170 80) (170 170)) rect(l21 (-170 1070) (170 170)) @@ -202,7 +202,7 @@ layout( polygon(l2 (-1495 -1050) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) ) - net(4 + net(4 name($4) polygon(l9 (1485 760) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) rect(l21 (-170 80) (170 170)) rect(l21 (-170 1070) (170 170)) diff --git a/testdata/lvs/test_22c.lvsdb.2 b/testdata/lvs/test_22c.lvsdb.2 index 8438d1de6..260035625 100644 --- a/testdata/lvs/test_22c.lvsdb.2 +++ b/testdata/lvs/test_22c.lvsdb.2 @@ -181,17 +181,17 @@ layout( rect((-385 -485) (2950 3565)) # Nets with their geometries - net(1 + net(1 name($1) rect(l7 (1890 500) (150 2010)) rect(l7 (-1100 -1320) (950 150)) rect(l7 (-1280 -150) (330 270)) ) - net(2 + net(2 name($2) rect(l7 (1240 1550) (330 270)) rect(l7 (-1280 -150) (950 150)) rect(l7 (-1100 -1320) (150 2010)) ) - net(3 + net(3 name($3) polygon(l9 (525 760) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) rect(l21 (-170 80) (170 170)) rect(l21 (-170 1070) (170 170)) @@ -202,7 +202,7 @@ layout( polygon(l2 (-1495 -1050) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) ) - net(4 + net(4 name($4) polygon(l9 (1485 760) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) rect(l21 (-170 80) (170 170)) rect(l21 (-170 1070) (170 170)) diff --git a/testdata/lvs/test_22c.lvsdb.3 b/testdata/lvs/test_22c.lvsdb.3 index e966c57ac..57186d448 100644 --- a/testdata/lvs/test_22c.lvsdb.3 +++ b/testdata/lvs/test_22c.lvsdb.3 @@ -181,17 +181,17 @@ layout( rect((-385 -485) (2950 3565)) # Nets with their geometries - net(1 + net(1 name($1) rect(l7 (1890 500) (150 2010)) rect(l7 (-1100 -1320) (950 150)) rect(l7 (-1280 -150) (330 270)) ) - net(2 + net(2 name($2) rect(l7 (1240 1550) (330 270)) rect(l7 (-1280 -150) (950 150)) rect(l7 (-1100 -1320) (150 2010)) ) - net(3 + net(3 name($3) polygon(l9 (525 760) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) rect(l21 (-170 80) (170 170)) rect(l21 (-170 1070) (170 170)) @@ -202,7 +202,7 @@ layout( polygon(l2 (-1495 -1050) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) ) - net(4 + net(4 name($4) polygon(l9 (1485 760) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) rect(l21 (-170 80) (170 170)) rect(l21 (-170 1070) (170 170)) diff --git a/testdata/lvs/test_22d.lvsdb.1 b/testdata/lvs/test_22d.lvsdb.1 index 73e8005b4..26cf2b536 100644 --- a/testdata/lvs/test_22d.lvsdb.1 +++ b/testdata/lvs/test_22d.lvsdb.1 @@ -181,17 +181,17 @@ layout( rect((-385 -485) (2950 3565)) # Nets with their geometries - net(1 + net(1 name($1) rect(l7 (1890 500) (150 2010)) rect(l7 (-1100 -1320) (950 150)) rect(l7 (-1280 -150) (330 270)) ) - net(2 + net(2 name($2) rect(l7 (1240 1550) (330 270)) rect(l7 (-1280 -150) (950 150)) rect(l7 (-1100 -1320) (150 2010)) ) - net(3 + net(3 name($3) polygon(l9 (525 760) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) rect(l21 (-170 80) (170 170)) rect(l21 (-170 1070) (170 170)) @@ -202,7 +202,7 @@ layout( polygon(l2 (-1495 -1050) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) ) - net(4 + net(4 name($4) polygon(l9 (1485 760) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) rect(l21 (-170 80) (170 170)) rect(l21 (-170 1070) (170 170)) diff --git a/testdata/lvs/test_22d.lvsdb.2 b/testdata/lvs/test_22d.lvsdb.2 index 1d4e0d82a..8d1a344a3 100644 --- a/testdata/lvs/test_22d.lvsdb.2 +++ b/testdata/lvs/test_22d.lvsdb.2 @@ -181,17 +181,17 @@ layout( rect((-385 -485) (2950 3565)) # Nets with their geometries - net(1 + net(1 name($1) rect(l7 (1890 500) (150 2010)) rect(l7 (-1100 -1320) (950 150)) rect(l7 (-1280 -150) (330 270)) ) - net(2 + net(2 name($2) rect(l7 (1240 1550) (330 270)) rect(l7 (-1280 -150) (950 150)) rect(l7 (-1100 -1320) (150 2010)) ) - net(3 + net(3 name($3) polygon(l9 (525 760) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) rect(l21 (-170 80) (170 170)) rect(l21 (-170 1070) (170 170)) @@ -202,7 +202,7 @@ layout( polygon(l2 (-1495 -1050) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) ) - net(4 + net(4 name($4) polygon(l9 (1485 760) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) rect(l21 (-170 80) (170 170)) rect(l21 (-170 1070) (170 170)) diff --git a/testdata/lvs/test_22d.lvsdb.3 b/testdata/lvs/test_22d.lvsdb.3 index 10a35d95c..61b7ae957 100644 --- a/testdata/lvs/test_22d.lvsdb.3 +++ b/testdata/lvs/test_22d.lvsdb.3 @@ -181,17 +181,17 @@ layout( rect((-385 -485) (2950 3565)) # Nets with their geometries - net(1 + net(1 name($1) rect(l7 (1890 500) (150 2010)) rect(l7 (-1100 -1320) (950 150)) rect(l7 (-1280 -150) (330 270)) ) - net(2 + net(2 name($2) rect(l7 (1240 1550) (330 270)) rect(l7 (-1280 -150) (950 150)) rect(l7 (-1100 -1320) (150 2010)) ) - net(3 + net(3 name($3) polygon(l9 (525 760) (0 1570) (170 0) (0 -920) (245 0) (0 -170) (-245 0) (0 -480)) rect(l21 (-170 80) (170 170)) rect(l21 (-170 1070) (170 170)) @@ -202,7 +202,7 @@ layout( polygon(l2 (-1495 -1050) (0 340) (-105 0) (0 420) (525 0) (0 -760)) rect(l2 (-525 1670) (445 420)) ) - net(4 + net(4 name($4) polygon(l9 (1485 760) (0 840) (-245 0) (0 170) (245 0) (0 560) (170 0) (0 -1570)) rect(l21 (-170 80) (170 170)) rect(l21 (-170 1070) (170 170)) From 7b002a18152ac7d7a18e2fa3e26d3550e461561a Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 4 Jan 2026 18:37:43 +0100 Subject: [PATCH 09/19] Updating test data --- testdata/algo/lvsdb_read_test.lvsdb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/testdata/algo/lvsdb_read_test.lvsdb b/testdata/algo/lvsdb_read_test.lvsdb index dd2512b13..2e60f30d7 100644 --- a/testdata/algo/lvsdb_read_test.lvsdb +++ b/testdata/algo/lvsdb_read_test.lvsdb @@ -116,7 +116,7 @@ layout( rect((-1700 -2440) (3100 7820)) # Nets with their geometries - net(1 + net(1 name($1) rect(nwell (-1400 1800) (2800 3580)) rect(diff_cont (-1510 -650) (220 220)) rect(ntie (-510 -450) (800 680)) @@ -267,7 +267,7 @@ layout( # Nets with their geometries net(1 name(BULK)) - net(2 + net(2 name($2) rect(diff_cont (4230 3290) (220 220)) rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220)) @@ -289,7 +289,7 @@ layout( rect(metal1 (-3000 -1560) (360 1560)) rect(metal1 (-360 -1560) (360 1560)) ) - net(3 + net(3 name($3) rect(diff_cont (4230 890) (220 220)) rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220)) @@ -311,7 +311,7 @@ layout( rect(metal1 (-3000 -1560) (360 1560)) rect(metal1 (-360 -1560) (360 1560)) ) - net(4 + net(4 name($4) rect(diff_cont (790 890) (220 220)) rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220)) @@ -329,8 +329,8 @@ layout( rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220)) ) - net(5) - net(6 + net(5 name($5)) + net(6 name($6) rect(diff_cont (3430 890) (220 220)) rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220)) @@ -348,7 +348,7 @@ layout( rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220)) ) - net(7) + net(7 name($7)) # Outgoing pins and their connections to nets pin(1 name(BULK)) @@ -654,7 +654,7 @@ layout( rect(metal1 (-360 -1560) (360 1560)) rect(metal2_lbl (-21300 -380) (0 0)) ) - net(5 + net(5 name($5) rect(diff_cont (1730 90) (220 220)) rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220)) @@ -672,7 +672,7 @@ layout( rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220)) ) - net(6 + net(6 name($6) rect(diff_cont (17570 90) (220 220)) rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220)) @@ -690,7 +690,7 @@ layout( rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220)) ) - net(7 + net(7 name($7) rect(diff_cont (12290 90) (220 220)) rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220)) @@ -708,7 +708,7 @@ layout( rect(diff_cont (-220 180) (220 220)) rect(diff_cont (-220 180) (220 220)) ) - net(8 + net(8 name($8) rect(diff_cont (7010 90) (220 220)) rect(diff_cont (-220 -620) (220 220)) rect(diff_cont (-220 -620) (220 220)) From 38ddffc645d9e3b8bc53050e08684cd568dea703 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 4 Jan 2026 22:46:29 +0100 Subject: [PATCH 10/19] L2N log entries with net references * Log entries on the L2N object can now have net references (by expanded name) and the nets will be highlighted when the log entry is selected in the netlist browser For an application see drcSimpleTests:147. * New function ("db") in evaluate_nets * BUGFIX: proper computation of transformations for multiple selections of nets in netlist browser --- src/db/db/dbLayoutToNetlistFormatDefs.h | 5 +- src/db/db/dbLayoutToNetlistReader.cc | 17 ++- src/db/db/dbLayoutToNetlistReader.h | 1 + src/db/db/dbLayoutToNetlistWriter.cc | 4 + src/db/db/dbLog.cc | 47 ++++++-- src/db/db/dbLog.h | 16 +++ src/db/db/dbMeasureEval.cc | 31 +++++- src/db/db/dbMeasureEval.h | 6 +- src/db/db/gsiDeclDbLayoutToNetlist.cc | 3 +- src/db/db/gsiDeclDbLog.cc | 57 ++++++++++ src/drc/drc/built-in-macros/_drc_netter.rb | 1 + src/drc/unit_tests/drcSimpleTests.cc | 32 ++++++ src/gsi/gsi/gsiVariantArgs.cc | 18 ++++ src/layui/layui/layNetlistBrowserPage.cc | 118 ++++++++++++++++----- src/layui/layui/layNetlistBrowserPage.h | 1 + testdata/drc/drcSimpleTests_147.drc | 37 +++++++ testdata/drc/drcSimpleTests_147.gds | Bin 0 -> 1932 bytes testdata/drc/drcSimpleTests_au147.l2n | 74 +++++++++++++ testdata/ruby/dbLogTest.rb | 43 ++++++++ 19 files changed, 471 insertions(+), 40 deletions(-) create mode 100644 testdata/drc/drcSimpleTests_147.drc create mode 100644 testdata/drc/drcSimpleTests_147.gds create mode 100644 testdata/drc/drcSimpleTests_au147.l2n diff --git a/src/db/db/dbLayoutToNetlistFormatDefs.h b/src/db/db/dbLayoutToNetlistFormatDefs.h index bea7dbd60..a9d18e078 100644 --- a/src/db/db/dbLayoutToNetlistFormatDefs.h +++ b/src/db/db/dbLayoutToNetlistFormatDefs.h @@ -188,7 +188,7 @@ namespace db * scale() - magnification (default is 1) [short key: S] * * [message-entry]: - * message([severity] [message|message-geometry|message-cell|message-category|any]*) - message entry [short key: H] + * message([severity] [message|message-geometry|message-cell|message-category|message-net|any]*) - message entry [short key: H] * * [message]: * description() - message text [short key: B] @@ -199,6 +199,9 @@ namespace db * [message-cell]: * cell() - message cell [short key: C] * + * [message-net]: + * net() - message net name [short key: N] + * * [message-category]: * cat( ?) - message category with optional description [short key: X] * diff --git a/src/db/db/dbLayoutToNetlistReader.cc b/src/db/db/dbLayoutToNetlistReader.cc index 43b3850bd..3e65a1f38 100644 --- a/src/db/db/dbLayoutToNetlistReader.cc +++ b/src/db/db/dbLayoutToNetlistReader.cc @@ -225,6 +225,18 @@ bool LayoutToNetlistStandardReader::read_message_cell (std::string &cell_name) } } +bool LayoutToNetlistStandardReader::read_message_net (std::string &net_name) +{ + if (test (skeys::net_key) || test (lkeys::net_key)) { + Brace br (this); + read_word_or_quoted (net_name); + br.done (); + return true; + } else { + return false; + } +} + bool LayoutToNetlistStandardReader::read_message_geometry (db::DPolygon &polygon) { if (test (skeys::polygon_key) || test (lkeys::polygon_key)) { @@ -258,7 +270,7 @@ bool LayoutToNetlistStandardReader::read_message_cat (std::string &category_name void LayoutToNetlistStandardReader::read_message_entry (db::LogEntryData &data) { Severity severity (db::NoSeverity); - std::string msg, cell_name, category_name, category_description; + std::string msg, cell_name, net_name, category_name, category_description; db::DPolygon geometry; Brace br (this); @@ -269,6 +281,8 @@ void LayoutToNetlistStandardReader::read_message_entry (db::LogEntryData &data) // continue } else if (read_message_cell (cell_name)) { // continue + } else if (read_message_net (net_name)) { + // continue } else if (read_message_cat (category_name, category_description)) { // continue } else if (read_message_geometry (geometry)) { @@ -282,6 +296,7 @@ void LayoutToNetlistStandardReader::read_message_entry (db::LogEntryData &data) data.set_severity (severity); data.set_message (msg); data.set_cell_name (cell_name); + data.set_net_name (net_name); data.set_category_description (category_description); data.set_category_name (category_name); data.set_geometry (geometry); diff --git a/src/db/db/dbLayoutToNetlistReader.h b/src/db/db/dbLayoutToNetlistReader.h index bc1230f66..cbfd57fff 100644 --- a/src/db/db/dbLayoutToNetlistReader.h +++ b/src/db/db/dbLayoutToNetlistReader.h @@ -164,6 +164,7 @@ private: db::Point read_point (); void read_message_entry (db::LogEntryData &data); bool read_message_cell (std::string &cell_name); + bool read_message_net (std::string &net_name); bool read_message_geometry (db::DPolygon &polygon); bool read_message_cat (std::string &category_name, std::string &category_description); }; diff --git a/src/db/db/dbLayoutToNetlistWriter.cc b/src/db/db/dbLayoutToNetlistWriter.cc index 0b734b7a0..35a250182 100644 --- a/src/db/db/dbLayoutToNetlistWriter.cc +++ b/src/db/db/dbLayoutToNetlistWriter.cc @@ -211,6 +211,10 @@ void std_writer_impl::write_log_entry (TokenizedOutput &stream, const LogE TokenizedOutput (stream, Keys::cell_key, true) << tl::to_word_or_quoted_string (le.cell_name ()); } + if (! le.net_name ().empty ()) { + TokenizedOutput (stream, Keys::net_key, true) << tl::to_word_or_quoted_string (le.net_name ()); + } + if (! le.category_name ().empty ()) { TokenizedOutput o (stream, Keys::cat_key, true); o << tl::to_word_or_quoted_string (le.category_name ()); diff --git a/src/db/db/dbLog.cc b/src/db/db/dbLog.cc index 0a3c80fb5..58284d535 100644 --- a/src/db/db/dbLog.cc +++ b/src/db/db/dbLog.cc @@ -81,19 +81,25 @@ static LogEntryStringRepository s_strings; // LogEntryData implementation LogEntryData::LogEntryData () - : m_severity (NoSeverity), m_cell_name (0), m_message (0), m_category_name (0), m_category_description (0) + : m_severity (NoSeverity), m_cell_name (0), m_net_name (0), m_message (0), m_category_name (0), m_category_description (0) { // .. nothing yet .. } LogEntryData::LogEntryData (Severity s, const std::string &msg) - : m_severity (s), m_cell_name (0), m_message (s_strings.id_for_string (msg)), m_category_name (0), m_category_description (0) + : m_severity (s), m_cell_name (0), m_net_name (0), m_message (s_strings.id_for_string (msg)), m_category_name (0), m_category_description (0) { // .. nothing yet .. } LogEntryData::LogEntryData (Severity s, const std::string &cell_name, const std::string &msg) - : m_severity (s), m_cell_name (s_strings.id_for_string (cell_name)), m_message (s_strings.id_for_string (msg)), m_category_name (0), m_category_description (0) + : m_severity (s), m_cell_name (s_strings.id_for_string (cell_name)), m_net_name (0), m_message (s_strings.id_for_string (msg)), m_category_name (0), m_category_description (0) +{ + // .. nothing yet .. +} + +LogEntryData::LogEntryData (Severity s, const std::string &cell_name, const std::string &net_name, const std::string &msg) + : m_severity (s), m_cell_name (s_strings.id_for_string (cell_name)), m_net_name (s_strings.id_for_string (net_name)), m_message (s_strings.id_for_string (msg)), m_category_name (0), m_category_description (0) { // .. nothing yet .. } @@ -104,6 +110,7 @@ LogEntryData::operator== (const LogEntryData &other) const return m_severity == other.m_severity && m_message == other.m_message && m_cell_name == other.m_cell_name && + m_net_name == other.m_net_name && m_geometry == other.m_geometry && m_category_name == other.m_category_name && m_category_description == other.m_category_description; @@ -157,6 +164,18 @@ LogEntryData::set_cell_name (const std::string &n) m_cell_name = s_strings.id_for_string (n); } +const std::string & +LogEntryData::net_name () const +{ + return s_strings.string_for_id (m_net_name); +} + +void +LogEntryData::set_net_name (const std::string &n) +{ + m_net_name = s_strings.id_for_string (n); +} + std::string LogEntryData::to_string (bool with_geometry) const { @@ -179,10 +198,24 @@ LogEntryData::to_string (bool with_geometry) const } } - if (m_cell_name != 0) { - res += tl::to_string (tr ("In cell ")); - res += cell_name (); - res += ": "; + if (m_net_name != 0) { + if (m_cell_name != 0) { + res += tl::to_string (tr ("In net ")); + res += net_name (); + res += tl::to_string (tr (" in circuit ")); + res += cell_name (); + res += ": "; + } else { + res += tl::to_string (tr ("In net ")); + res += net_name (); + res += ": "; + } + } else { + if (m_cell_name != 0) { + res += tl::to_string (tr ("In cell ")); + res += cell_name (); + res += ": "; + } } res += msg; diff --git a/src/db/db/dbLog.h b/src/db/db/dbLog.h index 85e60a587..d26009d28 100644 --- a/src/db/db/dbLog.h +++ b/src/db/db/dbLog.h @@ -68,6 +68,11 @@ public: */ LogEntryData (Severity s, const std::string &cell_name, const std::string &msg); + /** + * @brief Creates an error with the severity, a cell (circuit) name, a net name and a message + */ + LogEntryData (Severity s, const std::string &cell_name, const std::string &net_name, const std::string &msg); + /** * @brief Equality */ @@ -158,6 +163,16 @@ public: */ void set_cell_name (const std::string &n); + /** + * @brief Gets the net name the error occurred in + */ + const std::string &net_name () const; + + /** + * @brief Sets the net name + */ + void set_net_name (const std::string &n); + /** * @brief Formats this message for printing */ @@ -166,6 +181,7 @@ public: private: Severity m_severity; string_id_type m_cell_name; + string_id_type m_net_name; string_id_type m_message; db::DPolygon m_geometry; string_id_type m_category_name, m_category_description; diff --git a/src/db/db/dbMeasureEval.cc b/src/db/db/dbMeasureEval.cc index 7bb2d45cc..d826868fc 100644 --- a/src/db/db/dbMeasureEval.cc +++ b/src/db/db/dbMeasureEval.cc @@ -492,6 +492,28 @@ private: MeasureNetEval *mp_eval; }; +class NetDbFunction + : public tl::EvalFunction +{ +public: + NetDbFunction (MeasureNetEval *eval) + : mp_eval (eval) + { + // .. nothing yet .. + } + + virtual void execute (const tl::ExpressionParserContext &context, tl::Variant &out, const std::vector &args, const std::map * /*kwargs*/) const + { + if (args.size () != 0) { + throw tl::EvalError (tl::to_string (tr ("'db' function does not take any argument")), context); + } + out = mp_eval->db_func (); + } + +private: + MeasureNetEval *mp_eval; +}; + class NetFunction : public tl::EvalFunction { @@ -558,7 +580,7 @@ private: MeasureNetEval *mp_eval; }; -MeasureNetEval::MeasureNetEval (const db::LayoutToNetlist *l2n, double dbu) +MeasureNetEval::MeasureNetEval (LayoutToNetlist *l2n, double dbu) : tl::Eval (), mp_l2n (l2n), m_dbu (dbu) { m_copy_merge = false; @@ -588,6 +610,7 @@ MeasureNetEval::init () define_function ("area", new NetAreaFunction (this)); define_function ("perimeter", new NetPerimeterFunction (this)); define_function ("net", new NetFunction (this)); + define_function ("db", new NetDbFunction (this)); } void @@ -701,4 +724,10 @@ MeasureNetEval::net_func () const } } +tl::Variant +MeasureNetEval::db_func () const +{ + return tl::Variant::make_variant_ref (mp_l2n); +} + } diff --git a/src/db/db/dbMeasureEval.h b/src/db/db/dbMeasureEval.h index 882d422fc..328891e90 100644 --- a/src/db/db/dbMeasureEval.h +++ b/src/db/db/dbMeasureEval.h @@ -122,7 +122,7 @@ class DB_PUBLIC MeasureNetEval : public tl::Eval { public: - MeasureNetEval (const db::LayoutToNetlist *l2n, double dbu); + MeasureNetEval (db::LayoutToNetlist *l2n, double dbu); void set_primary_layer (unsigned int layer_index); void set_secondary_layer (const std::string &name, unsigned int layer_index); @@ -144,6 +144,7 @@ private: friend class NetAreaFunction; friend class NetPerimeterFunction; friend class NetFunction; + friend class NetDbFunction; friend class NetSkipFunction; friend class NetCopyFunction; @@ -153,7 +154,7 @@ private: double area, perimeter; }; - const db::LayoutToNetlist *mp_l2n; + db::LayoutToNetlist *mp_l2n; double m_dbu; std::vector m_layers; mutable std::vector m_copy_layers; @@ -173,6 +174,7 @@ private: tl::Variant perimeter_func (int layer_index) const; void copy_func (const std::vector &layer_indexes, bool merge, size_t max_polygons) const; tl::Variant net_func () const; + tl::Variant db_func () const; }; } diff --git a/src/db/db/gsiDeclDbLayoutToNetlist.cc b/src/db/db/gsiDeclDbLayoutToNetlist.cc index 506e7dc32..36453908d 100644 --- a/src/db/db/gsiDeclDbLayoutToNetlist.cc +++ b/src/db/db/gsiDeclDbLayoutToNetlist.cc @@ -1251,6 +1251,7 @@ Class decl_dbLayoutToNetlist ("db", "LayoutToNetlist", "@li 'skip' or 'skip(flag)': will skip the primary shapes of that net when called with a true value or without one. See also 'copy'. @/li\n" "@li 'copy(...)': see below for details @/li\n" "@li 'net': the \\Net object of the current net @/li\n" + "@li 'db': the \\LayoutToDatabase object the netlist lives in @/li\n" "@/ul\n" "\n" "If given, the 'dbu' argument gives the database unit to use for converting shape dimensions into micrometer units. " @@ -1294,7 +1295,7 @@ Class decl_dbLayoutToNetlist ("db", "LayoutToNetlist", "where the second expression establishes 'skip' as the default and conditionally executes 'copy',\n" "overriding 'skip'.\n" "\n" - "The 'copy' function was added and the 'skip' argument was made optional in version 0.30.6." + "The 'copy' and 'db' functions were added and the 'skip' argument was made optional in version 0.30.6." ) + // test API gsi::method ("make_soft_connection_diodes=", &db::LayoutToNetlist::set_make_soft_connection_diodes, gsi::arg ("flag"), "@hide") + diff --git a/src/db/db/gsiDeclDbLog.cc b/src/db/db/gsiDeclDbLog.cc index 8c26282a8..171854868 100644 --- a/src/db/db/gsiDeclDbLog.cc +++ b/src/db/db/gsiDeclDbLog.cc @@ -23,11 +23,53 @@ #include "gsiDecl.h" #include "gsiEnums.h" #include "dbLog.h" +#include "dbNet.h" +#include "dbCircuit.h" namespace gsi { +db::LogEntryData *new_le1 (db::Severity severity, const std::string &msg) +{ + return new db::LogEntryData (severity, msg); +} + +db::LogEntryData *new_le2 (db::Severity severity, const std::string &cell_name, const std::string &msg) +{ + return new db::LogEntryData (severity, cell_name, msg); +} + +db::LogEntryData *new_le3 (db::Severity severity, const std::string &cell_name, const std::string &net_name, const std::string &msg) +{ + return new db::LogEntryData (severity, cell_name, net_name, msg); +} + +db::LogEntryData *new_le4 (db::Severity severity, const db::Net *net, const std::string &msg) +{ + if (! net || ! net->circuit ()) { + return new db::LogEntryData (severity, msg); + } else { + return new db::LogEntryData (severity, net->circuit ()->name (), net->expanded_name (), msg); + } +} + Class decl_dbNetlistDeviceExtractorError ("db", "LogEntryData", + gsi::constructor ("new", &new_le1, gsi::arg ("severity"), gsi::arg ("msg"), + "@brief Creates a new LogEntry object with the given severity and message\n" + "This convenience constructor has been added in version 0.30.6\n" + ) + + gsi::constructor ("new", &new_le2, gsi::arg ("severity"), gsi::arg ("cell_name"), gsi::arg ("msg"), + "@brief Creates a new LogEntry object with the given severity, cell or circuit name and message\n" + "This convenience constructor has been added in version 0.30.6\n" + ) + + gsi::constructor ("new", &new_le3, gsi::arg ("severity"), gsi::arg ("cell_name"), gsi::arg ("new_name"), gsi::arg ("msg"), + "@brief Creates a new LogEntry object with the given severity, cell or circuit name, net name and message\n" + "This convenience constructor has been added in version 0.30.6\n" + ) + + gsi::constructor ("new", &new_le4, gsi::arg ("severity"), gsi::arg ("net"), gsi::arg ("msg"), + "@brief Creates a new LogEntry object with the given severity and message and circuit and net name taken from the given \\Net object\n" + "This convenience constructor has been added in version 0.30.6\n" + ) + gsi::method ("severity", &db::LogEntryData::severity, "@brief Gets the severity attribute.\n" ) + @@ -51,6 +93,21 @@ Class decl_dbNetlistDeviceExtractorError ("db", "LogEntryData" "warning generated during device extraction, the cell name is " "the circuit the device should have appeared in." ) + + gsi::method ("net_name", &db::LogEntryData::net_name, + "@brief Gets the net name.\n" + "See \\net_name= for details about this attribute." + "\n" + "The net_name attribute has been introduced in version 0.30.6.\n" + ) + + gsi::method ("net_name=", &db::LogEntryData::set_net_name, gsi::arg ("net_name"), + "@brief Sets the net name.\n" + "The net (or circuit) name specifies the net the " + "log entry is related to.\n" + "\n" + "By convention, the net name is the expanded net name (see \\Net#expanded_name).\n" + "\n" + "The net_name attribute has been introduced in version 0.30.6.\n" + ) + gsi::method ("geometry", &db::LogEntryData::geometry, "@brief Gets the geometry.\n" "See \\geometry= for more details." diff --git a/src/drc/drc/built-in-macros/_drc_netter.rb b/src/drc/drc/built-in-macros/_drc_netter.rb index efb9853ee..e5ec8f0a2 100644 --- a/src/drc/drc/built-in-macros/_drc_netter.rb +++ b/src/drc/drc/built-in-macros/_drc_netter.rb @@ -807,6 +807,7 @@ module DRC # # @ul # @li "net" - the RBA::Net object of the current net @/li + # @li "db" - the RBA::LayoutToNetlist object the netlist lives in @/li # @li "skip" or "skip(flag)" - if called with a 'true' argument (the default), the primary layer's shapes are not copied for this net @/li # @li "copy(...)" - configures polygon output in a more elaborate way than "skip" (see below) @/li # @li "put(name, value)" - places the value as a property with name 'name' (this must be a string) on the output shapes @/li diff --git a/src/drc/unit_tests/drcSimpleTests.cc b/src/drc/unit_tests/drcSimpleTests.cc index 6ccccb378..80199b2fb 100644 --- a/src/drc/unit_tests/drcSimpleTests.cc +++ b/src/drc/unit_tests/drcSimpleTests.cc @@ -2076,3 +2076,35 @@ TEST(146d_edges_and_corners) run_test (_this, "146", true); } +TEST(147_MeasureNetsWithL2N) +{ + std::string rs = tl::testdata (); + rs += "/drc/drcSimpleTests_147.drc"; + + std::string input = tl::testdata (); + input += "/drc/drcSimpleTests_147.gds"; + + std::string au_output = tl::testdata (); + au_output += "/drc/drcSimpleTests_au147.l2n"; + + std::string output = this->tmp_file ("tmp.l2n"); + + { + // Set some variables + lym::Macro config; + config.set_text (tl::sprintf ( + "$drc_test_source = '%s'\n" + "$drc_test_target = '%s'\n" + , input, output) + ); + config.set_interpreter (lym::Macro::Ruby); + EXPECT_EQ (config.run (), 0); + } + + lym::Macro drc; + drc.load_from (rs); + EXPECT_EQ (drc.run (), 0); + + compare_text_files (output, au_output); +} + diff --git a/src/gsi/gsi/gsiVariantArgs.cc b/src/gsi/gsi/gsiVariantArgs.cc index 5e1b4ffb7..d8e565f33 100644 --- a/src/gsi/gsi/gsiVariantArgs.cc +++ b/src/gsi/gsi/gsiVariantArgs.cc @@ -75,6 +75,24 @@ struct test_arg_func } }; +template <> +struct test_arg_func +{ + void operator () (bool *ret, const tl::Variant &arg, const gsi::ArgType & /*atype*/, bool /*loose*/, bool /*object_substitution*/) + { + *ret = arg.is_a_string (); + } +}; + +template <> +struct test_arg_func +{ + void operator () (bool *ret, const tl::Variant &arg, const gsi::ArgType & /*atype*/, bool /*loose*/, bool /*object_substitution*/) + { + *ret = arg.is_a_bytearray (); + } +}; + template <> struct test_arg_func { diff --git a/src/layui/layui/layNetlistBrowserPage.cc b/src/layui/layui/layNetlistBrowserPage.cc index ce725e086..b16dbf2e3 100644 --- a/src/layui/layui/layNetlistBrowserPage.cc +++ b/src/layui/layui/layNetlistBrowserPage.cc @@ -816,15 +816,31 @@ NetlistBrowserPage::log_selection_changed () QModelIndexList selection = log_view->selectionModel ()->selectedIndexes (); for (QModelIndexList::const_iterator i = selection.begin (); i != selection.end (); ++i) { - if (i->column () == 0) { - const db::LogEntryData *le = model->log_entry (*i); - if (le && le->geometry () != db::DPolygon () && ! le->cell_name ().empty ()) { - const db::Circuit *c = mp_database->netlist ()->circuit_by_name (le->cell_name ()); - if (c) { - m_markers.push_back (std::make_pair (c, le->geometry ())); - } + + if (i->column () != 0) { + continue; + } + + const db::LogEntryData *le = model->log_entry (*i); + + const db::Circuit *c = 0; + if (le && ! le->cell_name ().empty ()) { + c = mp_database->netlist ()->circuit_by_name (le->cell_name ()); + } + + // highlight geometries + if (c && le->geometry () != db::DPolygon ()) { + m_markers.push_back (std::make_pair (c, le->geometry ())); + } + + // highlight nets + if (c && ! le->net_name ().empty ()) { + const db::Net *net = c->net_by_name (le->net_name ()); + if (net) { + m_net_markers.push_back (std::make_pair (c, net)); } } + } update_highlights (); @@ -1291,6 +1307,7 @@ NetlistBrowserPage::clear_highlights () m_current_path = lay::NetlistObjectsPath (); m_selected_paths.clear (); m_markers.clear (); + m_net_markers.clear (); update_highlights (); } @@ -1350,6 +1367,31 @@ bbox_for_circuit (const db::Layout *layout, const db::Circuit *circuit) return layout->cell (circuit->cell_index ()).bbox (); } +static db::Box +bbox_for_net (const db::LayoutToNetlist *db, const db::Circuit *circuit, const db::Net *net) +{ + db::Box bbox; + + db::cell_index_type cell_index = circuit->cell_index (); + size_t cluster_id = net->cluster_id (); + + const db::Connectivity &conn = db->connectivity (); + for (db::Connectivity::all_layer_iterator layer = conn.begin_layers (); layer != conn.end_layers (); ++layer) { + + db::Box layer_bbox; + db::recursive_cluster_shape_iterator shapes (db->net_clusters (), *layer, cell_index, cluster_id); + while (! shapes.at_end ()) { + layer_bbox += shapes->bbox ().transformed (shapes.trans ()); + ++shapes; + } + + bbox += layer_bbox; + + } + + return bbox; +} + void NetlistBrowserPage::adjust_view () { @@ -1425,22 +1467,7 @@ NetlistBrowserPage::adjust_view () } else if (net) { - db::cell_index_type cell_index = net->circuit ()->cell_index (); - size_t cluster_id = net->cluster_id (); - - const db::Connectivity &conn = mp_database->connectivity (); - for (db::Connectivity::all_layer_iterator layer = conn.begin_layers (); layer != conn.end_layers (); ++layer) { - - db::Box layer_bbox; - db::recursive_cluster_shape_iterator shapes (mp_database->net_clusters (), *layer, cell_index, cluster_id); - while (! shapes.at_end ()) { - layer_bbox += shapes->bbox ().transformed (shapes.trans ()); - ++shapes; - } - - ebox += layer_bbox; - - } + ebox += bbox_for_net (mp_database.get (), circuit, net); } else if (circuit) { ebox += bbox_for_circuit (layout, circuit); @@ -1461,6 +1488,17 @@ NetlistBrowserPage::adjust_view () } + // add net markers boxes + + for (auto marker = m_net_markers.begin (); marker != m_net_markers.end (); ++marker) { + + std::pair tr = trans_for (marker->first, *layout, *cell, m_cell_context_cache, cv.context_dtrans ()); + if (tr.first) { + bbox += tr.second * db::CplxTrans (layout->dbu ()) * bbox_for_net (mp_database.get (), marker->first, marker->second); + } + + } + if (! bbox.empty ()) { std::vector tv = mp_view->cv_transform_variants (m_cv_index); @@ -1739,26 +1777,52 @@ NetlistBrowserPage::update_highlights () // a map of display properties vs. layer properties // correct DBU differences between the storage layout and the original layout - for (std::vector::iterator t = tv.begin (); t != tv.end (); ++t) { + std::vector tvt = tv; + for (std::vector::iterator t = tvt.begin (); t != tvt.end (); ++t) { *t = *t * trans * db::DCplxTrans (layout->dbu () / original_layout.dbu ()); } if (path->net.first) { - if (produce_highlights_for_net (path->net.first, n_markers, display_by_lp, tv)) { + if (produce_highlights_for_net (path->net.first, n_markers, display_by_lp, tvt)) { not_all_shapes_are_shown = true; } } else if (path->device.first) { - if (produce_highlights_for_device (path->device.first, n_markers, tv)) { + if (produce_highlights_for_device (path->device.first, n_markers, tvt)) { not_all_shapes_are_shown = true; } } else if (circuit) { - if (produce_highlights_for_circuit (circuit, n_markers, tv)) { + if (produce_highlights_for_circuit (circuit, n_markers, tvt)) { not_all_shapes_are_shown = true; } } } + for (auto marker = m_net_markers.begin (); marker != m_net_markers.end (); ++marker) { + + // computes the transformation supplied by the path + + std::pair tr = trans_for (marker->first, *layout, *cell, m_cell_context_cache, cv.context_dtrans ()); + if (! tr.first) { + continue; + } + + db::DCplxTrans trans = tr.second; + + // a map of display properties vs. layer properties + + // correct DBU differences between the storage layout and the original layout + std::vector tvt = tv; + for (std::vector::iterator t = tvt.begin (); t != tvt.end (); ++t) { + *t = *t * trans * db::DCplxTrans (layout->dbu () / original_layout.dbu ()); + } + + if (produce_highlights_for_net (marker->second, n_markers, display_by_lp, tvt)) { + not_all_shapes_are_shown = true; + } + + } + for (auto marker = m_markers.begin (); marker != m_markers.end (); ++marker) { // computes the transformation supplied by the path diff --git a/src/layui/layui/layNetlistBrowserPage.h b/src/layui/layui/layNetlistBrowserPage.h index c9012e83f..b0345934b 100644 --- a/src/layui/layui/layNetlistBrowserPage.h +++ b/src/layui/layui/layNetlistBrowserPage.h @@ -246,6 +246,7 @@ private: lay::NetlistObjectsPath m_current_path; std::vector m_selected_paths; std::vector > m_markers; + std::vector > m_net_markers; lay::NetInfoDialog *mp_info_dialog; tl::DeferredMethod dm_update_highlights; tl::DeferredMethod dm_rerun_macro; diff --git a/testdata/drc/drcSimpleTests_147.drc b/testdata/drc/drcSimpleTests_147.drc new file mode 100644 index 000000000..1751e29c0 --- /dev/null +++ b/testdata/drc/drcSimpleTests_147.drc @@ -0,0 +1,37 @@ + +source $drc_test_source +report_netlist $drc_test_target + +deep + +l1 = input(1, 0) +l2 = input(2, 0) +l3 = input(3, 0) +l4 = input(4, 0) +l5 = input(5, 0) + +connect(l1, l2) +connect(l2, l3) +connect(l3, l4) +connect(l4, l5) + +l1.output(1, 0) +l2.output(2, 0) +l3.output(3, 0) +l4.output(4, 0) +l5.output(5, 0) + +netlist + +sec = { "l2" => l2, "l3" => l3, "l4" => l4, "l5" => l5 } + +script = <<"END" + skip; + var ar=area(l5)/area; + db.add_log_entry(LogEntryData.new(Severity.Info, net, 'AR='+to_s(ar))) +END + +evaluate_nets(l1, sec, script, { "n" => "NET1" }) + +netlist + diff --git a/testdata/drc/drcSimpleTests_147.gds b/testdata/drc/drcSimpleTests_147.gds new file mode 100644 index 0000000000000000000000000000000000000000..ea99561480ce59460971559aa264df2ee54e23f6 GIT binary patch literal 1932 zcmb7EJ!@1!6g}_l+u4U%HGYs)vtS^F!AOkT1TDfQs3=O@VgrknDN=f}Y8S?317(%XecpZ9vV?;hOT{qVGndbyZqj9CJb6fmb_Ioq6x0o)ib z$*+v7%?vQt1wRGCV2BzQ^!X*9?=t^BzqjV|6Q9q# zI+@#_8W;5WWuNcm$lm^L!)ZYDM#ir?{e(Y3{Y))FiYirHd<9gFkzO_{_u37Yt%ASR zL@Jq_l5@_pI_63whsbHxc0U0tQ|^>8T~9BtauMoohqXs7?({KuWl-g{eQSSg0c-m} z;}CfHKvClv`YHu{I)iQ?a`L^38Xs{GtB8qQ-Oj1^mXL+sFD*ch=9L z#&i7OE2aKNE$2DD+t<&G9%pL|7)tNwrPGWT0ymnq);`q^k`~sS5 BQ0)K! literal 0 HcmV?d00001 diff --git a/testdata/drc/drcSimpleTests_au147.l2n b/testdata/drc/drcSimpleTests_au147.l2n new file mode 100644 index 000000000..6107261a6 --- /dev/null +++ b/testdata/drc/drcSimpleTests_au147.l2n @@ -0,0 +1,74 @@ +#%l2n-klayout +W(TOP) +U(0.001) +L(l1 '1/0') +L(l2 '2/0') +L(l3 '3/0') +L(l4 '4/0') +L(l5 '5/0') +C(l1 l1 l2) +C(l2 l1 l2 l3) +C(l3 l2 l3 l4) +C(l4 l3 l4 l5) +C(l5 l4 l5) +H(I B('AR=5') C(B) N(NET1)) +H(I B('AR=0') C(B) N($4)) +H(I B('AR=9.875') C(TOP) N($1)) +H(I B('AR=9.5') C(TOP) N($I2)) +X(A + R((0 0) (38000 12000)) + N(1 I(NET2) + R(l1 (0 8000) (4000 4000)) + R(l2 (-3000 -3000) (2000 2000)) + R(l3 (-3000 -11000) (4000 12000)) + R(l4 (-3000 -11000) (2000 2000)) + R(l5 (-3000 -3000) (38000 4000)) + R(l5 (-22000 -2000) (0 0)) + ) + P(1 I(NET2)) +) +X(B + R((-8000 -14000) (48000 34000)) + N(1 I(NET1) + R(l1 (12000 8000) (4000 4000)) + R(l1 (-10000 -14000) (4000 4000)) + R(l2 (3000 7000) (2000 2000)) + R(l2 (-8000 -12000) (2000 2000)) + R(l3 (3000 -3000) (4000 14000)) + R(l3 (-10000 -14000) (10000 4000)) + R(l4 (-3000 -3000) (2000 2000)) + R(l5 (-3000 -15000) (4000 16000)) + R(l5 (14000 -16000) (10000 4000)) + R(l5 (-6000 -2000) (0 0)) + ) + N(2 I($2) + R(l3 (25000 -5000) (4000 7000)) + R(l4 (-3000 -3000) (2000 2000)) + R(l5 (-3000 -3000) (15000 4000)) + ) + N(3 I($4) + R(l1 (25000 -5000) (4000 18000)) + ) + N(4 I($5) + R(l3 (25000 6000) (4000 7000)) + ) + N(5 I($6) + R(l5 (25000 6000) (15000 4000)) + ) + N(6 I(NET2) + R(l5 (16000 18000) (0 0)) + ) + P(6 I(NET2)) + X(1 A Y(-8000 -14000) P(0 1)) + X(2 A M Y(-8000 20000) P(0 6)) +) +X(TOP + R((-18000 -51000) (58000 108000)) + N(1 I($1) + R(l5 (0 16000) (4000 11000)) + ) + N(2 I($I2)) + X(1 B Y(0 0) P(0 1)) + X(2 B O(180) Y(22000 43000) P(0 1)) + X(3 B O(180) Y(22000 -31000) P(0 2)) +) diff --git a/testdata/ruby/dbLogTest.rb b/testdata/ruby/dbLogTest.rb index 795e6eb49..7bbfa6ad1 100644 --- a/testdata/ruby/dbLogTest.rb +++ b/testdata/ruby/dbLogTest.rb @@ -35,6 +35,11 @@ class DBLog_TestClass < TestBase le = RBA::LogEntryData::new + le.severity = RBA::LogEntryData::Error + assert_equal(le.severity.to_s, "Error") + le.severity = RBA::LogEntryData::NoSeverity + assert_equal(le.severity.to_s, "NoSeverity") + le.message = "message" assert_equal(le.message, "message") @@ -52,6 +57,44 @@ class DBLog_TestClass < TestBase assert_equal(le.to_s, "[the answer] In cell TOP: message, shape: (1,2;1,4;3,4;3,2)") + le.net_name = "NET" + assert_equal(le.net_name, "NET") + + assert_equal(le.to_s, "[the answer] In net NET in circuit TOP: message, shape: (1,2;1,4;3,4;3,2)") + + end + + def test_2_LogConstructors + + le = RBA::LogEntryData::new(RBA::LogEntryData::Error, "a message") + assert_equal(le.to_s, "a message") + + assert_equal(le.severity.to_s, "Error") + + le = RBA::LogEntryData::new(RBA::LogEntryData::Info, "CELL", "a message") + assert_equal(le.to_s, "In cell CELL: a message") + + assert_equal(le.severity.to_s, "Info") + + le = RBA::LogEntryData::new(RBA::LogEntryData::Warning, "CELL", "NET", "a message") + assert_equal(le.to_s, "In net NET in circuit CELL: a message") + + assert_equal(le.severity.to_s, "Warning") + + # Create a LogEntry from a Net object: + + nl = RBA::Netlist::new + c = RBA::Circuit::new + c.name = "CIRCUIT" + nl.add(c) + # NOTE: no explicit name, but ID 0 + net = c.create_net + + le = RBA::LogEntryData::new(RBA::LogEntryData::Error, net, "a message") + assert_equal(le.to_s, "In net $0 in circuit CIRCUIT: a message") + + assert_equal(le.severity.to_s, "Error") + end end From 3dd68fed66d46f0f573fd5037cbfcf3de6c2e8f5 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Mon, 5 Jan 2026 09:40:10 +0100 Subject: [PATCH 11/19] New testdata --- testdata/algo/lvs_test1_au.lvsdb.2 | 646 +++++++++++++++++++++++++++ testdata/algo/lvs_test2_au.lvsdb.2 | 677 +++++++++++++++++++++++++++++ 2 files changed, 1323 insertions(+) create mode 100644 testdata/algo/lvs_test1_au.lvsdb.2 create mode 100644 testdata/algo/lvs_test2_au.lvsdb.2 diff --git a/testdata/algo/lvs_test1_au.lvsdb.2 b/testdata/algo/lvs_test1_au.lvsdb.2 new file mode 100644 index 000000000..4a8055ac4 --- /dev/null +++ b/testdata/algo/lvs_test1_au.lvsdb.2 @@ -0,0 +1,646 @@ +#%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(bulk) + layer(nwell '1/0') + layer(poly '3/0') + layer(poly_lbl '3/1') + layer(diff_cont '4/0') + layer(poly_cont '5/0') + layer(metal1 '6/0') + layer(metal1_lbl '6/1') + layer(via1 '7/0') + layer(metal2 '8/0') + layer(metal2_lbl '8/1') + layer(ntie) + layer(psd) + layer(ptie) + layer(nsd) + + # Mask layer connectivity + connect(nwell nwell ntie) + connect(poly poly poly_lbl poly_cont) + connect(poly_lbl poly) + connect(diff_cont diff_cont metal1 ntie psd ptie nsd) + connect(poly_cont poly poly_cont metal1) + connect(metal1 diff_cont poly_cont metal1 metal1_lbl via1) + connect(metal1_lbl metal1) + connect(via1 metal1 via1 metal2) + connect(metal2 via1 metal2 metal2_lbl) + connect(metal2_lbl metal2) + connect(ntie nwell diff_cont ntie) + connect(psd diff_cont psd) + connect(ptie diff_cont ptie) + connect(nsd diff_cont nsd) + + # Global nets and connectivity + global(bulk BULK) + global(ptie BULK) + + # 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(psd (-650 -875) (525 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(psd (125 -875) (550 1750)) + ) + terminal(B + rect(nwell (-125 -875) (250 1750)) + ) + ) + device(D$PMOS$1 PMOS + terminal(S + rect(psd (-675 -875) (550 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(psd (125 -875) (525 1750)) + ) + terminal(B + rect(nwell (-125 -875) (250 1750)) + ) + ) + device(D$NMOS NMOS + terminal(S + rect(nsd (-650 -875) (525 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(nsd (125 -875) (550 1750)) + ) + terminal(B + rect(bulk (-125 -875) (250 1750)) + ) + ) + device(D$NMOS$1 NMOS + terminal(S + rect(nsd (-675 -875) (550 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(nsd (125 -875) (525 1750)) + ) + terminal(B + rect(bulk (-125 -875) (250 1750)) + ) + ) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(INV2 + + # Circuit boundary + rect((-1700 -2440) (3100 7820)) + + # Nets with their geometries + net(1 name($1) + rect(nwell (-1400 1800) (2800 3580)) + rect(diff_cont (-1510 -650) (220 220)) + rect(ntie (-510 -450) (800 680)) + ) + net(2 name(IN) + rect(poly (-525 -250) (250 2500)) + rect(poly (-1425 -630) (2100 360)) + rect(poly (-125 -2230) (250 2500)) + rect(poly (-1050 -3850) (250 2400)) + rect(poly (550 1200) (250 2400)) + rect(poly (-250 -6000) (250 2400)) + rect(poly (-1050 1200) (250 2400)) + rect(poly_lbl (-525 -2600) (0 0)) + rect(poly_cont (-830 -110) (220 220)) + ) + net(3 name(OUT) + rect(diff_cont (-910 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (1380 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -3820) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-1820 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(metal1 (1310 -3710) (360 2220)) + rect(metal1 (-1900 -800) (2220 360)) + rect(metal1 (-2280 -2400) (360 2840)) + rect(metal1 (-360 -3600) (360 1560)) + rect(metal1 (1240 2040) (360 1560)) + rect(metal1 (-360 -5160) (360 1560)) + rect(metal1 (-1960 2040) (360 1560)) + rect(metal1_lbl (1420 -2180) (0 0)) + rect(psd (-1850 525) (525 1750)) + rect(psd (1050 -1750) (525 1750)) + rect(nsd (-2100 -5350) (525 1750)) + rect(nsd (1050 -1750) (525 1750)) + ) + net(4 name(VSS) + rect(diff_cont (-110 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(metal1 (-290 -290) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(via1 (-305 -705) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 -1450) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(metal2 (-1525 -775) (2800 1700)) + rect(metal2_lbl (-160 -540) (0 0)) + rect(nsd (-1515 -1185) (550 1750)) + ) + net(5 name(VDD) + rect(diff_cont (-110 2490) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(metal1 (-290 -1490) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(via1 (-305 -1505) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(metal2 (-1525 -1575) (2800 1700)) + rect(metal2_lbl (-150 -1250) (0 0)) + rect(psd (-1525 -475) (550 1750)) + ) + net(6 name(BULK) + rect(diff_cont (-110 -2160) (220 220)) + rect(ptie (-510 -450) (800 680)) + ) + + # Outgoing pins and their connections to nets + pin(1) + pin(2 name(IN)) + pin(3 name(OUT)) + pin(4 name(VSS)) + pin(5 name(VDD)) + pin(6 name(BULK)) + + # Devices and their connections + device(1 D$PMOS + device(D$PMOS$1 location(800 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(-400 3200) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 3) + terminal(G 2) + terminal(D 5) + terminal(B 1) + ) + device(3 D$NMOS + device(D$NMOS$1 location(800 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(-400 -400) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 3) + terminal(G 2) + terminal(D 4) + terminal(B 6) + ) + + ) + circuit(INV2PAIR + + # Circuit boundary + rect((0 -1640) (5740 7820)) + + # Nets with their geometries + net(1 name(BULK)) + net(2 name($I6)) + net(3 name($I5)) + net(4 name($I4)) + net(5 name($I3)) + net(6 name($I2)) + net(7 name($I1)) + + # Outgoing pins and their connections to nets + pin(1 name(BULK)) + pin(2) + pin(3) + pin(4) + pin(5) + pin(6) + pin(7) + + # Subcircuits and their connections + circuit(1 INV2 location(1700 800) + pin(0 7) + pin(1 5) + pin(2 4) + pin(3 3) + pin(4 2) + pin(5 1) + ) + circuit(2 INV2 location(4340 800) + pin(0 7) + pin(1 4) + pin(2 6) + pin(3 3) + pin(4 2) + pin(5 1) + ) + + ) + circuit(RINGO + + # Circuit boundary + rect((-1720 -2440) (26880 7820)) + + # Nets with their geometries + net(1 name(FB) + rect(metal1 (-1700 1620) (360 360)) + rect(via1 (-305 -305) (250 250)) + rect(via1 (23190 -250) (250 250)) + rect(metal2 (-23765 -325) (23840 400)) + rect(metal2_lbl (-22120 -200) (0 0)) + ) + net(2 name(OSC) + rect(via1 (24435 1675) (250 250)) + rect(metal2 (-325 -325) (400 400)) + rect(metal2_lbl (-200 -200) (0 0)) + ) + net(3 name(VDD) + rect(metal1 (-180 3900) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal2_lbl (-23940 -2220) (0 0)) + ) + net(4 name(VSS) + rect(metal1 (-180 -2220) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal2_lbl (-23940 1100) (0 0)) + ) + net(5 name($I25)) + net(6 name($I24)) + net(7 name($I23)) + net(8 name($I22)) + net(9 name($I17)) + net(10 name($I11)) + net(11 name($I10)) + net(12 name($I9)) + + # Outgoing pins and their connections to nets + pin(1 name(FB)) + pin(2 name(OSC)) + pin(3 name(VDD)) + pin(4 name(VSS)) + + # Subcircuits and their connections + circuit(1 INV2PAIR location(19420 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 1) + pin(4 10) + pin(5 2) + pin(6 3) + ) + circuit(2 INV2PAIR location(-1700 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 8) + pin(4 1) + pin(5 9) + pin(6 3) + ) + circuit(3 INV2PAIR location(3580 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 7) + pin(4 9) + pin(5 12) + pin(6 3) + ) + circuit(4 INV2PAIR location(8860 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 6) + pin(4 12) + pin(5 11) + pin(6 3) + ) + circuit(5 INV2PAIR location(14140 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 5) + pin(4 11) + pin(5 10) + pin(6 3) + ) + + ) +) + +# Reference netlist +reference( + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(INV2 + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('5')) + net(6 name('6')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + pin(5 name('5')) + pin(6 name('6')) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 5) + terminal(G 2) + terminal(D 3) + terminal(B 1) + ) + device(2 NMOS + name($3) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 4) + terminal(G 2) + terminal(D 3) + terminal(B 6) + ) + + ) + circuit(INV2PAIR + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('5')) + net(6 name('6')) + net(7 name('7')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + pin(5 name('5')) + pin(6 name('6')) + pin(7 name('7')) + + # Subcircuits and their connections + circuit(1 INV2 name($1) + pin(0 7) + pin(1 5) + pin(2 4) + pin(3 3) + pin(4 2) + pin(5 1) + ) + circuit(2 INV2 name($2) + pin(0 7) + pin(1 4) + pin(2 6) + pin(3 3) + pin(4 2) + pin(5 1) + ) + + ) + circuit(RINGO + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('6')) + net(6 name('100')) + net(7 name('5')) + net(8 name('101')) + net(9 name('8')) + net(10 name('102')) + net(11 name('7')) + net(12 name('103')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + + # Subcircuits and their connections + circuit(1 INV2PAIR name($1) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 1) + pin(4 5) + pin(5 2) + pin(6 3) + ) + circuit(2 INV2PAIR name($2) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 6) + pin(4 1) + pin(5 7) + pin(6 3) + ) + circuit(3 INV2PAIR name($3) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 8) + pin(4 7) + pin(5 9) + pin(6 3) + ) + circuit(4 INV2PAIR name($4) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 10) + pin(4 9) + pin(5 11) + pin(6 3) + ) + circuit(5 INV2PAIR name($5) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 12) + pin(4 11) + pin(5 5) + pin(6 3) + ) + + ) +) + +# Cross reference +xref( + circuit(INV2 INV2 match + xref( + net(1 1 match) + net(6 6 match) + net(2 2 match) + net(3 3 match) + net(5 5 match) + net(4 4 match) + pin(0 0 match) + pin(5 5 match) + pin(1 1 match) + pin(2 2 match) + pin(4 4 match) + pin(3 3 match) + device(3 2 match) + device(1 1 match) + ) + ) + circuit(INV2PAIR INV2PAIR match + xref( + net(2 2 match) + net(3 3 match) + net(4 4 match) + net(5 5 match) + net(6 6 match) + net(7 7 match) + net(1 1 match) + pin(1 1 match) + pin(2 2 match) + pin(3 3 match) + pin(4 4 match) + pin(5 5 match) + pin(6 6 match) + pin(0 0 match) + circuit(1 1 match) + circuit(2 2 match) + ) + ) + circuit(RINGO RINGO match + xref( + net(8 6 match) + net(7 8 match) + net(6 10 match) + net(5 12 match) + net(9 7 match) + net(10 5 match) + net(11 11 match) + net(12 9 match) + net(1 1 match) + net(2 2 match) + net(3 3 match) + net(4 4 match) + pin(0 0 match) + pin(1 1 match) + pin(2 2 match) + pin(3 3 match) + circuit(1 1 match) + circuit(2 2 match) + circuit(3 3 match) + circuit(4 4 match) + circuit(5 5 match) + ) + ) +) diff --git a/testdata/algo/lvs_test2_au.lvsdb.2 b/testdata/algo/lvs_test2_au.lvsdb.2 new file mode 100644 index 000000000..c774021c7 --- /dev/null +++ b/testdata/algo/lvs_test2_au.lvsdb.2 @@ -0,0 +1,677 @@ +#%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(bulk) + layer(nwell '1/0') + layer(poly '3/0') + layer(poly_lbl '3/1') + layer(diff_cont '4/0') + layer(poly_cont '5/0') + layer(metal1 '6/0') + layer(metal1_lbl '6/1') + layer(via1 '7/0') + layer(metal2 '8/0') + layer(metal2_lbl '8/1') + layer(ntie) + layer(psd) + layer(ptie) + layer(nsd) + + # Mask layer connectivity + connect(nwell nwell ntie) + connect(poly poly poly_lbl poly_cont) + connect(poly_lbl poly) + connect(diff_cont diff_cont metal1 ntie psd ptie nsd) + connect(poly_cont poly poly_cont metal1) + connect(metal1 diff_cont poly_cont metal1 metal1_lbl via1) + connect(metal1_lbl metal1) + connect(via1 metal1 via1 metal2) + connect(metal2 via1 metal2 metal2_lbl) + connect(metal2_lbl metal2) + connect(ntie nwell diff_cont ntie) + connect(psd diff_cont psd) + connect(ptie diff_cont ptie) + connect(nsd diff_cont nsd) + + # Global nets and connectivity + global(bulk BULK) + global(ptie BULK) + + # 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(psd (-650 -875) (525 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(psd (125 -875) (550 1750)) + ) + terminal(B + rect(nwell (-125 -875) (250 1750)) + ) + ) + device(D$PMOS$1 PMOS + terminal(S + rect(psd (-675 -875) (550 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(psd (125 -875) (525 1750)) + ) + terminal(B + rect(nwell (-125 -875) (250 1750)) + ) + ) + device(D$NMOS NMOS + terminal(S + rect(nsd (-650 -875) (525 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(nsd (125 -875) (550 1750)) + ) + terminal(B + rect(bulk (-125 -875) (250 1750)) + ) + ) + device(D$NMOS$1 NMOS + terminal(S + rect(nsd (-675 -875) (550 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(nsd (125 -875) (525 1750)) + ) + terminal(B + rect(bulk (-125 -875) (250 1750)) + ) + ) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(INV2 + + # Circuit boundary + rect((-1700 -2440) (3100 7820)) + + # Nets with their geometries + net(1 name($1) + rect(nwell (-1400 1800) (2800 3580)) + rect(diff_cont (-1510 -650) (220 220)) + rect(ntie (-510 -450) (800 680)) + ) + net(2 name(IN) + rect(poly (-525 -250) (250 2500)) + rect(poly (-1425 -630) (2100 360)) + rect(poly (-125 -2230) (250 2500)) + rect(poly (-1050 -3850) (250 2400)) + rect(poly (550 1200) (250 2400)) + rect(poly (-250 -6000) (250 2400)) + rect(poly (-1050 1200) (250 2400)) + rect(poly_lbl (-525 -2600) (0 0)) + rect(poly_cont (-830 -110) (220 220)) + ) + net(3 name(OUT) + rect(diff_cont (-910 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (1380 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -3820) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-1820 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(metal1 (1310 -3710) (360 2220)) + rect(metal1 (-1900 -800) (2220 360)) + rect(metal1 (-2280 -2400) (360 2840)) + rect(metal1 (-360 -3600) (360 1560)) + rect(metal1 (1240 2040) (360 1560)) + rect(metal1 (-360 -5160) (360 1560)) + rect(metal1 (-1960 2040) (360 1560)) + rect(metal1_lbl (1420 -2180) (0 0)) + rect(psd (-1850 525) (525 1750)) + rect(psd (1050 -1750) (525 1750)) + rect(nsd (-2100 -5350) (525 1750)) + rect(nsd (1050 -1750) (525 1750)) + ) + net(4 name(VSS) + rect(diff_cont (-110 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(metal1 (-290 -290) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(via1 (-305 -705) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 -1450) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(metal2 (-1525 -775) (2800 1700)) + rect(metal2_lbl (-160 -540) (0 0)) + rect(nsd (-1515 -1185) (550 1750)) + ) + net(5 name(VDD) + rect(diff_cont (-110 2490) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(metal1 (-290 -1490) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(via1 (-305 -1505) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(metal2 (-1525 -1575) (2800 1700)) + rect(metal2_lbl (-150 -1250) (0 0)) + rect(psd (-1525 -475) (550 1750)) + ) + net(6 name(BULK) + rect(diff_cont (-110 -2160) (220 220)) + rect(ptie (-510 -450) (800 680)) + ) + + # Outgoing pins and their connections to nets + pin(1) + pin(2 name(IN)) + pin(3 name(OUT)) + pin(4 name(VSS)) + pin(5 name(VDD)) + pin(6 name(BULK)) + + # Devices and their connections + device(1 D$PMOS + device(D$PMOS$1 location(800 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(-400 3200) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 3) + terminal(G 2) + terminal(D 5) + terminal(B 1) + ) + device(3 D$NMOS + device(D$NMOS$1 location(800 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(-400 -400) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 3) + terminal(G 2) + terminal(D 4) + terminal(B 6) + ) + + ) + circuit(INV2PAIR + + # Circuit boundary + rect((0 -1640) (5740 7820)) + + # Nets with their geometries + net(1 name(BULK)) + net(2 name($I6)) + net(3 name($I5)) + net(4 name($I4)) + net(5 name($I3)) + net(6 name($I2)) + net(7 name($I1)) + + # Outgoing pins and their connections to nets + pin(1 name(BULK)) + pin(2) + pin(3) + pin(4) + pin(5) + pin(6) + pin(7) + + # Subcircuits and their connections + circuit(1 INV2 location(1700 800) + pin(0 7) + pin(1 5) + pin(2 4) + pin(3 3) + pin(4 2) + pin(5 1) + ) + circuit(2 INV2 location(4340 800) + pin(0 7) + pin(1 4) + pin(2 6) + pin(3 3) + pin(4 2) + pin(5 1) + ) + + ) + circuit(RINGO + + # Circuit boundary + rect((-1720 -2440) (26880 7820)) + + # Nets with their geometries + net(1 name(FB) + rect(metal1 (-1700 1620) (360 360)) + rect(via1 (-305 -305) (250 250)) + rect(via1 (23190 -250) (250 250)) + rect(metal2 (-23765 -325) (23840 400)) + rect(metal2_lbl (-22120 -200) (0 0)) + ) + net(2 name(OSC) + rect(via1 (24435 1675) (250 250)) + rect(metal2 (-325 -325) (400 400)) + rect(metal2_lbl (-200 -200) (0 0)) + ) + net(3 name(VDD) + rect(metal1 (-180 3900) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal2_lbl (-23940 -2220) (0 0)) + ) + net(4 name(VSS) + rect(metal1 (-180 -2220) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal2_lbl (-23940 1100) (0 0)) + ) + net(5 name($I25)) + net(6 name($I24)) + net(7 name($I23)) + net(8 name($I22)) + net(9 name($I17)) + net(10 name($I11)) + net(11 name($I10)) + net(12 name($I9)) + + # Outgoing pins and their connections to nets + pin(1 name(FB)) + pin(2 name(OSC)) + pin(3 name(VDD)) + pin(4 name(VSS)) + + # Subcircuits and their connections + circuit(1 INV2PAIR location(19420 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 1) + pin(4 10) + pin(5 2) + pin(6 3) + ) + circuit(2 INV2PAIR location(-1700 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 8) + pin(4 1) + pin(5 9) + pin(6 3) + ) + circuit(3 INV2PAIR location(3580 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 7) + pin(4 9) + pin(5 12) + pin(6 3) + ) + circuit(4 INV2PAIR location(8860 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 6) + pin(4 12) + pin(5 11) + pin(6 3) + ) + circuit(5 INV2PAIR location(14140 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 5) + pin(4 11) + pin(5 10) + pin(6 3) + ) + + ) +) + +# Reference netlist +reference( + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(INV2 + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('5')) + net(6 name('6')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + pin(5 name('5')) + pin(6 name('6')) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 5) + terminal(G 2) + terminal(D 3) + terminal(B 1) + ) + device(2 NMOS + name($3) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 4) + terminal(G 2) + terminal(D 3) + terminal(B 6) + ) + + ) + circuit(INV2PAIR + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('5')) + net(6 name('6')) + net(7 name('7')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + pin(5 name('5')) + pin(6 name('6')) + pin(7 name('7')) + + # Subcircuits and their connections + circuit(1 INV2 name($2) + pin(0 7) + pin(1 4) + pin(2 6) + pin(3 3) + pin(4 2) + pin(5 1) + ) + + ) + circuit(INV2PAIRX + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('5')) + net(6 name('6')) + net(7 name('7')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + pin(5 name('5')) + pin(6 name('6')) + pin(7 name('7')) + + # Subcircuits and their connections + circuit(1 INV2 name($2) + pin(0 7) + pin(1 4) + pin(2 6) + pin(3 3) + pin(4 2) + pin(5 1) + ) + + ) + circuit(RINGO + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('6')) + net(6 name('5')) + net(7 name('101')) + net(8 name('8')) + net(9 name('102')) + net(10 name('7')) + net(11 name('103')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + + # Subcircuits and their connections + circuit(1 INV2PAIR name($1) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 1) + pin(4 5) + pin(5 2) + pin(6 3) + ) + circuit(2 INV2PAIR name($2) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 1) + pin(4 1) + pin(5 6) + pin(6 3) + ) + circuit(3 INV2PAIR name($3) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 7) + pin(4 6) + pin(5 8) + pin(6 3) + ) + circuit(4 INV2PAIR name($4) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 9) + pin(4 8) + pin(5 10) + pin(6 3) + ) + circuit(5 INV2PAIR name($5) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 11) + pin(4 10) + pin(5 5) + pin(6 3) + ) + + ) +) + +# Cross reference +xref( + circuit(() INV2PAIRX mismatch + xref( + ) + ) + circuit(INV2 INV2 match + xref( + net(1 1 match) + net(6 6 match) + net(2 2 match) + net(3 3 match) + net(5 5 match) + net(4 4 match) + pin(0 0 match) + pin(5 5 match) + pin(1 1 match) + pin(2 2 match) + pin(4 4 match) + pin(3 3 match) + device(3 2 match) + device(1 1 match) + ) + ) + circuit(INV2PAIR INV2PAIR nomatch + xref( + net(2 2 mismatch) + net(3 3 mismatch) + net(4 4 mismatch) + net(5 5 mismatch) + net(6 6 match) + net(7 7 mismatch) + net(1 1 mismatch) + pin(1 1 match) + pin(2 2 match) + pin(3 3 match) + pin(4 4 match) + pin(5 5 match) + pin(6 6 match) + pin(0 0 match) + circuit(1 () mismatch) + circuit(2 1 match) + ) + ) + circuit(RINGO RINGO nomatch + log( + entry(error description('Net $I22 is not matching any net from reference netlist')) + entry(error description('Net FB is not matching any net from reference netlist')) + ) + xref( + net(8 () mismatch) + net(7 7 match) + net(6 9 match) + net(5 11 match) + net(9 6 match) + net(10 5 match) + net(11 10 match) + net(12 8 match) + net(1 1 mismatch) + net(2 2 match) + net(3 3 match) + net(4 4 match) + pin(0 0 match) + pin(1 1 match) + pin(2 2 match) + pin(3 3 match) + circuit(() 2 mismatch) + circuit(2 () mismatch) + circuit(1 1 match) + circuit(3 3 match) + circuit(4 4 match) + circuit(5 5 match) + ) + ) +) From 5128cfcb7a5bfdda06e828839acb78376bc66814 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 10 Jan 2026 22:40:18 +0100 Subject: [PATCH 12/19] New testdata --- testdata/algo/lvs_test1b_au.lvsdb.2 | 646 ++++++++++++++++++++++++++ testdata/algo/lvs_test2b_au.lvsdb.2 | 677 ++++++++++++++++++++++++++++ 2 files changed, 1323 insertions(+) create mode 100644 testdata/algo/lvs_test1b_au.lvsdb.2 create mode 100644 testdata/algo/lvs_test2b_au.lvsdb.2 diff --git a/testdata/algo/lvs_test1b_au.lvsdb.2 b/testdata/algo/lvs_test1b_au.lvsdb.2 new file mode 100644 index 000000000..eeba4a324 --- /dev/null +++ b/testdata/algo/lvs_test1b_au.lvsdb.2 @@ -0,0 +1,646 @@ +#%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(bulk) + layer(nwell '1/0') + layer(poly '3/0') + layer(poly_lbl '3/1') + layer(diff_cont '4/0') + layer(poly_cont '5/0') + layer(metal1 '6/0') + layer(metal1_lbl '6/1') + layer(via1 '7/0') + layer(metal2 '8/0') + layer(metal2_lbl '8/1') + layer(ntie) + layer(psd) + layer(ptie) + layer(nsd) + + # Mask layer connectivity + connect(nwell nwell ntie) + connect(poly poly poly_lbl poly_cont) + connect(poly_lbl poly) + connect(diff_cont diff_cont metal1 ntie psd ptie nsd) + connect(poly_cont poly poly_cont metal1) + connect(metal1 diff_cont poly_cont metal1 metal1_lbl via1) + connect(metal1_lbl metal1) + connect(via1 metal1 via1 metal2) + connect(metal2 via1 metal2 metal2_lbl) + connect(metal2_lbl metal2) + connect(ntie nwell diff_cont ntie) + connect(psd diff_cont psd) + connect(ptie diff_cont ptie) + connect(nsd diff_cont nsd) + + # Global nets and connectivity + global(bulk BULK) + global(ptie BULK) + + # 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(psd (-650 -875) (525 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(psd (125 -875) (550 1750)) + ) + terminal(B + rect(nwell (-125 -875) (250 1750)) + ) + ) + device(D$PMOS$1 PMOS + terminal(S + rect(psd (-675 -875) (550 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(psd (125 -875) (525 1750)) + ) + terminal(B + rect(nwell (-125 -875) (250 1750)) + ) + ) + device(D$NMOS NMOS + terminal(S + rect(nsd (-650 -875) (525 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(nsd (125 -875) (550 1750)) + ) + terminal(B + rect(bulk (-125 -875) (250 1750)) + ) + ) + device(D$NMOS$1 NMOS + terminal(S + rect(nsd (-675 -875) (550 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(nsd (125 -875) (525 1750)) + ) + terminal(B + rect(bulk (-125 -875) (250 1750)) + ) + ) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(INV2 + + # Circuit boundary + rect((-1700 -2440) (3100 7820)) + + # Nets with their geometries + net(1 name($1) + rect(nwell (-1400 1800) (2800 3580)) + rect(diff_cont (-1510 -650) (220 220)) + rect(ntie (-510 -450) (800 680)) + ) + net(2 name(IN) + rect(poly (-525 -250) (250 2500)) + rect(poly (-1425 -630) (2100 360)) + rect(poly (-125 -2230) (250 2500)) + rect(poly (-1050 -3850) (250 2400)) + rect(poly (550 1200) (250 2400)) + rect(poly (-250 -6000) (250 2400)) + rect(poly (-1050 1200) (250 2400)) + rect(poly_lbl (-525 -2600) (0 0)) + rect(poly_cont (-830 -110) (220 220)) + ) + net(3 name(OUT) + rect(diff_cont (-910 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (1380 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -3820) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-1820 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(metal1 (1310 -3710) (360 2220)) + rect(metal1 (-1900 -800) (2220 360)) + rect(metal1 (-2280 -2400) (360 2840)) + rect(metal1 (-360 -3600) (360 1560)) + rect(metal1 (1240 2040) (360 1560)) + rect(metal1 (-360 -5160) (360 1560)) + rect(metal1 (-1960 2040) (360 1560)) + rect(metal1_lbl (1420 -2180) (0 0)) + rect(psd (-1850 525) (525 1750)) + rect(psd (1050 -1750) (525 1750)) + rect(nsd (-2100 -5350) (525 1750)) + rect(nsd (1050 -1750) (525 1750)) + ) + net(4 name(VSS) + rect(diff_cont (-110 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(metal1 (-290 -290) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(via1 (-305 -705) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 -1450) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(metal2 (-1525 -775) (2800 1700)) + rect(metal2_lbl (-160 -540) (0 0)) + rect(nsd (-1515 -1185) (550 1750)) + ) + net(5 name(VDD) + rect(diff_cont (-110 2490) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(metal1 (-290 -1490) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(via1 (-305 -1505) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(metal2 (-1525 -1575) (2800 1700)) + rect(metal2_lbl (-150 -1250) (0 0)) + rect(psd (-1525 -475) (550 1750)) + ) + net(6 name(BULK) + rect(diff_cont (-110 -2160) (220 220)) + rect(ptie (-510 -450) (800 680)) + ) + + # Outgoing pins and their connections to nets + pin(1) + pin(2 name(IN)) + pin(3 name(OUT)) + pin(4 name(VSS)) + pin(5 name(VDD)) + pin(6 name(BULK)) + + # Devices and their connections + device(1 D$PMOS + device(D$PMOS$1 location(800 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(-400 3200) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 3) + terminal(G 2) + terminal(D 5) + terminal(B 1) + ) + device(2 D$NMOS + device(D$NMOS$1 location(800 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(-400 -400) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 3) + terminal(G 2) + terminal(D 4) + terminal(B 6) + ) + + ) + circuit(INV2PAIR + + # Circuit boundary + rect((0 -1640) (5740 7820)) + + # Nets with their geometries + net(1 name(BULK)) + net(2 name($I6)) + net(3 name($I5)) + net(4 name($I4)) + net(5 name($I3)) + net(6 name($I2)) + net(7 name($I1)) + + # Outgoing pins and their connections to nets + pin(1 name(BULK)) + pin(2) + pin(3) + pin(4) + pin(5) + pin(6) + pin(7) + + # Subcircuits and their connections + circuit(1 INV2 location(1700 800) + pin(0 7) + pin(1 5) + pin(2 4) + pin(3 3) + pin(4 2) + pin(5 1) + ) + circuit(2 INV2 location(4340 800) + pin(0 7) + pin(1 4) + pin(2 6) + pin(3 3) + pin(4 2) + pin(5 1) + ) + + ) + circuit(RINGO + + # Circuit boundary + rect((-1720 -2440) (26880 7820)) + + # Nets with their geometries + net(1 name(FB) + rect(metal1 (-1700 1620) (360 360)) + rect(via1 (-305 -305) (250 250)) + rect(via1 (23190 -250) (250 250)) + rect(metal2 (-23765 -325) (23840 400)) + rect(metal2_lbl (-22120 -200) (0 0)) + ) + net(2 name(OSC) + rect(via1 (24435 1675) (250 250)) + rect(metal2 (-325 -325) (400 400)) + rect(metal2_lbl (-200 -200) (0 0)) + ) + net(3 name(VDD) + rect(metal1 (-180 3900) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal2_lbl (-23940 -2220) (0 0)) + ) + net(4 name(VSS) + rect(metal1 (-180 -2220) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal2_lbl (-23940 1100) (0 0)) + ) + net(5 name($I25)) + net(6 name($I24)) + net(7 name($I23)) + net(8 name($I22)) + net(9 name($I17)) + net(10 name($I11)) + net(11 name($I10)) + net(12 name($I9)) + + # Outgoing pins and their connections to nets + pin(1 name(FB)) + pin(2 name(OSC)) + pin(3 name(VDD)) + pin(4 name(VSS)) + + # Subcircuits and their connections + circuit(1 INV2PAIR location(19420 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 1) + pin(4 10) + pin(5 2) + pin(6 3) + ) + circuit(2 INV2PAIR location(-1700 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 8) + pin(4 1) + pin(5 9) + pin(6 3) + ) + circuit(3 INV2PAIR location(3580 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 7) + pin(4 9) + pin(5 12) + pin(6 3) + ) + circuit(4 INV2PAIR location(8860 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 6) + pin(4 12) + pin(5 11) + pin(6 3) + ) + circuit(5 INV2PAIR location(14140 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 5) + pin(4 11) + pin(5 10) + pin(6 3) + ) + + ) +) + +# Reference netlist +reference( + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(INV2 + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('5')) + net(6 name('6')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + pin(5 name('5')) + pin(6 name('6')) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 5) + terminal(G 2) + terminal(D 3) + terminal(B 1) + ) + device(2 NMOS + name($3) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 4) + terminal(G 2) + terminal(D 3) + terminal(B 6) + ) + + ) + circuit(INV2PAIR + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('5')) + net(6 name('6')) + net(7 name('7')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + pin(5 name('5')) + pin(6 name('6')) + pin(7 name('7')) + + # Subcircuits and their connections + circuit(1 INV2 name($1) + pin(0 7) + pin(1 5) + pin(2 4) + pin(3 3) + pin(4 2) + pin(5 1) + ) + circuit(2 INV2 name($2) + pin(0 7) + pin(1 4) + pin(2 6) + pin(3 3) + pin(4 2) + pin(5 1) + ) + + ) + circuit(RINGO + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('6')) + net(6 name('100')) + net(7 name('5')) + net(8 name('101')) + net(9 name('8')) + net(10 name('102')) + net(11 name('7')) + net(12 name('103')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + + # Subcircuits and their connections + circuit(1 INV2PAIR name($1) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 1) + pin(4 5) + pin(5 2) + pin(6 3) + ) + circuit(2 INV2PAIR name($2) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 6) + pin(4 1) + pin(5 7) + pin(6 3) + ) + circuit(3 INV2PAIR name($3) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 8) + pin(4 7) + pin(5 9) + pin(6 3) + ) + circuit(4 INV2PAIR name($4) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 10) + pin(4 9) + pin(5 11) + pin(6 3) + ) + circuit(5 INV2PAIR name($5) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 12) + pin(4 11) + pin(5 5) + pin(6 3) + ) + + ) +) + +# Cross reference +xref( + circuit(INV2 INV2 match + xref( + net(1 1 match) + net(6 6 match) + net(2 2 match) + net(3 3 match) + net(5 5 match) + net(4 4 match) + pin(0 0 match) + pin(5 5 match) + pin(1 1 match) + pin(2 2 match) + pin(4 4 match) + pin(3 3 match) + device(2 2 match) + device(1 1 match) + ) + ) + circuit(INV2PAIR INV2PAIR match + xref( + net(2 2 match) + net(3 3 match) + net(4 4 match) + net(5 5 match) + net(6 6 match) + net(7 7 match) + net(1 1 match) + pin(1 1 match) + pin(2 2 match) + pin(3 3 match) + pin(4 4 match) + pin(5 5 match) + pin(6 6 match) + pin(0 0 match) + circuit(1 1 match) + circuit(2 2 match) + ) + ) + circuit(RINGO RINGO match + xref( + net(8 6 match) + net(7 8 match) + net(6 10 match) + net(5 12 match) + net(9 7 match) + net(10 5 match) + net(11 11 match) + net(12 9 match) + net(1 1 match) + net(2 2 match) + net(3 3 match) + net(4 4 match) + pin(0 0 match) + pin(1 1 match) + pin(2 2 match) + pin(3 3 match) + circuit(1 1 match) + circuit(2 2 match) + circuit(3 3 match) + circuit(4 4 match) + circuit(5 5 match) + ) + ) +) diff --git a/testdata/algo/lvs_test2b_au.lvsdb.2 b/testdata/algo/lvs_test2b_au.lvsdb.2 new file mode 100644 index 000000000..8d6cd0db7 --- /dev/null +++ b/testdata/algo/lvs_test2b_au.lvsdb.2 @@ -0,0 +1,677 @@ +#%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(bulk) + layer(nwell '1/0') + layer(poly '3/0') + layer(poly_lbl '3/1') + layer(diff_cont '4/0') + layer(poly_cont '5/0') + layer(metal1 '6/0') + layer(metal1_lbl '6/1') + layer(via1 '7/0') + layer(metal2 '8/0') + layer(metal2_lbl '8/1') + layer(ntie) + layer(psd) + layer(ptie) + layer(nsd) + + # Mask layer connectivity + connect(nwell nwell ntie) + connect(poly poly poly_lbl poly_cont) + connect(poly_lbl poly) + connect(diff_cont diff_cont metal1 ntie psd ptie nsd) + connect(poly_cont poly poly_cont metal1) + connect(metal1 diff_cont poly_cont metal1 metal1_lbl via1) + connect(metal1_lbl metal1) + connect(via1 metal1 via1 metal2) + connect(metal2 via1 metal2 metal2_lbl) + connect(metal2_lbl metal2) + connect(ntie nwell diff_cont ntie) + connect(psd diff_cont psd) + connect(ptie diff_cont ptie) + connect(nsd diff_cont nsd) + + # Global nets and connectivity + global(bulk BULK) + global(ptie BULK) + + # 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(psd (-650 -875) (525 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(psd (125 -875) (550 1750)) + ) + terminal(B + rect(nwell (-125 -875) (250 1750)) + ) + ) + device(D$PMOS$1 PMOS + terminal(S + rect(psd (-675 -875) (550 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(psd (125 -875) (525 1750)) + ) + terminal(B + rect(nwell (-125 -875) (250 1750)) + ) + ) + device(D$NMOS NMOS + terminal(S + rect(nsd (-650 -875) (525 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(nsd (125 -875) (550 1750)) + ) + terminal(B + rect(bulk (-125 -875) (250 1750)) + ) + ) + device(D$NMOS$1 NMOS + terminal(S + rect(nsd (-675 -875) (550 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(nsd (125 -875) (525 1750)) + ) + terminal(B + rect(bulk (-125 -875) (250 1750)) + ) + ) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(INV2 + + # Circuit boundary + rect((-1700 -2440) (3100 7820)) + + # Nets with their geometries + net(1 name($1) + rect(nwell (-1400 1800) (2800 3580)) + rect(diff_cont (-1510 -650) (220 220)) + rect(ntie (-510 -450) (800 680)) + ) + net(2 name(IN) + rect(poly (-525 -250) (250 2500)) + rect(poly (-1425 -630) (2100 360)) + rect(poly (-125 -2230) (250 2500)) + rect(poly (-1050 -3850) (250 2400)) + rect(poly (550 1200) (250 2400)) + rect(poly (-250 -6000) (250 2400)) + rect(poly (-1050 1200) (250 2400)) + rect(poly_lbl (-525 -2600) (0 0)) + rect(poly_cont (-830 -110) (220 220)) + ) + net(3 name(OUT) + rect(diff_cont (-910 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (1380 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -3820) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-1820 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(metal1 (1310 -3710) (360 2220)) + rect(metal1 (-1900 -800) (2220 360)) + rect(metal1 (-2280 -2400) (360 2840)) + rect(metal1 (-360 -3600) (360 1560)) + rect(metal1 (1240 2040) (360 1560)) + rect(metal1 (-360 -5160) (360 1560)) + rect(metal1 (-1960 2040) (360 1560)) + rect(metal1_lbl (1420 -2180) (0 0)) + rect(psd (-1850 525) (525 1750)) + rect(psd (1050 -1750) (525 1750)) + rect(nsd (-2100 -5350) (525 1750)) + rect(nsd (1050 -1750) (525 1750)) + ) + net(4 name(VSS) + rect(diff_cont (-110 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(metal1 (-290 -290) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(via1 (-305 -705) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 -1450) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(metal2 (-1525 -775) (2800 1700)) + rect(metal2_lbl (-160 -540) (0 0)) + rect(nsd (-1515 -1185) (550 1750)) + ) + net(5 name(VDD) + rect(diff_cont (-110 2490) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(metal1 (-290 -1490) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(via1 (-305 -1505) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(metal2 (-1525 -1575) (2800 1700)) + rect(metal2_lbl (-150 -1250) (0 0)) + rect(psd (-1525 -475) (550 1750)) + ) + net(6 name(BULK) + rect(diff_cont (-110 -2160) (220 220)) + rect(ptie (-510 -450) (800 680)) + ) + + # Outgoing pins and their connections to nets + pin(1) + pin(2 name(IN)) + pin(3 name(OUT)) + pin(4 name(VSS)) + pin(5 name(VDD)) + pin(6 name(BULK)) + + # Devices and their connections + device(1 D$PMOS + device(D$PMOS$1 location(800 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(-400 3200) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 3) + terminal(G 2) + terminal(D 5) + terminal(B 1) + ) + device(2 D$NMOS + device(D$NMOS$1 location(800 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(-400 -400) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 3) + terminal(G 2) + terminal(D 4) + terminal(B 6) + ) + + ) + circuit(INV2PAIR + + # Circuit boundary + rect((0 -1640) (5740 7820)) + + # Nets with their geometries + net(1 name(BULK)) + net(2 name($I6)) + net(3 name($I5)) + net(4 name($I4)) + net(5 name($I3)) + net(6 name($I2)) + net(7 name($I1)) + + # Outgoing pins and their connections to nets + pin(1 name(BULK)) + pin(2) + pin(3) + pin(4) + pin(5) + pin(6) + pin(7) + + # Subcircuits and their connections + circuit(1 INV2 location(1700 800) + pin(0 7) + pin(1 5) + pin(2 4) + pin(3 3) + pin(4 2) + pin(5 1) + ) + circuit(2 INV2 location(4340 800) + pin(0 7) + pin(1 4) + pin(2 6) + pin(3 3) + pin(4 2) + pin(5 1) + ) + + ) + circuit(RINGO + + # Circuit boundary + rect((-1720 -2440) (26880 7820)) + + # Nets with their geometries + net(1 name(FB) + rect(metal1 (-1700 1620) (360 360)) + rect(via1 (-305 -305) (250 250)) + rect(via1 (23190 -250) (250 250)) + rect(metal2 (-23765 -325) (23840 400)) + rect(metal2_lbl (-22120 -200) (0 0)) + ) + net(2 name(OSC) + rect(via1 (24435 1675) (250 250)) + rect(metal2 (-325 -325) (400 400)) + rect(metal2_lbl (-200 -200) (0 0)) + ) + net(3 name(VDD) + rect(metal1 (-180 3900) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal2_lbl (-23940 -2220) (0 0)) + ) + net(4 name(VSS) + rect(metal1 (-180 -2220) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal2_lbl (-23940 1100) (0 0)) + ) + net(5 name($I25)) + net(6 name($I24)) + net(7 name($I23)) + net(8 name($I22)) + net(9 name($I17)) + net(10 name($I11)) + net(11 name($I10)) + net(12 name($I9)) + + # Outgoing pins and their connections to nets + pin(1 name(FB)) + pin(2 name(OSC)) + pin(3 name(VDD)) + pin(4 name(VSS)) + + # Subcircuits and their connections + circuit(1 INV2PAIR location(19420 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 1) + pin(4 10) + pin(5 2) + pin(6 3) + ) + circuit(2 INV2PAIR location(-1700 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 8) + pin(4 1) + pin(5 9) + pin(6 3) + ) + circuit(3 INV2PAIR location(3580 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 7) + pin(4 9) + pin(5 12) + pin(6 3) + ) + circuit(4 INV2PAIR location(8860 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 6) + pin(4 12) + pin(5 11) + pin(6 3) + ) + circuit(5 INV2PAIR location(14140 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 5) + pin(4 11) + pin(5 10) + pin(6 3) + ) + + ) +) + +# Reference netlist +reference( + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(INV2 + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('5')) + net(6 name('6')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + pin(5 name('5')) + pin(6 name('6')) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 5) + terminal(G 2) + terminal(D 3) + terminal(B 1) + ) + device(2 NMOS + name($3) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 4) + terminal(G 2) + terminal(D 3) + terminal(B 6) + ) + + ) + circuit(INV2PAIR + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('5')) + net(6 name('6')) + net(7 name('7')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + pin(5 name('5')) + pin(6 name('6')) + pin(7 name('7')) + + # Subcircuits and their connections + circuit(1 INV2 name($2) + pin(0 7) + pin(1 4) + pin(2 6) + pin(3 3) + pin(4 2) + pin(5 1) + ) + + ) + circuit(INV2PAIRX + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('5')) + net(6 name('6')) + net(7 name('7')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + pin(5 name('5')) + pin(6 name('6')) + pin(7 name('7')) + + # Subcircuits and their connections + circuit(1 INV2 name($2) + pin(0 7) + pin(1 4) + pin(2 6) + pin(3 3) + pin(4 2) + pin(5 1) + ) + + ) + circuit(RINGO + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('6')) + net(6 name('5')) + net(7 name('101')) + net(8 name('8')) + net(9 name('102')) + net(10 name('7')) + net(11 name('103')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + + # Subcircuits and their connections + circuit(1 INV2PAIR name($1) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 1) + pin(4 5) + pin(5 2) + pin(6 3) + ) + circuit(2 INV2PAIR name($2) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 1) + pin(4 1) + pin(5 6) + pin(6 3) + ) + circuit(3 INV2PAIR name($3) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 7) + pin(4 6) + pin(5 8) + pin(6 3) + ) + circuit(4 INV2PAIR name($4) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 9) + pin(4 8) + pin(5 10) + pin(6 3) + ) + circuit(5 INV2PAIR name($5) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 11) + pin(4 10) + pin(5 5) + pin(6 3) + ) + + ) +) + +# Cross reference +xref( + circuit(() INV2PAIRX mismatch + xref( + ) + ) + circuit(INV2 INV2 match + xref( + net(1 1 match) + net(6 6 match) + net(2 2 match) + net(3 3 match) + net(5 5 match) + net(4 4 match) + pin(0 0 match) + pin(5 5 match) + pin(1 1 match) + pin(2 2 match) + pin(4 4 match) + pin(3 3 match) + device(2 2 match) + device(1 1 match) + ) + ) + circuit(INV2PAIR INV2PAIR nomatch + xref( + net(2 2 mismatch) + net(3 3 mismatch) + net(4 4 mismatch) + net(5 5 mismatch) + net(6 6 match) + net(7 7 mismatch) + net(1 1 mismatch) + pin(1 1 match) + pin(2 2 match) + pin(3 3 match) + pin(4 4 match) + pin(5 5 match) + pin(6 6 match) + pin(0 0 match) + circuit(1 () mismatch) + circuit(2 1 match) + ) + ) + circuit(RINGO RINGO nomatch + log( + entry(error description('Net $I22 is not matching any net from reference netlist')) + entry(error description('Net FB is not matching any net from reference netlist')) + ) + xref( + net(8 () mismatch) + net(7 7 match) + net(6 9 match) + net(5 11 match) + net(9 6 match) + net(10 5 match) + net(11 10 match) + net(12 8 match) + net(1 1 mismatch) + net(2 2 match) + net(3 3 match) + net(4 4 match) + pin(0 0 match) + pin(1 1 match) + pin(2 2 match) + pin(3 3 match) + circuit(() 2 mismatch) + circuit(2 () mismatch) + circuit(1 1 match) + circuit(3 3 match) + circuit(4 4 match) + circuit(5 5 match) + ) + ) +) From b324f3f5ccc7a4a52924f9245e51f07066cd6c00 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Mon, 5 Jan 2026 15:47:02 +0100 Subject: [PATCH 13/19] Bugfix/enhancement: keeping clusters and nets in sync when joining nets. This will enhance robustness under presence of soft connection errors --- src/db/db/dbCircuit.cc | 10 +- src/db/db/dbHierNetworkProcessor.cc | 56 +++++++- src/db/db/dbHierNetworkProcessor.h | 11 ++ src/db/db/dbLayoutToNetlist.cc | 16 +++ src/db/unit_tests/dbLayoutToNetlistTests.cc | 108 +++++++++++++- src/tl/tl/tlSList.h | 148 +++++++++++--------- testdata/algo/device_extract_l15.gds | Bin 0 -> 4024 bytes 7 files changed, 274 insertions(+), 75 deletions(-) create mode 100644 testdata/algo/device_extract_l15.gds diff --git a/src/db/db/dbCircuit.cc b/src/db/db/dbCircuit.cc index 47237e579..17965840d 100644 --- a/src/db/db/dbCircuit.cc +++ b/src/db/db/dbCircuit.cc @@ -407,14 +407,16 @@ void Circuit::join_nets (Net *net, Net *with) subcircuit->connect_pin (with->begin_subcircuit_pins ()->pin_id (), net); } - while (with->begin_pins () != with->end_pins ()) { - join_pin_with_net (with->begin_pins ()->pin_id (), net); - } - if (netlist ()->callbacks ()) { netlist ()->callbacks ()->link_nets (net, with); } + // NOTE: this needs to happen after the callback was called because further up in the + // hierarchy we want the clusters to be joined already + while (with->begin_pins () != with->end_pins ()) { + join_pin_with_net (with->begin_pins ()->pin_id (), net); + } + // create a new name for the joined net net->set_name (join_names (net->name (), with->name ())); diff --git a/src/db/db/dbHierNetworkProcessor.cc b/src/db/db/dbHierNetworkProcessor.cc index bb60fa35e..256e87ad7 100644 --- a/src/db/db/dbHierNetworkProcessor.cc +++ b/src/db/db/dbHierNetworkProcessor.cc @@ -1577,6 +1577,38 @@ connected_clusters::add_connection (typename local_cluster::id_type id, co m_rev_connections [inst] = id; } +template +void +connected_clusters::rename_connection (const ClusterInstance &inst, typename local_cluster::id_type to_id) +{ + ClusterInstance new_inst (to_id, inst); + + auto rc = m_rev_connections.find (inst); + if (rc == m_rev_connections.end ()) { + return; // TODO: assert? + } + + auto id = rc->second; + + // TODO: this linear search may be slow + auto &connections = m_connections [id]; + for (auto i = connections.begin (); i != connections.end (); ++i) { + if (*i == inst) { + *i = new_inst; + break; + } + } + + m_rev_connections.erase (rc); + + // NOTE: if a connection to the new cluster already exists, we will not insert here. + // This may mean we are connecting two clusters here on parent level. In the netlist, this + // is reflected by having multiple upward pins. Right now, we cannot reflect this case + // in the reverse connection structures and keep the first one only in the reverse + // lookup. + m_rev_connections.insert (std::make_pair (new_inst, id)); +} + template void connected_clusters::join_cluster_with (typename local_cluster::id_type id, typename local_cluster::id_type with_id) @@ -1595,15 +1627,35 @@ connected_clusters::join_cluster_with (typename local_cluster::id_type id, connections_type &to_join = tc->second; for (connections_type::const_iterator c = to_join.begin (); c != to_join.end (); ++c) { - m_rev_connections [*c] = id; + m_rev_connections.insert (std::make_pair (*c, id)); } connections_type &target = m_connections [id]; - target.splice (to_join); + + if (target.empty ()) { + + target.swap (to_join); + + } else if (! to_join.empty ()) { + + // Join while removing duplicates + std::set in_target (target.begin (), target.end ()); + for (auto j = to_join.begin (); j != to_join.end (); ++j) { + if (in_target.find (*j) == in_target.end ()) { + target.push_back (*j); + } + } + + } m_connections.erase (tc); } + + if (m_connected_clusters.find (with_id) != m_connected_clusters.end ()) { + m_connected_clusters.insert (id); + m_connected_clusters.erase (with_id); + } } template diff --git a/src/db/db/dbHierNetworkProcessor.h b/src/db/db/dbHierNetworkProcessor.h index d625a78d3..2bc31bb06 100644 --- a/src/db/db/dbHierNetworkProcessor.h +++ b/src/db/db/dbHierNetworkProcessor.h @@ -844,6 +844,12 @@ public: // .. nothing yet .. } + ClusterInstance (size_t id, const db::ClusterInstElement &inst_element) + : ClusterInstElement (inst_element), m_id (id) + { + // .. nothing yet .. + } + ClusterInstance (size_t id) : ClusterInstElement (), m_id (id) { @@ -1255,6 +1261,11 @@ public: */ void add_connection (typename local_cluster::id_type, const ClusterInstance &inst); + /** + * @brief Changes the cluster ID of the connection + */ + void rename_connection (const ClusterInstance &inst, typename local_cluster::id_type to_id); + /** * @brief Joins the cluster id with the cluster with_id * diff --git a/src/db/db/dbLayoutToNetlist.cc b/src/db/db/dbLayoutToNetlist.cc index 52637e829..9ca1c1f9f 100644 --- a/src/db/db/dbLayoutToNetlist.cc +++ b/src/db/db/dbLayoutToNetlist.cc @@ -218,6 +218,22 @@ void LayoutToNetlist::link_nets (const db::Net *net, const db::Net *with) connected_clusters &clusters = m_net_clusters.clusters_per_cell (net->circuit ()->cell_index ()); clusters.join_cluster_with (net->cluster_id (), with->cluster_id ()); + + // fix the connections from the parents + + const db::Cell &cc = internal_layout ()->cell (net->circuit ()->cell_index ()); + + for (db::Cell::parent_inst_iterator p = cc.begin_parent_insts (); ! p.at_end (); ++p) { + + connected_clusters &pclusters = m_net_clusters.clusters_per_cell (p->parent_cell_index ()); + + db::CellInstArray ci = p->child_inst ().cell_inst (); + for (db::CellInstArray::iterator ia = ci.begin (); ! ia.at_end(); ++ia) { + db::ClusterInstance cli (with->cluster_id (), ci.object ().cell_index (), ci.complex_trans (*ia), p->child_inst ().prop_id ()); + pclusters.rename_connection (cli, net->cluster_id ()); + } + + } } size_t LayoutToNetlist::link_net_to_parent_circuit (const Net *subcircuit_net, Circuit *parent_circuit, const DCplxTrans &dtrans) diff --git a/src/db/unit_tests/dbLayoutToNetlistTests.cc b/src/db/unit_tests/dbLayoutToNetlistTests.cc index 2ed2ebf85..29f947573 100644 --- a/src/db/unit_tests/dbLayoutToNetlistTests.cc +++ b/src/db/unit_tests/dbLayoutToNetlistTests.cc @@ -3388,7 +3388,112 @@ TEST(14_JoinNets) db::compare_layouts (_this, ly, au); } -TEST(15_MeasureNet) +TEST(15_JoinNetsAfterExtraction) +{ + db::Layout ly; + TestRig test_rig (ly); + + { + db::LoadLayoutOptions options; + options.get_options ().layer_map = test_rig.lmap (); + options.get_options ().create_other_layers = false; + + std::string fn (tl::testdata ()); + fn = tl::combine_path (fn, "algo"); + fn = tl::combine_path (fn, "device_extract_l15.gds"); + + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly, options); + } + + std::unique_ptr l2n (test_rig.make_l2n ()); + + l2n->extract_netlist (); + + db::Netlist *nl = l2n->netlist (); + + EXPECT_EQ (nl->to_string (), + "circuit TOP ();\n" + " subcircuit A $1 (NET1=A,NET2=B);\n" + "end;\n" + "circuit A (NET1=NET1,NET2=NET2);\n" + "end;\n" + ); + + db::Circuit *top_circuit = nl->circuit_by_name ("TOP"); + db::Circuit *a_circuit = nl->circuit_by_name ("A"); + + auto &top_cc = l2n->net_clusters ().clusters_per_cell (top_circuit->cell_index ()); + auto &a_cc = l2n->net_clusters ().clusters_per_cell (a_circuit->cell_index ()); + + db::Net *a_net1 = a_circuit->net_by_name ("NET1"); + db::Net *a_net2 = a_circuit->net_by_name ("NET2"); + db::Net *a_net3 = a_circuit->net_by_name ("NET3"); + tl_assert (a_net1 != 0); + tl_assert (a_net2 != 0); + tl_assert (a_net3 != 0); + + db::Net *top_neta = top_circuit->net_by_name ("A"); + db::Net *top_netb = top_circuit->net_by_name ("B"); + tl_assert (top_neta != 0); + tl_assert (top_netb != 0); + + auto cid1 = a_net1->cluster_id (); + auto cid2 = a_net2->cluster_id (); + auto cid3 = a_net3->cluster_id (); + + EXPECT_EQ (a_cc.is_root (cid1), false); + EXPECT_EQ (a_cc.is_root (cid2), false); + EXPECT_EQ (a_cc.is_root (cid3), true); + + // Join local NET3 and NET2 which has upward connections + + a_circuit->join_nets (a_net3, a_net2); + + EXPECT_EQ (nl->to_string (), + "circuit TOP ();\n" + " subcircuit A $1 (NET1=A,NET2=B);\n" + "end;\n" + "circuit A (NET1=NET1,NET2='NET2,NET3');\n" + "end;\n" + ); + + EXPECT_EQ (a_cc.is_root (cid3), false); + + // B net from top circuit has connections to NET2 which must have changed to NET3 + + const auto &b_conn = top_cc.connections_for_cluster (top_netb->cluster_id ()); + tl_assert (b_conn.size () == size_t (1)); + EXPECT_EQ (b_conn.front ().inst_trans ().to_string (), "r0 *1 -8000,3000"); + EXPECT_EQ (b_conn.front ().inst_cell_index (), a_circuit->cell_index ()); + EXPECT_EQ (b_conn.front ().id (), a_net3->cluster_id ()); + EXPECT_EQ (top_cc.find_cluster_with_connection (b_conn.front ()), top_netb->cluster_id ()); + + // Now join NET1 and NET3 in circuit A which effectively shortens A and B in TOP + + a_circuit->join_nets (a_net3, a_net1); + + EXPECT_EQ (nl->to_string (), + "circuit TOP ();\n" + " subcircuit A $1 ('NET1,NET2'='A,B');\n" + "end;\n" + "circuit A ('NET1,NET2'='NET1,NET2,NET3');\n" + "end;\n" + ); + + const db::Net *top_netab = top_circuit->net_by_name ("A,B"); + tl_assert (top_netab != 0); + + const auto &ab_conn = top_cc.connections_for_cluster (top_netab->cluster_id ()); + tl_assert (ab_conn.size () == size_t (1)); + EXPECT_EQ (ab_conn.front ().inst_trans ().to_string (), "r0 *1 -8000,3000"); + EXPECT_EQ (ab_conn.front ().inst_cell_index (), a_circuit->cell_index ()); + EXPECT_EQ (ab_conn.front ().id (), a_net3->cluster_id ()); + EXPECT_EQ (top_cc.find_cluster_with_connection (ab_conn.front ()), top_netab->cluster_id ()); +} + +TEST(20_MeasureNet) { db::Layout ly; db::LayerMap lmap; @@ -3487,3 +3592,4 @@ TEST(15_MeasureNet) db::compare_layouts (_this, ly, au, db::NoNormalization); } + diff --git a/src/tl/tl/tlSList.h b/src/tl/tl/tlSList.h index 1d28570a9..a5412e40a 100644 --- a/src/tl/tl/tlSList.h +++ b/src/tl/tl/tlSList.h @@ -46,78 +46,90 @@ namespace tl * - empty */ +template +struct slist_node_type +{ + slist_node_type (const T &_t) : next (0), t (_t) { } + slist_node_type (T &&_t) : next (0), t (_t) { } + slist_node_type *next; + T t; +}; + +template +class slist_const_iterator; + +template +class slist_iterator +{ +public: + typedef slist_node_type node_type; + typedef std::forward_iterator_tag iterator_category; + typedef T value_type; + typedef T &reference; + typedef T *pointer; + typedef void difference_type; + + slist_iterator (node_type *p = 0) : mp_p (p) { } + slist_iterator operator++ () { mp_p = mp_p->next; return *this; } + + T *operator-> () const + { + return &mp_p->t; + } + + T &operator* () const + { + return mp_p->t; + } + + bool operator== (slist_iterator other) const { return mp_p == other.mp_p; } + bool operator!= (slist_iterator other) const { return mp_p != other.mp_p; } + +private: + friend class slist_const_iterator; + node_type *mp_p; +}; + +template +class slist_const_iterator +{ +public: + typedef slist_node_type node_type; + typedef std::forward_iterator_tag iterator_category; + typedef const T value_type; + typedef const T &reference; + typedef const T *pointer; + typedef void difference_type; + + slist_const_iterator (slist_iterator i) : mp_p (i.mp_p) { } + slist_const_iterator (const node_type *p = 0) : mp_p (p) { } + slist_const_iterator operator++ () { mp_p = mp_p->next; return *this; } + + const T *operator-> () const + { + return &mp_p->t; + } + + const T &operator* () const + { + return mp_p->t; + } + + bool operator== (slist_const_iterator other) const { return mp_p == other.mp_p; } + bool operator!= (slist_const_iterator other) const { return mp_p != other.mp_p; } + +private: + const node_type *mp_p; +}; + template class slist { -private: - struct node_type - { - node_type (const T &_t) : next (0), t (_t) { } - node_type (T &&_t) : next (0), t (_t) { } - node_type *next; - T t; - }; - public: - class const_iterator; - - class iterator - { - public: - typedef std::forward_iterator_tag category; - typedef T value_type; - typedef T &reference; - typedef T *pointer; - - iterator (node_type *p = 0) : mp_p (p) { } - iterator operator++ () { mp_p = mp_p->next; return *this; } - - T *operator-> () const - { - return &mp_p->t; - } - - T &operator* () const - { - return mp_p->t; - } - - bool operator== (iterator other) const { return mp_p == other.mp_p; } - bool operator!= (iterator other) const { return mp_p != other.mp_p; } - - private: - friend class slist::const_iterator; - node_type *mp_p; - }; - - class const_iterator - { - public: - typedef std::forward_iterator_tag category; - typedef const T value_type; - typedef const T &reference; - typedef const T *pointer; - - const_iterator (iterator i) : mp_p (i.mp_p) { } - const_iterator (const node_type *p = 0) : mp_p (p) { } - const_iterator operator++ () { mp_p = mp_p->next; return *this; } - - const T *operator-> () const - { - return &mp_p->t; - } - - const T &operator* () const - { - return mp_p->t; - } - - bool operator== (const_iterator other) const { return mp_p == other.mp_p; } - bool operator!= (const_iterator other) const { return mp_p != other.mp_p; } - - private: - const node_type *mp_p; - }; + typedef slist_node_type node_type; + typedef T value_type; + typedef slist_const_iterator const_iterator; + typedef slist_iterator iterator; slist () : mp_first (0), mp_last (0), m_size (0) diff --git a/testdata/algo/device_extract_l15.gds b/testdata/algo/device_extract_l15.gds new file mode 100644 index 0000000000000000000000000000000000000000..b9fa14783b3860c70d395bd38c0281cba01c353e GIT binary patch literal 4024 zcma);U1%It6vxlZ&fb~*NL!Q88jba%6+~jxrdDjRBr&NC2}wz|v4%kM=!+m2q=-sU z3u+Mxib(V!h}MU`36?_hARCuCQWwypE+}OX104LF6{o6bMOD2 zb3e|xmkhb?IqG#>{~vOwNLAWT52XK7;F^iCVWRFr@#N5l&yN56?Z$H>*PmSZVy;HL zMZ2zSOl^8-a)!tYh)jn|E}1qYPpEd9v+2?I5op$g;T5pK{)K9{`)3{d7dppShi^=^ zxA-^d`R}a4|NB_KRp{P=@54&9Gc)n0^zi+A)DE%^>p!AYd!jGN{uN^X=3(B&U~d7x zThzUeNnyBMXA%`260bhxo)2TpP_nm~*b09W`Rf=7+`B^b;9x?vgXy!8(La7$^i0;D zI+Kv~al2K|ez_0x$W8IDR6Cf~`^nxk$B)Kf|EyJ7{ActBUX%El?dBi1Tm5r8$H~;V zm1@`ctFpIPzx^&MfH~k$Kvmw;%Jt|Q^q9%f+S4*yd++0)r+OdRtv8R|Und!RKzi?T zUIJsrCTB5nnW)^UwFQyloMN8%MC;MMwY<@$)!gS?AepOk*)l>)9~~#o2t9SFjBsAz z`W9sY5%%3%#KEw@drr`hvC)-(41sqES=*@z-UzBPGEqbimS6IJgp^v+I z>m9@sQ|)FsqfgZ^?CpD4pBuvPd+g)e_#ad4jT?D-XvSHO*hg8PQ0+9HuPfqGbT3o^6 zYEVvgGYs#1hU~c}>_Ap{OGHYw2iG#Qsbuy1QV_j+9D3}gQ0>f2oQOSpBS3u+>wrLd z%-cRJ&%IsmZWQX9QST8vF4Dbm((fAkUCihgD&w|!X>?*D?!Wt;P@6h~z7-tS zPJT}WU3`l<)XVom{Rh62TA5j;OwQkail-Nb%=^#r|AcCXDV;MZz1*0r;oFV%UC3dj z+Es5~x9xjza@P6e@cSrljpcP9eTViF4-@s@)9QPv630tS4f!ei5fosrD9qrebe? z0{tcU2mOnf_s0pvox5rj_ULO=_&;+iT9g|L8;B*~ep53q#AmN1gPS=dRsYnmtdy-6&SG92ZH|T) OC--YsP*g Date: Sun, 11 Jan 2026 20:53:18 +0100 Subject: [PATCH 14/19] Improving solution for net cluster renaming for join_nets --- src/db/db/dbHierNetworkProcessor.cc | 62 +++++++++++++++++++++-------- src/db/db/dbLayoutToNetlist.cc | 2 +- src/tl/tl/tlSList.h | 13 ++++++ src/tl/unit_tests/tlSListTests.cc | 10 +++++ 4 files changed, 69 insertions(+), 18 deletions(-) diff --git a/src/db/db/dbHierNetworkProcessor.cc b/src/db/db/dbHierNetworkProcessor.cc index 256e87ad7..07166fa44 100644 --- a/src/db/db/dbHierNetworkProcessor.cc +++ b/src/db/db/dbHierNetworkProcessor.cc @@ -1581,6 +1581,10 @@ template void connected_clusters::rename_connection (const ClusterInstance &inst, typename local_cluster::id_type to_id) { + if (inst.id () == to_id) { + return; // nothing to do + } + ClusterInstance new_inst (to_id, inst); auto rc = m_rev_connections.find (inst); @@ -1589,24 +1593,48 @@ connected_clusters::rename_connection (const ClusterInstance &inst, typename } auto id = rc->second; - - // TODO: this linear search may be slow - auto &connections = m_connections [id]; - for (auto i = connections.begin (); i != connections.end (); ++i) { - if (*i == inst) { - *i = new_inst; - break; - } - } - m_rev_connections.erase (rc); - // NOTE: if a connection to the new cluster already exists, we will not insert here. - // This may mean we are connecting two clusters here on parent level. In the netlist, this - // is reflected by having multiple upward pins. Right now, we cannot reflect this case - // in the reverse connection structures and keep the first one only in the reverse - // lookup. - m_rev_connections.insert (std::make_pair (new_inst, id)); + auto &connections = m_connections [id]; + + auto rc_exists = m_rev_connections.find (new_inst); + if (rc_exists != m_rev_connections.end ()) { + + // NOTE: possibly a different connection to the new cluster already exists (i.e. + // rc_exists->second != id). + // This may mean we are connecting two clusters here on parent level. In the netlist, this + // is reflected by having multiple upward pins. Right now, we cannot reflect this case + // in the reverse connection structures and keep the existing one only in the reverse + // lookup. + + // Remove to original connections downwards + // TODO: this linear search may be slow + for (auto i = connections.begin (), ii = connections.begin (); i != connections.end (); ii = i, ++i) { + if (*i == inst) { + if (ii == i) { + connections.pop_front (); + } else { + connections.erase_after (ii); + } + break; + } + } + + } else { + + m_rev_connections.insert (std::make_pair (new_inst, id)); + + // Replace connections downwards + // TODO: this linear search may be slow + for (auto i = connections.begin (); i != connections.end (); ++i) { + if (*i == inst) { + *i = new_inst; + break; + } + } + + } + } template @@ -1627,7 +1655,7 @@ connected_clusters::join_cluster_with (typename local_cluster::id_type id, connections_type &to_join = tc->second; for (connections_type::const_iterator c = to_join.begin (); c != to_join.end (); ++c) { - m_rev_connections.insert (std::make_pair (*c, id)); + m_rev_connections [*c] = id; } connections_type &target = m_connections [id]; diff --git a/src/db/db/dbLayoutToNetlist.cc b/src/db/db/dbLayoutToNetlist.cc index 9ca1c1f9f..db8e9d146 100644 --- a/src/db/db/dbLayoutToNetlist.cc +++ b/src/db/db/dbLayoutToNetlist.cc @@ -212,7 +212,7 @@ void LayoutToNetlist::link_nets (const db::Net *net, const db::Net *with) { if (! net->circuit () || net->circuit () != with->circuit () || ! internal_layout () || ! internal_layout ()->is_valid_cell_index (net->circuit ()->cell_index ()) - || net->cluster_id () == 0 || with->cluster_id () == 0) { + || net->cluster_id () == 0 || with->cluster_id () == 0 || net == with) { return; } diff --git a/src/tl/tl/tlSList.h b/src/tl/tl/tlSList.h index a5412e40a..b387f9e57 100644 --- a/src/tl/tl/tlSList.h +++ b/src/tl/tl/tlSList.h @@ -46,6 +46,8 @@ namespace tl * - empty */ +template class slist; + template struct slist_node_type { @@ -87,6 +89,7 @@ public: private: friend class slist_const_iterator; + friend class slist; node_type *mp_p; }; @@ -119,6 +122,7 @@ public: bool operator!= (slist_const_iterator other) const { return mp_p != other.mp_p; } private: + friend class slist; const node_type *mp_p; }; @@ -304,6 +308,15 @@ public: other.m_size = 0; } + void erase_after (iterator at) + { + node_type *n = at.mp_p->next; + if (n) { + at.mp_p->next = n->next; + delete n; + } + } + private: node_type *mp_first, *mp_last; size_t m_size; diff --git a/src/tl/unit_tests/tlSListTests.cc b/src/tl/unit_tests/tlSListTests.cc index 78b94df80..636f70028 100644 --- a/src/tl/unit_tests/tlSListTests.cc +++ b/src/tl/unit_tests/tlSListTests.cc @@ -105,6 +105,16 @@ TEST(1_Basic) EXPECT_EQ (l2s (l2), "17,42"); l2.pop_front (); EXPECT_EQ (l2s (l2), "42"); + l2.push_front (MyClass1 (11)); + EXPECT_EQ (l2s (l2), "11,42"); + l2.erase_after (l2.begin ()); + EXPECT_EQ (l2s (l2), "11"); + l2.erase_after (l2.begin ()); // ignored + EXPECT_EQ (l2s (l2), "11"); + l2.pop_front (); + EXPECT_EQ (l2s (l2), ""); + EXPECT_EQ (l2.empty (), true); + l2.push_front (MyClass1 (42)); l3.push_back (MyClass1 (2)); l3.push_front (MyClass1 (1)); From 5278b276838d6714f9ce36f32cf7c4275d204191 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 25 Jan 2026 19:30:08 +0100 Subject: [PATCH 15/19] Following up on a number of Magic reader issues found in the course of issue #2263 * The original issue ("sw" etc for "tri") * Implementing "magscale" * Interpolation of environment variables on paths * Warnings include file positions now * Ignoring "<< properties >>" pseudo-layer * MAG writer uses zero-area boxes for empty ones * New test --- .../streamers/magic/db_plugin/dbMAGReader.cc | 115 ++++++++++++++---- .../streamers/magic/db_plugin/dbMAGReader.h | 8 +- .../streamers/magic/db_plugin/dbMAGWriter.cc | 37 ++++-- .../streamers/magic/unit_tests/dbMAGReader.cc | 29 +++-- testdata/magic/gf180mcu_ocd_sram_test.cif.gz | Bin 0 -> 97041 bytes .../chip_half_frame.mag.gz | Bin 0 -> 17761 bytes .../chip_half_frame_bad.mag.gz | Bin 0 -> 8605 bytes .../constant_block.mag.gz | Bin 0 -> 528 bytes .../copyright_block.mag.gz | Bin 0 -> 940 bytes .../magic/font_20.mag | 6 + .../magic/font_21.mag | 10 ++ .../magic/font_22.mag | 10 ++ .../magic/font_23.mag | 16 +++ .../magic/font_24.mag | 21 ++++ .../magic/font_25.mag | 25 ++++ .../magic/font_26.mag | 32 +++++ .../magic/font_27.mag | 10 ++ .../magic/font_28.mag | 15 +++ .../magic/font_29.mag | 15 +++ .../magic/font_2A.mag | 13 ++ .../magic/font_2B.mag | 11 ++ .../magic/font_2C.mag | 10 ++ .../magic/font_2D.mag | 9 ++ .../magic/font_2E.mag | 9 ++ .../magic/font_2F.mag | 21 ++++ .../magic/font_30.mag | 12 ++ .../magic/font_31.mag | 12 ++ .../magic/font_32.mag | 13 ++ .../magic/font_33.mag | 13 ++ .../magic/font_34.mag | 12 ++ .../magic/font_35.mag | 13 ++ .../magic/font_36.mag | 14 +++ .../magic/font_37.mag | 10 ++ .../magic/font_38.mag | 15 +++ .../magic/font_39.mag | 13 ++ .../magic/font_3A.mag | 10 ++ .../magic/font_3B.mag | 11 ++ .../magic/font_3C.mag | 21 ++++ .../magic/font_3D.mag | 10 ++ .../magic/font_3E.mag | 21 ++++ .../magic/font_3F.mag | 18 +++ .../magic/font_40.mag | 33 +++++ .../magic/font_41.mag | 16 +++ .../magic/font_42.mag | 19 +++ .../magic/font_43.mag | 15 +++ .../magic/font_44.mag | 16 +++ .../magic/font_45.mag | 13 ++ .../magic/font_46.mag | 12 ++ .../magic/font_47.mag | 17 +++ .../magic/font_48.mag | 13 ++ .../magic/font_49.mag | 11 ++ .../magic/font_4A.mag | 13 ++ .../magic/font_4B.mag | 17 +++ .../magic/font_4C.mag | 10 ++ .../magic/font_4D.mag | 16 +++ .../magic/font_4E.mag | 15 +++ .../magic/font_4F.mag | 16 +++ .../magic/font_50.mag | 17 +++ .../magic/font_51.mag | 16 +++ .../magic/font_52.mag | 22 ++++ .../magic/font_53.mag | 20 +++ .../magic/font_54.mag | 10 ++ .../magic/font_55.mag | 13 ++ .../magic/font_56.mag | 14 +++ .../magic/font_57.mag | 16 +++ .../magic/font_58.mag | 17 +++ .../magic/font_59.mag | 14 +++ .../magic/font_5A.mag | 19 +++ .../magic/font_5B.mag | 11 ++ .../magic/font_5C.mag | 21 ++++ .../magic/font_5D.mag | 11 ++ .../magic/font_5E.mag | 10 ++ .../magic/font_5F.mag | 9 ++ .../magic/font_60.mag | 10 ++ .../magic/font_61.mag | 17 +++ .../magic/font_62.mag | 17 +++ .../magic/font_63.mag | 17 +++ .../magic/font_64.mag | 17 +++ .../magic/font_65.mag | 17 +++ .../magic/font_66.mag | 13 ++ .../magic/font_67.mag | 20 +++ .../magic/font_68.mag | 14 +++ .../magic/font_69.mag | 12 ++ .../magic/font_6A.mag | 13 ++ .../magic/font_6B.mag | 17 +++ .../magic/font_6C.mag | 9 ++ .../magic/font_6D.mag | 15 +++ .../magic/font_6E.mag | 13 ++ .../magic/font_6F.mag | 16 +++ .../magic/font_70.mag | 17 +++ .../magic/font_71.mag | 17 +++ .../magic/font_72.mag | 13 ++ .../magic/font_73.mag | 19 +++ .../magic/font_74.mag | 11 ++ .../magic/font_75.mag | 13 ++ .../magic/font_76.mag | 13 ++ .../magic/font_77.mag | 15 +++ .../magic/font_78.mag | 15 +++ .../magic/font_79.mag | 17 +++ .../magic/font_7A.mag | 15 +++ .../magic/font_7B.mag | 19 +++ .../magic/font_7C.mag | 10 ++ .../magic/font_7D.mag | 19 +++ .../magic/font_7E.mag | 17 +++ .../magic/font_A9.mag | 34 ++++++ .../gf180mcu_ocd_sram_test.mag.gz | Bin 0 -> 45148 bytes .../gf180mcu_ocd_sram_top.mag.gz | Bin 0 -> 262 bytes .../horz_connects.mag.gz | Bin 0 -> 330 bytes .../horz_connects_resetb.mag.gz | Bin 0 -> 279 bytes .../horz_connects_resetb_pullup.mag.gz | Bin 0 -> 209 bytes .../horz_power_connect.mag.gz | Bin 0 -> 388 bytes .../horz_via_program_input.mag.gz | Bin 0 -> 227 bytes .../horz_via_program_output.mag.gz | Bin 0 -> 224 bytes .../lvlshift_down.mag.gz | Bin 0 -> 631 bytes .../ocd_mux_array.mag.gz | Bin 0 -> 2098 bytes .../gf180mcu_ocd_sram_test/ocd_via2_3x.mag.gz | Bin 0 -> 187 bytes .../vert_connects.mag.gz | Bin 0 -> 594 bytes .../vert_connects_in_c.mag.gz | Bin 0 -> 397 bytes .../vert_power_connect.mag.gz | Bin 0 -> 441 bytes .../vert_via_program_input.mag.gz | Bin 0 -> 225 bytes .../wafer_space/gf180mcu_ws_ip__id.mag.gz | Bin 0 -> 39798 bytes .../wafer_space/gf180mcu_ws_ip__logo.mag.gz | Bin 0 -> 5363 bytes .../wafer_space/sealring.mag.gz | Bin 0 -> 209 bytes .../wafer_space/sealring_x1.mag.gz | Bin 0 -> 603 bytes 124 files changed, 1589 insertions(+), 44 deletions(-) create mode 100644 testdata/magic/gf180mcu_ocd_sram_test.cif.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/chip_half_frame.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/chip_half_frame_bad.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/constant_block.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/copyright_block.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_20.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_21.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_22.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_23.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_24.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_25.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_26.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_27.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_28.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_29.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2A.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2B.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2C.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2D.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2E.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2F.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_30.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_31.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_32.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_33.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_34.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_35.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_36.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_37.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_38.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_39.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3A.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3B.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3C.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3D.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3E.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3F.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_40.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_41.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_42.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_43.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_44.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_45.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_46.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_47.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_48.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_49.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4A.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4B.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4C.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4D.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4E.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4F.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_50.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_51.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_52.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_53.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_54.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_55.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_56.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_57.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_58.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_59.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5A.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5B.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5C.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5D.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5E.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5F.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_60.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_61.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_62.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_63.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_64.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_65.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_66.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_67.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_68.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_69.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6A.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6B.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6C.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6D.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6E.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6F.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_70.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_71.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_72.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_73.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_74.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_75.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_76.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_77.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_78.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_79.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7A.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7B.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7C.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7D.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7E.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_A9.mag create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_sram_test.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_sram_top.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/horz_connects.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/horz_connects_resetb.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/horz_connects_resetb_pullup.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/horz_power_connect.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/horz_via_program_input.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/horz_via_program_output.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/lvlshift_down.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/ocd_mux_array.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/ocd_via2_3x.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/vert_connects.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/vert_connects_in_c.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/vert_power_connect.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/vert_via_program_input.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/wafer_space/gf180mcu_ws_ip__id.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/wafer_space/gf180mcu_ws_ip__logo.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/wafer_space/sealring.mag.gz create mode 100644 testdata/magic/gf180mcu_ocd_sram_test/wafer_space/sealring_x1.mag.gz diff --git a/src/plugins/streamers/magic/db_plugin/dbMAGReader.cc b/src/plugins/streamers/magic/db_plugin/dbMAGReader.cc index 56abcf8d3..9708cc9b1 100644 --- a/src/plugins/streamers/magic/db_plugin/dbMAGReader.cc +++ b/src/plugins/streamers/magic/db_plugin/dbMAGReader.cc @@ -35,6 +35,7 @@ #include "tlClassRegistry.h" #include "tlFileUtils.h" #include "tlUri.h" +#include "tlEnv.h" #include #include @@ -183,7 +184,7 @@ MAGReader::cell_from_path (const std::string &path, db::Layout &layout) std::string cell_file; if (! resolve_path (path, layout, cell_file)) { // skip with a warning if the file can't be opened (TODO: better to raise an error?) - tl::warn << tl::to_string (tr ("Unable to find a layout file for cell - skipping this cell: ")) << path; + warn (tl::sprintf (tl::to_string (tr ("Unable to find a layout file for cell %s - skipping this file: %s")), cellname, path)); layout.cell (ci).set_ghost_cell (true); } else { m_cells_to_read.insert (std::make_pair (cellname, std::make_pair (cell_file, ci))); @@ -249,12 +250,49 @@ static bool find_and_normalize_file (const tl::URI &uri, std::string &path) return false; } +namespace +{ + +// TODO: this may be useful somewhere else +class EnvInterpolator + : public tl::Eval +{ +public: + EnvInterpolator () + : tl::Eval (0, 0, false) // safe mode + { + // .. nothing yet .. + } + + void resolve_name (const std::string &name, const tl::EvalFunction *&function, const tl::Variant *&value, tl::Variant *&var) + { + tl::Eval::resolve_name (name, function, value, var); + + if (! value && ! function && ! var) { + auto i = m_values.find (name); + if (i != m_values.end ()) { + value = &i->second; + } else { + std::string v = tl::get_env (name); + tl::Variant *vv = &m_values[name]; + *vv = v; + value = vv; + } + } + } + +private: + std::map m_values; +}; + +} + bool MAGReader::resolve_path (const std::string &path, const db::Layout & /*layout*/, std::string &real_path) { - tl::Eval expr; + EnvInterpolator expr; - // the variables supported for evaluation are + // the variables supported for lib path evaluation are // "tech_name": the name of the KLayout technology this file is loaded for (this may be the Magic technology name) // "tech_dir": the path to KLayout's technology folder for "tech_name" or the default technology's folder path // "magic_tech": the technology name from the Magic file currently read @@ -268,11 +306,20 @@ MAGReader::resolve_path (const std::string &path, const db::Layout & /*layout*/, } expr.set_var ("magic_tech", m_tech); - tl::URI path_uri (path); + tl::URI path_uri (expr.interpolate (path)); // absolute URIs are kept - we just try to figure out the suffix if (tl::is_absolute (path_uri.path ())) { - return find_and_normalize_file (path_uri, real_path); + + if (! find_and_normalize_file (path_uri, real_path)) { + if (tl::verbosity () >= 20) { + tl::log << "Unable to locate file with expanded path: " << path_uri.to_string (); + } + return false; + } else { + return true; + } + } tl::URI source_uri (mp_current_stream->source ()); @@ -291,6 +338,10 @@ MAGReader::resolve_path (const std::string &path, const db::Layout & /*layout*/, } } + if (tl::verbosity () >= 20) { + tl::log << "Unable to locate file with expanded path: " << path_uri.to_string (); + } + return false; } @@ -330,6 +381,7 @@ MAGReader::do_read_part (db::Layout &layout, db::cell_index_type cell_index, tl: bool valid_layer = false; unsigned int current_layer = 0; bool in_labels = false; + double scale = m_lambda; while (! stream.at_end ()) { @@ -359,6 +411,22 @@ MAGReader::do_read_part (db::Layout &layout, db::cell_index_type cell_index, tl: ex.expect_end (); + } else if (ex.test ("magscale")) { + + int n = 1, d = 1; + ex.read (n); + ex.read (d); + + if (d <= 0) { + error (tl::to_string (tr ("'magscale' denominator must not be negative or zero"))); + } + if (n <= 0) { + error (tl::to_string (tr ("'magscale' nominator must not be negative or zero"))); + } + scale = m_lambda * double (n) / double (d); + + ex.expect_end (); + } else if (ex.test ("timestamp")) { size_t ts = 0; @@ -385,6 +453,10 @@ MAGReader::do_read_part (db::Layout &layout, db::cell_index_type cell_index, tl: // ignore "checkpaint" internal layer in_labels = false; valid_layer = false; + } else if (lname == "properties") { + // ignore "properties" section as of now + in_labels = false; + valid_layer = false; } else { in_labels = false; std::pair ll = open_layer (layout, lname); @@ -400,7 +472,7 @@ MAGReader::do_read_part (db::Layout &layout, db::cell_index_type cell_index, tl: if (in_labels) { error (tl::to_string (tr ("'rect' statement inside labels section"))); } else if (valid_layer) { - read_rect (ex, layout, cell_index, current_layer); + read_rect (ex, layout, cell_index, current_layer, scale); } } else if (ex.test ("tri")) { @@ -408,7 +480,7 @@ MAGReader::do_read_part (db::Layout &layout, db::cell_index_type cell_index, tl: if (in_labels) { error (tl::to_string (tr ("'rect' statement inside labels section"))); } else if (valid_layer) { - read_tri (ex, layout, cell_index, current_layer); + read_tri (ex, layout, cell_index, current_layer, scale); } } else if (ex.test ("rlabel")) { @@ -416,12 +488,12 @@ MAGReader::do_read_part (db::Layout &layout, db::cell_index_type cell_index, tl: if (! in_labels) { error (tl::to_string (tr ("'rlabel' statement outside labels section"))); } else { - read_rlabel (ex, layout, cell_index); + read_rlabel (ex, layout, cell_index, scale); } } else if (ex.test ("use")) { - read_cell_instance (ex, stream, layout, cell_index); + read_cell_instance (ex, stream, layout, cell_index, scale); } @@ -467,7 +539,7 @@ MAGReader::do_merge_part (Layout &layout, cell_index_type cell_index) } void -MAGReader::read_rect (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer) +MAGReader::read_rect (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer, double scale) { double l, b, r, t; ex.read (l); @@ -477,11 +549,11 @@ MAGReader::read_rect (tl::Extractor &ex, Layout &layout, cell_index_type cell_in ex.expect_end (); db::DBox box (l, b, r, t); - layout.cell (cell_index).shapes (layer).insert ((box * m_lambda).transformed (m_dbu_trans_inv)); + layout.cell (cell_index).shapes (layer).insert ((box * scale).transformed (m_dbu_trans_inv)); } void -MAGReader::read_tri (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer) +MAGReader::read_tri (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer, double scale) { double l, b, r, t; ex.read (l); @@ -489,6 +561,8 @@ MAGReader::read_tri (tl::Extractor &ex, Layout &layout, cell_index_type cell_ind ex.read (r); ex.read (t); + // NOTE: that scheme is compatible with MAGIC's reader code (as of version 8.3) - + // we just skip unknown characters bool s = false, e = false; while (! ex.at_end ()) { if (ex.test ("s")) { @@ -496,10 +570,9 @@ MAGReader::read_tri (tl::Extractor &ex, Layout &layout, cell_index_type cell_ind } else if (ex.test ("e")) { e = true; } else { - break; + ++ex; } } - ex.expect_end (); std::vector pts; @@ -523,11 +596,11 @@ MAGReader::read_tri (tl::Extractor &ex, Layout &layout, cell_index_type cell_ind db::SimplePolygon poly; poly.assign_hull (pts.begin (), pts.end ()); - layout.cell (cell_index).shapes (layer).insert ((poly * m_lambda).transformed (m_dbu_trans_inv)); + layout.cell (cell_index).shapes (layer).insert ((poly * scale).transformed (m_dbu_trans_inv)); } void -MAGReader::read_rlabel (tl::Extractor &ex, Layout &layout, cell_index_type cell_index) +MAGReader::read_rlabel (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, double scale) { std::string lname; ex.read (lname); @@ -573,13 +646,13 @@ MAGReader::read_rlabel (tl::Extractor &ex, Layout &layout, cell_index_type cell_ if (true || lname != "space") { // really? "space"? ignore it? std::pair ll = open_layer (layout, lname); if (ll.first) { - layout.cell (cell_index).shapes (ll.second).insert ((text * m_lambda).transformed (m_dbu_trans_inv)); + layout.cell (cell_index).shapes (ll.second).insert ((text * scale).transformed (m_dbu_trans_inv)); } } } void -MAGReader::read_cell_instance (tl::Extractor &ex, tl::TextInputStream &stream, Layout &layout, cell_index_type cell_index) +MAGReader::read_cell_instance (tl::Extractor &ex, tl::TextInputStream &stream, Layout &layout, cell_index_type cell_index, double scale) { const char *include_chars_in_files = "$_,.-$+#:;[]()<>|/\\"; @@ -637,9 +710,9 @@ MAGReader::read_cell_instance (tl::Extractor &ex, tl::TextInputStream &stream, L ex2.read (ysep); na = (unsigned long) std::max (0, xhi - xlo + 1); - a = db::DVector (xsep, 0) * m_lambda; + a = db::DVector (xsep, 0) * scale; nb = (unsigned long) std::max (0, yhi - ylo + 1); - b = db::DVector (0, ysep) * m_lambda; + b = db::DVector (0, ysep) * scale; } else if (ex2.test ("timestamp")) { // ignored @@ -655,7 +728,7 @@ MAGReader::read_cell_instance (tl::Extractor &ex, tl::TextInputStream &stream, L ex2.read (m22); ex2.read (dy); - trans = db::DCplxTrans (db::Matrix2d (m11, m12, m21, m22), db::DVector (dx, dy) * m_lambda); + trans = db::DCplxTrans (db::Matrix2d (m11, m12, m21, m22), db::DVector (dx, dy) * scale); } else if (ex2.test ("box")) { // ignored diff --git a/src/plugins/streamers/magic/db_plugin/dbMAGReader.h b/src/plugins/streamers/magic/db_plugin/dbMAGReader.h index 167239b31..4f6f495ac 100644 --- a/src/plugins/streamers/magic/db_plugin/dbMAGReader.h +++ b/src/plugins/streamers/magic/db_plugin/dbMAGReader.h @@ -153,10 +153,10 @@ private: bool resolve_path(const std::string &path, const Layout &layout, std::string &real_path); std::string cell_name_from_path (const std::string &path); db::cell_index_type cell_from_path (const std::string &path, Layout &layout); - void read_rect (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer); - void read_tri (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer); - void read_rlabel (tl::Extractor &ex, Layout &layout, cell_index_type cell_index); - void read_cell_instance (tl::Extractor &ex, tl::TextInputStream &stream, Layout &layout, cell_index_type cell_index); + void read_rect (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer, double scale); + void read_tri (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer, double scale); + void read_rlabel (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, double scale); + void read_cell_instance (tl::Extractor &ex, tl::TextInputStream &stream, Layout &layout, cell_index_type cell_index, double scale); }; } diff --git a/src/plugins/streamers/magic/db_plugin/dbMAGWriter.cc b/src/plugins/streamers/magic/db_plugin/dbMAGWriter.cc index 280c7e4e1..6ac028512 100644 --- a/src/plugins/streamers/magic/db_plugin/dbMAGWriter.cc +++ b/src/plugins/streamers/magic/db_plugin/dbMAGWriter.cc @@ -41,6 +41,12 @@ namespace db // --------------------------------------------------------------------------------- // MAGWriter implementation +// A function to produce a zero-area box instead of an empty one +static db::Box safe_box (const db::Box &bx) +{ + return bx.empty () ? db::Box (0, 0, 0, 0) : bx; +} + MAGWriter::MAGWriter () : mp_stream (0), m_progress (tl::to_string (tr ("Writing Magic file")), 10000) @@ -120,6 +126,8 @@ MAGWriter::filename_for_cell (db::cell_index_type ci, db::Layout &layout) void MAGWriter::write_dummy_top (const std::set &cell_set, const db::Layout &layout, tl::OutputStream &os) { + m_cellname = ""; + os.set_as_text (true); os << "magic\n"; @@ -144,7 +152,7 @@ MAGWriter::write_dummy_top (const std::set &cell_set, const cell_instances.reserve (cells_by_name.size ()); for (std::map::const_iterator c = cells_by_name.begin (); c != cells_by_name.end (); ++c) { // instances are arrayed as stack - db::Box bx = layout.cell (c->second).bbox (); + db::Box bx = safe_box (layout.cell (c->second).bbox ()); cell_instances.push_back (db::CellInstArray (db::CellInst (c->second), db::Trans (db::Vector (0, y) + (db::Point () - bx.p1 ())))); y += bx.height (); w = std::max (w, db::Coord (bx.width ())); @@ -191,7 +199,7 @@ MAGWriter::do_write_cell (db::cell_index_type ci, const std::vector >\n"; - write_polygon (db::Polygon (cell.bbox ()), layout, os); + write_polygon (db::Polygon (safe_box (cell.bbox ())), layout, os); bool any; @@ -292,18 +300,25 @@ namespace { void MAGWriter::write_polygon (const db::Polygon &poly, const db::Layout & /*layout*/, tl::OutputStream &os) { - db::EdgeProcessor ep; - ep.insert (scaled (poly)); - db::MergeOp op; TrapezoidWriter writer (os); - db::TrapezoidGenerator tpgen (writer); - ep.process (tpgen, op); + + if (poly.is_empty ()) { + // ignore empty polygons + } else if (poly.is_box ()) { + writer.put (db::SimplePolygon (scaled (poly.box ()))); + } else { + db::EdgeProcessor ep; + ep.insert (scaled (poly)); + db::MergeOp op; + db::TrapezoidGenerator tpgen (writer); + ep.process (tpgen, op); + } } void MAGWriter::write_label (const std::string &layer, const db::Text &text, const db::Layout & /*layout*/, tl::OutputStream &os) { - db::DVector v = db::DVector (text.trans ().disp ()) * m_sf; + db::Vector v = scaled (text.trans ().disp ()); std::string s = text.string (); if (s.find ("\n") != std::string::npos) { @@ -372,7 +387,7 @@ MAGWriter::write_single_instance (db::cell_index_type ci, db::ICplxTrans trans, db::Vector d = scaled (trans.disp ()); os << "transform " << m.m11 () << " " << m.m12 () << " " << d.x () << " " << m.m21 () << " " << m.m22 () << " " << d.y () << "\n"; - db::Box bx = scaled (layout.cell (ci).bbox ()); + db::Box bx = scaled (safe_box (layout.cell (ci).bbox ())); os << "box " << bx.left () << " " << bx.bottom () << " " << bx.right () << " " << bx.top () << "\n"; } @@ -410,7 +425,7 @@ MAGWriter::scaled (const db::Vector &v) const { db::Vector res (db::DVector (v) * m_sf); if (! db::DVector (res).equal (db::DVector (v) * m_sf)) { - tl::warn << tl::sprintf (tl::to_string (tr ("Vector rounding occurred at %s in cell %s - not a multiple of lambda (%.12g)")), v.to_string (), m_cellname, m_options.lambda); + tl::warn << tl::sprintf (tl::to_string (tr ("Vector rounding occurred at %s in cell %s - not a multiple of lambda (%.12g)")), (db::DVector (v) * m_sf).to_string (), m_cellname, m_options.lambda); } return res; } @@ -420,7 +435,7 @@ MAGWriter::scaled (const db::Point &p) const { db::Point res (db::DPoint (p) * m_sf); if (! db::DPoint (res).equal (db::DPoint (p) * m_sf)) { - tl::warn << tl::sprintf (tl::to_string (tr ("Coordinate rounding occurred at %s in cell %s - not a multiple of lambda (%.12g)")), p.to_string (), m_cellname, m_options.lambda); + tl::warn << tl::sprintf (tl::to_string (tr ("Coordinate rounding occurred at %s in cell %s - not a multiple of lambda (%.12g)")), (db::DPoint (p) * m_sf).to_string (), m_cellname, m_options.lambda); } return res; } diff --git a/src/plugins/streamers/magic/unit_tests/dbMAGReader.cc b/src/plugins/streamers/magic/unit_tests/dbMAGReader.cc index d3e9c28b1..ba8eea091 100644 --- a/src/plugins/streamers/magic/unit_tests/dbMAGReader.cc +++ b/src/plugins/streamers/magic/unit_tests/dbMAGReader.cc @@ -26,17 +26,24 @@ #include "dbWriter.h" #include "dbMAGWriter.h" #include "tlUnitTest.h" +#include "tlEnv.h" +#include "tlFileUtils.h" #include -static void run_test (tl::TestBase *_this, const std::string &base, const char *file, const char *file_au, const char *map = 0, double lambda = 0.1, double dbu = 0.001, const std::vector *lib_paths = 0) +static void run_test (tl::TestBase *_this, const std::string &base, const char *file, const char *file_au, const char *map = 0, double lambda = 0.1, double write_lambda = 0.0, double dbu = 0.001, const std::vector *lib_paths = 0) { db::MAGReaderOptions *opt = new db::MAGReaderOptions(); opt->dbu = dbu; + opt->lambda = lambda; if (lib_paths) { opt->lib_paths = *lib_paths; } + if (write_lambda == 0) { + write_lambda = lambda; + } + db::LayerMap lm; if (map) { unsigned int ln = 0; @@ -71,7 +78,7 @@ static void run_test (tl::TestBase *_this, const std::string &base, const char * std::string tc_name = layout.cell_name (*layout.begin_top_down ()); - // normalize the layout by writing to GDS and reading from .. + // normalize the layout by writing to CIF and reading from .. std::string tmp_cif_file = _this->tmp_file (tl::sprintf ("%s.cif", tc_name)); std::string tmp_mag_file = _this->tmp_file (tl::sprintf ("%s.mag", tc_name)); @@ -96,7 +103,7 @@ static void run_test (tl::TestBase *_this, const std::string &base, const char * tl::OutputStream stream (tmp_mag_file); db::MAGWriterOptions *opt = new db::MAGWriterOptions(); - opt->lambda = lambda; + opt->lambda = write_lambda; db::MAGWriter writer; db::SaveLayoutOptions options; @@ -109,7 +116,7 @@ static void run_test (tl::TestBase *_this, const std::string &base, const char * db::MAGReaderOptions *opt = new db::MAGReaderOptions(); opt->dbu = dbu; - opt->lambda = lambda; + opt->lambda = write_lambda; db::LoadLayoutOptions reread_options; reread_options.set_options (opt); @@ -141,23 +148,29 @@ static void run_test (tl::TestBase *_this, const std::string &base, const char * TEST(1) { - run_test (_this, tl::testdata (), "MAG_TEST.mag.gz", "mag_test_au.cif.gz"); + run_test (_this, tl::testdata (), "MAG_TEST.mag.gz", "mag_test_au.cif.gz", 0, 1.0, 0.1); } TEST(2) { std::vector lp; lp.push_back (std::string ("../..")); - run_test (_this, tl::testdata (), "PearlRiver/Layout/magic/PearlRiver_die.mag", "PearlRiver_au.cif.gz", 0, 1.0, 0.001, &lp); + run_test (_this, tl::testdata (), "PearlRiver/Layout/magic/PearlRiver_die.mag", "PearlRiver_au.cif.gz", 0, 1.0, 0.0, 0.001, &lp); } TEST(3) { - run_test (_this, tl::testdata (), "ringo/RINGO.mag", "ringo_au.cif.gz"); + run_test (_this, tl::testdata (), "ringo/RINGO.mag", "ringo_au.cif.gz", 0, 1.0, 0.1); } TEST(4) { - run_test (_this, tl::testdata (), "issue_1925/redux.mag", "redux_au.cif.gz"); + run_test (_this, tl::testdata (), "issue_1925/redux.mag", "redux_au.cif.gz", 0, 1.0, 0.1); +} + +TEST(5) +{ + tl::set_env ("__TESTSRC_ABSPATH", tl::absolute_file_path (tl::testsrc ())); + run_test (_this, tl::testdata (), "gf180mcu_ocd_sram_test/gf180mcu_ocd_sram_top.mag.gz", "gf180mcu_ocd_sram_test.cif.gz", 0, 0.05, 0.005); } diff --git a/testdata/magic/gf180mcu_ocd_sram_test.cif.gz b/testdata/magic/gf180mcu_ocd_sram_test.cif.gz new file mode 100644 index 0000000000000000000000000000000000000000..675105ebd3b6fa11bf87436acf2e7ce983f6a231 GIT binary patch literal 97041 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

    %R7B$|u=_`*zeVTCIFMYWe$c`_l8C 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

    !MN71BfSkrVRof0Uhl9* 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 N)yHlb^!or9{|`)Ph0g#0 literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/constant_block.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/constant_block.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..f9b01d45d9e2902ee74d36bcde7b046e1076dccd GIT binary patch literal 528 zcmV+r0`L7FiwFplS9WOt17mM)b97;DbYEg@Z)0mNZDD5sol;wl+b|6L_bGS*10wYX z7W-B70zHB2Xwv|3vWVSXU{7C4lpHnK{b=DIV>ldfV4Rmmt1770cjEjUl@0c`~) zZoI=9dB$iM=H1nS8dfL$j~h-`&@2at4Lk&_Y!tD3`m?vGpxo=D)HiY$foX#p0pdF^}AV`MTv2 zPIY$}8@Hjt_4PQTMBzOBOy@O6;idexY^>dt_w$2-@3)kGOqUfb%ggt+uEXo~#?QiK zP45pvA^W4^?(`QLhl6O)XBs7-mV?*=+KZT=Ad1TMl0*eRRmoY1)MeodnU8e4ijEQ; S_98_>>HlZl$YEEW%o<@B#QKd)A^X{WRT z2U?lvy;jl0z%P5!D%i07e)YbdsrmA?tKFsIi(0E6b$x$xcYpWis=m0q`+af$>#R$^ z__67lvvz}d#)S29`dF`5OR9WUz81m_ecy(dtfkl2+XB{g-gSL z!+{WQYa@NgkhwOnaBUdlfVlsJ&slMlSd?y255;0!*h+*UIxY|bp|F$nVu~_lEW6t3Sh`??SmUldMbvcc}M&3r_{Svcqw5Scg@CJtdwoE2W5I5lm) zDBO;%haK?PT*`Sxjlu>uU?>KJ4GWvHfdFF|SdRh&14CiU<^tb2E98|q3b3r}#&kXF z`m%ALY$T2Ga#yp3yBb6kC7QEr1#MyL`q9!*$SX=T=Z=p2qrxD{U_G?V3A^RUJ?0*cTiQe1G2eyt3Sk!{jyu(w4Wt&~Gug^BD=RwmI=f{C&U$%KQfA(NLW^OQ!cP056dQFu_w(-f&J@WvGOvf}6FC}AMV zd;o&6EVPHA!?ynUM-D79Z^7%6g=PK1S{Nw4zA~{HqQYhE_WC0yT<|PLf1;fXEpu_w-q)kSV{R+C-3*w=D*3W)nUF;Gka${C;Zpz`$cgGM1D0(gR*yUbnM~B|^>OnL O2>$_b7-q!DAOHZ-dDD^r literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_20.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_20.mag new file mode 100644 index 000000000..509a92667 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_20.mag @@ -0,0 +1,6 @@ +magic +tech gf180mcuD +timestamp 1654634570 +<< properties >> +string FIXED_BBOX 0 -43 86 151 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_21.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_21.mag new file mode 100644 index 000000000..0502d3afe --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_21.mag @@ -0,0 +1,10 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 324 216 756 +rect 0 0 216 216 +<< properties >> +string FIXED_BBOX 0 -216 324 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_22.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_22.mag new file mode 100644 index 000000000..0247bd612 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_22.mag @@ -0,0 +1,10 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 324 108 756 +rect 216 324 324 756 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_23.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_23.mag new file mode 100644 index 000000000..e16f712fd --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_23.mag @@ -0,0 +1,16 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 108 540 216 756 +rect 324 540 432 756 +rect 0 432 540 540 +rect 108 324 216 432 +rect 324 324 432 432 +rect 0 216 540 324 +rect 108 0 216 216 +rect 324 0 432 216 +<< properties >> +string FIXED_BBOX 0 -216 648 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_24.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_24.mag new file mode 100644 index 000000000..0bcb09483 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_24.mag @@ -0,0 +1,21 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 108 648 216 756 +rect 72 612 324 648 +rect 36 576 324 612 +rect 0 540 324 576 +rect 0 432 144 540 +rect 0 396 252 432 +rect 36 360 288 396 +rect 72 324 324 360 +rect 180 216 324 324 +rect 0 180 324 216 +rect 0 144 288 180 +rect 0 108 252 144 +rect 108 0 216 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_25.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_25.mag new file mode 100644 index 000000000..b733b0ece --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_25.mag @@ -0,0 +1,25 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 540 216 756 +rect 432 612 540 756 +rect 396 576 540 612 +rect 360 540 540 576 +rect 324 504 504 540 +rect 324 468 468 504 +rect 288 432 432 468 +rect 180 396 432 432 +rect 144 360 396 396 +rect 108 324 360 360 +rect 108 288 252 324 +rect 72 252 216 288 +rect 36 216 216 252 +rect 0 180 180 216 +rect 0 144 144 180 +rect 0 0 108 144 +rect 324 0 540 216 +<< properties >> +string FIXED_BBOX 0 -216 648 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_26.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_26.mag new file mode 100644 index 000000000..ec89b3a3a --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_26.mag @@ -0,0 +1,32 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 144 720 396 756 +rect 108 684 432 720 +rect 72 612 468 684 +rect 72 576 180 612 +rect 36 504 180 576 +rect 360 504 468 612 +rect 36 468 216 504 +rect 72 432 252 468 +rect 72 396 288 432 +rect 72 360 324 396 +rect 36 324 360 360 +rect 0 288 396 324 +rect 0 252 144 288 +rect 252 252 432 288 +rect 0 144 108 252 +rect 288 216 468 252 +rect 288 180 504 216 +rect 288 144 540 180 +rect 0 108 144 144 +rect 252 108 540 144 +rect 0 72 540 108 +rect 36 36 540 72 +rect 72 0 324 36 +rect 432 0 540 36 +<< properties >> +string FIXED_BBOX 0 -216 648 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_27.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_27.mag new file mode 100644 index 000000000..eddc45c1b --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_27.mag @@ -0,0 +1,10 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 540 216 756 +rect 108 432 216 540 +<< properties >> +string FIXED_BBOX 0 -216 324 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_28.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_28.mag new file mode 100644 index 000000000..240059d92 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_28.mag @@ -0,0 +1,15 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 720 216 756 +rect 36 684 216 720 +rect 0 612 216 684 +rect 0 144 108 612 +rect 0 72 216 144 +rect 36 36 216 72 +rect 72 0 216 36 +<< properties >> +string FIXED_BBOX 0 -216 324 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_29.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_29.mag new file mode 100644 index 000000000..a46025266 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_29.mag @@ -0,0 +1,15 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 720 144 756 +rect 0 684 180 720 +rect 0 612 216 684 +rect 108 144 216 612 +rect 0 72 216 144 +rect 0 36 180 72 +rect 0 0 144 36 +<< properties >> +string FIXED_BBOX 0 -216 324 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2A.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2A.mag new file mode 100644 index 000000000..f91b73fad --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2A.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 216 648 324 756 +rect 144 576 396 648 +rect 36 468 504 576 +rect 144 396 396 468 +rect 216 288 324 396 +<< properties >> +string FIXED_BBOX 0 -216 648 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2B.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2B.mag new file mode 100644 index 000000000..233b019db --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2B.mag @@ -0,0 +1,11 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 108 432 216 540 +rect 0 324 324 432 +rect 108 216 216 324 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2C.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2C.mag new file mode 100644 index 000000000..1b6d4ea85 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2C.mag @@ -0,0 +1,10 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 0 216 216 +rect 108 -108 216 0 +<< properties >> +string FIXED_BBOX 0 -216 324 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2D.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2D.mag new file mode 100644 index 000000000..216c79110 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2D.mag @@ -0,0 +1,9 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 324 432 432 +<< properties >> +string FIXED_BBOX 0 -216 540 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2E.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2E.mag new file mode 100644 index 000000000..dd4f87833 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2E.mag @@ -0,0 +1,9 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 0 216 216 +<< properties >> +string FIXED_BBOX 0 -216 324 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2F.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2F.mag new file mode 100644 index 000000000..6a37bdf7e --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_2F.mag @@ -0,0 +1,21 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 216 648 324 756 +rect 180 540 324 648 +rect 144 504 324 540 +rect 144 468 288 504 +rect 108 432 288 468 +rect 108 396 252 432 +rect 72 360 252 396 +rect 72 324 216 360 +rect 36 288 216 324 +rect 36 252 180 288 +rect 0 216 180 252 +rect 0 108 144 216 +rect 0 0 108 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_30.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_30.mag new file mode 100644 index 000000000..ad13b1c96 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_30.mag @@ -0,0 +1,12 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 0 108 108 648 +rect 216 108 324 648 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_31.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_31.mag new file mode 100644 index 000000000..3fff8595c --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_31.mag @@ -0,0 +1,12 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 108 648 216 756 +rect 0 540 216 648 +rect 108 108 216 540 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_32.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_32.mag new file mode 100644 index 000000000..c926d1350 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_32.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 216 540 324 648 +rect 0 432 324 540 +rect 0 108 108 432 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_33.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_33.mag new file mode 100644 index 000000000..f8f5486a0 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_33.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 216 540 324 648 +rect 0 432 324 540 +rect 216 108 324 432 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_34.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_34.mag new file mode 100644 index 000000000..f5a95a2da --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_34.mag @@ -0,0 +1,12 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 540 108 648 +rect 216 540 324 756 +rect 0 432 324 540 +rect 216 0 324 432 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_35.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_35.mag new file mode 100644 index 000000000..648031765 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_35.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 0 540 108 648 +rect 0 432 324 540 +rect 216 108 324 432 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_36.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_36.mag new file mode 100644 index 000000000..5de847bf2 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_36.mag @@ -0,0 +1,14 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 0 540 108 648 +rect 0 432 324 540 +rect 0 108 108 432 +rect 216 108 324 432 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_37.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_37.mag new file mode 100644 index 000000000..742196012 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_37.mag @@ -0,0 +1,10 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 216 0 324 648 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_38.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_38.mag new file mode 100644 index 000000000..4ef4a8049 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_38.mag @@ -0,0 +1,15 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 0 540 108 648 +rect 216 540 324 648 +rect 0 432 324 540 +rect 0 108 108 432 +rect 216 108 324 432 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_39.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_39.mag new file mode 100644 index 000000000..d93c06bde --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_39.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 0 540 108 648 +rect 216 540 324 648 +rect 0 432 324 540 +rect 216 0 324 432 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3A.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3A.mag new file mode 100644 index 000000000..40e09c3f6 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3A.mag @@ -0,0 +1,10 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 324 216 540 +rect 0 0 216 216 +<< properties >> +string FIXED_BBOX 0 -216 324 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3B.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3B.mag new file mode 100644 index 000000000..2f65eea61 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3B.mag @@ -0,0 +1,11 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 324 216 540 +rect 0 0 216 216 +rect 108 -108 216 0 +<< properties >> +string FIXED_BBOX 0 -216 324 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3C.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3C.mag new file mode 100644 index 000000000..62302bb13 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3C.mag @@ -0,0 +1,21 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 216 612 324 648 +rect 180 576 324 612 +rect 144 540 324 576 +rect 108 504 288 540 +rect 72 468 252 504 +rect 36 432 216 468 +rect 0 324 180 432 +rect 36 288 216 324 +rect 72 252 252 288 +rect 108 216 288 252 +rect 144 180 324 216 +rect 180 144 324 180 +rect 216 108 324 144 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3D.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3D.mag new file mode 100644 index 000000000..c6408a4e5 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3D.mag @@ -0,0 +1,10 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 432 432 540 +rect 0 216 432 324 +<< properties >> +string FIXED_BBOX 0 -216 540 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3E.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3E.mag new file mode 100644 index 000000000..d5ca1261b --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3E.mag @@ -0,0 +1,21 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 612 108 648 +rect 0 576 144 612 +rect 0 540 180 576 +rect 36 504 216 540 +rect 72 468 252 504 +rect 108 432 288 468 +rect 144 324 324 432 +rect 108 288 288 324 +rect 72 252 252 288 +rect 36 216 216 252 +rect 0 180 180 216 +rect 0 144 144 180 +rect 0 108 108 144 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3F.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3F.mag new file mode 100644 index 000000000..60d60ca99 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_3F.mag @@ -0,0 +1,18 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 720 252 756 +rect 36 684 288 720 +rect 0 612 324 684 +rect 0 540 108 612 +rect 216 468 324 612 +rect 180 432 324 468 +rect 108 396 324 432 +rect 72 360 288 396 +rect 72 288 252 360 +rect 36 0 288 180 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_40.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_40.mag new file mode 100644 index 000000000..0a5db700f --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_40.mag @@ -0,0 +1,33 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 144 720 648 756 +rect 108 684 684 720 +rect 72 648 720 684 +rect 36 612 216 648 +rect 576 612 756 648 +rect 0 576 180 612 +rect 612 576 756 612 +rect 0 540 144 576 +rect 0 0 108 540 +rect 288 504 468 540 +rect 252 468 504 504 +rect 216 396 540 468 +rect 216 144 324 396 +rect 432 144 540 396 +rect 648 144 756 576 +rect 216 72 756 144 +rect 252 36 720 72 +rect 288 0 432 36 +rect 540 0 684 36 +rect 0 -36 144 0 +rect 0 -72 180 -36 +rect 36 -108 216 -72 +rect 72 -144 648 -108 +rect 108 -180 648 -144 +rect 144 -216 648 -180 +<< properties >> +string FIXED_BBOX 0 -216 864 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_41.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_41.mag new file mode 100644 index 000000000..9e8c4d4ef --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_41.mag @@ -0,0 +1,16 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 720 252 756 +rect 36 684 288 720 +rect 0 612 324 684 +rect 0 324 108 612 +rect 216 324 324 612 +rect 0 216 324 324 +rect 0 0 108 216 +rect 216 0 324 216 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_42.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_42.mag new file mode 100644 index 000000000..33da1b177 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_42.mag @@ -0,0 +1,19 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 720 252 756 +rect 0 684 288 720 +rect 0 612 324 684 +rect 0 432 108 612 +rect 216 432 324 612 +rect 0 324 324 432 +rect 0 144 108 324 +rect 216 144 324 324 +rect 0 72 324 144 +rect 0 36 288 72 +rect 0 0 252 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_43.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_43.mag new file mode 100644 index 000000000..43530ec5f --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_43.mag @@ -0,0 +1,15 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 720 324 756 +rect 36 684 324 720 +rect 0 612 324 684 +rect 0 144 108 612 +rect 0 72 324 144 +rect 36 36 324 72 +rect 72 0 324 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_44.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_44.mag new file mode 100644 index 000000000..b9e4013e1 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_44.mag @@ -0,0 +1,16 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 720 252 756 +rect 0 684 288 720 +rect 0 612 324 684 +rect 0 144 108 612 +rect 216 144 324 612 +rect 0 72 324 144 +rect 0 36 288 72 +rect 0 0 252 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_45.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_45.mag new file mode 100644 index 000000000..5976f9a29 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_45.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 0 432 108 648 +rect 0 324 216 432 +rect 0 108 108 324 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_46.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_46.mag new file mode 100644 index 000000000..af39dccbd --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_46.mag @@ -0,0 +1,12 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 0 432 108 648 +rect 0 324 216 432 +rect 0 0 108 324 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_47.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_47.mag new file mode 100644 index 000000000..86ec656b8 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_47.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 720 252 756 +rect 36 684 288 720 +rect 0 612 324 684 +rect 0 144 108 612 +rect 216 540 324 612 +rect 216 144 324 432 +rect 0 72 324 144 +rect 36 36 324 72 +rect 72 0 324 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_48.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_48.mag new file mode 100644 index 000000000..955506b2c --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_48.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 432 108 756 +rect 216 432 324 756 +rect 0 324 324 432 +rect 0 0 108 324 +rect 216 0 324 324 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_49.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_49.mag new file mode 100644 index 000000000..cb66d8d57 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_49.mag @@ -0,0 +1,11 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 108 108 216 648 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4A.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4A.mag new file mode 100644 index 000000000..e4f3ea9e8 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4A.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 144 108 216 +rect 216 144 324 756 +rect 0 72 324 144 +rect 36 36 288 72 +rect 72 0 252 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4B.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4B.mag new file mode 100644 index 000000000..5c7a6d57b --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4B.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 576 108 756 +rect 216 576 324 756 +rect 0 504 324 576 +rect 0 432 288 504 +rect 0 324 252 432 +rect 0 252 288 324 +rect 0 180 324 252 +rect 0 0 108 180 +rect 216 0 324 180 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4C.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4C.mag new file mode 100644 index 000000000..c2ea84f54 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4C.mag @@ -0,0 +1,10 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 108 108 756 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4D.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4D.mag new file mode 100644 index 000000000..705c62a4e --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4D.mag @@ -0,0 +1,16 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 108 756 +rect 432 648 540 756 +rect 0 540 216 648 +rect 324 540 540 648 +rect 0 432 540 540 +rect 0 0 108 432 +rect 216 324 324 432 +rect 432 0 540 432 +<< properties >> +string FIXED_BBOX 0 -216 648 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4E.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4E.mag new file mode 100644 index 000000000..590a85bbc --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4E.mag @@ -0,0 +1,15 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 108 756 +rect 0 540 216 648 +rect 324 540 432 756 +rect 0 432 432 540 +rect 0 0 108 432 +rect 216 324 432 432 +rect 324 0 432 324 +<< properties >> +string FIXED_BBOX 0 -216 540 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4F.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4F.mag new file mode 100644 index 000000000..97f6a8bfa --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_4F.mag @@ -0,0 +1,16 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 720 252 756 +rect 36 684 288 720 +rect 0 612 324 684 +rect 0 144 108 612 +rect 216 144 324 612 +rect 0 72 324 144 +rect 36 36 288 72 +rect 72 0 252 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_50.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_50.mag new file mode 100644 index 000000000..b9ad6153c --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_50.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 720 252 756 +rect 0 684 288 720 +rect 0 612 324 684 +rect 0 360 108 612 +rect 216 360 324 612 +rect 0 288 324 360 +rect 0 252 288 288 +rect 0 216 252 252 +rect 0 0 108 216 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_51.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_51.mag new file mode 100644 index 000000000..f00e846ec --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_51.mag @@ -0,0 +1,16 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 720 252 756 +rect 36 684 288 720 +rect 0 612 324 684 +rect 0 252 108 612 +rect 216 252 324 612 +rect 0 72 324 252 +rect 36 36 324 72 +rect 72 0 324 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_52.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_52.mag new file mode 100644 index 000000000..779f3c8b7 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_52.mag @@ -0,0 +1,22 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 720 252 756 +rect 0 684 288 720 +rect 0 612 324 684 +rect 0 504 108 612 +rect 216 504 324 612 +rect 0 432 324 504 +rect 0 396 288 432 +rect 0 360 252 396 +rect 0 252 216 360 +rect 0 216 252 252 +rect 0 180 288 216 +rect 0 108 324 180 +rect 0 0 108 108 +rect 216 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_53.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_53.mag new file mode 100644 index 000000000..d2e422fe2 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_53.mag @@ -0,0 +1,20 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 720 324 756 +rect 36 684 324 720 +rect 0 612 324 684 +rect 0 468 108 612 +rect 0 432 252 468 +rect 0 396 288 432 +rect 36 360 324 396 +rect 72 324 324 360 +rect 216 144 324 324 +rect 0 72 324 144 +rect 0 36 288 72 +rect 0 0 252 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_54.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_54.mag new file mode 100644 index 000000000..610888418 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_54.mag @@ -0,0 +1,10 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 108 0 216 648 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_55.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_55.mag new file mode 100644 index 000000000..f49245b62 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_55.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 144 108 756 +rect 216 144 324 756 +rect 0 72 324 144 +rect 36 36 288 72 +rect 72 0 252 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_56.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_56.mag new file mode 100644 index 000000000..a4718b0e6 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_56.mag @@ -0,0 +1,14 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 396 108 756 +rect 216 396 324 756 +rect 0 324 324 396 +rect 36 216 288 324 +rect 72 108 252 216 +rect 108 0 216 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_57.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_57.mag new file mode 100644 index 000000000..53fc9897a --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_57.mag @@ -0,0 +1,16 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 396 108 756 +rect 216 396 324 756 +rect 432 396 540 756 +rect 0 324 540 396 +rect 36 216 504 324 +rect 72 108 468 216 +rect 108 0 216 108 +rect 324 0 432 108 +<< properties >> +string FIXED_BBOX 0 -216 648 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_58.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_58.mag new file mode 100644 index 000000000..e5346da2d --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_58.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 576 108 756 +rect 216 576 324 756 +rect 0 504 324 576 +rect 36 432 288 504 +rect 72 324 252 432 +rect 36 252 288 324 +rect 0 180 324 252 +rect 0 0 108 180 +rect 216 0 324 180 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_59.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_59.mag new file mode 100644 index 000000000..887a995da --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_59.mag @@ -0,0 +1,14 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 504 108 756 +rect 216 504 324 756 +rect 0 432 324 504 +rect 36 360 288 432 +rect 72 288 252 360 +rect 108 0 216 288 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5A.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5A.mag new file mode 100644 index 000000000..bd6896bea --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5A.mag @@ -0,0 +1,19 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 216 504 324 648 +rect 180 468 324 504 +rect 144 432 324 468 +rect 108 396 288 432 +rect 72 360 252 396 +rect 36 324 216 360 +rect 0 288 180 324 +rect 0 252 144 288 +rect 0 108 108 252 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5B.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5B.mag new file mode 100644 index 000000000..d9da09a1b --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5B.mag @@ -0,0 +1,11 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 0 108 108 648 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5C.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5C.mag new file mode 100644 index 000000000..0504ca61a --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5C.mag @@ -0,0 +1,21 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 108 756 +rect 0 540 144 648 +rect 0 504 180 540 +rect 36 468 180 504 +rect 36 432 216 468 +rect 72 396 216 432 +rect 72 360 252 396 +rect 108 324 252 360 +rect 108 288 288 324 +rect 144 252 288 288 +rect 144 216 324 252 +rect 180 108 324 216 +rect 216 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5D.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5D.mag new file mode 100644 index 000000000..d2a9be030 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5D.mag @@ -0,0 +1,11 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 648 324 756 +rect 216 108 324 648 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5E.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5E.mag new file mode 100644 index 000000000..464801980 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5E.mag @@ -0,0 +1,10 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 108 648 216 756 +rect 0 540 324 648 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5F.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5F.mag new file mode 100644 index 000000000..0345a7058 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_5F.mag @@ -0,0 +1,9 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 0 432 108 +<< properties >> +string FIXED_BBOX 0 -216 540 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_60.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_60.mag new file mode 100644 index 000000000..a41d62266 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_60.mag @@ -0,0 +1,10 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 540 216 756 +rect 0 432 108 540 +<< properties >> +string FIXED_BBOX 0 -216 324 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_61.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_61.mag new file mode 100644 index 000000000..2903933e1 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_61.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 504 288 540 +rect 0 432 324 504 +rect 216 324 324 432 +rect 36 288 324 324 +rect 0 216 324 288 +rect 0 108 108 216 +rect 216 108 324 216 +rect 0 36 324 108 +rect 36 0 324 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_62.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_62.mag new file mode 100644 index 000000000..66a3611cf --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_62.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 540 108 756 +rect 0 504 252 540 +rect 0 468 288 504 +rect 0 396 324 468 +rect 0 144 108 396 +rect 216 144 324 396 +rect 0 72 324 144 +rect 0 36 288 72 +rect 0 0 252 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_63.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_63.mag new file mode 100644 index 000000000..40be9e7eb --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_63.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 504 252 540 +rect 36 468 288 504 +rect 0 396 324 468 +rect 0 144 108 396 +rect 216 324 324 396 +rect 216 144 324 180 +rect 0 72 324 144 +rect 36 36 288 72 +rect 72 0 252 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_64.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_64.mag new file mode 100644 index 000000000..035ba8bd4 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_64.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 216 540 324 756 +rect 72 504 324 540 +rect 36 468 324 504 +rect 0 396 324 468 +rect 0 144 108 396 +rect 216 144 324 396 +rect 0 72 324 144 +rect 36 36 324 72 +rect 72 0 324 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_65.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_65.mag new file mode 100644 index 000000000..b5935b07b --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_65.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 36 504 288 540 +rect 0 432 324 504 +rect 0 324 108 432 +rect 216 324 324 432 +rect 0 252 324 324 +rect 0 216 288 252 +rect 0 108 108 216 +rect 0 36 324 108 +rect 36 0 324 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_66.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_66.mag new file mode 100644 index 000000000..4021d01b3 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_66.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 144 720 324 756 +rect 108 648 324 720 +rect 108 540 216 648 +rect 0 432 324 540 +rect 108 0 216 432 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_67.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_67.mag new file mode 100644 index 000000000..ac463562e --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_67.mag @@ -0,0 +1,20 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 504 252 540 +rect 36 468 288 504 +rect 0 396 324 468 +rect 0 144 108 396 +rect 216 144 324 396 +rect 0 72 324 144 +rect 36 36 324 72 +rect 72 0 324 36 +rect 180 -108 324 0 +rect 0 -144 324 -108 +rect 0 -180 288 -144 +rect 0 -216 252 -180 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_68.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_68.mag new file mode 100644 index 000000000..68d1e7573 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_68.mag @@ -0,0 +1,14 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 540 108 756 +rect 0 504 252 540 +rect 0 468 288 504 +rect 0 396 324 468 +rect 0 0 108 396 +rect 216 0 324 396 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_69.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_69.mag new file mode 100644 index 000000000..c1ae761d9 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_69.mag @@ -0,0 +1,12 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 540 216 756 +rect 0 324 216 432 +rect 108 108 216 324 +rect 0 0 216 108 +<< properties >> +string FIXED_BBOX 0 -216 324 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6A.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6A.mag new file mode 100644 index 000000000..002323b9c --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6A.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 540 216 756 +rect 0 324 216 432 +rect 108 -108 216 324 +rect 0 -180 216 -108 +rect 0 -216 180 -180 +<< properties >> +string FIXED_BBOX 0 -216 324 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6B.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6B.mag new file mode 100644 index 000000000..0152d2b50 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6B.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 432 108 756 +rect 216 432 324 540 +rect 0 360 324 432 +rect 0 324 288 360 +rect 0 216 216 324 +rect 0 180 288 216 +rect 0 108 324 180 +rect 0 0 108 108 +rect 216 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6C.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6C.mag new file mode 100644 index 000000000..7034c682f --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6C.mag @@ -0,0 +1,9 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 0 108 756 +<< properties >> +string FIXED_BBOX 0 -216 216 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6D.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6D.mag new file mode 100644 index 000000000..3c4163e66 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6D.mag @@ -0,0 +1,15 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 504 216 540 +rect 324 504 468 540 +rect 0 468 504 504 +rect 0 396 540 468 +rect 0 0 108 396 +rect 216 0 324 396 +rect 432 0 540 396 +<< properties >> +string FIXED_BBOX 0 -216 648 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6E.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6E.mag new file mode 100644 index 000000000..69f0286f6 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6E.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 504 252 540 +rect 0 468 288 504 +rect 0 396 324 468 +rect 0 0 108 396 +rect 216 0 324 396 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6F.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6F.mag new file mode 100644 index 000000000..074dcc105 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_6F.mag @@ -0,0 +1,16 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 504 252 540 +rect 36 468 288 504 +rect 0 396 324 468 +rect 0 144 108 396 +rect 216 144 324 396 +rect 0 72 324 144 +rect 36 36 288 72 +rect 72 0 252 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_70.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_70.mag new file mode 100644 index 000000000..21f5069df --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_70.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 504 252 540 +rect 36 468 288 504 +rect 0 396 324 468 +rect 0 144 108 396 +rect 216 144 324 396 +rect 0 72 324 144 +rect 0 36 288 72 +rect 0 0 252 36 +rect 0 -216 108 0 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_71.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_71.mag new file mode 100644 index 000000000..0a1bfc9e8 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_71.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 504 252 540 +rect 36 468 288 504 +rect 0 396 324 468 +rect 0 144 108 396 +rect 216 144 324 396 +rect 0 72 324 144 +rect 36 36 324 72 +rect 72 0 324 36 +rect 216 -216 324 0 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_72.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_72.mag new file mode 100644 index 000000000..22bf247df --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_72.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 504 252 540 +rect 0 468 288 504 +rect 0 396 324 468 +rect 0 0 108 396 +rect 216 324 324 396 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_73.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_73.mag new file mode 100644 index 000000000..820e9d7d5 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_73.mag @@ -0,0 +1,19 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 72 504 324 540 +rect 36 468 324 504 +rect 0 432 324 468 +rect 0 324 144 432 +rect 0 288 252 324 +rect 36 252 288 288 +rect 72 216 324 252 +rect 180 108 324 216 +rect 0 72 324 108 +rect 0 36 288 72 +rect 0 0 252 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_74.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_74.mag new file mode 100644 index 000000000..99e138e45 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_74.mag @@ -0,0 +1,11 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 108 540 216 648 +rect 0 432 324 540 +rect 108 0 216 432 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_75.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_75.mag new file mode 100644 index 000000000..3a2d24920 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_75.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 144 108 540 +rect 216 144 324 540 +rect 0 72 324 144 +rect 36 36 324 72 +rect 72 0 324 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_76.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_76.mag new file mode 100644 index 000000000..128a3e778 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_76.mag @@ -0,0 +1,13 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 216 108 540 +rect 216 216 324 540 +rect 0 108 324 216 +rect 36 72 288 108 +rect 108 0 216 72 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_77.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_77.mag new file mode 100644 index 000000000..1cc1cbf66 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_77.mag @@ -0,0 +1,15 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 144 108 540 +rect 216 144 324 540 +rect 432 144 540 540 +rect 0 72 540 144 +rect 36 36 540 72 +rect 72 0 216 36 +rect 324 0 540 36 +<< properties >> +string FIXED_BBOX 0 -216 648 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_78.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_78.mag new file mode 100644 index 000000000..90007ecfc --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_78.mag @@ -0,0 +1,15 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 396 108 540 +rect 216 396 324 540 +rect 0 324 324 396 +rect 36 216 288 324 +rect 0 144 324 216 +rect 0 0 108 144 +rect 216 0 324 144 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_79.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_79.mag new file mode 100644 index 000000000..067ac2a6f --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_79.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 144 108 540 +rect 216 144 324 540 +rect 0 72 324 144 +rect 36 36 324 72 +rect 72 0 324 36 +rect 180 -108 324 0 +rect 0 -144 324 -108 +rect 0 -180 288 -144 +rect 0 -216 252 -180 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7A.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7A.mag new file mode 100644 index 000000000..a12f354b1 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7A.mag @@ -0,0 +1,15 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 432 324 540 +rect 144 324 324 432 +rect 108 288 288 324 +rect 72 252 252 288 +rect 36 216 216 252 +rect 0 108 180 216 +rect 0 0 324 108 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7B.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7B.mag new file mode 100644 index 000000000..760bc7341 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7B.mag @@ -0,0 +1,19 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 180 720 324 756 +rect 144 684 324 720 +rect 108 612 324 684 +rect 108 504 216 612 +rect 72 432 216 504 +rect 0 324 180 432 +rect 72 252 216 324 +rect 108 144 216 252 +rect 108 72 324 144 +rect 144 36 324 72 +rect 180 0 324 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7C.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7C.mag new file mode 100644 index 000000000..3a6523a7e --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7C.mag @@ -0,0 +1,10 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 324 108 756 +rect 0 -216 108 216 +<< properties >> +string FIXED_BBOX 0 -216 216 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7D.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7D.mag new file mode 100644 index 000000000..32aa8e8dd --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7D.mag @@ -0,0 +1,19 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 0 720 144 756 +rect 0 684 180 720 +rect 0 612 216 684 +rect 108 504 216 612 +rect 108 432 252 504 +rect 144 324 324 432 +rect 108 252 252 324 +rect 108 144 216 252 +rect 0 72 216 144 +rect 0 36 180 72 +rect 0 0 144 36 +<< properties >> +string FIXED_BBOX 0 -216 432 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7E.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7E.mag new file mode 100644 index 000000000..c37d2f5f7 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_7E.mag @@ -0,0 +1,17 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 108 720 288 756 +rect 36 684 324 720 +rect 0 648 324 684 +rect 432 648 540 684 +rect 0 612 540 648 +rect 0 576 108 612 +rect 216 576 540 612 +rect 216 540 504 576 +rect 252 504 432 540 +<< properties >> +string FIXED_BBOX 0 -216 648 756 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_A9.mag b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_A9.mag new file mode 100644 index 000000000..acca143c2 --- /dev/null +++ b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_alpha_small/magic/font_A9.mag @@ -0,0 +1,34 @@ +magic +tech gf180mcuD +magscale 1 5 +timestamp 1654634570 +<< metal5 >> +rect 6300 6120 6804 6156 +rect 6264 6084 6840 6120 +rect 6228 6048 6876 6084 +rect 6192 6012 6372 6048 +rect 6732 6012 6912 6048 +rect 6156 5976 6336 6012 +rect 6768 5976 6912 6012 +rect 6156 5940 6300 5976 +rect 6156 5400 6264 5940 +rect 6444 5904 6624 5940 +rect 6408 5868 6660 5904 +rect 6372 5796 6696 5868 +rect 6372 5544 6480 5796 +rect 6588 5724 6696 5796 +rect 6588 5544 6696 5616 +rect 6372 5472 6696 5544 +rect 6408 5436 6660 5472 +rect 6444 5400 6624 5436 +rect 6804 5400 6912 5976 +rect 6156 5364 6300 5400 +rect 6768 5364 6912 5400 +rect 6156 5328 6336 5364 +rect 6732 5328 6912 5364 +rect 6192 5292 6372 5328 +rect 6696 5292 6876 5328 +rect 6228 5256 6840 5292 +rect 6264 5220 6804 5256 +rect 6300 5184 6768 5220 +<< end >> diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_sram_test.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_sram_test.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..fbede52f5eb8c7c1de0f1b5d90839c392e398036 GIT binary patch literal 45148 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 HC*=PFc1&f0 literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_sram_top.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/gf180mcu_ocd_sram_top.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..bdee085c4be27316203b8d70c95d4bc1e6491eb6 GIT binary patch literal 262 zcmV+h0r~zPiwFqfGzJYg$ zn@B}hj}&poz7`#3twRqlGL3LGgUhKc@W)P$D}H6w`3Iz`h*Q4dHqnzL)s`2S@}MQW^mhSBP5ARp7wB3l2y*Q(#DP z)-qzn>?LCj`Q4@-(aeim@$E6$sJ5y{Z7uWp-kdzVgan@TBVVC7Do|wXaHLv^&Y4nl z5-QekgFVKI{pby5X*jaQlBD7k$zbxKnG<>IPBgkEgcz;B)B-4?P0-hAeMmk zivFRdbs;2?e3wnY$AeVi`K#6r{@;P8KxD(+1LKK3N66N!=eDyJE@c%+3oL%VIAn0C criO_vb}do|)KytN-}0XP0brl4stp4G0B=B^0RR91 literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/horz_connects_resetb.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/horz_connects_resetb.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..4758d5e1aaeb551ad1a9f86c92ac51be4285459a GIT binary patch literal 279 zcmV+y0qFi8iwFqfGP4r42Acc z!biXu10zLQ^&*Ip=}4ifnrY5o^D_zAWHHj{dwzZom$+_8?KyqHdcmMe`uk8NuD2Ag z84ysbeJlC4$MOT{on3+ni&Li)l)T3)!uhOzbJ_t783H8v?4mVb;32Sf+y%C5CZRb< zG$zXs{4vjn9kcNjOW1vjQ&bOV8{6(@R9)1qvZGsDPc!#)0mN>swICG+CSx_Ut>`8! z0YL)1{Nc;I4WSA=1bo!*!uvaP2fsS-5Qye*{lIu&!w$kypG#)$+PH6rBN>?S`!myo d+cXVKJYzi~rJx)(e}C4i{sZ+xrOZPD0070ufaCxG literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/horz_connects_resetb_pullup.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/horz_connects_resetb_pullup.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..cd0d427977238485fe574ff24b170ebf3d58acd0 GIT binary patch literal 209 zcmV;?051O@iwFqfG^)Vj-a6WO~N(?~`Jw_ilC zQ*!p^K_Dse5`4-w+(AuUwT4Ywi>||Cv4rzkMDH?~Dg#mq%u<4k{%R$epmbrQU>dO} zk9mu)-finz3aO7i`8?pK?f;DDXxB7uG2lcfYr4{W5K;`=6U2(u$7^m-!tvIx*W>IP LB@~Wi@Bjb+Q1W1f literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/horz_power_connect.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/horz_power_connect.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..7b00b4b173e3de302ff201c66407d23c9eb2ae46 GIT binary patch literal 388 zcmV-~0ek)*iwFqfG^O}HF z5#%AmvXrQ~2BK;ABCJaK?4=M}pEU+ojX6=w1=C3Tpmg08tJ$oT+{{XIa|~{W5GRVc zVAeV+sGU%IK~}TbI=z{-^)_n^Zif&jin(Ck&_1-@xxFB(l0JSjX98&&1a5~ACyIHI z3@#m7#Ht{xc@|i8m~hQB2Mq|{1poj;gnNKd83m+n1?nx#n~# zfPmJtwU%p3^#T~Yvq2_%IUNfS z5SljDa&4)efr57!BsyzWE6Dqj59c(V8m!mmQgQ=l)hdB7DmidMKH8q5cYWeMCi-I| zaZk+pvM-=$XFy$CfarsKKnzSvFb&N>6#ET?SojTu1aY|m`SZ|}^m(NE@CFok1}x(@ am`Y&xTS*5~CFQj3jXVH}uJl`n0RRALUtul) literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/lvlshift_down.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/lvlshift_down.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..587d51a07ba664a84088c544a39061f062ecfa5d GIT binary patch literal 631 zcmV--0*L(|iwFodS$1gv18jC|b7*O1bYEm|cWy3iVP^o1RNIOhF${g5uka5nSn_3T zSQZMQ^r3Hog+9)v-ZYTOE}7Z(_bbctT#{K@^5W)9^NYybR;D8B&tO&pgXy!)C|AQzzUdY zIEa*D^Vqy2Eu4WR0>P7>F&gG9i$NeQA|jU+03%fZx}^XxHOzpvbd#~3DFVdUk~eLh zW^Ubizpxp26d+Tw8GoO;*^1&BHVNBhb`KAiWY9}-WE?WZ8V;hljH`xaDioKg%u=%C ztTC%yfd@lzh=CSQ)4k~C^}$8YtT!)1)PA)LjQnF6O3nn-94E-^d2ctZQ{vQoU5XOc z@Qkwb9l%ybO37Ai~LbA#%cNV!^&YBnXONPG5@PZI0 z&*j{`r1OyH^2*2h&fVEw+x&2Ry{5G9E`zf4NS5F3dB1Po->zA`%aH!u6-_j$>e#J*c-7GA#j0&rdEV_x8Q3aw^Zt?rK9#4|!BU4r RPnVxr@xSx~BTl*o007v7IaUAw literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/ocd_mux_array.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/ocd_mux_array.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..385be7a2a702b62788071e5880fa7a671a7b8574 GIT binary patch literal 2098 zcmV-22+j8&iwFo8S$1gv18-wwUu|`GUtw}`VRogiV7*E6`ITl!il$}94~sm+gFQIpNJr$M=4t=s;coYOxchhc z^4X(%y8Hge?rHz!c(;E%EPnBB_xkX3IKJ+mzAe7w6abQk-Me?o)8Tdh=$H5JcQ1## z*Cl3jJ}f>t=b%630{zJcI0eKSd=)^f0JYQoc-WtiRrLL@+57fXU3C4a6wiPPIj#VQ z{V9f(tYj2G#H0Wz##2CXE|nDkp+9+_S3nH{Kw{`Q6jzBsawtAzln}*3C?dDkuP?U;&uZ$N_4ICWpS*BZpXsVdRip z$scg za^(rCSX8L7*P0yjdhkojIJLrq7Ld?yN4*k!l$*jYv6Y)`=c==StsZf8()EZ+loTv5 z0AfJQRRJ1YRWx3wt)k_gBmgJb3l=YfdW-f>qukJI)~(#wb!exb7AmZ@;2a;!_N11psJbCjdjA(sLI7BOY0I&?yBZI9+(pS05f-T(4u7iMHJoFHdau7Z6 zThL~4l4>28fy@M13$@+sFW7A)ZvjPzV1UvC_*}sflm1B}f=nMKM4rs<)w`sJ52LD2m>Kwwsew>%a_T4aq1f!LVBt z?`TU9F;EBwC`C1M31g|7xkRI=<{k4;6zid>LyR2@rt}cyTv1{VYFE^`e;5otZq_gn z-x)(ln{TVcC#FgqNL?+K4S~{{V_F^0x$J2j$U~FmJ~7##3hA~`rvPHuRLuajo6V+2 zwbUV1qiP0lh-%v+TYEA3wvh5>kEJP}1(2AN^g0|V4Lw1$r=NuR;!fdM>IIolR_%#xwYmO*|^8oFo%Q`^mRm`r81 z3<|@l2L>oTV64O2_p!}*dwvVrEKX9b12gd8=WJW#Sx_cJTLy`NLNGw-p^c8i{P)q( zn*TN#D)TQDCUDp56=t(mtt+f!8&JKmA!s_KSyk-?53Dl2+6u!An_w8A7OKs+!+7`k z));RA@Br*=*W;O3CS+S-cpYd$rg>TEfrn-pp>2f`hE*^O7=r0D_AuUk#x};A--33N zlN{?H3_PVf)AeL0qHY#kXesAPVYZ9 z1l<(S#e%*{z*rPu&EXV4469%Spckqwo_dQ~j58Mi-&VM4L)5JAJD5RVXOz)U<6(KeyZ`v(VIMxi&qY6c456C4`Q|rMTdCKV{nz8?=a;9&FK&U}7;^jJ z+fQ)2PtQLWteY#(v3adl%+}E&r+~kR2=;5hJYsXuO&V_#(ckut&3fP)MGUt^Ou@xB ziU_ww1aR(+BF38{)_~!yBBt9Sy6WFbtNFH7t^K3ajS<`FecXRKJRbY${k;C<&tO+R ze>L_$Uk-;4Ep9LV%l7Zb{r&FS^UG`d`Sp1C?*iTAW7!3|<8h<&=X79;Od~H`Wae}q zHnMO|7A{>pVudg#`|a=Y&&CH+zWK$~HNH%Ian3irwz$TZh%e3grUTM#v)c7f#7^#=S;0>F?It=rZf+w4T cH*5;)FwjY9M&$7IzPphB0pBp1+`%IN09@|#oB#j- literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/ocd_via2_3x.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/ocd_via2_3x.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..02b5be7215f7078c42c901f06262960d4a705886 GIT binary patch literal 187 zcmV;s07U;EiwFqfGGG8-zE^T3F0L_j;4uUWcMfW|$9HA|pQWC<- zi%iB58Yv-KJ-;-H0Zm-Hoc#CyyhMFum4yfBPbTQZw}VR5UztV$14gSHlUy^U8BFa_ zV}qeqZ3{dIpJ$3whOSc=;S8av(SmW_*#M2!9?O9?6h29&(SEaN?VkOZs(d-Td$G@W pDWF^9P22twS=b_SkF?Y9+aY}aS(U3lP?qUfEFNlYm4dDT007nBR15$B literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/vert_connects.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/vert_connects.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..092e10b09f4c6b1e0fbea3d1c4052cfe39d9bd52 GIT binary patch literal 594 zcmV-Y0KDcTrQDW~^$Gf&HK1@rN7dQ9VDtZ~s{FcIqy$W|x-tQ~!X=w*cw&PxJ`=?aW2j0O{U>=suTTCoZ}MNO#GK4nFldanUtUbziLLzT{qK z&Uy=w9t(<|QtWl&qHCa@cb-!RuwCX%$!)maj3u#Z6Lj|yWmR!iOOTY&^%)c83=~&2 zt&PmPKBldWxpmRoLZ&aFiNwfLSZ{>&?fz-lUQRSm|1LwDCY~Z58`zBvcZlZ$cJslU z2LX12AOk=hhh4{+b8BJOT4|}ZTQ_shxmmDl7L}g+0)1cjOQ{9Ww}2>D8~SP!P1}d& z?mM}P&{dI4*p4S%L9ay%c(8-s`aTfwU)9;~7G8VGo>hvI7>;K3rY z-vR*-Hc@;H1bnrMBsU!J)h@EDIN+;g*jM(J0<*Um)(vmNDtTo|Hex#yFOgFPUekPKp+h28Wv zl$0asl^k`IGbMG!Bt}q%#E1Y@%#_3x)7&)nacUlVhtV%ec5C~_Yh>&+!kF@VaW!K~ zMp5t~3MZiP*m@?bYz|vB rC#Sq_Usu0{#qZ>L58HB?#p&!q@D~xbn6Rl`f2Wzo~E>j?uyVC!PgU>f1wYb&1R61GS^}LmfSS)LP zE!tUr+o>5v(%eF1{d6KTdL@x}p_eEt(7T4fHvi-q@;EyZ}XHP@^_(ARu>N|W0x(NUP6Ts3P literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/vert_via_program_input.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/vert_via_program_input.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..ee65320081cef4022900ab1e38b9b4ae8ec09b0b GIT binary patch literal 225 zcmV<703QDziwFqfGp0x=8) z(0xwfBiLh4>_~`JFA}BcFoGad0_TUJ5~N;!22W}ZA?#sP3b4+v=h b6v=^qory-lt+RUm-YRr~v=~Mj2u+ literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/wafer_space/gf180mcu_ws_ip__id.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/wafer_space/gf180mcu_ws_ip__id.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..30b92dc9198bfb5c62d4be9dafdd16c3ef9ce8f8 GIT binary patch literal 39798 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 literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/wafer_space/gf180mcu_ws_ip__logo.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/wafer_space/gf180mcu_ws_ip__logo.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..3265f536ec281f9bc7a20d899a2e363c0f9fdd8f GIT binary patch literal 5363 zcmYLLc_7ql7tS=6vG42HvPGE&k+Fo3?3MLeGDe8(jD4SLNp><5Q{5~hWN8tGER7|5 zmZHc$Xlx@!OyZ;5`~7u(@B2RIJkN8^`Qs;gpMl}CL9oZE)9!8xs!(qiq*F+slZT&^ zlb5f%FT~r~{nVQMM2}mS|JyN(NOQ4}jmv9vF3DM7X7RXjzGk7^>7wpT0pmNJ3zS!P zKfZXt_d&mHkZsy7YSPisG0OHy%r1Fzt)O~i`rs#JwksSx=zF-oUQjKn)pGcqk~FB* zLdq{fTT!WtKU!jNk`$Frab0!z$%jvdC#~vm}}C!rR>m%YBw$v~E5^!o#W;mrD2`G4OjMu|Y?(0f{7Z2A zT?3fjY6Wo4Q#Zijt^uOR*F11V8CH>d@jhpS-kj&CWKgE@%{koQyRSA@_J}pR_rX2sn7b3YQdRd zv;+b9G~Rfv71Za&?(m8yp}J?C4ph7-3w{0>uHqqCT>_lLL!_uWmLvd+<2kH$k0^l9 z!{T74o->~LY81PIW20x%?n~T*L*Nn)or%z| zUzhK$4q&%=l&xcT8%F;2*yzg~_U7eiO(^bln?{s#hC?$)tudXf6X^9;SrOl2$*wF^ z`gNO)xP9VB=kKr^1-CQjqRR5WI3M_INkT$1$Hj`n1xFIlbjY|_K4v#m!b1cJ7FR}( zn9BO+ARFl)gS=5-I#Vmr=k`|}m0M=ULR*X-3LxlzN|-Ij1I;|aZGI3s<2~asQ<)k| zl=j}$*2(wQc1uULdcxrK?5NMH&US%%g=hXkhgl+dgzH+#+;p$x+v43afH-v)Om9 zOJ{R%kNFkQx#uE2lqC`L6ftA2k=G$t@1@_;Ln3Zd7vo%H~Ip z6ih!Aj&E;P=ENR+cjSEZ-mEf58$4@o*H%v+*tz$Zx(T255&8#%f{gh&QD2^ z0vG z_APByZC>nHu$Vpsiy|e|(2fZacADhrX8-h`a$?=d#$oTfkFBkW%{*!?44(GdymO* z<6lI*jP90o2A5V4uBK!5tCVsuhE!_t?FG{(bTwzT2Q06N9Wo)c@0Kx;cU@>t}ZP-oK@A6o; z<;_q#TTU2`r}%s$CDs0I{ra;6^SsRNEveSmAV8D*-(fol$EF?~2UErOsVaaGLEvNq zSDm%E=9@%TSa|+TNkUC@yz?&I)@@1b(o-%>pjhX_(~n(A(*2<4))w=qvWj16kde+B zeT+NbzN&N{7e-I4QzKx~R4y~cyNdx$7oRkIxkE}9R(wssSuTm!3CJ4=E-QHBJLz&ZC3@=C&NZ3VE*Rf#V%XBh304+w?NCXRk42bcU2(zf+sNM1{g6Q z(KQU&;zUI8zWa1`(EoyXaoKzgzANZ6>7pf~;+*dDfeekt83gib%|{M}0kE+#C*jiE z)D^K#BtTq|Ytm9Hxe~$a1vzLa^I@EWc9bUiV&;I;!*8G+pib^fm{Qd%Iwt-y&<-7V zih7(ZE5Ks%UYT+)Rtdo;b+#!u{%2|qX+`pbyXL#}`KtuuK$`T(I}D5lW@LG9rgSV^ zH30QFO9Go95dugD>op?wR^RKShA&|3l*~h9c1qfP6q2_8N_PVcm7D0a|BzT8p>dH_ z4lN@zl(;&}O7RckluRY5{-(>e=H>q;(Q0r2QvgR zU&ZJ`ao9FY2*&8>v;?IGP9}1Zg~iwxRpX8h`}epkD%=cI7Ga9vB% zYsrv!l?=u`@9Xt(=4Uo00}uc(f_{3B-@nc_`{K31IY3;0TP4e|Urf2w%h_{%Zf1El zQa!_Tjz;8BWrQuOYT1p!3&o`&PZy=6+okU&DeI~+HE!^7N>t?u0p@70*5H$Z2Gi#` zl)lT0h9X5!NmyqstcZr`4Z|%;yXMMb6TMH_#$SF+ex(q! z*PaFc0loMS^oplQ05_=}-(Co<^$u0I0KY>?Q5|GrUxQ@LbWbSPD*~EP&1Y@k_QkSp z9nD2QMLb9he*Mh`U-C~k6F`qk#?MkX8NR&&zv`4`5m2o6eC1g0nJPJ;%j|B$Qn-VP zt)Qc^SpyDQtX37X803^=S=4DHN?x>+#=M12+cY34P^>o}(3(xAW?%V{OEu<>KXRQPq?LFv(~E~+Z!(F5-Q^S)+-h*<;F7)zJS`LO_##OsMi5)$y_zxqzx?N zY)Q9#4B5}<#XI+}Bg+Li3Z-Nq_7CBUX4_T3cv_kL@rCuQ%#2IK(60sI6}50ceQ!l@ z6^(kxyMCtLNc9k0r=AWXzaWo~1*3XfOGqE7u=xOngxto8H2kI!@&RxRz+TXJqKz}nnQBXELa z0t&pV52-qE_Iz&;mSG7r|GsUpqHDtJT0x4#HB}mdbZ>nLhvy4@`NeYjws~0&Ps#mf zaV+l{Y&jV8sN!8S593^ayj*VXp4sMg-qYqKsLdL%tej0YCB97SAZB=6@5sKN$A89G znR)l%oWnO+nn1s~H{gg|C3+zt0J=i>QAD#h8c-BM)U<*zOi@B8Rc2nV_*S{A!-CTh zTSMuW#Wr1^l8I0KZp3$eDDsR1-nXh&vZhs7(y94u3k`eJwqW&~RRYc>wsQk!wsOaf zjD9)Jz{Rgb$GWOkB+DMo%-3T1cFp)Nhm=aC7Lw=ut{BP&ZER-gavzTswPxy>SuC#< zqojV?z4%Ry0o*rQ@@WD1ybMx{BfSW)3KVp|VH;2`&r4w*FBh2t0&osVW_&VGNA1;M z_GFN!4V%N@htv>6qaMKeMk5s?@G$BLT|~^n%ik zL~@HN&h_)gOpr_JH^${h{VrE*Y%}hDI33@3Q9A;f^0ypWkHSp!v@#$8`_See#&qCq zvn#l$PyRdtQo9_!aw>eT6@x*5;I2BlAFAr5zycI)sy)6dy%1a4t-sTp6^q=golXTl z8RToUuG);^D%>`ns@LbwaKMatXfABdBW@+e*_oF4-*-v|zK@XW87`V|BM(qn}QQ~yiP+A_h<7*6Vp%odfVz)*_ z0M5xR-3WM5bXz8m7;B~8X6-myo|d_ktMB{ZZAm~^A_YGl_rm82G{0jo%(o$nU=j?z z7a=s#s8gw=eacwg z*t53@)~7lnd{XkRknC@zaDvN6joBL(STuo0{|Re=xWt_u?b2^NQE5zkPGsSy8dIkrv}L*rPh#4`&8O!&z|!-!)ZljK@1n6G zAZYpq`tpkqjEE!vS64wdGOWA)$ZXIiltX?4*-4YrLB5~Nn?0=>#jylYWchi^*PS`YYmMVJ(;Mfu8S;9VXY@TNc&1)gt!U~#A zI5V!$So`E~Dg@^Pp zgRpacB^}x#YCRiE;3p`y=W&aC|0j>yoNoNBY|NE);%9jykiWEhe=0iZ3cM-SgHyny zm+XL0jh1NIHp<&jK@FK$shP&qIwonfw&;puYAv3438gX;U3a#bKHK}g-BVQU@X;?_Z$KX&BYDU0+ALHghitzud~;;=DadG( zpo;kWsq;MocN+6sFD1;PGK`1uMIt>b6^m(pK;U*H&+m!A^UD?(WDkTyZgYn@r}CN8 z`5LCe)aHaoGv9~ROP7-+5GK_eA8mDa&Jxg+4t0e-W|T+wf~K-BJK;<3#)wUqWO?yZKsNCEw&C-f}ej@3Gt9y$8$0@K;6UzmTs;}~&2p~aAe+w?_jWTxh`PZzeW0fW5n6&vf z?6=*Y_QS-T6B&Y=#gH+Z_)%iO-ch6Jv+$Eyc!w?76HZ;~G0bM9^xqCwvFQBQ_|8Dm zNs+SNTJa-JQh@P)k9j8zcG%K75_Hn}Khcw}td~VS@g!HR?~h@viRC zfKLcFv1%vVLJIJH|GO*y?$-aOJ+^X@iZU$Sm)~`L^>6jnu88Q1AEx+VYUsJjcH9$^14!d40Wp|>X5oKF|8RR zdT>At5si*yp4pnvn*Ozc4iSxs{;@t{E*eeU5l7^;>{FZ$wyJ}^>r{pvX0%u+9k5** M4m|%=j^@<=03QQ}kpKVy literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/wafer_space/sealring.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/wafer_space/sealring.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..5f60c3f89822e3ee245daa879b2404ea4183e094 GIT binary patch literal 209 zcmV;?051O@iwFq5UUq2!19N3zY;tLCXD)4FX8>JJK?;K~5WMFVd+0ePF-8wXC}>Ne z^iaKv)tCy6N)kc(`l_@=$`0(#vO6=nRBeTvtRA2m8WCNM339EL)|Gky8j66EkPD7R zE5XY0Y1&Q|6NMky(SrQF_%!q*j+`kw+w?{Q1+v!M(Y>G6IgA7+5D>u#+V5d7{UD8N zrG+>~)-BR-O0puoCcq+2nJ?IOe>`7Oz}TCiYU_RD;F)0c+FoY);g)|i7+=g}S1&Ga L;99+@{r~^~1sh-n literal 0 HcmV?d00001 diff --git a/testdata/magic/gf180mcu_ocd_sram_test/wafer_space/sealring_x1.mag.gz b/testdata/magic/gf180mcu_ocd_sram_test/wafer_space/sealring_x1.mag.gz new file mode 100644 index 0000000000000000000000000000000000000000..bcae5254c32e191ff0357db77825a5a4a113ae97 GIT binary patch literal 603 zcmV-h0;K&PiwFqWM|Nod19N3zY;tLCXJ2?RE^T3F0PR-WYTG~%eb-m)57gP4Rx1dB zfYVYaeQ5GtRC%q4SgNoT0{!~#>~+-ChCH;CVlcbjIdjgAXO3+RP1m=@V%kU2?U|-S z`@AiNrkmU5Uvd1;1;uu7GJRYJ?+`kJ(lrhS^4eq6}SO>s2sLf&yoX;>?* zrQJ%Z?Gf^)`T5(f-|r!NIraoF2`Tnkc&}_8nT=NpF^5-Ls+8fVDH3ock;02tfPkPF zhUAC|NOg8rNETM?X>a`h= zMkI#N$_kM1HY@OxRsfT@#b-I$c&5lE+)v8iio63SiBe2f$b1nBLTt5$S z#DuR$(v%S|p%^bUQV6qAQ5i}3hmP#XGy#2j0{Esdfh>D!0$gV9FB5RFfQPzMX;AaJ z?h*GxWl=ceR;aA!d9LHr@%v)q!q;aW0o7aV{8@zWjIY_9C9 p+s#+AX%2vG>|xXWz?t_Cw_hIY)4qGMH{%X2_z9{fJDMB}0078FF(3c{ literal 0 HcmV?d00001 From 07382eb9a0b5816cc8451a9bbf6476fb8c4ed771 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 21:13:02 +0000 Subject: [PATCH 16/19] Bump pypa/cibuildwheel from 3.3.0 to 3.3.1 Bumps [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel) from 3.3.0 to 3.3.1. - [Release notes](https://github.com/pypa/cibuildwheel/releases) - [Changelog](https://github.com/pypa/cibuildwheel/blob/main/docs/changelog.md) - [Commits](https://github.com/pypa/cibuildwheel/compare/v3.3.0...v3.3.1) --- updated-dependencies: - dependency-name: pypa/cibuildwheel dependency-version: 3.3.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 847788b91..989c05bfc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -66,7 +66,7 @@ jobs: mkdir -p $HOST_CCACHE_DIR - name: Build wheels (ARM) if: matrix.os == 'ubuntu-24.04-arm' - uses: pypa/cibuildwheel@v3.3.0 + uses: pypa/cibuildwheel@v3.3.1 env: # override the default CentOS “yum install … ccache” and drop ccache CIBW_BEFORE_ALL_LINUX: | @@ -81,7 +81,7 @@ jobs: - name: Build wheels (all other platforms) if: matrix.os != 'ubuntu-24.04-arm' - uses: pypa/cibuildwheel@v3.3.0 + uses: pypa/cibuildwheel@v3.3.1 env: CIBW_BUILD: ${{ matrix.cibuild }} CIBW_ARCHS_MACOS: ${{ matrix.macos-arch }} From d26d625c5ab180ea9c0b1f487be37c78d322484e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 21:13:05 +0000 Subject: [PATCH 17/19] Bump styfle/cancel-workflow-action from 0.12.1 to 0.13.0 Bumps [styfle/cancel-workflow-action](https://github.com/styfle/cancel-workflow-action) from 0.12.1 to 0.13.0. - [Release notes](https://github.com/styfle/cancel-workflow-action/releases) - [Commits](https://github.com/styfle/cancel-workflow-action/compare/0.12.1...0.13.0) --- updated-dependencies: - dependency-name: styfle/cancel-workflow-action dependency-version: 0.13.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 847788b91..00d3c0ea0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,7 +48,7 @@ jobs: large-packages: true - uses: hmarr/debug-action@v3 - name: Cancel Workflow Action - uses: styfle/cancel-workflow-action@0.12.1 + uses: styfle/cancel-workflow-action@0.13.0 - uses: actions/checkout@v6 - name: ccache if: matrix.os != 'ubuntu-24.04-arm' From 1c3f7937f4e229994dafa7b35ea46586842bf349 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 5 Feb 2026 21:36:01 +0100 Subject: [PATCH 18/19] Adding Python 3.14 to Windows. Experimental. --- azure-pipelines.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f273e799a..f85e030bd 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -38,6 +38,9 @@ jobs: cp313-cp313-win_amd64.whl: python.version: '3.13' python.architecture: 'x64' + cp314-cp314-win_amd64.whl: + python.version: '3.14' + python.architecture: 'x64' cp36-cp36m-win32.whl: python.version: '3.6' python.architecture: 'x86' @@ -62,6 +65,9 @@ jobs: cp313-cp313-win32.whl: python.version: '3.13' python.architecture: 'x86' + cp314-cp314-win32.whl: + python.version: '3.14' + python.architecture: 'x86' maxParallel: 6 steps: From c575ce362bb0d0780d25144ee232366b2972e280 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 5 Feb 2026 21:45:58 +0100 Subject: [PATCH 19/19] Updating Windows image --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f85e030bd..86575fedc 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -11,7 +11,7 @@ trigger: jobs: - job: Build pool: - vmImage: 'windows-2019' # other options: 'macOS-10.13', 'ubuntu-16.04' + vmImage: 'windows-2022' # other options: 'macOS-10.13', 'ubuntu-16.04' strategy: matrix: cp36-cp36m-win_amd64.whl: