Merge branch 'coloquinte2' into devel

This commit is contained in:
Jean-Paul Chaput 2023-06-29 21:20:35 +02:00
commit ecdcabb8ad
1 changed files with 12 additions and 11 deletions

View File

@ -709,6 +709,7 @@ namespace Etesian {
cmess1 << " o Converting \"" << getCell()->getName() << "\" into Coloquinte." << endl; cmess1 << " o Converting \"" << getCell()->getName() << "\" into Coloquinte." << endl;
cmess1 << ::Dots::asString(" - H-pitch" , DbU::getValueString(hpitch)) << endl; cmess1 << ::Dots::asString(" - H-pitch" , DbU::getValueString(hpitch)) << endl;
cmess1 << ::Dots::asString(" - V-pitch" , DbU::getValueString(vpitch)) << endl; cmess1 << ::Dots::asString(" - V-pitch" , DbU::getValueString(vpitch)) << endl;
cmess1 << ::Dots::asString(" - Slice height" , DbU::getValueString(sliceHeight)) << endl;
if (isFlexLib) if (isFlexLib)
cmess1 << ::Dots::asString(" - Using patches for" , "\"FlexLib\"") << endl; cmess1 << ::Dots::asString(" - Using patches for" , "\"FlexLib\"") << endl;
cmess2 << " o Looking through the hierarchy." << endl; cmess2 << " o Looking through the hierarchy." << endl;
@ -749,11 +750,16 @@ namespace Etesian {
} }
} }
} }
_surface = new coloquinte::Rectangle( (int)(topAb.getXMin() / hpitch)
, (int)(topAb.getXMax() / hpitch)
, (int)(topAb.getYMin() / vpitch)
, (int)(topAb.getYMax() / vpitch)
);
for ( Occurrence occurrence : getCell()->getTerminalNetlistInstanceOccurrences(getBlockInstance()) ) { for ( Occurrence occurrence : getCell()->getTerminalNetlistInstanceOccurrences(getBlockInstance()) ) {
++instancesNb; ++instancesNb;
Instance* instance = static_cast<Instance*>(occurrence.getEntity()); Instance* instance = static_cast<Instance*>(occurrence.getEntity());
Box instanceAb = instance->getAbutmentBox(); Box instanceAb = _bloatCells.getAb( occurrence );
string masterName = getString( instance->getMasterCell()->getName() ); string masterName = getString( instance->getMasterCell()->getName() );
DbU::Unit length = (instanceAb.getHeight() / sliceHeight) * instanceAb.getWidth(); DbU::Unit length = (instanceAb.getHeight() / sliceHeight) * instanceAb.getWidth();
if (af->isRegister(masterName)) { if (af->isRegister(masterName)) {
@ -843,10 +849,10 @@ namespace Etesian {
} }
} }
// Compute the space margin from the row length computed earlier // Compute a bloat factor to be reach 1 - densityVariation density
double spaceMargin = (double) (totalLength - usedLength) / usedLength; double bloatFactor = std::max(1.0, (1.0 - getDensityVariation()) * totalLength / usedLength);
double densityVariation = getDensityVariation(); // Limit the maximum size of cells after bloat to avoid placement issues
double bloatFactor = 1.0 + std::max(spaceMargin - densityVariation, 0.0); int maxBloatSize = _surface->width() / 8;
if (bloatFactor != 1.0) { if (bloatFactor != 1.0) {
ostringstream bf; ostringstream bf;
bf << fixed << setprecision(2) << bloatFactor << "%"; bf << fixed << setprecision(2) << bloatFactor << "%";
@ -886,7 +892,7 @@ namespace Etesian {
++xsize; ++xsize;
// Take bloat into account to compute the size // Take bloat into account to compute the size
xsize *= bloatFactor; xsize = std::max(xsize, std::min(maxBloatSize, (int) (xsize * bloatFactor)));
cellX[instanceId] = xpos; cellX[instanceId] = xpos;
cellY[instanceId] = ypos; cellY[instanceId] = ypos;
@ -1032,11 +1038,6 @@ namespace Etesian {
if (_bloatCells.getSelected()->getName() != "disabled") if (_bloatCells.getSelected()->getName() != "disabled")
cmess2 << stdCellSizes.toString(1) << endl; cmess2 << stdCellSizes.toString(1) << endl;
_surface = new coloquinte::Rectangle( (int)(topAb.getXMin() / hpitch)
, (int)(topAb.getXMax() / hpitch)
, (int)(topAb.getYMin() / vpitch)
, (int)(topAb.getYMax() / vpitch)
);
_circuit->setupRows(*_surface, rowHeight); _circuit->setupRows(*_surface, rowHeight);
_circuit->check(); _circuit->check();
_placementLB = new coloquinte::PlacementSolution (); _placementLB = new coloquinte::PlacementSolution ();