WIP: moved hierarchical processor into db.

This commit is contained in:
Matthias Koefferlein
2018-11-15 23:41:44 +01:00
parent 04256a2753
commit f29fd3dfc6
26 changed files with 27 additions and 516 deletions
+6 -2
View File
@@ -137,7 +137,9 @@ SOURCES = \
dbOriginalLayerEdgePairs.cc \
dbEdgePairsDelegate.cc \
dbDeepShapeStore.cc \
dbHierarchyBuilder.cc
dbHierarchyBuilder.cc \
dbLocalOperation.cc \
dbHierProcessor.cc
HEADERS = \
dbArray.h \
@@ -244,7 +246,9 @@ HEADERS = \
dbOriginalLayerEdgePairs.h \
dbEdgePairsDelegate.h \
dbDeepShapeStore.h \
dbHierarchyBuilder.h
dbHierarchyBuilder.h \
dbLocalOperation.h \
dbHierProcessor.h
!equals(HAVE_QT, "0") {
@@ -25,8 +25,9 @@
#ifndef HDR_dbHierProcessor
#define HDR_dbHierProcessor
#include "dbCommon.h"
#include "dbLayout.h"
#include "dbPluginCommon.h"
#include "dbLocalOperation.h"
#include "tlThreadedWorkers.h"
@@ -36,9 +37,9 @@
#include <unordered_map>
#include <unordered_set>
// @@@ should go into dbHash.h
#include "dbHash.h"
// @@@ should go into dbHash.h
namespace std
{
template <class C>
@@ -82,7 +83,7 @@ class LocalProcessorCellContext;
class LocalProcessorContexts;
// TODO: move this somewhere else?
class DB_PLUGIN_PUBLIC ShapeInteractions
class DB_PUBLIC ShapeInteractions
{
public:
typedef std::unordered_map<unsigned int, std::vector<unsigned int> > container;
@@ -120,7 +121,7 @@ private:
};
// TODO: should be hidden (private data?)
struct DB_PLUGIN_PUBLIC LocalProcessorCellDrop
struct DB_PUBLIC LocalProcessorCellDrop
{
LocalProcessorCellDrop (db::LocalProcessorCellContext *_parent_context, db::Cell *_parent, const db::ICplxTrans &_cell_inst)
: parent_context (_parent_context), parent (_parent), cell_inst (_cell_inst)
@@ -134,7 +135,7 @@ struct DB_PLUGIN_PUBLIC LocalProcessorCellDrop
};
// TODO: should be hidden (private data?)
class DB_PLUGIN_PUBLIC LocalProcessorCellContext
class DB_PUBLIC LocalProcessorCellContext
{
public:
typedef std::pair<const db::Cell *, db::ICplxTrans> parent_inst_type;
@@ -170,7 +171,7 @@ private:
tl::Mutex m_lock;
};
class DB_PLUGIN_PUBLIC LocalProcessorCellContexts
class DB_PUBLIC LocalProcessorCellContexts
{
public:
typedef std::pair<std::unordered_set<CellInstArray>, std::unordered_set<db::PolygonRef> > key_type;
@@ -199,7 +200,7 @@ private:
std::unordered_map<key_type, db::LocalProcessorCellContext> m_contexts;
};
class DB_PLUGIN_PUBLIC LocalProcessorContexts
class DB_PUBLIC LocalProcessorContexts
{
public:
typedef std::unordered_map<db::Cell *, LocalProcessorCellContexts> contexts_per_cell_type;
@@ -271,7 +272,7 @@ private:
mutable tl::Mutex m_lock;
};
class DB_PLUGIN_PUBLIC LocalProcessorContextComputationTask
class DB_PUBLIC LocalProcessorContextComputationTask
: public tl::Task
{
public:
@@ -290,7 +291,7 @@ private:
db::Coord m_dist;
};
class DB_PLUGIN_PUBLIC LocalProcessorContextComputationWorker
class DB_PUBLIC LocalProcessorContextComputationWorker
: public tl::Worker
{
public:
@@ -306,7 +307,7 @@ public:
}
};
class DB_PLUGIN_PUBLIC LocalProcessorResultComputationTask
class DB_PUBLIC LocalProcessorResultComputationTask
: public tl::Task
{
public:
@@ -322,7 +323,7 @@ private:
unsigned int m_output_layer;
};
class DB_PLUGIN_PUBLIC LocalProcessorResultComputationWorker
class DB_PUBLIC LocalProcessorResultComputationWorker
: public tl::Worker
{
public:
@@ -338,7 +339,7 @@ public:
}
};
class DB_PLUGIN_PUBLIC LocalProcessor
class DB_PUBLIC LocalProcessor
{
public:
LocalProcessor (db::Layout *layout, db::Cell *top);
@@ -25,8 +25,9 @@
#ifndef HDR_dbLocalOperation
#define HDR_dbLocalOperation
#include "dbCommon.h"
#include "dbLayout.h"
#include "dbPluginCommon.h"
#include <unordered_map>
#include <unordered_set>
@@ -48,7 +49,7 @@ class ShapeInteractions;
* This class implements the actual operation. It receives a
* cluster of subject shapes vs. corresponding intruder shapes.
*/
class DB_PLUGIN_PUBLIC LocalOperation
class DB_PUBLIC LocalOperation
{
public:
/**
@@ -109,7 +110,7 @@ public:
/**
* @brief Implements a boolean AND or NOT operation
*/
class DB_PLUGIN_PUBLIC BoolAndOrNotLocalOperation
class DB_PUBLIC BoolAndOrNotLocalOperation
: public LocalOperation
{
public:
@@ -128,7 +129,7 @@ private:
* With a given wrap_count, the result will only contains shapes where
* the original shapes overlap at least "wrap_count" times.
*/
class DB_PLUGIN_PUBLIC SelfOverlapMergeLocalOperation
class DB_PUBLIC SelfOverlapMergeLocalOperation
: public LocalOperation
{
public:
@@ -30,7 +30,7 @@
static std::string testdata (const std::string &fn)
{
return tl::testsrc () + "/src/plugins/tools/netx/testdata/" + fn;
return tl::testsrc () + "/testdata/algo/" + fn;
}
enum TestMode
+2 -1
View File
@@ -54,7 +54,8 @@ SOURCES = \
dbLoadLayoutOptionsTests.cc \
dbSaveLayoutOptionsTests.cc \
dbHierarchyBuilderTests.cc \
dbRecursiveShapeIteratorTests.cc
dbRecursiveShapeIteratorTests.cc \
dbHierProcessorTests.cc
INCLUDEPATH += $$TL_INC $$DB_INC $$GSI_INC
DEPENDPATH += $$TL_INC $$DB_INC $$GSI_INC
@@ -1,177 +0,0 @@
/*
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 "dbNetExtractor.h"
#include "dbHierProcessor.h"
#include "dbLayoutUtils.h"
#include "dbCellMapping.h"
#include "dbPolygonTools.h"
#include "dbBoxScanner.h"
#include "dbRecursiveShapeIterator.h"
#include "dbBoxConvert.h"
#include "tlLog.h"
namespace db
{
NetExtractor::NetExtractor()
: mp_orig_layout (0), mp_layout (0), mp_top_cell (0), m_nthreads (0)
{
// @@@
}
NetExtractor::~NetExtractor ()
{
delete mp_layout;
mp_layout = 0;
mp_top_cell = 0;
}
void
NetExtractor::set_threads (unsigned int nthreads)
{
m_nthreads = nthreads;
}
void
NetExtractor::open (const db::Layout &orig_layout, cell_index_type orig_top_cell)
{
tl::SelfTimer timer (tl::verbosity () >= 31, tl::to_string (tr ("Open layout")));
delete mp_layout;
mp_orig_layout = &orig_layout;
mp_layout = new db::Layout ();
mp_layout->dbu (orig_layout.dbu ());
mp_top_cell = &mp_layout->cell (mp_layout->add_cell (orig_layout.cell_name (orig_top_cell)));
// copy hierarchy
m_cm.clear ();
m_cm.create_from_names_full (*mp_layout, mp_top_cell->cell_index (), orig_layout, orig_top_cell);
}
void
NetExtractor::output (NetLayer a, const LayerProperties &lp)
{
mp_layout->set_properties (a.layer_index (), lp);
}
static double area_ratio (const db::Polygon &poly)
{
return double (poly.box ().area ()) / double (poly.area ());
}
static void split_polygon_into (const db::Polygon &poly, db::Shapes &dest, size_t max_points, double max_area_ratio)
{
size_t npoints = 0;
for (unsigned int c = 0; c < poly.holes () + 1; ++c) {
npoints += poly.contour (c).size ();
}
if (npoints > max_points || area_ratio (poly) > max_area_ratio) {
std::vector <db::Polygon> split_polygons;
db::split_polygon (poly, split_polygons);
for (std::vector <db::Polygon>::const_iterator sp = split_polygons.begin (); sp != split_polygons.end (); ++sp) {
split_polygon_into (*sp, dest, max_points, max_area_ratio);
}
} else {
dest.insert (db::PolygonRef (poly, dest.layout ()->shape_repository ()));
}
}
NetLayer
NetExtractor::load (unsigned int layer_index)
{
tl::SelfTimer timer (tl::verbosity () >= 31, tl::to_string (tr ("Loading layer ")) + mp_orig_layout->get_properties (layer_index).to_string ());
const double max_area_ratio = 3.0;
const size_t max_points = 16;
NetLayer lt (mp_layout->insert_layer ());
mp_layout->set_properties (lt.layer_index(), mp_orig_layout->get_properties (layer_index));
for (db::Layout::const_iterator c = mp_orig_layout->begin (); c != mp_layout->end (); ++c) {
if (m_cm.has_mapping (c->cell_index ())) {
db::cell_index_type ct = m_cm.cell_mapping (c->cell_index ());
db::Shapes &dest_shapes = mp_layout->cell (ct).shapes (lt.layer_index());
const db::Shapes &orig_shapes = c->shapes (layer_index);
for (db::Shapes::shape_iterator s = orig_shapes.begin (db::ShapeIterator::Polygons | db::ShapeIterator::Paths | db::ShapeIterator::Boxes); ! s.at_end (); ++s) {
// @@@ TODO: cache splitting and path to polygon conversion
db::Polygon poly;
s->polygon (poly);
split_polygon_into (poly, dest_shapes, max_points, max_area_ratio);
}
}
}
return lt;
}
NetLayer
NetExtractor::bool_and (NetLayer a, NetLayer b)
{
return and_or_not (a, b, true);
}
NetLayer
NetExtractor::bool_not (NetLayer a, NetLayer b)
{
return and_or_not (a, b, false);
}
NetLayer
NetExtractor::and_or_not (NetLayer a, NetLayer b, bool is_and)
{
unsigned int lout = mp_layout->insert_layer ();
db::BoolAndOrNotLocalOperation op (is_and);
db::LocalProcessor proc (mp_layout, mp_top_cell);
proc.set_threads (m_nthreads);
proc.run (&op, a.layer_index (), b.layer_index (), lout);
return NetLayer (lout);
}
db::Layout *
NetExtractor::layout_copy () const
{
tl_assert (mp_layout != 0);
return new db::Layout (*mp_layout);
}
}
@@ -1,120 +0,0 @@
/*
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_dbNetExtractor
#define HDR_dbNetExtractor
#include "dbPluginCommon.h"
#include "dbLayout.h"
#include "dbCellMapping.h"
#include "tlTypeTraits.h"
namespace db
{
class NetLayer
{
public:
NetLayer (unsigned int index)
: m_layer_index (index)
{
// .. nothing yet ..
}
unsigned int layer_index () const
{
return m_layer_index;
}
private:
unsigned int m_layer_index;
};
/**
* @brief The net extractor
*
* ...
*/
class DB_PLUGIN_PUBLIC NetExtractor
{
public:
/**
* @brief Constructs a net extractor
*/
NetExtractor ();
~NetExtractor ();
// @@@
void open (const db::Layout &orig_layout, db::cell_index_type orig_top_cell);
NetLayer load (unsigned int layer_index);
NetLayer bool_and (NetLayer a, NetLayer b);
NetLayer bool_not (NetLayer a, NetLayer b);
void output (NetLayer a, const db::LayerProperties &lp);
db::Layout *layout_copy () const;
void set_threads (unsigned int nthreads);
unsigned int threads () const
{
return m_nthreads;
}
private:
// no copying
NetExtractor (const db::NetExtractor &);
NetExtractor &operator= (const db::NetExtractor &);
NetLayer and_or_not (NetLayer a, NetLayer b, bool is_and);
// @@@
const db::Layout *mp_orig_layout; // @@@ should be a smart pointer
db::Layout *mp_layout;
db::Cell *mp_top_cell;
db::CellMapping m_cm;
unsigned int m_nthreads;
};
}
namespace tl
{
template <>
struct type_traits<db::NetLayer> : public tl::type_traits<void>
{
// mark "NetLayer" as not having a default ctor
typedef tl::false_tag has_default_constructor;
};
template <>
struct type_traits<db::NetExtractor> : public tl::type_traits<void>
{
// mark "NetExtractor" as not copyable
typedef tl::false_tag has_copy_constructor;
};
}
#endif
@@ -1,29 +0,0 @@
/*
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
*/
namespace db
{
// @@@
}
@@ -1,18 +0,0 @@
TARGET = netx
DESTDIR = $$OUT_PWD/../../../../db_plugins
include($$PWD/../../../db_plugin.pri)
HEADERS = \
dbNetExtractor.h \
dbHierProcessor.h \
dbLocalOperation.h
SOURCES = \
dbNetExtractor.cc \
dbHierProcessor.cc \
dbNetExtractorPlugin.cc \
gsiDeclDbNetExtractor.cc \
dbLocalOperation.cc
@@ -1,90 +0,0 @@
/*
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 "dbNetExtractor.h"
#include "gsiDecl.h"
namespace gsi
{
gsi::Class<db::NetLayer> decl_NetLayer ("db", "NetLayer",
gsi::method ("layer_index", &db::NetLayer::layer_index,
"@@@"
),
"@brief The net extractor\n"
"\n"
"This class has been introduced in version 0.26."
);
void open2 (db::NetExtractor *ex, const db::Layout *orig_layout, const db::Cell *cell)
{
ex->open (*orig_layout, cell->cell_index ());
}
void output1 (db::NetExtractor *ex, const db::NetLayer &nl, const db::LayerProperties &lp)
{
ex->output (nl, lp);
}
void output2 (db::NetExtractor *ex, const db::NetLayer &nl, int layer, int datatype, const std::string &name)
{
ex->output (nl, db::LayerProperties (layer, datatype, name));
}
gsi::Class<db::NetExtractor> decl_NetNetExtractor ("db", "NetExtractor",
gsi::method ("open", &db::NetExtractor::open, gsi::arg ("orig_layout"), gsi::arg ("orig_top_cell_index"),
"@@@"
) +
gsi::method ("threads=", &db::NetExtractor::set_threads, gsi::arg ("nthreads"),
"@@@"
) +
gsi::method ("threads", &db::NetExtractor::threads,
"@@@"
) +
gsi::method_ext ("open", &open2, gsi::arg ("orig_layout"), gsi::arg ("orig_top_cell"),
"@@@"
) +
gsi::method_ext ("output", &output1, gsi::arg ("net_layer"), gsi::arg ("layer"),
"@@@"
) +
gsi::method_ext ("output", &output2, gsi::arg ("net_layer"), gsi::arg ("layer"), gsi::arg ("datatype"), gsi::arg ("name", std::string ()),
"@@@"
) +
gsi::method ("load", &db::NetExtractor::load, gsi::arg ("layer_index"),
"@@@"
) +
gsi::method ("bool_and", &db::NetExtractor::bool_and, gsi::arg ("a"), gsi::arg ("b"),
"@@@"
) +
gsi::method ("bool_not", &db::NetExtractor::bool_not, gsi::arg ("a"), gsi::arg ("b"),
"@@@"
) +
gsi::factory ("layout_copy", &db::NetExtractor::layout_copy,
"@@@"
),
"@brief The net extractor\n"
"\n"
"This class has been introduced in version 0.26."
);
}
-11
View File
@@ -1,11 +0,0 @@
TEMPLATE = subdirs
SUBDIRS = db_plugin unit_tests
unit_tests.depends += db_plugin
#!equals(HAVE_QT, "0") {
# SUBDIRS += lay_plugin
# lay_plugin.depends += db_plugin
#}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,30 +0,0 @@
/*
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 "tlUnitTest.h"
TEST(1)
{
// .. nothing yet ..
}
@@ -1,21 +0,0 @@
DESTDIR_UT = $$OUT_PWD/../../../..
TARGET = net_tracer_tests
include($$PWD/../../../../lib_ut.pri)
SOURCES = \
dbNetExtractorTests.cc \
dbHierProcessorTests.cc \
INCLUDEPATH += $$LAY_INC $$TL_INC $$DB_INC $$GSI_INC $$PWD/../db_plugin $$PWD/../../../common
DEPENDPATH += $$LAY_INC $$TL_INC $$DB_INC $$GSI_INC $$PWD/../db_plugin $$PWD/../../../common
LIBS += -L$$DESTDIR_UT -lklayout_db -lklayout_tl -lklayout_gsi
# This makes the test pull the mebes library for testing (not installed)
PLUGINPATH = $$OUT_PWD/../../../../db_plugins
QMAKE_RPATHDIR += $$PLUGINPATH
LIBS += -L$$PLUGINPATH -lnetx