Do not for materialization in RoutingPad::setExternalComponent().

* Bug: In RoutingPad::setExternalComponent(), we where always forcing
    the materialization of the RoutingPad (QuadTree insertion). Now
    respect the Go::enableAutoMaterialization() state.
      Forcing the materialization is equivalent to having an
    UpdateSession. So when creating large amount of RoutingPads it did
    result in huge slow down, like in HFNS algorithms.
      With this modification we go down from 6h+ to 4m for the ls180.
This commit is contained in:
Jean-Paul Chaput 2021-03-23 17:05:18 +01:00
parent 1b5327313a
commit cfcd4b7115
1 changed files with 15 additions and 9 deletions

View File

@ -295,19 +295,25 @@ namespace Hurricane {
void RoutingPad::setExternalComponent ( Component* component ) void RoutingPad::setExternalComponent ( Component* component )
{ {
if ( isMaterialized() ) invalidate(false); if (isMaterialized()) invalidate( false );
Occurrence plugOccurrence = getPlugOccurrence(); Occurrence plugOccurrence = getPlugOccurrence();
Plug* plug = static_cast<Plug*>(plugOccurrence.getEntity()); Plug* plug = static_cast<Plug*>( plugOccurrence.getEntity() );
if ( plug->getMasterNet() != component->getNet() ) if (plug->getMasterNet() != component->getNet())
throw Error("Cannot Set External Component to Routing Pad : Inconsistant Net"); throw Error( "RoutingPad::setExternalComponent(): Cannot set external Component of RoutingPadn, inconsistant net.\n"
" * RoutingPad:%s\n"
" * Component:%s"
, getString(getNet()).c_str()
, getString(component).c_str()
);
_occurrence.getMasterCell()->_removeSlaveEntity(_occurrence.getEntity(),this); _occurrence.getMasterCell()->_removeSlaveEntity( _occurrence.getEntity(), this );
_occurrence = Occurrence(component,Path(plugOccurrence.getPath(),plug->getInstance())); _occurrence = Occurrence( component, Path(plugOccurrence.getPath(),plug->getInstance()) );
_occurrence.getMasterCell()->_addSlaveEntity( _occurrence.getEntity(), this );
_occurrence.getMasterCell()->_addSlaveEntity(_occurrence.getEntity(),this); if (not isMaterialized() and not Go::autoMaterializationIsDisabled())
//if (not isMaterialized())
if (!isMaterialized()) materialize(); materialize();
} }