mirror of https://github.com/KLayout/klayout.git
WIP: trying to reduce the number of DSS-internal cell mappings by caching cell maps
This commit is contained in:
parent
455c40ced6
commit
902375cc4d
|
|
@ -554,6 +554,7 @@ bool run_deep_xor (const XORData &xor_data)
|
||||||
{
|
{
|
||||||
db::DeepShapeStore dss;
|
db::DeepShapeStore dss;
|
||||||
dss.set_threads (xor_data.threads);
|
dss.set_threads (xor_data.threads);
|
||||||
|
dss.set_keep_layouts (true); // avoids excessive cell mapping
|
||||||
|
|
||||||
double dbu = std::min (xor_data.layout_a->dbu (), xor_data.layout_b->dbu ());
|
double dbu = std::min (xor_data.layout_a->dbu (), xor_data.layout_b->dbu ());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -154,17 +154,25 @@ DeepLayer::add_from (const DeepLayer &dl)
|
||||||
db::cell_index_type source_cell = dl.initial_cell ().cell_index ();
|
db::cell_index_type source_cell = dl.initial_cell ().cell_index ();
|
||||||
const db::Layout *source_layout = &dl.layout ();
|
const db::Layout *source_layout = &dl.layout ();
|
||||||
|
|
||||||
db::CellMapping cm;
|
// create or reuse a layout mapping
|
||||||
cm.create_from_geometry_full (*into_layout, into_cell, *source_layout, source_cell);
|
|
||||||
|
|
||||||
// Actually copy the shapes
|
const db::CellMapping *cell_mapping = 0;
|
||||||
|
db::CellMapping cm;
|
||||||
|
if (store () == dl.store ()) {
|
||||||
|
cell_mapping = &const_cast<db::DeepShapeStore *> (mp_store.get ())->internal_cell_mapping (layout_index (), dl.layout_index ());
|
||||||
|
} else {
|
||||||
|
cm.create_from_geometry_full (*into_layout, into_cell, *source_layout, source_cell);
|
||||||
|
cell_mapping = &cm;
|
||||||
|
}
|
||||||
|
|
||||||
|
// actually copy the shapes
|
||||||
|
|
||||||
std::map<unsigned int, unsigned int> lm;
|
std::map<unsigned int, unsigned int> lm;
|
||||||
lm.insert (std::make_pair (dl.layer (), layer ()));
|
lm.insert (std::make_pair (dl.layer (), layer ()));
|
||||||
|
|
||||||
std::vector <db::cell_index_type> source_cells;
|
std::vector <db::cell_index_type> source_cells;
|
||||||
source_cells.push_back (source_cell);
|
source_cells.push_back (source_cell);
|
||||||
db::copy_shapes (*into_layout, *source_layout, db::ICplxTrans (), source_cells, cm.table (), lm);
|
db::copy_shapes (*into_layout, *source_layout, db::ICplxTrans (), source_cells, cell_mapping->table (), lm);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -418,11 +426,13 @@ static unsigned int init_layer (db::Layout &layout, const db::RecursiveShapeIter
|
||||||
}
|
}
|
||||||
|
|
||||||
DeepShapeStore::DeepShapeStore ()
|
DeepShapeStore::DeepShapeStore ()
|
||||||
|
: m_keep_layouts (false)
|
||||||
{
|
{
|
||||||
++s_instance_count;
|
++s_instance_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
DeepShapeStore::DeepShapeStore (const std::string &topcell_name, double dbu)
|
DeepShapeStore::DeepShapeStore (const std::string &topcell_name, double dbu)
|
||||||
|
: m_keep_layouts (false)
|
||||||
{
|
{
|
||||||
++s_instance_count;
|
++s_instance_count;
|
||||||
|
|
||||||
|
|
@ -711,6 +721,16 @@ db::Layout &DeepShapeStore::layout (unsigned int n)
|
||||||
return m_layouts [n]->layout;
|
return m_layouts [n]->layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int DeepShapeStore::layout_index (const db::Layout *layout) const
|
||||||
|
{
|
||||||
|
for (std::vector<LayoutHolder *>::const_iterator i = m_layouts.begin (); i != m_layouts.end (); ++i) {
|
||||||
|
if (&(*i)->layout == layout) {
|
||||||
|
return (unsigned int) (i - m_layouts.begin ());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tl_assert (false);
|
||||||
|
}
|
||||||
|
|
||||||
size_t DeepShapeStore::instance_count ()
|
size_t DeepShapeStore::instance_count ()
|
||||||
{
|
{
|
||||||
return s_instance_count;
|
return s_instance_count;
|
||||||
|
|
@ -743,7 +763,7 @@ void DeepShapeStore::remove_ref (unsigned int layout, unsigned int layer)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m_layouts[layout]->refs -= 1) <= 0) {
|
if ((m_layouts[layout]->refs -= 1) <= 0 && ! m_keep_layouts) {
|
||||||
delete m_layouts[layout];
|
delete m_layouts[layout];
|
||||||
m_layouts[layout] = 0;
|
m_layouts[layout] = 0;
|
||||||
clear_breakout_cells (layout);
|
clear_breakout_cells (layout);
|
||||||
|
|
@ -919,6 +939,7 @@ void
|
||||||
DeepShapeStore::invalidate_hier ()
|
DeepShapeStore::invalidate_hier ()
|
||||||
{
|
{
|
||||||
m_delivery_mapping_cache.clear ();
|
m_delivery_mapping_cache.clear ();
|
||||||
|
m_internal_mapping_cache.clear ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -934,6 +955,26 @@ DeepShapeStore::issue_variants (unsigned int layout_index, const std::map<db::ce
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const db::CellMapping &
|
||||||
|
DeepShapeStore::internal_cell_mapping (unsigned int from_layout_index, unsigned int into_layout_index)
|
||||||
|
{
|
||||||
|
std::map<std::pair<unsigned int, unsigned int>, db::CellMapping>::iterator cm = m_internal_mapping_cache.find (std::make_pair (from_layout_index, into_layout_index));
|
||||||
|
if (cm == m_internal_mapping_cache.end ()) {
|
||||||
|
|
||||||
|
cm = m_internal_mapping_cache.insert (std::make_pair (std::make_pair (from_layout_index, into_layout_index), db::CellMapping ())).first;
|
||||||
|
|
||||||
|
db::Layout &into_layout = layout (into_layout_index);
|
||||||
|
db::cell_index_type into_cell = initial_cell (into_layout_index).cell_index ();
|
||||||
|
const db::Layout &source_layout = layout (from_layout_index);
|
||||||
|
db::cell_index_type source_cell = initial_cell (from_layout_index).cell_index ();
|
||||||
|
|
||||||
|
cm->second.create_from_geometry_full (into_layout, into_cell, source_layout, source_cell);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return cm->second;
|
||||||
|
}
|
||||||
|
|
||||||
const db::CellMapping &
|
const db::CellMapping &
|
||||||
DeepShapeStore::cell_mapping_to_original (unsigned int layout_index, db::Layout *into_layout, db::cell_index_type into_cell, const std::set<db::cell_index_type> *excluded_cells, const std::set<db::cell_index_type> *included_cells)
|
DeepShapeStore::cell_mapping_to_original (unsigned int layout_index, db::Layout *into_layout, db::cell_index_type into_cell, const std::set<db::cell_index_type> *excluded_cells, const std::set<db::cell_index_type> *included_cells)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -339,6 +339,25 @@ public:
|
||||||
*/
|
*/
|
||||||
bool is_singular () const;
|
bool is_singular () const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets a value indicating whether to keep layouts
|
||||||
|
*
|
||||||
|
* If this value is set to true, layouts are not released when their reference count
|
||||||
|
* goes down to zero.
|
||||||
|
*/
|
||||||
|
void set_keep_layouts (bool f)
|
||||||
|
{
|
||||||
|
m_keep_layouts = f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets a value indicating whether to keep layouts
|
||||||
|
*/
|
||||||
|
bool keep_layouts () const
|
||||||
|
{
|
||||||
|
return m_keep_layouts;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Creates a new layer from a flat region (or the region is made flat)
|
* @brief Creates a new layer from a flat region (or the region is made flat)
|
||||||
*
|
*
|
||||||
|
|
@ -479,6 +498,11 @@ public:
|
||||||
*/
|
*/
|
||||||
const db::CellMapping &cell_mapping_to_original (unsigned int layout_index, db::Layout *into_layout, db::cell_index_type into_cell, const std::set<db::cell_index_type> *excluded_cells = 0, const std::set<db::cell_index_type> *included_cells = 0);
|
const db::CellMapping &cell_mapping_to_original (unsigned int layout_index, db::Layout *into_layout, db::cell_index_type into_cell, const std::set<db::cell_index_type> *excluded_cells = 0, const std::set<db::cell_index_type> *included_cells = 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the cell mapping from one internal layout to another
|
||||||
|
*/
|
||||||
|
const db::CellMapping &internal_cell_mapping (unsigned int from_layout_index, unsigned int into_layout_index);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Create cell variants from the given variant collector
|
* @brief Create cell variants from the given variant collector
|
||||||
*
|
*
|
||||||
|
|
@ -544,6 +568,11 @@ public:
|
||||||
*/
|
*/
|
||||||
db::Cell &initial_cell (unsigned int n);
|
db::Cell &initial_cell (unsigned int n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the layout index for a given internal layout
|
||||||
|
*/
|
||||||
|
unsigned int layout_index (const db::Layout *layout) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Gets the singular layout (const version)
|
* @brief Gets the singular layout (const version)
|
||||||
*
|
*
|
||||||
|
|
@ -752,6 +781,7 @@ private:
|
||||||
layout_map_type m_layout_map;
|
layout_map_type m_layout_map;
|
||||||
DeepShapeStoreState m_state;
|
DeepShapeStoreState m_state;
|
||||||
std::list<DeepShapeStoreState> m_state_stack;
|
std::list<DeepShapeStoreState> m_state_stack;
|
||||||
|
bool m_keep_layouts;
|
||||||
tl::Mutex m_lock;
|
tl::Mutex m_lock;
|
||||||
|
|
||||||
struct DeliveryMappingCacheKey
|
struct DeliveryMappingCacheKey
|
||||||
|
|
@ -781,6 +811,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
std::map<DeliveryMappingCacheKey, db::CellMapping> m_delivery_mapping_cache;
|
std::map<DeliveryMappingCacheKey, db::CellMapping> m_delivery_mapping_cache;
|
||||||
|
std::map<std::pair<unsigned int, unsigned int>, db::CellMapping> m_internal_mapping_cache;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class VarCollector>
|
template <class VarCollector>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue