Merge pull request #1726 from KLayout/bugfix/issue-1722

Proposing a fix for issue #1722: add a '...' menu to hold the dynamic…
This commit is contained in:
Matthias Köfferlein 2024-06-03 22:57:36 +02:00 committed by GitHub
commit b726872598
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 6138 additions and 77 deletions

View File

@ -132,6 +132,7 @@ drop_class "QContainerInfo"
drop_class "QContiguousCache"
drop_class "QContiguousCacheData"
drop_class "QContiguousCacheTypedData"
drop_class "QDeferredDeleteEvent" # was a mistake, I think
drop_class "QEnableSharedFromThis"
drop_class "QException" # (TODO) no mapping yet
drop_class "QExplicitlySharedDataPointer"
@ -258,7 +259,6 @@ drop_class "QStringBuilder"
drop_class "QStringBuilder"
drop_class "QStringBuilderBase"
drop_class "QStringBuilderCommon"
# @@@ drop_class "QStringConverterBase"
drop_class "QStringDecoder", /EncodedData/
drop_class "QStringEncoder", /DecodedData/
drop_class "QStringListIterator"
@ -460,6 +460,8 @@ drop_method "QTextCodec", /QTextCodec::codecForName\(const\s+QByteArray/ # clash
drop_method "QTextCodec", /QTextCodec::toUnicode\(const\s+QByteArray/ # clashes with const char * variant
drop_method "QTextCodec", /QTextCodec::fromUnicode\(const\s+QChar\s+\*/ # requires real QChar *
drop_method "QTextEncoder", /QTextEncoder::fromUnicode\(const\s+QChar\s+\*/ # requires real QChar *
drop_method "QTimeZone", /::operator\s*==/ # no longer supported on Qt 6.7
drop_method "QTimeZone", /::operator\s*!=/ # no longer supported on Qt 6.7
drop_method "", /::operator\s*==\(const\s+QVariant\s*&\w+,\s*const\s+QVariantComparisonHelper/ # requires QVariantComparisonHelper
drop_method "", /::operator\s*!=\(const\s+QVariant\s*&\w+,\s*const\s+QVariantComparisonHelper/ # requires QVariantComparisonHelper
drop_method "QByteArrayMatcher", /QByteArrayMatcher::indexIn\(const\s+QByteArray/ # clashes with const char * variant
@ -535,7 +537,6 @@ no_copy_ctor "QBasicMutex"
no_copy_ctor "QMapDataBase"
no_copy_ctor "QChildEvent"
no_copy_ctor "QDynamicPropertyChangeEvent"
no_copy_ctor "QDeferredDeleteEvent"
no_copy_ctor "QEvent"
no_copy_ctor "QPropertyNotifier"
no_copy_ctor "QPropertyObserver"
@ -859,6 +860,8 @@ include "QWindow", [ "<QWindow>", "<QScreen>",
"<QShowEvent>", "<QTabletEvent>", "<QTouchEvent>", "<QWheelEvent>" ]
include "QOffscreenSurface", [ "<QOffscreenSurface>", "<QScreen>" ]
include "QScreenOrientationChangeEvent", [ "<QScreenOrientationChangeEvent>", "<QScreen>" ]
include "QPointerEvent", [ "<QPointerEvent>", "<QEventPoint>", "<QInputDevice>", "<QObject>",
"<QPointingDevice>", "<QPointer>" ] # <QPointer> needed for Qt 6.7
drop_method "QWindow", /QWindow::handle/ # QPlatformWindow not available
drop_method "QScreen", /QScreen::handle/ # QPlatformScreen not available
@ -1284,8 +1287,8 @@ include "QOcspCertificateStatus", [ "<QOcspResponse>" ] # global enum without o
include "QDtlsError", [ "<QDtlsClientVerifier>" ] # global enum without own header
drop_class "QTlsPrivate" # private data
drop_class "QOcspResponse" # @@@ TODO: debug
drop_method "QSslSocket", /QSslSocket::ocspResponses\(/ # @@@ TODO: debug
drop_class "QOcspResponse" # TODO: debug
drop_method "QSslSocket", /QSslSocket::ocspResponses\(/ # TODO: debug
drop_method "QUrlInfo", /QUrlInfo::QUrlInfo\(.*permissions/ # too many arguments (13)
drop_method "QHostAddress", /QHostAddress::QHostAddress\(\s*(const\s*)?quint8\s*\*/ # requires char *, a string version is available for IPv6

View File

@ -283,7 +283,7 @@ TEST(insert_many)
tris.insert_point (x, y);
}
EXPECT_LT (double (tris.flips ()) / double (n), 3.0);
EXPECT_LT (double (tris.flips ()) / double (n), 3.1);
EXPECT_LT (double (tris.hops ()) / double (n), 23.0);
}

View File

@ -78,5 +78,20 @@
not defined.
</p>
<h2>A Note for MacOS Users</h2>
<p>
The Qt/MacOS combination does not allow for dynamically configuring
the main menu. On MacOS the behavior is as follows:
</p>
<p>
Every top-level menu entry that is generated either by code or by configuring
a macro correspondingly, will be shown in a separate entry in the main toolbar.
This entry is labelled "..." and is shown only when it is populated. All
non-standard main menu entries are placed there in the same order they would
appear in the main menu.
</p>
</doc>

View File

@ -40,7 +40,6 @@ SOURCES += \
$$PWD/gsiDeclQDeadlineTimer.cc \
$$PWD/gsiDeclQDebug.cc \
$$PWD/gsiDeclQDebugStateSaver.cc \
$$PWD/gsiDeclQDeferredDeleteEvent.cc \
$$PWD/gsiDeclQDir.cc \
$$PWD/gsiDeclQDirIterator.cc \
$$PWD/gsiDeclQDynamicPropertyChangeEvent.cc \

View File

@ -397,25 +397,6 @@ static void _call_f_offsetFromUtc_c2175 (const qt_gsi::GenericMethod * /*decl*/,
}
// bool QTimeZone::operator!=(const QTimeZone &other)
static void _init_f_operator_excl__eq__c2205 (qt_gsi::GenericMethod *decl)
{
static gsi::ArgSpecBase argspec_0 ("other");
decl->add_arg<const QTimeZone & > (argspec_0);
decl->set_return<bool > ();
}
static void _call_f_operator_excl__eq__c2205 (const qt_gsi::GenericMethod * /*decl*/, void *cls, gsi::SerialArgs &args, gsi::SerialArgs &ret)
{
__SUPPRESS_UNUSED_WARNING(args);
tl::Heap heap;
const QTimeZone &arg1 = gsi::arg_reader<const QTimeZone & >() (args, heap);
ret.write<bool > ((bool)((QTimeZone *)cls)->operator!= (arg1));
}
// QTimeZone &QTimeZone::operator=(const QTimeZone &other)
@ -435,25 +416,6 @@ static void _call_f_operator_eq__2205 (const qt_gsi::GenericMethod * /*decl*/, v
}
// bool QTimeZone::operator==(const QTimeZone &other)
static void _init_f_operator_eq__eq__c2205 (qt_gsi::GenericMethod *decl)
{
static gsi::ArgSpecBase argspec_0 ("other");
decl->add_arg<const QTimeZone & > (argspec_0);
decl->set_return<bool > ();
}
static void _call_f_operator_eq__eq__c2205 (const qt_gsi::GenericMethod * /*decl*/, void *cls, gsi::SerialArgs &args, gsi::SerialArgs &ret)
{
__SUPPRESS_UNUSED_WARNING(args);
tl::Heap heap;
const QTimeZone &arg1 = gsi::arg_reader<const QTimeZone & >() (args, heap);
ret.write<bool > ((bool)((QTimeZone *)cls)->operator== (arg1));
}
// QTimeZone::OffsetData QTimeZone::previousTransition(const QDateTime &beforeDateTime)
@ -792,9 +754,7 @@ static gsi::Methods methods_QTimeZone () {
methods += new qt_gsi::GenericMethod ("nextTransition", "@brief Method QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime)\n", true, &_init_f_nextTransition_c2175, &_call_f_nextTransition_c2175);
methods += new qt_gsi::GenericMethod ("offsetData", "@brief Method QTimeZone::OffsetData QTimeZone::offsetData(const QDateTime &forDateTime)\n", true, &_init_f_offsetData_c2175, &_call_f_offsetData_c2175);
methods += new qt_gsi::GenericMethod ("offsetFromUtc", "@brief Method int QTimeZone::offsetFromUtc(const QDateTime &atDateTime)\n", true, &_init_f_offsetFromUtc_c2175, &_call_f_offsetFromUtc_c2175);
methods += new qt_gsi::GenericMethod ("!=", "@brief Method bool QTimeZone::operator!=(const QTimeZone &other)\n", true, &_init_f_operator_excl__eq__c2205, &_call_f_operator_excl__eq__c2205);
methods += new qt_gsi::GenericMethod ("assign", "@brief Method QTimeZone &QTimeZone::operator=(const QTimeZone &other)\n", false, &_init_f_operator_eq__2205, &_call_f_operator_eq__2205);
methods += new qt_gsi::GenericMethod ("==", "@brief Method bool QTimeZone::operator==(const QTimeZone &other)\n", true, &_init_f_operator_eq__eq__c2205, &_call_f_operator_eq__eq__c2205);
methods += new qt_gsi::GenericMethod ("previousTransition", "@brief Method QTimeZone::OffsetData QTimeZone::previousTransition(const QDateTime &beforeDateTime)\n", true, &_init_f_previousTransition_c2175, &_call_f_previousTransition_c2175);
methods += new qt_gsi::GenericMethod ("standardTimeOffset", "@brief Method int QTimeZone::standardTimeOffset(const QDateTime &atDateTime)\n", true, &_init_f_standardTimeOffset_c2175, &_call_f_standardTimeOffset_c2175);
methods += new qt_gsi::GenericMethod ("swap", "@brief Method void QTimeZone::swap(QTimeZone &other)\n", false, &_init_f_swap_1510, &_call_f_swap_1510);

View File

@ -153,10 +153,6 @@ class QDebugStateSaver;
namespace gsi { GSI_QTCORE_PUBLIC gsi::Class<QDebugStateSaver> &qtdecl_QDebugStateSaver (); }
class QDeferredDeleteEvent;
namespace gsi { GSI_QTCORE_PUBLIC gsi::Class<QDeferredDeleteEvent> &qtdecl_QDeferredDeleteEvent (); }
class QDir;
namespace gsi { GSI_QTCORE_PUBLIC gsi::Class<QDir> &qtdecl_QDir (); }

View File

@ -32,6 +32,7 @@
#include <QInputDevice>
#include <QObject>
#include <QPointingDevice>
#include <QPointer>
#include "gsiQt.h"
#include "gsiQtGuiCommon.h"
#include <memory>

View File

@ -233,14 +233,14 @@ ImageProxy::get_image () const
if (! m_byte_data.empty ()) {
std::list<std::string>::const_iterator s = m_byte_data.begin ();
for (size_t i = 0; i < m_height; ++i) {
for (size_t i = 0; i < m_height && s != m_byte_data.end (); ++i) {
string_to_pixels<unsigned char, unsigned char> (img.get (), *s++, i, m_width, m_color);
}
} else {
std::list<std::string>::const_iterator s = m_data.begin ();
for (size_t i = 0; i < m_height; ++i) {
for (size_t i = 0; i < m_height && s != m_data.end (); ++i) {
string_to_pixels<float, unsigned char> (img.get (), *s++, i, m_width, m_color);
}

View File

@ -4350,6 +4350,10 @@ public:
menu_entries.push_back (lay::submenu ("zoom_menu", at, tl::to_string (QObject::tr ("&Display"))));
menu_entries.push_back (lay::submenu ("tools_menu", at, tl::to_string (QObject::tr ("&Tools"))));
menu_entries.push_back (lay::submenu ("macros_menu", at, tl::to_string (QObject::tr ("&Macros"))));
if (lay::AbstractMenu::wants_extra_menu ()) {
// for MacOS
menu_entries.push_back (lay::submenu (lay::AbstractMenu::extra_menu_name (), at, "..."));
}
menu_entries.push_back (lay::separator ("help_group", at));
menu_entries.push_back (lay::submenu ("help_menu", at, tl::to_string (QObject::tr ("&Help"))));
menu_entries.push_back (lay::submenu ("@secrets", at, tl::to_string (QObject::tr ("Secret Features"))));

View File

@ -1225,6 +1225,36 @@ static QAction *insert_action_after (QWidget *widget, QAction *after, QAction *a
return action;
}
static const std::string s_extras_menu_name ("_extras_menu");
static QMenu *find_extras_menu (QMenuBar *mbar)
{
if (! mbar) {
return 0;
}
QList<QAction *> a = mbar->actions ();
for (QList<QAction *>::const_iterator i = a.begin (); i != a.end (); ++i) {
if (tl::to_string ((*i)->objectName ()) == s_extras_menu_name) {
return (*i)->menu ();
}
}
return 0;
}
bool
AbstractMenu::wants_extra_menu ()
{
return !s_can_move_menu;
}
const std::string &
AbstractMenu::extra_menu_name ()
{
return s_extras_menu_name;
}
void
AbstractMenu::build (QMenuBar *mbar, QToolBar *tbar)
{
@ -1234,10 +1264,22 @@ AbstractMenu::build (QMenuBar *mbar, QToolBar *tbar)
std::set<std::pair<size_t, QAction *> > present_actions;
if (mbar) {
QList<QAction *> a = mbar->actions ();
for (QList<QAction *>::const_iterator i = a.begin (); i != a.end (); ++i) {
present_actions.insert (std::make_pair (id_from_action (*i), *i));
}
}
// NOTE: on MacOS, once the top level menu is created, we should not
// modify it and place menu items into the "Extras" menu instead.
bool menu_frozen = ! s_can_move_menu && ! present_actions.empty ();
// NOTE: the "extras" menu is relevant on MacOS only
QMenu *extras_menu = find_extras_menu (mbar);
if (extras_menu) {
extras_menu->clear ();
}
QAction *prev_action = 0;
@ -1277,11 +1319,27 @@ AbstractMenu::build (QMenuBar *mbar, QToolBar *tbar)
} else if (mbar) {
if (c->menu () == 0) {
// NOTE: we intentionally do not make the item owner of the menu action
// as implicitly deleting it might cause trouble on MacOS. Instead we
// explicitly delete below or keep the action.
QMenu *menu = new QMenu (mp_dispatcher->menu_parent_widget ());
menu->setTitle (tl::to_qstring (c->action ()->get_title ()));
c->set_action (new Action (menu), true);
prev_action = insert_action_after (mbar, prev_action, menu->menuAction ());
c->set_action (new Action (menu, false), true);
// This case happens when we dynamically create menus.
// MacOS does not like generating top-level menus dynamically, so
// we put them into the "_extra" top level one.
if (menu_frozen) {
if (extras_menu) {
extras_menu->addMenu (menu);
}
} else {
prev_action = insert_action_after (mbar, prev_action, menu->menuAction ());
}
} else {
// Move the action to the end if present in the menu already
std::set<std::pair<size_t, QAction *> >::iterator a = present_actions.find (std::make_pair (id_from_action (c->menu ()->menuAction ()), c->menu ()->menuAction ()));
if (a != present_actions.end ()) {
@ -1291,12 +1349,20 @@ AbstractMenu::build (QMenuBar *mbar, QToolBar *tbar)
}
prev_action = a->second;
present_actions.erase (*a);
} else if (menu_frozen) {
if (extras_menu) {
extras_menu->addMenu (c->menu ());
}
} else {
prev_action = insert_action_after (mbar, prev_action, c->menu ()->menuAction ());
}
}
build (c->menu (), c->children);
// NOTE: the "extras" menu is built implicitly. You cannot put anything there.
if (c->menu () != extras_menu) {
build (c->menu (), c->children);
}
}
@ -1311,6 +1377,11 @@ AbstractMenu::build (QMenuBar *mbar, QToolBar *tbar)
}
prev_action = a->second;
present_actions.erase (*a);
} else if (menu_frozen) {
QMenu *extras_menu = find_extras_menu (mbar);
if (extras_menu) {
extras_menu->addAction (c->action ()->qaction ());
}
} else {
prev_action = insert_action_after (mbar, prev_action, c->action ()->qaction ());
}
@ -1319,10 +1390,24 @@ AbstractMenu::build (QMenuBar *mbar, QToolBar *tbar)
}
// Disable the (maybe new) "extras" menu if empty
extras_menu = find_extras_menu (mbar);
if (extras_menu) {
extras_menu->setEnabled (! extras_menu->isEmpty ());
}
// Remove all actions that have vanished
if (mbar) {
for (std::set<std::pair<size_t, QAction *> >::iterator a = present_actions.begin (); a != present_actions.end (); ++a) {
mbar->removeAction (a->second);
if (s_can_move_menu) {
mbar->removeAction (a->second);
delete a->second;
} else {
if (a->second->menu ()) {
a->second->menu ()->clear ();
}
a->second->setEnabled (false);
}
}
}
}
@ -1540,12 +1625,6 @@ AbstractMenu::insert_separator (const std::string &p, const std::string &name)
void
AbstractMenu::insert_menu (const std::string &p, const std::string &name, Action *action)
{
#if defined(HAVE_QT)
if (! action->menu () && mp_dispatcher && mp_dispatcher->menu_parent_widget ()) {
action->set_menu (new QMenu (), true);
}
#endif
typedef std::vector<std::pair<AbstractMenuItem *, std::list<AbstractMenuItem>::iterator > > path_type;
tl::Extractor extr (p.c_str ());
path_type path = find_item (extr);

View File

@ -692,6 +692,16 @@ public:
*/
~AbstractMenu ();
/**
* @brief Returns a value indicating that a special "extras" menu is needed
*/
static bool wants_extra_menu ();
/**
* @brief Returns the name of the special "extras" menu
*/
static const std::string &extra_menu_name ();
#if defined(HAVE_QT)
/**
* @brief Rebuild the QMenu's and refill the QMenuBar object

View File

@ -394,18 +394,26 @@ class SAXHandler
public:
SAXHandler (XMLStructureHandler *sh);
bool characters (const QString &ch);
bool endElement (const QString &namespaceURI, const QString &localName, const QString &qName);
bool startElement (const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &atts);
bool error (const QXmlParseException &exception);
bool fatalError (const QXmlParseException &exception);
bool warning (const QXmlParseException &exception);
virtual bool characters (const QString &ch);
virtual bool endElement (const QString &namespaceURI, const QString &localName, const QString &qName);
virtual bool startElement (const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &atts);
virtual bool error (const QXmlParseException &exception);
virtual bool fatalError (const QXmlParseException &exception);
virtual bool warning (const QXmlParseException &exception);
virtual QString errorString () const;
void setDocumentLocator (QXmlLocator *locator);
const tl::XMLLocatedException *exception () const
{
return m_error.get ();
}
private:
QXmlLocator *mp_locator;
XMLStructureHandler *mp_struct_handler;
std::unique_ptr<tl::XMLLocatedException> m_error;
std::string m_error_string;
};
// --------------------------------------------------------------------------------------------------------
@ -433,9 +441,11 @@ SAXHandler::startElement (const QString &qs_uri, const QString &qs_lname, const
try {
mp_struct_handler->start_element (uri, lname, qname);
} catch (tl::XMLException &ex) {
throw tl::XMLLocatedException (ex.raw_msg (), mp_locator->lineNumber (), mp_locator->columnNumber ());
m_error_string = ex.raw_msg ();
return false;
} catch (tl::Exception &ex) {
throw tl::XMLLocatedException (ex.msg (), mp_locator->lineNumber (), mp_locator->columnNumber ());
m_error_string = ex.msg ();
return false;
}
// successful
@ -452,9 +462,11 @@ SAXHandler::endElement (const QString &qs_uri, const QString &qs_lname, const QS
try {
mp_struct_handler->end_element (uri, lname, qname);
} catch (tl::XMLException &ex) {
throw tl::XMLLocatedException (ex.raw_msg (), mp_locator->lineNumber (), mp_locator->columnNumber ());
m_error_string = ex.raw_msg ();
return false;
} catch (tl::Exception &ex) {
throw tl::XMLLocatedException (ex.msg (), mp_locator->lineNumber (), mp_locator->columnNumber ());
m_error_string = ex.msg ();
return false;
}
// successful
@ -467,25 +479,38 @@ SAXHandler::characters (const QString &t)
try {
mp_struct_handler->characters (tl::to_string (t));
} catch (tl::XMLException &ex) {
throw tl::XMLLocatedException (ex.raw_msg (), mp_locator->lineNumber (), mp_locator->columnNumber ());
m_error_string = ex.raw_msg ();
return false;
} catch (tl::Exception &ex) {
throw tl::XMLLocatedException (ex.msg (), mp_locator->lineNumber (), mp_locator->columnNumber ());
m_error_string = ex.msg ();
return false;
}
// successful
return true;
}
QString
SAXHandler::errorString () const
{
return tl::to_qstring (m_error_string);
}
bool
SAXHandler::error (const QXmlParseException &ex)
{
throw tl::XMLLocatedException (tl::to_string (ex.message ()), ex.lineNumber (), ex.columnNumber ());
m_error.reset (new tl::XMLLocatedException (tl::to_string (ex.message ()), ex.lineNumber (), ex.columnNumber ()));
// stop reading
return false;
}
bool
SAXHandler::fatalError (const QXmlParseException &ex)
{
throw tl::XMLLocatedException (tl::to_string (ex.message ()), ex.lineNumber (), ex.columnNumber ());
m_error.reset (new tl::XMLLocatedException (tl::to_string (ex.message ()), ex.lineNumber (), ex.columnNumber ()));
// stop reading
return false;
}
bool
@ -765,7 +790,10 @@ XMLParser::parse (XMLSource &source, XMLStructureHandler &struct_handler)
mp_data->setContentHandler (&handler);
mp_data->setErrorHandler (&handler);
mp_data->parse (source.source (), false /*=not incremental*/);
bool result = mp_data->parse (source.source (), false /*=not incremental*/);
if (! result && handler.exception ()) {
throw tl::XMLLocatedException (*handler.exception ());
}
}
bool

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<report-database>
<description>Report 2</description>
<original-file/>
<generator>drc: script='.drc'</generator>
<top-cell>TOP</top-cell>
<tags>
</tags>
<categories>
<category>
<name>l1 sep l2 &lt; 1µm</name>
<description/>
<categories>
</categories>
</category>
</categories>
<cells>
<cell>
<name>TOP</name>
<variant/>
<layout-name/>
<references>
</references>
</cell>
</cells>
<items>
<item>
<tags/>
<category>'l1 sep l2 &lt; 1\302\265m'</category>
<cell>TOP</cell>
<visited>false</visited>
<multiplicity>1</multiplicity>
<comment/>
<image/>
<values>
<value>edge-pair: (0.5,0.9;0.8,0.9)/(1,1.1;-0.2,1.1)</value>
</values>
</item>
<item>
<tags/>
<category>'l1 sep l2 &lt; 1\302\265m'</category>
<cell>TOP</cell>
<visited>false</visited>
<multiplicity>1</multiplicity>
<comment/>
<image/>
<values>
<value>edge-pair: (0,0.9;0.3,0.9)/(1,1.1;-0.2,1.1)</value>
</values>
</item>
</items>
</report-database>

BIN
testdata/drc/drcSimpleTests_au56.gds.4 vendored Normal file

Binary file not shown.

BIN
testdata/drc/drcSimpleTests_au70.gds.5 vendored Normal file

Binary file not shown.

18
testdata/lvs/custom_resistors.cir.2 vendored Normal file
View File

@ -0,0 +1,18 @@
* cell TOP
.SUBCKT TOP
* cell instance $1 r180 *1 2,2.6
X$1 6 1 A
* cell instance $2 r0 *1 2.2,1
X$2 6 5 A
* device instance $1 r0 *1 0.8,0.75 RPP1
R$1 1 2 0.555555555556 RPP1
.ENDS TOP
* cell A
* pin
* pin
.SUBCKT A 1 2
* device instance $1 r0 *1 -0.2,0.4 RPP1
R$1 2 1 1.25 RPP1
.ENDS A

103
testdata/lvs/custom_resistors.l2n.3 vendored Normal file
View File

@ -0,0 +1,103 @@
#%l2n-klayout
W(TOP)
U(0.001)
L(l4 '15/0')
L(l3 '16/0')
L(l1)
C(l4 l4 l3 l1)
C(l3 l4 l3)
C(l1 l4 l1)
H(E B('Resistor shape does not touch marker border in exactly two places') C(TOP) X('device-extract') Q('(0.8,0.75;0.8,1.15;1,1.15;1,0.75)'))
H(E B('Resistor shape does not touch marker border in exactly two places') C(TOP) X('device-extract') Q('(0,0.75;0,1.15;0.2,1.15;0.2,0.75)'))
H(E B('Resistor shape does not touch marker border in exactly two places') C(A) X('device-extract') Q('(0.85,-0.4;0.85,-0.2;1.25,-0.2;1.25,-0.4)'))
K(RPP1 RES)
D(D$RPP1 RPP1
T(A
R(l1 (0 1200) (200 250))
)
T(B
R(l1 (0 400) (200 300))
)
)
D(D$RPP1$1 RPP1
T(A
R(l1 (750 0) (250 200))
)
T(B
R(l1 (0 0) (250 200))
)
)
X(A
R((-200 -450) (1750 1350))
N(1
R(l4 (-150 450) (100 100))
R(l3 (-150 -150) (200 500))
R(l1 (-200 -500) (250 200))
)
N(2
R(l4 (650 450) (100 100))
R(l4 (-100 -900) (100 100))
R(l3 (-150 200) (200 650))
R(l3 (-200 -1000) (200 500))
R(l1 (-250 300) (250 200))
R(l1 (-200 -1000) (250 200))
)
N(3
R(l4 (1450 -350) (100 100))
)
P(1)
P(2)
D(1 D$RPP1$1
Y(-200 400)
E(R 1.25)
E(L 0.5)
E(W 0.2)
E(A 0.1)
E(P 1.4)
T(A 2)
T(B 1)
)
)
X(TOP
R((-50 450) (3800 2600))
N(1
R(l4 (850 2050) (100 100))
R(l3 (-150 -150) (500 200))
R(l1 (-500 -250) (200 250))
)
N(2
R(l4 (850 1250) (100 100))
R(l4 (-100 -100) (100 100))
R(l4 (-900 -100) (100 100))
R(l3 (200 -150) (650 200))
R(l3 (-1000 -200) (500 200))
R(l1 (300 -250) (200 300))
R(l1 (-1000 -300) (200 250))
)
N(3
R(l4 (50 450) (100 100))
)
N(4
R(l4 (850 450) (100 100))
)
N(5)
N(6)
D(1 D$RPP1
Y(800 750)
E(R 0.555555555556)
E(L 0.333333333333)
E(W 0.3)
E(A 0.1)
E(P 1.26666666667)
T(A 1)
T(B 2)
)
X(1 A O(180) Y(2000 2600)
P(0 6)
P(1 1)
)
X(2 A Y(2200 1000)
P(0 6)
P(1 5)
)
)

7
testdata/lvs/res_combine1.cir.3 vendored Normal file
View File

@ -0,0 +1,7 @@
* Extracted by KLayout
* cell Res2
.SUBCKT Res2
* device instance $1 r0 *1 110.14,51.795 RPP1
R$1 2 1 95 RPP1 L=420U W=2.21052631579U
.ENDS Res2

197
testdata/lvs/res_combine1.lvsdb.6 vendored Normal file
View File

@ -0,0 +1,197 @@
#%lvsdb-klayout
# Layout
layout(
top(Res2)
unit(0.001)
# Layer section
# This section lists the mask layers (drawing or derived) and their connections.
# Mask layers
layer(l4 '15/0')
layer(l3 '16/0')
layer(l1)
# Mask layer connectivity
connect(l4 l4 l3 l1)
connect(l3 l4 l3)
connect(l1 l4 l1)
# Device class section
class(RPP1 RES
param(R 0 0)
param(L 1 0)
param(W 1 0)
)
# Device abstracts section
# Device abstracts list the pin shapes of the devices.
device(D$RPP1 RPP1
terminal(A
rect(l1 (10540 0) (540 2000))
)
terminal(B
rect(l1 (0 0) (540 2000))
)
)
# Circuit section
# Circuits are the hierarchical building blocks of the netlist.
circuit(Res2
# Circuit boundary
rect((8285 720) (117975 57350))
# Nets with their geometries
net(1
rect(l4 (120580 32490) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -750) (220 220))
rect(l4 (-22355 1390) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -750) (220 220))
rect(l4 (-21520 1755) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -750) (220 220))
rect(l3 (0 -4795) (1065 5850))
rect(l3 (-5155 -6930) (52985 1475))
rect(l3 (-27585 -395) (1065 5850))
rect(l3 (20990 -5850) (1065 5850))
rect(l3 (-1275 -1760) (340 1920))
rect(l3 (-22475 -1890) (340 1920))
rect(l3 (-21640 -1525) (340 1920))
rect(l1 (42935 -2385) (540 2000))
rect(l1 (-22675 -1970) (540 2000))
rect(l1 (-21840 -1605) (540 2000))
)
net(2
rect(l4 (19795 5575) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -750) (220 220))
rect(l3 (-195 -995) (2395 2500))
rect(l3 (-2480 -1785) (340 1920))
rect(l1 (-500 -1960) (540 2000))
)
# Devices and their connections
device(1 D$RPP1
device(D$RPP1 location(-65 -8175))
device(D$RPP1 location(-205 -12595))
device(D$RPP1 location(-320 -20985))
device(D$RPP1 location(-225 -16825))
device(D$RPP1 location(30 -3970))
device(D$RPP1 location(-22135 30))
device(D$RPP1 location(-22200 -8145))
device(D$RPP1 location(-22340 -12565))
device(D$RPP1 location(-22455 -20955))
device(D$RPP1 location(-22360 -16795))
device(D$RPP1 location(-22105 -3940))
device(D$RPP1 location(-43435 425))
device(D$RPP1 location(-43500 -7750))
device(D$RPP1 location(-43640 -12170))
device(D$RPP1 location(-43755 -20560))
device(D$RPP1 location(-43660 -16400))
device(D$RPP1 location(-43405 -3545))
device(D$RPP1 location(-100465 855))
device(D$RPP1 location(-81950 425))
device(D$RPP1 location(-100530 -7320))
device(D$RPP1 location(-100670 -11740))
device(D$RPP1 location(-100785 -20130))
device(D$RPP1 location(-100785 -26915))
device(D$RPP1 location(-100690 -15970))
device(D$RPP1 location(-100435 -3115))
device(D$RPP1 location(-82015 -7750))
device(D$RPP1 location(-82155 -12170))
device(D$RPP1 location(-82175 -16400))
device(D$RPP1 location(-63435 640))
device(D$RPP1 location(-63500 -7535))
device(D$RPP1 location(-63640 -11955))
device(D$RPP1 location(-63755 -20345))
device(D$RPP1 location(-63865 -26810))
device(D$RPP1 location(-63660 -16185))
device(D$RPP1 location(-63405 -3330))
device(D$RPP1 location(-63930 -34985))
device(D$RPP1 location(-64070 -39405))
device(D$RPP1 location(-64090 -43635))
device(D$RPP1 location(-82380 -26810))
device(D$RPP1 location(-82270 -20560))
device(D$RPP1 location(-82445 -34985))
device(D$RPP1 location(-82585 -39405))
device(D$RPP1 location(-82700 -47795))
device(D$RPP1 location(-64185 -47795))
device(D$RPP1 location(-82605 -43635))
device(D$RPP1 location(-82350 -30780))
device(D$RPP1 location(-63835 -30780))
device(D$RPP1 location(-81920 -3545))
device(D$RPP1 location(-100850 -35090))
device(D$RPP1 location(-100990 -39510))
device(D$RPP1 location(-101105 -47900))
device(D$RPP1 location(-101010 -43740))
device(D$RPP1 location(-100755 -30885))
connect(51 A A)
connect(3 B A)
connect(9 B A)
connect(15 B A)
location(110140 51795)
param(R 95)
param(L 420)
param(W 2.21052631579)
param(A 1080)
param(P 1296)
terminal(A 2)
terminal(B 1)
)
)
)
# Reference netlist
reference(
# Device class section
class(RPP1 RES)
# Circuit section
# Circuits are the hierarchical building blocks of the netlist.
circuit(RES2
# Nets
net(1 name(GND))
net(2 name(VDD))
# Outgoing pins and their connections to nets
pin(1 name(GND))
pin(2 name(VDD))
# Devices and their connections
device(1 RPP1
name(I0.I106.R0)
param(R 59475.7)
param(L 420)
param(W 2.21052631579)
param(A 0)
param(P 0)
terminal(A 2)
terminal(B 1)
)
)
)
# Cross reference
xref(
circuit(Res2 RES2 match
xref(
net(1 1 warning)
net(2 2 warning)
pin(() 0 match)
pin(() 1 match)
device(1 1 match)
)
)
)

7
testdata/lvs/res_combine2.cir.3 vendored Normal file
View File

@ -0,0 +1,7 @@
* Extracted by KLayout
* cell Res2
.SUBCKT Res2
* device instance $1 r0 *1 110.14,51.795 RPP1
R$1 2 1 95 RPP1
.ENDS Res2

193
testdata/lvs/res_combine2.lvsdb.6 vendored Normal file
View File

@ -0,0 +1,193 @@
#%lvsdb-klayout
# Layout
layout(
top(Res2)
unit(0.001)
# Layer section
# This section lists the mask layers (drawing or derived) and their connections.
# Mask layers
layer(l4 '15/0')
layer(l3 '16/0')
layer(l1)
# Mask layer connectivity
connect(l4 l4 l3 l1)
connect(l3 l4 l3)
connect(l1 l4 l1)
# Device class section
class(RPP1 RES)
# Device abstracts section
# Device abstracts list the pin shapes of the devices.
device(D$RPP1 RPP1
terminal(A
rect(l1 (10540 0) (540 2000))
)
terminal(B
rect(l1 (0 0) (540 2000))
)
)
# Circuit section
# Circuits are the hierarchical building blocks of the netlist.
circuit(Res2
# Circuit boundary
rect((8285 720) (117975 57350))
# Nets with their geometries
net(1
rect(l4 (120580 32490) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -750) (220 220))
rect(l4 (-22355 1390) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -750) (220 220))
rect(l4 (-21520 1755) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -750) (220 220))
rect(l3 (0 -4795) (1065 5850))
rect(l3 (-5155 -6930) (52985 1475))
rect(l3 (-27585 -395) (1065 5850))
rect(l3 (20990 -5850) (1065 5850))
rect(l3 (-1275 -1760) (340 1920))
rect(l3 (-22475 -1890) (340 1920))
rect(l3 (-21640 -1525) (340 1920))
rect(l1 (42935 -2385) (540 2000))
rect(l1 (-22675 -1970) (540 2000))
rect(l1 (-21840 -1605) (540 2000))
)
net(2
rect(l4 (19795 5575) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -750) (220 220))
rect(l3 (-195 -995) (2395 2500))
rect(l3 (-2480 -1785) (340 1920))
rect(l1 (-500 -1960) (540 2000))
)
# Devices and their connections
device(1 D$RPP1
device(D$RPP1 location(-65 -8175))
device(D$RPP1 location(-205 -12595))
device(D$RPP1 location(-320 -20985))
device(D$RPP1 location(-225 -16825))
device(D$RPP1 location(30 -3970))
device(D$RPP1 location(-22135 30))
device(D$RPP1 location(-22200 -8145))
device(D$RPP1 location(-22340 -12565))
device(D$RPP1 location(-22455 -20955))
device(D$RPP1 location(-22360 -16795))
device(D$RPP1 location(-22105 -3940))
device(D$RPP1 location(-43435 425))
device(D$RPP1 location(-43500 -7750))
device(D$RPP1 location(-43640 -12170))
device(D$RPP1 location(-43755 -20560))
device(D$RPP1 location(-43660 -16400))
device(D$RPP1 location(-43405 -3545))
device(D$RPP1 location(-100465 855))
device(D$RPP1 location(-81950 425))
device(D$RPP1 location(-100530 -7320))
device(D$RPP1 location(-100670 -11740))
device(D$RPP1 location(-100785 -20130))
device(D$RPP1 location(-100785 -26915))
device(D$RPP1 location(-100690 -15970))
device(D$RPP1 location(-100435 -3115))
device(D$RPP1 location(-82015 -7750))
device(D$RPP1 location(-82155 -12170))
device(D$RPP1 location(-82175 -16400))
device(D$RPP1 location(-63435 640))
device(D$RPP1 location(-63500 -7535))
device(D$RPP1 location(-63640 -11955))
device(D$RPP1 location(-63755 -20345))
device(D$RPP1 location(-63865 -26810))
device(D$RPP1 location(-63660 -16185))
device(D$RPP1 location(-63405 -3330))
device(D$RPP1 location(-63930 -34985))
device(D$RPP1 location(-64070 -39405))
device(D$RPP1 location(-64090 -43635))
device(D$RPP1 location(-82380 -26810))
device(D$RPP1 location(-82270 -20560))
device(D$RPP1 location(-82445 -34985))
device(D$RPP1 location(-82585 -39405))
device(D$RPP1 location(-82700 -47795))
device(D$RPP1 location(-64185 -47795))
device(D$RPP1 location(-82605 -43635))
device(D$RPP1 location(-82350 -30780))
device(D$RPP1 location(-63835 -30780))
device(D$RPP1 location(-81920 -3545))
device(D$RPP1 location(-100850 -35090))
device(D$RPP1 location(-100990 -39510))
device(D$RPP1 location(-101105 -47900))
device(D$RPP1 location(-101010 -43740))
device(D$RPP1 location(-100755 -30885))
connect(51 A A)
connect(3 B A)
connect(9 B A)
connect(15 B A)
location(110140 51795)
param(R 95)
param(L 420)
param(W 2.21052631579)
param(A 1080)
param(P 1296)
terminal(A 2)
terminal(B 1)
)
)
)
# Reference netlist
reference(
# Device class section
class(RPP1 RES)
# Circuit section
# Circuits are the hierarchical building blocks of the netlist.
circuit(RES2
# Nets
net(1 name(GND))
net(2 name(VDD))
# Outgoing pins and their connections to nets
pin(1 name(GND))
pin(2 name(VDD))
# Devices and their connections
device(1 RPP1
name(I0.I106.R0)
param(R 59475.7)
param(L 420)
param(W 2.21052631579)
param(A 0)
param(P 0)
terminal(A 2)
terminal(B 1)
)
)
)
# Cross reference
xref(
circuit(Res2 RES2 match
xref(
net(1 1 warning)
net(2 2 warning)
pin(() 0 match)
pin(() 1 match)
device(1 1 match)
)
)
)

