Corrections in how to access pads terminals in Katabatic/Kite.

* Change: In Katabatic, in GCellTopology::doRp_AccessPad(), if the supporting
    RoutingPad is big (more than two pitch), do not put the access
    contact in the center but on the edge. This is to avoid cut violations
    between the VIAs and the matrix of VIAs that may be generated under the
    RoutingPad itself.
* Change: In Kite, in TrackSegment destructor, if the legnth of the wire,
    without extensions is less than one picth, enlarge it so it encompass
    it's source & target VIAs (to avoid notches).
* Bug: In Kite, in Track destructor, the TrackElements where detacheds,
    but not deleted, causing a memory link.
This commit is contained in:
Jean-Paul Chaput 2016-03-02 17:15:58 +01:00
parent de401b13d9
commit fce97bb1d9
3 changed files with 52 additions and 15 deletions

View File

@ -1,7 +1,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC 2008-2015, All Rights Reserved
// Copyright (c) UPMC 2008-2016, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@ -182,7 +182,7 @@ namespace {
//!
//! \image html doRp_Access.png "doRp_Access()"
//! \function AutoContact* GCellTopology::doRp_AccessPad ( Component* rp, unsigned int flags );
//! \function AutoContact* GCellTopology::doRp_AccessPad ( RoutingPad* rp, unsigned int flags );
//! \param rp The Component onto which anchor the access contact.
//! \param flags Relevant flags are:
//! - HAccess, the terminal is to be accessed through an horizontal
@ -642,7 +642,7 @@ namespace {
inline GCell* getGCell () const;
static void doRp_AutoContacts ( GCell*, Component*, AutoContact*& source, AutoContact*& target, unsigned int flags );
static AutoContact* doRp_Access ( GCell*, Component*, unsigned int flags );
static AutoContact* doRp_AccessPad ( Component*, unsigned int flags );
static AutoContact* doRp_AccessPad ( RoutingPad*, unsigned int flags );
static void doRp_StairCaseH ( GCell*, Component* rp1, Component* rp2 );
static void doRp_StairCaseV ( GCell*, Component* rp1, Component* rp2 );
private:
@ -769,7 +769,7 @@ namespace {
Hook* _west;
Hook* _north;
Hook* _south;
vector<Component*> _routingPads;
vector<RoutingPad*> _routingPads;
};
@ -878,7 +878,7 @@ namespace {
}
ltrace(99) << "| Component to connect: " << anchor << endl;
_routingPads.push_back( anchor );
_routingPads.push_back( rp );
}
}
}
@ -1181,7 +1181,7 @@ namespace {
}
AutoContact* GCellTopology::doRp_AccessPad ( Component* rp, unsigned int flags )
AutoContact* GCellTopology::doRp_AccessPad ( RoutingPad* rp, unsigned int flags )
{
ltrace(99) << "doRp_AccessPad()" << endl;
ltracein(99);
@ -1201,7 +1201,26 @@ namespace {
rp->getBodyHook()->detach();
Point rpPosition = rp->getCenter();
Point position = rp->getCenter();
Box rpbb = rp->getBoundingBox();
if ( (rpbb.getWidth () > 2*Session::getWireWidth(padDepth))
or (rpbb.getHeight() > 2*Session::getWireWidth(padDepth)) ) {
//cerr << "doRp_AccessPad(): connecting to non-punctual connector (RoutingPad).\n"
// << " " << rp->getNet() << "pad:" << rp->getOccurrence().getMasterCell() << endl;
Transformation transf = rp->getOccurrence().getPath().getTransformation();
switch ( transf.getOrientation() ) {
case Transformation::Orientation::ID: position.setY( rpbb.getYMin() ); break;
case Transformation::Orientation::MY: position.setY( rpbb.getYMax() ); break;
case Transformation::Orientation::YR:
case Transformation::Orientation::R3: position.setX( rpbb.getXMin() ); break;
case Transformation::Orientation::R1: position.setX( rpbb.getXMax() ); break;
default:
break;
}
}
GCell* gcell = Session::getKatabatic()->getGCellGrid()->getGCell(position);
Component* anchor = rp;
@ -1213,8 +1232,8 @@ namespace {
Contact* target = NULL;
Contact* source = Contact::create ( rp
, Session::getContactLayer(padDepth)
, 0
, 0
, position.getX() - rpPosition.getX()
, position.getY() - rpPosition.getY()
, Session::getViaWidth(padDepth)
, Session::getViaWidth(padDepth)
);
@ -1423,7 +1442,7 @@ namespace {
bool westPad = false;
bool northPad = false;
bool southPad = false;
Instance* padInstance = dynamic_cast<RoutingPad*>(_routingPads[0])->getOccurrence().getPath().getHeadInstance();
Instance* padInstance = _routingPads[0]->getOccurrence().getPath().getHeadInstance();
switch ( padInstance->getTransformation().getOrientation() ) {
case Transformation::Orientation::ID: northPad = true; break;

View File

@ -1,7 +1,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC 2008-2015, All Rights Reserved
// Copyright (c) UPMC 2008-2016, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@ -98,7 +98,7 @@ namespace Kite {
ltracein(90);
for ( size_t i=0 ; i<_segments.size() ; i++ )
if (_segments[i]) _segments[i]->detach();
if (_segments[i]) { _segments[i]->detach(); _segments[i]->destroy(); }
for ( size_t i=0 ; i<_markers.size() ; i++ )
if (_markers[i]) _markers[i]->destroy();

View File

@ -1,7 +1,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC 2008-2015, All Rights Reserved
// Copyright (c) UPMC 2008-2016, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@ -18,6 +18,7 @@
#include <limits>
#include "hurricane/Bug.h"
#include "hurricane/Warning.h"
#include "hurricane/BasicLayer.h"
#include "hurricane/Net.h"
#include "hurricane/Name.h"
#include "hurricane/RoutingPad.h"
@ -43,6 +44,7 @@ namespace Kite {
using Hurricane::ForEachIterator;
using Hurricane::Bug;
using Hurricane::Error;
using Hurricane::BasicLayer;
using Hurricane::Net;
using Hurricane::Name;
using Hurricane::RoutingPad;
@ -102,6 +104,22 @@ namespace Kite {
<< " [" << (void*)_base << ", "
<< (void*)(_base?_base->base():NULL) << "]" << endl;
DbU::Unit length = base()->getLength();
if ( (length > 0) and (length < getPPitch()) ) {
BasicLayer* layer = getLayer()->getBasicLayers().getFirst();
DbU::Unit width = base()->getWidth();
Contact* source = base()->getAutoSource()->base();
Contact* target = base()->getAutoTarget()->base();
if (isHorizontal()) {
width = std::max( width, source->getBoundingBox(layer).getHeight() );
width = std::max( width, target->getBoundingBox(layer).getHeight() );
} else {
width = std::max( width, source->getBoundingBox(layer).getWidth() );
width = std::max( width, target->getBoundingBox(layer).getWidth() );
}
base()->base()->setWidth( width );
}
base()->removeObserver( getObserver() );
TrackElement::_preDestroy();
}