Various bug fixes on blockages & H-Tree managment under Katana.
* Change: In Katana::PowerRailsPlanes::Rail::doLayout(): change the delta computation. Extend of the pitch *minus* the half wire-width *minus* 1. So a wire at minimal with will reach exactly the previous and next track axis. And will not be insterted in them due to the "minus 1". TrackFixedSegments created at this stage must be flagged as TElemBlockageNet, so that any overlap between them is not seen as an error by the track overlap checker. This was a problem for the clock tree wires which partly uses pre-fixed wires, but the driver of the H-Tree is a normal signal that must abide the usual checking. * Change: In Katana::TrackFixedSegment::getNet(), no longer rely on the kind of net to choose to return the actual net or the blockage one, but uses the TElemUseBlockageNet flag.
This commit is contained in:
parent
3c9ef5b937
commit
258bd053c4
|
@ -134,6 +134,7 @@ class HorizontalRail ( Rail ):
|
|||
return True
|
||||
|
||||
def connect ( self, contact ):
|
||||
trace( 550, '\tHorizontalRail.connect() {}\n'.format(contact) )
|
||||
viaWidth = contact.getWidth()
|
||||
viaHeight = self.side.hRailWidth
|
||||
viaFlags = BigVia.AllowAllExpand
|
||||
|
|
|
@ -230,6 +230,7 @@ class Builder ( object ):
|
|||
return
|
||||
with UpdateSession():
|
||||
bufferRp = self.conf.rpAccessByOccurrence( Occurrence(htPlugs[0], Path()), ck, 0 )
|
||||
trace( 550, '\tClock buffer access RP @{}\n'.format(bufferRp) )
|
||||
self.conf.expandMinArea( bufferRp )
|
||||
layerGauge = self.conf.routingGauge.getLayerGauge(self.conf.verticalDepth)
|
||||
contact = Contact.create( ck
|
||||
|
|
|
@ -495,12 +495,12 @@ namespace {
|
|||
if (_width >= DbU::fromPhysical( 10.0, DbU::UnitPower::Micro )) {
|
||||
delta = 2 * plane->getLayerGauge()->getPitch();
|
||||
} else {
|
||||
delta = plane->getLayerGauge()->getPitch();
|
||||
delta = plane->getLayerGauge()->getPitch() - plane->getLayerGauge()->getHalfWireWidth() - 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
//if (AllianceFramework::get()->getCellGauge()->getName() == Name("StdCellLib")) {
|
||||
delta = plane->getLayerGauge()->getPitch();
|
||||
delta = plane->getLayerGauge()->getPitch() - plane->getLayerGauge()->getHalfWireWidth() - 1;
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
@ -557,6 +557,7 @@ namespace {
|
|||
for ( ; track and (track->getAxis() <= axisMax) ; track = track->getNextTrack() ) {
|
||||
TrackElement* element = TrackFixedSegment::create ( track, segment );
|
||||
cdebug_log(159,0) << " Insert in " << track << "+" << element << endl;
|
||||
element->setFlags( TElemUseBlockageNet );
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -592,6 +593,7 @@ namespace {
|
|||
<< "+" << element
|
||||
<< " " << (net->isExternal() ? "external" : "internal")
|
||||
<< endl;
|
||||
element->setFlags( TElemUseBlockageNet );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -199,7 +199,8 @@ namespace Katana {
|
|||
{
|
||||
Net* realNet = _segment->getNet();
|
||||
//if (realNet->isSupply() or realNet->isClock())
|
||||
if (realNet->isSupply())
|
||||
//if (realNet->isSupply())
|
||||
if (_flags & TElemUseBlockageNet)
|
||||
return Session::getBlockageNet();
|
||||
return realNet;
|
||||
}
|
||||
|
@ -265,7 +266,8 @@ namespace Katana {
|
|||
+ ":" + DbU::getValueString(_targetU) + "]"
|
||||
+ " " + DbU::getValueString(_targetU-_sourceU)
|
||||
+ " F"
|
||||
+ ((isBlockage()) ? "B" : "-");
|
||||
+ ((isBlockage()) ? "B" : "-")
|
||||
+ ((_flags & TElemUseBlockageNet) ? "N" : "-");
|
||||
s1.insert ( s1.size()-1, s2 );
|
||||
|
||||
return s1;
|
||||
|
|
|
@ -64,20 +64,20 @@ namespace Katana {
|
|||
// -------------------------------------------------------------------
|
||||
// Class : "TrackElement".
|
||||
|
||||
enum TrackElementFlags { TElemCreated = (1 << 0)
|
||||
, TElemBlockage = (1 << 2)
|
||||
, TElemFixed = (1 << 3)
|
||||
, TElemLocked = (1 << 4)
|
||||
, TElemRouted = (1 << 5)
|
||||
, TElemShortDogleg = (1 << 6)
|
||||
, TElemSourceDogleg = (1 << 7)
|
||||
, TElemTargetDogleg = (1 << 8)
|
||||
, TElemAlignBottom = (1 << 9)
|
||||
, TElemAlignCenter = (1 << 10)
|
||||
, TElemAlignTop = (1 << 11)
|
||||
, TElemRipple = (1 << 12)
|
||||
, TElemInvalidated = (1 << 13)
|
||||
};
|
||||
const uint32_t TElemCreated = (1 << 0);
|
||||
const uint32_t TElemBlockage = (1 << 2);
|
||||
const uint32_t TElemFixed = (1 << 3);
|
||||
const uint32_t TElemLocked = (1 << 4);
|
||||
const uint32_t TElemRouted = (1 << 5);
|
||||
const uint32_t TElemUseBlockageNet = (1 << 6);
|
||||
const uint32_t TElemShortDogleg = (1 << 7);
|
||||
const uint32_t TElemSourceDogleg = (1 << 8);
|
||||
const uint32_t TElemTargetDogleg = (1 << 9);
|
||||
const uint32_t TElemAlignBottom = (1 << 10);
|
||||
const uint32_t TElemAlignCenter = (1 << 11);
|
||||
const uint32_t TElemAlignTop = (1 << 12);
|
||||
const uint32_t TElemRipple = (1 << 13);
|
||||
const uint32_t TElemInvalidated = (1 << 14);
|
||||
|
||||
|
||||
struct Compare {
|
||||
|
|
|
@ -14,9 +14,7 @@
|
|||
// +-----------------------------------------------------------------+
|
||||
|
||||
|
||||
#ifndef KATANA_TRACK_FIXED_SEGMENT_H
|
||||
#define KATANA_TRACK_FIXED_SEGMENT_H
|
||||
|
||||
#pragma once
|
||||
#include "katana/TrackElement.h"
|
||||
|
||||
|
||||
|
@ -88,5 +86,3 @@ namespace Katana {
|
|||
|
||||
|
||||
INSPECTOR_P_SUPPORT(Katana::TrackFixedSegment);
|
||||
|
||||
#endif // KATANA_TRACK_FIXED_SEGMENT_H
|
||||
|
|
Loading…
Reference in New Issue