WIP: first steps for making technology a db component.

This commit is contained in:
Matthias Koefferlein 2018-06-14 23:38:23 +02:00
parent 6bc1537bea
commit c360f6d4a7
68 changed files with 2399 additions and 2167 deletions

View File

@ -11,7 +11,6 @@ SOURCES = \
dbBox.cc \ dbBox.cc \
dbBoxConvert.cc \ dbBoxConvert.cc \
dbBoxScanner.cc \ dbBoxScanner.cc \
dbCommonReader.cc \
dbCell.cc \ dbCell.cc \
dbCellGraphUtils.cc \ dbCellGraphUtils.cc \
dbCellHullGenerator.cc \ dbCellHullGenerator.cc \
@ -20,6 +19,7 @@ SOURCES = \
dbClipboard.cc \ dbClipboard.cc \
dbClipboardData.cc \ dbClipboardData.cc \
dbClip.cc \ dbClip.cc \
dbCommonReader.cc \
dbEdge.cc \ dbEdge.cc \
dbEdgePair.cc \ dbEdgePair.cc \
dbEdgePairRelations.cc \ dbEdgePairRelations.cc \
@ -70,6 +70,7 @@ SOURCES = \
dbStatic.cc \ dbStatic.cc \
dbStream.cc \ dbStream.cc \
dbStreamLayers.cc \ dbStreamLayers.cc \
dbTechnology.cc \
dbTestSupport.cc \ dbTestSupport.cc \
dbText.cc \ dbText.cc \
dbTextWriter.cc \ dbTextWriter.cc \
@ -79,9 +80,16 @@ SOURCES = \
dbVector.cc \ dbVector.cc \
dbWriter.cc \ dbWriter.cc \
dbWriterTools.cc \ dbWriterTools.cc \
dbVariableWidthPath.cc \
dbNamedLayerReader.cc \
dbEdgesToContours.cc \
dbForceLink.cc \
dbPlugin.cc \
dbInit.cc \
gsiDeclDbBox.cc \ gsiDeclDbBox.cc \
gsiDeclDbCell.cc \ gsiDeclDbCell.cc \
gsiDeclDbCellMapping.cc \ gsiDeclDbCellMapping.cc \
gsiDeclDbCommonStreamOptions.cc \
gsiDeclDbEdge.cc \ gsiDeclDbEdge.cc \
gsiDeclDbEdgePair.cc \ gsiDeclDbEdgePair.cc \
gsiDeclDbEdgePairs.cc \ gsiDeclDbEdgePairs.cc \
@ -104,18 +112,13 @@ SOURCES = \
gsiDeclDbShape.cc \ gsiDeclDbShape.cc \
gsiDeclDbShapeProcessor.cc \ gsiDeclDbShapeProcessor.cc \
gsiDeclDbShapes.cc \ gsiDeclDbShapes.cc \
gsiDeclDbTechnologies.cc \
gsiDeclDbText.cc \ gsiDeclDbText.cc \
gsiDeclDbTilingProcessor.cc \ gsiDeclDbTilingProcessor.cc \
gsiDeclDbTrans.cc \ gsiDeclDbTrans.cc \
gsiDeclDbVector.cc \ gsiDeclDbVector.cc \
gsiDeclDbLayoutDiff.cc \ gsiDeclDbLayoutDiff.cc \
gsiDeclDbGlyphs.cc \ gsiDeclDbGlyphs.cc \
dbVariableWidthPath.cc \
dbNamedLayerReader.cc \
dbEdgesToContours.cc \
dbForceLink.cc \
dbPlugin.cc \
dbInit.cc
HEADERS = \ HEADERS = \
dbArray.h \ dbArray.h \
@ -131,6 +134,7 @@ HEADERS = \
dbClipboardData.h \ dbClipboardData.h \
dbClipboard.h \ dbClipboard.h \
dbClip.h \ dbClip.h \
dbCommonReader.h \
dbEdge.h \ dbEdge.h \
dbEdgePair.h \ dbEdgePair.h \
dbEdgePairRelations.h \ dbEdgePairRelations.h \
@ -186,6 +190,7 @@ HEADERS = \
dbStream.h \ dbStream.h \
dbStreamLayers.h \ dbStreamLayers.h \
dbTestSupport.h \ dbTestSupport.h \
dbTechnology.h \
dbText.h \ dbText.h \
dbTextWriter.h \ dbTextWriter.h \
dbTilingProcessor.h \ dbTilingProcessor.h \
@ -195,14 +200,13 @@ HEADERS = \
dbVector.h \ dbVector.h \
dbWriter.h \ dbWriter.h \
dbWriterTools.h \ dbWriterTools.h \
dbCommonReader.h \ dbGlyphs.h \
dbGlyphs.h \ dbCommon.h \
dbCommon.h \ dbVariableWidthPath.h \
dbVariableWidthPath.h \ dbNamedLayerReader.h \
dbNamedLayerReader.h \ dbForceLink.h \
dbForceLink.h \ dbPlugin.h \
dbPlugin.h \ dbInit.h
dbInit.h
RESOURCES = \ RESOURCES = \
dbResources.qrc dbResources.qrc

View File

@ -73,6 +73,16 @@ public:
{ {
return false; return false;
} }
virtual tl::XMLElementBase *xml_reader_options_element () const
{
return new db::ReaderOptionsXMLElement<db::CommonReaderOptions> ("common",
tl::make_member (&db::CommonReaderOptions::create_other_layers, "create-other-layers") +
tl::make_member (&db::CommonReaderOptions::layer_map, "layer-map") +
tl::make_member (&db::CommonReaderOptions::enable_properties, "enable-properties") +
tl::make_member (&db::CommonReaderOptions::enable_text_objects, "enable-text-objects")
);
}
}; };
static tl::RegisteredClass<db::StreamFormatDeclaration> reader_decl (new CommonFormatDeclaration (), 20, "Common"); static tl::RegisteredClass<db::StreamFormatDeclaration> reader_decl (new CommonFormatDeclaration (), 20, "Common");

View File

@ -34,7 +34,44 @@ namespace tl
namespace db namespace db
{ {
// .. nothing yet ..
// ------------------------------------------------------------------
// Implementation of load_options_xml_element_list
tl::XMLElementList load_options_xml_element_list ()
{
tl::XMLElementList elements;
for (tl::Registrar<db::StreamFormatDeclaration>::iterator cls = tl::Registrar<db::StreamFormatDeclaration>::begin (); cls != tl::Registrar<db::StreamFormatDeclaration>::end (); ++cls) {
const db::StreamFormatDeclaration *decl = dynamic_cast <const db::StreamFormatDeclaration *> (&*cls);
if (decl) {
elements.append (decl->xml_reader_options_element ());
}
}
// ignore all unknown elements
elements.append (tl::make_member<db::LoadLayoutOptions> ("*"));
return elements;
}
tl::XMLElementList save_options_xml_element_list ()
{
tl::XMLElementList elements;
for (tl::Registrar<db::StreamFormatDeclaration>::iterator cls = tl::Registrar<db::StreamFormatDeclaration>::begin (); cls != tl::Registrar<db::StreamFormatDeclaration>::end (); ++cls) {
const StreamFormatDeclaration *decl = dynamic_cast <const StreamFormatDeclaration *> (&*cls);
if (decl) {
elements.append (decl->xml_writer_options_element ());
}
}
// ignore all unknown elements
elements.append (tl::make_member<db::FormatSpecificWriterOptions> ("*"));
return elements;
}
} }

View File

@ -27,7 +27,12 @@
#include "dbCommon.h" #include "dbCommon.h"
#include "dbSaveLayoutOptions.h"
#include "dbLoadLayoutOptions.h"
#include "tlClassRegistry.h" #include "tlClassRegistry.h"
#include "tlXMLParser.h"
#include "tlXMLWriter.h"
#include <string> #include <string>
#include <vector> #include <vector>
@ -103,8 +108,197 @@ public:
* @brief Returns true, when the format supports export (has a writer) * @brief Returns true, when the format supports export (has a writer)
*/ */
virtual bool can_write () const = 0; virtual bool can_write () const = 0;
/**
* @brief Delivers the XMLElement object that represents the reader options within a technology XML tree
*
* This method is supposed to return an instance ReaderOptionsXMLElement<RO> where RO is the
* specific reader options type. The return value can be 0 to indicate there is no specific reader
* option.
*
* The returned XMLElement is destroyed by the caller and needs to be a new object.
*/
virtual tl::XMLElementBase *xml_reader_options_element () const
{
return 0;
}
/**
* @brief Delivers the XMLElement object that represents this writer options within a technology XML tree
*
* This method is supposed to return an instance WriterOptionsXMLElement<WO> where WO is the
* specific writer options type. The return value can be 0 to indicate there is no specific writer
* option.
*
* The returned XMLElement is destroyed by the caller and needs to be a new object.
*/
virtual tl::XMLElementBase *xml_writer_options_element () const
{
return 0;
}
}; };
/**
* @brief A helper class for the XML serialization of the stream options (custom read adaptor)
*
* OPT is a reader or writer options class and HOST is the host class. For example, OPT
* can be db::GDS2ReaderOptions and HOST then is db::LoadLayoutOptions.
*/
template <class OPT, class HOST>
class StreamOptionsReadAdaptor
{
public:
typedef tl::pass_by_ref_tag tag;
StreamOptionsReadAdaptor ()
: mp_options (0), m_done (false)
{
// .. nothing yet ..
}
const OPT &operator () () const
{
return mp_options->template get_options<OPT> ();
}
bool at_end () const
{
return m_done;
}
void start (const HOST &options)
{
mp_options = &options;
m_done = false;
}
void next ()
{
mp_options = 0;
m_done = true;
}
private:
const HOST *mp_options;
bool m_done;
};
/**
* @brief A helper class for the XML serialization of the stream option (custom write adaptor)
*
* See StreamOptionsReadAdaptor for details.
*/
template <class OPT, class HOST>
class StreamOptionsWriteAdaptor
{
public:
StreamOptionsWriteAdaptor ()
{
// .. nothing yet ..
}
void operator () (HOST &options, tl::XMLReaderState &reader) const
{
std::auto_ptr<OPT> opt (new OPT ());
tl::XMLObjTag<OPT> tag;
*opt = *reader.back (tag);
options.set_options (opt.release ());
}
};
/**
* @brief A XMLElement specialization for stream options
*/
template <class OPT, class HOST>
class StreamOptionsXMLElement
: public tl::XMLElement<OPT, HOST, StreamOptionsReadAdaptor<OPT, HOST>, StreamOptionsWriteAdaptor<OPT, HOST> >
{
public:
StreamOptionsXMLElement (const std::string &element_name, const tl::XMLElementList &children)
: tl::XMLElement<OPT, HOST, StreamOptionsReadAdaptor<OPT, HOST>, StreamOptionsWriteAdaptor<OPT, HOST> > (StreamOptionsReadAdaptor<OPT, HOST> (), StreamOptionsWriteAdaptor<OPT, HOST> (), element_name, children)
{
// .. nothing yet ..
}
StreamOptionsXMLElement (const StreamOptionsXMLElement &d)
: tl::XMLElement<OPT, HOST, StreamOptionsReadAdaptor<OPT, HOST>, StreamOptionsWriteAdaptor<OPT, HOST> > (d)
{
// .. nothing yet ..
}
};
/**
* @brief A custom XMLElement for the serialization of reader options
*
* StreamReaderPluginDeclaration::xml_element can return such an element to
* insert a custom XML element into the XML tree which represents the
* reader options.
*/
template <class OPT>
class ReaderOptionsXMLElement
: public StreamOptionsXMLElement<OPT, db::LoadLayoutOptions>
{
public:
ReaderOptionsXMLElement (const std::string &element_name, const tl::XMLElementList &children)
: StreamOptionsXMLElement<OPT, db::LoadLayoutOptions> (element_name, children)
{
// .. nothing yet ..
}
ReaderOptionsXMLElement (const ReaderOptionsXMLElement &d)
: StreamOptionsXMLElement<OPT, db::LoadLayoutOptions> (d)
{
// .. nothing yet ..
}
virtual tl::XMLElementBase *clone () const
{
return new ReaderOptionsXMLElement (*this);
}
};
/**
* @brief A custom XMLElement for the serialization of writer options
*
* StreamWriterPluginDeclaration::xml_element can return such an element to
* insert a custom XML element into the XML tree which represents the
* writer options.
*/
template <class OPT>
class WriterOptionsXMLElement
: public StreamOptionsXMLElement<OPT, db::SaveLayoutOptions>
{
public:
WriterOptionsXMLElement (const std::string &element_name, const tl::XMLElementList &children)
: StreamOptionsXMLElement<OPT, db::SaveLayoutOptions> (element_name, children)
{
// .. nothing yet ..
}
WriterOptionsXMLElement (const WriterOptionsXMLElement &d)
: StreamOptionsXMLElement<OPT, db::SaveLayoutOptions> (d)
{
// .. nothing yet ..
}
virtual tl::XMLElementBase *clone () const
{
return new WriterOptionsXMLElement (*this);
}
};
/**
* @brief Returns the XMLElement list that can represent a db::LoadLayoutOptions object
*/
DB_PUBLIC tl::XMLElementList load_options_xml_element_list ();
/**
* @brief Returns the XMLElement list that can represent a db::SaveLayoutOptions object
*/
DB_PUBLIC tl::XMLElementList save_options_xml_element_list ();
} }
#endif #endif

472
src/db/db/dbTechnology.cc Normal file
View File

@ -0,0 +1,472 @@
/*
KLayout Layout Viewer
Copyright (C) 2006-2018 Matthias Koefferlein
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "dbTechnology.h"
#include "dbStream.h"
#include <stdio.h>
#include <QDir>
#include <QFileInfo>
namespace tl
{
template <> tl::Registrar<db::TechnologyComponentProvider> *Registrar<db::TechnologyComponentProvider>::instance = 0;
}
namespace db
{
// -----------------------------------------------------------------------------
Technologies::Technologies ()
{
m_technologies.push_back (new Technology (std::string (""), "(Default)"));
m_changed = false;
m_in_update = false;
}
Technologies::Technologies (const Technologies &other)
: tl::Object ()
{
m_changed = false;
m_in_update = false;
operator= (other);
}
Technologies::~Technologies ()
{
// .. nothing yet ..
}
Technologies &
Technologies::operator= (const Technologies &other)
{
if (&other != this) {
m_technologies = other.m_technologies;
for (iterator i = begin (); i != end (); ++i) {
i->technology_changed_with_sender_event.add (this, &Technologies::technology_changed);
}
technologies_changed ();
}
return *this;
}
static std::auto_ptr<db::Technologies> sp_technologies;
db::Technologies *
Technologies::instance ()
{
if (! sp_technologies.get ()) {
sp_technologies.reset (new db::Technologies ());
}
return sp_technologies.get ();
}
static tl::XMLElementList xml_elements ()
{
return make_element ((Technologies::const_iterator (Technologies::*) () const) &Technologies::begin, (Technologies::const_iterator (Technologies::*) () const) &Technologies::end, &Technologies::add, "technology",
Technology::xml_elements ()
);
}
std::string
Technologies::to_xml () const
{
// create a copy to filter out the ones which are not persisted
db::Technologies copy;
for (const_iterator t = begin (); t != end (); ++t) {
if (t->is_persisted ()) {
copy.add (new Technology (*t));
}
}
tl::OutputStringStream os;
tl::XMLStruct<db::Technologies> xml_struct ("technologies", xml_elements ());
tl::OutputStream oss (os);
xml_struct.write (oss, copy);
return os.string ();
}
void
Technologies::load_from_xml (const std::string &s)
{
// create a copy to filter out the ones which are not persisted and remain
db::Technologies copy;
for (const_iterator t = begin (); t != end (); ++t) {
if (! t->is_persisted ()) {
copy.add (new Technology (*t));
}
}
tl::XMLStringSource source (s);
tl::XMLStruct<db::Technologies> xml_struct ("technologies", xml_elements ());
xml_struct.parse (source, copy);
*this = copy;
}
void
Technologies::add_tech (Technology *tech, bool replace_same)
{
if (! tech) {
return;
}
std::auto_ptr<Technology> tech_ptr (tech);
Technology *t = 0;
for (tl::stable_vector<Technology>::iterator i = m_technologies.begin (); !t && i != m_technologies.end (); ++i) {
if (i->name () == tech->name ()) {
t = i.operator-> ();
}
}
if (t) {
if (replace_same) {
*t = *tech;
} else {
throw tl::Exception (tl::to_string (QObject::tr ("A technology with this name already exists: %1").arg (tl::to_qstring (tech->name ()))));
}
} else {
m_technologies.push_back (tech_ptr.release ());
tech->technology_changed_with_sender_event.add (this, &Technologies::technology_changed);
}
technologies_changed ();
}
void
Technologies::remove (const std::string &name)
{
for (tl::stable_vector<Technology>::iterator t = m_technologies.begin (); t != m_technologies.end (); ++t) {
if (t->name () == name) {
m_technologies.erase (t);
technologies_changed ();
break;
}
}
}
void
Technologies::clear ()
{
if (! m_technologies.empty ()) {
m_technologies.clear ();
technologies_changed ();
}
}
void
Technologies::technology_changed (Technology *t)
{
if (m_in_update) {
m_changed = true;
} else {
technology_changed_event (t);
}
}
void
Technologies::technologies_changed ()
{
if (m_in_update) {
m_changed = true;
} else {
technologies_changed_event ();
}
}
void
Technologies::begin_updates ()
{
tl_assert (! m_in_update);
m_in_update = true;
m_changed = false;
}
void
Technologies::end_updates ()
{
if (m_in_update) {
m_in_update = false;
if (m_changed) {
m_changed = false;
technologies_changed ();
}
}
}
void
Technologies::notify_technologies_changed ()
{
technologies_changed ();
}
void
Technologies::end_updates_no_event ()
{
m_in_update = false;
m_changed = false;
}
bool
Technologies::has_technology (const std::string &name) const
{
for (tl::stable_vector<Technology>::const_iterator t = m_technologies.begin (); t != m_technologies.end (); ++t) {
if (t->name () == name) {
return true;
}
}
return false;
}
Technology *
Technologies::technology_by_name (const std::string &name)
{
for (tl::stable_vector<Technology>::iterator t = m_technologies.begin (); t != m_technologies.end (); ++t) {
if (t->name () == name) {
return &*t;
}
}
tl_assert (! m_technologies.empty ());
return &*m_technologies.begin ();
}
// -----------------------------------------------------------------------------
// Technology implementation
Technology::Technology ()
: m_name (), m_description (), m_dbu (0.001), m_persisted (true), m_readonly (false)
{
init ();
}
Technology::Technology (const std::string &name, const std::string &description)
: m_name (name), m_description (description), m_dbu (0.001), m_persisted (true), m_readonly (false)
{
init ();
}
void
Technology::init ()
{
m_add_other_layers = true;
for (tl::Registrar<db::TechnologyComponentProvider>::iterator cls = tl::Registrar<db::TechnologyComponentProvider>::begin (); cls != tl::Registrar<db::TechnologyComponentProvider>::end (); ++cls) {
m_components.push_back (cls->create_component ());
}
}
Technology::~Technology ()
{
for (std::vector <TechnologyComponent *>::const_iterator c = m_components.begin (); c != m_components.end (); ++c) {
delete *c;
}
m_components.clear ();
}
Technology::Technology (const Technology &d)
: tl::Object (),
m_name (d.m_name), m_description (d.m_description), m_grain_name (d.m_grain_name), m_dbu (d.m_dbu),
m_explicit_base_path (d.m_explicit_base_path), m_default_base_path (d.m_default_base_path),
m_load_layout_options (d.m_load_layout_options),
m_save_layout_options (d.m_save_layout_options),
m_lyp_path (d.m_lyp_path), m_add_other_layers (d.m_add_other_layers), m_persisted (d.m_persisted),
m_readonly (d.m_readonly), m_lyt_file (d.m_lyt_file)
{
for (std::vector <TechnologyComponent *>::const_iterator c = d.m_components.begin (); c != d.m_components.end (); ++c) {
m_components.push_back ((*c)->clone ());
}
}
Technology &Technology::operator= (const Technology &d)
{
if (this != &d) {
m_name = d.m_name;
m_description = d.m_description;
m_grain_name = d.m_grain_name;
m_dbu = d.m_dbu;
m_default_base_path = d.m_default_base_path;
m_explicit_base_path = d.m_explicit_base_path;
m_load_layout_options = d.m_load_layout_options;
m_save_layout_options = d.m_save_layout_options;
m_lyp_path = d.m_lyp_path;
m_add_other_layers = d.m_add_other_layers;
m_persisted = d.m_persisted;
m_readonly = d.m_readonly;
m_lyt_file = d.m_lyt_file;
for (std::vector <TechnologyComponent *>::const_iterator c = m_components.begin (); c != m_components.end (); ++c) {
delete *c;
}
m_components.clear ();
for (std::vector <TechnologyComponent *>::const_iterator c = d.m_components.begin (); c != d.m_components.end (); ++c) {
m_components.push_back ((*c)->clone ());
}
technology_changed ();
}
return *this;
}
tl::XMLElementList
Technology::xml_elements ()
{
tl::XMLElementList elements =
tl::make_member (&Technology::name, &Technology::set_name, "name") +
tl::make_member (&Technology::description, &Technology::set_description, "description") +
tl::make_member (&Technology::dbu, &Technology::set_dbu, "dbu") +
tl::make_member (&Technology::explicit_base_path, &Technology::set_explicit_base_path, "base-path") +
tl::make_member (&Technology::default_base_path, &Technology::set_default_base_path, "original-base-path") +
tl::make_member (&Technology::layer_properties_file, &Technology::set_layer_properties_file, "layer-properties_file") +
tl::make_member (&Technology::add_other_layers, &Technology::set_add_other_layers, "add-other-layers") +
tl::make_element (&Technology::load_layout_options, &Technology::set_load_layout_options, "reader-options",
db::load_options_xml_element_list ()
) +
tl::make_element (&Technology::save_layout_options, &Technology::set_save_layout_options, "writer-options",
db::save_options_xml_element_list ()
);
for (tl::Registrar<db::TechnologyComponentProvider>::iterator cls = tl::Registrar<db::TechnologyComponentProvider>::begin (); cls != tl::Registrar<db::TechnologyComponentProvider>::end (); ++cls) {
elements.append (cls->xml_element ());
}
// ignore all unknown elements
elements.append (tl::make_member<Technology> ("*"));
return elements;
}
const TechnologyComponent *
Technology::component_by_name (const std::string &component_name) const
{
for (std::vector <TechnologyComponent *>::const_iterator c = m_components.begin (); c != m_components.end (); ++c) {
if ((*c)->name () == component_name) {
return *c;
}
}
return 0;
}
TechnologyComponent *
Technology::component_by_name (const std::string &component_name)
{
for (std::vector <TechnologyComponent *>::const_iterator c = m_components.begin (); c != m_components.end (); ++c) {
if ((*c)->name () == component_name) {
return *c;
}
}
return 0;
}
std::vector <std::string>
Technology::component_names () const
{
std::vector <std::string> names;
for (std::vector <TechnologyComponent *>::const_iterator c = m_components.begin (); c != m_components.end (); ++c) {
names.push_back ((*c)->name ());
}
return names;
}
void
Technology::set_component (TechnologyComponent *component)
{
for (std::vector <TechnologyComponent *>::iterator c = m_components.begin (); c != m_components.end (); ++c) {
if ((*c)->name () == component->name ()) {
if (*c != component) {
delete *c;
*c = component;
technology_changed_event ();
technology_changed_with_sender_event (this);
}
break;
}
}
}
std::string
Technology::correct_path (const std::string &fp) const
{
if (base_path ().empty ()) {
return fp;
}
QString rfp = QDir (tl::to_qstring (base_path ())).relativeFilePath (tl::to_qstring (fp));
if (rfp.startsWith (QString::fromUtf8 (".."))) {
// upwards or beside - don't correct:
return fp;
} else {
return tl::to_string (rfp);
}
}
void
Technology::load (const std::string &fn)
{
tl::XMLFileSource source (fn);
tl::XMLStruct<db::Technology> xml_struct ("technology", xml_elements ());
xml_struct.parse (source, *this);
// use the tech file's path as the default base path
std::string lyt_file = tl::to_string (QFileInfo (tl::to_qstring (fn)).absoluteDir ().path ());
set_default_base_path (lyt_file);
set_tech_file_path (fn);
}
void
Technology::save (const std::string &fn) const
{
tl::XMLStruct<db::Technology> xml_struct ("technology", xml_elements ());
tl::OutputStream os (fn, tl::OutputStream::OM_Plain);
xml_struct.write (os, *this);
}
std::string
Technology::build_effective_path (const std::string &p) const
{
if (p.empty () || base_path ().empty ()) {
return p;
}
QFileInfo f (tl::to_qstring (p));
if (f.isAbsolute ()) {
return p;
} else {
return tl::to_string (QDir (tl::to_qstring (base_path ())).filePath (tl::to_qstring (p)));
}
}
}

867
src/db/db/dbTechnology.h Normal file
View File

@ -0,0 +1,867 @@
/*
KLayout Layout Viewer
Copyright (C) 2006-2018 Matthias Koefferlein
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef HDR_dbTechnology
#define HDR_dbTechnology
#include "dbCommon.h"
#include "tlStableVector.h"
#include "tlString.h"
#include "tlEvents.h"
#include "tlXMLParser.h"
#include "tlTypeTraits.h"
#include "tlClassRegistry.h"
#include "dbStreamLayers.h"
#include "dbLoadLayoutOptions.h"
#include "dbSaveLayoutOptions.h"
namespace db
{
class Technology;
class TechnologyComponent;
/**
* @brief A container for the technology settings
*
* The container associates a technology with a name and provides an
* iterator for the technologies.
* The container features at least one technology (the default) which is
* present in any case. If a technology with an unknown name is requested,
* this default technology is returned.
*/
class DB_PUBLIC Technologies
: public tl::Object
{
public:
typedef tl::stable_vector<Technology>::const_iterator const_iterator;
typedef tl::stable_vector<Technology>::iterator iterator;
/**
* @brief The constructor
*/
Technologies ();
/**
* @brief The destructor
*/
~Technologies ();
/**
* @brief Copy ctor
*/
Technologies (const Technologies &other);
/**
* @brief Assignment operator
*/
Technologies &operator= (const Technologies &other);
/**
* @brief Const iterator - begin
*/
const_iterator begin () const
{
return m_technologies.begin ();
}
/**
* @brief Const iterator - end
*/
const_iterator end () const
{
return m_technologies.end ();
}
/**
* @brief iterator - begin
*/
iterator begin ()
{
return m_technologies.begin ();
}
/**
* @brief Const iterator - end
*/
iterator end ()
{
return m_technologies.end ();
}
/**
* @brief The number of technologies
*/
size_t technologies () const
{
return m_technologies.size ();
}
/**
* @brief Adds a technology to the setup
*
* The container becomes owner of the technology object.
* Replaces a technology with the name of the given technology.
*/
void add (Technology *technology)
{
add_tech (technology, true /*replace*/);
}
/**
* @brief Adds a technology with a new name
*
* Like \add, but throws an exception if a technology with this name
* already exists. Takes over ownership over the technology object.
* The technology object is discarded if an exception is thrown.
*/
void add_new (Technology *technology)
{
add_tech (technology, false /*throws exception on same name*/);
}
/**
* @brief Remove a technology with the given name from the setup
*/
void remove (const std::string &name);
/**
* @brief Clears the list of technologies
*/
void clear ();
/**
* @brief Begins a bulk operation
* This method will disable "technologies_changed" events until (later) end_updates () is called.
*/
void begin_updates ();
/**
* @brief Ends a bulk operation
*/
void end_updates ();
/**
* @brief Ends a bulk operation
* This version does not send an technologies_changed event but just cancels the bulk
* operation. begin_updates/end_updates_no_event is essentially equivalent to blocking
* signals.
*/
void end_updates_no_event ();
/**
* @brief Notifies the system of changes in technologies
* For performance reasons, changes inside a technology are not propagated to
* the system directly. Only bulk changes (such as adding or removing technologies
* are). To inform the system of individual technology updates, call this method
* after a technology or multiple technologies have been changed.
*/
void notify_technologies_changed ();
/**
* @brief Checks, if a technology with the given name exists
*/
bool has_technology (const std::string &name) const;
/**
* @brief Returns the technology with the given name
*
* If no technology with that name exists, the default technology is returned.
*/
Technology *technology_by_name (const std::string &name);
/**
* @brief Returns the technology with the given name (const version)
*
* If no technology with that name exists, the default technology is returned.
*/
const Technology *technology_by_name (const std::string &name) const
{
return const_cast<Technologies *> (this)->technology_by_name (name);
}
/**
* @brief Converts the list into an XML string
*/
std::string to_xml () const;
/**
* @brief Reads the list from an XML string
*/
void load_from_xml (const std::string &s);
/**
* @brief Returns the singleton instance
*/
static db::Technologies *instance ();
/**
* @brief An event indicating that the list of technologies has changed
* If a technology is added or removed, this event is triggered.
*/
tl::Event technologies_changed_event;
/**
* @brief An event indicating that one technology in the list has changed
* If a technology is modified, this event is triggered with that technology as argument of the event.
*/
tl::event<Technology *> technology_changed_event;
protected:
/**
* @brief Forward the event from the individual technologies
*/
void technology_changed (Technology *t);
/**
* @brief Sends the technologies_changed event
*/
void technologies_changed ();
private:
tl::stable_vector<Technology> m_technologies;
bool m_changed;
bool m_in_update;
void add_tech (Technology *technology, bool replace_same);
};
/**
* @brief A technology
*
* This class represents one technology.
* A technology has a name and a description.
*/
class DB_PUBLIC Technology
: public tl::Object
{
public:
/**
* @brief The default constructor
*/
Technology ();
/**
* @brief The constructor
*/
Technology (const std::string &name, const std::string &description);
/**
* @brief The copy constructor
*/
Technology (const Technology &tech);
/**
* @brief The destructor
*/
~Technology ();
/**
* @brief Assignment
*/
Technology &operator= (const Technology &tech);
/**
* @brief Gets the name
*/
const std::string &name () const
{
return m_name;
}
/**
* @brief Sets the name
*/
void set_name (const std::string &n)
{
if (n != m_name) {
m_name = n;
technology_changed ();
}
}
/**
* @brief Sets the package source
*
* This attribute indicates that this technology was contributed by a package
*/
void set_grain_name (const std::string &g)
{
m_grain_name = g;
}
/**
* @brief Gets the package source
*/
const std::string &grain_name () const
{
return m_grain_name;
}
/**
* @brief Gets the base path
*
* The base path is an effective path - if the explicit path is set, it is
* used. If not, the default path is used. The default path is the one from which
* a technology file was imported. The explicit one is the one that is specified
* explicitly.
*/
const std::string &base_path () const
{
return m_explicit_base_path.empty () ? m_default_base_path : m_explicit_base_path;
}
/**
* @brief Makes a file path relative to the base path if one is specified.
*
* Only files below the base path will be made relative. Files above or beside
* won't be made relative.
*/
std::string correct_path (const std::string &fp) const;
/**
* @brief Gets the default base path
*/
const std::string &default_base_path () const
{
return m_default_base_path;
}
/**
* @brief Sets the default base path
*/
void set_default_base_path (const std::string &p)
{
if (m_default_base_path != p) {
m_default_base_path = p;
technology_changed ();
}
}
/**
* @brief Gets the explicit base path
*/
const std::string &explicit_base_path () const
{
return m_explicit_base_path;
}
/**
* @brief Sets the explicit base path
*/
void set_explicit_base_path (const std::string &p)
{
if (m_explicit_base_path != p) {
m_explicit_base_path = p;
technology_changed ();
}
}
/**
* @brief Gets the path of the tech file if the technology was loaded from a tech file
*/
const std::string &tech_file_path () const
{
return m_lyt_file;
}
/**
* @brief Sets the path of the tech file
* This method is intended for internal use only.
*/
void set_tech_file_path (const std::string &lyt_file)
{
m_lyt_file = lyt_file;
}
/**
* @brief Gets the description
*/
const std::string &description () const
{
return m_description;
}
/**
* @brief Sets the description
*/
void set_description (const std::string &d)
{
if (m_description != d) {
m_description = d;
technology_changed ();
}
}
/**
* @brief Gets the default database unit
*/
double dbu () const
{
return m_dbu;
}
/**
* @brief Sets the default database unit
*/
void set_dbu (double d)
{
if (fabs (m_dbu - d) > 1e-10) {
m_dbu = d;
technology_changed ();
}
}
/**
* @brief Gets the layer properties file path (empty if none is specified)
*/
const std::string &layer_properties_file () const
{
return m_lyp_path;
}
/**
* @brief Gets the effective layer properties file path (empty if none is specified)
*
* The effective path is the one extended by the base path if relative.
*/
std::string eff_layer_properties_file () const
{
return build_effective_path (m_lyp_path);
}
/**
* @brief Sets the layer properties file path (set to empty string to remove layer properties file)
*/
void set_layer_properties_file (const std::string &lyp)
{
if (m_lyp_path != lyp) {
m_lyp_path = lyp;
technology_changed ();
}
}
/**
* @brief Gets the flag indicating whether to add other layers to the layer properties
*/
bool add_other_layers () const
{
return m_add_other_layers;
}
/**
* @brief Sets the flag indicating whether to add other layers to the layer properties
*
* If "add_other_layers" is true, the layers in the layout but not specified in the
* layer properties file will be added automatically.
*/
void set_add_other_layers (bool add_other_layers)
{
if (m_add_other_layers != add_other_layers) {
m_add_other_layers = add_other_layers;
technology_changed ();
}
}
/**
* @brief gets the layout reader options
*/
const db::LoadLayoutOptions &load_layout_options () const
{
return m_load_layout_options;
}
/**
* @brief Sets the layout reader options
*/
void set_load_layout_options (const db::LoadLayoutOptions &options)
{
m_load_layout_options = options;
technology_changed ();
}
/**
* @brief gets the layout writer options
*/
const db::SaveLayoutOptions &save_layout_options () const
{
return m_save_layout_options;
}
/**
* @brief Sets the layout writer options
*/
void set_save_layout_options (const db::SaveLayoutOptions &options)
{
m_save_layout_options = options;
technology_changed ();
}
/**
* @brief Load from file (import)
*/
void load (const std::string &fn);
/**
* @brief Save to file (export)
*/
void save (const std::string &fn) const;
/**
* @brief Delivers the XMLElementList that specifies the technology's XML representation
*/
static tl::XMLElementList xml_elements ();
/**
* @brief Sets the technology component by the component name
*
* This replaces the technology component with the given name.
* The Technology object will become owner of the component.
*/
void set_component (TechnologyComponent *component);
/**
* @brief Gets the technology component by the component name
*
* If no component with that name exists, 0 is returned.
*/
const TechnologyComponent *component_by_name (const std::string &component_name) const;
/**
* @brief Gets the technology component by the component name (non-const version)
*
* If no component with that name exists, 0 is returned.
*/
TechnologyComponent *component_by_name (const std::string &component_name);
/**
* @brief Gets the component names
*/
std::vector <std::string> component_names () const;
/**
* @brief Builds the effective path from a relative or absolute one using the base path if necessary
*/
std::string build_effective_path (const std::string &p) const;
/**
* @brief Returns a flag indicating whether the technology is persisted or not
*
* If the flag is false, this technology is not included into the XML string
* of the technologies.
*/
bool is_persisted () const
{
return m_persisted;
}
/**
* @brief Sets a flag indicating whether the technology is persisted
*/
void set_persisted (bool f)
{
m_persisted = f;
}
/**
* @brief Returns a flag indicating whether the technology is readonly
*
* If the flag is false, the technology can be edited. Otherwise it's locked for editing.
*/
bool is_readonly () const
{
return m_readonly;
}
/**
* @brief Sets a flag indicating whether the technology is readonly
*/
void set_readonly (bool f)
{
m_readonly = f;
}
/**
* @brief An event indicating that the technology has changed
*/
tl::Event technology_changed_event;
/**
* @brief An event indicating that the technology has changed (with a sender argument)
*/
tl::event<Technology *> technology_changed_with_sender_event;
private:
std::string m_name, m_description;
std::string m_grain_name;
double m_dbu;
std::string m_explicit_base_path, m_default_base_path;
db::LoadLayoutOptions m_load_layout_options;
db::SaveLayoutOptions m_save_layout_options;
std::string m_lyp_path;
std::string m_lyt_path;
bool m_add_other_layers;
std::vector <TechnologyComponent *> m_components;
bool m_persisted;
bool m_readonly;
std::string m_lyt_file;
void init ();
void technology_changed ()
{
technology_changed_with_sender_event (this);
technology_changed_event ();
}
};
/**
* @brief A technology component
*
* A technology component is a part of the data for one technology.
* Plugins may register technology components in every technology and
* use those components to store their specific data.
* A technology component has a name and a description. The name is used
* to identify a component within a technology. The description is shown
* in the setup dialogs.
* This class is the base class for all technology components.
*/
class DB_PUBLIC TechnologyComponent
{
public:
/**
* @brief The constructor
*
* @param name The name of the technology component
* @param descriptor The description of the technology component
*/
TechnologyComponent (const std::string &name, const std::string &description)
: m_name (name), m_description (description)
{
// .. nothing yet ..
}
/**
* @brief The destructor
*/
virtual ~TechnologyComponent ()
{
// .. nothing yet ..
}
/**
* @brief Gets the name
*/
const std::string &name () const
{
return m_name;
}
/**
* @brief Gets the description
*/
const std::string &description () const
{
return m_description;
}
/**
* @brief Clone this instance
*/
virtual TechnologyComponent *clone () const = 0;
private:
std::string m_name, m_description;
};
/**
* @brief A base class for a technology component provider
*/
class DB_PUBLIC TechnologyComponentProvider
: public tl::RegisteredClass<TechnologyComponentProvider>
{
public:
/**
* @brief The constructor
*/
TechnologyComponentProvider ()
: tl::RegisteredClass<TechnologyComponentProvider> (this)
{
// .. nothing yet ..
}
/**
* @brief The destructor
*/
virtual ~TechnologyComponentProvider ()
{
// .. nothing yet ..
}
/**
* @brief Creates the technology component
*/
virtual TechnologyComponent *create_component () const = 0;
/**
* @brief Delivers the XMLElement object that represents this component within a technology XML tree
*
* The object returned is destroyed by the caller.
*/
virtual tl::XMLElementBase *xml_element () const = 0;
};
/**
* @brief A helper class for the XML serialization of the technology component (custom read adaptor)
*/
template <class TC>
class TechnologyComponentReadAdaptor
{
public:
typedef tl::pass_by_ref_tag tag;
TechnologyComponentReadAdaptor (const std::string &name)
: m_name (name), mp_t (0), m_done (false)
{
// .. nothing yet ..
}
const TC &operator () () const
{
const TC *tc = dynamic_cast<const TC *> ((const_cast <db::Technology *> (mp_t))->component_by_name (m_name));
if (! tc) {
throw tl::Exception (tl::to_string (QObject::tr ("Unknown technology component: ")) + m_name);
}
return *tc;
}
bool at_end () const
{
return m_done;
}
void start (const db::Technology &t)
{
mp_t = &t;
m_done = false;
}
void next ()
{
m_done = true;
}
private:
std::string m_name;
const db::Technology *mp_t;
bool m_done;
};
/**
* @brief A helper class for the XML serialization of the technology component (custom write adaptor)
*/
template <class TC>
class TechnologyComponentWriteAdaptor
{
public:
TechnologyComponentWriteAdaptor (const std::string &name)
: m_name (name)
{
// .. nothing yet ..
}
void operator () (db::Technology &t, tl::XMLReaderState &reader) const
{
const TechnologyComponent *tc_basic = t.component_by_name (m_name);
TC *tc = 0;
if (! tc_basic) {
tc = new TC ();
} else {
tc = dynamic_cast<TC *> (tc_basic->clone ());
if (! tc) {
throw tl::Exception (tl::to_string (QObject::tr ("Invalid technology component: ")) + m_name);
}
}
tl::XMLObjTag<TC> tag;
*tc = *reader.back (tag);
t.set_component (tc);
}
private:
std::string m_name;
};
/**
* @brief A custom XMLElement for the serialization of technology components
*
* TechnologyComponentProvider::xml_element can return such an element to
* insert a custom XML element into the XML tree which represents the
* technology component.
*
* The name of the element will be the name of the technology component.
*/
template <class TC>
class TechnologyComponentXMLElement
: public tl::XMLElement<TC, db::Technology, TechnologyComponentReadAdaptor<TC>, TechnologyComponentWriteAdaptor<TC> >
{
public:
TechnologyComponentXMLElement (const std::string &name, const tl::XMLElementList &children)
: tl::XMLElement<TC, db::Technology, TechnologyComponentReadAdaptor<TC>, TechnologyComponentWriteAdaptor<TC> > (TechnologyComponentReadAdaptor<TC> (name), TechnologyComponentWriteAdaptor<TC> (name), name, children)
{
// .. nothing yet ..
}
TechnologyComponentXMLElement (const TechnologyComponentXMLElement &d)
: tl::XMLElement<TC, db::Technology, TechnologyComponentReadAdaptor<TC>, TechnologyComponentWriteAdaptor<TC> > (d)
{
// .. nothing yet ..
}
virtual tl::XMLElementBase *clone () const
{
return new TechnologyComponentXMLElement (*this);
}
};
}
namespace tl
{
/**
* @brief Type traits
*/
template <> struct type_traits <db::TechnologyComponent> : public type_traits<void> {
typedef tl::false_tag has_default_constructor;
typedef tl::false_tag has_copy_constructor;
};
}
#endif

