Take account of Rectilinears in KatanaEngine::setupPowerRails()

* New: In QueryPowerRails::addToPowerRail(), now manage Rectilinears,
    *if* they are, in fact, rectangles. For LibreSOCMem block support.
This commit is contained in:
Jean-Paul Chaput 2021-02-01 16:48:36 +01:00
parent e0bae89a81
commit 35d54c3e74
2 changed files with 20 additions and 1 deletions

View File

@ -80,10 +80,13 @@ namespace {
if (source->getGCell()->isStdCellRow() and target->getGCell()->isStdCellRow())
return Vertex::unreachable;
cdebug_log(112,0) << "DigitalDistance::operator(): " << edge
<< " isGostraight():" << source->getGCell()->isGoStraight() << endl;
if ( source->getGCell()->isGoStraight()
and source->getFrom()
and (source->getFrom()->isHorizontal() xor edge->isHorizontal()))
return Vertex::unreachable;
cdebug_log(112,0) << "Not a go straight" << endl;
if (edge->getCapacity() <= 0) {
if (target->getGCell()->isStdCellRow()
@ -94,9 +97,11 @@ namespace {
and source->hasValidStamp() and (source->getConnexId() >= 0) )
return 0;
cdebug_log(112,0) << "Negative or null edge capacity: " << edge->getCapacity() << endl;
return Vertex::unreachable;
}
cdebug_log(112,0) << "Computing distance" << endl;
float congestionCost = 1.0;
float congestion = ((float)edge->getRealOccupancy() + edge->getEstimateOccupancy())
/ (float)edge->getCapacity();
@ -110,7 +115,6 @@ namespace {
/*and not source->hasGContact(_net)*/ ) {
viaCost += 2.5;
}
float realCongestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity();
float historicCost = edge->getHistoricCost();

View File

@ -26,6 +26,7 @@
#include "hurricane/Pad.h"
#include "hurricane/Horizontal.h"
#include "hurricane/Vertical.h"
#include "hurricane/Rectilinear.h"
#include "hurricane/RoutingPad.h"
#include "hurricane/NetExternalComponents.h"
#include "hurricane/NetRoutingProperty.h"
@ -54,6 +55,7 @@ namespace {
using Hurricane::DeepNet;
using Hurricane::Horizontal;
using Hurricane::Pad;
using Hurricane::Rectilinear;
using Hurricane::Vertical;
using Hurricane::RoutingPad;
using Hurricane::NetExternalComponents;
@ -1107,6 +1109,19 @@ namespace {
<< " " << basicLayer << endl;
_powerRailsPlanes.merge( bb, rootNet );
} else {
const Rectilinear* rectilinear = dynamic_cast<const Rectilinear*>(component);
if (rectilinear and (rectilinear->getPoints().size() == 5)) {
_goMatchCount++;
Box bb = rectilinear->getBoundingBox( basicLayer );
transformation.applyOn( bb );
cdebug_log(159,0) << " Merging PowerRail element: " << rectilinear << " bb:" << bb
<< " " << basicLayer << endl;
_powerRailsPlanes.merge( bb, rootNet );
}
}
}
}