In Etesian, check for unplaced intermediate models with AB.

* Bug: In Etesian::EtesianEngine::toColoquinte(), when the master Cell of
    an instance has an abutment box, this instance *must* be placed so we
    can compute the positions of its own instances. Throw an error if it's
    not the case.
This commit is contained in:
Jean-Paul Chaput 2016-12-02 16:59:32 +01:00
parent d175e1b27a
commit d86527d384
2 changed files with 16 additions and 1 deletions

View File

@ -2,6 +2,7 @@
#include "coloquinte/rough_legalizers.hxx" #include "coloquinte/rough_legalizers.hxx"
#include "coloquinte/optimization_subproblems.hxx" #include "coloquinte/optimization_subproblems.hxx"
#include <iostream>
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
#include <cassert> #include <cassert>
@ -10,6 +11,9 @@
namespace coloquinte{ namespace coloquinte{
namespace gp{ namespace gp{
using std::cerr;
using std::endl;
namespace{ namespace{
const capacity_t default_density_mul = 256; const capacity_t default_density_mul = 256;
} }

View File

@ -477,6 +477,15 @@ namespace Etesian {
occurrence.makeInvalid(); occurrence.makeInvalid();
instance->slaveAbutmentBox(); instance->slaveAbutmentBox();
} }
if (not masterCell->getAbutmentBox().isEmpty()
and ( (instance->getPlacementStatus() != Instance::PlacementStatus::PLACED)
or (instance->getPlacementStatus() != Instance::PlacementStatus::FIXED ) ) ) {
throw Error( "EtesianEngine::toColoquinte(): Non-leaf instance \"%s\" of \"%s\" has an abutment box but is *not* placed."
, getString(instance ->getName()).c_str()
, getString(masterCell->getName()).c_str()
);
}
} }
UpdateSession::close(); UpdateSession::close();
@ -590,7 +599,9 @@ namespace Etesian {
} }
void EtesianEngine::preplace (){
void EtesianEngine::preplace ()
{
using namespace coloquinte::gp; using namespace coloquinte::gp;
// Perform a very quick legalization pass // Perform a very quick legalization pass