mirror of https://github.com/KLayout/klayout.git
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:
commit
b726872598
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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 \
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 (); }
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
#include <QInputDevice>
|
||||
#include <QObject>
|
||||
#include <QPointingDevice>
|
||||
#include <QPointer>
|
||||
#include "gsiQt.h"
|
||||
#include "gsiQtGuiCommon.h"
|
||||
#include <memory>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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"))));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 < 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 < 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 < 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>
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
)
|
||||
)
|
||||
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
)
|
||||
)
|
||||
)
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue