In Etesian, do not reset the placement if we are using a sub-block.

* Bug: In EtesianEngine::place(), reset the placement *only* if we are
    *not* placing a sub-block *and* the top cell abutment box is empty.
* Bug: In EtesianEngine::place(), set the instance placement status of
    all intermediate instances to PLACED, so the AP driver will save
    them (we were having partially saved layout when using hierarchical
    designs).
* Bug: In EtesianEngine::resetPlacement(), reset the PLACED flag and
    the abutment box on the top cell or sub-block to be placed.
This commit is contained in:
Jean-Paul Chaput 2020-07-14 19:51:01 +02:00
parent e4041d5e26
commit 8ce2a7e318
2 changed files with 13 additions and 6 deletions

View File

@ -519,8 +519,8 @@ namespace Etesian {
// if (not getBlockCell()->getAbutmentBox().isEmpty() ) // if (not getBlockCell()->getAbutmentBox().isEmpty() )
// setFixedAbHeight( getBlockCell()->getAbutmentBox().getHeight() ); // setFixedAbHeight( getBlockCell()->getAbutmentBox().getHeight() );
// getBlockCell()->setAbutmentBox( Box() ); getBlockCell()->setAbutmentBox( Box() );
// getBlockCell()->resetFlags( Cell::Flags::Placed ); getBlockCell()->resetFlags( Cell::Flags::Placed );
UpdateSession::close(); UpdateSession::close();
dots.finish( Dots::Reset ); dots.finish( Dots::Reset );
@ -1002,8 +1002,10 @@ namespace Etesian {
getConfiguration()->print( getCell() ); getConfiguration()->print( getCell() );
adjustSliceHeight(); adjustSliceHeight();
resetPlacement(); if ( (getCell() == getBlockCell()) and getCell()->getAbutmentBox().isEmpty() ) {
if (getBlockCell()->getAbutmentBox().isEmpty()) setDefaultAb(); resetPlacement();
setDefaultAb();
}
findYSpin(); findYSpin();
toColoquinte(); toColoquinte();
@ -1020,7 +1022,6 @@ namespace Etesian {
preplace(); preplace();
float_t minPenaltyIncrease, maxPenaltyIncrease, targetImprovement; float_t minPenaltyIncrease, maxPenaltyIncrease, targetImprovement;
int detailedIterations, detailedEffort; int detailedIterations, detailedEffort;
unsigned globalOptions=0, detailedOptions=0; unsigned globalOptions=0, detailedOptions=0;
@ -1085,9 +1086,14 @@ namespace Etesian {
rp->invalidate(); rp->invalidate();
} }
} }
UpdateSession::close();
getCell()->setFlags( Cell::Flags::Placed ); getCell()->setFlags( Cell::Flags::Placed );
for ( Occurrence occurrence : getCell()->getNonTerminalNetlistInstanceOccurrences(getBlockInstance()) ) {
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
if (instance->getPlacementStatus() == Instance::PlacementStatus::UNPLACED)
instance->setPlacementStatus( Instance::PlacementStatus::PLACED );
}
UpdateSession::close();
} }

View File

@ -419,6 +419,7 @@ namespace Katana {
return NULL; return NULL;
} }
void KatanaEngine::openSession () void KatanaEngine::openSession ()
{ Session::_open(this); } { Session::_open(this); }