7
testdata/lvs/res_combine3.cir.3 vendored Normal file
View File

@ -0,0 +1,7 @@
* Extracted by KLayout
* cell Res2
.SUBCKT Res2
* device instance $1 r0 *1 110.14,51.795 RPP1
R$1 2 1 95 RPP1
.ENDS Res2

196
testdata/lvs/res_combine3.lvsdb.6 vendored Normal file
View File

@ -0,0 +1,196 @@
#%lvsdb-klayout
# Layout
layout(
top(Res2)
unit(0.001)
# Layer section
# This section lists the mask layers (drawing or derived) and their connections.
# Mask layers
layer(l4 '15/0')
layer(l3 '16/0')
layer(l1)
# Mask layer connectivity
connect(l4 l4 l3 l1)
connect(l3 l4 l3)
connect(l1 l4 l1)
# Device class section
class(RPP1 RES)
# Device abstracts section
# Device abstracts list the pin shapes of the devices.
device(D$RPP1 RPP1
terminal(A
rect(l1 (10540 0) (540 2000))
)
terminal(B
rect(l1 (0 0) (540 2000))
)
)
# Circuit section
# Circuits are the hierarchical building blocks of the netlist.
circuit(Res2
# Circuit boundary
rect((8285 720) (117975 57350))
# Nets with their geometries
net(1
rect(l4 (120580 32490) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -750) (220 220))
rect(l4 (-22355 1390) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -750) (220 220))
rect(l4 (-21520 1755) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -750) (220 220))
rect(l3 (0 -4795) (1065 5850))
rect(l3 (-5155 -6930) (52985 1475))
rect(l3 (-27585 -395) (1065 5850))
rect(l3 (20990 -5850) (1065 5850))
rect(l3 (-1275 -1760) (340 1920))
rect(l3 (-22475 -1890) (340 1920))
rect(l3 (-21640 -1525) (340 1920))
rect(l1 (42935 -2385) (540 2000))
rect(l1 (-22675 -1970) (540 2000))
rect(l1 (-21840 -1605) (540 2000))
)
net(2
rect(l4 (19795 5575) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -745) (220 220))
rect(l4 (-220 -750) (220 220))
rect(l3 (-195 -995) (2395 2500))
rect(l3 (-2480 -1785) (340 1920))
rect(l1 (-500 -1960) (540 2000))
)
# Devices and their connections
device(1 D$RPP1
device(D$RPP1 location(-65 -8175))
device(D$RPP1 location(-205 -12595))
device(D$RPP1 location(-320 -20985))
device(D$RPP1 location(-225 -16825))
device(D$RPP1 location(30 -3970))
device(D$RPP1 location(-22135 30))
device(D$RPP1 location(-22200 -8145))
device(D$RPP1 location(-22340 -12565))
device(D$RPP1 location(-22455 -20955))
device(D$RPP1 location(-22360 -16795))
device(D$RPP1 location(-22105 -3940))
device(D$RPP1 location(-43435 425))
device(D$RPP1 location(-43500 -7750))
device(D$RPP1 location(-43640 -12170))
device(D$RPP1 location(-43755 -20560))
device(D$RPP1 location(-43660 -16400))
device(D$RPP1 location(-43405 -3545))
device(D$RPP1 location(-100465 855))
device(D$RPP1 location(-81950 425))
device(D$RPP1 location(-100530 -7320))
device(D$RPP1 location(-100670 -11740))
device(D$RPP1 location(-100785 -20130))
device(D$RPP1 location(-100785 -26915))
device(D$RPP1 location(-100690 -15970))
device(D$RPP1 location(-100435 -3115))
device(D$RPP1 location(-82015 -7750))
device(D$RPP1 location(-82155 -12170))
device(D$RPP1 location(-82175 -16400))
device(D$RPP1 location(-63435 640))
device(D$RPP1 location(-63500 -7535))
device(D$RPP1 location(-63640 -11955))
device(D$RPP1 location(-63755 -20345))
device(D$RPP1 location(-63865 -26810))
device(D$RPP1 location(-63660 -16185))
device(D$RPP1 location(-63405 -3330))
device(D$RPP1 location(-63930 -34985))
device(D$RPP1 location(-64070 -39405))
device(D$RPP1 location(-64090 -43635))
device(D$RPP1 location(-82380 -26810))
device(D$RPP1 location(-82270 -20560))
device(D$RPP1 location(-82445 -34985))
device(D$RPP1 location(-82585 -39405))
device(D$RPP1 location(-82700 -47795))
device(D$RPP1 location(-64185 -47795))
device(D$RPP1 location(-82605 -43635))
device(D$RPP1 location(-82350 -30780))
device(D$RPP1 location(-63835 -30780))
device(D$RPP1 location(-81920 -3545))
device(D$RPP1 location(-100850 -35090))
device(D$RPP1 location(-100990 -39510))
device(D$RPP1 location(-101105 -47900))
device(D$RPP1 location(-101010 -43740))
device(D$RPP1 location(-100755 -30885))
connect(51 A A)
connect(3 B A)
connect(9 B A)
connect(15 B A)
location(110140 51795)
param(R 95)
param(L 420)
param(W 2.21052631579)
param(A 1080)
param(P 1296)
terminal(A 2)
terminal(B 1)
)
)
)
# Reference netlist
reference(
# Device class section
class(RPP1 RES)
# Circuit section
# Circuits are the hierarchical building blocks of the netlist.
circuit(RES2
# Nets
net(1 name(GND))
net(2 name(VDD))
# Outgoing pins and their connections to nets
pin(1 name(GND))
pin(2 name(VDD))
# Devices and their connections
device(1 RPP1
name(I0.I106.R0)
param(R 59475.7)
param(L 420)
param(W 2.21052631579)
param(A 0)
param(P 0)
terminal(A 2)
terminal(B 1)
)
)
)
# Cross reference
xref(
circuit(Res2 RES2 nomatch
xref(
net(() 1 mismatch)
net(() 2 mismatch)
net(1 () mismatch)
net(2 () mismatch)
pin(() 0 match)
pin(() 1 match)
device(() 1 mismatch)
device(1 () mismatch)
)
)
)

2593
testdata/lvs/test_22a.lvsdb.3 vendored Normal file

File diff suppressed because it is too large Load Diff

2593
testdata/lvs/test_22b.lvsdb.3 vendored Normal file

File diff suppressed because it is too large Load Diff