Support for non-stacked VIAs in Katana.
* New: In Katana::Configuration, added option: "cfg.katana.disableStackedVias" (default to false), so the router do not stack VIAs on top of each other. * Bug: In NegociateWindow::loadRoutingPads(), create TrackMarkers using the right depth when the gauge starts with non-routable ones. * New: In Track::addOverlapCost(), when disableStackedVias is active, uses the markers from the below terminals to tag the cost as "infinite", so the track *cannot* be used by the marker's net owner. Can be refined by checking that we are not at a segment's end but will do for now.
This commit is contained in:
parent
7d88b14334
commit
9df5fc838c
|
@ -57,6 +57,7 @@ namespace Katana {
|
||||||
, _flags (0)
|
, _flags (0)
|
||||||
, _profileEventCosts (Cfg::getParamBool ("katana.profileEventCosts" ,false )->asBool())
|
, _profileEventCosts (Cfg::getParamBool ("katana.profileEventCosts" ,false )->asBool())
|
||||||
, _runRealignStage (Cfg::getParamBool ("katana.runRealignStage" ,true )->asBool())
|
, _runRealignStage (Cfg::getParamBool ("katana.runRealignStage" ,true )->asBool())
|
||||||
|
, _disableStackedVias (Cfg::getParamBool ("katana.disableStackedVias" ,false )->asBool())
|
||||||
{
|
{
|
||||||
_ripupLimits[StrapRipupLimit] = Cfg::getParamInt("katana.strapRipupLimit" ,16)->asInt();
|
_ripupLimits[StrapRipupLimit] = Cfg::getParamInt("katana.strapRipupLimit" ,16)->asInt();
|
||||||
_ripupLimits[LocalRipupLimit] = Cfg::getParamInt("katana.localRipupLimit" , 7)->asInt();
|
_ripupLimits[LocalRipupLimit] = Cfg::getParamInt("katana.localRipupLimit" , 7)->asInt();
|
||||||
|
@ -108,6 +109,7 @@ namespace Katana {
|
||||||
, _flags (other._flags)
|
, _flags (other._flags)
|
||||||
, _profileEventCosts (other._profileEventCosts)
|
, _profileEventCosts (other._profileEventCosts)
|
||||||
, _runRealignStage (other._runRealignStage)
|
, _runRealignStage (other._runRealignStage)
|
||||||
|
, _disableStackedVias (other._disableStackedVias)
|
||||||
{
|
{
|
||||||
_ripupLimits[StrapRipupLimit] = other._ripupLimits[StrapRipupLimit];
|
_ripupLimits[StrapRipupLimit] = other._ripupLimits[StrapRipupLimit];
|
||||||
_ripupLimits[LocalRipupLimit] = other._ripupLimits[LocalRipupLimit];
|
_ripupLimits[LocalRipupLimit] = other._ripupLimits[LocalRipupLimit];
|
||||||
|
|
|
@ -181,13 +181,15 @@ namespace {
|
||||||
if (af->isBLOCKAGE(net->getName())) continue;
|
if (af->isBLOCKAGE(net->getName())) continue;
|
||||||
|
|
||||||
for( RoutingPad* rp : net->getRoutingPads() ) {
|
for( RoutingPad* rp : net->getRoutingPads() ) {
|
||||||
size_t depth = rg->getLayerDepth(rp->getLayer());
|
size_t depth = rg->getLayerDepth(rp->getLayer());
|
||||||
if (depth == 0) {
|
size_t rlDepth = depth - rg->getFirstRoutingLayer();
|
||||||
TrackMarker::create( rp, 1 );
|
if (rlDepth == 0) {
|
||||||
//if (isVH) TrackMarker::create( rp, 2 );
|
TrackMarker::create( rp, depth+1 );
|
||||||
|
//if (isVH) TrackMarker::create( rp, depth+2 );
|
||||||
}
|
}
|
||||||
if (depth == 1) {
|
if (rlDepth == 1) {
|
||||||
TrackMarker::create( rp, 1 );
|
if (depth+1 < rg->getDepth())
|
||||||
|
TrackMarker::create( rp, depth+1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -401,6 +401,10 @@ namespace Katana {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Session::_disableStackedVias ()
|
||||||
|
{ return _getKatanaEngine()->getConfiguration()->disableStackedVias(); }
|
||||||
|
|
||||||
|
|
||||||
void Session::_addInsertEvent ( TrackMarker* marker, Track* track )
|
void Session::_addInsertEvent ( TrackMarker* marker, Track* track )
|
||||||
{
|
{
|
||||||
_insertEvents.push_back( Event(marker,track) );
|
_insertEvents.push_back( Event(marker,track) );
|
||||||
|
|
|
@ -543,6 +543,12 @@ namespace Katana {
|
||||||
for ( ; (mbegin < _markers.size())
|
for ( ; (mbegin < _markers.size())
|
||||||
and (_markers[mbegin]->getSourceU() <= interval.getVMax()) ; mbegin++ ) {
|
and (_markers[mbegin]->getSourceU() <= interval.getVMax()) ; mbegin++ ) {
|
||||||
cdebug_log(155,0) << "| @" << DbU::getValueString(_axis) << " " << _markers[mbegin] << endl;
|
cdebug_log(155,0) << "| @" << DbU::getValueString(_axis) << " " << _markers[mbegin] << endl;
|
||||||
|
if (Session::disableStackedVias()
|
||||||
|
and (_markers[mbegin]->getNet() == cost.getNet()) ) {
|
||||||
|
cost.setInfinite();
|
||||||
|
cdebug_tabw(155,-1);
|
||||||
|
return cost;
|
||||||
|
}
|
||||||
if (_markers[mbegin]->getNet() != cost.getNet()) {
|
if (_markers[mbegin]->getNet() != cost.getNet()) {
|
||||||
cdebug_log(155,0) << "* Mark: @" << DbU::getValueString(_axis) << " " << _markers[mbegin] << endl;
|
cdebug_log(155,0) << "* Mark: @" << DbU::getValueString(_axis) << " " << _markers[mbegin] << endl;
|
||||||
cost.incTerminals( _markers[mbegin]->getWeight(this) );
|
cost.incTerminals( _markers[mbegin]->getWeight(this) );
|
||||||
|
|
|
@ -66,6 +66,7 @@ namespace Katana {
|
||||||
inline bool useStaticBloatProfile () const;
|
inline bool useStaticBloatProfile () const;
|
||||||
inline bool profileEventCosts () const;
|
inline bool profileEventCosts () const;
|
||||||
inline bool runRealignStage () const;
|
inline bool runRealignStage () const;
|
||||||
|
inline bool disableStackedVias () const;
|
||||||
// Methods.
|
// Methods.
|
||||||
inline Anabatic::Configuration* base ();
|
inline Anabatic::Configuration* base ();
|
||||||
inline const Anabatic::Configuration* base () const;
|
inline const Anabatic::Configuration* base () const;
|
||||||
|
@ -121,6 +122,7 @@ namespace Katana {
|
||||||
unsigned int _flags;
|
unsigned int _flags;
|
||||||
bool _profileEventCosts;
|
bool _profileEventCosts;
|
||||||
bool _runRealignStage;
|
bool _runRealignStage;
|
||||||
|
bool _disableStackedVias;
|
||||||
private:
|
private:
|
||||||
Configuration ( const Configuration& other );
|
Configuration ( const Configuration& other );
|
||||||
Configuration& operator= ( const Configuration& );
|
Configuration& operator= ( const Configuration& );
|
||||||
|
@ -153,6 +155,7 @@ namespace Katana {
|
||||||
inline bool Configuration::useStaticBloatProfile () const { return _flags & UseStaticBloatProfile; }
|
inline bool Configuration::useStaticBloatProfile () const { return _flags & UseStaticBloatProfile; }
|
||||||
inline bool Configuration::profileEventCosts () const { return _profileEventCosts; }
|
inline bool Configuration::profileEventCosts () const { return _profileEventCosts; }
|
||||||
inline bool Configuration::runRealignStage () const { return _runRealignStage; }
|
inline bool Configuration::runRealignStage () const { return _runRealignStage; }
|
||||||
|
inline bool Configuration::disableStackedVias () const { return _disableStackedVias; }
|
||||||
inline void Configuration::setFlags ( unsigned int flags ) { _flags |= flags; }
|
inline void Configuration::setFlags ( unsigned int flags ) { _flags |= flags; }
|
||||||
inline void Configuration::unsetFlags ( unsigned int flags ) { _flags &= ~flags; }
|
inline void Configuration::unsetFlags ( unsigned int flags ) { _flags &= ~flags; }
|
||||||
inline void Configuration::setProfileEventCosts ( bool state ) { _profileEventCosts = state; }
|
inline void Configuration::setProfileEventCosts ( bool state ) { _profileEventCosts = state; }
|
||||||
|
|
|
@ -66,6 +66,7 @@ namespace Katana {
|
||||||
static Session* get ( const char* message=NULL );
|
static Session* get ( const char* message=NULL );
|
||||||
inline static Super* base ();
|
inline static Super* base ();
|
||||||
inline static bool isEmpty ();
|
inline static bool isEmpty ();
|
||||||
|
inline static bool disableStackedVias ();
|
||||||
static uint32_t getStage ();
|
static uint32_t getStage ();
|
||||||
inline static KatanaEngine* getKatanaEngine ();
|
inline static KatanaEngine* getKatanaEngine ();
|
||||||
static Configuration* getConfiguration ();
|
static Configuration* getConfiguration ();
|
||||||
|
@ -102,6 +103,7 @@ namespace Katana {
|
||||||
void _doRemovalEvents ( bool reschedule=false );
|
void _doRemovalEvents ( bool reschedule=false );
|
||||||
virtual size_t _revalidate ();
|
virtual size_t _revalidate ();
|
||||||
bool _isEmpty () const;
|
bool _isEmpty () const;
|
||||||
|
bool _disableStackedVias ();
|
||||||
NegociateWindow* _getNegociateWindow ();
|
NegociateWindow* _getNegociateWindow ();
|
||||||
inline const std::vector<TrackElement*>&
|
inline const std::vector<TrackElement*>&
|
||||||
_getIndirectInvalids ();
|
_getIndirectInvalids ();
|
||||||
|
@ -212,6 +214,9 @@ namespace Katana {
|
||||||
inline bool Session::isEmpty ()
|
inline bool Session::isEmpty ()
|
||||||
{ return get("isEmpty()")->_isEmpty(); }
|
{ return get("isEmpty()")->_isEmpty(); }
|
||||||
|
|
||||||
|
inline bool Session::disableStackedVias ()
|
||||||
|
{ return get("disableStackedVias()")->_disableStackedVias(); }
|
||||||
|
|
||||||
inline const std::vector<TrackElement*>& Session::_getIndirectInvalids ()
|
inline const std::vector<TrackElement*>& Session::_getIndirectInvalids ()
|
||||||
{ return _indirectInvalids; }
|
{ return _indirectInvalids; }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue