Naming of layers isn't required anymore for connect et al: names are given automatically now.

This commit is contained in:
Matthias Koefferlein 2019-04-20 20:30:12 +02:00
parent 767f6a7c48
commit 20b984cc50
13 changed files with 592 additions and 236 deletions

View File

@ -26,6 +26,8 @@
#include "dbDeepRegion.h"
#include "dbShapeRepository.h"
#include "dbCellMapping.h"
#include "dbLayoutToNetlistWriter.h"
#include "dbLayoutToNetlistReader.h"
namespace db
{
@ -155,7 +157,9 @@ db::Region *LayoutToNetlist::make_text_layer (unsigned int layer_index, const st
si.shape_flags (db::ShapeIterator::Texts);
std::auto_ptr <db::Region> region (new db::Region (si, dss ()));
register_layer (*region, n);
if (! n.empty ()) {
register_layer (*region, n);
}
return region.release ();
}
@ -166,7 +170,9 @@ db::Region *LayoutToNetlist::make_polygon_layer (unsigned int layer_index, const
si.shape_flags (db::ShapeIterator::Paths | db::ShapeIterator::Polygons | db::ShapeIterator::Boxes);
std::auto_ptr <db::Region> region (new db::Region (si, dss ()));
register_layer (*region, n);
if (! n.empty ()) {
register_layer (*region, n);
}
return region.release ();
}
@ -188,7 +194,7 @@ void LayoutToNetlist::connect (const db::Region &l)
}
if (! is_persisted (l)) {
throw (tl::Exception (tl::to_string (tr ("Only named layers can be used in intra-layer connectivity for netlist extraction"))));
register_layer (l, make_new_name ());
}
// we need to keep a reference, so we can safely delete the region
@ -204,10 +210,10 @@ void LayoutToNetlist::connect (const db::Region &a, const db::Region &b)
throw tl::Exception (tl::to_string (tr ("The netlist has already been extracted")));
}
if (! is_persisted (a)) {
throw (tl::Exception (tl::to_string (tr ("Only named layers can be used in inter-layer connectivity (first layer) for netlist extraction"))));
register_layer (a, make_new_name ());
}
if (! is_persisted (b)) {
throw (tl::Exception (tl::to_string (tr ("Only named layers can be used in inter-layer connectivity (second layer) for netlist extraction"))));
register_layer (b, make_new_name ());
}
// we need to keep a reference, so we can safely delete the region
@ -225,7 +231,7 @@ size_t LayoutToNetlist::connect_global (const db::Region &l, const std::string &
throw tl::Exception (tl::to_string (tr ("The netlist has already been extracted")));
}
if (! is_persisted (l)) {
throw (tl::Exception (tl::to_string (tr ("Only named layers can be used in global connectivity for netlist extraction"))));
register_layer (l, make_new_name ());
}
// we need to keep a reference, so we can safely delete the region
@ -343,6 +349,29 @@ void LayoutToNetlist::register_layer (const db::Region &region, const std::strin
m_name_of_layer [dl.layer ()] = n;
}
std::string LayoutToNetlist::make_new_name (const std::string &stem)
{
int m = std::numeric_limits<int>::max () / 2 + 1;
int n = m;
std::string name;
while (m > 0) {
m /= 2;
name = stem;
name += std::string ("$");
name += tl::to_string (n - m);
if (m_named_regions.find (name) == m_named_regions.end ()) {
n -= m;
}
}
return name;
}
std::string LayoutToNetlist::name (const db::Region &region) const
{
std::map<unsigned int, std::string>::const_iterator n = m_name_of_layer.find (layer_of (region));
@ -939,4 +968,22 @@ db::Region LayoutToNetlist::antenna_check (const db::Region &gate, const db::Reg
return db::Region (new db::DeepRegion (dl));
}
void db::LayoutToNetlist::save (const std::string &path, bool short_format)
{
tl::OutputStream stream (path);
db::LayoutToNetlistStandardWriter writer (stream, short_format);
set_filename (path);
writer.write (this);
}
void db::LayoutToNetlist::load (const std::string &path)
{
tl::InputStream stream (path);
db::LayoutToNetlistStandardReader reader (stream);
set_filename (path);
set_name (stream.filename ());
reader.read (this);
}
}

View File

@ -114,6 +114,73 @@ public:
*/
~LayoutToNetlist ();
/**
* @brief Gets the database description
*/
const std::string &description () const
{
return m_description;
}
/**
* @brief Sets the database description
*/
void set_description (const std::string &description)
{
m_description = description;
}
/**
* @brief Gets the original file
*
* The original file describes what original file the netlist database
* was derived from.
*/
const std::string &original_file () const
{
return m_original_file;
}
/**
* @brief Sets the database original file
*/
void set_original_file (const std::string &original_file)
{
m_original_file = original_file;
}
/**
* @brief Gets the database name
*/
const std::string &name () const
{
return m_name;
}
/**
* @brief Sets the database name
*/
void set_name (const std::string &name)
{
m_name = name;
}
/**
* @brief Gets the file name
*/
const std::string &filename () const
{
return m_filename;
}
/**
* @brief Sets the file name
*/
void set_filename (const std::string &filename)
{
m_filename = filename;
}
/**
* @brief Sets the number of threads to use for operations which support multiple threads
*/
@ -154,8 +221,7 @@ public:
* (see below) enhances readability of backannotated information
* if layers are involved. Use this method to attach a name to a region
* derived by boolean operations for example.
* Named regions are persisted inside the LayoutToNetlist object. Only
* named regions can be put into "connect".
* Named regions are persisted inside the LayoutToNetlist object.
*/
void register_layer (const db::Region &region, const std::string &name);
@ -264,21 +330,18 @@ public:
* a derived layer. Certain limitations apply. It's safe to use
* boolean operations for deriving layers. Other operations are applicable as long as they are
* capable of delivering hierarchical layers.
* Regions put into "connect" need to be named.
*/
void connect (const db::Region &l);
/**
* @brief Defines an inter-layer connection for the given layers.
* The conditions mentioned with intra-layer "connect" apply for this method too.
* Regions put into "connect" need to be named.
*/
void connect (const db::Region &a, const db::Region &b);
/**
* @brief Connects the given layer with a global net with the given name
* Returns the global net ID
* Regions put into "connect" need to be named.
*/
size_t connect_global (const db::Region &l, const std::string &gn);
@ -531,11 +594,32 @@ public:
*/
db::Region antenna_check (const db::Region &gate, const db::Region &metal, double ratio, const std::vector<std::pair<const db::Region *, double> > &diodes = std::vector<std::pair<const db::Region *, double> > ());
/**
* @brief Saves the database to the given path
*
* Currently, the internal format will be used. If "short_format" is true, the short version
* of the format is used.
*
* This is a convenience method. The low-level functionality is the LayoutToNetlistWriter.
*/
void save (const std::string &path, bool short_format);
/**
* @brief Loads the database from the given path
*
* This is a convenience method. The low-level functionality is the LayoutToNetlistReader.
*/
void load (const std::string &path);
private:
// no copying
LayoutToNetlist (const db::LayoutToNetlist &other);
LayoutToNetlist &operator= (const db::LayoutToNetlist &other);
std::string m_description;
std::string m_name;
std::string m_original_file;
std::string m_filename;
db::RecursiveShapeIterator m_iter;
std::auto_ptr<db::DeepShapeStore> mp_internal_dss;
tl::weak_ptr<db::DeepShapeStore> mp_dss;
@ -556,6 +640,7 @@ private:
void build_net_rec (db::cell_index_type ci, size_t cid, db::Layout &target, db::Cell &target_cell, const std::map<unsigned int, const db::Region *> &lmap, const Net *net, const char *net_cell_name_prefix, const char *cell_name_prefix, const char *device_cell_name_prefix, std::map<std::pair<db::cell_index_type, size_t>, db::cell_index_type> &cmap, const ICplxTrans &tr) const;
db::DeepLayer deep_layer_of (const db::Region &region) const;
void ensure_layout () const;
std::string make_new_name (const std::string &stem = std::string ());
};
}

