In protectCagedTerminal() check that the METAL3 track is free.
* New: In Kite, in protectCagedTerminal(), check that the perpandicular top METAL3 track is free before inserting the fixed protection. They are added *after* the Pre-Routed stage and therefore we have to check they do not cross. * Change: In Kite, in NegociateWindow, print statistics before fixing segment in the pre-routed stage to get correct results. * Change, In CRL Core, in Measures when an addMeasure is performed twice, let the new data erase the previous one (instead of keeping the previous one).
This commit is contained in:
parent
20d25b2053
commit
2b243fc0ca
|
@ -1,15 +1,9 @@
|
||||||
|
|
||||||
// -*- C++ -*-
|
// -*- C++ -*-
|
||||||
//
|
//
|
||||||
// This file is part of the Coriolis Software.
|
// This file is part of the Coriolis Software.
|
||||||
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved
|
// Copyright (c) UPMC 2008-2014, All Rights Reserved
|
||||||
//
|
//
|
||||||
// ===================================================================
|
// +-----------------------------------------------------------------+
|
||||||
//
|
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// x-----------------------------------------------------------------x
|
|
||||||
// | |
|
|
||||||
// | C O R I O L I S |
|
// | C O R I O L I S |
|
||||||
// | Alliance / Hurricane Interface |
|
// | Alliance / Hurricane Interface |
|
||||||
// | |
|
// | |
|
||||||
|
@ -17,21 +11,18 @@
|
||||||
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
// | =============================================================== |
|
// | =============================================================== |
|
||||||
// | C++ Header : "./Measures.h" |
|
// | C++ Header : "./Measures.h" |
|
||||||
// | *************************************************************** |
|
// +-----------------------------------------------------------------+
|
||||||
// | U p d a t e s |
|
|
||||||
// | |
|
|
||||||
// x-----------------------------------------------------------------x
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __CRL_MEASURES_PROPERTY__
|
#ifndef CRL_MEASURES_PROPERTY_H
|
||||||
#define __CRL_MEASURES_PROPERTY__
|
#define CRL_MEASURES_PROPERTY_H
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include "hurricane/Property.h"
|
#include "hurricane/Property.h"
|
||||||
|
|
||||||
namespace Hurricane {
|
namespace Hurricane {
|
||||||
class DBo;
|
class DBo;
|
||||||
|
@ -168,16 +159,28 @@ namespace CRL {
|
||||||
template<typename Data>
|
template<typename Data>
|
||||||
inline void addMeasure ( DBo* object, const Name& name, const Data& data, unsigned int width )
|
inline void addMeasure ( DBo* object, const Name& name, const Data& data, unsigned int width )
|
||||||
{
|
{
|
||||||
Measures::Extension* extension = Measures::_getOrCreate ( object );
|
Measures::Extension* extension = Measures::_getOrCreate( object );
|
||||||
extension->getValue()._measures.insert ( std::make_pair(name,new Measure<Data>(name,data,width)) );
|
MeasuresSet::iterator imeasure = extension->getValue()._measures.find(name);
|
||||||
|
|
||||||
|
if (imeasure == extension->getValue()._measures.end()) {
|
||||||
|
extension->getValue()._measures.insert ( std::make_pair(name,new Measure<Data>(name,data,width)) );
|
||||||
|
} else {
|
||||||
|
static_cast< Measure<Data>* >( (*imeasure).second )->setData( data );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<typename Data>
|
template<typename Data>
|
||||||
inline void addMeasure ( DBo* object, const Name& name, Data* data )
|
inline void addMeasure ( DBo* object, const Name& name, Data* data )
|
||||||
{
|
{
|
||||||
Measures::Extension* extension = Measures::_getOrCreate ( object );
|
Measures::Extension* extension = Measures::_getOrCreate( object );
|
||||||
extension->getValue()._measures.insert ( std::make_pair(name,new Measure<Data>(name,data)) );
|
MeasuresSet::iterator imeasure = extension->getValue()._measures.find(name);
|
||||||
|
|
||||||
|
if (imeasure == extension->getValue()._measures.end()) {
|
||||||
|
extension->getValue()._measures.insert( std::make_pair(name,new Measure<Data>(name,data)) );
|
||||||
|
} else {
|
||||||
|
static_cast< Measure<Data>* >( (*imeasure).second )->setData( data );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -201,4 +204,4 @@ INSPECTOR_P_SUPPORT(CRL::BaseMeasure);
|
||||||
INSPECTOR_P_SUPPORT(CRL::MeasuresDatas);
|
INSPECTOR_P_SUPPORT(CRL::MeasuresDatas);
|
||||||
|
|
||||||
|
|
||||||
#endif // __CRL_MEASURES_PROPERTY__
|
#endif // CRL_MEASURES_PROPERTY_H
|
||||||
|
|
|
@ -576,7 +576,6 @@ namespace Kite {
|
||||||
_negociateWindow->setGCells( *(getGCellGrid()->getGCellVector()) );
|
_negociateWindow->setGCells( *(getGCellGrid()->getGCellVector()) );
|
||||||
_computeCagedConstraints();
|
_computeCagedConstraints();
|
||||||
_negociateWindow->run( flags );
|
_negociateWindow->run( flags );
|
||||||
_negociateWindow->printStatistics();
|
|
||||||
_negociateWindow->destroy();
|
_negociateWindow->destroy();
|
||||||
_negociateWindow = NULL;
|
_negociateWindow = NULL;
|
||||||
|
|
||||||
|
|
|
@ -493,6 +493,7 @@ namespace Kite {
|
||||||
|
|
||||||
_flags |= flags;
|
_flags |= flags;
|
||||||
_negociate();
|
_negociate();
|
||||||
|
printStatistics();
|
||||||
|
|
||||||
if (flags & KtPreRoutedStage) {
|
if (flags & KtPreRoutedStage) {
|
||||||
_kite->setFixedPreRouted();
|
_kite->setFixedPreRouted();
|
||||||
|
|
|
@ -233,6 +233,7 @@ namespace {
|
||||||
const Layer* metal2 = configuration->getRoutingLayer( 1 );
|
const Layer* metal2 = configuration->getRoutingLayer( 1 );
|
||||||
const Layer* metal3 = configuration->getRoutingLayer( 2 );
|
const Layer* metal3 = configuration->getRoutingLayer( 2 );
|
||||||
Net* neighborNet = NULL;
|
Net* neighborNet = NULL;
|
||||||
|
RoutingPlane* metal3plane = track->getRoutingPlane()->getTop();
|
||||||
|
|
||||||
if (track->getLayer() != metal2) {
|
if (track->getLayer() != metal2) {
|
||||||
ltraceout(150);
|
ltraceout(150);
|
||||||
|
@ -249,7 +250,7 @@ namespace {
|
||||||
//if (freeInterval.getSize() < ppitch*6) {
|
//if (freeInterval.getSize() < ppitch*6) {
|
||||||
if ( (segment->getSourceU() - freeInterval.getVMin() < ppitch*3)
|
if ( (segment->getSourceU() - freeInterval.getVMin() < ppitch*3)
|
||||||
or (freeInterval.getVMax() - segment->getTargetU() < ppitch*3) ) {
|
or (freeInterval.getVMax() - segment->getTargetU() < ppitch*3) ) {
|
||||||
cinfo << "Caged terminal: " << segment << endl;
|
cparanoid << "[INFO] Caged terminal: " << segment << endl;
|
||||||
if ( (segment->getLayer () != metal2)
|
if ( (segment->getLayer () != metal2)
|
||||||
or (segment->getLength() >= ppitch)
|
or (segment->getLength() >= ppitch)
|
||||||
or (segment->getNet () == neighborNet) ) {
|
or (segment->getNet () == neighborNet) ) {
|
||||||
|
@ -257,6 +258,15 @@ namespace {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Katabatic::AutoContact* support = segment->base()->getAutoSource();
|
||||||
|
RoutingPad* rp = dynamic_cast<RoutingPad*>(support->getAnchor());
|
||||||
|
Track* metal3track = metal3plane->getTrackByPosition( rp->getSourcePosition().getX() );
|
||||||
|
|
||||||
|
if (metal3track->getFreeInterval(segment->getAxis(),segment->getNet()).isEmpty()) {
|
||||||
|
cparanoid << "[INFO] Cannot protect caged terminal because top layer (metal3) is obstructed." << endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (segment->getSourceU() - lastMovedUp < ppitch*4) {
|
if (segment->getSourceU() - lastMovedUp < ppitch*4) {
|
||||||
++moveUpCount;
|
++moveUpCount;
|
||||||
if (moveUpCount % 2 == 0) {
|
if (moveUpCount % 2 == 0) {
|
||||||
|
@ -267,9 +277,6 @@ namespace {
|
||||||
}
|
}
|
||||||
lastMovedUp = segment->getSourceU();
|
lastMovedUp = segment->getSourceU();
|
||||||
|
|
||||||
Katabatic::AutoContact* support = segment->base()->getAutoSource();
|
|
||||||
RoutingPad* rp = dynamic_cast<RoutingPad*>(support->getAnchor());
|
|
||||||
|
|
||||||
Katabatic::AutoContact* source
|
Katabatic::AutoContact* source
|
||||||
= Katabatic::AutoContactTerminal::create( support->getGCell()
|
= Katabatic::AutoContactTerminal::create( support->getGCell()
|
||||||
, rp
|
, rp
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
// -*- C++ -*-
|
// -*- C++ -*-
|
||||||
//
|
//
|
||||||
// This file is part of the Coriolis Software.
|
// This file is part of the Coriolis Software.
|
||||||
// Copyright (c) UPMC 2008-2013, All Rights Reserved
|
// Copyright (c) UPMC 2008-2014, All Rights Reserved
|
||||||
//
|
//
|
||||||
// +-----------------------------------------------------------------+
|
// +-----------------------------------------------------------------+
|
||||||
// | C O R I O L I S |
|
// | C O R I O L I S |
|
||||||
|
|
Loading…
Reference in New Issue