* ./kite:
- New: In BuilPowerRails & BuildBlockage, specific support for chip-level
design. The Alliance "top chip" design hierarchical structure is
hard-coded. Top level POWER/GROUND/CLOCK nets must always have the
<vsse>, <vdde>, <ck>, <vssi>, <vddi>, <ckc>, <cki> names.
Specific method to get trans-hierarchical root nets, espcially in
case of global ones (POWER/GROUND). Clock is *not* global.
Some correction in the manner obscured tracks are computeds.
- New: ProtectRoutingPad module that perform a more clean work for protecting
unused RoutingPad.
- Bug: In BuildPowerRails, uses stable_sort<> instead of sort<>, which
causes unexplained core dumps (seems to try to perform a comparison
using the "end" pseudo element). Already occured in Knik, no explanation
other than a STL bug.
- Change: Slight changes in the weights to move up. Now needs a full empty
track instead of a half one.
2010-11-16 08:00:03 -06:00
|
|
|
|
|
|
|
// -*- C++ -*-
|
|
|
|
//
|
|
|
|
// This file is part of the Coriolis Software.
|
|
|
|
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved
|
|
|
|
//
|
|
|
|
// ===================================================================
|
|
|
|
//
|
|
|
|
// $Id$
|
|
|
|
//
|
|
|
|
// x-----------------------------------------------------------------x
|
|
|
|
// | |
|
|
|
|
// | C O R I O L I S |
|
|
|
|
// | K i t e - D e t a i l e d R o u t e r |
|
|
|
|
// | |
|
|
|
|
// | Author : Jean-Paul CHAPUT |
|
|
|
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
|
|
|
// | =============================================================== |
|
|
|
|
// | C++ Module : "./ProtectRoutingPads.cpp" |
|
|
|
|
// | *************************************************************** |
|
|
|
|
// | U p d a t e s |
|
|
|
|
// | |
|
|
|
|
// x-----------------------------------------------------------------x
|
|
|
|
|
|
|
|
|
|
|
|
#include <map>
|
|
|
|
#include <list>
|
|
|
|
|
|
|
|
#include "hurricane/DataBase.h"
|
|
|
|
#include "hurricane/Technology.h"
|
|
|
|
#include "hurricane/BasicLayer.h"
|
|
|
|
#include "hurricane/RegularLayer.h"
|
|
|
|
#include "hurricane/Horizontal.h"
|
|
|
|
#include "hurricane/Vertical.h"
|
|
|
|
#include "hurricane/RoutingPad.h"
|
|
|
|
#include "hurricane/Occurrence.h"
|
|
|
|
#include "hurricane/Cell.h"
|
|
|
|
#include "hurricane/NetExternalComponents.h"
|
* ./kite:
- Change: Propagate renaming "obstacle" -> "blockage".
- Bug/Change: In Configuration, the value of the extensionCap was too big
(1.5 lambda), reduce to 0.5 lambda. This is a problem, the extension
should be coupled to the layer as it is not the same for each METAL.
- Bug: When using TrackElement, always uses the virtual "->isFixed()" method
instead of trying to access to "->base()->isFixed()" as the base may be
NULL in case of blockage/fixed segment.
- Change: Merge PowerRails & Blockage trans-hierarchical construction (into
PowerRails). All blockages are groupeds under "blockagenet".
Allows to remove TrackBlockage & BuildBlockages.
- Change: In KiteEngine::annotateGloblalGraph(), when routing a full chip,
ring power segments around the core must completly saturate the edges
in their segment direction. This is to prevent the global router to
use paths under the power/ground ring (may generate unsolvable configs).
- Change: In KiteEngine::annotateGloblalGraph(), when routing a full chip,
distinguish three areas: the core (65%), the corona (90%) and the pads
(100%). Capacities on the edges are sets accordingly.
- Change: In RoutingEvent, introduce an alternative algorithm for
conflictSolve1, FindPath which try to deduce the breakpoints from a
truly explorated path. Unfortunatly this gives worst results than the
Cs1Candidates method. The why should be investigated as it's a critical
point in the algorithm.
- Change: In Manipulator::ripupPerpandicular(), when a caged perpandicular
is encountered, instead of just "stopping", rip it up and change is
axis hint (actually increase) it's axis hint so it stands a chance to
go outside the track with an obstacle.
- Change: In RoutingEvent/State::slackenTopology(), allow move up of local
segments when they are tightly constrained *and* blocked (cageds).
Partial modification of functions calls from booleans to flags.
- Bug: In NegociateWindow::NegociateOverlapCost, check for fixed segments
before trying to get DataNegociate. The lack of DataNegociate cause the
TrackElement to be discarted. It's a failsafe behavior, but it leads to
overlaps.
- Bug: In ProtectRoutingPad, in Pad Cells only, *do not* protect RoutingPad
to avoid the edge capacity over the pad to decrease to zero. This is
due to unused RoutingPads being accounted as blockages.
2010-12-04 09:25:48 -06:00
|
|
|
#include "crlcore/Catalog.h"
|
* ./kite:
- New: In BuilPowerRails & BuildBlockage, specific support for chip-level
design. The Alliance "top chip" design hierarchical structure is
hard-coded. Top level POWER/GROUND/CLOCK nets must always have the
<vsse>, <vdde>, <ck>, <vssi>, <vddi>, <ckc>, <cki> names.
Specific method to get trans-hierarchical root nets, espcially in
case of global ones (POWER/GROUND). Clock is *not* global.
Some correction in the manner obscured tracks are computeds.
- New: ProtectRoutingPad module that perform a more clean work for protecting
unused RoutingPad.
- Bug: In BuildPowerRails, uses stable_sort<> instead of sort<>, which
causes unexplained core dumps (seems to try to perform a comparison
using the "end" pseudo element). Already occured in Knik, no explanation
other than a STL bug.
- Change: Slight changes in the weights to move up. Now needs a full empty
track instead of a half one.
2010-11-16 08:00:03 -06:00
|
|
|
#include "katabatic/AutoContact.h"
|
|
|
|
#include "katabatic/AutoSegment.h"
|
|
|
|
#include "katabatic/GCell.h"
|
|
|
|
#include "katabatic/GCellGrid.h"
|
|
|
|
#include "katabatic/KatabaticEngine.h"
|
|
|
|
#include "kite/RoutingPlane.h"
|
|
|
|
#include "kite/TrackSegment.h"
|
|
|
|
#include "kite/TrackFixedSegment.h"
|
|
|
|
#include "kite/Track.h"
|
|
|
|
#include "kite/KiteEngine.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
using Hurricane::tab;
|
|
|
|
using Hurricane::inltrace;
|
|
|
|
using Hurricane::ForEachIterator;
|
|
|
|
using Hurricane::DbU;
|
|
|
|
using Hurricane::Box;
|
|
|
|
using Hurricane::Interval;
|
|
|
|
using Hurricane::Go;
|
|
|
|
using Hurricane::Layer;
|
|
|
|
using Hurricane::BasicLayer;
|
|
|
|
using Hurricane::RegularLayer;
|
|
|
|
using Hurricane::Horizontal;
|
|
|
|
using Hurricane::Vertical;
|
|
|
|
using Hurricane::Transformation;
|
|
|
|
using Hurricane::RoutingPad;
|
|
|
|
using Hurricane::Occurrence;
|
|
|
|
using Hurricane::Path;
|
|
|
|
using Hurricane::NetExternalComponents;
|
* ./kite:
- Change: Propagate renaming "obstacle" -> "blockage".
- Bug/Change: In Configuration, the value of the extensionCap was too big
(1.5 lambda), reduce to 0.5 lambda. This is a problem, the extension
should be coupled to the layer as it is not the same for each METAL.
- Bug: When using TrackElement, always uses the virtual "->isFixed()" method
instead of trying to access to "->base()->isFixed()" as the base may be
NULL in case of blockage/fixed segment.
- Change: Merge PowerRails & Blockage trans-hierarchical construction (into
PowerRails). All blockages are groupeds under "blockagenet".
Allows to remove TrackBlockage & BuildBlockages.
- Change: In KiteEngine::annotateGloblalGraph(), when routing a full chip,
ring power segments around the core must completly saturate the edges
in their segment direction. This is to prevent the global router to
use paths under the power/ground ring (may generate unsolvable configs).
- Change: In KiteEngine::annotateGloblalGraph(), when routing a full chip,
distinguish three areas: the core (65%), the corona (90%) and the pads
(100%). Capacities on the edges are sets accordingly.
- Change: In RoutingEvent, introduce an alternative algorithm for
conflictSolve1, FindPath which try to deduce the breakpoints from a
truly explorated path. Unfortunatly this gives worst results than the
Cs1Candidates method. The why should be investigated as it's a critical
point in the algorithm.
- Change: In Manipulator::ripupPerpandicular(), when a caged perpandicular
is encountered, instead of just "stopping", rip it up and change is
axis hint (actually increase) it's axis hint so it stands a chance to
go outside the track with an obstacle.
- Change: In RoutingEvent/State::slackenTopology(), allow move up of local
segments when they are tightly constrained *and* blocked (cageds).
Partial modification of functions calls from booleans to flags.
- Bug: In NegociateWindow::NegociateOverlapCost, check for fixed segments
before trying to get DataNegociate. The lack of DataNegociate cause the
TrackElement to be discarted. It's a failsafe behavior, but it leads to
overlaps.
- Bug: In ProtectRoutingPad, in Pad Cells only, *do not* protect RoutingPad
to avoid the edge capacity over the pad to decrease to zero. This is
due to unused RoutingPads being accounted as blockages.
2010-12-04 09:25:48 -06:00
|
|
|
using CRL::CatalogExtension;
|
* ./kite:
- New: In BuilPowerRails & BuildBlockage, specific support for chip-level
design. The Alliance "top chip" design hierarchical structure is
hard-coded. Top level POWER/GROUND/CLOCK nets must always have the
<vsse>, <vdde>, <ck>, <vssi>, <vddi>, <ckc>, <cki> names.
Specific method to get trans-hierarchical root nets, espcially in
case of global ones (POWER/GROUND). Clock is *not* global.
Some correction in the manner obscured tracks are computeds.
- New: ProtectRoutingPad module that perform a more clean work for protecting
unused RoutingPad.
- Bug: In BuildPowerRails, uses stable_sort<> instead of sort<>, which
causes unexplained core dumps (seems to try to perform a comparison
using the "end" pseudo element). Already occured in Knik, no explanation
other than a STL bug.
- Change: Slight changes in the weights to move up. Now needs a full empty
track instead of a half one.
2010-11-16 08:00:03 -06:00
|
|
|
using Katabatic::GCellGrid;
|
|
|
|
using Katabatic::AutoContact;
|
|
|
|
using Katabatic::AutoSegment;
|
|
|
|
using namespace Kite;
|
|
|
|
|
|
|
|
|
|
|
|
void protectRoutingPad ( RoutingPad* rp )
|
|
|
|
{
|
|
|
|
Component* usedComponent = rp->_getEntityAsComponent();
|
|
|
|
Path path = rp->getOccurrence().getPath();
|
|
|
|
Net* masterNet = usedComponent->getNet();
|
|
|
|
Transformation transformation = path.getTransformation();
|
|
|
|
|
* ./kite:
- Change: Propagate renaming "obstacle" -> "blockage".
- Bug/Change: In Configuration, the value of the extensionCap was too big
(1.5 lambda), reduce to 0.5 lambda. This is a problem, the extension
should be coupled to the layer as it is not the same for each METAL.
- Bug: When using TrackElement, always uses the virtual "->isFixed()" method
instead of trying to access to "->base()->isFixed()" as the base may be
NULL in case of blockage/fixed segment.
- Change: Merge PowerRails & Blockage trans-hierarchical construction (into
PowerRails). All blockages are groupeds under "blockagenet".
Allows to remove TrackBlockage & BuildBlockages.
- Change: In KiteEngine::annotateGloblalGraph(), when routing a full chip,
ring power segments around the core must completly saturate the edges
in their segment direction. This is to prevent the global router to
use paths under the power/ground ring (may generate unsolvable configs).
- Change: In KiteEngine::annotateGloblalGraph(), when routing a full chip,
distinguish three areas: the core (65%), the corona (90%) and the pads
(100%). Capacities on the edges are sets accordingly.
- Change: In RoutingEvent, introduce an alternative algorithm for
conflictSolve1, FindPath which try to deduce the breakpoints from a
truly explorated path. Unfortunatly this gives worst results than the
Cs1Candidates method. The why should be investigated as it's a critical
point in the algorithm.
- Change: In Manipulator::ripupPerpandicular(), when a caged perpandicular
is encountered, instead of just "stopping", rip it up and change is
axis hint (actually increase) it's axis hint so it stands a chance to
go outside the track with an obstacle.
- Change: In RoutingEvent/State::slackenTopology(), allow move up of local
segments when they are tightly constrained *and* blocked (cageds).
Partial modification of functions calls from booleans to flags.
- Bug: In NegociateWindow::NegociateOverlapCost, check for fixed segments
before trying to get DataNegociate. The lack of DataNegociate cause the
TrackElement to be discarted. It's a failsafe behavior, but it leads to
overlaps.
- Bug: In ProtectRoutingPad, in Pad Cells only, *do not* protect RoutingPad
to avoid the edge capacity over the pad to decrease to zero. This is
due to unused RoutingPads being accounted as blockages.
2010-12-04 09:25:48 -06:00
|
|
|
if ( CatalogExtension::isPad(masterNet->getCell()) ) return;
|
|
|
|
|
* ./kite:
- New: In BuilPowerRails & BuildBlockage, specific support for chip-level
design. The Alliance "top chip" design hierarchical structure is
hard-coded. Top level POWER/GROUND/CLOCK nets must always have the
<vsse>, <vdde>, <ck>, <vssi>, <vddi>, <ckc>, <cki> names.
Specific method to get trans-hierarchical root nets, espcially in
case of global ones (POWER/GROUND). Clock is *not* global.
Some correction in the manner obscured tracks are computeds.
- New: ProtectRoutingPad module that perform a more clean work for protecting
unused RoutingPad.
- Bug: In BuildPowerRails, uses stable_sort<> instead of sort<>, which
causes unexplained core dumps (seems to try to perform a comparison
using the "end" pseudo element). Already occured in Knik, no explanation
other than a STL bug.
- Change: Slight changes in the weights to move up. Now needs a full empty
track instead of a half one.
2010-11-16 08:00:03 -06:00
|
|
|
forEach ( Segment*, isegment, masterNet->getSegments() ) {
|
|
|
|
RoutingPlane* plane = Session::getKiteEngine()->getRoutingPlaneByLayer(isegment->getLayer());
|
|
|
|
if ( plane == NULL ) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned int direction = plane->getDirection();
|
|
|
|
DbU::Unit wireWidth = plane->getLayerGauge()->getWireWidth();
|
|
|
|
DbU::Unit delta = plane->getLayerGauge()->getHalfPitch()
|
|
|
|
+ wireWidth/2
|
|
|
|
- DbU::lambda(0.1);
|
|
|
|
DbU::Unit extension = isegment->getLayer()->getExtentionCap();
|
|
|
|
|
|
|
|
if ( usedComponent == dynamic_cast<Component*>(*isegment) ) continue;
|
|
|
|
if ( not NetExternalComponents::isExternal(*isegment) ) continue;
|
|
|
|
|
|
|
|
//cinfo << "Protecting " << *isegment << endl;
|
|
|
|
|
|
|
|
Box bb ( (*isegment)->getBoundingBox() );
|
|
|
|
transformation.applyOn ( bb );
|
|
|
|
|
|
|
|
//cinfo << "bb: " << bb << endl;
|
|
|
|
|
|
|
|
if ( direction == Constant::Horizontal ) {
|
|
|
|
DbU::Unit axisMin = bb.getYMin() - delta;
|
|
|
|
DbU::Unit axisMax = bb.getYMax() + delta;
|
|
|
|
|
|
|
|
Track* track = plane->getTrackByPosition ( axisMin, Constant::Superior );
|
|
|
|
for ( ; track and (track->getAxis() <= axisMax) ; track = track->getNext() ) {
|
|
|
|
Horizontal* segment = Horizontal::create ( rp->getNet()
|
|
|
|
, isegment->getLayer()
|
|
|
|
, track->getAxis()
|
|
|
|
, wireWidth
|
|
|
|
, bb.getXMin()+extension
|
|
|
|
, bb.getXMax()-extension
|
|
|
|
);
|
* ./kite:
- Change: Propagate renaming "obstacle" -> "blockage".
- Bug/Change: In Configuration, the value of the extensionCap was too big
(1.5 lambda), reduce to 0.5 lambda. This is a problem, the extension
should be coupled to the layer as it is not the same for each METAL.
- Bug: When using TrackElement, always uses the virtual "->isFixed()" method
instead of trying to access to "->base()->isFixed()" as the base may be
NULL in case of blockage/fixed segment.
- Change: Merge PowerRails & Blockage trans-hierarchical construction (into
PowerRails). All blockages are groupeds under "blockagenet".
Allows to remove TrackBlockage & BuildBlockages.
- Change: In KiteEngine::annotateGloblalGraph(), when routing a full chip,
ring power segments around the core must completly saturate the edges
in their segment direction. This is to prevent the global router to
use paths under the power/ground ring (may generate unsolvable configs).
- Change: In KiteEngine::annotateGloblalGraph(), when routing a full chip,
distinguish three areas: the core (65%), the corona (90%) and the pads
(100%). Capacities on the edges are sets accordingly.
- Change: In RoutingEvent, introduce an alternative algorithm for
conflictSolve1, FindPath which try to deduce the breakpoints from a
truly explorated path. Unfortunatly this gives worst results than the
Cs1Candidates method. The why should be investigated as it's a critical
point in the algorithm.
- Change: In Manipulator::ripupPerpandicular(), when a caged perpandicular
is encountered, instead of just "stopping", rip it up and change is
axis hint (actually increase) it's axis hint so it stands a chance to
go outside the track with an obstacle.
- Change: In RoutingEvent/State::slackenTopology(), allow move up of local
segments when they are tightly constrained *and* blocked (cageds).
Partial modification of functions calls from booleans to flags.
- Bug: In NegociateWindow::NegociateOverlapCost, check for fixed segments
before trying to get DataNegociate. The lack of DataNegociate cause the
TrackElement to be discarted. It's a failsafe behavior, but it leads to
overlaps.
- Bug: In ProtectRoutingPad, in Pad Cells only, *do not* protect RoutingPad
to avoid the edge capacity over the pad to decrease to zero. This is
due to unused RoutingPads being accounted as blockages.
2010-12-04 09:25:48 -06:00
|
|
|
// TrackElement* element =
|
|
|
|
TrackFixedSegment::create ( track, segment );
|
* ./kite:
- New: In BuilPowerRails & BuildBlockage, specific support for chip-level
design. The Alliance "top chip" design hierarchical structure is
hard-coded. Top level POWER/GROUND/CLOCK nets must always have the
<vsse>, <vdde>, <ck>, <vssi>, <vddi>, <ckc>, <cki> names.
Specific method to get trans-hierarchical root nets, espcially in
case of global ones (POWER/GROUND). Clock is *not* global.
Some correction in the manner obscured tracks are computeds.
- New: ProtectRoutingPad module that perform a more clean work for protecting
unused RoutingPad.
- Bug: In BuildPowerRails, uses stable_sort<> instead of sort<>, which
causes unexplained core dumps (seems to try to perform a comparison
using the "end" pseudo element). Already occured in Knik, no explanation
other than a STL bug.
- Change: Slight changes in the weights to move up. Now needs a full empty
track instead of a half one.
2010-11-16 08:00:03 -06:00
|
|
|
//cinfo << " Rp Protect:" << track << "+" << element << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Track* track = plane->getTrackByPosition ( axisMin, Constant::Superior );
|
|
|
|
// for ( ; track and (track->getAxis() <= axisMax) ; track = track->getNext() ) {
|
|
|
|
// Point sourcePosition (bb.getXMin()+extension,track->getAxis());
|
|
|
|
// Point targetPosition (bb.getXMax()-extension,track->getAxis());
|
|
|
|
|
|
|
|
// Katabatic::GCell* sourceGCell = Session::getKatabatic()->getGCellGrid()->getGCell ( sourcePosition );
|
|
|
|
// Katabatic::GCell* targetGCell = Session::getKatabatic()->getGCellGrid()->getGCell ( targetPosition );
|
|
|
|
|
|
|
|
// cinfo << " S: " << sourceGCell << " from " << sourcePosition << endl;
|
|
|
|
// cinfo << " T: " << targetGCell << " from " << targetPosition << endl;
|
|
|
|
|
|
|
|
// unsigned int segmentType
|
|
|
|
// = (sourceGCell == targetGCell) ? AutoSegment::Local : AutoSegment::Global;
|
|
|
|
|
|
|
|
// AutoContact* source = AutoContact::fromRp ( sourceGCell
|
|
|
|
// , rp
|
|
|
|
// , rp->getLayer()
|
|
|
|
// , sourcePosition
|
|
|
|
// , DbU::lambda(1.0), DbU::lambda(1.0)
|
|
|
|
// , true
|
|
|
|
// );
|
|
|
|
|
|
|
|
// AutoContact* target = AutoContact::fromRp ( targetGCell
|
|
|
|
// , rp
|
|
|
|
// , rp->getLayer()
|
|
|
|
// , targetPosition
|
|
|
|
// , DbU::lambda(1.0), DbU::lambda(1.0)
|
|
|
|
// , true
|
|
|
|
// );
|
|
|
|
|
|
|
|
// AutoSegment* segment = AutoSegment::create ( source
|
|
|
|
// , target
|
|
|
|
// , Constant::Horizontal
|
|
|
|
// , segmentType
|
|
|
|
// , true
|
|
|
|
// , false
|
|
|
|
// );
|
|
|
|
// segment->setLayer ( isegment->getLayer() );
|
|
|
|
// segment->setFixed ( true );
|
|
|
|
|
|
|
|
// bool created = true;
|
|
|
|
// TrackElement* element = TrackSegment::create ( segment, track, created );
|
|
|
|
// cinfo << " Rp Protect " << track << "+" << element << endl;
|
|
|
|
// }
|
|
|
|
} else {
|
|
|
|
DbU::Unit axisMin = bb.getXMin() - delta;
|
|
|
|
DbU::Unit axisMax = bb.getXMax() + delta;
|
|
|
|
|
|
|
|
Track* track = plane->getTrackByPosition ( axisMin, Constant::Superior );
|
|
|
|
for ( ; track and (track->getAxis() <= axisMax) ; track = track->getNext() ) {
|
|
|
|
Vertical* segment = Vertical::create ( rp->getNet()
|
|
|
|
, isegment->getLayer()
|
|
|
|
, track->getAxis()
|
|
|
|
, wireWidth
|
|
|
|
, bb.getYMin()+extension
|
|
|
|
, bb.getYMax()-extension
|
|
|
|
);
|
* ./kite:
- Change: Propagate renaming "obstacle" -> "blockage".
- Bug/Change: In Configuration, the value of the extensionCap was too big
(1.5 lambda), reduce to 0.5 lambda. This is a problem, the extension
should be coupled to the layer as it is not the same for each METAL.
- Bug: When using TrackElement, always uses the virtual "->isFixed()" method
instead of trying to access to "->base()->isFixed()" as the base may be
NULL in case of blockage/fixed segment.
- Change: Merge PowerRails & Blockage trans-hierarchical construction (into
PowerRails). All blockages are groupeds under "blockagenet".
Allows to remove TrackBlockage & BuildBlockages.
- Change: In KiteEngine::annotateGloblalGraph(), when routing a full chip,
ring power segments around the core must completly saturate the edges
in their segment direction. This is to prevent the global router to
use paths under the power/ground ring (may generate unsolvable configs).
- Change: In KiteEngine::annotateGloblalGraph(), when routing a full chip,
distinguish three areas: the core (65%), the corona (90%) and the pads
(100%). Capacities on the edges are sets accordingly.
- Change: In RoutingEvent, introduce an alternative algorithm for
conflictSolve1, FindPath which try to deduce the breakpoints from a
truly explorated path. Unfortunatly this gives worst results than the
Cs1Candidates method. The why should be investigated as it's a critical
point in the algorithm.
- Change: In Manipulator::ripupPerpandicular(), when a caged perpandicular
is encountered, instead of just "stopping", rip it up and change is
axis hint (actually increase) it's axis hint so it stands a chance to
go outside the track with an obstacle.
- Change: In RoutingEvent/State::slackenTopology(), allow move up of local
segments when they are tightly constrained *and* blocked (cageds).
Partial modification of functions calls from booleans to flags.
- Bug: In NegociateWindow::NegociateOverlapCost, check for fixed segments
before trying to get DataNegociate. The lack of DataNegociate cause the
TrackElement to be discarted. It's a failsafe behavior, but it leads to
overlaps.
- Bug: In ProtectRoutingPad, in Pad Cells only, *do not* protect RoutingPad
to avoid the edge capacity over the pad to decrease to zero. This is
due to unused RoutingPads being accounted as blockages.
2010-12-04 09:25:48 -06:00
|
|
|
// TrackElement* element =
|
|
|
|
TrackFixedSegment::create ( track, segment );
|
* ./kite:
- New: In BuilPowerRails & BuildBlockage, specific support for chip-level
design. The Alliance "top chip" design hierarchical structure is
hard-coded. Top level POWER/GROUND/CLOCK nets must always have the
<vsse>, <vdde>, <ck>, <vssi>, <vddi>, <ckc>, <cki> names.
Specific method to get trans-hierarchical root nets, espcially in
case of global ones (POWER/GROUND). Clock is *not* global.
Some correction in the manner obscured tracks are computeds.
- New: ProtectRoutingPad module that perform a more clean work for protecting
unused RoutingPad.
- Bug: In BuildPowerRails, uses stable_sort<> instead of sort<>, which
causes unexplained core dumps (seems to try to perform a comparison
using the "end" pseudo element). Already occured in Knik, no explanation
other than a STL bug.
- Change: Slight changes in the weights to move up. Now needs a full empty
track instead of a half one.
2010-11-16 08:00:03 -06:00
|
|
|
//cinfo << " Rp Protect:" << track << "+" << element << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Track* track = plane->getTrackByPosition ( axisMin, Constant::Superior );
|
|
|
|
// for ( ; track and (track->getAxis() <= axisMax) ; track = track->getNext() ) {
|
|
|
|
// cinfo << " Track Axis: " << DbU::getValueString(track->getAxis()) << endl;
|
|
|
|
|
|
|
|
// Point sourcePosition (track->getAxis(),bb.getYMin()+extension);
|
|
|
|
// Point targetPosition (track->getAxis(),bb.getYMax()-extension);
|
|
|
|
|
|
|
|
// Katabatic::GCell* sourceGCell = Session::getKatabatic()->getGCellGrid()->getGCell ( sourcePosition );
|
|
|
|
// Katabatic::GCell* targetGCell = Session::getKatabatic()->getGCellGrid()->getGCell ( targetPosition );
|
|
|
|
|
|
|
|
// cinfo << " S: " << sourceGCell << " from " << sourcePosition << endl;
|
|
|
|
// cinfo << " T: " << targetGCell << " from " << targetPosition << endl;
|
|
|
|
|
|
|
|
// unsigned int segmentType
|
|
|
|
// = (sourceGCell == targetGCell) ? AutoSegment::Local : AutoSegment::Global;
|
|
|
|
|
|
|
|
// AutoContact* source = AutoContact::fromRp ( sourceGCell
|
|
|
|
// , rp
|
|
|
|
// , rp->getLayer()
|
|
|
|
// , sourcePosition
|
|
|
|
// , DbU::lambda(1.0), DbU::lambda(1.0)
|
|
|
|
// , true
|
|
|
|
// );
|
|
|
|
|
|
|
|
// AutoContact* target = AutoContact::fromRp ( targetGCell
|
|
|
|
// , rp
|
|
|
|
// , rp->getLayer()
|
|
|
|
// , targetPosition
|
|
|
|
// , DbU::lambda(1.0), DbU::lambda(1.0)
|
|
|
|
// , true
|
|
|
|
// );
|
|
|
|
|
|
|
|
// AutoSegment* segment = AutoSegment::create ( source
|
|
|
|
// , target
|
|
|
|
// , Constant::Vertical
|
|
|
|
// , segmentType
|
|
|
|
// , true
|
|
|
|
// , false
|
|
|
|
// );
|
|
|
|
// segment->setLayer ( isegment->getLayer() );
|
|
|
|
// segment->setFixed ( true );
|
|
|
|
|
|
|
|
// bool created = true;
|
|
|
|
// TrackElement* element = TrackSegment::create ( segment, track, created );
|
|
|
|
// cinfo << " Rp Protect: " << track << "+" << element << endl;
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} // End of anonymous namespace.
|
|
|
|
|
|
|
|
|
|
|
|
namespace Kite {
|
|
|
|
|
|
|
|
|
|
|
|
using Hurricane::DataBase;
|
|
|
|
using Hurricane::Technology;
|
|
|
|
using Hurricane::BasicLayer;
|
|
|
|
using Hurricane::ForEachIterator;
|
|
|
|
using Hurricane::Cell;
|
|
|
|
|
|
|
|
|
|
|
|
void KiteEngine::protectRoutingPads ()
|
|
|
|
{
|
|
|
|
cmess1 << " o Protect external components not useds as RoutingPads." << endl;
|
|
|
|
|
|
|
|
forEach ( Net*, inet, getCell()->getNets() ) {
|
|
|
|
if ( (*inet)->isSupply() ) continue;
|
|
|
|
|
|
|
|
forEach ( RoutingPad*, irp, (*inet)->getRoutingPads() ) {
|
|
|
|
protectRoutingPad ( *irp );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Session::revalidate ();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} // End of Kite namespace.
|