mirror of https://github.com/KLayout/klayout.git
Performance enhancement for instance sorting - done only on demand
This commit is contained in:
parent
e2fa88fcfb
commit
b7ee16b63f
|
|
@ -92,7 +92,8 @@ Cell::box_type Cell::ms_empty_box = Cell::box_type ();
|
|||
|
||||
Cell::Cell (cell_index_type ci, db::Layout &l)
|
||||
: db::Object (l.manager ()),
|
||||
m_cell_index (ci), mp_layout (&l), m_instances (this), m_prop_id (0), m_hier_levels (0), m_bbox_needs_update (false), m_ghost_cell (false),
|
||||
m_cell_index (ci), mp_layout (&l), m_instances (this), m_prop_id (0), m_hier_levels (0),
|
||||
m_instances_need_sort (false), m_instances_need_sort_box_tree (false), m_bbox_needs_update (false), m_ghost_cell (false),
|
||||
mp_last (0), mp_next (0)
|
||||
{
|
||||
// .. nothing yet
|
||||
|
|
@ -131,6 +132,10 @@ Cell::operator= (const Cell &d)
|
|||
m_prop_id = d.m_prop_id;
|
||||
m_bbox_needs_update = d.m_bbox_needs_update;
|
||||
|
||||
// need to update the instances inst_by_cell_index pointers
|
||||
m_instances_need_sort = true;
|
||||
m_instances_need_sort_box_tree = true;
|
||||
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
|
@ -613,6 +618,8 @@ Cell::invalidate_insts ()
|
|||
{
|
||||
mp_layout->invalidate_hier (); // HINT: must come before the change is done!
|
||||
mp_layout->invalidate_bboxes (std::numeric_limits<unsigned int>::max ());
|
||||
m_instances_need_sort = true;
|
||||
m_instances_need_sort_box_tree = true;
|
||||
m_bbox_needs_update = true;
|
||||
}
|
||||
|
||||
|
|
@ -700,7 +707,10 @@ Cell::clear_parent_insts (size_t sz)
|
|||
void
|
||||
Cell::sort_child_insts ()
|
||||
{
|
||||
m_instances.sort_child_insts ();
|
||||
if (m_instances_need_sort) {
|
||||
m_instances.sort_child_insts ();
|
||||
}
|
||||
m_instances_need_sort = false;
|
||||
}
|
||||
|
||||
std::pair<bool, db::pcell_id_type>
|
||||
|
|
@ -744,9 +754,12 @@ Cell::change_pcell_parameters (const instance_type &ref, const std::vector<tl::V
|
|||
}
|
||||
|
||||
void
|
||||
Cell::sort_inst_tree ()
|
||||
Cell::sort_inst_tree (bool force)
|
||||
{
|
||||
m_instances.sort_inst_tree (mp_layout);
|
||||
if (force || m_instances_need_sort_box_tree) {
|
||||
m_instances.sort_inst_tree (mp_layout);
|
||||
}
|
||||
m_instances_need_sort_box_tree = false;
|
||||
|
||||
// update the number of hierarchy levels
|
||||
m_hier_levels = count_hier_levels ();
|
||||
|
|
|
|||
|
|
@ -1076,7 +1076,9 @@ private:
|
|||
db::properties_id_type m_prop_id;
|
||||
|
||||
// packed fields
|
||||
unsigned int m_hier_levels : 29;
|
||||
unsigned int m_hier_levels : 28;
|
||||
bool m_instances_need_sort : 1;
|
||||
bool m_instances_need_sort_box_tree : 1;
|
||||
bool m_bbox_needs_update : 1;
|
||||
bool m_ghost_cell : 1;
|
||||
|
||||
|
|
@ -1147,9 +1149,9 @@ private:
|
|||
* This will sort the cell instance list. As a prerequesite
|
||||
* the cell's bounding boxes must have been computed.
|
||||
*
|
||||
* @param layers The maximum number of layers in the child cells
|
||||
* @param force Force sorting, even if not strictly needed
|
||||
*/
|
||||
void sort_inst_tree ();
|
||||
void sort_inst_tree (bool force);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1799,8 +1799,9 @@ Layout::do_update ()
|
|||
for (bottom_up_iterator c = begin_bottom_up (); c != end_bottom_up (); ++c) {
|
||||
++*pr;
|
||||
cell_type &cp (cell (*c));
|
||||
if (hier_dirty () || dirty_parents.find (*c) != dirty_parents.end ()) {
|
||||
cp.sort_inst_tree ();
|
||||
bool force_sort_inst_tree = dirty_parents.find (*c) != dirty_parents.end ();
|
||||
if (hier_dirty () || force_sort_inst_tree) {
|
||||
cp.sort_inst_tree (force_sort_inst_tree);
|
||||
}
|
||||
if (cp.layers () > layers) {
|
||||
layers = cp.layers ();
|
||||
|
|
|
|||
Loading…
Reference in New Issue