View File

@ -27,6 +27,26 @@
namespace db
{
// -------------------------------------------------------------------------------------------
// LayoutToNetlistWriterBase implementation
LayoutToNetlistWriterBase::LayoutToNetlistWriterBase ()
{
// .. nothing yet ..
}
LayoutToNetlistWriterBase::~LayoutToNetlistWriterBase ()
{
// .. nothing yet ..
}
void LayoutToNetlistWriterBase::write (const db::LayoutToNetlist *l2n)
{
do_write (l2n);
}
// -------------------------------------------------------------------------------------------
namespace l2n_std_format
{
@ -464,7 +484,7 @@ LayoutToNetlistStandardWriter::LayoutToNetlistStandardWriter (tl::OutputStream &
// .. nothing yet ..
}
void LayoutToNetlistStandardWriter::write (const db::LayoutToNetlist *l2n)
void LayoutToNetlistStandardWriter::do_write (const db::LayoutToNetlist *l2n)
{
if (m_short_version) {
l2n_std_format::std_writer_impl<l2n_std_format::keys<true> > writer (*mp_stream);

View File

@ -37,10 +37,16 @@ class LayoutToNetlist;
class DB_PUBLIC LayoutToNetlistWriterBase
{
public:
LayoutToNetlistWriterBase () { }
virtual ~LayoutToNetlistWriterBase () { }
LayoutToNetlistWriterBase ();
virtual ~LayoutToNetlistWriterBase ();
virtual void write (const db::LayoutToNetlist *l2n) = 0;
void write (const db::LayoutToNetlist *l2n);
protected:
virtual void do_write (const db::LayoutToNetlist *l2n) = 0;
private:
std::string m_filename;
};
/**
@ -52,7 +58,8 @@ class DB_PUBLIC LayoutToNetlistStandardWriter
public:
LayoutToNetlistStandardWriter (tl::OutputStream &stream, bool short_version);
void write (const db::LayoutToNetlist *l2n);
protected:
void do_write (const db::LayoutToNetlist *l2n);
private:
tl::OutputStream *mp_stream;

View File

@ -22,8 +22,6 @@
#include "gsiDecl.h"
#include "dbLayoutToNetlist.h"
#include "dbLayoutToNetlistWriter.h"
#include "dbLayoutToNetlistReader.h"
#include "tlStream.h"
#include "tlVariant.h"
@ -82,20 +80,6 @@ static void build_all_nets (const db::LayoutToNetlist *l2n, const db::CellMappin
l2n->build_all_nets (cmap, target, lmap, net_cell_name_prefix.is_nil () ? 0 : np.c_str (), circuit_cell_name_prefix.is_nil () ? 0 : cp.c_str (), device_cell_name_prefix.is_nil () ? 0 : dp.c_str ());
}
static void write_l2n (const db::LayoutToNetlist *l2n, const std::string &path, bool short_format)
{
tl::OutputStream stream (path);
db::LayoutToNetlistStandardWriter writer (stream, short_format);
writer.write (l2n);
}
static void read_l2n (db::LayoutToNetlist *l2n, const std::string &path)
{
tl::InputStream stream (path);
db::LayoutToNetlistStandardReader reader (stream);
reader.read (l2n);
}
static std::vector<std::string> l2n_layer_names (const db::LayoutToNetlist *l2n)
{
std::vector<std::string> ln;
@ -197,11 +181,34 @@ Class<db::LayoutToNetlist> decl_dbLayoutToNetlist ("db", "LayoutToNetlist",
gsi::method ("max_vertex_count", &db::LayoutToNetlist::max_vertex_count,
"See \\max_vertex_count= for details about this attribute."
) +
gsi::method ("name", (const std::string &(db::LayoutToNetlist::*) () const) &db::LayoutToNetlist::name,
"@brief Gets the name of the database\n"
) +
gsi::method ("name=", &db::LayoutToNetlist::set_name,
"@brief Sets the name of the database\n"
) +
gsi::method ("description", (const std::string &(db::LayoutToNetlist::*) () const) &db::LayoutToNetlist::name,
"@brief Gets the description of the database\n"
) +
gsi::method ("description=", &db::LayoutToNetlist::set_name,
"@brief Sets the description of the database\n"
) +
gsi::method ("filename", &db::LayoutToNetlist::filename,
"@brief Gets the file name of the database\n"
"The filename is the name under which the database is stored or empty if it is not associated with a file."
) +
gsi::method ("original_file", &db::LayoutToNetlist::original_file,
"@brief Gets the original file name of the database\n"
"The original filename is the layout file from which the netlist DB was created."
) +
gsi::method ("original_file=", &db::LayoutToNetlist::set_original_file,
"@brief Sets the original file name of the database\n"
) +
gsi::method ("name", (std::string (db::LayoutToNetlist::*) (const db::Region &region) const) &db::LayoutToNetlist::name, gsi::arg ("l"),
"@brief Get the name of the given layer\n"
"@brief Gets the name of the given layer\n"
) +
gsi::method ("name", (std::string (db::LayoutToNetlist::*) (unsigned int) const) &db::LayoutToNetlist::name, gsi::arg ("l"),
"@brief Get the name of the given layer (by index)\n"
"@brief Gets the name of the given layer (by index)\n"
) +
gsi::method ("register", (void (db::LayoutToNetlist::*) (const db::Region &region, const std::string &)) &db::LayoutToNetlist::register_layer, gsi::arg ("l"), gsi::arg ("n"),
"@brief Names the given layer\n"
@ -210,8 +217,9 @@ Class<db::LayoutToNetlist> decl_dbLayoutToNetlist ("db", "LayoutToNetlist",
"\n"
"Naming a layer allows the system to indicate the layer in various contexts, i.e. "
"when writing the data to a file. Named layers are also persisted inside the LayoutToNetlist object. "
"They are not discarded when the Region object is destroyed. Only named layers can be put into "
"\\connect.\n"
"They are not discarded when the Region object is destroyed.\n"
"\n"
"If required, the system will assign a name automatically."
) +
gsi::method_ext ("layer_names", &l2n_layer_names,
"@brief Returns a list of names of the layer kept inside the LayoutToNetlist object."
@ -425,11 +433,11 @@ Class<db::LayoutToNetlist> decl_dbLayoutToNetlist ("db", "LayoutToNetlist",
"This variant accepts a database-unit location. The location is given in the\n"
"coordinate space of the initial cell.\n"
) +
gsi::method_ext ("write", &write_l2n, gsi::arg ("path"), gsi::arg ("short_format", false),
gsi::method ("write", &db::LayoutToNetlist::save, gsi::arg ("path"), gsi::arg ("short_format", false),
"@brief Writes the extracted netlist to a file.\n"
"This method employs the native format of KLayout.\n"
) +
gsi::method_ext ("read", &read_l2n, gsi::arg ("path"),
gsi::method ("read", &db::LayoutToNetlist::load, gsi::arg ("path"),
"@brief Reads the extracted netlist from the file.\n"
"This method employs the native format of KLayout.\n"
) +

View File

@ -28,6 +28,7 @@
#include "layDitherPattern.h"
#include "layLineStyles.h"
#include "dbSaveLayoutOptions.h"
#include "dbLayoutToNetlist.h"
#include "tlStream.h"
#if defined(HAVE_QTBINDINGS)
@ -196,6 +197,13 @@ static unsigned int create_rdb (lay::LayoutView *view, const std::string &name)
return view->add_rdb (db);
}
static unsigned int create_l2ndb (lay::LayoutView *view, const std::string &name)
{
db::LayoutToNetlist *db = new db::LayoutToNetlist ();
db->set_name (name);
return view->add_l2ndb (db);
}
// this binding returns a const pointer which is not converted into a copy by RBA
static lay::LayerPropertiesNodeRef insert_layer1 (lay::LayoutView *view, const lay::LayerPropertiesConstIterator &iter, const lay::LayerProperties &props)
{
@ -1427,6 +1435,48 @@ Class<lay::LayoutView> decl_LayoutView (QT_EXTERNAL_BASE (QWidget) "lay", "Layou
"The marker browser is opened showing the report database with the index given by \"rdb_index\".\n"
"It will be attached (i.e. navigate to) the layout with the given cellview index in \"cv_index\".\n"
) +
gsi::event ("on_l2ndb_list_changed", &lay::LayoutView::l2ndb_list_changed_event,
"@brief An event that is triggered the list of netlist databases is changed\n"
"\n"
"If a netlist database is added or removed, this event is triggered.\n"
"\n"
"This method has been added in version 0.26."
) +
gsi::method ("num_l2ndbs", &lay::LayoutView::num_l2ndbs,
"@brief Gets the number of netlist databases loaded into this view\n"
"@return The number of \\LayoutToNetlist objects present in this view\n"
"\n"
"This method has been added in version 0.26."
) +
gsi::method ("remove_l2ndb", &lay::LayoutView::remove_l2ndb, gsi::arg ("index"),
"@brief Removes a netlist database with the given index\n"
"@param The index of the netlist database to remove from this view"
"\n"
"This method has been added in version 0.26."
) +
gsi::method ("l2ndb", (db::LayoutToNetlist *(lay::LayoutView::*) (int index)) &lay::LayoutView::get_l2ndb, gsi::arg ("index"),
"@brief Gets the netlist database with the given index\n"
"@return The \\LayoutToNetlist object or nil if the index is not valid"
"\n"
"This method has been added in version 0.26."
) +
gsi::method_ext ("create_l2ndb", &create_l2ndb, gsi::arg ("name"),
"@brief Creates a new netlist database and returns the index of the new database\n"
"@param name The name of the new netlist database\n"
"@return The index of the new database\n"
"This method returns an index of the new netlist database. Use \\l2ndb to get the actual object. "
"If a netlist database with the given name already exists, a unique name will be created.\n"
"The name will be replaced by the file name when a file is loaded into the netlist database.\n"
"\n"
"This method has been added in version 0.26."
) +
gsi::method ("show_l2ndb", &lay::LayoutView::open_l2ndb_browser, gsi::arg ("l2ndb_index"), gsi::arg ("cv_index"),
"@brief Shows a netlist database in the marker browser on a certain layout\n"
"The netlist browser is opened showing the netlist database with the index given by \"l2ndb_index\".\n"
"It will be attached (i.e. navigate to) the layout with the given cellview index in \"cv_index\".\n"
"\n"
"This method has been added in version 0.26."
) +
// HINT: the cast is important to direct GSI to the LayoutView method rather than the
// Plugin method (in which case we get a segmentation violation ..)
// TODO: this method belongs to the Plugin interface and should be located there.

View File

@ -66,6 +66,7 @@
#include "layRedrawThreadWorker.h"
#include "layParsedLayerSource.h"
#include "layBookmarkManagementForm.h"
#include "layNetlistBrowserDialog.h"
#include "dbLayout.h"
#include "dbLayoutUtils.h"
#include "dbRecursiveShapeIterator.h"
@ -73,6 +74,7 @@
#include "dbEdgeProcessor.h"
#include "rdb.h"
#include "rdbMarkerBrowserDialog.h"
#include "dbLayoutToNetlist.h"
#include "tlXMLParser.h"
#include "gsi.h"
#include "gtf.h"
@ -568,6 +570,7 @@ LayoutView::~LayoutView ()
cellviews_changed_event.clear ();
cellview_changed_event.clear ();
rdb_list_changed_event.clear ();
l2ndb_list_changed_event.clear ();
file_open_event.clear ();
hier_changed_event.clear ();
geom_changed_event.clear ();
@ -581,6 +584,11 @@ LayoutView::~LayoutView ()
remove_rdb (0);
}
// remove all L2N DB's
while (num_l2ndbs () > 0) {
remove_l2ndb (0);
}
// delete layer lists
std::vector<LayerPropertiesList *> layer_properties_lists;
layer_properties_lists.swap (m_layer_properties_lists);
@ -7074,19 +7082,17 @@ LayoutView::cm_clear_layer ()
}
}
unsigned int
LayoutView::add_rdb (rdb::Database *rdb)
template <class T, class Iter>
static void make_unique_name (T *object, Iter from, Iter to)
{
// make the name unique
std::string n (rdb->name ());
std::string n (object->name ());
int nn = 0;
do {
bool found = false;
for (unsigned int i = 0; i < num_rdbs () && !found; ++i) {
if (get_rdb (i)->name () == n) {
for (Iter i = from; i != to && !found; ++i) {
if ((*i)->name () == n) {
found = true;
}
}
@ -7095,12 +7101,67 @@ LayoutView::add_rdb (rdb::Database *rdb)
break;
}
n = rdb->name () + tl::sprintf ("[%d]", ++nn);
n = object->name () + tl::sprintf ("[%d]", ++nn);
} while (1);
rdb->set_name (n);
object->set_name (n);
}
unsigned int
LayoutView::add_l2ndb (db::LayoutToNetlist *l2ndb)
{
make_unique_name (l2ndb, m_l2ndbs.begin (), m_l2ndbs.end ());
m_l2ndbs.push_back (l2ndb);
l2ndb_list_changed_event ();
return (unsigned int)(m_l2ndbs.size () - 1);
}
db::LayoutToNetlist *
LayoutView::get_l2ndb (int index)
{
if (index >= 0 && index < int (m_l2ndbs.size ())) {
return m_l2ndbs [index];
} else {
return 0;
}
}
void
LayoutView::open_l2ndb_browser (int l2ndb_index, int cv_index)
{
lay::NetlistBrowserDialog *l2ndb_browser = get_plugin <lay::NetlistBrowserDialog> ();
if (l2ndb_browser) {
l2ndb_browser->load (l2ndb_index, cv_index);
}
}
const db::LayoutToNetlist *
LayoutView::get_l2ndb (int index) const
{
if (index >= 0 && index < int (m_l2ndbs.size ())) {
return m_l2ndbs [index];
} else {
return 0;
}
}
void
LayoutView::remove_l2ndb (unsigned int index)
{
if (index < (unsigned int) (m_l2ndbs.size ())) {
delete m_l2ndbs [index];
m_l2ndbs.erase (m_l2ndbs.begin () + index);
l2ndb_list_changed_event ();
}
}
unsigned int
LayoutView::add_rdb (rdb::Database *rdb)
{
make_unique_name (rdb, m_l2ndbs.begin (), m_l2ndbs.end ());
m_rdbs.push_back (rdb);
rdb_list_changed_event ();
@ -7118,7 +7179,7 @@ LayoutView::get_rdb (int index)
}
}
void
void
LayoutView::open_rdb_browser (int rdb_index, int cv_index)
{
rdb::MarkerBrowserDialog *rdb_browser = get_plugin <rdb::MarkerBrowserDialog> ();
@ -7137,7 +7198,7 @@ LayoutView::get_rdb (int index) const
}
}
void
void
LayoutView::remove_rdb (unsigned int index)
{
if (index < (unsigned int) (m_rdbs.size ())) {
@ -7147,7 +7208,7 @@ LayoutView::remove_rdb (unsigned int index)
}
}
QSize
QSize
LayoutView::sizeHint () const
{
if ((m_options & LV_Naked) != 0) {

View File

@ -62,6 +62,7 @@ namespace db {
class Layout;
class Manager;
class SaveLayoutOptions;
class LayoutToNetlist;
}
namespace lay {
@ -2293,7 +2294,7 @@ public:
void remove_rdb (unsigned int index);
/**
* @brief Get the number of databases
* @brief Get the number of marker databases
*/
unsigned int num_rdbs () const
{
@ -2307,6 +2308,61 @@ public:
*/
tl::Event rdb_list_changed_event;
/**
* @brief Add a Netlist database
*
* The layout view will become owner of the database.
*
* @param l2ndb The database to add
* @return The index of the database
*/
unsigned int add_l2ndb (db::LayoutToNetlist *l2ndb);
/**
* @brief Get the netlist database by index
*
* @param index The index of the database
* @return A pointer to the database or 0 if the index was not valid.
*/
db::LayoutToNetlist *get_l2ndb (int index);
/**
* @brief Get the netlist database by index (const version)
*
* @param index The index of the database
* @return A pointer to the database or 0 if the index was not valid.
*/
const db::LayoutToNetlist *get_l2ndb (int index) const;
/**
* @brief Open the L2NDB browser for a given database and associated cv index
*/
void open_l2ndb_browser (int l2ndb_index, int cv_index);
/**
* @brief Remove the netlist database with the given index
*
* This will release the netlist database at the given index. The list
* will be reduced by that element. This means, that the following elements
* will have different indicies.
*/
void remove_l2ndb (unsigned int index);
/**
* @brief Get the number of netlist databases
*/
unsigned int num_l2ndbs () const
{
return (unsigned int) m_l2ndbs.size ();
}
/**
* @brief An event signalling a change in the netlist database list
*
* If netlist databases are added or removed, this event is triggered.
*/
tl::Event l2ndb_list_changed_event;
/**
* @brief Deliver a size hint (reimplementation of QWidget)
*/
@ -2635,6 +2691,7 @@ private:
std::vector <std::set <cell_index_type> > m_hidden_cells;
std::string m_title;
tl::vector <rdb::Database *> m_rdbs;
tl::vector <db::LayoutToNetlist *> m_l2ndbs;
std::string m_def_lyp_file;
bool m_add_other_layers;
bool m_always_show_source;

View File

@ -34,17 +34,17 @@ namespace lay
// ------------------------------------------------------------
// Declaration of the configuration options
std::string cfg_l2n_context_mode ("l2n-context-mode");
std::string cfg_l2n_show_all ("l2n-show-all");
std::string cfg_l2n_window_state ("l2n-window-state");
std::string cfg_l2n_window_mode ("l2n-window-mode");
std::string cfg_l2n_window_dim ("l2n-window-dim");
std::string cfg_l2n_max_marker_count ("l2n-max-marker-count");
std::string cfg_l2n_highlight_color ("l2n-highlight-color");
std::string cfg_l2n_highlight_line_width ("l2n-highlight-line-width");
std::string cfg_l2n_highlight_vertex_size ("l2n-highlight-vertex-size");
std::string cfg_l2n_highlight_halo ("l2n-highlight-halo");
std::string cfg_l2n_highlight_dither_pattern ("l2n-highlight-dither-pattern");
std::string cfg_l2ndb_context_mode ("l2n-context-mode");
std::string cfg_l2ndb_show_all ("l2n-show-all");
std::string cfg_l2ndb_window_state ("l2n-window-state");
std::string cfg_l2ndb_window_mode ("l2n-window-mode");
std::string cfg_l2ndb_window_dim ("l2n-window-dim");
std::string cfg_l2ndb_max_marker_count ("l2n-max-marker-count");
std::string cfg_l2ndb_highlight_color ("l2n-highlight-color");
std::string cfg_l2ndb_highlight_line_width ("l2n-highlight-line-width");
std::string cfg_l2ndb_highlight_vertex_size ("l2n-highlight-vertex-size");
std::string cfg_l2ndb_highlight_halo ("l2n-highlight-halo");
std::string cfg_l2ndb_highlight_dither_pattern ("l2n-highlight-dither-pattern");
// ------------------------------------------------------------
@ -136,22 +136,22 @@ NetlistBrowserConfigPage::setup (lay::PluginRoot *root)
{
// context mode
lay::NetlistBrowserConfig::net_context_mode_type cmode = lay::NetlistBrowserConfig::NetlistTop;
root->config_get (cfg_l2n_context_mode, cmode, NetlistBrowserContextModeConverter ());
root->config_get (cfg_l2ndb_context_mode, cmode, NetlistBrowserContextModeConverter ());
cbx_context->setCurrentIndex (int (cmode));
// window mode
lay::NetlistBrowserConfig::net_window_type wmode = lay::NetlistBrowserConfig::FitNet;
root->config_get (cfg_l2n_window_mode, wmode, NetlistBrowserWindowModeConverter ());
root->config_get (cfg_l2ndb_window_mode, wmode, NetlistBrowserWindowModeConverter ());
cbx_window->setCurrentIndex (int (wmode));
// window dimension
double wdim = 1.0;
root->config_get (cfg_l2n_window_dim, wdim);
root->config_get (cfg_l2ndb_window_dim, wdim);
le_window->setText (tl::to_qstring (tl::to_string (wdim)));
// max. marker count
unsigned int max_marker_count = 1000;
root->config_get (cfg_l2n_max_marker_count, max_marker_count);
root->config_get (cfg_l2ndb_max_marker_count, max_marker_count);
le_max_markers->setText (tl::to_qstring (tl::to_string (max_marker_count)));
// enable controls
@ -173,10 +173,10 @@ NetlistBrowserConfigPage::commit (lay::PluginRoot *root)
unsigned int max_markers_count = 1000;
tl::from_string (tl::to_string (le_max_markers->text ()), max_markers_count);
root->config_set (cfg_l2n_context_mode, lay::NetlistBrowserConfig::net_context_mode_type (cbx_context->currentIndex ()), NetlistBrowserContextModeConverter ());
root->config_set (cfg_l2n_window_mode, lay::NetlistBrowserConfig::net_window_type (cbx_window->currentIndex ()), NetlistBrowserWindowModeConverter ());
root->config_set (cfg_l2n_window_dim, dim);
root->config_set (cfg_l2n_max_marker_count, max_markers_count);
root->config_set (cfg_l2ndb_context_mode, lay::NetlistBrowserConfig::net_context_mode_type (cbx_context->currentIndex ()), NetlistBrowserContextModeConverter ());
root->config_set (cfg_l2ndb_window_mode, lay::NetlistBrowserConfig::net_window_type (cbx_window->currentIndex ()), NetlistBrowserWindowModeConverter ());
root->config_set (cfg_l2ndb_window_dim, dim);
root->config_set (cfg_l2ndb_max_marker_count, max_markers_count);
}
// ------------------------------------------------------------
@ -193,12 +193,12 @@ NetlistBrowserConfigPage2::setup (lay::PluginRoot *root)
{
// marker color
QColor color;
root->config_get (cfg_l2n_highlight_color, color, lay::ColorConverter ());
root->config_get (cfg_l2ndb_highlight_color, color, lay::ColorConverter ());
color_pb->set_color (color);
// marker line width
int lw = 0;
root->config_get (cfg_l2n_highlight_line_width, lw);
root->config_get (cfg_l2ndb_highlight_line_width, lw);
if (lw < 0) {
lw_le->setText (QString ());
} else {
@ -207,7 +207,7 @@ NetlistBrowserConfigPage2::setup (lay::PluginRoot *root)
// marker vertex size
int vs = 0;
root->config_get (cfg_l2n_highlight_vertex_size, vs);
root->config_get (cfg_l2ndb_highlight_vertex_size, vs);
if (vs < 0) {
vs_le->setText (QString ());
} else {
@ -216,12 +216,12 @@ NetlistBrowserConfigPage2::setup (lay::PluginRoot *root)
// stipple pattern
int dp = 0;
root->config_get (cfg_l2n_highlight_dither_pattern, dp);
root->config_get (cfg_l2ndb_highlight_dither_pattern, dp);
stipple_pb->set_dither_pattern (dp);
// halo
int halo = 0;
root->config_get (cfg_l2n_highlight_halo, halo);
root->config_get (cfg_l2ndb_highlight_halo, halo);
halo_cb->setCheckState (halo < 0 ? Qt::PartiallyChecked : (halo ? Qt::Checked : Qt::Unchecked));
}
@ -229,36 +229,36 @@ void
NetlistBrowserConfigPage2::commit (lay::PluginRoot *root)
{
QColor color (color_pb->get_color ());
root->config_set (cfg_l2n_highlight_color, color, lay::ColorConverter ());
root->config_set (cfg_l2ndb_highlight_color, color, lay::ColorConverter ());
if (lw_le->text ().isEmpty ()) {
root->config_set (cfg_l2n_highlight_line_width, -1);
root->config_set (cfg_l2ndb_highlight_line_width, -1);
} else {
try {
int s;
tl::from_string (tl::to_string (lw_le->text ()), s);
root->config_set (cfg_l2n_highlight_line_width, s);
root->config_set (cfg_l2ndb_highlight_line_width, s);
} catch (...) { }
}
if (vs_le->text ().isEmpty ()) {
root->config_set (cfg_l2n_highlight_vertex_size, -1);
root->config_set (cfg_l2ndb_highlight_vertex_size, -1);
} else {
try {
int s;
tl::from_string (tl::to_string (vs_le->text ()), s);
root->config_set (cfg_l2n_highlight_vertex_size, s);
root->config_set (cfg_l2ndb_highlight_vertex_size, s);
} catch (...) { }
}
root->config_set (cfg_l2n_highlight_dither_pattern, stipple_pb->dither_pattern ());
root->config_set (cfg_l2ndb_highlight_dither_pattern, stipple_pb->dither_pattern ());
if (halo_cb->checkState () == Qt::PartiallyChecked) {
root->config_set (cfg_l2n_highlight_halo, -1);
root->config_set (cfg_l2ndb_highlight_halo, -1);
} else if (halo_cb->checkState () == Qt::Unchecked) {
root->config_set (cfg_l2n_highlight_halo, 0);
root->config_set (cfg_l2ndb_highlight_halo, 0);
} else if (halo_cb->checkState () == Qt::Checked) {
root->config_set (cfg_l2n_highlight_halo, 1);
root->config_set (cfg_l2ndb_highlight_halo, 1);
}
}
@ -271,16 +271,16 @@ class NetlistBrowserPluginDeclaration
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_l2n_context_mode, "netlist-top"));
options.push_back (std::pair<std::string, std::string> (cfg_l2n_window_mode, "fit-net"));
options.push_back (std::pair<std::string, std::string> (cfg_l2n_window_state, ""));
options.push_back (std::pair<std::string, std::string> (cfg_l2n_window_dim, "1.0"));
options.push_back (std::pair<std::string, std::string> (cfg_l2n_max_marker_count, "1000"));
options.push_back (std::pair<std::string, std::string> (cfg_l2n_highlight_color, lay::ColorConverter ().to_string (QColor ())));
options.push_back (std::pair<std::string, std::string> (cfg_l2n_highlight_line_width, "-1"));
options.push_back (std::pair<std::string, std::string> (cfg_l2n_highlight_vertex_size, "-1"));
options.push_back (std::pair<std::string, std::string> (cfg_l2n_highlight_halo, "-1"));
options.push_back (std::pair<std::string, std::string> (cfg_l2n_highlight_dither_pattern, "-1"));
options.push_back (std::pair<std::string, std::string> (cfg_l2ndb_context_mode, "netlist-top"));
options.push_back (std::pair<std::string, std::string> (cfg_l2ndb_window_mode, "fit-net"));
options.push_back (std::pair<std::string, std::string> (cfg_l2ndb_window_state, ""));
options.push_back (std::pair<std::string, std::string> (cfg_l2ndb_window_dim, "1.0"));
options.push_back (std::pair<std::string, std::string> (cfg_l2ndb_max_marker_count, "1000"));
options.push_back (std::pair<std::string, std::string> (cfg_l2ndb_highlight_color, lay::ColorConverter ().to_string (QColor ())));
options.push_back (std::pair<std::string, std::string> (cfg_l2ndb_highlight_line_width, "-1"));
options.push_back (std::pair<std::string, std::string> (cfg_l2ndb_highlight_vertex_size, "-1"));
options.push_back (std::pair<std::string, std::string> (cfg_l2ndb_highlight_halo, "-1"));
options.push_back (std::pair<std::string, std::string> (cfg_l2ndb_highlight_dither_pattern, "-1"));
}
virtual std::vector<std::pair <std::string, lay::ConfigPage *> > config_pages (QWidget *parent) const

View File

@ -29,7 +29,7 @@
#include "layConverters.h"
#include "layQtTools.h"
#include "layConfigurationDialog.h"
#include "dbLayoutUtils.h"
#include "dbLayoutToNetlist.h"
#include "dbRecursiveShapeIterator.h"
#include <QMessageBox>
@ -40,17 +40,17 @@
namespace lay
{
extern std::string cfg_l2n_context_mode;
extern std::string cfg_l2n_show_all;
extern std::string cfg_l2n_window_state;
extern std::string cfg_l2n_window_mode;
extern std::string cfg_l2n_window_dim;
extern std::string cfg_l2n_max_marker_count;
extern std::string cfg_l2n_highlight_color;
extern std::string cfg_l2n_highlight_line_width;
extern std::string cfg_l2n_highlight_vertex_size;
extern std::string cfg_l2n_highlight_halo;
extern std::string cfg_l2n_highlight_dither_pattern;
extern std::string cfg_l2ndb_context_mode;
extern std::string cfg_l2ndb_show_all;
extern std::string cfg_l2ndb_window_state;
extern std::string cfg_l2ndb_window_mode;
extern std::string cfg_l2ndb_window_dim;
extern std::string cfg_l2ndb_max_marker_count;
extern std::string cfg_l2ndb_highlight_color;
extern std::string cfg_l2ndb_highlight_line_width;
extern std::string cfg_l2ndb_highlight_vertex_size;
extern std::string cfg_l2ndb_highlight_halo;
extern std::string cfg_l2ndb_highlight_dither_pattern;
NetlistBrowserDialog::NetlistBrowserDialog (lay::PluginRoot *root, lay::LayoutView *vw)
: lay::Browser (root, vw),
@ -73,7 +73,7 @@ NetlistBrowserDialog::NetlistBrowserDialog (lay::PluginRoot *root, lay::LayoutVi
if (view ()) {
view ()->cellviews_changed_event.add (this, &NetlistBrowserDialog::cellviews_changed);
view ()->cellview_changed_event.add (this, &NetlistBrowserDialog::cellview_changed);
// @@@view ()->l2n_list_changed_event.add (this, &NetlistBrowserDialog::l2ndbs_changed);
view ()->l2ndb_list_changed_event.add (this, &NetlistBrowserDialog::l2ndbs_changed);
}
m_open_action = new QAction (QObject::tr ("Open"), file_menu);
@ -129,37 +129,11 @@ NetlistBrowserDialog::unload_all_clicked ()
{
BEGIN_PROTECTED
#if 0 // @@@
bool modified = false;
for (int i = 0; i < int (view ()->num_rdbs ()); ++i) {
rdb::Database *rdb = view ()->get_rdb (i);
if (rdb && rdb->is_modified ()) {
modified = true;
break;
}
}
if (modified) {
QMessageBox msgbox (QMessageBox::Question, QObject::tr ("Unload Without Saving"),
QObject::tr ("At least one database was not saved.\nPress 'Continue' to continue anyway or 'Cancel' for not unloading the database."));
QPushButton *ok = msgbox.addButton (QObject::tr ("Continue"), QMessageBox::AcceptRole);
msgbox.setDefaultButton (msgbox.addButton (QMessageBox::Cancel));
msgbox.exec ();
if (msgbox.clickedButton () != ok) {
return;
}
}
while (view ()->num_rdbs () > 0) {
view ()->remove_rdb (0);
while (view ()->num_l2ndbs () > 0) {
view ()->remove_l2ndb (0);
}
l2ndb_index_changed (-1);
#endif
END_PROTECTED
}
@ -169,39 +143,21 @@ NetlistBrowserDialog::unload_clicked ()
{
BEGIN_PROTECTED
#if 0 // @@@
if (m_l2n_index < int (view ()->num_rdbs ()) && m_l2n_index >= 0) {
rdb::Database *rdb = view ()->get_rdb (m_l2n_index);
if (rdb && rdb->is_modified ()) {
QMessageBox msgbox (QMessageBox::Question, QObject::tr ("Unload Without Saving"),
QObject::tr ("The database was not saved.\nPress 'Continue' to continue anyway or 'Cancel' for not unloading the database."));
QPushButton *ok = msgbox.addButton (QObject::tr ("Continue"), QMessageBox::AcceptRole);
msgbox.setDefaultButton (msgbox.addButton (QMessageBox::Cancel));
msgbox.exec ();
if (msgbox.clickedButton () != ok) {
return;
}
}
if (m_l2n_index < int (view ()->num_l2ndbs ()) && m_l2n_index >= 0) {
int new_l2n_index = m_l2n_index;
view ()->remove_rdb (m_l2n_index);
view ()->remove_l2ndb (m_l2n_index);
// try to use another rbd ...
if (new_l2n_index >= int (view ()->num_rdbs ())) {
if (new_l2n_index >= int (view ()->num_l2ndbs ())) {
--new_l2n_index;
}
if (new_l2n_index < int (view ()->num_rdbs ()) && new_l2n_index >= 0) {
if (new_l2n_index < int (view ()->num_l2ndbs ()) && new_l2n_index >= 0) {
l2ndb_index_changed (new_l2n_index);
}
}
#endif
END_PROTECTED
}
@ -250,26 +206,23 @@ NetlistBrowserDialog::saveas_clicked ()
{
BEGIN_PROTECTED
#if 0 // @@@
if (m_l2n_index < int (view ()->num_rdbs ()) && m_l2n_index >= 0) {
if (m_l2n_index < int (view ()->num_l2ndbs ()) && m_l2n_index >= 0) {
rdb::Database *rdb = view ()->get_rdb (m_l2n_index);
if (rdb) {
db::LayoutToNetlist *l2ndb = view ()->get_l2ndb (m_l2n_index);
if (l2ndb) {
// prepare and open the file dialog
lay::FileDialog save_dialog (this, tl::to_string (QObject::tr ("Save Net Database")), "KLayout RDB files (*.lyrdb)");
std::string fn (rdb->filename ());
lay::FileDialog save_dialog (this, tl::to_string (QObject::tr ("Save Netlist Database")), "KLayout L2N DB files (*.l2n)");
std::string fn (l2ndb->filename ());
if (save_dialog.get_save (fn)) {
rdb->save (fn);
rdb->reset_modified ();
l2ndb->save (fn, true);
}
}
}
#endif
END_PROTECTED
}
@ -279,20 +232,18 @@ NetlistBrowserDialog::reload_clicked ()
{
BEGIN_PROTECTED
#if 0 // @@@
if (m_l2n_index < int (view ()->num_rdbs ()) && m_l2n_index >= 0) {
if (m_l2n_index < int (view ()->num_l2ndbs ()) && m_l2n_index >= 0) {
rdb::Database *rdb = view ()->get_rdb (m_l2n_index);
if (rdb && ! rdb->filename ().empty ()) {
db::LayoutToNetlist *l2ndb = view ()->get_l2ndb (m_l2n_index);
if (l2ndb && ! l2ndb->filename ().empty ()) {
browser_frame->set_rdb (0);
rdb->load (rdb->filename ());
browser_frame->set_rdb (rdb);
browser_frame->set_l2ndb (0);
l2ndb->load (l2ndb->filename ());
browser_frame->set_l2ndb (l2ndb);
}
}
#endif
END_PROTECTED
}
@ -302,27 +253,30 @@ NetlistBrowserDialog::open_clicked ()
{
BEGIN_PROTECTED
#if 0 // @@@
// collect the formats available ...
std::string fmts = tl::to_string (QObject::tr ("All files (*)"));
#if 0 // @@@ would be good to have this:
// collect the formats available ...
for (tl::Registrar<rdb::FormatDeclaration>::iterator rdr = tl::Registrar<rdb::FormatDeclaration>::begin (); rdr != tl::Registrar<rdb::FormatDeclaration>::end (); ++rdr) {
fmts += ";;" + rdr->file_format ();
}
#else
fmts += ";;L2N DB files (*.l2n)";
// @@@ TODO: add plain spice
#endif
// prepare and open the file dialog
lay::FileDialog open_dialog (this, tl::to_string (QObject::tr ("Marker Database File")), fmts);
lay::FileDialog open_dialog (this, tl::to_string (QObject::tr ("Netlist Database File")), fmts);
if (open_dialog.get_open (m_open_filename)) {
std::auto_ptr <rdb::Database> db (new rdb::Database ());
std::auto_ptr <db::LayoutToNetlist> db (new db::LayoutToNetlist ());
db->load (m_open_filename);
int l2n_index = view ()->add_rdb (db.release ());
l2n_cb->setCurrentIndex (l2n_index);
int l2n_index = view ()->add_l2ndb (db.release ());
l2ndb_cb->setCurrentIndex (l2n_index);
// it looks like the setCurrentIndex does not issue this signal:
l2ndb_index_changed (l2n_index);
}
#endif
END_PROTECTED
}
@ -334,23 +288,23 @@ NetlistBrowserDialog::configure (const std::string &name, const std::string &val
bool taken = true;
bool show_all = browser_frame->show_all ();
if (name == cfg_l2n_context_mode) {
if (name == cfg_l2ndb_context_mode) {
NetlistBrowserConfig::net_context_mode_type context = m_context;
NetlistBrowserContextModeConverter ().from_string (value, context);
need_update = lay::test_and_set (m_context, context);
} else if (name == cfg_l2n_show_all) {
} else if (name == cfg_l2ndb_show_all) {
tl::from_string (value, show_all);
} else if (name == cfg_l2n_window_mode) {
} else if (name == cfg_l2ndb_window_mode) {
NetlistBrowserConfig::net_window_type window = m_window;
NetlistBrowserWindowModeConverter ().from_string (value, window);
need_update = lay::test_and_set (m_window, window);
} else if (name == cfg_l2n_window_dim) {
} else if (name == cfg_l2ndb_window_dim) {
double wdim = m_window_dim;
tl::from_string (value, wdim);
@ -359,13 +313,13 @@ NetlistBrowserDialog::configure (const std::string &name, const std::string &val
need_update = true;
}
} else if (name == cfg_l2n_max_marker_count) {
} else if (name == cfg_l2ndb_max_marker_count) {
unsigned int mc = 0;
tl::from_string (value, mc);
need_update = lay::test_and_set (m_max_shape_count, mc);
} else if (name == cfg_l2n_highlight_color) {
} else if (name == cfg_l2ndb_highlight_color) {
QColor color;
if (! value.empty ()) {
@ -377,7 +331,7 @@ NetlistBrowserDialog::configure (const std::string &name, const std::string &val
need_update = true;
}
} else if (name == cfg_l2n_highlight_line_width) {
} else if (name == cfg_l2ndb_highlight_line_width) {
int lw = 0;
tl::from_string (value, lw);
@ -387,7 +341,7 @@ NetlistBrowserDialog::configure (const std::string &name, const std::string &val
need_update = true;
}
} else if (name == cfg_l2n_highlight_vertex_size) {
} else if (name == cfg_l2ndb_highlight_vertex_size) {
int vs = 0;
tl::from_string (value, vs);
@ -397,7 +351,7 @@ NetlistBrowserDialog::configure (const std::string &name, const std::string &val
need_update = true;
}
} else if (name == cfg_l2n_highlight_halo) {
} else if (name == cfg_l2ndb_highlight_halo) {
int halo = 0;
tl::from_string (value, halo);
@ -407,7 +361,7 @@ NetlistBrowserDialog::configure (const std::string &name, const std::string &val
need_update = true;
}
} else if (name == cfg_l2n_highlight_dither_pattern) {
} else if (name == cfg_l2ndb_highlight_dither_pattern) {
int dp = 0;
tl::from_string (value, dp);
@ -433,10 +387,9 @@ NetlistBrowserDialog::configure (const std::string &name, const std::string &val
}
void
NetlistBrowserDialog::load (int l2n_index, int cv_index)
NetlistBrowserDialog::load (int l2ndb_index, int cv_index)
{
#if 0 // @@@ TODO: implement
if (! view ()->get_rdb (l2n_index)) {
if (! view ()->get_l2ndb (l2ndb_index)) {
return;
}
@ -447,39 +400,36 @@ NetlistBrowserDialog::load (int l2n_index, int cv_index)
}
// set the new references (by name)
m_l2n_name = view ()->get_rdb (l2n_index)->name ();
m_l2ndb_name = view ()->get_l2ndb (l2ndb_index)->name ();
// force an update
rdbs_changed ();
l2ndbs_changed ();
cellviews_changed ();
activate ();
#endif
}
void
NetlistBrowserDialog::l2ndbs_changed ()
{
#if 0 // @@@ TODO: implement
int l2n_index = -1;
l2n_cb->clear ();
l2ndb_cb->clear ();
for (unsigned int i = 0; i < view ()->num_rdbs (); ++i) {
const rdb::Database *rdb = view ()->get_rdb (i);
l2n_cb->addItem (tl::to_qstring (rdb->name ()));
if (rdb->name () == m_l2n_name) {
for (unsigned int i = 0; i < view ()->num_l2ndbs (); ++i) {
const db::LayoutToNetlist *l2ndb = view ()->get_l2ndb (i);
l2ndb_cb->addItem (tl::to_qstring (l2ndb->name ()));
if (l2ndb->name () == m_l2ndb_name) {
l2n_index = i;
}
}
// force an update
m_l2n_index = l2n_index;
l2n_cb->setCurrentIndex (l2n_index);
l2ndb_cb->setCurrentIndex (l2n_index);
if (active ()) {
update_content ();
}
#endif
}
void
@ -532,10 +482,9 @@ NetlistBrowserDialog::cv_index_changed (int index)
void
NetlistBrowserDialog::activated ()
{
#if 0 // @@@ TODO: implement
std::string state;
if (lay::PluginRoot::instance ()) {
lay::PluginRoot::instance ()->config_get (cfg_l2n_window_state, state);
lay::PluginRoot::instance ()->config_get (cfg_l2ndb_window_state, state);
}
lay::restore_dialog_state (this, state);
@ -545,42 +494,40 @@ NetlistBrowserDialog::activated ()
m_cv_index = view ()->active_cellview_index ();
}
if (m_l2n_index < 0 && view ()->get_rdb (0) != 0) {
if (m_l2n_index < 0 && view ()->get_l2ndb (0) != 0) {
m_l2n_name = view ()->get_rdb (0)->name ();
rdbs_changed ();
m_l2ndb_name = view ()->get_l2ndb (0)->name ();
l2ndbs_changed ();
} else {
update_content ();
}
#endif
}
void
NetlistBrowserDialog::update_content ()
{
#if 0 // @@@ TODO: implement
rdb::Database *rdb = view ()->get_rdb (m_l2n_index);
db::LayoutToNetlist *l2ndb = view ()->get_l2ndb (m_l2n_index);
if (!rdb ) {
if (! l2ndb) {
central_stack->setCurrentIndex (1);
}
m_saveas_action->setEnabled (rdb != 0);
m_export_action->setEnabled (rdb != 0);
m_unload_action->setEnabled (rdb != 0);
m_unload_all_action->setEnabled (rdb != 0);
m_reload_action->setEnabled (rdb != 0);
m_saveas_action->setEnabled (l2ndb != 0);
m_export_action->setEnabled (l2ndb != 0);
m_unload_action->setEnabled (l2ndb != 0);
m_unload_all_action->setEnabled (l2ndb != 0);
m_reload_action->setEnabled (l2ndb != 0);
browser_frame->enable_updates (false); // Avoid building the internal lists several times ...
browser_frame->set_rdb (rdb);
browser_frame->set_max_marker_count (m_max_marker_count);
browser_frame->set_marker_style (m_marker_color, m_marker_line_width, m_marker_vertex_size, m_marker_halo, m_marker_dither_pattern);
browser_frame->set_l2ndb (l2ndb);
browser_frame->set_max_shape_count (m_max_shape_count);
browser_frame->set_highlight_style (m_marker_color, m_marker_line_width, m_marker_vertex_size, m_marker_halo, m_marker_dither_pattern);
browser_frame->set_window (m_window, m_window_dim, m_context);
browser_frame->set_view (view (), m_cv_index);
browser_frame->enable_updates (true);
if (rdb) {
if (l2ndb) {
// Note: it appears to be required to show the browser page after it has been configured.
// Otherwise the header gets messed up and the configuration is reset.
central_stack->setCurrentIndex (0);
@ -596,20 +543,19 @@ NetlistBrowserDialog::update_content ()
layout_cb->setCurrentIndex (m_cv_index);
}
if (l2n_cb->currentIndex () != m_l2n_index) {
l2n_cb->setCurrentIndex (m_l2n_index);
if (l2ndb_cb->currentIndex () != m_l2n_index) {
l2ndb_cb->setCurrentIndex (m_l2n_index);
}
#endif
}
void
NetlistBrowserDialog::deactivated ()
{
if (lay::PluginRoot::instance ()) {
lay::PluginRoot::instance ()->config_set (cfg_l2n_window_state, lay::save_dialog_state (this).c_str ());
lay::PluginRoot::instance ()->config_set (cfg_l2ndb_window_state, lay::save_dialog_state (this).c_str ());
}
// @@@ browser_frame->set_rdb (0);
browser_frame->set_l2ndb (0);
browser_frame->set_view (0, 0);
}

View File

@ -80,7 +80,7 @@ private:
int m_marker_dither_pattern;
std::string m_layout_name;
int m_cv_index;
std::string m_lay_name;
std::string m_l2ndb_name;
int m_l2n_index;
std::string m_open_filename;
QAction *m_open_action;

View File

@ -26,7 +26,7 @@
namespace lay
{
extern std::string cfg_l2n_show_all;
extern std::string cfg_l2ndb_show_all;
// ----------------------------------------------------------------------------------
// NetlistBrowserPage implementation
@ -122,7 +122,7 @@ void
NetlistBrowserPage::show_all_clicked ()
{
if (mp_plugin_root) {
mp_plugin_root->config_set (cfg_l2n_show_all, tl::to_string (m_show_all_action->isChecked ()));
mp_plugin_root->config_set (cfg_l2ndb_show_all, tl::to_string (m_show_all_action->isChecked ()));
}
}
@ -168,5 +168,68 @@ NetlistBrowserPage::update_highlights ()
#endif
}
void
NetlistBrowserPage::set_l2ndb (db::LayoutToNetlist *database)
{
#if 0 // @@@
if (database != mp_database) {
release_markers ();
mp_database = database;
QAbstractItemModel *tree_model = directory_tree->model ();
MarkerBrowserTreeViewModel *new_model = new MarkerBrowserTreeViewModel ();
new_model->set_show_empty_ones (true);
new_model->set_database (database);
directory_tree->setModel (new_model);
connect (directory_tree->selectionModel (), SIGNAL (selectionChanged (const QItemSelection &, const QItemSelection &)), this, SLOT (directory_selection_changed (const QItemSelection &, const QItemSelection &)));
directory_tree->header ()->setSortIndicatorShown (true);
cat_filter->setText (QString ());
cell_filter->setText (QString ());
set_hidden_rec (new_model, directory_tree, QModelIndex (), m_show_all, QString (), QString ());
if (tree_model) {
delete tree_model;
}
QAbstractItemModel *list_model = markers_list->model ();
MarkerBrowserListViewModel *new_list_model = new MarkerBrowserListViewModel ();
new_list_model->set_database (database);
markers_list->setModel (new_list_model);
connect (markers_list->selectionModel (), SIGNAL (selectionChanged (const QItemSelection &, const QItemSelection &)), this, SLOT (markers_selection_changed (const QItemSelection &, const QItemSelection &)));
connect (markers_list->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (markers_current_changed (const QModelIndex &, const QModelIndex &)));
if (list_model) {
delete list_model;
}
}
#endif
}
void
NetlistBrowserPage::enable_updates (bool f)
{
#if 0 // @@@
if (f != m_enable_updates) {
m_enable_updates = f;
if (f && m_update_needed) {
update_markers ();
update_info_text ();
}
m_update_needed = false;
}
#endif
}
}

View File

@ -32,17 +32,16 @@
class QAction;
namespace lay
namespace db
{
class LayoutView;
class DMarker;
class PluginRoot;
class LayoutToNetlist;
}
namespace lay
{
class Database;
class LayoutView;
class PluginRoot;
/**
* @brief A marker browser page
@ -78,6 +77,14 @@ public:
*/
void set_view (lay::LayoutView *view, unsigned int cv_index);
/**
* @brief Attach the page to a L2N DB
*
* To detach the page from any L2N DB, pass 0 for the pointer.
*/
void set_l2ndb (db::LayoutToNetlist *database);
/**
* @brief Set the window type and window dimensions
*/
@ -122,6 +129,11 @@ public:
*/
void show_all (bool f);
/**
* @brief Enable or disable updates
*/
void enable_updates (bool f);
private slots:
void show_all_clicked ();
void filter_changed ();