Compare commits

...

2 Commits

Author SHA1 Message Date
Jean-Paul Chaput 2e015ea780 Prune ordinary wires in Katana::PowerRails.
* Change: In Katana::PowerRails, in TerminalNetlist cells instances,
    the ordinary nets components where generating obstacles, leading
    to stupid cross blockages between the obstacle generated by the
    component supporting the routing pad and the RP itself.
      Now only take into account supplies and clocks (any layers)
    and blockage layers.
      Fix symbolic benches.
2021-06-13 12:03:57 +02:00
Jean-Paul Chaput 63d2f69459 Increate the reluctance to go up in Manipulator::moveUp().
* Change: In Katana::Manipulator::moveUp(), the "reserve" value was
    of 0.5 for pivot up and locals, now set it to 1.0, like in all
    other cases ("reserve" is the number of free tracks that is
    needed to allow the move up, in addition the the length being
    moved up).
      Fix routing convergence on the MIPS pipeline bench.
2021-06-13 12:03:35 +02:00
2 changed files with 16 additions and 5 deletions

View File

@ -1180,15 +1180,15 @@ namespace Katana {
kflags |= (flags & AllowTerminalMoveUp) ? Flags::AllowTerminal : Flags::NoFlags; kflags |= (flags & AllowTerminalMoveUp) ? Flags::AllowTerminal : Flags::NoFlags;
kflags |= (flags & IgnoreContacts ) ? Flags::IgnoreContacts : Flags::NoFlags; kflags |= (flags & IgnoreContacts ) ? Flags::IgnoreContacts : Flags::NoFlags;
//float reserve = 1.0; float reserve = 1.0;
float reserve = 0.5; //float reserve = 0.5;
if (_segment->base() and (_segment->base()->getRpDistance() > 2)) reserve = 1.0; if (_segment->base() and (_segment->base()->getRpDistance() > 2)) reserve = 1.0;
if (_segment->getLength() > 60*getPitch()) reserve = 1.0; if (_segment->getLength() > 60*getPitch()) reserve = 1.0;
if (_segment->isFixed()) return false; if (_segment->isFixed()) return false;
if (not (flags & AllowLocalMoveUp)) { if (not (flags & AllowLocalMoveUp)) {
if (_segment->isLocal()) { if (_segment->isLocal()) {
if (not _segment->canPivotUp(0.5,kflags)) return false; if (not _segment->canPivotUp(1.0,kflags)) return false;
} else { } else {
if (_segment->getLength() < 20*getPitch()) { if (_segment->getLength() < 20*getPitch()) {
if (not (flags & AllowShortPivotUp)) return false; if (not (flags & AllowShortPivotUp)) return false;
@ -1197,7 +1197,7 @@ namespace Katana {
if (not _segment->canMoveUp(reserve,kflags)) return false; if (not _segment->canMoveUp(reserve,kflags)) return false;
} }
} else { } else {
if (not _segment->canMoveUp(0.5,kflags)) return false; if (not _segment->canMoveUp(1.0,kflags)) return false;
} }
//reprocessParallels(); //reprocessParallels();

View File

@ -915,9 +915,10 @@ namespace {
virtual void doQuery (); virtual void doQuery ();
inline void doLayout (); inline void doLayout ();
inline uint32_t getGoMatchCount () const; inline uint32_t getGoMatchCount () const;
inline RoutingGauge* getRoutingGauge () const;
private: private:
AllianceFramework* _framework; AllianceFramework* _framework;
KatanaEngine* _katana; KatanaEngine* _katana;
RoutingGauge* _routingGauge; RoutingGauge* _routingGauge;
const ChipTools& _chipTools; const ChipTools& _chipTools;
PowerRailsPlanes _powerRailsPlanes; PowerRailsPlanes _powerRailsPlanes;
@ -957,6 +958,10 @@ namespace {
{ return _powerRailsPlanes.doLayout(); } { return _powerRailsPlanes.doLayout(); }
inline RoutingGauge* QueryPowerRails::getRoutingGauge () const
{ return _routingGauge; }
bool QueryPowerRails::hasBasicLayer ( const BasicLayer* basicLayer ) bool QueryPowerRails::hasBasicLayer ( const BasicLayer* basicLayer )
{ return _powerRailsPlanes.hasPlane ( basicLayer ); } { return _powerRailsPlanes.hasPlane ( basicLayer ); }
@ -1031,6 +1036,12 @@ namespace {
cdebug_log(159,0) << " rootNet " << rootNet << " (" << rootNet->isClock() << ") " cdebug_log(159,0) << " rootNet " << rootNet << " (" << rootNet->isClock() << ") "
<< go->getCell() << " (" << go->getCell()->isTerminal() << ")" << endl; << go->getCell() << " (" << go->getCell()->isTerminal() << ")" << endl;
// unsigned int type = _powerRailsPlanes.getActivePlane()->getRoutingPlane()->getLayerGauge()->getType();
if (go->getCell()->isTerminalNetlist()) {
if (not rootNet->isSupply() and not rootNet->isClock() and not _isBlockagePlane)
return;
}
const Segment* segment = dynamic_cast<const Segment*>(component); const Segment* segment = dynamic_cast<const Segment*>(component);
if ( segment != NULL ) { if ( segment != NULL ) {
_goMatchCount++; _goMatchCount++;