@@ -402,11 +402,8 @@ void UnbufferMove::removeBuffer(Instance* buffer)
402402 lib_cell->name (),
403403 db_network_->name (out_net));
404404
405- // Disconnect buffer input/output pins
406405 odb::dbNet* db_survivor = db_network_->staToDb (survivor);
407406 odb::dbNet* db_removed = db_network_->staToDb (removed);
408- sta_->disconnectPin (in_pin);
409- sta_->disconnectPin (out_pin);
410407
411408 // If removed net name is higher in hierarchy, rename survivor with it.
412409 // This must be done before mergeNet because db_removed is destroyed inside
@@ -420,31 +417,45 @@ void UnbufferMove::removeBuffer(Instance* buffer)
420417 }
421418 }
422419
423- // Merge hier net
424- // - mergeModNet() should be done before mergeNet() because
425- // mergeNet() can involve the hierarchical net traversal during the merge
426- // operation.
427- if (survivor_modnet != nullptr && removed_modnet != nullptr ) {
428- // Merge two hier nets
429- survivor_modnet->mergeModNet (removed_modnet);
430- } else if (survivor_modnet != nullptr ) {
431- // If there is a single modnet, copy terminals of the flat net to be removed
432- survivor_modnet->connectTermsOf (db_removed);
433- } else if (removed_modnet != nullptr ) {
434- // If there is a single modnet, it should survive.
435- survivor_modnet = removed_modnet;
436- removed_modnet = nullptr ;
437-
438- // Copy terminals of the survivor flat net
439- survivor_modnet->connectTermsOf (db_survivor);
440-
441- // survivor_modnet should be renamed later.
442- new_modnet_name
443- = db_survivor->getBlock ()->getBaseName (db_survivor->getName ().c_str ());
444- }
420+ // jk: behavior change point3
421+ if (db_network_->hasHierarchy () == false ) {
422+ if (db_removed) {
423+ db_survivor->mergeNet (db_removed);
424+ }
425+ sta_->disconnectPin (in_pin);
426+ sta_->disconnectPin (out_pin);
427+ } else {
428+ // Disconnect buffer input/output pins
429+ sta_->disconnectPin (in_pin);
430+ sta_->disconnectPin (out_pin);
431+
432+ // Merge hier net
433+ // - mergeModNet() should be done before mergeNet() because
434+ // mergeNet() can involve the hierarchical net traversal during the merge
435+ // operation.
436+ if (survivor_modnet != nullptr && removed_modnet != nullptr ) {
437+ // Merge two hier nets
438+ survivor_modnet->mergeModNet (removed_modnet);
439+ } else if (survivor_modnet != nullptr ) {
440+ // If there is a single modnet, copy terminals of the flat net to be
441+ // removed
442+ survivor_modnet->connectTermsOf (db_removed);
443+ } else if (removed_modnet != nullptr ) {
444+ // If there is a single modnet, it should survive.
445+ survivor_modnet = removed_modnet;
446+ removed_modnet = nullptr ;
447+
448+ // Copy terminals of the survivor flat net
449+ survivor_modnet->connectTermsOf (db_survivor);
450+
451+ // survivor_modnet should be renamed later.
452+ new_modnet_name = db_survivor->getBlock ()->getBaseName (
453+ db_survivor->getName ().c_str ());
454+ }
445455
446- // Merge flat net
447- db_survivor->mergeNet (db_removed);
456+ // Merge flat net
457+ db_survivor->mergeNet (db_removed);
458+ }
448459
449460 // Remove buffer
450461 sta_->deleteInstance (buffer);
0 commit comments