@@ -56,7 +56,7 @@ SaveLayoutOptions::operator= (const SaveLayoutOptions &d)
5656 m_format = d.m_format ;
5757 m_layers = d.m_layers ;
5858 m_cells = d.m_cells ;
59- m_implied_childred = d.m_implied_childred ;
59+ m_implied_children = d.m_implied_children ;
6060 m_all_layers = d.m_all_layers ;
6161 m_all_cells = d.m_all_cells ;
6262 m_dbu = d.m_dbu ;
@@ -189,7 +189,7 @@ SaveLayoutOptions::add_cell (db::cell_index_type cell_index)
189189{
190190 m_all_cells = false ;
191191 m_cells.insert (cell_index);
192- m_implied_childred .insert (cell_index);
192+ m_implied_children .insert (cell_index);
193193}
194194
195195void
@@ -204,15 +204,15 @@ SaveLayoutOptions::clear_cells ()
204204{
205205 m_all_cells = false ;
206206 m_cells.clear ();
207- m_implied_childred .clear ();
207+ m_implied_children .clear ();
208208}
209209
210210void
211211SaveLayoutOptions::select_all_cells ()
212212{
213213 m_all_cells = true ;
214214 m_cells.clear ();
215- m_implied_childred .clear ();
215+ m_implied_children .clear ();
216216}
217217
218218void
@@ -340,21 +340,75 @@ SaveLayoutOptions::get_valid_layers (const db::Layout &layout, std::vector <std:
340340 }
341341}
342342
343+ static void
344+ collect_called_cells_unskipped (db::cell_index_type ci, const db::Layout &layout, std::set<cell_index_type> &called)
345+ {
346+ const db::Cell &c = layout.cell (ci);
347+ if (c.can_skip_replica ()) {
348+ return ;
349+ }
350+
351+ for (auto cc = c.begin_child_cells (); ! cc.at_end (); ++cc) {
352+ if (called.find (*cc) == called.end () && layout.is_valid_cell_index (*cc)) {
353+ called.insert (*cc);
354+ collect_called_cells_unskipped (*cc, layout, called);
355+ }
356+ }
357+ }
358+
343359void
344360SaveLayoutOptions::get_cells (const db::Layout &layout, std::set <db::cell_index_type> &cells, const std::vector <std::pair <unsigned int , db::LayerProperties> > &valid_layers, bool require_unique_names) const
345361{
362+ bool has_context = m_write_context_info;
363+ for (tl::Registrar<db::StreamFormatDeclaration>::iterator fmt = tl::Registrar<db::StreamFormatDeclaration>::begin (); fmt != tl::Registrar<db::StreamFormatDeclaration>::end (); ++fmt) {
364+ if (fmt->format_name () == m_format) {
365+ if (! fmt->supports_context ()) {
366+ has_context = false ;
367+ }
368+ break ;
369+ }
370+ }
371+
346372 if (m_all_cells) {
347373
348- for (db::Layout::const_iterator cell = layout.begin (); cell != layout.end (); ++cell) {
349- cells.insert (cell->cell_index ());
374+ bool has_skipped_replica = false ;
375+
376+ // check if we have skipped replicas
377+ if (has_context) {
378+ for (db::Layout::const_iterator cell = layout.begin (); cell != layout.end () && ! has_skipped_replica; ++cell) {
379+ has_skipped_replica = cell->can_skip_replica ();
380+ }
381+ }
382+
383+ // with skipped replicas start again and skip child cells of such cells
384+ // unless they are needed in other places.
385+ if (has_skipped_replica) {
386+
387+ for (db::Layout::const_iterator cell = layout.begin (); cell != layout.end (); ++cell) {
388+ if (cell->is_top ()) {
389+ cells.insert (cell->cell_index ());
390+ collect_called_cells_unskipped (cell->cell_index (), layout, cells);
391+ }
392+ }
393+
394+ } else {
395+
396+ for (db::Layout::const_iterator cell = layout.begin (); cell != layout.end () && ! has_skipped_replica; ++cell) {
397+ cells.insert (cell->cell_index ());
398+ }
399+
350400 }
351401
352402 } else {
353403
354404 for (std::set <db::cell_index_type>::const_iterator c = m_cells.begin (); c != m_cells.end (); ++c) {
355405 cells.insert (*c);
356- if (m_implied_childred.find (*c) != m_implied_childred.end ()) {
357- layout.cell (*c).collect_called_cells (cells);
406+ if (m_implied_children.find (*c) != m_implied_children.end ()) {
407+ if (has_context) {
408+ collect_called_cells_unskipped (*c, layout, cells);
409+ } else {
410+ layout.cell (*c).collect_called_cells (cells);
411+ }
358412 }
359413 }
360414
0 commit comments