View File

@ -21,10 +21,10 @@
*/ */
#include "dbTestSupport.h" #include "dbTestSupport.h"
#include "dbCommonReader.h"
#include "dbStreamLayers.h" #include "dbStreamLayers.h"
#include "dbReader.h" #include "dbReader.h"
#include "dbWriter.h" #include "dbWriter.h"
#include "dbCommonReader.h"
#include "dbCell.h" #include "dbCell.h"
#include "dbCellInst.h" #include "dbCellInst.h"
#include "dbLayoutDiff.h" #include "dbLayoutDiff.h"

View File

@ -24,96 +24,13 @@
#include "dbCommonReader.h" #include "dbCommonReader.h"
#include "dbLoadLayoutOptions.h" #include "dbLoadLayoutOptions.h"
#include "layCommonReaderPlugin.h"
#include "ui_CommonReaderOptionsPage.h"
#include "gsiDecl.h" #include "gsiDecl.h"
#include <QFrame> #include <QFrame>
namespace lay namespace dn
{ {
// ---------------------------------------------------------------
// CommonReaderOptionPage definition and implementation
CommonReaderOptionPage::CommonReaderOptionPage (QWidget *parent)
: StreamReaderOptionsPage (parent)
{
mp_ui = new Ui::CommonReaderOptionPage ();
mp_ui->setupUi (this);
}
CommonReaderOptionPage::~CommonReaderOptionPage ()
{
delete mp_ui;
mp_ui = 0;
}
void
CommonReaderOptionPage::setup (const db::FormatSpecificReaderOptions *o, const lay::Technology * /*tech*/)
{
static const db::CommonReaderOptions default_options;
const db::CommonReaderOptions *options = dynamic_cast<const db::CommonReaderOptions *> (o);
if (!options) {
options = &default_options;
}
mp_ui->enable_text_cbx->setChecked (options->enable_text_objects);
mp_ui->enable_properties_cbx->setChecked (options->enable_properties);
mp_ui->layer_map->set_layer_map (options->layer_map);
mp_ui->read_all_cbx->setChecked (options->create_other_layers);
}
void
CommonReaderOptionPage::commit (db::FormatSpecificReaderOptions *o, const lay::Technology * /*tech*/)
{
db::CommonReaderOptions *options = dynamic_cast<db::CommonReaderOptions *> (o);
if (options) {
options->enable_text_objects = mp_ui->enable_text_cbx->isChecked ();
options->enable_properties = mp_ui->enable_properties_cbx->isChecked ();
options->layer_map = mp_ui->layer_map->get_layer_map ();
options->create_other_layers = mp_ui->read_all_cbx->isChecked ();
}
}
// ---------------------------------------------------------------
// CommonReaderPluginDeclaration definition and implementation
class CommonReaderPluginDeclaration
: public StreamReaderPluginDeclaration
{
public:
CommonReaderPluginDeclaration ()
: StreamReaderPluginDeclaration (db::CommonReaderOptions ().format_name ())
{
// .. nothing yet ..
}
StreamReaderOptionsPage *format_specific_options_page (QWidget *parent) const
{
return new CommonReaderOptionPage (parent);
}
db::FormatSpecificReaderOptions *create_specific_options () const
{
return new db::CommonReaderOptions ();
}
virtual tl::XMLElementBase *xml_element () const
{
return new lay::ReaderOptionsXMLElement<db::CommonReaderOptions> ("common",
tl::make_member (&db::CommonReaderOptions::create_other_layers, "create-other-layers") +
tl::make_member (&db::CommonReaderOptions::layer_map, "layer-map") +
tl::make_member (&db::CommonReaderOptions::enable_properties, "enable-properties") +
tl::make_member (&db::CommonReaderOptions::enable_text_objects, "enable-text-objects")
);
}
};
static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::CommonReaderPluginDeclaration (), 10000, "CommonReader");
// --------------------------------------------------------------- // ---------------------------------------------------------------
// gsi Implementation of specific methods // gsi Implementation of specific methods
@ -164,7 +81,7 @@ static void set_properties_enabled (db::LoadLayoutOptions *options, bool l)
options->get_options<db::CommonReaderOptions> ().enable_properties = l; options->get_options<db::CommonReaderOptions> ().enable_properties = l;
} }
// extend lay::LoadLayoutOptions with the Common options // extend lay::LoadLayoutOptions with the Common options
static static
gsi::ClassExt<db::LoadLayoutOptions> common_reader_options ( gsi::ClassExt<db::LoadLayoutOptions> common_reader_options (
gsi::method_ext ("set_layer_map", &set_layer_map, gsi::arg ("map"), gsi::arg ("create_other_layers"), gsi::method_ext ("set_layer_map", &set_layer_map, gsi::arg ("map"), gsi::arg ("create_other_layers"),

View File

@ -20,7 +20,7 @@
*/ */
#include "gsiDecl.h" #include "gsiDecl.h"
#include "layTechnology.h" #include "dbTechnology.h"
#include "tlXMLWriter.h" #include "tlXMLWriter.h"
#include "tlXMLParser.h" #include "tlXMLParser.h"
@ -30,84 +30,84 @@ namespace gsi
static std::vector<std::string> technology_names () static std::vector<std::string> technology_names ()
{ {
std::vector<std::string> names; std::vector<std::string> names;
for (lay::Technologies::const_iterator t = lay::Technologies::instance ()->begin (); t != lay::Technologies::instance ()->end (); ++t) { for (db::Technologies::const_iterator t = db::Technologies::instance ()->begin (); t != db::Technologies::instance ()->end (); ++t) {
names.push_back (t->name ()); names.push_back (t->name ());
} }
return names; return names;
} }
static lay::Technology *technology_by_name (const std::string &name) static db::Technology *technology_by_name (const std::string &name)
{ {
return lay::Technologies::instance ()->technology_by_name (name); return db::Technologies::instance ()->technology_by_name (name);
} }
static lay::Technology *create_technology (const std::string &name) static db::Technology *create_technology (const std::string &name)
{ {
lay::Technology *tech = new lay::Technology (); db::Technology *tech = new db::Technology ();
tech->set_name (name); tech->set_name (name);
lay::Technologies::instance ()->add_new (tech); db::Technologies::instance ()->add_new (tech);
return tech; return tech;
} }
static void remove_technology (const std::string &name) static void remove_technology (const std::string &name)
{ {
lay::Technologies::instance ()->remove (name); db::Technologies::instance ()->remove (name);
} }
static bool has_technology (const std::string &name) static bool has_technology (const std::string &name)
{ {
return lay::Technologies::instance ()->has_technology (name); return db::Technologies::instance ()->has_technology (name);
} }
static std::string technologies_to_xml () static std::string technologies_to_xml ()
{ {
return lay::Technologies::instance ()->to_xml (); return db::Technologies::instance ()->to_xml ();
} }
static void technologies_from_xml (const std::string &s) static void technologies_from_xml (const std::string &s)
{ {
lay::Technologies::instance ()->load_from_xml (s); db::Technologies::instance ()->load_from_xml (s);
} }
static lay::Technology technology_from_xml (const std::string &s) static db::Technology technology_from_xml (const std::string &s)
{ {
lay::Technology tech; db::Technology tech;
tl::XMLStringSource source (s); tl::XMLStringSource source (s);
tl::XMLStruct<lay::Technology> xml_struct ("technology", lay::Technology::xml_elements ()); tl::XMLStruct<db::Technology> xml_struct ("technology", db::Technology::xml_elements ());
xml_struct.parse (source, tech); xml_struct.parse (source, tech);
return tech; return tech;
} }
static std::string technology_to_xml (const lay::Technology *tech) static std::string technology_to_xml (const db::Technology *tech)
{ {
if (! tech) { if (! tech) {
return std::string (); return std::string ();
} else { } else {
tl::OutputStringStream os; tl::OutputStringStream os;
tl::XMLStruct<lay::Technology> xml_struct ("technology", lay::Technology::xml_elements ()); tl::XMLStruct<db::Technology> xml_struct ("technology", db::Technology::xml_elements ());
tl::OutputStream oss (os); tl::OutputStream oss (os);
xml_struct.write (oss, *tech); xml_struct.write (oss, *tech);
return os.string (); return os.string ();
} }
} }
static lay::TechnologyComponent *get_component (lay::Technology *tech, const std::string &name) static db::TechnologyComponent *get_component (db::Technology *tech, const std::string &name)
{ {
return tech->component_by_name (name); return tech->component_by_name (name);
} }
static std::vector<std::string> get_component_names (const lay::Technology *tech) static std::vector<std::string> get_component_names (const db::Technology *tech)
{ {
return tech->component_names (); return tech->component_names ();
} }
gsi::Class<lay::TechnologyComponent> technology_component_decl ("lay", "TechnologyComponent", gsi::Class<db::TechnologyComponent> technology_component_decl ("lay", "TechnologyComponent",
gsi::method ("name", &lay::TechnologyComponent::name, gsi::method ("name", &db::TechnologyComponent::name,
"@brief Gets the formal name of the technology component\n" "@brief Gets the formal name of the technology component\n"
"This is the name by which the component can be obtained from a technology using " "This is the name by which the component can be obtained from a technology using "
"\\Technology#component." "\\Technology#component."
) + ) +
gsi::method ("description", &lay::TechnologyComponent::description, gsi::method ("description", &db::TechnologyComponent::description,
"@brief Gets the human-readable description string of the technology component\n" "@brief Gets the human-readable description string of the technology component\n"
), ),
"@brief A part of a technology definition\n" "@brief A part of a technology definition\n"
@ -122,16 +122,16 @@ gsi::Class<lay::TechnologyComponent> technology_component_decl ("lay", "Technolo
"This class has been introduced in version 0.25." "This class has been introduced in version 0.25."
); );
LAYBASIC_PUBLIC gsi::Class<lay::TechnologyComponent> &decl_layTechnologyComponent () { return technology_component_decl; } DB_PUBLIC gsi::Class<db::TechnologyComponent> &decl_layTechnologyComponent () { return technology_component_decl; }
gsi::Class<lay::Technology> technology_decl ("lay", "Technology", gsi::Class<db::Technology> technology_decl ("lay", "Technology",
gsi::method ("name", &lay::Technology::name, gsi::method ("name", &db::Technology::name,
"@brief Gets the name of the technology" "@brief Gets the name of the technology"
) + ) +
gsi::method ("name=", &lay::Technology::set_name, gsi::arg ("name"), gsi::method ("name=", &db::Technology::set_name, gsi::arg ("name"),
"@brief Sets the name of the technology" "@brief Sets the name of the technology"
) + ) +
gsi::method ("base_path", &lay::Technology::base_path, gsi::method ("base_path", &db::Technology::base_path,
"@brief Gets the base path of the technology\n" "@brief Gets the base path of the technology\n"
"\n" "\n"
"The base path is the effective path where files are read from if their " "The base path is the effective path where files are read from if their "
@ -140,15 +140,15 @@ gsi::Class<lay::Technology> technology_decl ("lay", "Technology",
"a technology file was imported. The explicit one is the one that is specified\n" "a technology file was imported. The explicit one is the one that is specified\n"
"explicitly with \\explicit_base_path=.\n" "explicitly with \\explicit_base_path=.\n"
) + ) +
gsi::method ("default_base_path", &lay::Technology::default_base_path, gsi::method ("default_base_path", &db::Technology::default_base_path,
"@brief Gets the default base path\n" "@brief Gets the default base path\n"
"\n" "\n"
"See \\base_path for details about the default base path.\n" "See \\base_path for details about the default base path.\n"
) + ) +
gsi::method ("default_base_path=", &lay::Technology::set_default_base_path, gsi::arg ("path"), gsi::method ("default_base_path=", &db::Technology::set_default_base_path, gsi::arg ("path"),
"@hide\n" // only for testing "@hide\n" // only for testing
) + ) +
gsi::method ("correct_path", &lay::Technology::correct_path, gsi::arg ("path"), gsi::method ("correct_path", &db::Technology::correct_path, gsi::arg ("path"),
"@brief Makes a file path relative to the base path if one is specified\n" "@brief Makes a file path relative to the base path if one is specified\n"
"\n" "\n"
"This method turns an absolute path into one relative to the base path. " "This method turns an absolute path into one relative to the base path. "
@ -157,7 +157,7 @@ gsi::Class<lay::Technology> technology_decl ("lay", "Technology",
"\n" "\n"
"See \\base_path for details about the default base path.\n" "See \\base_path for details about the default base path.\n"
) + ) +
gsi::method ("eff_path", &lay::Technology::build_effective_path, gsi::arg ("path"), gsi::method ("eff_path", &db::Technology::build_effective_path, gsi::arg ("path"),
"@brief Makes a file path relative to the base path if one is specified\n" "@brief Makes a file path relative to the base path if one is specified\n"
"\n" "\n"
"This method will return the actual path for a file from the file's path. " "This method will return the actual path for a file from the file's path. "
@ -166,55 +166,55 @@ gsi::Class<lay::Technology> technology_decl ("lay", "Technology",
"\n" "\n"
"See \\base_path for details about the default base path.\n" "See \\base_path for details about the default base path.\n"
) + ) +
gsi::method ("explicit_base_path", &lay::Technology::explicit_base_path, gsi::method ("explicit_base_path", &db::Technology::explicit_base_path,
"@brief Gets the explicit base path\n" "@brief Gets the explicit base path\n"
"\n" "\n"
"See \\base_path for details about the explicit base path.\n" "See \\base_path for details about the explicit base path.\n"
) + ) +
gsi::method ("explicit_base_path=", &lay::Technology::set_explicit_base_path, gsi::arg ("path"), gsi::method ("explicit_base_path=", &db::Technology::set_explicit_base_path, gsi::arg ("path"),
"@brief Sets the explicit base path\n" "@brief Sets the explicit base path\n"
"\n" "\n"
"See \\base_path for details about the explicit base path.\n" "See \\base_path for details about the explicit base path.\n"
) + ) +
gsi::method ("description", &lay::Technology::description, gsi::method ("description", &db::Technology::description,
"@brief Gets the description\n" "@brief Gets the description\n"
"\n" "\n"
"The technology description is shown to the user in technology selection dialogs and for " "The technology description is shown to the user in technology selection dialogs and for "
"display purposes." "display purposes."
) + ) +
gsi::method ("description=", &lay::Technology::set_description, gsi::arg ("description"), gsi::method ("description=", &db::Technology::set_description, gsi::arg ("description"),
"@brief Sets the description\n" "@brief Sets the description\n"
) + ) +
gsi::method ("dbu", &lay::Technology::dbu, gsi::method ("dbu", &db::Technology::dbu,
"@brief Gets the default database unit\n" "@brief Gets the default database unit\n"
"\n" "\n"
"The default database unit is the one used when creating a layout for example." "The default database unit is the one used when creating a layout for example."
) + ) +
gsi::method ("dbu=", &lay::Technology::set_dbu, gsi::arg ("dbu"), gsi::method ("dbu=", &db::Technology::set_dbu, gsi::arg ("dbu"),
"@brief Sets the default database unit\n" "@brief Sets the default database unit\n"
) + ) +
gsi::method ("layer_properties_file", &lay::Technology::layer_properties_file, gsi::method ("layer_properties_file", &db::Technology::layer_properties_file,
"@brief Gets the path of the layer properties file\n" "@brief Gets the path of the layer properties file\n"
"\n" "\n"
"If empty, no layer properties file is associated with the technology. " "If empty, no layer properties file is associated with the technology. "
"If non-empty, this path will be corrected by the base path (see \\correct_path) and " "If non-empty, this path will be corrected by the base path (see \\correct_path) and "
"this layer properties file will be loaded for layouts with this technology." "this layer properties file will be loaded for layouts with this technology."
) + ) +
gsi::method ("layer_properties_file=", &lay::Technology::set_layer_properties_file, gsi::arg ("file"), gsi::method ("layer_properties_file=", &db::Technology::set_layer_properties_file, gsi::arg ("file"),
"@brief Sets the path of the layer properties file\n" "@brief Sets the path of the layer properties file\n"
"\n" "\n"
"See \\layer_properties_file for details about this property." "See \\layer_properties_file for details about this property."
) + ) +
gsi::method ("eff_layer_properties_file", &lay::Technology::eff_layer_properties_file, gsi::method ("eff_layer_properties_file", &db::Technology::eff_layer_properties_file,
"@brief Gets the effective path of the layer properties file\n" "@brief Gets the effective path of the layer properties file\n"
) + ) +
gsi::method ("add_other_layers?", &lay::Technology::add_other_layers, gsi::method ("add_other_layers?", &db::Technology::add_other_layers,
"@brief Gets the flag indicating whether to add other layers to the layer properties\n" "@brief Gets the flag indicating whether to add other layers to the layer properties\n"
) + ) +
gsi::method ("add_other_layers=", &lay::Technology::set_add_other_layers, gsi::arg ("add"), gsi::method ("add_other_layers=", &db::Technology::set_add_other_layers, gsi::arg ("add"),
"@brief Sets the flag indicating whether to add other layers to the layer properties\n" "@brief Sets the flag indicating whether to add other layers to the layer properties\n"
) + ) +
gsi::method ("load_layout_options", &lay::Technology::load_layout_options, gsi::method ("load_layout_options", &db::Technology::load_layout_options,
"@brief Gets the layout reader options\n" "@brief Gets the layout reader options\n"
"\n" "\n"
"This method returns the layout reader options that are used when reading layouts " "This method returns the layout reader options that are used when reading layouts "
@ -228,12 +228,12 @@ gsi::Class<lay::Technology> technology_decl ("lay", "Technology",
"tech.load_layout_options = opt\n" "tech.load_layout_options = opt\n"
"@/code\n" "@/code\n"
) + ) +
gsi::method ("load_layout_options=", &lay::Technology::set_load_layout_options, gsi::arg ("options"), gsi::method ("load_layout_options=", &db::Technology::set_load_layout_options, gsi::arg ("options"),
"@brief Sets the layout reader options\n" "@brief Sets the layout reader options\n"
"\n" "\n"
"See \\load_layout_options for a description of this property.\n" "See \\load_layout_options for a description of this property.\n"
) + ) +
gsi::method ("save_layout_options", &lay::Technology::save_layout_options, gsi::method ("save_layout_options", &db::Technology::save_layout_options,
"@brief Gets the layout writer options\n" "@brief Gets the layout writer options\n"
"\n" "\n"
"This method returns the layout writer options that are used when writing layouts " "This method returns the layout writer options that are used when writing layouts "
@ -247,15 +247,15 @@ gsi::Class<lay::Technology> technology_decl ("lay", "Technology",
"tech.save_layout_options = opt\n" "tech.save_layout_options = opt\n"
"@/code\n" "@/code\n"
) + ) +
gsi::method ("save_layout_options=", &lay::Technology::set_save_layout_options, gsi::arg ("options"), gsi::method ("save_layout_options=", &db::Technology::set_save_layout_options, gsi::arg ("options"),
"@brief Sets the layout writer options\n" "@brief Sets the layout writer options\n"
"\n" "\n"
"See \\save_layout_options for a description of this property.\n" "See \\save_layout_options for a description of this property.\n"
) + ) +
gsi::method ("load", &lay::Technology::load, gsi::arg ("file"), gsi::method ("load", &db::Technology::load, gsi::arg ("file"),
"@brief Loads the technology definition from a file\n" "@brief Loads the technology definition from a file\n"
) + ) +
gsi::method ("load", &lay::Technology::save, gsi::arg ("file"), gsi::method ("load", &db::Technology::save, gsi::arg ("file"),
"@brief Saves the technology definition to a file\n" "@brief Saves the technology definition to a file\n"
) + ) +
gsi::method ("technology_names", &technology_names, gsi::method ("technology_names", &technology_names,

View File

@ -334,7 +334,7 @@ NetTracerDialog::do_trace (const db::DBox &start_search_box, const db::DBox &sto
} }
// fetch the net tracer data from the technology and apply to the current layout // fetch the net tracer data from the technology and apply to the current layout
const lay::Technology *tech = cv->technology (); const db::Technology *tech = cv->technology ();
if (! tech) { if (! tech) {
return 0; return 0;
} }
@ -1192,17 +1192,17 @@ BEGIN_PROTECTED
tech_name = cv->tech_name (); tech_name = cv->tech_name ();
} }
if (! lay::Technologies::instance ()->has_technology (tech_name)) { if (! db::Technologies::instance ()->has_technology (tech_name)) {
throw std::runtime_error (tl::to_string (QObject::tr ("Invalid technology attached to layout: ")) + tech_name); throw std::runtime_error (tl::to_string (QObject::tr ("Invalid technology attached to layout: ")) + tech_name);
} }
// create a temporary copy // create a temporary copy
lay::Technology tech = *lay::Technologies::instance ()->technology_by_name (tech_name); db::Technology tech = *db::Technologies::instance ()->technology_by_name (tech_name);
// call the dialog and if successful, install the new technology // call the dialog and if successful, install the new technology
lay::TechComponentSetupDialog dialog (this, &tech, net_tracer_component_name); lay::TechComponentSetupDialog dialog (this, &tech, net_tracer_component_name);
if (dialog.exec ()) { if (dialog.exec ()) {
*lay::Technologies::instance ()->technology_by_name (tech.name ()) = tech; *db::Technologies::instance ()->technology_by_name (tech.name ()) = tech;
} }
END_PROTECTED END_PROTECTED

View File

@ -358,13 +358,13 @@ NetTracerLayerExpressionInfo::get (const db::Layout &layout, const NetTracerTech
// NetTracerTechnologyComponent implementation // NetTracerTechnologyComponent implementation
NetTracerTechnologyComponent::NetTracerTechnologyComponent () NetTracerTechnologyComponent::NetTracerTechnologyComponent ()
: lay::TechnologyComponent (net_tracer_component_name, tl::to_string (QObject::tr ("Connectivity"))) : db::TechnologyComponent (net_tracer_component_name, tl::to_string (QObject::tr ("Connectivity")))
{ {
// .. nothing yet .. // .. nothing yet ..
} }
NetTracerTechnologyComponent::NetTracerTechnologyComponent (const NetTracerTechnologyComponent &d) NetTracerTechnologyComponent::NetTracerTechnologyComponent (const NetTracerTechnologyComponent &d)
: lay::TechnologyComponent (net_tracer_component_name, tl::to_string (QObject::tr ("Connectivity"))) : db::TechnologyComponent (net_tracer_component_name, tl::to_string (QObject::tr ("Connectivity")))
{ {
m_connections = d.m_connections; m_connections = d.m_connections;
m_symbols = d.m_symbols; m_symbols = d.m_symbols;
@ -414,12 +414,6 @@ NetTracerTechnologyComponent::get_tracer_data (const db::Layout &layout) const
return data; return data;
} }
lay::TechnologyComponentEditor *
NetTracerTechnologyComponent::create_editor (QWidget *parent)
{
return new NetTracerTechComponentEditor (parent);
}
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
// NetTracerConnectivityColumnDelegate definition and implementation // NetTracerConnectivityColumnDelegate definition and implementation

View File

@ -370,7 +370,7 @@ private:
}; };
class EXT_PUBLIC NetTracerTechnologyComponent class EXT_PUBLIC NetTracerTechnologyComponent
: public lay::TechnologyComponent : public db::TechnologyComponent
{ {
public: public:
typedef std::vector<NetTracerConnectionInfo>::const_iterator const_iterator; typedef std::vector<NetTracerConnectionInfo>::const_iterator const_iterator;
@ -469,9 +469,7 @@ public:
NetTracerData get_tracer_data (const db::Layout &layout) const; NetTracerData get_tracer_data (const db::Layout &layout) const;
virtual lay::TechnologyComponentEditor *create_editor (QWidget *parent); db::TechnologyComponent *clone () const
lay::TechnologyComponent *clone () const
{ {
return new NetTracerTechnologyComponent (*this); return new NetTracerTechnologyComponent (*this);
} }

View File

@ -79,12 +79,23 @@ extern std::string net_tracer_component_name;
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// NetTracerPlugin definition and implementation // NetTracerPlugin definition and implementation
class NetTracerPluginDeclaration class NetTracerTechnologyEditorProvider
: public lay::PluginDeclaration, : public lay::TechnologyEditorProvider
public lay::TechnologyComponentProvider
{ {
public: public:
virtual void get_options (std::vector < std::pair<std::string, std::string> > &options) const virtual lay::TechnologyComponentEditor *create_editor (QWidget *parent) const
{
return new NetTracerTechComponentEditor (parent);
}
};
static tl::RegisteredClass<lay::TechnologyEditorProvider> editor_decl (new NetTracerTechnologyEditorProvider (), 13000, "NetTracerPlugin");
class NetTracerPluginDeclaration
: public lay::PluginDeclaration
{
public:
virtual void get_options (std::vector < std::pair<std::string, std::string> > &options) const
{ {
options.push_back (std::pair<std::string, std::string> (cfg_nt_window_mode, "fit-net")); options.push_back (std::pair<std::string, std::string> (cfg_nt_window_mode, "fit-net"));
options.push_back (std::pair<std::string, std::string> (cfg_nt_window_dim, "1.0")); options.push_back (std::pair<std::string, std::string> (cfg_nt_window_dim, "1.0"));
@ -99,7 +110,7 @@ public:
options.push_back (std::pair<std::string, std::string> (cfg_nt_marker_intensity, "50")); options.push_back (std::pair<std::string, std::string> (cfg_nt_marker_intensity, "50"));
} }
virtual std::vector<std::pair <std::string, lay::ConfigPage *> > config_pages (QWidget *parent) const virtual std::vector<std::pair <std::string, lay::ConfigPage *> > config_pages (QWidget *parent) const
{ {
std::vector<std::pair <std::string, lay::ConfigPage *> > pages; std::vector<std::pair <std::string, lay::ConfigPage *> > pages;
pages.push_back (std::make_pair (tl::to_string (QObject::tr ("Other Tools|Net Tracer")), new NetTracerConfigPage (parent))); pages.push_back (std::make_pair (tl::to_string (QObject::tr ("Other Tools|Net Tracer")), new NetTracerConfigPage (parent)));
@ -113,32 +124,40 @@ public:
menu_entries.push_back (lay::MenuEntry ("net_trace_group", "tools_menu.end")); menu_entries.push_back (lay::MenuEntry ("net_trace_group", "tools_menu.end"));
menu_entries.push_back (lay::MenuEntry ("ext::net_trace", "net_trace", "tools_menu.end", tl::to_string (QObject::tr ("Trace Net")))); menu_entries.push_back (lay::MenuEntry ("ext::net_trace", "net_trace", "tools_menu.end", tl::to_string (QObject::tr ("Trace Net"))));
} }
virtual lay::Plugin *create_plugin (db::Manager * /*manager*/, lay::PluginRoot *root, lay::LayoutView *view) const virtual lay::Plugin *create_plugin (db::Manager * /*manager*/, lay::PluginRoot *root, lay::LayoutView *view) const
{ {
return new NetTracerDialog (root, view); return new NetTracerDialog (root, view);
} }
};
virtual const lay::TechnologyComponentProvider *technology_component_provider () const static tl::RegisteredClass<lay::PluginDeclaration> config_decl (new NetTracerPluginDeclaration (), 13000, "NetTracerPlugin");
class NetTracerTechnologyComponentProvider
: public db::TechnologyComponentProvider
{
public:
NetTracerTechnologyComponentProvider ()
: db::TechnologyComponentProvider ()
{ {
return this; // .. nothing yet ..
} }
virtual lay::TechnologyComponent *create_component () const virtual db::TechnologyComponent *create_component () const
{ {
return new NetTracerTechnologyComponent (); return new NetTracerTechnologyComponent ();
} }
virtual tl::XMLElementBase *xml_element () const virtual tl::XMLElementBase *xml_element () const
{ {
return new lay::TechnologyComponentXMLElement<NetTracerTechnologyComponent> (net_tracer_component_name, return new db::TechnologyComponentXMLElement<NetTracerTechnologyComponent> (net_tracer_component_name,
tl::make_member ((NetTracerTechnologyComponent::const_iterator (NetTracerTechnologyComponent::*) () const) &NetTracerTechnologyComponent::begin, (NetTracerTechnologyComponent::const_iterator (NetTracerTechnologyComponent::*) () const) &NetTracerTechnologyComponent::end, &NetTracerTechnologyComponent::add, "connection") + tl::make_member ((NetTracerTechnologyComponent::const_iterator (NetTracerTechnologyComponent::*) () const) &NetTracerTechnologyComponent::begin, (NetTracerTechnologyComponent::const_iterator (NetTracerTechnologyComponent::*) () const) &NetTracerTechnologyComponent::end, &NetTracerTechnologyComponent::add, "connection") +
tl::make_member ((NetTracerTechnologyComponent::const_symbol_iterator (NetTracerTechnologyComponent::*) () const) &NetTracerTechnologyComponent::begin_symbols, (NetTracerTechnologyComponent::const_symbol_iterator (NetTracerTechnologyComponent::*) () const) &NetTracerTechnologyComponent::end_symbols, &NetTracerTechnologyComponent::add_symbol, "symbols") tl::make_member ((NetTracerTechnologyComponent::const_symbol_iterator (NetTracerTechnologyComponent::*) () const) &NetTracerTechnologyComponent::begin_symbols, (NetTracerTechnologyComponent::const_symbol_iterator (NetTracerTechnologyComponent::*) () const) &NetTracerTechnologyComponent::end_symbols, &NetTracerTechnologyComponent::add_symbol, "symbols")
); );
} }
}; };
static tl::RegisteredClass<lay::PluginDeclaration> config_decl (new NetTracerPluginDeclaration (), 13000, "NetTracerPlugin"); static tl::RegisteredClass<db::TechnologyComponentProvider> tc_decl (new NetTracerTechnologyComponentProvider (), 13000, "NetTracerPlugin");
} }
@ -168,7 +187,7 @@ static void def_symbol (ext::NetTracerTechnologyComponent *tech, const std::stri
tech->add_symbol (ext::NetTracerSymbolInfo (db::LayerProperties (name), expr)); tech->add_symbol (ext::NetTracerSymbolInfo (db::LayerProperties (name), expr));
} }
gsi::Class<lay::TechnologyComponent> &decl_layTechnologyComponent (); gsi::Class<db::TechnologyComponent> &decl_layTechnologyComponent ();
gsi::Class<ext::NetTracerTechnologyComponent> decl_NetTracerTechnology (decl_layTechnologyComponent (), "lay", "NetTracerTechnology", gsi::Class<ext::NetTracerTechnologyComponent> decl_NetTracerTechnology (decl_layTechnologyComponent (), "lay", "NetTracerTechnology",
gsi::method_ext ("connection", &def_connection2, gsi::arg("a"), gsi::arg("b"), gsi::method_ext ("connection", &def_connection2, gsi::arg("a"), gsi::arg("b"),
@ -216,7 +235,7 @@ static void trace2 (ext::NetTracer *net_tracer, const ext::NetTracerTechnologyCo
static ext::NetTracerData get_tracer_data_from_cv (const lay::CellViewRef &cv) static ext::NetTracerData get_tracer_data_from_cv (const lay::CellViewRef &cv)
{ {
const lay::Technology *tech = cv->technology (); const db::Technology *tech = cv->technology ();
tl_assert (tech != 0); tl_assert (tech != 0);
const ext::NetTracerTechnologyComponent *tech_component = dynamic_cast <const ext::NetTracerTechnologyComponent *> (tech->component_by_name (ext::net_tracer_component_name)); const ext::NetTracerTechnologyComponent *tech_component = dynamic_cast <const ext::NetTracerTechnologyComponent *> (tech->component_by_name (ext::net_tracer_component_name));
@ -239,7 +258,7 @@ static void trace2_cv (ext::NetTracer *net_tracer, const lay::CellViewRef &cv, c
static ext::NetTracerData get_tracer_data_from_tech (const std::string &tech_name, const db::Layout &layout) static ext::NetTracerData get_tracer_data_from_tech (const std::string &tech_name, const db::Layout &layout)
{ {
const lay::Technology *tech = lay::Technologies::instance ()->technology_by_name (tech_name); const db::Technology *tech = db::Technologies::instance ()->technology_by_name (tech_name);
tl_assert (tech != 0); tl_assert (tech != 0);
const ext::NetTracerTechnologyComponent *tech_component = dynamic_cast <const ext::NetTracerTechnologyComponent *> (tech->component_by_name (ext::net_tracer_component_name)); const ext::NetTracerTechnologyComponent *tech_component = dynamic_cast <const ext::NetTracerTechnologyComponent *> (tech->component_by_name (ext::net_tracer_component_name));

View File

@ -151,7 +151,7 @@ static tl::XMLElementList xml_elements ()
) + ) +
tl::make_member (&StreamImportData::explicit_trans, "explicit-trans") + tl::make_member (&StreamImportData::explicit_trans, "explicit-trans") +
tl::make_element (&StreamImportData::options, "options", tl::make_element (&StreamImportData::options, "options",
lay::load_options_xml_element_list () db::load_options_xml_element_list ()
); );
} }

View File

@ -670,7 +670,7 @@ ApplicationBase::init_app ()
tl::info << "Importing technology from " << f->second.second; tl::info << "Importing technology from " << f->second.second;
} }
lay::Technology t; db::Technology t;
t.load (f->second.second); t.load (f->second.second);
tc->add_temp_tech (t); tc->add_temp_tech (t);

View File

@ -145,7 +145,7 @@ LibraryController::sync_files ()
// add the technologies as potential sources for library definitions // add the technologies as potential sources for library definitions
for (lay::Technologies::iterator t = lay::Technologies::instance ()->begin (); t != lay::Technologies::instance ()->end (); ++t) { for (db::Technologies::iterator t = db::Technologies::instance ()->begin (); t != db::Technologies::instance ()->end (); ++t) {
if (! t->base_path ().empty ()) { if (! t->base_path ().empty ()) {
paths.push_back (std::make_pair (t->base_path (), t->name ())); paths.push_back (std::make_pair (t->base_path (), t->name ()));
} }

View File

@ -502,7 +502,7 @@ MacroController::sync_macro_sources ()
std::map<std::string, std::vector<std::string> > grain_names_by_path; std::map<std::string, std::vector<std::string> > grain_names_by_path;
std::set<std::string> readonly_paths; std::set<std::string> readonly_paths;
for (lay::Technologies::const_iterator t = lay::Technologies::instance ()->begin (); t != lay::Technologies::instance ()->end (); ++t) { for (db::Technologies::const_iterator t = db::Technologies::instance ()->begin (); t != db::Technologies::instance ()->end (); ++t) {
if (! t->base_path ().empty ()) { if (! t->base_path ().empty ()) {
QDir base_dir (tl::to_qstring (t->base_path ())); QDir base_dir (tl::to_qstring (t->base_path ()));
if (base_dir.exists ()) { if (base_dir.exists ()) {
@ -652,7 +652,7 @@ static std::string menu_name (std::set<std::string> &used_names, const std::stri
} }
void void
MacroController::add_macro_items_to_menu (lym::MacroCollection &collection, std::set<std::string> &used_names, std::set<std::string> &groups, const lay::Technology *tech) MacroController::add_macro_items_to_menu (lym::MacroCollection &collection, std::set<std::string> &used_names, std::set<std::string> &groups, const db::Technology *tech)
{ {
for (lym::MacroCollection::child_iterator c = collection.begin_children (); c != collection.end_children (); ++c) { for (lym::MacroCollection::child_iterator c = collection.begin_children (); c != collection.end_children (); ++c) {
@ -775,7 +775,7 @@ MacroController::do_update_menu_with_macros ()
return; return;
} }
const lay::Technology *tech = 0; const db::Technology *tech = 0;
if (lay::TechnologyController::instance ()) { if (lay::TechnologyController::instance ()) {
tech = lay::TechnologyController::instance ()->active_technology (); tech = lay::TechnologyController::instance ()->active_technology ();
} }

View File

@ -37,12 +37,16 @@
#include <QObject> #include <QObject>
namespace db
{
class Technology;
}
namespace lay namespace lay
{ {
class MacroEditorDialog; class MacroEditorDialog;
class MainWindow; class MainWindow;
class Technology;
class Action; class Action;
/** /**
@ -248,7 +252,7 @@ private:
std::vector<std::pair<std::string, bool> > m_menu_items_hidden; std::vector<std::pair<std::string, bool> > m_menu_items_hidden;
void sync_implicit_macros (bool ask_before_autorun); void sync_implicit_macros (bool ask_before_autorun);
void add_macro_items_to_menu (lym::MacroCollection &collection, std::set<std::string> &used_names, std::set<std::string> &groups, const lay::Technology *tech); void add_macro_items_to_menu (lym::MacroCollection &collection, std::set<std::string> &used_names, std::set<std::string> &groups, const db::Technology *tech);
void do_update_menu_with_macros (); void do_update_menu_with_macros ();
void do_sync_with_external_sources (); void do_sync_with_external_sources ();
void sync_file_watcher (); void sync_file_watcher ();

View File

@ -3390,13 +3390,13 @@ MainWindow::cm_pull_in ()
void void
MainWindow::cm_reader_options () MainWindow::cm_reader_options ()
{ {
mp_layout_load_options->edit_global_options (this, lay::Technologies::instance ()); mp_layout_load_options->edit_global_options (this, db::Technologies::instance ());
} }
void void
MainWindow::cm_writer_options () MainWindow::cm_writer_options ()
{ {
mp_layout_save_options->edit_global_options (this, lay::Technologies::instance ()); mp_layout_save_options->edit_global_options (this, db::Technologies::instance ());
} }
void void
@ -4154,7 +4154,7 @@ MainWindow::open_recent ()
return; return;
} }
if (mp_layout_load_options->show_always () && !mp_layout_load_options->edit_global_options (this, lay::Technologies::instance ())) { if (mp_layout_load_options->show_always () && !mp_layout_load_options->edit_global_options (this, db::Technologies::instance ())) {
return; return;
} }
@ -4203,7 +4203,7 @@ MainWindow::open (int mode)
return; return;
} }
if (mp_layout_load_options->show_always () && !mp_layout_load_options->edit_global_options (this, lay::Technologies::instance ())) { if (mp_layout_load_options->show_always () && !mp_layout_load_options->edit_global_options (this, db::Technologies::instance ())) {
return; return;
} }

View File

@ -227,7 +227,7 @@ public:
*/ */
lay::CellViewRef load_layout (const std::string &filename, const std::string &technology, int mode = 0) lay::CellViewRef load_layout (const std::string &filename, const std::string &technology, int mode = 0)
{ {
return load_layout (filename, lay::Technologies::instance ()->technology_by_name (technology)->load_layout_options (), technology, mode); return load_layout (filename, db::Technologies::instance ()->technology_by_name (technology)->load_layout_options (), technology, mode);
} }
/** /**

View File

@ -30,6 +30,7 @@
#include "layStream.h" #include "layStream.h"
#include "tlXMLParser.h" #include "tlXMLParser.h"
#include "tlStream.h" #include "tlStream.h"
#include "dbStream.h"
#include "rdb.h" #include "rdb.h"
#include <fstream> #include <fstream>
@ -261,10 +262,10 @@ session_structure ("session",
tl::make_member<std::string, SessionLayoutDescriptor> (&SessionLayoutDescriptor::file_path, "file-path") + tl::make_member<std::string, SessionLayoutDescriptor> (&SessionLayoutDescriptor::file_path, "file-path") +
tl::make_member<bool, SessionLayoutDescriptor> (&SessionLayoutDescriptor::save_options_valid, "save-options-valid") + tl::make_member<bool, SessionLayoutDescriptor> (&SessionLayoutDescriptor::save_options_valid, "save-options-valid") +
tl::make_element<db::SaveLayoutOptions, SessionLayoutDescriptor> (&SessionLayoutDescriptor::save_options, "save-options", tl::make_element<db::SaveLayoutOptions, SessionLayoutDescriptor> (&SessionLayoutDescriptor::save_options, "save-options",
lay::save_options_xml_element_list () db::save_options_xml_element_list ()
) + ) +
tl::make_element<db::LoadLayoutOptions, SessionLayoutDescriptor> (&SessionLayoutDescriptor::load_options, "load-options", tl::make_element<db::LoadLayoutOptions, SessionLayoutDescriptor> (&SessionLayoutDescriptor::load_options, "load-options",
lay::load_options_xml_element_list () db::load_options_xml_element_list ()
) )
) + ) +
tl::make_element<SessionViewDescriptor, std::vector<SessionViewDescriptor>::const_iterator, Session> (&Session::begin_views, &Session::end_views, &Session::add_view, "view", tl::make_element<SessionViewDescriptor, std::vector<SessionViewDescriptor>::const_iterator, Session> (&Session::begin_views, &Session::end_views, &Session::add_view, "view",

View File

@ -35,6 +35,7 @@
#include "lymMacro.h" #include "lymMacro.h"
#include "tlAssert.h" #include "tlAssert.h"
#include "tlStream.h" #include "tlStream.h"
#include "tlClassRegistry.h"
#include "dbStream.h" #include "dbStream.h"
#include <QInputDialog> #include <QInputDialog>
@ -52,7 +53,7 @@ namespace lay
// ---------------------------------------------------------------- // ----------------------------------------------------------------
static std::string static std::string
title_for_technology (const lay::Technology *t) title_for_technology (const db::Technology *t)
{ {
std::string d; std::string d;
if (t->name ().empty ()) { if (t->name ().empty ()) {
@ -544,7 +545,7 @@ TechSetupDialog::~TechSetupDialog ()
void void
TechSetupDialog::clear_components () TechSetupDialog::clear_components ()
{ {
for (std::map <std::string, lay::TechnologyComponent *>::iterator tc = m_technology_components.begin (); tc != m_technology_components.end (); ++tc) { for (std::map <std::string, db::TechnologyComponent *>::iterator tc = m_technology_components.begin (); tc != m_technology_components.end (); ++tc) {
delete tc->second; delete tc->second;
} }
m_technology_components.clear (); m_technology_components.clear ();
@ -627,7 +628,7 @@ TechSetupDialog::update ()
} }
int int
TechSetupDialog::exec (lay::Technologies &technologies) TechSetupDialog::exec (db::Technologies &technologies)
{ {
if (s_first_show) { if (s_first_show) {
TipDialog td (this, TipDialog td (this,
@ -649,7 +650,7 @@ TechSetupDialog::exec (lay::Technologies &technologies)
// clean up // clean up
update_tech (0); update_tech (0);
m_technologies = lay::Technologies (); m_technologies = db::Technologies ();
update_tech_tree (); update_tech_tree ();
return ret; return ret;
@ -662,7 +663,7 @@ BEGIN_PROTECTED
commit_tech_component (); commit_tech_component ();
lay::Technology *t = selected_tech (); db::Technology *t = selected_tech ();
if (! t) { if (! t) {
t = m_technologies.technology_by_name (std::string ()); t = m_technologies.technology_by_name (std::string ());
tl_assert (t != 0); tl_assert (t != 0);
@ -698,7 +699,7 @@ BEGIN_PROTECTED
} }
} }
lay::Technology *nt = new lay::Technology (*t); db::Technology *nt = new db::Technology (*t);
nt->set_tech_file_path (tl::to_string (tech_dir.absoluteFilePath (tn + QString::fromUtf8 (".lyt")))); nt->set_tech_file_path (tl::to_string (tech_dir.absoluteFilePath (tn + QString::fromUtf8 (".lyt"))));
nt->set_default_base_path (tl::to_string (tech_dir.absolutePath ())); nt->set_default_base_path (tl::to_string (tech_dir.absolutePath ()));
@ -720,7 +721,7 @@ TechSetupDialog::delete_clicked ()
{ {
BEGIN_PROTECTED BEGIN_PROTECTED
lay::Technology *t = selected_tech (); db::Technology *t = selected_tech ();
if (! t) { if (! t) {
throw tl::Exception (tl::to_string (QObject::tr ("No technology selected"))); throw tl::Exception (tl::to_string (QObject::tr ("No technology selected")));
} }
@ -737,7 +738,7 @@ BEGIN_PROTECTED
QObject::tr ("Are you sure to delete this technology?\nThis operation cannot be undone, except by cancelling the technology manager."), QObject::tr ("Are you sure to delete this technology?\nThis operation cannot be undone, except by cancelling the technology manager."),
QMessageBox::No | QMessageBox::Yes) == QMessageBox::Yes) { QMessageBox::No | QMessageBox::Yes) == QMessageBox::Yes) {
for (lay::Technologies::const_iterator i = m_technologies.begin (); i != m_technologies.end (); ++i) { for (db::Technologies::const_iterator i = m_technologies.begin (); i != m_technologies.end (); ++i) {
if (i->name () == t->name ()) { if (i->name () == t->name ()) {
@ -763,7 +764,7 @@ BEGIN_PROTECTED
commit_tech_component (); commit_tech_component ();
lay::Technology *t = selected_tech (); db::Technology *t = selected_tech ();
if (! t) { if (! t) {
throw tl::Exception (tl::to_string (QObject::tr ("No technology selected"))); throw tl::Exception (tl::to_string (QObject::tr ("No technology selected")));
} }
@ -821,13 +822,13 @@ BEGIN_PROTECTED
std::string fn; std::string fn;
if (open_dialog.get_open (fn)) { if (open_dialog.get_open (fn)) {
lay::Technology t; db::Technology t;
t.load (fn); t.load (fn);
if (m_technologies.has_technology (t.name ())) { if (m_technologies.has_technology (t.name ())) {
*m_technologies.technology_by_name (t.name ()) = t; *m_technologies.technology_by_name (t.name ()) = t;
} else { } else {
m_technologies.add (new lay::Technology (t)); m_technologies.add (new db::Technology (t));
} }
update_tech_tree (); update_tech_tree ();
@ -843,7 +844,7 @@ TechSetupDialog::export_clicked ()
{ {
BEGIN_PROTECTED BEGIN_PROTECTED
lay::Technology *t = selected_tech (); db::Technology *t = selected_tech ();
if (! t) { if (! t) {
throw tl::Exception (tl::to_string (QObject::tr ("No technology selected"))); throw tl::Exception (tl::to_string (QObject::tr ("No technology selected")));
} }
@ -863,12 +864,12 @@ TechSetupDialog::update_tech_tree ()
{ {
tech_tree->clear (); tech_tree->clear ();
std::map <std::string, const lay::Technology *> tech_by_name; std::map <std::string, const db::Technology *> tech_by_name;
for (lay::Technologies::const_iterator t = m_technologies.begin (); t != m_technologies.end (); ++t) { for (db::Technologies::const_iterator t = m_technologies.begin (); t != m_technologies.end (); ++t) {
tech_by_name.insert (std::make_pair (t->name (), &*t)); tech_by_name.insert (std::make_pair (t->name (), &*t));
} }
for (std::map <std::string, const lay::Technology *>::const_iterator t = tech_by_name.begin (); t != tech_by_name.end (); ++t) { for (std::map <std::string, const db::Technology *>::const_iterator t = tech_by_name.begin (); t != tech_by_name.end (); ++t) {
QFont f (tech_tree->font ()); QFont f (tech_tree->font ());
f.setItalic (t->second->is_readonly ()); f.setItalic (t->second->is_readonly ());
@ -882,7 +883,7 @@ TechSetupDialog::update_tech_tree ()
} }
std::vector <std::string> tc_names = t->second->component_names (); std::vector <std::string> tc_names = t->second->component_names ();
std::map <std::string, const lay::TechnologyComponent *> tc_by_name; std::map <std::string, const db::TechnologyComponent *> tc_by_name;
for (std::vector <std::string>::const_iterator n = tc_names.begin (); n != tc_names.end (); ++n) { for (std::vector <std::string>::const_iterator n = tc_names.begin (); n != tc_names.end (); ++n) {
tc_by_name.insert (std::make_pair (*n, t->second->component_by_name (*n))); tc_by_name.insert (std::make_pair (*n, t->second->component_by_name (*n)));
} }
@ -912,7 +913,7 @@ TechSetupDialog::update_tech_tree ()
} }
} }
for (std::map <std::string, const lay::TechnologyComponent *>::const_iterator c = tc_by_name.begin (); c != tc_by_name.end (); ++c) { for (std::map <std::string, const db::TechnologyComponent *>::const_iterator c = tc_by_name.begin (); c != tc_by_name.end (); ++c) {
tci = new QTreeWidgetItem (ti); tci = new QTreeWidgetItem (ti);
tci->setData (0, Qt::DisplayRole, QVariant (tl::to_qstring (c->second->description ()))); tci->setData (0, Qt::DisplayRole, QVariant (tl::to_qstring (c->second->description ())));
tci->setData (0, Qt::UserRole + 1, QVariant (tl::to_qstring (c->first))); tci->setData (0, Qt::UserRole + 1, QVariant (tl::to_qstring (c->first)));
@ -923,7 +924,7 @@ TechSetupDialog::update_tech_tree ()
} }
void void
TechSetupDialog::update_tech (lay::Technology *t) TechSetupDialog::update_tech (db::Technology *t)
{ {
if (t == mp_current_tech) { if (t == mp_current_tech) {
return; return;
@ -967,10 +968,16 @@ TechSetupDialog::update_tech (lay::Technology *t)
std::vector <std::string> tc_names = t->component_names (); std::vector <std::string> tc_names = t->component_names ();
for (std::vector <std::string>::const_iterator n = tc_names.begin (); n != tc_names.end (); ++n) { for (std::vector <std::string>::const_iterator n = tc_names.begin (); n != tc_names.end (); ++n) {
TechnologyComponent *tc = t->component_by_name (*n)->clone (); db::TechnologyComponent *tc = t->component_by_name (*n)->clone ();
m_technology_components.insert (std::make_pair (*n, tc)); m_technology_components.insert (std::make_pair (*n, tc));
tce_widget = tc->create_editor (this); tce_widget = 0;
for (tl::Registrar<lay::TechnologyEditorProvider>::iterator cls = tl::Registrar<lay::TechnologyEditorProvider>::begin (); cls != tl::Registrar<lay::TechnologyEditorProvider>::begin () && ! tce_widget; ++cls) {
if (cls.current_name () == tc->name ()) {
tce_widget = cls->create_editor (this);
}
}
if (tce_widget) { if (tce_widget) {
tce_widget->setEnabled (!t->is_readonly ()); tce_widget->setEnabled (!t->is_readonly ());
tce_widget->set_technology (t, tc); tce_widget->set_technology (t, tc);
@ -990,7 +997,7 @@ TechSetupDialog::update_tech_component ()
std::map <std::string, lay::TechnologyComponentEditor *>::const_iterator tce = m_component_editors.find (tc_name); std::map <std::string, lay::TechnologyComponentEditor *>::const_iterator tce = m_component_editors.find (tc_name);
if (tce != m_component_editors.end ()) { if (tce != m_component_editors.end ()) {
std::map <std::string, lay::TechnologyComponent *>::const_iterator tc = m_technology_components.find (tc_name); std::map <std::string, db::TechnologyComponent *>::const_iterator tc = m_technology_components.find (tc_name);
if (tc != m_technology_components.end ()) { if (tc != m_technology_components.end ()) {
mp_current_tech_component = tc->second; mp_current_tech_component = tc->second;
} else { } else {
@ -1010,7 +1017,7 @@ TechSetupDialog::update_tech_component ()
} }
void void
TechSetupDialog::select_tech (const lay::Technology &tech) TechSetupDialog::select_tech (const db::Technology &tech)
{ {
// unselect the previous technology // unselect the previous technology
update_tech (0); update_tech (0);
@ -1081,7 +1088,7 @@ TechSetupDialog::commit_tech_component ()
QTreeWidgetItem *item = tech_tree->topLevelItem (i - 1); QTreeWidgetItem *item = tech_tree->topLevelItem (i - 1);
lay::Technology *t = m_technologies.technology_by_name (tl::to_string (item->data (0, Qt::UserRole).toString ())); db::Technology *t = m_technologies.technology_by_name (tl::to_string (item->data (0, Qt::UserRole).toString ()));
item->setData (0, Qt::DisplayRole, QVariant (tl::to_qstring (title_for_technology (t)))); item->setData (0, Qt::DisplayRole, QVariant (tl::to_qstring (title_for_technology (t))));
} }
@ -1103,7 +1110,7 @@ TechSetupDialog::selected_tech_component_name ()
return std::string (); return std::string ();
} }
lay::Technology * db::Technology *
TechSetupDialog::selected_tech () TechSetupDialog::selected_tech ()
{ {
QTreeWidgetItem *item = tech_tree->currentItem (); QTreeWidgetItem *item = tech_tree->currentItem ();
@ -1128,7 +1135,7 @@ TechSetupDialog::selected_tech ()
// ---------------------------------------------------------------- // ----------------------------------------------------------------
// TechComponentSetupDialog implementation // TechComponentSetupDialog implementation
TechComponentSetupDialog::TechComponentSetupDialog (QWidget *parent, Technology *tech, const std::string &component_name) TechComponentSetupDialog::TechComponentSetupDialog (QWidget *parent, db::Technology *tech, const std::string &component_name)
: QDialog (parent), : QDialog (parent),
mp_tech (tech), mp_component (0), mp_editor (0) mp_tech (tech), mp_component (0), mp_editor (0)
{ {
@ -1142,12 +1149,18 @@ TechComponentSetupDialog::TechComponentSetupDialog (QWidget *parent, Technology
setWindowTitle (tl::to_qstring (tl::to_string (QObject::tr ("Edit Technology")) + " - " + tech->name ())); setWindowTitle (tl::to_qstring (tl::to_string (QObject::tr ("Edit Technology")) + " - " + tech->name ()));
} }
const TechnologyComponent *component = tech->component_by_name (component_name); const db::TechnologyComponent *component = tech->component_by_name (component_name);
if (component) { if (component) {
mp_component = component->clone (); mp_component = component->clone ();
mp_editor = mp_component->create_editor (content_frame); mp_editor = 0;
for (tl::Registrar<lay::TechnologyEditorProvider>::iterator cls = tl::Registrar<lay::TechnologyEditorProvider>::begin (); cls != tl::Registrar<lay::TechnologyEditorProvider>::begin () && ! mp_editor; ++cls) {
if (cls.current_name () == mp_component->name ()) {
mp_editor = cls->create_editor (content_frame);
}
}
if (mp_editor) { if (mp_editor) {
QVBoxLayout *layout = new QVBoxLayout (content_frame); QVBoxLayout *layout = new QVBoxLayout (content_frame);

View File

@ -38,6 +38,11 @@
#include <memory> #include <memory>
namespace db
{
class Technology;
}
namespace lym namespace lym
{ {
class Macro; class Macro;
@ -48,7 +53,6 @@ namespace lay
{ {
class TechnologyComponentEditor; class TechnologyComponentEditor;
class Technology;
class TechBaseEditorPage class TechBaseEditorPage
: public TechnologyComponentEditor, : public TechnologyComponentEditor,
@ -133,7 +137,7 @@ public:
TechSetupDialog (QWidget *parent); TechSetupDialog (QWidget *parent);
~TechSetupDialog (); ~TechSetupDialog ();
int exec (lay::Technologies &technologies); int exec (db::Technologies &technologies);
protected slots: protected slots:
void current_tech_changed (QTreeWidgetItem *current, QTreeWidgetItem *previous); void current_tech_changed (QTreeWidgetItem *current, QTreeWidgetItem *previous);
@ -146,22 +150,22 @@ protected slots:
private: private:
void update_tech_tree (); void update_tech_tree ();
void update_tech (lay::Technology *tech); void update_tech (db::Technology *tech);
void update_tech_component (); void update_tech_component ();
void accept (); void accept ();
lay::Technology *selected_tech (); db::Technology *selected_tech ();
void select_tech (const lay::Technology &tech); void select_tech (const db::Technology &tech);
std::string selected_tech_component_name (); std::string selected_tech_component_name ();
void commit_tech_component (); void commit_tech_component ();
void clear_components (); void clear_components ();
void update (); void update ();
lay::Technologies m_technologies; db::Technologies m_technologies;
lay::Technology *mp_current_tech; db::Technology *mp_current_tech;
std::map <std::string, lay::TechnologyComponentEditor *> m_component_editors; std::map <std::string, lay::TechnologyComponentEditor *> m_component_editors;
std::map <std::string, lay::TechnologyComponent *> m_technology_components; std::map <std::string, db::TechnologyComponent *> m_technology_components;
lay::TechnologyComponentEditor *mp_current_editor; lay::TechnologyComponentEditor *mp_current_editor;
lay::TechnologyComponent *mp_current_tech_component; db::TechnologyComponent *mp_current_tech_component;
bool m_current_tech_changed_enabled; bool m_current_tech_changed_enabled;
}; };
@ -170,16 +174,16 @@ class LAY_PUBLIC TechComponentSetupDialog
public Ui::TechComponentSetupDialog public Ui::TechComponentSetupDialog
{ {
public: public:
TechComponentSetupDialog (QWidget *parent, Technology *tech, const std::string &component_name); TechComponentSetupDialog (QWidget *parent, db::Technology *tech, const std::string &component_name);
~TechComponentSetupDialog (); ~TechComponentSetupDialog ();
protected: protected:
void accept (); void accept ();
private: private:
Technology *mp_tech; db::Technology *mp_tech;
TechnologyComponent *mp_component; db::TechnologyComponent *mp_component;
TechnologyComponentEditor *mp_editor; lay::TechnologyComponentEditor *mp_editor;
}; };
} }

View File

@ -128,8 +128,8 @@ TechnologyController::connect_events ()
tl::Object::detach_from_all_events (); tl::Object::detach_from_all_events ();
lay::Technologies::instance ()->technology_changed_event.add (this, &TechnologyController::technology_changed); db::Technologies::instance ()->technology_changed_event.add (this, &TechnologyController::technology_changed);
lay::Technologies::instance ()->technologies_changed_event.add (this, &TechnologyController::technologies_changed); db::Technologies::instance ()->technologies_changed_event.add (this, &TechnologyController::technologies_changed);
if (mp_mw) { if (mp_mw) {
@ -154,7 +154,7 @@ TechnologyController::connect_events ()
} }
} }
lay::Technology * db::Technology *
TechnologyController::active_technology () const TechnologyController::active_technology () const
{ {
return mp_active_technology; return mp_active_technology;
@ -163,12 +163,12 @@ TechnologyController::active_technology () const
void void
TechnologyController::update_active_technology () TechnologyController::update_active_technology ()
{ {
lay::Technology *active_tech = 0; db::Technology *active_tech = 0;
if (mp_mw && mp_mw->current_view () && mp_mw->current_view ()->active_cellview_index () >= 0 && mp_mw->current_view ()->active_cellview_index () <= int (mp_mw->current_view ()->cellviews ())) { if (mp_mw && mp_mw->current_view () && mp_mw->current_view ()->active_cellview_index () >= 0 && mp_mw->current_view ()->active_cellview_index () <= int (mp_mw->current_view ()->cellviews ())) {
std::string tn = mp_mw->current_view ()->active_cellview ()->tech_name (); std::string tn = mp_mw->current_view ()->active_cellview ()->tech_name ();
if (lay::Technologies::instance ()->has_technology (tn)) { if (db::Technologies::instance ()->has_technology (tn)) {
active_tech = lay::Technologies::instance ()->technology_by_name (tn); active_tech = db::Technologies::instance ()->technology_by_name (tn);
} }
} }
@ -207,7 +207,7 @@ TechnologyController::technologies_changed ()
if (pr) { if (pr) {
m_configure_enabled = false; m_configure_enabled = false;
try { try {
pr->config_set (cfg_technologies, lay::Technologies::instance ()->to_xml ()); pr->config_set (cfg_technologies, db::Technologies::instance ()->to_xml ());
m_configure_enabled = true; m_configure_enabled = true;
} catch (...) { } catch (...) {
m_configure_enabled = true; m_configure_enabled = true;
@ -220,7 +220,7 @@ TechnologyController::technologies_changed ()
} }
void void
TechnologyController::technology_changed (lay::Technology *) TechnologyController::technology_changed (db::Technology *)
{ {
technologies_changed (); technologies_changed ();
} }
@ -248,7 +248,7 @@ TechnologyController::configure (const std::string &name, const std::string &val
if (! value.empty ()) { if (! value.empty ()) {
try { try {
lay::Technologies new_tech = *lay::Technologies::instance (); db::Technologies new_tech = *db::Technologies::instance ();
new_tech.load_from_xml (value); new_tech.load_from_xml (value);
replace_technologies (new_tech); replace_technologies (new_tech);
m_technologies_configured = true; m_technologies_configured = true;
@ -310,13 +310,13 @@ TechnologyController::update_current_technology ()
action.set_title (title); action.set_title (title);
} }
std::map<std::string, const lay::Technology *> tech_by_name; std::map<std::string, const db::Technology *> tech_by_name;
for (lay::Technologies::const_iterator t = lay::Technologies::instance ()->begin (); t != lay::Technologies::instance ()->end (); ++t) { for (db::Technologies::const_iterator t = db::Technologies::instance ()->begin (); t != db::Technologies::instance ()->end (); ++t) {
tech_by_name.insert (std::make_pair (t->name (), t.operator-> ())); tech_by_name.insert (std::make_pair (t->name (), t.operator-> ()));
} }
int it = 0; int it = 0;
for (std::map<std::string, const lay::Technology *>::const_iterator t = tech_by_name.begin (); t != tech_by_name.end (); ++t, ++it) { for (std::map<std::string, const db::Technology *>::const_iterator t = tech_by_name.begin (); t != tech_by_name.end (); ++t, ++it) {
m_tech_actions[it].set_checked (t->second->name () == m_current_technology); m_tech_actions[it].set_checked (t->second->name () == m_current_technology);
} }
} }
@ -333,14 +333,14 @@ TechnologyController::update_menu ()
m_current_technology = lay::LayoutView::current ()->active_cellview ()->tech_name (); m_current_technology = lay::LayoutView::current ()->active_cellview ()->tech_name ();
} }
if (! lay::Technologies::instance()->has_technology (m_current_technology)) { if (! db::Technologies::instance()->has_technology (m_current_technology)) {
m_current_technology = std::string (); m_current_technology = std::string ();
} }
std::string title = tech_string_from_name (m_current_technology); std::string title = tech_string_from_name (m_current_technology);
size_t ntech = 0; size_t ntech = 0;
for (lay::Technologies::const_iterator t = lay::Technologies::instance ()->begin (); t != lay::Technologies::instance ()->end (); ++t) { for (db::Technologies::const_iterator t = db::Technologies::instance ()->begin (); t != db::Technologies::instance ()->end (); ++t) {
++ntech; ++ntech;
} }
@ -358,13 +358,13 @@ TechnologyController::update_menu ()
m_tech_actions.clear (); m_tech_actions.clear ();
std::map<std::string, const lay::Technology *> tech_by_name; std::map<std::string, const db::Technology *> tech_by_name;
for (lay::Technologies::const_iterator t = lay::Technologies::instance ()->begin (); t != lay::Technologies::instance ()->end (); ++t) { for (db::Technologies::const_iterator t = db::Technologies::instance ()->begin (); t != db::Technologies::instance ()->end (); ++t) {
tech_by_name.insert (std::make_pair (t->name (), t.operator-> ())); tech_by_name.insert (std::make_pair (t->name (), t.operator-> ()));
} }
int it = 0; int it = 0;
for (std::map<std::string, const lay::Technology *>::const_iterator t = tech_by_name.begin (); t != tech_by_name.end (); ++t, ++it) { for (std::map<std::string, const db::Technology *>::const_iterator t = tech_by_name.begin (); t != tech_by_name.end (); ++t, ++it) {
std::string title = tech_string_from_name (t->first); std::string title = tech_string_from_name (t->first);
@ -382,7 +382,7 @@ TechnologyController::update_menu ()
} }
void void
TechnologyController::replace_technologies (const lay::Technologies &technologies) TechnologyController::replace_technologies (const db::Technologies &technologies)
{ {
bool has_active_tech = (mp_active_technology != 0); bool has_active_tech = (mp_active_technology != 0);
std::string active_tech_name; std::string active_tech_name;
@ -390,19 +390,19 @@ TechnologyController::replace_technologies (const lay::Technologies &technologie
active_tech_name = mp_active_technology->name (); active_tech_name = mp_active_technology->name ();
} }
lay::Technologies ().instance ()->begin_updates (); db::Technologies ().instance ()->begin_updates ();
*lay::Technologies ().instance () = technologies; *db::Technologies ().instance () = technologies;
lay::Technologies ().instance ()->end_updates_no_event (); db::Technologies ().instance ()->end_updates_no_event ();
if (has_active_tech) { if (has_active_tech) {
mp_active_technology = lay::Technologies::instance ()->technology_by_name (active_tech_name); mp_active_technology = db::Technologies::instance ()->technology_by_name (active_tech_name);
} }
} }
void void
TechnologyController::show_editor () TechnologyController::show_editor ()
{ {
lay::Technologies new_tech = *lay::Technologies ().instance (); db::Technologies new_tech = *db::Technologies ().instance ();
if (mp_editor && mp_editor->exec (new_tech)) { if (mp_editor && mp_editor->exec (new_tech)) {
@ -410,12 +410,12 @@ TechnologyController::show_editor ()
// determine the technology files that need to be deleted and delete them // determine the technology files that need to be deleted and delete them
std::set<std::string> files_before; std::set<std::string> files_before;
for (lay::Technologies::const_iterator t = new_tech.begin (); t != new_tech.end (); ++t) { for (db::Technologies::const_iterator t = new_tech.begin (); t != new_tech.end (); ++t) {
if (! t->tech_file_path ().empty () && ! t->is_persisted ()) { if (! t->tech_file_path ().empty () && ! t->is_persisted ()) {
files_before.insert (t->tech_file_path ()); files_before.insert (t->tech_file_path ());
} }
} }
for (lay::Technologies::const_iterator t = lay::Technologies::instance ()->begin (); t != lay::Technologies::instance ()->end (); ++t) { for (db::Technologies::const_iterator t = db::Technologies::instance ()->begin (); t != db::Technologies::instance ()->end (); ++t) {
if (! t->tech_file_path ().empty () && ! t->is_persisted () && files_before.find (t->tech_file_path ()) == files_before.end ()) { if (! t->tech_file_path ().empty () && ! t->is_persisted () && files_before.find (t->tech_file_path ()) == files_before.end ()) {
// TODO: issue an error if files could not be removed // TODO: issue an error if files could not be removed
QFile (tl::to_qstring (t->tech_file_path ())).remove (); QFile (tl::to_qstring (t->tech_file_path ())).remove ();
@ -426,7 +426,7 @@ TechnologyController::show_editor ()
// save the technologies that need to be saved // save the technologies that need to be saved
// TODO: save only the ones that really need saving // TODO: save only the ones that really need saving
for (lay::Technologies::const_iterator t = lay::Technologies::instance ()->begin (); t != lay::Technologies::instance ()->end (); ++t) { for (db::Technologies::const_iterator t = db::Technologies::instance ()->begin (); t != db::Technologies::instance ()->end (); ++t) {
if (! t->tech_file_path ().empty () && ! t->is_persisted ()) { if (! t->tech_file_path ().empty () && ! t->is_persisted ()) {
@ -489,25 +489,25 @@ TechnologyController::default_root ()
void void
TechnologyController::load () TechnologyController::load ()
{ {
rescan (*lay::Technologies::instance ()); rescan (*db::Technologies::instance ());
} }
void void
TechnologyController::sync_with_external_sources () TechnologyController::sync_with_external_sources ()
{ {
rescan (*lay::Technologies::instance ()); rescan (*db::Technologies::instance ());
} }
void void
TechnologyController::rescan (lay::Technologies &technologies) TechnologyController::rescan (db::Technologies &technologies)
{ {
lay::Technologies current = technologies; db::Technologies current = technologies;
// start with all persisted technologies (at least "default") // start with all persisted technologies (at least "default")
technologies.clear (); technologies.clear ();
for (lay::Technologies::const_iterator t = current.begin (); t != current.end (); ++t) { for (db::Technologies::const_iterator t = current.begin (); t != current.end (); ++t) {
if (t->is_persisted ()) { if (t->is_persisted ()) {
technologies.add (new lay::Technology (*t)); technologies.add (new db::Technology (*t));
} }
} }
@ -562,12 +562,12 @@ TechnologyController::rescan (lay::Technologies &technologies)
tl::info << "Auto-importing technology from " << tl::to_string (*lf); tl::info << "Auto-importing technology from " << tl::to_string (*lf);
} }
lay::Technology t; db::Technology t;
t.load (tl::to_string (*lf)); t.load (tl::to_string (*lf));
t.set_persisted (false); // don't save that one in the configuration t.set_persisted (false); // don't save that one in the configuration
t.set_readonly (readonly || ! QFileInfo (dir.filePath (*lf)).isWritable ()); t.set_readonly (readonly || ! QFileInfo (dir.filePath (*lf)).isWritable ());
t.set_grain_name (grain_name); t.set_grain_name (grain_name);
technologies.add (new lay::Technology (t)); technologies.add (new db::Technology (t));
} catch (tl::Exception &ex) { } catch (tl::Exception &ex) {
tl::warn << tl::to_string (QObject::tr ("Unable to auto-import technology file ")) << tl::to_string (*lf) << ": " << ex.msg (); tl::warn << tl::to_string (QObject::tr ("Unable to auto-import technology file ")) << tl::to_string (*lf) << ": " << ex.msg ();
@ -577,9 +577,9 @@ TechnologyController::rescan (lay::Technologies &technologies)
} }
for (std::vector<lay::Technology>::const_iterator t = m_temp_tech.begin (); t != m_temp_tech.end (); ++t) { for (std::vector<db::Technology>::const_iterator t = m_temp_tech.begin (); t != m_temp_tech.end (); ++t) {
lay::Technology *tech = new lay::Technology (*t); db::Technology *tech = new db::Technology (*t);
tech->set_persisted (false); // don't save that one in the configuration tech->set_persisted (false); // don't save that one in the configuration
tech->set_tech_file_path (std::string ()); // don't save to a file either tech->set_tech_file_path (std::string ()); // don't save to a file either
tech->set_readonly (true); // don't edit tech->set_readonly (true); // don't edit
@ -589,7 +589,7 @@ TechnologyController::rescan (lay::Technologies &technologies)
} }
void void
TechnologyController::add_temp_tech (const lay::Technology &t) TechnologyController::add_temp_tech (const db::Technology &t)
{ {
m_temp_tech.push_back (t); m_temp_tech.push_back (t);
} }

View File

@ -67,7 +67,7 @@ public:
* @brief Gets the active technology object or 0 if none is active * @brief Gets the active technology object or 0 if none is active
* The active technology is the one the current cellview uses * The active technology is the one the current cellview uses
*/ */
lay::Technology *active_technology () const; db::Technology *active_technology () const;
/** /**
* @brief Adds a path as a search path for technologies * @brief Adds a path as a search path for technologies
@ -81,12 +81,12 @@ public:
* but are not persisted or editable. * but are not persisted or editable.
* "load" needs to be called after temp technologies have been added. * "load" needs to be called after temp technologies have been added.
*/ */
void add_temp_tech (const lay::Technology &t); void add_temp_tech (const db::Technology &t);
/** /**
* @brief Updates the given technology collection with the technologies from the search path and the temp technologies * @brief Updates the given technology collection with the technologies from the search path and the temp technologies
*/ */
void rescan (lay::Technologies &technologies); void rescan (db::Technologies &technologies);
/** /**
* @brief Loads the global list of technologies * @brief Loads the global list of technologies
@ -133,19 +133,19 @@ private:
lay::TechSetupDialog *mp_editor; lay::TechSetupDialog *mp_editor;
lay::MainWindow *mp_mw; lay::MainWindow *mp_mw;
std::vector<std::string> m_paths; std::vector<std::string> m_paths;
std::vector<lay::Technology> m_temp_tech; std::vector<db::Technology> m_temp_tech;
lay::Technology *mp_active_technology; db::Technology *mp_active_technology;
void update_active_technology (); void update_active_technology ();
void connect_events (); void connect_events ();
void technologies_changed (); void technologies_changed ();
void technology_changed (lay::Technology *); void technology_changed (db::Technology *);
bool configure (const std::string &name, const std::string &value); bool configure (const std::string &name, const std::string &value);
void config_finalize (); void config_finalize ();
bool menu_activated (const std::string &symbol) const; bool menu_activated (const std::string &symbol) const;
void update_current_technology (); void update_current_technology ();
void update_menu (); void update_menu ();
void replace_technologies (const lay::Technologies &technologies); void replace_technologies (const db::Technologies &technologies);
}; };
} }

View File

@ -29,7 +29,7 @@ namespace gsi
static db::LoadLayoutOptions get_options_from_technology (const std::string &technology) static db::LoadLayoutOptions get_options_from_technology (const std::string &technology)
{ {
return lay::Technologies::instance ()->technology_by_name (technology)->load_layout_options (); return db::Technologies::instance ()->technology_by_name (technology)->load_layout_options ();
} }
// Extend "LoadLayoutOptions" by contributions from lay // Extend "LoadLayoutOptions" by contributions from lay

View File

@ -203,10 +203,10 @@ LayoutHandle::remove_ref ()
} }
} }
const lay::Technology * const db::Technology *
LayoutHandle::technology () const LayoutHandle::technology () const
{ {
return lay::Technologies::instance ()->technology_by_name (m_tech_name); return db::Technologies::instance ()->technology_by_name (m_tech_name);
} }
void void
@ -221,7 +221,7 @@ void
LayoutHandle::set_tech_name (const std::string &tn) LayoutHandle::set_tech_name (const std::string &tn)
{ {
if (tn != m_tech_name) { if (tn != m_tech_name) {
if (lay::Technologies::instance ()->has_technology (tn)) { if (db::Technologies::instance ()->has_technology (tn)) {
m_tech_name = tn; m_tech_name = tn;
} else { } else {
m_tech_name = std::string (); m_tech_name = std::string ();

View File

@ -108,7 +108,7 @@ public:
/** /**
* @brief Gets the technology attached to this layout * @brief Gets the technology attached to this layout
*/ */
const lay::Technology *technology () const; const db::Technology *technology () const;
/** /**
* @brief Gets the technology name for this layout * @brief Gets the technology name for this layout

View File

@ -45,8 +45,8 @@ public:
CommonReaderOptionPage (QWidget *parent); CommonReaderOptionPage (QWidget *parent);
~CommonReaderOptionPage (); ~CommonReaderOptionPage ();
void setup (const db::FormatSpecificReaderOptions *options, const lay::Technology *tech); void setup (const db::FormatSpecificReaderOptions *options, const db::Technology *tech);
void commit (db::FormatSpecificReaderOptions *options, const lay::Technology *tech); void commit (db::FormatSpecificReaderOptions *options, const db::Technology *tech);
private: private:
Ui::CommonReaderOptionPage *mp_ui; Ui::CommonReaderOptionPage *mp_ui;

View File

@ -115,8 +115,8 @@ NewLayoutPropertiesDialog::tech_changed ()
{ {
double dbu = 0.001; double dbu = 0.001;
int technology_index = mp_ui->tech_cbx->currentIndex (); int technology_index = mp_ui->tech_cbx->currentIndex ();
if (technology_index >= 0 && technology_index < (int) lay::Technologies::instance ()->technologies ()) { if (technology_index >= 0 && technology_index < (int) db::Technologies::instance ()->technologies ()) {
dbu = lay::Technologies::instance ()->begin () [technology_index].dbu (); dbu = db::Technologies::instance ()->begin () [technology_index].dbu ();
} }
#if QT_VERSION >= 0x40700 #if QT_VERSION >= 0x40700
@ -129,7 +129,7 @@ NewLayoutPropertiesDialog::exec_dialog (std::string &technology, std::string &ce
{ {
mp_ui->tech_cbx->clear (); mp_ui->tech_cbx->clear ();
unsigned int technology_index = 0; unsigned int technology_index = 0;
for (lay::Technologies::const_iterator t = lay::Technologies::instance ()->begin (); t != lay::Technologies::instance ()->end (); ++t, ++technology_index) { for (db::Technologies::const_iterator t = db::Technologies::instance ()->begin (); t != db::Technologies::instance ()->end (); ++t, ++technology_index) {
std::string d = t->name (); std::string d = t->name ();
if (! d.empty () && ! t->description ().empty ()) { if (! d.empty () && ! t->description ().empty ()) {
@ -157,8 +157,8 @@ NewLayoutPropertiesDialog::exec_dialog (std::string &technology, std::string &ce
// get the selected technology name // get the selected technology name
int technology_index = mp_ui->tech_cbx->currentIndex (); int technology_index = mp_ui->tech_cbx->currentIndex ();
if (technology_index >= 0 && technology_index < (int) lay::Technologies::instance ()->technologies ()) { if (technology_index >= 0 && technology_index < (int) db::Technologies::instance ()->technologies ()) {
technology = lay::Technologies::instance ()->begin () [technology_index].name (); technology = db::Technologies::instance ()->begin () [technology_index].name ();
} else { } else {
technology = std::string (); technology = std::string ();
} }

View File

@ -110,9 +110,9 @@ LayoutPropertiesForm::commit ()
// get the selected technology name // get the selected technology name
std::string technology; std::string technology;
int technology_index = tech_cbx->currentIndex (); int technology_index = tech_cbx->currentIndex ();
const lay::Technology *tech = 0; const db::Technology *tech = 0;
if (technology_index >= 0 && technology_index < (int) lay::Technologies::instance ()->technologies ()) { if (technology_index >= 0 && technology_index < (int) db::Technologies::instance ()->technologies ()) {
tech = &(lay::Technologies::instance ()->begin () [technology_index]); tech = &(db::Technologies::instance ()->begin () [technology_index]);
technology = tech->name (); technology = tech->name ();
} }
@ -190,7 +190,7 @@ BEGIN_PROTECTED
tech_cbx->clear (); tech_cbx->clear ();
unsigned int technology_index = 0; unsigned int technology_index = 0;
for (lay::Technologies::const_iterator t = lay::Technologies::instance ()->begin (); t != lay::Technologies::instance ()->end (); ++t, ++technology_index) { for (db::Technologies::const_iterator t = db::Technologies::instance ()->begin (); t != db::Technologies::instance ()->end (); ++t, ++technology_index) {
std::string d = t->name (); std::string d = t->name ();
if (! d.empty () && ! t->description ().empty ()) { if (! d.empty () && ! t->description ().empty ()) {

View File

@ -2442,7 +2442,7 @@ LayoutView::signal_apply_technology (lay::LayoutHandle *layout_handle)
if (cellview (i).handle () == layout_handle) { if (cellview (i).handle () == layout_handle) {
std::string lyp_file; std::string lyp_file;
const lay::Technology *tech = lay::Technologies::instance ()->technology_by_name (cellview (i)->tech_name ()); const db::Technology *tech = db::Technologies::instance ()->technology_by_name (cellview (i)->tech_name ());
if (tech && ! tech->eff_layer_properties_file ().empty ()) { if (tech && ! tech->eff_layer_properties_file ().empty ()) {
lyp_file = tech->eff_layer_properties_file (); lyp_file = tech->eff_layer_properties_file ();
} }
@ -3005,7 +3005,7 @@ LayoutView::add_layout (lay::LayoutHandle *layout_handle, bool add_cellview, boo
// Use the "layer-properties-file" meta info from the handle to get the layer properties file. // Use the "layer-properties-file" meta info from the handle to get the layer properties file.
// If no such file is present, use the default file or the technology specific file. // If no such file is present, use the default file or the technology specific file.
std::string lyp_file = m_def_lyp_file; std::string lyp_file = m_def_lyp_file;
const lay::Technology *tech = lay::Technologies::instance ()->technology_by_name (layout_handle->tech_name ()); const db::Technology *tech = db::Technologies::instance ()->technology_by_name (layout_handle->tech_name ());
if (tech && ! tech->eff_layer_properties_file ().empty ()) { if (tech && ! tech->eff_layer_properties_file ().empty ()) {
lyp_file = tech->eff_layer_properties_file (); lyp_file = tech->eff_layer_properties_file ();
add_other_layers = tech->add_other_layers (); add_other_layers = tech->add_other_layers ();
@ -3072,7 +3072,7 @@ LayoutView::add_layout (lay::LayoutHandle *layout_handle, bool add_cellview, boo
unsigned int unsigned int
LayoutView::create_layout (const std::string &technology, bool add_cellview, bool initialize_layers) LayoutView::create_layout (const std::string &technology, bool add_cellview, bool initialize_layers)
{ {
const lay::Technology *tech = lay::Technologies::instance ()->technology_by_name (technology); const db::Technology *tech = db::Technologies::instance ()->technology_by_name (technology);
db::Layout *layout = new db::Layout (manager ()); db::Layout *layout = new db::Layout (manager ());
if (tech) { if (tech) {
@ -3097,7 +3097,7 @@ LayoutView::load_layout (const std::string &filename, const db::LoadLayoutOption
bool set_max_hier = (m_full_hier_new_cell || has_max_hier ()); bool set_max_hier = (m_full_hier_new_cell || has_max_hier ());
const lay::Technology *tech = lay::Technologies::instance ()->technology_by_name (technology); const db::Technology *tech = db::Technologies::instance ()->technology_by_name (technology);
// create a new layout handle // create a new layout handle
lay::CellView cv; lay::CellView cv;

View File

@ -186,7 +186,7 @@ LoadLayoutOptionsDialog::update ()
return; return;
} }
const lay::Technology *tech = m_tech_array [m_technology_index]; const db::Technology *tech = m_tech_array [m_technology_index];
mp_ui->options_tab->setEnabled (tech && tech->is_persisted ()); mp_ui->options_tab->setEnabled (tech && tech->is_persisted ());
for (std::vector< std::pair<StreamReaderOptionsPage *, std::string> >::iterator page = m_pages.begin (); page != m_pages.end (); ++page) { for (std::vector< std::pair<StreamReaderOptionsPage *, std::string> >::iterator page = m_pages.begin (); page != m_pages.end (); ++page) {
@ -197,7 +197,7 @@ LoadLayoutOptionsDialog::update ()
} }
bool bool
LoadLayoutOptionsDialog::edit_global_options (lay::PluginRoot *config_root, lay::Technologies *technologies) LoadLayoutOptionsDialog::edit_global_options (lay::PluginRoot *config_root, db::Technologies *technologies)
{ {
m_opt_array.clear (); m_opt_array.clear ();
m_tech_array.clear (); m_tech_array.clear ();
@ -219,7 +219,7 @@ LoadLayoutOptionsDialog::edit_global_options (lay::PluginRoot *config_root, lay:
unsigned int i = 0; unsigned int i = 0;
m_technology_index = -1; m_technology_index = -1;
for (lay::Technologies::const_iterator t = technologies->begin (); t != technologies->end (); ++t, ++i) { for (db::Technologies::const_iterator t = technologies->begin (); t != technologies->end (); ++t, ++i) {
std::string d = t->name (); std::string d = t->name ();
if (! d.empty () && ! t->description ().empty ()) { if (! d.empty () && ! t->description ().empty ()) {
@ -256,7 +256,7 @@ LoadLayoutOptionsDialog::edit_global_options (lay::PluginRoot *config_root, lay:
i = 0; i = 0;
technologies->begin_updates (); technologies->begin_updates ();
for (lay::Technologies::iterator t = technologies->begin (); t != technologies->end () && i < m_opt_array.size (); ++t, ++i) { for (db::Technologies::iterator t = technologies->begin (); t != technologies->end () && i < m_opt_array.size (); ++t, ++i) {
technologies->begin ()[i].set_load_layout_options (m_opt_array [i]); technologies->begin ()[i].set_load_layout_options (m_opt_array [i]);
} }
technologies->end_updates (); technologies->end_updates ();

View File

@ -39,6 +39,7 @@ class QAbstractButton;
namespace db namespace db
{ {
class LoadLayoutOptions; class LoadLayoutOptions;
class Technologies;
} }
namespace Ui namespace Ui
@ -53,7 +54,6 @@ namespace lay
class LayoutView; class LayoutView;
class PluginRoot; class PluginRoot;
class FileDialog; class FileDialog;
class Technologies;
class LAYBASIC_PUBLIC LoadLayoutOptionsDialog class LAYBASIC_PUBLIC LoadLayoutOptionsDialog
: public QDialog : public QDialog
@ -64,7 +64,7 @@ public:
LoadLayoutOptionsDialog (QWidget *parent, const std::string &title); LoadLayoutOptionsDialog (QWidget *parent, const std::string &title);
~LoadLayoutOptionsDialog (); ~LoadLayoutOptionsDialog ();
bool edit_global_options (lay::PluginRoot *config_root, lay::Technologies *technologies); bool edit_global_options (lay::PluginRoot *config_root, db::Technologies *technologies);
bool get_options (db::LoadLayoutOptions &options); bool get_options (db::LoadLayoutOptions &options);
void show_always (bool sa) void show_always (bool sa)
@ -89,7 +89,7 @@ private:
bool m_show_always; bool m_show_always;
int m_technology_index; int m_technology_index;
std::vector<db::LoadLayoutOptions> m_opt_array; std::vector<db::LoadLayoutOptions> m_opt_array;
std::vector<const lay::Technology *> m_tech_array; std::vector<const db::Technology *> m_tech_array;
void commit (); void commit ();
void update (); void update ();

View File

@ -230,7 +230,7 @@ SaveLayoutOptionsDialog::update ()
} }
bool bool
SaveLayoutOptionsDialog::edit_global_options (lay::PluginRoot *config_root, lay::Technologies *technologies) SaveLayoutOptionsDialog::edit_global_options (lay::PluginRoot *config_root, db::Technologies *technologies)
{ {
m_opt_array.clear (); m_opt_array.clear ();
m_tech_array.clear (); m_tech_array.clear ();
@ -244,7 +244,7 @@ SaveLayoutOptionsDialog::edit_global_options (lay::PluginRoot *config_root, lay:
unsigned int i = 0; unsigned int i = 0;
m_technology_index = -1; m_technology_index = -1;
for (lay::Technologies::const_iterator t = technologies->begin (); t != technologies->end (); ++t, ++i) { for (db::Technologies::const_iterator t = technologies->begin (); t != technologies->end (); ++t, ++i) {
std::string d = t->name (); std::string d = t->name ();
if (! d.empty () && ! t->description ().empty ()) { if (! d.empty () && ! t->description ().empty ()) {
@ -270,7 +270,7 @@ SaveLayoutOptionsDialog::edit_global_options (lay::PluginRoot *config_root, lay:
// get the selected technology name and store in the config // get the selected technology name and store in the config
unsigned int i = 0; unsigned int i = 0;
for (lay::Technologies::iterator t = technologies->begin (); t != technologies->end () && i < m_opt_array.size (); ++t, ++i) { for (db::Technologies::iterator t = technologies->begin (); t != technologies->end () && i < m_opt_array.size (); ++t, ++i) {
technologies->begin ()[i].set_save_layout_options (m_opt_array [i]); technologies->begin ()[i].set_save_layout_options (m_opt_array [i]);
} }

View File

@ -39,6 +39,7 @@ class QWidget;
namespace db namespace db
{ {
class SaveLayoutOptions; class SaveLayoutOptions;
class Technologies;
} }
namespace lay namespace lay
@ -46,7 +47,6 @@ namespace lay
class LayoutView; class LayoutView;
class PluginRoot; class PluginRoot;
class Technologies;
class LAYBASIC_PUBLIC SaveLayoutAsOptionsDialog class LAYBASIC_PUBLIC SaveLayoutAsOptionsDialog
: public QDialog, private Ui::SaveLayoutAsOptionsDialog : public QDialog, private Ui::SaveLayoutAsOptionsDialog
@ -68,7 +68,7 @@ private:
std::vector<int> m_tab_positions; std::vector<int> m_tab_positions;
std::string m_filename; std::string m_filename;
db::SaveLayoutOptions m_options; db::SaveLayoutOptions m_options;
const lay::Technology *mp_tech; const db::Technology *mp_tech;
}; };
class LAYBASIC_PUBLIC SaveLayoutOptionsDialog class LAYBASIC_PUBLIC SaveLayoutOptionsDialog
@ -80,7 +80,7 @@ public:
SaveLayoutOptionsDialog (QWidget *parent, const std::string &title); SaveLayoutOptionsDialog (QWidget *parent, const std::string &title);
~SaveLayoutOptionsDialog (); ~SaveLayoutOptionsDialog ();
bool edit_global_options (lay::PluginRoot *config_root, lay::Technologies *technologies); bool edit_global_options (lay::PluginRoot *config_root, db::Technologies *technologies);
bool get_options (db::SaveLayoutOptions &options); bool get_options (db::SaveLayoutOptions &options);
public slots: public slots:
@ -93,7 +93,7 @@ private:
std::vector< std::pair<StreamWriterOptionsPage *, std::string> > m_pages; std::vector< std::pair<StreamWriterOptionsPage *, std::string> > m_pages;
int m_technology_index; int m_technology_index;
std::vector<db::SaveLayoutOptions> m_opt_array; std::vector<db::SaveLayoutOptions> m_opt_array;
std::vector<const lay::Technology *> m_tech_array; std::vector<const db::Technology *> m_tech_array;
void commit (); void commit ();
void update (); void update ();

View File

@ -82,42 +82,5 @@ const StreamWriterPluginDeclaration *StreamWriterPluginDeclaration::plugin_for_f
return 0; return 0;
} }
// ------------------------------------------------------------------
// Implementation of load_options_xml_element_list
tl::XMLElementList load_options_xml_element_list ()
{
tl::XMLElementList elements;
for (tl::Registrar<lay::PluginDeclaration>::iterator cls = tl::Registrar<lay::PluginDeclaration>::begin (); cls != tl::Registrar<lay::PluginDeclaration>::end (); ++cls) {
const StreamReaderPluginDeclaration *decl = dynamic_cast <const StreamReaderPluginDeclaration *> (&*cls);
if (decl) {
elements.append (decl->xml_element ());
}
}
// ignore all unknown elements
elements.append (tl::make_member<db::LoadLayoutOptions> ("*"));
return elements;
}
tl::XMLElementList save_options_xml_element_list ()
{
tl::XMLElementList elements;
for (tl::Registrar<lay::PluginDeclaration>::iterator cls = tl::Registrar<lay::PluginDeclaration>::begin (); cls != tl::Registrar<lay::PluginDeclaration>::end (); ++cls) {
const StreamWriterPluginDeclaration *decl = dynamic_cast <const StreamWriterPluginDeclaration *> (&*cls);
if (decl) {
elements.append (decl->xml_element ());
}
}
// ignore all unknown elements
elements.append (tl::make_member<db::FormatSpecificWriterOptions> ("*"));
return elements;
}
} }

View File

@ -38,6 +38,7 @@ namespace db
class FormatSpecificReaderOptions; class FormatSpecificReaderOptions;
class LoadLayoutOptions; class LoadLayoutOptions;
class SaveLayoutOptions; class SaveLayoutOptions;
class Technology;
} }
namespace lay namespace lay
@ -45,7 +46,6 @@ namespace lay
class PluginRoot; class PluginRoot;
class LayoutHandle; class LayoutHandle;
class Technology;
/** /**
* @brief The base class for writer configuration pages * @brief The base class for writer configuration pages
@ -70,7 +70,7 @@ public:
* Plugin object provided and load the widgets accordingly. * Plugin object provided and load the widgets accordingly.
* The options object can be cast to the specific format object. * The options object can be cast to the specific format object.
*/ */
virtual void setup (const db::FormatSpecificWriterOptions * /*options*/, const lay::Technology * /*tech*/) virtual void setup (const db::FormatSpecificWriterOptions * /*options*/, const db::Technology * /*tech*/)
{ {
// the default implementation does nothing. // the default implementation does nothing.
} }
@ -83,7 +83,7 @@ public:
* and commit the changes through * and commit the changes through
* The options object can be cast to the specific format object. * The options object can be cast to the specific format object.
*/ */
virtual void commit (db::FormatSpecificWriterOptions * /*options*/, const lay::Technology * /*tech*/, bool /*gzip*/) virtual void commit (db::FormatSpecificWriterOptions * /*options*/, const db::Technology * /*tech*/, bool /*gzip*/)
{ {
// the default implementation does nothing. // the default implementation does nothing.
} }
@ -112,7 +112,7 @@ public:
* Plugin object provided and load the widgets accordingly. * Plugin object provided and load the widgets accordingly.
* The options object can be cast to the specific format object. * The options object can be cast to the specific format object.
*/ */
virtual void setup (const db::FormatSpecificReaderOptions * /*options*/, const lay::Technology * /*tech*/) virtual void setup (const db::FormatSpecificReaderOptions * /*options*/, const db::Technology * /*tech*/)
{ {
// the default implementation does nothing. // the default implementation does nothing.
} }
@ -125,7 +125,7 @@ public:
* and commit the changes through * and commit the changes through
* The options object can be cast to the specific format object. * The options object can be cast to the specific format object.
*/ */
virtual void commit (db::FormatSpecificReaderOptions * /*options*/, const lay::Technology * /*tech*/) virtual void commit (db::FormatSpecificReaderOptions * /*options*/, const db::Technology * /*tech*/)
{ {
// the default implementation does nothing. // the default implementation does nothing.
} }
@ -209,32 +209,8 @@ public:
{ {
return 0; return 0;
} }
/**
* @brief Delivers the XMLElement object that represents this component within a technology XML tree
*
* This method is supposed to return an instance ReaderOptionsXMLElement<RO> where RO is the
* specific reader options type. The return value can be 0 to indicate there is no specific reader
* option.
*
* The returned XMLElement is destroyed by the caller and needs to be a new object.
*/
virtual tl::XMLElementBase *xml_element () const
{
return 0;
}
}; };
/**
* @brief Returns the XMLElement list that can represent a db::LoadLayoutOptions object
*/
LAYBASIC_PUBLIC tl::XMLElementList load_options_xml_element_list ();
/**
* @brief Returns the XMLElement list that can represent a db::SaveLayoutOptions object
*/
LAYBASIC_PUBLIC tl::XMLElementList save_options_xml_element_list ();
/** /**
* @brief A specialisation of Plugin declaration for stream reader plugins * @brief A specialisation of Plugin declaration for stream reader plugins
*/ */
@ -283,171 +259,6 @@ public:
{ {
// the default implementation does nothing. // the default implementation does nothing.
} }
/**
* @brief Delivers the XMLElement object that represents this component within a technology XML tree
*
* This method is supposed to return an instance WriterOptionsXMLElement<WO> where WO is the
* specific writer options type. The return value can be 0 to indicate there is no specific writer
* option.
*
* The returned XMLElement is destroyed by the caller and needs to be a new object.
*/
virtual tl::XMLElementBase *xml_element () const
{
return 0;
}
};
/**
* @brief A helper class for the XML serialization of the stream options (custom read adaptor)
*
* OPT is a reader or writer options class and HOST is the host class. For example, OPT
* can be db::GDS2ReaderOptions and HOST then is db::LoadLayoutOptions.
*/
template <class OPT, class HOST>
class StreamOptionsReadAdaptor
{
public:
typedef tl::pass_by_ref_tag tag;
StreamOptionsReadAdaptor ()
: mp_options (0), m_done (false)
{
// .. nothing yet ..
}
const OPT &operator () () const
{
return mp_options->template get_options<OPT> ();
}
bool at_end () const
{
return m_done;
}
void start (const HOST &options)
{
mp_options = &options;
m_done = false;
}
void next ()
{
mp_options = 0;
m_done = true;
}
private:
const HOST *mp_options;
bool m_done;
};
/**
* @brief A helper class for the XML serialization of the stream option (custom write adaptor)
*
* See StreamOptionsReadAdaptor for details.
*/
template <class OPT, class HOST>
class StreamOptionsWriteAdaptor
{
public:
StreamOptionsWriteAdaptor ()
{
// .. nothing yet ..
}
void operator () (HOST &options, tl::XMLReaderState &reader) const
{
std::auto_ptr<OPT> opt (new OPT ());
tl::XMLObjTag<OPT> tag;
*opt = *reader.back (tag);
options.set_options (opt.release ());
}
};
/**
* @brief A XMLElement specialization for stream options
*/
template <class OPT, class HOST>
class StreamOptionsXMLElement
: public tl::XMLElement<OPT, HOST, StreamOptionsReadAdaptor<OPT, HOST>, StreamOptionsWriteAdaptor<OPT, HOST> >
{
public:
StreamOptionsXMLElement (const std::string &element_name, const tl::XMLElementList &children)
: tl::XMLElement<OPT, HOST, StreamOptionsReadAdaptor<OPT, HOST>, StreamOptionsWriteAdaptor<OPT, HOST> > (StreamOptionsReadAdaptor<OPT, HOST> (), StreamOptionsWriteAdaptor<OPT, HOST> (), element_name, children)
{
// .. nothing yet ..
}
StreamOptionsXMLElement (const StreamOptionsXMLElement &d)
: tl::XMLElement<OPT, HOST, StreamOptionsReadAdaptor<OPT, HOST>, StreamOptionsWriteAdaptor<OPT, HOST> > (d)
{
// .. nothing yet ..
}
};
/**
* @brief A custom XMLElement for the serialization of reader options
*
* StreamReaderPluginDeclaration::xml_element can return such an element to
* insert a custom XML element into the XML tree which represents the
* reader options.
*/
template <class OPT>
class ReaderOptionsXMLElement
: public StreamOptionsXMLElement<OPT, db::LoadLayoutOptions>
{
public:
ReaderOptionsXMLElement (const std::string &element_name, const tl::XMLElementList &children)
: StreamOptionsXMLElement<OPT, db::LoadLayoutOptions> (element_name, children)
{
// .. nothing yet ..
}
ReaderOptionsXMLElement (const ReaderOptionsXMLElement &d)
: StreamOptionsXMLElement<OPT, db::LoadLayoutOptions> (d)
{
// .. nothing yet ..
}
virtual tl::XMLElementBase *clone () const
{
return new ReaderOptionsXMLElement (*this);
}
};
/**
* @brief A custom XMLElement for the serialization of writer options
*
* StreamWriterPluginDeclaration::xml_element can return such an element to
* insert a custom XML element into the XML tree which represents the
* writer options.
*/
template <class OPT>
class WriterOptionsXMLElement
: public StreamOptionsXMLElement<OPT, db::SaveLayoutOptions>
{
public:
WriterOptionsXMLElement (const std::string &element_name, const tl::XMLElementList &children)
: StreamOptionsXMLElement<OPT, db::SaveLayoutOptions> (element_name, children)
{
// .. nothing yet ..
}
WriterOptionsXMLElement (const WriterOptionsXMLElement &d)
: StreamOptionsXMLElement<OPT, db::SaveLayoutOptions> (d)
{
// .. nothing yet ..
}
virtual tl::XMLElementBase *clone () const
{
return new WriterOptionsXMLElement (*this);
}
}; };
} }

View File

@ -33,440 +33,7 @@
namespace lay namespace lay
{ {
// ----------------------------------------------------------------------------- // .. nothing yet ..
Technologies::Technologies ()
{
m_technologies.push_back (new Technology (std::string (""), "(Default)"));
m_changed = false;
m_in_update = false;
}
Technologies::Technologies (const Technologies &other)
: tl::Object ()
{
m_changed = false;
m_in_update = false;
operator= (other);
}
Technologies::~Technologies ()
{
// .. nothing yet ..
}
Technologies &
Technologies::operator= (const Technologies &other)
{
if (&other != this) {
m_technologies = other.m_technologies;
for (iterator i = begin (); i != end (); ++i) {
i->technology_changed_with_sender_event.add (this, &Technologies::technology_changed);
}
technologies_changed ();
}
return *this;
}
static std::auto_ptr<lay::Technologies> sp_technologies;
lay::Technologies *
Technologies::instance ()
{
if (! sp_technologies.get ()) {
sp_technologies.reset (new lay::Technologies ());
}
return sp_technologies.get ();
}
static tl::XMLElementList xml_elements ()
{
return make_element ((Technologies::const_iterator (Technologies::*) () const) &Technologies::begin, (Technologies::const_iterator (Technologies::*) () const) &Technologies::end, &Technologies::add, "technology",
Technology::xml_elements ()
);
}
std::string
Technologies::to_xml () const
{
// create a copy to filter out the ones which are not persisted
lay::Technologies copy;
for (const_iterator t = begin (); t != end (); ++t) {
if (t->is_persisted ()) {
copy.add (new Technology (*t));
}
}
tl::OutputStringStream os;
tl::XMLStruct<lay::Technologies> xml_struct ("technologies", xml_elements ());
tl::OutputStream oss (os);
xml_struct.write (oss, copy);
return os.string ();
}
void
Technologies::load_from_xml (const std::string &s)
{
// create a copy to filter out the ones which are not persisted and remain
lay::Technologies copy;
for (const_iterator t = begin (); t != end (); ++t) {
if (! t->is_persisted ()) {
copy.add (new Technology (*t));
}
}
tl::XMLStringSource source (s);
tl::XMLStruct<lay::Technologies> xml_struct ("technologies", xml_elements ());
xml_struct.parse (source, copy);
*this = copy;
}
void
Technologies::add_tech (Technology *tech, bool replace_same)
{
if (! tech) {
return;
}
std::auto_ptr<Technology> tech_ptr (tech);
Technology *t = 0;
for (tl::stable_vector<Technology>::iterator i = m_technologies.begin (); !t && i != m_technologies.end (); ++i) {
if (i->name () == tech->name ()) {
t = i.operator-> ();
}
}
if (t) {
if (replace_same) {
*t = *tech;
} else {
throw tl::Exception (tl::to_string (QObject::tr ("A technology with this name already exists: %1").arg (tl::to_qstring (tech->name ()))));
}
} else {
m_technologies.push_back (tech_ptr.release ());
tech->technology_changed_with_sender_event.add (this, &Technologies::technology_changed);
}
technologies_changed ();
}
void
Technologies::remove (const std::string &name)
{
for (tl::stable_vector<Technology>::iterator t = m_technologies.begin (); t != m_technologies.end (); ++t) {
if (t->name () == name) {
m_technologies.erase (t);
technologies_changed ();
break;
}
}
}
void
Technologies::clear ()
{
if (! m_technologies.empty ()) {
m_technologies.clear ();
technologies_changed ();
}
}
void
Technologies::technology_changed (Technology *t)
{
if (m_in_update) {
m_changed = true;
} else {
technology_changed_event (t);
}
}
void
Technologies::technologies_changed ()
{
if (m_in_update) {
m_changed = true;
} else {
technologies_changed_event ();
}
}
void
Technologies::begin_updates ()
{
tl_assert (! m_in_update);
m_in_update = true;
m_changed = false;
}
void
Technologies::end_updates ()
{
if (m_in_update) {
m_in_update = false;
if (m_changed) {
m_changed = false;
technologies_changed ();
}
}
}
void
Technologies::notify_technologies_changed ()
{
technologies_changed ();
}
void
Technologies::end_updates_no_event ()
{
m_in_update = false;
m_changed = false;
}
bool
Technologies::has_technology (const std::string &name) const
{
for (tl::stable_vector<Technology>::const_iterator t = m_technologies.begin (); t != m_technologies.end (); ++t) {
if (t->name () == name) {
return true;
}
}
return false;
}
Technology *
Technologies::technology_by_name (const std::string &name)
{
for (tl::stable_vector<Technology>::iterator t = m_technologies.begin (); t != m_technologies.end (); ++t) {
if (t->name () == name) {
return &*t;
}
}
tl_assert (! m_technologies.empty ());
return &*m_technologies.begin ();
}
// -----------------------------------------------------------------------------
// Technology implementation
Technology::Technology ()
: m_name (), m_description (), m_dbu (0.001), m_persisted (true), m_readonly (false)
{
init ();
}
Technology::Technology (const std::string &name, const std::string &description)
: m_name (name), m_description (description), m_dbu (0.001), m_persisted (true), m_readonly (false)
{
init ();
}
void
Technology::init ()
{
m_add_other_layers = true;
for (tl::Registrar<lay::PluginDeclaration>::iterator cls = tl::Registrar<lay::PluginDeclaration>::begin (); cls != tl::Registrar<lay::PluginDeclaration>::end (); ++cls) {
if (cls->technology_component_provider () != 0) {
m_components.push_back (cls->technology_component_provider ()->create_component ());
}
}
}
Technology::~Technology ()
{
for (std::vector <TechnologyComponent *>::const_iterator c = m_components.begin (); c != m_components.end (); ++c) {
delete *c;
}
m_components.clear ();
}
Technology::Technology (const Technology &d)
: tl::Object (),
m_name (d.m_name), m_description (d.m_description), m_grain_name (d.m_grain_name), m_dbu (d.m_dbu),
m_explicit_base_path (d.m_explicit_base_path), m_default_base_path (d.m_default_base_path),
m_load_layout_options (d.m_load_layout_options),
m_save_layout_options (d.m_save_layout_options),
m_lyp_path (d.m_lyp_path), m_add_other_layers (d.m_add_other_layers), m_persisted (d.m_persisted),
m_readonly (d.m_readonly), m_lyt_file (d.m_lyt_file)
{
for (std::vector <TechnologyComponent *>::const_iterator c = d.m_components.begin (); c != d.m_components.end (); ++c) {
m_components.push_back ((*c)->clone ());
}
}
Technology &Technology::operator= (const Technology &d)
{
if (this != &d) {
m_name = d.m_name;
m_description = d.m_description;
m_grain_name = d.m_grain_name;
m_dbu = d.m_dbu;
m_default_base_path = d.m_default_base_path;
m_explicit_base_path = d.m_explicit_base_path;
m_load_layout_options = d.m_load_layout_options;
m_save_layout_options = d.m_save_layout_options;
m_lyp_path = d.m_lyp_path;
m_add_other_layers = d.m_add_other_layers;
m_persisted = d.m_persisted;
m_readonly = d.m_readonly;
m_lyt_file = d.m_lyt_file;
for (std::vector <TechnologyComponent *>::const_iterator c = m_components.begin (); c != m_components.end (); ++c) {
delete *c;
}
m_components.clear ();
for (std::vector <TechnologyComponent *>::const_iterator c = d.m_components.begin (); c != d.m_components.end (); ++c) {
m_components.push_back ((*c)->clone ());
}
technology_changed ();
}
return *this;
}
tl::XMLElementList
Technology::xml_elements ()
{
tl::XMLElementList elements =
tl::make_member (&Technology::name, &Technology::set_name, "name") +
tl::make_member (&Technology::description, &Technology::set_description, "description") +
tl::make_member (&Technology::dbu, &Technology::set_dbu, "dbu") +
tl::make_member (&Technology::explicit_base_path, &Technology::set_explicit_base_path, "base-path") +
tl::make_member (&Technology::default_base_path, &Technology::set_default_base_path, "original-base-path") +
tl::make_member (&Technology::layer_properties_file, &Technology::set_layer_properties_file, "layer-properties_file") +
tl::make_member (&Technology::add_other_layers, &Technology::set_add_other_layers, "add-other-layers") +
tl::make_element (&Technology::load_layout_options, &Technology::set_load_layout_options, "reader-options",
lay::load_options_xml_element_list ()
) +
tl::make_element (&Technology::save_layout_options, &Technology::set_save_layout_options, "writer-options",
lay::save_options_xml_element_list ()
);
for (tl::Registrar<lay::PluginDeclaration>::iterator cls = tl::Registrar<lay::PluginDeclaration>::begin (); cls != tl::Registrar<lay::PluginDeclaration>::end (); ++cls) {
if (cls->technology_component_provider () != 0) {
elements.append (cls->technology_component_provider ()->xml_element ());
}
}
// ignore all unknown elements
elements.append (tl::make_member<Technology> ("*"));
return elements;
}
const TechnologyComponent *
Technology::component_by_name (const std::string &component_name) const
{
for (std::vector <TechnologyComponent *>::const_iterator c = m_components.begin (); c != m_components.end (); ++c) {
if ((*c)->name () == component_name) {
return *c;
}
}
return 0;
}
TechnologyComponent *
Technology::component_by_name (const std::string &component_name)
{
for (std::vector <TechnologyComponent *>::const_iterator c = m_components.begin (); c != m_components.end (); ++c) {
if ((*c)->name () == component_name) {
return *c;
}
}
return 0;
}
std::vector <std::string>
Technology::component_names () const
{
std::vector <std::string> names;
for (std::vector <TechnologyComponent *>::const_iterator c = m_components.begin (); c != m_components.end (); ++c) {
names.push_back ((*c)->name ());
}
return names;
}
void
Technology::set_component (TechnologyComponent *component)
{
for (std::vector <TechnologyComponent *>::iterator c = m_components.begin (); c != m_components.end (); ++c) {
if ((*c)->name () == component->name ()) {
if (*c != component) {
delete *c;
*c = component;
technology_changed_event ();
technology_changed_with_sender_event (this);
}
break;
}
}
}
std::string
Technology::correct_path (const std::string &fp) const
{
if (base_path ().empty ()) {
return fp;
}
QString rfp = QDir (tl::to_qstring (base_path ())).relativeFilePath (tl::to_qstring (fp));
if (rfp.startsWith (QString::fromUtf8 (".."))) {
// upwards or beside - don't correct:
return fp;
} else {
return tl::to_string (rfp);
}
}
void
Technology::load (const std::string &fn)
{
tl::XMLFileSource source (fn);
tl::XMLStruct<lay::Technology> xml_struct ("technology", xml_elements ());
xml_struct.parse (source, *this);
// use the tech file's path as the default base path
std::string lyt_file = tl::to_string (QFileInfo (tl::to_qstring (fn)).absoluteDir ().path ());
set_default_base_path (lyt_file);
set_tech_file_path (fn);
}
void
Technology::save (const std::string &fn) const
{
tl::XMLStruct<lay::Technology> xml_struct ("technology", xml_elements ());
tl::OutputStream os (fn, tl::OutputStream::OM_Plain);
xml_struct.write (os, *this);
}
std::string
Technology::build_effective_path (const std::string &p) const
{
if (p.empty () || base_path ().empty ()) {
return p;
}
QFileInfo f (tl::to_qstring (p));
if (f.isAbsolute ()) {
return p;
} else {
return tl::to_string (QDir (tl::to_qstring (base_path ())).filePath (tl::to_qstring (p)));
}
}
} }

View File

@ -26,689 +26,13 @@
#include "laybasicCommon.h" #include "laybasicCommon.h"
#include "tlStableVector.h" #include "dbTechnology.h"
#include "tlString.h"
#include "tlEvents.h"
#include "tlXMLParser.h"
#include "tlTypeTraits.h"
#include "dbStreamLayers.h"
#include "dbLoadLayoutOptions.h"
#include "dbSaveLayoutOptions.h"
#include <QFrame> #include <QFrame>
namespace lay namespace lay
{ {
class Technology;
class TechnologyComponent;
class TechnologyComponentEditor;
/**
* @brief A container for the technology settings
*
* The container associates a technology with a name and provides an
* iterator for the technologies.
* The container features at least one technology (the default) which is
* present in any case. If a technology with an unknown name is requested,
* this default technology is returned.
*/
class LAYBASIC_PUBLIC Technologies
: public tl::Object
{
public:
typedef tl::stable_vector<Technology>::const_iterator const_iterator;
typedef tl::stable_vector<Technology>::iterator iterator;
/**
* @brief The constructor
*/
Technologies ();
/**
* @brief The destructor
*/
~Technologies ();
/**
* @brief Copy ctor
*/
Technologies (const Technologies &other);
/**
* @brief Assignment operator
*/
Technologies &operator= (const Technologies &other);
/**
* @brief Const iterator - begin
*/
const_iterator begin () const
{
return m_technologies.begin ();
}
/**
* @brief Const iterator - end
*/
const_iterator end () const
{
return m_technologies.end ();
}
/**
* @brief iterator - begin
*/
iterator begin ()
{
return m_technologies.begin ();
}
/**
* @brief Const iterator - end
*/
iterator end ()
{
return m_technologies.end ();
}
/**
* @brief The number of technologies
*/
size_t technologies () const
{
return m_technologies.size ();
}
/**
* @brief Adds a technology to the setup
*
* The container becomes owner of the technology object.
* Replaces a technology with the name of the given technology.
*/
void add (Technology *technology)
{
add_tech (technology, true /*replace*/);
}
/**
* @brief Adds a technology with a new name
*
* Like \add, but throws an exception if a technology with this name
* already exists. Takes over ownership over the technology object.
* The technology object is discarded if an exception is thrown.
*/
void add_new (Technology *technology)
{
add_tech (technology, false /*throws exception on same name*/);
}
/**
* @brief Remove a technology with the given name from the setup
*/
void remove (const std::string &name);
/**
* @brief Clears the list of technologies
*/
void clear ();
/**
* @brief Begins a bulk operation
* This method will disable "technologies_changed" events until (later) end_updates () is called.
*/
void begin_updates ();
/**
* @brief Ends a bulk operation
*/
void end_updates ();
/**
* @brief Ends a bulk operation
* This version does not send an technologies_changed event but just cancels the bulk
* operation. begin_updates/end_updates_no_event is essentially equivalent to blocking
* signals.
*/
void end_updates_no_event ();
/**
* @brief Notifies the system of changes in technologies
* For performance reasons, changes inside a technology are not propagated to
* the system directly. Only bulk changes (such as adding or removing technologies
* are). To inform the system of individual technology updates, call this method
* after a technology or multiple technologies have been changed.
*/
void notify_technologies_changed ();
/**
* @brief Checks, if a technology with the given name exists
*/
bool has_technology (const std::string &name) const;
/**
* @brief Returns the technology with the given name
*
* If no technology with that name exists, the default technology is returned.
*/
Technology *technology_by_name (const std::string &name);
/**
* @brief Returns the technology with the given name (const version)
*
* If no technology with that name exists, the default technology is returned.
*/
const Technology *technology_by_name (const std::string &name) const
{
return const_cast<Technologies *> (this)->technology_by_name (name);
}
/**
* @brief Converts the list into an XML string
*/
std::string to_xml () const;
/**
* @brief Reads the list from an XML string
*/
void load_from_xml (const std::string &s);
/**
* @brief Returns the singleton instance
*/
static lay::Technologies *instance ();
/**
* @brief An event indicating that the list of technologies has changed
* If a technology is added or removed, this event is triggered.
*/
tl::Event technologies_changed_event;
/**
* @brief An event indicating that one technology in the list has changed
* If a technology is modified, this event is triggered with that technology as argument of the event.
*/
tl::event<Technology *> technology_changed_event;
protected:
/**
* @brief Forward the event from the individual technologies
*/
void technology_changed (Technology *t);
/**
* @brief Sends the technologies_changed event
*/
void technologies_changed ();
private:
tl::stable_vector<Technology> m_technologies;
bool m_changed;
bool m_in_update;
void add_tech (Technology *technology, bool replace_same);
};
/**
* @brief A technology
*
* This class represents one technology.
* A technology has a name and a description.
*/
class LAYBASIC_PUBLIC Technology
: public tl::Object
{
public:
/**
* @brief The default constructor
*/
Technology ();
/**
* @brief The constructor
*/
Technology (const std::string &name, const std::string &description);
/**
* @brief The copy constructor
*/
Technology (const Technology &tech);
/**
* @brief The destructor
*/
~Technology ();
/**
* @brief Assignment
*/
Technology &operator= (const Technology &tech);
/**
* @brief Gets the name
*/
const std::string &name () const
{
return m_name;
}
/**
* @brief Sets the name
*/
void set_name (const std::string &n)
{
if (n != m_name) {
m_name = n;
technology_changed ();
}
}
/**
* @brief Sets the package source
*
* This attribute indicates that this technology was contributed by a package
*/
void set_grain_name (const std::string &g)
{
m_grain_name = g;
}
/**
* @brief Gets the package source
*/
const std::string &grain_name () const
{
return m_grain_name;
}
/**
* @brief Gets the base path
*
* The base path is an effective path - if the explicit path is set, it is
* used. If not, the default path is used. The default path is the one from which
* a technology file was imported. The explicit one is the one that is specified
* explicitly.
*/
const std::string &base_path () const
{
return m_explicit_base_path.empty () ? m_default_base_path : m_explicit_base_path;
}
/**
* @brief Makes a file path relative to the base path if one is specified.
*
* Only files below the base path will be made relative. Files above or beside
* won't be made relative.
*/
std::string correct_path (const std::string &fp) const;
/**
* @brief Gets the default base path
*/
const std::string &default_base_path () const
{
return m_default_base_path;
}
/**
* @brief Sets the default base path
*/
void set_default_base_path (const std::string &p)
{
if (m_default_base_path != p) {
m_default_base_path = p;
technology_changed ();
}
}
/**
* @brief Gets the explicit base path
*/
const std::string &explicit_base_path () const
{
return m_explicit_base_path;
}
/**
* @brief Sets the explicit base path
*/
void set_explicit_base_path (const std::string &p)
{
if (m_explicit_base_path != p) {
m_explicit_base_path = p;
technology_changed ();
}
}
/**
* @brief Gets the path of the tech file if the technology was loaded from a tech file
*/
const std::string &tech_file_path () const
{
return m_lyt_file;
}
/**
* @brief Sets the path of the tech file
* This method is intended for internal use only.
*/
void set_tech_file_path (const std::string &lyt_file)
{
m_lyt_file = lyt_file;
}
/**
* @brief Gets the description
*/
const std::string &description () const
{
return m_description;
}
/**
* @brief Sets the description
*/
void set_description (const std::string &d)
{
if (m_description != d) {
m_description = d;
technology_changed ();
}
}
/**
* @brief Gets the default database unit
*/
double dbu () const
{
return m_dbu;
}
/**
* @brief Sets the default database unit
*/
void set_dbu (double d)
{
if (fabs (m_dbu - d) > 1e-10) {
m_dbu = d;
technology_changed ();
}
}
/**
* @brief Gets the layer properties file path (empty if none is specified)
*/
const std::string &layer_properties_file () const
{
return m_lyp_path;
}
/**
* @brief Gets the effective layer properties file path (empty if none is specified)
*
* The effective path is the one extended by the base path if relative.
*/
std::string eff_layer_properties_file () const
{
return build_effective_path (m_lyp_path);
}
/**
* @brief Sets the layer properties file path (set to empty string to remove layer properties file)
*/
void set_layer_properties_file (const std::string &lyp)
{
if (m_lyp_path != lyp) {
m_lyp_path = lyp;
technology_changed ();
}
}
/**
* @brief Gets the flag indicating whether to add other layers to the layer properties
*/
bool add_other_layers () const
{
return m_add_other_layers;
}
/**
* @brief Sets the flag indicating whether to add other layers to the layer properties
*
* If "add_other_layers" is true, the layers in the layout but not specified in the
* layer properties file will be added automatically.
*/
void set_add_other_layers (bool add_other_layers)
{
if (m_add_other_layers != add_other_layers) {
m_add_other_layers = add_other_layers;
technology_changed ();
}
}
/**
* @brief gets the layout reader options
*/
const db::LoadLayoutOptions &load_layout_options () const
{
return m_load_layout_options;
}
/**
* @brief Sets the layout reader options
*/
void set_load_layout_options (const db::LoadLayoutOptions &options)
{
m_load_layout_options = options;
technology_changed ();
}
/**
* @brief gets the layout writer options
*/
const db::SaveLayoutOptions &save_layout_options () const
{
return m_save_layout_options;
}
/**
* @brief Sets the layout writer options
*/
void set_save_layout_options (const db::SaveLayoutOptions &options)
{
m_save_layout_options = options;
technology_changed ();
}
/**
* @brief Load from file (import)
*/
void load (const std::string &fn);
/**
* @brief Save to file (export)
*/
void save (const std::string &fn) const;
/**
* @brief Delivers the XMLElementList that specifies the technology's XML representation
*/
static tl::XMLElementList xml_elements ();
/**
* @brief Sets the technology component by the component name
*
* This replaces the technology component with the given name.
* The Technology object will become owner of the component.
*/
void set_component (TechnologyComponent *component);
/**
* @brief Gets the technology component by the component name
*
* If no component with that name exists, 0 is returned.
*/
const TechnologyComponent *component_by_name (const std::string &component_name) const;
/**
* @brief Gets the technology component by the component name (non-const version)
*
* If no component with that name exists, 0 is returned.
*/
TechnologyComponent *component_by_name (const std::string &component_name);
/**
* @brief Gets the component names
*/
std::vector <std::string> component_names () const;
/**
* @brief Builds the effective path from a relative or absolute one using the base path if necessary
*/
std::string build_effective_path (const std::string &p) const;
/**
* @brief Returns a flag indicating whether the technology is persisted or not
*
* If the flag is false, this technology is not included into the XML string
* of the technologies.
*/
bool is_persisted () const
{
return m_persisted;
}
/**
* @brief Sets a flag indicating whether the technology is persisted
*/
void set_persisted (bool f)
{
m_persisted = f;
}
/**
* @brief Returns a flag indicating whether the technology is readonly
*
* If the flag is false, the technology can be edited. Otherwise it's locked for editing.
*/
bool is_readonly () const
{
return m_readonly;
}
/**
* @brief Sets a flag indicating whether the technology is readonly
*/
void set_readonly (bool f)
{
m_readonly = f;
}
/**
* @brief An event indicating that the technology has changed
*/
tl::Event technology_changed_event;
/**
* @brief An event indicating that the technology has changed (with a sender argument)
*/
tl::event<Technology *> technology_changed_with_sender_event;
private:
std::string m_name, m_description;
std::string m_grain_name;
double m_dbu;
std::string m_explicit_base_path, m_default_base_path;
db::LoadLayoutOptions m_load_layout_options;
db::SaveLayoutOptions m_save_layout_options;
std::string m_lyp_path;
std::string m_lyt_path;
bool m_add_other_layers;
std::vector <TechnologyComponent *> m_components;
bool m_persisted;
bool m_readonly;
std::string m_lyt_file;
void init ();
void technology_changed ()
{
technology_changed_with_sender_event (this);
technology_changed_event ();
}
};
/**
* @brief A technology component
*
* A technology component is a part of the data for one technology.
* Plugins may register technology components in every technology and
* use those components to store their specific data.
* A technology component has a name and a description. The name is used
* to identify a component within a technology. The description is shown
* in the setup dialogs.
* This class is the base class for all technology components.
*/
class LAYBASIC_PUBLIC TechnologyComponent
{
public:
/**
* @brief The constructor
*
* @param name The name of the technology component
* @param descriptor The description of the technology component
*/
TechnologyComponent (const std::string &name, const std::string &description)
: m_name (name), m_description (description)
{
// .. nothing yet ..
}
/**
* @brief The destructor
*/
virtual ~TechnologyComponent ()
{
// .. nothing yet ..
}
/**
* @brief Gets the name
*/
const std::string &name () const
{
return m_name;
}
/**
* @brief Gets the description
*/
const std::string &description () const
{
return m_description;
}
/**
* @brief Creates the editor
*
* The implementation of this method is supposed to create an editor for
* the given component. It is guaranteed that the component that is given
* to the editor is one that has been delivered by create_component ().
*/
virtual TechnologyComponentEditor *create_editor (QWidget * /*parent*/)
{
return 0;
}
/**
* @brief Clone this instance
*/
virtual TechnologyComponent *clone () const = 0;
private:
std::string m_name, m_description;
};
/** /**
* @brief A base class for an editor for a technology component * @brief A base class for an editor for a technology component
* *
@ -740,7 +64,7 @@ public:
/** /**
* @brief Set the technology and component for the editor * @brief Set the technology and component for the editor
*/ */
void set_technology (Technology *tech, TechnologyComponent *tech_component) void set_technology (db::Technology *tech, db::TechnologyComponent *tech_component)
{ {
mp_tech = tech; mp_tech = tech;
mp_tech_component = tech_component; mp_tech_component = tech_component;
@ -763,31 +87,31 @@ public:
} }
protected: protected:
Technology *tech () db::Technology *tech ()
{ {
return mp_tech; return mp_tech;
} }
TechnologyComponent *tech_component () db::TechnologyComponent *tech_component ()
{ {
return mp_tech_component; return mp_tech_component;
} }
private: private:
Technology *mp_tech; db::Technology *mp_tech;
TechnologyComponent *mp_tech_component; db::TechnologyComponent *mp_tech_component;
}; };
/** /**
* @brief A base class for a technology component provider * @brief A base class for a technology component provider
*/ */
class LAYBASIC_PUBLIC TechnologyComponentProvider class LAYBASIC_PUBLIC TechnologyEditorProvider
{ {
public: public:
/** /**
* @brief The constructor * @brief The constructor
*/ */
TechnologyComponentProvider () TechnologyEditorProvider ()
{ {
// .. nothing yet .. // .. nothing yet ..
} }
@ -795,7 +119,7 @@ public:
/** /**
* @brief The destructor * @brief The destructor
*/ */
virtual ~TechnologyComponentProvider () virtual ~TechnologyEditorProvider ()
{ {
// .. nothing yet .. // .. nothing yet ..
} }
@ -803,146 +127,13 @@ public:
/** /**
* @brief Creates the technology component * @brief Creates the technology component
*/ */
virtual TechnologyComponent *create_component () const = 0; virtual TechnologyComponentEditor *create_editor (QWidget * /*parent*/) const
/**
* @brief Delivers the XMLElement object that represents this component within a technology XML tree
*
* The object returned is destroyed by the caller.
*/
virtual tl::XMLElementBase *xml_element () const = 0;
};
/**
* @brief A helper class for the XML serialization of the technology component (custom read adaptor)
*/
template <class TC>
class TechnologyComponentReadAdaptor
{
public:
typedef tl::pass_by_ref_tag tag;
TechnologyComponentReadAdaptor (const std::string &name)
: m_name (name), mp_t (0), m_done (false)
{ {
// .. nothing yet .. return 0;
}
const TC &operator () () const
{
const TC *tc = dynamic_cast<const TC *> ((const_cast <lay::Technology *> (mp_t))->component_by_name (m_name));
if (! tc) {
throw tl::Exception (tl::to_string (QObject::tr ("Unknown technology component: ")) + m_name);
}
return *tc;
}
bool at_end () const
{
return m_done;
}
void start (const lay::Technology &t)
{
mp_t = &t;
m_done = false;
}
void next ()
{
m_done = true;
}
private:
std::string m_name;
const lay::Technology *mp_t;
bool m_done;
};
/**
* @brief A helper class for the XML serialization of the technology component (custom write adaptor)
*/
template <class TC>
class TechnologyComponentWriteAdaptor
{
public:
TechnologyComponentWriteAdaptor (const std::string &name)
: m_name (name)
{
// .. nothing yet ..
}
void operator () (lay::Technology &t, tl::XMLReaderState &reader) const
{
const TechnologyComponent *tc_basic = t.component_by_name (m_name);
TC *tc = 0;
if (! tc_basic) {
tc = new TC ();
} else {
tc = dynamic_cast<TC *> (tc_basic->clone ());
if (! tc) {
throw tl::Exception (tl::to_string (QObject::tr ("Invalid technology component: ")) + m_name);
}
}
tl::XMLObjTag<TC> tag;
*tc = *reader.back (tag);
t.set_component (tc);
}
private:
std::string m_name;
};
/**
* @brief A custom XMLElement for the serialization of technology components
*
* TechnologyComponentProvider::xml_element can return such an element to
* insert a custom XML element into the XML tree which represents the
* technology component.
*
* The name of the element will be the name of the technology component.
*/
template <class TC>
class TechnologyComponentXMLElement
: public tl::XMLElement<TC, lay::Technology, TechnologyComponentReadAdaptor<TC>, TechnologyComponentWriteAdaptor<TC> >
{
public:
TechnologyComponentXMLElement (const std::string &name, const tl::XMLElementList &children)
: tl::XMLElement<TC, lay::Technology, TechnologyComponentReadAdaptor<TC>, TechnologyComponentWriteAdaptor<TC> > (TechnologyComponentReadAdaptor<TC> (name), TechnologyComponentWriteAdaptor<TC> (name), name, children)
{
// .. nothing yet ..
}
TechnologyComponentXMLElement (const TechnologyComponentXMLElement &d)
: tl::XMLElement<TC, lay::Technology, TechnologyComponentReadAdaptor<TC>, TechnologyComponentWriteAdaptor<TC> > (d)
{
// .. nothing yet ..
}
virtual tl::XMLElementBase *clone () const
{
return new TechnologyComponentXMLElement (*this);
} }
}; };
} }
namespace tl
{
/**
* @brief Type traits
*/
template <> struct type_traits <lay::TechnologyComponent> : public type_traits<void> {
typedef tl::false_tag has_default_constructor;
typedef tl::false_tag has_copy_constructor;
};
}
#endif #endif

View File

@ -63,7 +63,6 @@ FORMS = \
UserPropertiesForm.ui \ UserPropertiesForm.ui \
UserPropertiesEditForm.ui \ UserPropertiesEditForm.ui \
SpecificLoadLayoutOptionsDialog.ui \ SpecificLoadLayoutOptionsDialog.ui \
CommonReaderOptionsPage.ui \
SelectLineStyleForm.ui \ SelectLineStyleForm.ui \
LayoutViewConfigPage6a.ui \ LayoutViewConfigPage6a.ui \
EditLineStylesForm.ui EditLineStylesForm.ui
@ -154,14 +153,12 @@ SOURCES = \
rdbMarkerBrowser.cc \ rdbMarkerBrowser.cc \
rdbMarkerBrowserDialog.cc \ rdbMarkerBrowserDialog.cc \
rdbMarkerBrowserPage.cc \ rdbMarkerBrowserPage.cc \
layCommonReaderPlugin.cc \
layLineStyles.cc \ layLineStyles.cc \
laySelectLineStyleForm.cc \ laySelectLineStyleForm.cc \
layLineStylePalette.cc \ layLineStylePalette.cc \
layEditLineStylesForm.cc \ layEditLineStylesForm.cc \
layEditLineStyleWidget.cc \ layEditLineStyleWidget.cc \
layBackgroundAwareTreeStyle.cc \ layBackgroundAwareTreeStyle.cc \
gsiDeclLayTechnologies.cc
HEADERS = \ HEADERS = \
gtf.h \ gtf.h \

View File

@ -164,6 +164,25 @@ public:
{ {
return true; return true;
} }
virtual tl::XMLElementBase *xml_reader_options_element () const
{
return new db::ReaderOptionsXMLElement<db::CIFReaderOptions> ("cif",
tl::make_member (&db::CIFReaderOptions::wire_mode, "wire-mode") +
tl::make_member (&db::CIFReaderOptions::dbu, "dbu") +
tl::make_member (&db::CIFReaderOptions::layer_map, "layer-map") +
tl::make_member (&db::CIFReaderOptions::create_other_layers, "create-other-layers") +
tl::make_member (&db::CIFReaderOptions::keep_layer_names, "keep-layer-names")
);
}
virtual tl::XMLElementBase *xml_writer_options_element () const
{
return new db::WriterOptionsXMLElement<db::CIFWriterOptions> ("cif",
tl::make_member (&db::CIFWriterOptions::dummy_calls, "dummy-calls") +
tl::make_member (&db::CIFWriterOptions::blank_separator, "blank-separator")
);
}
}; };
static tl::RegisteredClass<db::StreamFormatDeclaration> reader_decl (new CIFFormatDeclaration (), 100, "CIF"); static tl::RegisteredClass<db::StreamFormatDeclaration> reader_decl (new CIFFormatDeclaration (), 100, "CIF");

View File

@ -49,7 +49,7 @@ CIFReaderOptionPage::~CIFReaderOptionPage ()
} }
void void
CIFReaderOptionPage::setup (const db::FormatSpecificReaderOptions *o, const lay::Technology * /*tech*/) CIFReaderOptionPage::setup (const db::FormatSpecificReaderOptions *o, const db::Technology * /*tech*/)
{ {
static const db::CIFReaderOptions default_options; static const db::CIFReaderOptions default_options;
const db::CIFReaderOptions *options = dynamic_cast<const db::CIFReaderOptions *> (o); const db::CIFReaderOptions *options = dynamic_cast<const db::CIFReaderOptions *> (o);
@ -65,7 +65,7 @@ CIFReaderOptionPage::setup (const db::FormatSpecificReaderOptions *o, const lay:
} }
void void
CIFReaderOptionPage::commit (db::FormatSpecificReaderOptions *o, const lay::Technology * /*tech*/) CIFReaderOptionPage::commit (db::FormatSpecificReaderOptions *o, const db::Technology * /*tech*/)
{ {
db::CIFReaderOptions *options = dynamic_cast<db::CIFReaderOptions *> (o); db::CIFReaderOptions *options = dynamic_cast<db::CIFReaderOptions *> (o);
if (options) { if (options) {
@ -102,17 +102,6 @@ public:
{ {
return new db::CIFReaderOptions (); return new db::CIFReaderOptions ();
} }
virtual tl::XMLElementBase *xml_element () const
{
return new lay::ReaderOptionsXMLElement<db::CIFReaderOptions> ("cif",
tl::make_member (&db::CIFReaderOptions::wire_mode, "wire-mode") +
tl::make_member (&db::CIFReaderOptions::dbu, "dbu") +
tl::make_member (&db::CIFReaderOptions::layer_map, "layer-map") +
tl::make_member (&db::CIFReaderOptions::create_other_layers, "create-other-layers") +
tl::make_member (&db::CIFReaderOptions::keep_layer_names, "keep-layer-names")
);
}
}; };
static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::CIFReaderPluginDeclaration (), 10000, "CIFReader"); static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::CIFReaderPluginDeclaration (), 10000, "CIFReader");

View File

@ -45,8 +45,8 @@ public:
CIFReaderOptionPage (QWidget *parent); CIFReaderOptionPage (QWidget *parent);
~CIFReaderOptionPage (); ~CIFReaderOptionPage ();
void setup (const db::FormatSpecificReaderOptions *options, const lay::Technology *tech); void setup (const db::FormatSpecificReaderOptions *options, const db::Technology *tech);
void commit (db::FormatSpecificReaderOptions *options, const lay::Technology *tech); void commit (db::FormatSpecificReaderOptions *options, const db::Technology *tech);
private: private:
Ui::CIFReaderOptionPage *mp_ui; Ui::CIFReaderOptionPage *mp_ui;

View File

@ -51,7 +51,7 @@ CIFWriterOptionPage::~CIFWriterOptionPage ()
} }
void void
CIFWriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const lay::Technology * /*tech*/) CIFWriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const db::Technology * /*tech*/)
{ {
const db::CIFWriterOptions *options = dynamic_cast<const db::CIFWriterOptions *> (o); const db::CIFWriterOptions *options = dynamic_cast<const db::CIFWriterOptions *> (o);
if (options) { if (options) {
@ -61,7 +61,7 @@ CIFWriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const lay:
} }
void void
CIFWriterOptionPage::commit (db::FormatSpecificWriterOptions *o, const lay::Technology * /*tech*/, bool /*gzip*/) CIFWriterOptionPage::commit (db::FormatSpecificWriterOptions *o, const db::Technology * /*tech*/, bool /*gzip*/)
{ {
db::CIFWriterOptions *options = dynamic_cast<db::CIFWriterOptions *> (o); db::CIFWriterOptions *options = dynamic_cast<db::CIFWriterOptions *> (o);
if (options) { if (options) {
@ -92,14 +92,6 @@ public:
{ {
return new db::CIFWriterOptions (); return new db::CIFWriterOptions ();
} }
virtual tl::XMLElementBase *xml_element () const
{
return new lay::WriterOptionsXMLElement<db::CIFWriterOptions> ("cif",
tl::make_member (&db::CIFWriterOptions::dummy_calls, "dummy-calls") +
tl::make_member (&db::CIFWriterOptions::blank_separator, "blank-separator")
);
}
}; };
static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::CIFWriterPluginDeclaration (), 10000, "CIFWriter"); static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::CIFWriterPluginDeclaration (), 10000, "CIFWriter");

View File

@ -44,8 +44,8 @@ public:
CIFWriterOptionPage (QWidget *parent); CIFWriterOptionPage (QWidget *parent);
~CIFWriterOptionPage (); ~CIFWriterOptionPage ();
void setup (const db::FormatSpecificWriterOptions *options, const lay::Technology *tech); void setup (const db::FormatSpecificWriterOptions *options, const db::Technology *tech);
void commit (db::FormatSpecificWriterOptions *options, const lay::Technology *tech, bool gzip); void commit (db::FormatSpecificWriterOptions *options, const db::Technology *tech, bool gzip);
private: private:
Ui::CIFWriterOptionPage *mp_ui; Ui::CIFWriterOptionPage *mp_ui;

View File

@ -0,0 +1,5 @@
TEMPLATE = subdirs
SUBDIRS = lay_plugin

View File

@ -0,0 +1,107 @@
/*
KLayout Layout Viewer
Copyright (C) 2006-2018 Matthias Koefferlein
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "dbCommonReader.h"
#include "dbLoadLayoutOptions.h"
#include "layCommonReaderPlugin.h"
#include "ui_CommonReaderOptionsPage.h"
#include "gsiDecl.h"
#include <QFrame>
namespace lay
{
// ---------------------------------------------------------------
// CommonReaderOptionPage definition and implementation
CommonReaderOptionPage::CommonReaderOptionPage (QWidget *parent)
: StreamReaderOptionsPage (parent)
{
mp_ui = new Ui::CommonReaderOptionPage ();
mp_ui->setupUi (this);
}
CommonReaderOptionPage::~CommonReaderOptionPage ()
{
delete mp_ui;
mp_ui = 0;
}
void
CommonReaderOptionPage::setup (const db::FormatSpecificReaderOptions *o, const db::Technology * /*tech*/)
{
static const db::CommonReaderOptions default_options;
const db::CommonReaderOptions *options = dynamic_cast<const db::CommonReaderOptions *> (o);
if (!options) {
options = &default_options;
}
mp_ui->enable_text_cbx->setChecked (options->enable_text_objects);
mp_ui->enable_properties_cbx->setChecked (options->enable_properties);
mp_ui->layer_map->set_layer_map (options->layer_map);
mp_ui->read_all_cbx->setChecked (options->create_other_layers);
}
void
CommonReaderOptionPage::commit (db::FormatSpecificReaderOptions *o, const db::Technology * /*tech*/)
{
db::CommonReaderOptions *options = dynamic_cast<db::CommonReaderOptions *> (o);
if (options) {
options->enable_text_objects = mp_ui->enable_text_cbx->isChecked ();
options->enable_properties = mp_ui->enable_properties_cbx->isChecked ();
options->layer_map = mp_ui->layer_map->get_layer_map ();
options->create_other_layers = mp_ui->read_all_cbx->isChecked ();
}
}
// ---------------------------------------------------------------
// CommonReaderPluginDeclaration definition and implementation
class CommonReaderPluginDeclaration
: public StreamReaderPluginDeclaration
{
public:
CommonReaderPluginDeclaration ()
: StreamReaderPluginDeclaration (db::CommonReaderOptions ().format_name ())
{
// .. nothing yet ..
}
StreamReaderOptionsPage *format_specific_options_page (QWidget *parent) const
{
return new CommonReaderOptionPage (parent);
}
db::FormatSpecificReaderOptions *create_specific_options () const
{
return new db::CommonReaderOptions ();
}
};
static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::CommonReaderPluginDeclaration (), 10000, "CommonReader");
}

View File

@ -0,0 +1,21 @@
TARGET = cif
DESTDIR = $$OUT_PWD/../../../../lay_plugins
include($$PWD/../../../lay_plugin.pri)
INCLUDEPATH += $$PWD/../db_plugin
DEPENDPATH += $$PWD/../db_plugin
LIBS += -L$$DESTDIR/../db_plugins -lcif
!isEmpty(RPATH) {
QMAKE_RPATHDIR += $$RPATH/db_plugins
}
HEADERS = \
SOURCES = \
layCommonStreamOptions.cc \
FORMS = \
CommonReaderOptionsPage.ui \

View File

@ -139,6 +139,31 @@ public:
{ {
return true; return true;
} }
virtual tl::XMLElementBase *xml_reader_options_element () const
{
return new db::ReaderOptionsXMLElement<db::DXFReaderOptions> ("dxf",
tl::make_member (&db::DXFReaderOptions::dbu, "dbu") +
tl::make_member (&db::DXFReaderOptions::unit, "unit") +
tl::make_member (&db::DXFReaderOptions::text_scaling, "text-scaling") +
tl::make_member (&db::DXFReaderOptions::circle_points, "circle-points") +
tl::make_member (&db::DXFReaderOptions::circle_accuracy, "circle-accuracy") +
tl::make_member (&db::DXFReaderOptions::contour_accuracy, "contour-accuracy") +
tl::make_member (&db::DXFReaderOptions::polyline_mode, "polyline-mode") +
tl::make_member (&db::DXFReaderOptions::render_texts_as_polygons, "render-texts-as-polygons") +
tl::make_member (&db::DXFReaderOptions::keep_other_cells, "keep-other-cells") +
tl::make_member (&db::DXFReaderOptions::keep_layer_names, "keep-layer-names") +
tl::make_member (&db::DXFReaderOptions::create_other_layers, "create-other-layers") +
tl::make_member (&db::DXFReaderOptions::layer_map, "layer-map")
);
}
virtual tl::XMLElementBase *xml_writer_options_element () const
{
return new db::WriterOptionsXMLElement<db::DXFWriterOptions> ("cif",
tl::make_member (&db::DXFWriterOptions::polygon_mode, "polygon-mode")
);
}
}; };
static tl::RegisteredClass<db::StreamFormatDeclaration> reader_decl (new DXFFormatDeclaration (), 100, "DXF"); static tl::RegisteredClass<db::StreamFormatDeclaration> reader_decl (new DXFFormatDeclaration (), 100, "DXF");

View File

@ -48,7 +48,7 @@ DXFReaderOptionPage::~DXFReaderOptionPage ()
} }
void void
DXFReaderOptionPage::setup (const db::FormatSpecificReaderOptions *o, const lay::Technology * /*tech*/) DXFReaderOptionPage::setup (const db::FormatSpecificReaderOptions *o, const db::Technology * /*tech*/)
{ {
static const db::DXFReaderOptions default_options; static const db::DXFReaderOptions default_options;
const db::DXFReaderOptions *options = dynamic_cast<const db::DXFReaderOptions *> (o); const db::DXFReaderOptions *options = dynamic_cast<const db::DXFReaderOptions *> (o);
@ -71,7 +71,7 @@ DXFReaderOptionPage::setup (const db::FormatSpecificReaderOptions *o, const lay:
} }
void void
DXFReaderOptionPage::commit (db::FormatSpecificReaderOptions *o, const lay::Technology * /*tech*/) DXFReaderOptionPage::commit (db::FormatSpecificReaderOptions *o, const db::Technology * /*tech*/)
{ {
db::DXFReaderOptions *options = dynamic_cast<db::DXFReaderOptions *> (o); db::DXFReaderOptions *options = dynamic_cast<db::DXFReaderOptions *> (o);
if (options) { if (options) {
@ -124,24 +124,6 @@ public:
{ {
return new db::DXFReaderOptions (); return new db::DXFReaderOptions ();
} }
virtual tl::XMLElementBase *xml_element () const
{
return new lay::ReaderOptionsXMLElement<db::DXFReaderOptions> ("dxf",
tl::make_member (&db::DXFReaderOptions::dbu, "dbu") +
tl::make_member (&db::DXFReaderOptions::unit, "unit") +
tl::make_member (&db::DXFReaderOptions::text_scaling, "text-scaling") +
tl::make_member (&db::DXFReaderOptions::circle_points, "circle-points") +
tl::make_member (&db::DXFReaderOptions::circle_accuracy, "circle-accuracy") +
tl::make_member (&db::DXFReaderOptions::contour_accuracy, "contour-accuracy") +
tl::make_member (&db::DXFReaderOptions::polyline_mode, "polyline-mode") +
tl::make_member (&db::DXFReaderOptions::render_texts_as_polygons, "render-texts-as-polygons") +
tl::make_member (&db::DXFReaderOptions::keep_other_cells, "keep-other-cells") +
tl::make_member (&db::DXFReaderOptions::keep_layer_names, "keep-layer-names") +
tl::make_member (&db::DXFReaderOptions::create_other_layers, "create-other-layers") +
tl::make_member (&db::DXFReaderOptions::layer_map, "layer-map")
);
}
}; };
static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::DXFReaderPluginDeclaration (), 10000, "DXFReader"); static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::DXFReaderPluginDeclaration (), 10000, "DXFReader");

View File

@ -45,8 +45,8 @@ public:
DXFReaderOptionPage (QWidget *parent); DXFReaderOptionPage (QWidget *parent);
~DXFReaderOptionPage (); ~DXFReaderOptionPage ();
void setup (const db::FormatSpecificReaderOptions *options, const lay::Technology *tech); void setup (const db::FormatSpecificReaderOptions *options, const db::Technology *tech);
void commit (db::FormatSpecificReaderOptions *options, const lay::Technology *tech); void commit (db::FormatSpecificReaderOptions *options, const db::Technology *tech);
private: private:
Ui::DXFReaderOptionPage *mp_ui; Ui::DXFReaderOptionPage *mp_ui;

View File

@ -48,7 +48,7 @@ DXFWriterOptionPage::~DXFWriterOptionPage ()
} }
void void
DXFWriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const lay::Technology * /*tech*/) DXFWriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const db::Technology * /*tech*/)
{ {
const db::DXFWriterOptions *options = dynamic_cast<const db::DXFWriterOptions *> (o); const db::DXFWriterOptions *options = dynamic_cast<const db::DXFWriterOptions *> (o);
if (options) { if (options) {
@ -57,7 +57,7 @@ DXFWriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const lay:
} }
void void
DXFWriterOptionPage::commit (db::FormatSpecificWriterOptions *o, const lay::Technology * /*tech*/, bool /*gzip*/) DXFWriterOptionPage::commit (db::FormatSpecificWriterOptions *o, const db::Technology * /*tech*/, bool /*gzip*/)
{ {
db::DXFWriterOptions *options = dynamic_cast<db::DXFWriterOptions *> (o); db::DXFWriterOptions *options = dynamic_cast<db::DXFWriterOptions *> (o);
if (options) { if (options) {
@ -87,13 +87,6 @@ public:
{ {
return new db::DXFWriterOptions (); return new db::DXFWriterOptions ();
} }
virtual tl::XMLElementBase *xml_element () const
{
return new lay::WriterOptionsXMLElement<db::DXFWriterOptions> ("cif",
tl::make_member (&db::DXFWriterOptions::polygon_mode, "polygon-mode")
);
}
}; };
static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::DXFWriterPluginDeclaration (), 10000, "DXFWriter"); static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::DXFWriterPluginDeclaration (), 10000, "DXFWriter");

View File

@ -45,8 +45,8 @@ public:
DXFWriterOptionPage (QWidget *parent); DXFWriterOptionPage (QWidget *parent);
~DXFWriterOptionPage (); ~DXFWriterOptionPage ();
void setup (const db::FormatSpecificWriterOptions *options, const lay::Technology *tech); void setup (const db::FormatSpecificWriterOptions *options, const db::Technology *tech);
void commit (db::FormatSpecificWriterOptions *options, const lay::Technology *tech, bool gzip); void commit (db::FormatSpecificWriterOptions *options, const db::Technology *tech, bool gzip);
private: private:
Ui::DXFWriterOptionPage *mp_ui; Ui::DXFWriterOptionPage *mp_ui;

View File

@ -65,6 +65,29 @@ class GDS2FormatDeclaration
{ {
return true; return true;
} }
virtual tl::XMLElementBase *xml_writer_options_element () const
{
return new db::WriterOptionsXMLElement<db::GDS2WriterOptions> ("gds2",
tl::make_member (&db::GDS2WriterOptions::write_timestamps, "write-timestamps") +
tl::make_member (&db::GDS2WriterOptions::write_cell_properties, "write-cell-properties") +
tl::make_member (&db::GDS2WriterOptions::write_file_properties, "write-file-properties") +
tl::make_member (&db::GDS2WriterOptions::no_zero_length_paths, "no-zero-length-paths") +
tl::make_member (&db::GDS2WriterOptions::multi_xy_records, "multi-xy-records") +
tl::make_member (&db::GDS2WriterOptions::max_vertex_count, "max-vertex-count") +
tl::make_member (&db::GDS2WriterOptions::max_cellname_length, "max-cellname-length") +
tl::make_member (&db::GDS2WriterOptions::libname, "libname")
);
}
virtual tl::XMLElementBase *xml_reader_options_element () const
{
return new db::ReaderOptionsXMLElement<db::GDS2ReaderOptions> ("gds2",
tl::make_member (&db::GDS2ReaderOptions::box_mode, "box-mode") +
tl::make_member (&db::GDS2ReaderOptions::allow_big_records, "allow-big-records") +
tl::make_member (&db::GDS2ReaderOptions::allow_multi_xy_records, "allow-multi-xy-records")
);
}
}; };
static tl::RegisteredClass<db::StreamFormatDeclaration> format_decl (new GDS2FormatDeclaration (), 0, "GDS2"); static tl::RegisteredClass<db::StreamFormatDeclaration> format_decl (new GDS2FormatDeclaration (), 0, "GDS2");

View File

@ -50,7 +50,7 @@ GDS2ReaderOptionPage::~GDS2ReaderOptionPage ()
} }
void void
GDS2ReaderOptionPage::setup (const db::FormatSpecificReaderOptions *o, const lay::Technology * /*tech*/) GDS2ReaderOptionPage::setup (const db::FormatSpecificReaderOptions *o, const db::Technology * /*tech*/)
{ {
static const db::GDS2ReaderOptions default_options; static const db::GDS2ReaderOptions default_options;
const db::GDS2ReaderOptions *options = dynamic_cast<const db::GDS2ReaderOptions *> (o); const db::GDS2ReaderOptions *options = dynamic_cast<const db::GDS2ReaderOptions *> (o);
@ -64,7 +64,7 @@ GDS2ReaderOptionPage::setup (const db::FormatSpecificReaderOptions *o, const lay
} }
void void
GDS2ReaderOptionPage::commit (db::FormatSpecificReaderOptions *o, const lay::Technology * /*tech*/) GDS2ReaderOptionPage::commit (db::FormatSpecificReaderOptions *o, const db::Technology * /*tech*/)
{ {
db::GDS2ReaderOptions *options = dynamic_cast<db::GDS2ReaderOptions *> (o); db::GDS2ReaderOptions *options = dynamic_cast<db::GDS2ReaderOptions *> (o);
if (options) { if (options) {
@ -98,15 +98,6 @@ public:
{ {
return new db::GDS2ReaderOptions (); return new db::GDS2ReaderOptions ();
} }
virtual tl::XMLElementBase *xml_element () const
{
return new lay::ReaderOptionsXMLElement<db::GDS2ReaderOptions> ("gds2",
tl::make_member (&db::GDS2ReaderOptions::box_mode, "box-mode") +
tl::make_member (&db::GDS2ReaderOptions::allow_big_records, "allow-big-records") +
tl::make_member (&db::GDS2ReaderOptions::allow_multi_xy_records, "allow-multi-xy-records")
);
}
}; };
static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::GDS2ReaderPluginDeclaration (), 10000, "GDS2Reader"); static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::GDS2ReaderPluginDeclaration (), 10000, "GDS2Reader");

View File

@ -45,8 +45,8 @@ public:
GDS2ReaderOptionPage (QWidget *parent); GDS2ReaderOptionPage (QWidget *parent);
~GDS2ReaderOptionPage (); ~GDS2ReaderOptionPage ();
void setup (const db::FormatSpecificReaderOptions *options, const lay::Technology *tech); void setup (const db::FormatSpecificReaderOptions *options, const db::Technology *tech);
void commit (db::FormatSpecificReaderOptions *options, const lay::Technology *tech); void commit (db::FormatSpecificReaderOptions *options, const db::Technology *tech);
private: private:
Ui::GDS2ReaderOptionPage *mp_ui; Ui::GDS2ReaderOptionPage *mp_ui;

View File

@ -51,7 +51,7 @@ GDS2WriterOptionPage::~GDS2WriterOptionPage ()
} }
void void
GDS2WriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const lay::Technology * /*tech*/) GDS2WriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const db::Technology * /*tech*/)
{ {
const db::GDS2WriterOptions *options = dynamic_cast<const db::GDS2WriterOptions *> (o); const db::GDS2WriterOptions *options = dynamic_cast<const db::GDS2WriterOptions *> (o);
if (options) { if (options) {
@ -68,7 +68,7 @@ GDS2WriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const lay
} }
void void
GDS2WriterOptionPage::commit (db::FormatSpecificWriterOptions *o, const lay::Technology * /*tech*/, bool /*gzip*/) GDS2WriterOptionPage::commit (db::FormatSpecificWriterOptions *o, const db::Technology * /*tech*/, bool /*gzip*/)
{ {
db::GDS2WriterOptions *options = dynamic_cast<db::GDS2WriterOptions *> (o); db::GDS2WriterOptions *options = dynamic_cast<db::GDS2WriterOptions *> (o);
if (options) { if (options) {
@ -135,20 +135,6 @@ public:
return new db::GDS2WriterOptions (); return new db::GDS2WriterOptions ();
} }
virtual tl::XMLElementBase *xml_element () const
{
return new lay::WriterOptionsXMLElement<db::GDS2WriterOptions> ("gds2",
tl::make_member (&db::GDS2WriterOptions::write_timestamps, "write-timestamps") +
tl::make_member (&db::GDS2WriterOptions::write_cell_properties, "write-cell-properties") +
tl::make_member (&db::GDS2WriterOptions::write_file_properties, "write-file-properties") +
tl::make_member (&db::GDS2WriterOptions::no_zero_length_paths, "no-zero-length-paths") +
tl::make_member (&db::GDS2WriterOptions::multi_xy_records, "multi-xy-records") +
tl::make_member (&db::GDS2WriterOptions::max_vertex_count, "max-vertex-count") +
tl::make_member (&db::GDS2WriterOptions::max_cellname_length, "max-cellname-length") +
tl::make_member (&db::GDS2WriterOptions::libname, "libname")
);
}
void initialize_options_from_layout_handle (db::FormatSpecificWriterOptions *o, const lay::LayoutHandle &lh) const void initialize_options_from_layout_handle (db::FormatSpecificWriterOptions *o, const lay::LayoutHandle &lh) const
{ {
// Initialize the libname property from meta data with key "libname". // Initialize the libname property from meta data with key "libname".

View File

@ -44,8 +44,8 @@ public:
GDS2WriterOptionPage (QWidget *parent); GDS2WriterOptionPage (QWidget *parent);
~GDS2WriterOptionPage (); ~GDS2WriterOptionPage ();
void setup (const db::FormatSpecificWriterOptions *options, const lay::Technology *tech); void setup (const db::FormatSpecificWriterOptions *options, const db::Technology *tech);
void commit (db::FormatSpecificWriterOptions *options, const lay::Technology *tech, bool gzip); void commit (db::FormatSpecificWriterOptions *options, const db::Technology *tech, bool gzip);
public slots: public slots:
void multi_xy_clicked (); void multi_xy_clicked ();

View File

@ -0,0 +1,278 @@
/*
KLayout Layout Viewer
Copyright (C) 2006-2018 Matthias Koefferlein
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "tlTimer.h"
#include "tlStream.h"
#include "dbReader.h"
#include "dbStream.h"
#include "dbLEFImporter.h"
#include "dbDEFImporter.h"
#include "dbLEFDEFImporter.h"
#include <QFileInfo>
#include <QDir>
namespace db
{
// ---------------------------------------------------------------
// Plugin for the stream reader
/**
* @brief Determines the format of the given stream
* Returns true, if the stream has LEF format
*/
static bool is_lef_format (const std::string &fn)
{
static const char *suffixes[] = { ".lef", ".LEF", ".lef.gz", ".LEF.gz" };
// NOTE: there is no reliable way of (easily) detecting the format. Hence we use the file
// name's suffix for the format hint.
for (size_t i = 0; i < sizeof (suffixes) / sizeof (suffixes[0]); ++i) {
std::string suffix = suffixes [i];
if (fn.size () > suffix.size () && fn.find (suffix) == fn.size () - suffix.size ()) {
return true;
}
}
return false;
}
/**
* @brief Determines the format of the given stream
* Returns true, if the stream has DEF format
*/
static bool is_def_format (const std::string &fn)
{
static const char *suffixes[] = { ".def", ".DEF", ".def.gz", ".DEF.gz" };
// NOTE: there is no reliable way of (easily) detecting the format. Hence we use the file
// name's suffix for the format hint.
for (size_t i = 0; i < sizeof (suffixes) / sizeof (suffixes[0]); ++i) {
std::string suffix = suffixes [i];
if (fn.size () > suffix.size () && fn.find (suffix) == fn.size () - suffix.size ()) {
return true;
}
}
return false;
}
class LEFDEFReader
: public db::ReaderBase
{
public:
LEFDEFReader (tl::InputStream &s)
: m_stream (s)
{
// .. nothing yet ..
}
virtual const db::LayerMap &read (db::Layout &layout, const db::LoadLayoutOptions &options) throw (tl::Exception)
{
return read_lefdef (layout, options, is_lef_format (m_stream.filename ()));
}
virtual const db::LayerMap &read (db::Layout &layout) throw (tl::Exception)
{
return read_lefdef (layout, db::LoadLayoutOptions (), is_lef_format (m_stream.filename ()));
}
virtual const char *format () const
{
return "LEFDEF";
}
private:
tl::InputStream &m_stream;
db::LayerMap m_layer_map;
std::string correct_path (const std::string &fn)
{
QFileInfo fi (tl::to_qstring (fn));
if (! fi.isAbsolute ()) {
QDir input_dir (QFileInfo (tl::to_qstring (m_stream.absolute_path ())).dir ());
return tl::to_string (input_dir.filePath (fi.filePath ()));
} else {
return fn;
}
}
const db::LayerMap &read_lefdef (db::Layout &layout, const db::LoadLayoutOptions &options, bool import_lef) throw (tl::Exception)
{
const db::LEFDEFReaderOptions *lefdef_options = dynamic_cast<const db::LEFDEFReaderOptions *> (options.get_options (format ()));
static db::LEFDEFReaderOptions default_options;
if (! lefdef_options) {
lefdef_options = &default_options;
}
// Take the layer map and the "read all layers" flag from the reader options - hence we override the
db::LEFDEFLayerDelegate layers (lefdef_options);
layers.prepare (layout);
layout.dbu (lefdef_options->dbu ());
if (import_lef) {
tl::SelfTimer timer (tl::verbosity () >= 11, tl::to_string (QObject::tr ("Reading LEF file")));
db::LEFImporter importer;
for (std::vector<std::string>::const_iterator l = lefdef_options->begin_lef_files (); l != lefdef_options->end_lef_files (); ++l) {
std::string lp = correct_path (*l);
tl::InputStream lef_stream (lp);
tl::log << tl::to_string (QObject::tr ("Reading")) << " " << lp;
importer.read (lef_stream, layout, layers);
}
tl::log << tl::to_string (QObject::tr ("Reading")) << " " << m_stream.source ();
importer.read (m_stream, layout, layers);
} else {
tl::SelfTimer timer (tl::verbosity () >= 11, tl::to_string (QObject::tr ("Reading DEF file")));
DEFImporter importer;
for (std::vector<std::string>::const_iterator l = lefdef_options->begin_lef_files (); l != lefdef_options->end_lef_files (); ++l) {
std::string lp = correct_path (*l);
tl::InputStream lef_stream (lp);
tl::log << tl::to_string (QObject::tr ("Reading")) << " " << lp;
importer.read_lef (lef_stream, layout, layers);
}
// Additionally read all LEF files next to the DEF file
QDir input_dir (QFileInfo (tl::to_qstring (m_stream.absolute_path ())).dir ());
if (input_dir.exists () && input_dir.isReadable ()) {
QStringList entries = input_dir.entryList ();
for (QStringList::const_iterator e = entries.begin (); e != entries.end (); ++e) {
if (is_lef_format (tl::to_string (*e))) {
std::string lp = tl::to_string (input_dir.filePath (*e));
tl::InputStream lef_stream (lp);
tl::log << tl::to_string (QObject::tr ("Reading")) << " " << lp;
importer.read_lef (lef_stream, layout, layers);
}
}
}
tl::log << tl::to_string (QObject::tr ("Reading")) << " " << m_stream.source ();
importer.read (m_stream, layout, layers);
}
layers.finish (layout);
m_layer_map = layers.layer_map ();
return m_layer_map;
}
};
class LEFDEFFormatDeclaration
: public db::StreamFormatDeclaration
{
virtual std::string format_name () const { return "LEFDEF"; }
virtual std::string format_desc () const { return "LEF/DEF"; }
virtual std::string format_title () const { return "LEF/DEF (unified reader)"; }
virtual std::string file_format () const { return "LEF/DEF files (*.lef *.LEF *.lef.gz *.LEF.gz *.def *.DEF *.def.gz *.DEF.gz)"; }
virtual bool detect (tl::InputStream &stream) const
{
return is_lef_format (stream.filename ()) || is_def_format (stream.filename ());
}
virtual db::ReaderBase *create_reader (tl::InputStream &s) const
{
return new db::LEFDEFReader (s);
}
virtual db::WriterBase *create_writer () const
{
return 0;
}
virtual bool can_read () const
{
return true;
}
virtual bool can_write () const
{
return false;
}
virtual tl::XMLElementBase *xml_reader_options_element () const
{
return new db::ReaderOptionsXMLElement<LEFDEFReaderOptions> ("lefdef",
tl::make_member (&LEFDEFReaderOptions::read_all_layers, &LEFDEFReaderOptions::set_read_all_layers, "read-all-layers") +
tl::make_member (&LEFDEFReaderOptions::layer_map, &LEFDEFReaderOptions::set_layer_map, "layer-map") +
tl::make_member (&LEFDEFReaderOptions::dbu, &LEFDEFReaderOptions::set_dbu, "dbu") +
tl::make_member (&LEFDEFReaderOptions::produce_net_names, &LEFDEFReaderOptions::set_produce_net_names, "produce-net-names") +
tl::make_member (&LEFDEFReaderOptions::net_property_name, &LEFDEFReaderOptions::set_net_property_name, "net-property-name") +
tl::make_member (&LEFDEFReaderOptions::produce_inst_names, &LEFDEFReaderOptions::set_produce_inst_names, "produce-inst-names") +
tl::make_member (&LEFDEFReaderOptions::inst_property_name, &LEFDEFReaderOptions::set_inst_property_name, "inst-property-name") +
tl::make_member (&LEFDEFReaderOptions::produce_cell_outlines, &LEFDEFReaderOptions::set_produce_cell_outlines, "produce-cell-outlines") +
tl::make_member (&LEFDEFReaderOptions::cell_outline_layer, &LEFDEFReaderOptions::set_cell_outline_layer, "cell-outline-layer") +
tl::make_member (&LEFDEFReaderOptions::produce_placement_blockages, &LEFDEFReaderOptions::set_produce_placement_blockages, "produce-placement-blockages") +
tl::make_member (&LEFDEFReaderOptions::placement_blockage_layer, &LEFDEFReaderOptions::set_placement_blockage_layer, "placement-blockage-layer") +
tl::make_member (&LEFDEFReaderOptions::produce_regions, &LEFDEFReaderOptions::set_produce_regions, "produce-regions") +
tl::make_member (&LEFDEFReaderOptions::region_layer, &LEFDEFReaderOptions::set_region_layer, "region-layer") +
tl::make_member (&LEFDEFReaderOptions::produce_via_geometry, &LEFDEFReaderOptions::set_produce_via_geometry, "produce-via-geometry") +
tl::make_member (&LEFDEFReaderOptions::via_geometry_suffix, &LEFDEFReaderOptions::set_via_geometry_suffix, "via-geometry-suffix") +
tl::make_member (&LEFDEFReaderOptions::via_geometry_datatype, &LEFDEFReaderOptions::set_via_geometry_datatype, "via-geometry-datatype") +
tl::make_member (&LEFDEFReaderOptions::produce_pins, &LEFDEFReaderOptions::set_produce_pins, "produce-pins") +
tl::make_member (&LEFDEFReaderOptions::pins_suffix, &LEFDEFReaderOptions::set_pins_suffix, "pins-suffix") +
tl::make_member (&LEFDEFReaderOptions::pins_datatype, &LEFDEFReaderOptions::set_pins_datatype, "pins-datatype") +
tl::make_member (&LEFDEFReaderOptions::produce_obstructions, &LEFDEFReaderOptions::set_produce_obstructions, "produce-obstructions") +
tl::make_member (&LEFDEFReaderOptions::obstructions_suffix, &LEFDEFReaderOptions::set_obstructions_suffix, "obstructions-suffix") +
tl::make_member (&LEFDEFReaderOptions::obstructions_datatype, &LEFDEFReaderOptions::set_obstructions_datatype, "obstructions-datatype") +
tl::make_member (&LEFDEFReaderOptions::produce_blockages, &LEFDEFReaderOptions::set_produce_blockages, "produce-blockages") +
tl::make_member (&LEFDEFReaderOptions::blockages_suffix, &LEFDEFReaderOptions::set_blockages_suffix, "blockages-suffix") +
tl::make_member (&LEFDEFReaderOptions::blockages_datatype, &LEFDEFReaderOptions::set_blockages_datatype, "blockages-datatype") +
tl::make_member (&LEFDEFReaderOptions::produce_labels, &LEFDEFReaderOptions::set_produce_labels, "produce-labels") +
tl::make_member (&LEFDEFReaderOptions::labels_suffix, &LEFDEFReaderOptions::set_labels_suffix, "labels-suffix") +
tl::make_member (&LEFDEFReaderOptions::labels_datatype, &LEFDEFReaderOptions::set_labels_datatype, "labels-datatype") +
tl::make_member (&LEFDEFReaderOptions::produce_routing, &LEFDEFReaderOptions::set_produce_routing, "produce-routing") +
tl::make_member (&LEFDEFReaderOptions::routing_suffix, &LEFDEFReaderOptions::set_routing_suffix, "routing-suffix") +
tl::make_member (&LEFDEFReaderOptions::routing_datatype, &LEFDEFReaderOptions::set_routing_datatype, "routing-datatype") +
tl::make_member (&LEFDEFReaderOptions::begin_lef_files, &LEFDEFReaderOptions::end_lef_files, &LEFDEFReaderOptions::push_lef_file, "lef-files")
);
}
};
static tl::RegisteredClass<db::StreamFormatDeclaration> format_decl (new LEFDEFFormatDeclaration (), 500, "LEFDEF");
}

View File

@ -5,12 +5,13 @@ DESTDIR = $$OUT_PWD/../../../../db_plugins
include($$PWD/../../../db_plugin.pri) include($$PWD/../../../db_plugin.pri)
HEADERS = \ HEADERS = \
dbDEFImporter.h \ dbDEFImporter.h \
dbLEFDEFImporter.h \ dbLEFDEFImporter.h \
dbLEFImporter.h dbLEFImporter.h
SOURCES = \ SOURCES = \
gsiDeclDbLEFDEF.cc \ gsiDeclDbLEFDEF.cc \
dbDEFImporter.cc \ dbLEFDEFPlugin.cc \
dbLEFDEFImporter.cc \ dbDEFImporter.cc \
dbLEFImporter.cc dbLEFDEFImporter.cc \
dbLEFImporter.cc

View File

@ -128,10 +128,10 @@ public:
tl::InputStream stream (data.file); tl::InputStream stream (data.file);
std::string tech_name = lay::MainWindow::instance ()->initial_technology (); std::string tech_name = lay::MainWindow::instance ()->initial_technology ();
if (! lay::Technologies::instance ()->has_technology (tech_name)) { if (! db::Technologies::instance ()->has_technology (tech_name)) {
tech_name.clear (); // use default technology tech_name.clear (); // use default technology
} }
const lay::Technology *tech = lay::Technologies::instance ()->technology_by_name (tech_name); const db::Technology *tech = db::Technologies::instance ()->technology_by_name (tech_name);
db::LEFDEFReaderOptions options; db::LEFDEFReaderOptions options;
if (tech) { if (tech) {
const db::LEFDEFReaderOptions *tech_options = dynamic_cast<const db::LEFDEFReaderOptions *>(tech->load_layout_options ().get_options ("LEFDEF")); const db::LEFDEFReaderOptions *tech_options = dynamic_cast<const db::LEFDEFReaderOptions *>(tech->load_layout_options ().get_options ("LEFDEF"));

View File

@ -317,11 +317,11 @@ BEGIN_PROTECTED
std::string tech_name; std::string tech_name;
tech_name = lay::MainWindow::instance ()->initial_technology (); tech_name = lay::MainWindow::instance ()->initial_technology ();
if (! lay::Technologies::instance ()->has_technology (tech_name)) { if (! db::Technologies::instance ()->has_technology (tech_name)) {
tech_name.clear (); // use default technology tech_name.clear (); // use default technology
} }
lay::Technology *tech = lay::Technologies::instance ()->technology_by_name (tech_name); db::Technology *tech = db::Technologies::instance ()->technology_by_name (tech_name);
if (!tech) { if (!tech) {
return; return;
} }
@ -365,7 +365,7 @@ LEFDEFReaderOptionsEditor::LEFDEFReaderOptionsEditor (QWidget *parent)
} }
void void
LEFDEFReaderOptionsEditor::commit (db::FormatSpecificReaderOptions *options, const lay::Technology * /*tech*/) LEFDEFReaderOptionsEditor::commit (db::FormatSpecificReaderOptions *options, const db::Technology * /*tech*/)
{ {
db::LEFDEFReaderOptions *data = dynamic_cast<db::LEFDEFReaderOptions *> (options); db::LEFDEFReaderOptions *data = dynamic_cast<db::LEFDEFReaderOptions *> (options);
if (! data) { if (! data) {
@ -436,7 +436,7 @@ LEFDEFReaderOptionsEditor::commit (db::FormatSpecificReaderOptions *options, con
} }
void void
LEFDEFReaderOptionsEditor::setup (const db::FormatSpecificReaderOptions *options, const lay::Technology *tech) LEFDEFReaderOptionsEditor::setup (const db::FormatSpecificReaderOptions *options, const db::Technology *tech)
{ {
static db::LEFDEFReaderOptions empty; static db::LEFDEFReaderOptions empty;
const db::LEFDEFReaderOptions *data = dynamic_cast<const db::LEFDEFReaderOptions *> (options); const db::LEFDEFReaderOptions *data = dynamic_cast<const db::LEFDEFReaderOptions *> (options);
@ -445,7 +445,7 @@ LEFDEFReaderOptionsEditor::setup (const db::FormatSpecificReaderOptions *options
} }
// TODO: there should be a const weak ptr ... // TODO: there should be a const weak ptr ...
mp_tech.reset (const_cast<lay::Technology *> (tech)); mp_tech.reset (const_cast<db::Technology *> (tech));
dbu->setText (tl::to_qstring (tl::to_string (data->dbu ()))); dbu->setText (tl::to_qstring (tl::to_string (data->dbu ())));
read_all_cbx->setChecked (data->read_all_layers ()); read_all_cbx->setChecked (data->read_all_layers ());

View File

@ -89,8 +89,8 @@ Q_OBJECT
public: public:
LEFDEFReaderOptionsEditor (QWidget *parent); LEFDEFReaderOptionsEditor (QWidget *parent);
void commit (db::FormatSpecificReaderOptions *options, const lay::Technology *tech); void commit (db::FormatSpecificReaderOptions *options, const db::Technology *tech);
void setup (const db::FormatSpecificReaderOptions *options, const lay::Technology *tech); void setup (const db::FormatSpecificReaderOptions *options, const db::Technology *tech);
private slots: private slots:
void checkbox_changed (); void checkbox_changed ();
@ -100,7 +100,7 @@ private slots:
void move_lef_files_down_clicked (); void move_lef_files_down_clicked ();
private: private:
tl::weak_ptr<lay::Technology> mp_tech; tl::weak_ptr<db::Technology> mp_tech;
}; };
} }

View File

@ -34,214 +34,9 @@
#include "layStream.h" #include "layStream.h"
#include "layLEFDEFImportDialogs.h" #include "layLEFDEFImportDialogs.h"
#include "gsiDecl.h"
#include <QFileInfo>
#include <QDir>
namespace db namespace db
{ {
// ---------------------------------------------------------------
// Plugin for the stream reader
/**
* @brief Determines the format of the given stream
* Returns true, if the stream has LEF format
*/
static bool is_lef_format (const std::string &fn)
{
static const char *suffixes[] = { ".lef", ".LEF", ".lef.gz", ".LEF.gz" };
// NOTE: there is no reliable way of (easily) detecting the format. Hence we use the file
// name's suffix for the format hint.
for (size_t i = 0; i < sizeof (suffixes) / sizeof (suffixes[0]); ++i) {
std::string suffix = suffixes [i];
if (fn.size () > suffix.size () && fn.find (suffix) == fn.size () - suffix.size ()) {
return true;
}
}
return false;
}
/**
* @brief Determines the format of the given stream
* Returns true, if the stream has DEF format
*/
static bool is_def_format (const std::string &fn)
{
static const char *suffixes[] = { ".def", ".DEF", ".def.gz", ".DEF.gz" };
// NOTE: there is no reliable way of (easily) detecting the format. Hence we use the file
// name's suffix for the format hint.
for (size_t i = 0; i < sizeof (suffixes) / sizeof (suffixes[0]); ++i) {
std::string suffix = suffixes [i];
if (fn.size () > suffix.size () && fn.find (suffix) == fn.size () - suffix.size ()) {
return true;
}
}
return false;
}
class LEFDEFReader
: public db::ReaderBase
{
public:
LEFDEFReader (tl::InputStream &s)
: m_stream (s)
{
// .. nothing yet ..
}
virtual const db::LayerMap &read (db::Layout &layout, const db::LoadLayoutOptions &options) throw (tl::Exception)
{
return read_lefdef (layout, options, is_lef_format (m_stream.filename ()));
}
virtual const db::LayerMap &read (db::Layout &layout) throw (tl::Exception)
{
return read_lefdef (layout, db::LoadLayoutOptions (), is_lef_format (m_stream.filename ()));
}
virtual const char *format () const
{
return "LEFDEF";
}
private:
tl::InputStream &m_stream;
db::LayerMap m_layer_map;
std::string correct_path (const std::string &fn)
{
QFileInfo fi (tl::to_qstring (fn));
if (! fi.isAbsolute ()) {
QDir input_dir (QFileInfo (tl::to_qstring (m_stream.absolute_path ())).dir ());
return tl::to_string (input_dir.filePath (fi.filePath ()));
} else {
return fn;
}
}
const db::LayerMap &read_lefdef (db::Layout &layout, const db::LoadLayoutOptions &options, bool import_lef) throw (tl::Exception)
{
const db::LEFDEFReaderOptions *lefdef_options = dynamic_cast<const db::LEFDEFReaderOptions *> (options.get_options (format ()));
static db::LEFDEFReaderOptions default_options;
if (! lefdef_options) {
lefdef_options = &default_options;
}
// Take the layer map and the "read all layers" flag from the reader options - hence we override the
db::LEFDEFLayerDelegate layers (lefdef_options);
layers.prepare (layout);
layout.dbu (lefdef_options->dbu ());
if (import_lef) {
tl::SelfTimer timer (tl::verbosity () >= 11, tl::to_string (QObject::tr ("Reading LEF file")));
db::LEFImporter importer;
for (std::vector<std::string>::const_iterator l = lefdef_options->begin_lef_files (); l != lefdef_options->end_lef_files (); ++l) {
std::string lp = correct_path (*l);
tl::InputStream lef_stream (lp);
tl::log << tl::to_string (QObject::tr ("Reading")) << " " << lp;
importer.read (lef_stream, layout, layers);
}
tl::log << tl::to_string (QObject::tr ("Reading")) << " " << m_stream.source ();
importer.read (m_stream, layout, layers);
} else {
tl::SelfTimer timer (tl::verbosity () >= 11, tl::to_string (QObject::tr ("Reading DEF file")));
DEFImporter importer;
for (std::vector<std::string>::const_iterator l = lefdef_options->begin_lef_files (); l != lefdef_options->end_lef_files (); ++l) {
std::string lp = correct_path (*l);
tl::InputStream lef_stream (lp);
tl::log << tl::to_string (QObject::tr ("Reading")) << " " << lp;
importer.read_lef (lef_stream, layout, layers);
}
// Additionally read all LEF files next to the DEF file
QDir input_dir (QFileInfo (tl::to_qstring (m_stream.absolute_path ())).dir ());
if (input_dir.exists () && input_dir.isReadable ()) {
QStringList entries = input_dir.entryList ();
for (QStringList::const_iterator e = entries.begin (); e != entries.end (); ++e) {
if (is_lef_format (tl::to_string (*e))) {
std::string lp = tl::to_string (input_dir.filePath (*e));
tl::InputStream lef_stream (lp);
tl::log << tl::to_string (QObject::tr ("Reading")) << " " << lp;
importer.read_lef (lef_stream, layout, layers);
}
}
}
tl::log << tl::to_string (QObject::tr ("Reading")) << " " << m_stream.source ();
importer.read (m_stream, layout, layers);
}
layers.finish (layout);
m_layer_map = layers.layer_map ();
return m_layer_map;
}
};
class LEFDEFFormatDeclaration
: public db::StreamFormatDeclaration
{
virtual std::string format_name () const { return "LEFDEF"; }
virtual std::string format_desc () const { return "LEF/DEF"; }
virtual std::string format_title () const { return "LEF/DEF (unified reader)"; }
virtual std::string file_format () const { return "LEF/DEF files (*.lef *.LEF *.lef.gz *.LEF.gz *.def *.DEF *.def.gz *.DEF.gz)"; }
virtual bool detect (tl::InputStream &stream) const
{
return is_lef_format (stream.filename ()) || is_def_format (stream.filename ());
}
virtual db::ReaderBase *create_reader (tl::InputStream &s) const
{
return new LEFDEFReader (s);
}
virtual db::WriterBase *create_writer () const
{
return 0;
}
virtual bool can_read () const
{
return true;
}
virtual bool can_write () const
{
return false;
}
};
static tl::RegisteredClass<db::StreamFormatDeclaration> format_decl (new LEFDEFFormatDeclaration (), 500, "LEFDEF");
// --------------------------------------------------------------- // ---------------------------------------------------------------
// LEFDEFPluginDeclaration definition and implementation // LEFDEFPluginDeclaration definition and implementation
@ -264,44 +59,6 @@ public:
{ {
return new LEFDEFReaderOptions (); return new LEFDEFReaderOptions ();
} }
virtual tl::XMLElementBase *xml_element () const
{
return new lay::ReaderOptionsXMLElement<LEFDEFReaderOptions> ("lefdef",
tl::make_member (&LEFDEFReaderOptions::read_all_layers, &LEFDEFReaderOptions::set_read_all_layers, "read-all-layers") +
tl::make_member (&LEFDEFReaderOptions::layer_map, &LEFDEFReaderOptions::set_layer_map, "layer-map") +
tl::make_member (&LEFDEFReaderOptions::dbu, &LEFDEFReaderOptions::set_dbu, "dbu") +
tl::make_member (&LEFDEFReaderOptions::produce_net_names, &LEFDEFReaderOptions::set_produce_net_names, "produce-net-names") +
tl::make_member (&LEFDEFReaderOptions::net_property_name, &LEFDEFReaderOptions::set_net_property_name, "net-property-name") +
tl::make_member (&LEFDEFReaderOptions::produce_inst_names, &LEFDEFReaderOptions::set_produce_inst_names, "produce-inst-names") +
tl::make_member (&LEFDEFReaderOptions::inst_property_name, &LEFDEFReaderOptions::set_inst_property_name, "inst-property-name") +
tl::make_member (&LEFDEFReaderOptions::produce_cell_outlines, &LEFDEFReaderOptions::set_produce_cell_outlines, "produce-cell-outlines") +
tl::make_member (&LEFDEFReaderOptions::cell_outline_layer, &LEFDEFReaderOptions::set_cell_outline_layer, "cell-outline-layer") +
tl::make_member (&LEFDEFReaderOptions::produce_placement_blockages, &LEFDEFReaderOptions::set_produce_placement_blockages, "produce-placement-blockages") +
tl::make_member (&LEFDEFReaderOptions::placement_blockage_layer, &LEFDEFReaderOptions::set_placement_blockage_layer, "placement-blockage-layer") +
tl::make_member (&LEFDEFReaderOptions::produce_regions, &LEFDEFReaderOptions::set_produce_regions, "produce-regions") +
tl::make_member (&LEFDEFReaderOptions::region_layer, &LEFDEFReaderOptions::set_region_layer, "region-layer") +
tl::make_member (&LEFDEFReaderOptions::produce_via_geometry, &LEFDEFReaderOptions::set_produce_via_geometry, "produce-via-geometry") +
tl::make_member (&LEFDEFReaderOptions::via_geometry_suffix, &LEFDEFReaderOptions::set_via_geometry_suffix, "via-geometry-suffix") +
tl::make_member (&LEFDEFReaderOptions::via_geometry_datatype, &LEFDEFReaderOptions::set_via_geometry_datatype, "via-geometry-datatype") +
tl::make_member (&LEFDEFReaderOptions::produce_pins, &LEFDEFReaderOptions::set_produce_pins, "produce-pins") +
tl::make_member (&LEFDEFReaderOptions::pins_suffix, &LEFDEFReaderOptions::set_pins_suffix, "pins-suffix") +
tl::make_member (&LEFDEFReaderOptions::pins_datatype, &LEFDEFReaderOptions::set_pins_datatype, "pins-datatype") +
tl::make_member (&LEFDEFReaderOptions::produce_obstructions, &LEFDEFReaderOptions::set_produce_obstructions, "produce-obstructions") +
tl::make_member (&LEFDEFReaderOptions::obstructions_suffix, &LEFDEFReaderOptions::set_obstructions_suffix, "obstructions-suffix") +
tl::make_member (&LEFDEFReaderOptions::obstructions_datatype, &LEFDEFReaderOptions::set_obstructions_datatype, "obstructions-datatype") +
tl::make_member (&LEFDEFReaderOptions::produce_blockages, &LEFDEFReaderOptions::set_produce_blockages, "produce-blockages") +
tl::make_member (&LEFDEFReaderOptions::blockages_suffix, &LEFDEFReaderOptions::set_blockages_suffix, "blockages-suffix") +
tl::make_member (&LEFDEFReaderOptions::blockages_datatype, &LEFDEFReaderOptions::set_blockages_datatype, "blockages-datatype") +
tl::make_member (&LEFDEFReaderOptions::produce_labels, &LEFDEFReaderOptions::set_produce_labels, "produce-labels") +
tl::make_member (&LEFDEFReaderOptions::labels_suffix, &LEFDEFReaderOptions::set_labels_suffix, "labels-suffix") +
tl::make_member (&LEFDEFReaderOptions::labels_datatype, &LEFDEFReaderOptions::set_labels_datatype, "labels-datatype") +
tl::make_member (&LEFDEFReaderOptions::produce_routing, &LEFDEFReaderOptions::set_produce_routing, "produce-routing") +
tl::make_member (&LEFDEFReaderOptions::routing_suffix, &LEFDEFReaderOptions::set_routing_suffix, "routing-suffix") +
tl::make_member (&LEFDEFReaderOptions::routing_datatype, &LEFDEFReaderOptions::set_routing_datatype, "routing-datatype") +
tl::make_member (&LEFDEFReaderOptions::begin_lef_files, &LEFDEFReaderOptions::end_lef_files, &LEFDEFReaderOptions::push_lef_file, "lef-files")
);
}
}; };
static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new LEFDEFPluginDeclaration (), 10001, "LEFDEFReader"); static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new LEFDEFPluginDeclaration (), 10001, "LEFDEFReader");

View File

@ -463,6 +463,18 @@ public:
{ {
return true; return true;
} }
virtual tl::XMLElementBase *xml_writer_options_element () const
{
return new db::WriterOptionsXMLElement<db::OASISWriterOptions> ("oasis",
tl::make_member (&db::OASISWriterOptions::compression_level, "compression-level") +
tl::make_member (&db::OASISWriterOptions::write_cblocks, "write-cblocks") +
tl::make_member (&db::OASISWriterOptions::strict_mode, "strict-mode") +
tl::make_member (&db::OASISWriterOptions::write_std_properties, "write-std-properties") +
tl::make_member (&db::OASISWriterOptions::subst_char, "subst-char") +
tl::make_member (&db::OASISWriterOptions::permissive, "permissive")
);
}
}; };
static tl::RegisteredClass<db::StreamFormatDeclaration> reader_decl (new OASISFormatDeclaration (), 10, "OASIS"); static tl::RegisteredClass<db::StreamFormatDeclaration> reader_decl (new OASISFormatDeclaration (), 10, "OASIS");

View File

@ -43,8 +43,8 @@ public:
OASISWriterOptionPage (QWidget *parent); OASISWriterOptionPage (QWidget *parent);
~OASISWriterOptionPage (); ~OASISWriterOptionPage ();
void setup (const db::FormatSpecificWriterOptions *options, const lay::Technology *tech); void setup (const db::FormatSpecificWriterOptions *options, const db::Technology *tech);
void commit (db::FormatSpecificWriterOptions *options, const lay::Technology *tech, bool gzip); void commit (db::FormatSpecificWriterOptions *options, const db::Technology *tech, bool gzip);
private: private:
Ui::OASISWriterOptionPage *mp_ui; Ui::OASISWriterOptionPage *mp_ui;
@ -63,7 +63,7 @@ OASISWriterOptionPage::~OASISWriterOptionPage ()
} }
void void
OASISWriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const lay::Technology * /*tech*/) OASISWriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const db::Technology * /*tech*/)
{ {
const db::OASISWriterOptions *options = dynamic_cast<const db::OASISWriterOptions *> (o); const db::OASISWriterOptions *options = dynamic_cast<const db::OASISWriterOptions *> (o);
if (options) { if (options) {
@ -77,7 +77,7 @@ OASISWriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const la
} }
void void
OASISWriterOptionPage::commit (db::FormatSpecificWriterOptions *o, const lay::Technology * /*tech*/, bool gzip) OASISWriterOptionPage::commit (db::FormatSpecificWriterOptions *o, const db::Technology * /*tech*/, bool gzip)
{ {
if (gzip && mp_ui->write_cblocks->isChecked ()) { if (gzip && mp_ui->write_cblocks->isChecked ()) {
throw tl::Exception (tl::to_string (QObject::tr ("gzip compression cannot be used with CBLOCK compression"))); throw tl::Exception (tl::to_string (QObject::tr ("gzip compression cannot be used with CBLOCK compression")));
@ -120,18 +120,6 @@ public:
{ {
return new db::OASISWriterOptions (); return new db::OASISWriterOptions ();
} }
virtual tl::XMLElementBase *xml_element () const
{
return new lay::WriterOptionsXMLElement<db::OASISWriterOptions> ("oasis",
tl::make_member (&db::OASISWriterOptions::compression_level, "compression-level") +
tl::make_member (&db::OASISWriterOptions::write_cblocks, "write-cblocks") +
tl::make_member (&db::OASISWriterOptions::strict_mode, "strict-mode") +
tl::make_member (&db::OASISWriterOptions::write_std_properties, "write-std-properties") +
tl::make_member (&db::OASISWriterOptions::subst_char, "subst-char") +
tl::make_member (&db::OASISWriterOptions::permissive, "permissive")
);
}
}; };
static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::OASISWriterPluginDeclaration (), 10000, "OASISWriter"); static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::OASISWriterPluginDeclaration (), 10000, "OASISWriter");