diff --git a/src/ant/ant/antService.cc b/src/ant/ant/antService.cc index 7db0555f0..b7a4f55a9 100644 --- a/src/ant/ant/antService.cc +++ b/src/ant/ant/antService.cc @@ -1530,8 +1530,10 @@ Service::mouse_click_event (const db::DPoint &p, unsigned int buttons, bool prio db::DPoint pt = snap1 (p, m_obj_snap && tpl.snap ()).second; // begin the transaction - tl_assert (! manager ()->transacting ()); - manager ()->transaction (tl::to_string (tr ("Create ruler"))); + if (manager ()) { + tl_assert (! manager ()->transacting ()); + manager ()->transaction (tl::to_string (tr ("Create ruler"))); + } m_current = ant::Object (pt, pt, 0, tpl); show_message (); @@ -1539,7 +1541,9 @@ Service::mouse_click_event (const db::DPoint &p, unsigned int buttons, bool prio insert_ruler (m_current, true); // end the transaction - manager ()->commit (); + if (manager ()) { + manager ()->commit (); + } } else if (tpl.mode () == ant::Template::RulerAutoMetric) { @@ -1567,8 +1571,10 @@ Service::mouse_click_event (const db::DPoint &p, unsigned int buttons, bool prio if (ee.any) { // begin the transaction - tl_assert (! manager ()->transacting ()); - manager ()->transaction (tl::to_string (tr ("Create ruler"))); + if (manager ()) { + tl_assert (! manager ()->transacting ()); + manager ()->transaction (tl::to_string (tr ("Create ruler"))); + } m_current = ant::Object (ee.first, ee.second, 0, tpl); show_message (); @@ -1576,7 +1582,9 @@ Service::mouse_click_event (const db::DPoint &p, unsigned int buttons, bool prio insert_ruler (m_current, true); // end the transaction - manager ()->commit (); + if (manager ()) { + manager ()->commit (); + } } @@ -1603,8 +1611,10 @@ Service::mouse_click_event (const db::DPoint &p, unsigned int buttons, bool prio // create the ruler object // begin the transaction - tl_assert (! manager ()->transacting ()); - manager ()->transaction (tl::to_string (tr ("Create ruler"))); + if (manager ()) { + tl_assert (! manager ()->transacting ()); + manager ()->transaction (tl::to_string (tr ("Create ruler"))); + } show_message (); @@ -1615,7 +1625,9 @@ Service::mouse_click_event (const db::DPoint &p, unsigned int buttons, bool prio clear_transient_selection (); // end the transaction - manager ()->commit (); + if (manager ()) { + manager ()->commit (); + } } @@ -2256,9 +2268,13 @@ Service::menu_activated (const std::string &symbol) if (symbol == "ant::clear_all_rulers_internal") { clear_rulers (); } else if (symbol == "ant::clear_all_rulers") { - manager ()->transaction (tl::to_string (tr ("Clear all rulers"))); + if (manager ()) { + manager ()->transaction (tl::to_string (tr ("Clear all rulers"))); + } clear_rulers (); - manager ()->commit (); + if (manager ()) { + manager ()->commit (); + } } else { lay::Plugin::menu_activated (symbol); } diff --git a/src/db/db/dbFlatEdges.cc b/src/db/db/dbFlatEdges.cc index bfb75087c..8f1e1ae02 100644 --- a/src/db/db/dbFlatEdges.cc +++ b/src/db/db/dbFlatEdges.cc @@ -82,7 +82,7 @@ void FlatEdges::invalidate_cache () void FlatEdges::init () { - m_is_merged = true; + m_is_merged = false; m_merged_edges_valid = false; } @@ -321,9 +321,7 @@ const db::RecursiveShapeIterator *FlatEdges::iter () const void FlatEdges::do_insert (const db::Edge &edge) { - if (! empty ()) { - m_is_merged = false; - } + m_is_merged = empty (); mp_edges->insert (edge); invalidate_cache (); diff --git a/src/db/db/dbFlatRegion.cc b/src/db/db/dbFlatRegion.cc index a2314efe1..e12344c92 100644 --- a/src/db/db/dbFlatRegion.cc +++ b/src/db/db/dbFlatRegion.cc @@ -82,7 +82,7 @@ void FlatRegion::invalidate_cache () void FlatRegion::init () { - m_is_merged = true; + m_is_merged = false; m_merged_polygons_valid = false; } diff --git a/src/db/db/dbOriginalLayerEdges.cc b/src/db/db/dbOriginalLayerEdges.cc index 0282d77e1..a3e4c9f33 100644 --- a/src/db/db/dbOriginalLayerEdges.cc +++ b/src/db/db/dbOriginalLayerEdges.cc @@ -270,7 +270,7 @@ OriginalLayerEdges::less (const Edges &other) const void OriginalLayerEdges::init () { - m_is_merged = true; + m_is_merged = false; m_merged_edges_valid = false; } diff --git a/src/db/db/dbOriginalLayerRegion.cc b/src/db/db/dbOriginalLayerRegion.cc index 2049fb93f..f02ff0268 100644 --- a/src/db/db/dbOriginalLayerRegion.cc +++ b/src/db/db/dbOriginalLayerRegion.cc @@ -382,7 +382,7 @@ OriginalLayerRegion::less (const Region &other) const void OriginalLayerRegion::init () { - m_is_merged = true; + m_is_merged = false; m_merged_polygons_valid = false; } diff --git a/src/db/db/gsiDeclDbNetlist.cc b/src/db/db/gsiDeclDbNetlist.cc index a63590b5e..fdaab035a 100644 --- a/src/db/db/gsiDeclDbNetlist.cc +++ b/src/db/db/gsiDeclDbNetlist.cc @@ -260,7 +260,7 @@ static const db::Net *net_for_terminal_by_name_const (const db::Device *device, } } -static const db::Net *net_for_terminal_by_name (db::Device *device, const std::string &name) +static db::Net *net_for_terminal_by_name (db::Device *device, const std::string &name) { if (! device->device_class () || ! device->device_class ()->has_terminal_with_name (name)) { return 0; @@ -2832,7 +2832,7 @@ Class db_NetlistSpiceReader (db_NetlistReader, "db", "Ne "Use the SPICE reader like this:\n" "\n" "@code\n" - "writer = RBA::NetlistSpiceReader::new\n" + "reader = RBA::NetlistSpiceReader::new\n" "netlist = RBA::Netlist::new\n" "netlist.read(path, reader)\n" "@/code\n" diff --git a/src/drc/unit_tests/drcSimpleTests.cc b/src/drc/unit_tests/drcSimpleTests.cc index eed4957f8..30681c13b 100644 --- a/src/drc/unit_tests/drcSimpleTests.cc +++ b/src/drc/unit_tests/drcSimpleTests.cc @@ -1318,3 +1318,13 @@ TEST(54_issue1011) run_test (_this, "54", false); } +TEST(55_drccount) +{ + run_test (_this, "55", false); +} + +TEST(55d_drccount) +{ + run_test (_this, "55", true); +} + diff --git a/src/lvs/lvs/templates/lvs.lym b/src/lvs/lvs/templates/lvs.lym index 7b74b5643..f3ab2e958 100644 --- a/src/lvs/lvs/templates/lvs.lym +++ b/src/lvs/lvs/templates/lvs.lym @@ -98,13 +98,16 @@ connect_global(ptie, "SUBSTRATE") # ------------------------------------------------------------------- # Netlist and compare -# Netlist normalization -netlist.simplify +# Netlist extraction +netlist -# Hierarchy alignment (flatten out unmatched cells) +# Hierarchy alignment (flatten out unmatched cells, specifically device cells) align -# Netlist vs. netlist +# Netlist normalization and device combination +netlist.simplify + +# Netlist vs. netlist check compare diff --git a/testdata/drc/drcSimpleTests_55.drc b/testdata/drc/drcSimpleTests_55.drc new file mode 100644 index 000000000..7d3663fd3 --- /dev/null +++ b/testdata/drc/drcSimpleTests_55.drc @@ -0,0 +1,20 @@ + +source $drc_test_source +target $drc_test_target + +if $drc_test_deep + deep +end + +licon = input(66, 44) + +licon.output(66, 44) + +licon_cluster = licon.sized(0.2).sized(-0.2) + +single = licon_cluster.drc(secondary(licon).count == 1) +single.sized(0.1).output(100, 0) + +single = licon_cluster.drc(if_any(secondary(licon).count == 1)) +single.sized(0.1).output(101, 0) + diff --git a/testdata/drc/drcSimpleTests_55.gds b/testdata/drc/drcSimpleTests_55.gds new file mode 100644 index 000000000..962ce17eb Binary files /dev/null and b/testdata/drc/drcSimpleTests_55.gds differ diff --git a/testdata/drc/drcSimpleTests_55d.gds b/testdata/drc/drcSimpleTests_55d.gds new file mode 100644 index 000000000..9e4e4847d Binary files /dev/null and b/testdata/drc/drcSimpleTests_55d.gds differ diff --git a/testdata/drc/drcSimpleTests_au55.gds b/testdata/drc/drcSimpleTests_au55.gds new file mode 100644 index 000000000..5fb75f2a7 Binary files /dev/null and b/testdata/drc/drcSimpleTests_au55.gds differ diff --git a/testdata/drc/drcSimpleTests_au55d.gds b/testdata/drc/drcSimpleTests_au55d.gds new file mode 100644 index 000000000..600937dbd Binary files /dev/null and b/testdata/drc/drcSimpleTests_au55d.gds differ