Merge branch 'devel_anabatic' of ssh://bop.soc.lip6.fr/users/largo2/git/coriolis into devel_anabatic
Conflicts: anabatic/src/LoadGlobalRouting.cpp
This commit is contained in:
commit
6d0b26b956
|
@ -18,6 +18,7 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "hurricane/Bug.h"
|
#include "hurricane/Bug.h"
|
||||||
#include "hurricane/Error.h"
|
#include "hurricane/Error.h"
|
||||||
|
#include "hurricane/Breakpoint.h"
|
||||||
#include "hurricane/RegularLayer.h"
|
#include "hurricane/RegularLayer.h"
|
||||||
#include "hurricane/Horizontal.h"
|
#include "hurricane/Horizontal.h"
|
||||||
#include "hurricane/RoutingPad.h"
|
#include "hurricane/RoutingPad.h"
|
||||||
|
@ -38,6 +39,7 @@ namespace Anabatic {
|
||||||
using std::ostringstream;
|
using std::ostringstream;
|
||||||
using Hurricane::Bug;
|
using Hurricane::Bug;
|
||||||
using Hurricane::Error;
|
using Hurricane::Error;
|
||||||
|
using Hurricane::Breakpoint;
|
||||||
using Hurricane::RegularLayer;
|
using Hurricane::RegularLayer;
|
||||||
using Hurricane::Component;
|
using Hurricane::Component;
|
||||||
using Hurricane::Horizontal;
|
using Hurricane::Horizontal;
|
||||||
|
@ -73,11 +75,35 @@ namespace Anabatic {
|
||||||
{
|
{
|
||||||
cdebug_log(112,1) << "RawGCellsUnder::RawGCellsUnder(): " << segment << endl;
|
cdebug_log(112,1) << "RawGCellsUnder::RawGCellsUnder(): " << segment << endl;
|
||||||
|
|
||||||
GCell* gsource = engine->getGCellUnder( segment->getSourcePosition() );
|
Box gcellsArea = engine->getCell()->getAbutmentBox();
|
||||||
GCell* gtarget = engine->getGCellUnder( segment->getTargetPosition() );
|
Point sourcePosition = segment->getSourcePosition();
|
||||||
|
Point targetPosition = segment->getTargetPosition();
|
||||||
|
|
||||||
|
if ( (sourcePosition.getX() >= gcellsArea.getXMax())
|
||||||
|
or (sourcePosition.getY() >= gcellsArea.getYMax())
|
||||||
|
or (targetPosition.getX() <= gcellsArea.getXMin())
|
||||||
|
or (targetPosition.getY() <= gcellsArea.getYMin()) ) {
|
||||||
|
cerr << Error( "RawGCellsUnder::RawGCellsUnder(): %s is completly outside the GCells area (ignored)."
|
||||||
|
, getString(segment).c_str()
|
||||||
|
) << endl;
|
||||||
|
cdebug_tabw(112,-1);
|
||||||
|
DebugSession::close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DbU::Unit xsource = std::max( sourcePosition.getX(), gcellsArea.getXMin() );
|
||||||
|
DbU::Unit ysource = std::max( sourcePosition.getY(), gcellsArea.getYMin() );
|
||||||
|
DbU::Unit xtarget = std::min( targetPosition.getX(), gcellsArea.getXMax() );
|
||||||
|
DbU::Unit ytarget = std::min( targetPosition.getY(), gcellsArea.getYMax() );
|
||||||
|
|
||||||
|
if (xtarget == gcellsArea.getXMax()) --xtarget;
|
||||||
|
if (ytarget == gcellsArea.getYMax()) --ytarget;
|
||||||
|
|
||||||
|
GCell* gsource = engine->getGCellUnder( xsource, ysource );
|
||||||
|
GCell* gtarget = engine->getGCellUnder( xtarget, ytarget );
|
||||||
|
|
||||||
if (not gsource) {
|
if (not gsource) {
|
||||||
cerr << Error( "RawGCellsUnder::RawGCellsUnder(): %s source not over a GCell (ignored)."
|
cerr << Bug( "RawGCellsUnder::RawGCellsUnder(): %s source not under a GCell (ignored)."
|
||||||
, getString(segment).c_str()
|
, getString(segment).c_str()
|
||||||
) << endl;
|
) << endl;
|
||||||
cdebug_tabw(112,-1);
|
cdebug_tabw(112,-1);
|
||||||
|
@ -85,7 +111,7 @@ namespace Anabatic {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (not gtarget) {
|
if (not gtarget) {
|
||||||
cerr << Error( "RawGCellsUnder::RawGCellsUnder(): %s target not over a GCell (ignored)."
|
cerr << Bug( "RawGCellsUnder::RawGCellsUnder(): %s target not under a GCell (ignored)."
|
||||||
, getString(segment).c_str()
|
, getString(segment).c_str()
|
||||||
) << endl;
|
) << endl;
|
||||||
cdebug_tabw(112,-1);
|
cdebug_tabw(112,-1);
|
||||||
|
@ -173,7 +199,7 @@ namespace Anabatic {
|
||||||
AnabaticEngine::AnabaticEngine ( Cell* cell )
|
AnabaticEngine::AnabaticEngine ( Cell* cell )
|
||||||
: Super(cell)
|
: Super(cell)
|
||||||
, _timer ()
|
, _timer ()
|
||||||
, _configuration (new ConfigurationConcrete())
|
, _configuration (new Configuration())
|
||||||
, _chipTools (cell)
|
, _chipTools (cell)
|
||||||
, _state (EngineCreation)
|
, _state (EngineCreation)
|
||||||
, _matrix ()
|
, _matrix ()
|
||||||
|
@ -249,7 +275,7 @@ namespace Anabatic {
|
||||||
|
|
||||||
void AnabaticEngine::_gutAnabatic ()
|
void AnabaticEngine::_gutAnabatic ()
|
||||||
{
|
{
|
||||||
Session::open( this );
|
openSession();
|
||||||
|
|
||||||
_flags.reset( Flags::DestroyBaseContact|Flags::DestroyBaseSegment );
|
_flags.reset( Flags::DestroyBaseContact|Flags::DestroyBaseSegment );
|
||||||
|
|
||||||
|
@ -299,6 +325,21 @@ namespace Anabatic {
|
||||||
{ return _configuration; }
|
{ return _configuration; }
|
||||||
|
|
||||||
|
|
||||||
|
Interval AnabaticEngine::getUSide ( Flags direction ) const
|
||||||
|
{
|
||||||
|
Interval side;
|
||||||
|
Box bBox ( getCell()->getBoundingBox() );
|
||||||
|
|
||||||
|
if (direction & Flags::Horizontal) side = Interval( bBox.getXMin(), bBox.getXMax() );
|
||||||
|
else if (direction & Flags::Vertical ) side = Interval( bBox.getYMin(), bBox.getYMax() );
|
||||||
|
else {
|
||||||
|
cerr << Error( "AnabaticEngine::getUSide(): Unknown direction flag \"%i\""
|
||||||
|
, getString(direction).c_str() ) << endl;
|
||||||
|
}
|
||||||
|
return side;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int AnabaticEngine::getCapacity ( Interval span, Flags flags ) const
|
int AnabaticEngine::getCapacity ( Interval span, Flags flags ) const
|
||||||
{
|
{
|
||||||
int capacity = 0;
|
int capacity = 0;
|
||||||
|
@ -331,6 +372,10 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AnabaticEngine::openSession ()
|
||||||
|
{ Session::_open(this); }
|
||||||
|
|
||||||
|
|
||||||
void AnabaticEngine::reset ()
|
void AnabaticEngine::reset ()
|
||||||
{
|
{
|
||||||
_gutAnabatic();
|
_gutAnabatic();
|
||||||
|
@ -554,6 +599,7 @@ namespace Anabatic {
|
||||||
|
|
||||||
void AnabaticEngine::ripup ( Segment* seed, Flags flags )
|
void AnabaticEngine::ripup ( Segment* seed, Flags flags )
|
||||||
{
|
{
|
||||||
|
|
||||||
Net* net = seed->getNet();
|
Net* net = seed->getNet();
|
||||||
|
|
||||||
DebugSession::open( net, 112, 120 );
|
DebugSession::open( net, 112, 120 );
|
||||||
|
@ -614,6 +660,8 @@ namespace Anabatic {
|
||||||
|
|
||||||
Contact* source = dynamic_cast<Contact*>( segment->getSource() );
|
Contact* source = dynamic_cast<Contact*>( segment->getSource() );
|
||||||
Contact* target = dynamic_cast<Contact*>( segment->getTarget() );
|
Contact* target = dynamic_cast<Contact*>( segment->getTarget() );
|
||||||
|
segment->getSourceHook()->detach();
|
||||||
|
segment->getTargetHook()->detach();
|
||||||
segment->destroy();
|
segment->destroy();
|
||||||
bool deletedSource = gcells->gcellAt( 0 )->unrefContact( source );
|
bool deletedSource = gcells->gcellAt( 0 )->unrefContact( source );
|
||||||
bool deletedTarget = gcells->gcellAt( gcells->size()-1 )->unrefContact( target );
|
bool deletedTarget = gcells->gcellAt( gcells->size()-1 )->unrefContact( target );
|
||||||
|
@ -635,7 +683,7 @@ namespace Anabatic {
|
||||||
|
|
||||||
getNetData( net )->setGlobalRouted( false );
|
getNetData( net )->setGlobalRouted( false );
|
||||||
|
|
||||||
cdebug_tabw(111,-1);
|
cdebug_tabw(112,-1);
|
||||||
DebugSession::close();
|
DebugSession::close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1008,6 +1056,46 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AnabaticEngine::_check ( Net* net ) const
|
||||||
|
{
|
||||||
|
cdebug_log(149,1) << "Checking " << net << endl;
|
||||||
|
for ( Segment* segment : net->getComponents().getSubSet<Segment*>() ) {
|
||||||
|
AutoSegment* autoSegment = _lookup( segment );
|
||||||
|
cdebug_log(149,0) << autoSegment << endl;
|
||||||
|
if (autoSegment) {
|
||||||
|
AutoContact* autoContact = autoSegment->getAutoSource();
|
||||||
|
cdebug_log(149,0) << autoContact << endl;
|
||||||
|
if (autoContact) autoContact->checkTopology();
|
||||||
|
|
||||||
|
autoContact = autoSegment->getAutoTarget();
|
||||||
|
cdebug_log(149,0) << autoContact << endl;
|
||||||
|
if (autoContact) autoContact->checkTopology();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cdebug_tabw(149,-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool AnabaticEngine::_check ( const char* message ) const
|
||||||
|
{
|
||||||
|
bool coherency = true;
|
||||||
|
if (message)
|
||||||
|
cerr << " o checking Anabatic DB (" << message << ")." << endl;
|
||||||
|
|
||||||
|
for ( auto element : _autoSegmentLut )
|
||||||
|
coherency = element.second->_check() and coherency;
|
||||||
|
|
||||||
|
for ( GCell* gcell : _gcells ) {
|
||||||
|
for ( AutoContact* contact : gcell->getContacts() )
|
||||||
|
contact->checkTopology();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (message) cerr << " - completed." << endl;
|
||||||
|
|
||||||
|
return coherency;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
string AnabaticEngine::_getTypeName () const
|
string AnabaticEngine::_getTypeName () const
|
||||||
{ return getString(_toolName); }
|
{ return getString(_toolName); }
|
||||||
|
|
||||||
|
|
|
@ -335,6 +335,10 @@ namespace Anabatic {
|
||||||
message << "Terminal horizontal segment Y " << DbU::getValueString(_segment->getY())
|
message << "Terminal horizontal segment Y " << DbU::getValueString(_segment->getY())
|
||||||
<< " axis is outside RoutingPad " << getUConstraints(Flags::Vertical) << ".";
|
<< " axis is outside RoutingPad " << getUConstraints(Flags::Vertical) << ".";
|
||||||
|
|
||||||
|
Interval intv;
|
||||||
|
_segment->getConstraints( intv );
|
||||||
|
message << "\n Segment constraints: " << intv << endl;
|
||||||
|
|
||||||
unsigned int flags = 0;
|
unsigned int flags = 0;
|
||||||
if (_segment->isCreated()) flags |= Flags::CParanoid;
|
if (_segment->isCreated()) flags |= Flags::CParanoid;
|
||||||
showTopologyError( message.str(), flags );
|
showTopologyError( message.str(), flags );
|
||||||
|
|
|
@ -150,10 +150,16 @@ namespace Anabatic {
|
||||||
<< DbU::getValueString(constraintMax) << "]"
|
<< DbU::getValueString(constraintMax) << "]"
|
||||||
<< endl;
|
<< endl;
|
||||||
|
|
||||||
constraintMin = max ( constraintMin, getUserConstraints().getVMin() );
|
constraintMin = std::max ( constraintMin, getAutoSource()->getCBYMin() );
|
||||||
constraintMax = min ( constraintMax, getUserConstraints().getVMax() );
|
constraintMax = std::min ( constraintMax, getAutoSource()->getCBYMax() );
|
||||||
|
cdebug_log(149,0) << "Merge with source constraints: ["
|
||||||
|
<< DbU::getValueString(getAutoSource()->getCBYMin()) << ":"
|
||||||
|
<< DbU::getValueString(getAutoSource()->getCBYMax()) << "]"
|
||||||
|
<< endl;
|
||||||
|
|
||||||
cdebug_log(149,0) << "Merge with user constraints: " << getUserConstraints() << " ["
|
constraintMin = std::max ( constraintMin, getUserConstraints().getVMin() );
|
||||||
|
constraintMax = std::min ( constraintMax, getUserConstraints().getVMax() );
|
||||||
|
cdebug_log(149,0) << "Merge with user constraints: ["
|
||||||
<< DbU::getValueString(getUserConstraints().getVMin()) << ":"
|
<< DbU::getValueString(getUserConstraints().getVMin()) << ":"
|
||||||
<< DbU::getValueString(getUserConstraints().getVMax()) << "]"
|
<< DbU::getValueString(getUserConstraints().getVMax()) << "]"
|
||||||
<< endl;
|
<< endl;
|
||||||
|
@ -167,7 +173,7 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned int AutoHorizontal::getDirection () const
|
Flags AutoHorizontal::getDirection () const
|
||||||
{ return Flags::Horizontal; }
|
{ return Flags::Horizontal; }
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -685,8 +685,8 @@ namespace Anabatic {
|
||||||
{
|
{
|
||||||
setFlags( flags );
|
setFlags( flags );
|
||||||
if (not isNotAligned()) {
|
if (not isNotAligned()) {
|
||||||
forEach( AutoSegment*, isegment, getAligneds() )
|
for( AutoSegment* segment : getAligneds() )
|
||||||
isegment->setFlags( flags );
|
segment->setFlags( flags );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -846,8 +846,8 @@ namespace Anabatic {
|
||||||
_setAxis( axis );
|
_setAxis( axis );
|
||||||
|
|
||||||
if (not isNotAligned()) {
|
if (not isNotAligned()) {
|
||||||
forEach( AutoSegment*, isegment, getAligneds() ) {
|
for ( AutoSegment* segment : getAligneds() ) {
|
||||||
isegment->_setAxis( getAxis() );
|
segment->_setAxis( getAxis() );
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
cdebug_log(149,0) << "No need to process parallels." << endl;
|
cdebug_log(149,0) << "No need to process parallels." << endl;
|
||||||
|
@ -1009,11 +1009,11 @@ namespace Anabatic {
|
||||||
setOptimalMax( optimalMax );
|
setOptimalMax( optimalMax );
|
||||||
processeds.insert( this );
|
processeds.insert( this );
|
||||||
if (not isNotAligned()) {
|
if (not isNotAligned()) {
|
||||||
forEach ( AutoSegment*, autoSegment, getAligneds() ) {
|
for ( AutoSegment* autoSegment : getAligneds() ) {
|
||||||
cdebug_log(145,0) << "Applying constraint on: " << *autoSegment << endl;
|
cdebug_log(145,0) << "Applying constraint on: " << autoSegment << endl;
|
||||||
autoSegment->setOptimalMin( optimalMin );
|
autoSegment->setOptimalMin( optimalMin );
|
||||||
autoSegment->setOptimalMax( optimalMax );
|
autoSegment->setOptimalMax( optimalMax );
|
||||||
processeds.insert( (*autoSegment) );
|
processeds.insert( autoSegment );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -131,7 +131,7 @@ namespace Anabatic {
|
||||||
contact = segment->getAutoTarget();
|
contact = segment->getAutoTarget();
|
||||||
if (contact) _stack.push( contact, segment );
|
if (contact) _stack.push( contact, segment );
|
||||||
|
|
||||||
progress();
|
if (not (_flags & Flags::WithSelf)) progress();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -143,10 +143,17 @@ namespace Anabatic {
|
||||||
<< DbU::getValueString(constraintMax) << "]"
|
<< DbU::getValueString(constraintMax) << "]"
|
||||||
<< endl;
|
<< endl;
|
||||||
|
|
||||||
|
constraintMin = std::max ( constraintMin, getAutoSource()->getCBXMin() );
|
||||||
|
constraintMax = std::min ( constraintMax, getAutoSource()->getCBXMax() );
|
||||||
|
cdebug_log(149,0) << "Merge with source constraints: ["
|
||||||
|
<< DbU::getValueString(getAutoSource()->getCBXMin()) << ":"
|
||||||
|
<< DbU::getValueString(getAutoSource()->getCBXMax()) << "]"
|
||||||
|
<< endl;
|
||||||
|
|
||||||
constraintMin = max ( constraintMin, getUserConstraints().getVMin() );
|
constraintMin = max ( constraintMin, getUserConstraints().getVMin() );
|
||||||
constraintMax = min ( constraintMax, getUserConstraints().getVMax() );
|
constraintMax = min ( constraintMax, getUserConstraints().getVMax() );
|
||||||
|
|
||||||
cdebug_log(149,0) << "Merge with user constraints: " << getUserConstraints() << " ["
|
cdebug_log(149,0) << "Merge with user constraints: ["
|
||||||
<< DbU::getValueString(getUserConstraints().getVMin()) << ":"
|
<< DbU::getValueString(getUserConstraints().getVMin()) << ":"
|
||||||
<< DbU::getValueString(getUserConstraints().getVMax()) << "]"
|
<< DbU::getValueString(getUserConstraints().getVMax()) << "]"
|
||||||
<< endl;
|
<< endl;
|
||||||
|
@ -160,7 +167,7 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned int AutoVertical::getDirection () const
|
Flags AutoVertical::getDirection () const
|
||||||
{ return Flags::Vertical; }
|
{ return Flags::Vertical; }
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -57,17 +57,8 @@ namespace Anabatic {
|
||||||
// Class : "Anabatic::Configuration".
|
// Class : "Anabatic::Configuration".
|
||||||
|
|
||||||
|
|
||||||
Configuration::Configuration () { }
|
Configuration::Configuration ( const CellGauge* cg, const RoutingGauge* rg )
|
||||||
Configuration::~Configuration () { }
|
: _cg (NULL)
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
|
||||||
// Class : "Anabatic::ConfigurationConcrete".
|
|
||||||
|
|
||||||
|
|
||||||
ConfigurationConcrete::ConfigurationConcrete ( const CellGauge* cg, const RoutingGauge* rg )
|
|
||||||
: Configuration ()
|
|
||||||
, _cg (NULL)
|
|
||||||
, _rg (NULL)
|
, _rg (NULL)
|
||||||
, _extensionCaps ()
|
, _extensionCaps ()
|
||||||
, _saturateRatio (Cfg::getParamPercentage("katabatic.saturateRatio",80.0)->asDouble())
|
, _saturateRatio (Cfg::getParamPercentage("katabatic.saturateRatio",80.0)->asDouble())
|
||||||
|
@ -78,8 +69,7 @@ namespace Anabatic {
|
||||||
, _edgeWidth (DbU::fromLambda(Cfg::getParamInt("anabatic.edgeWidth" , 4)->asInt()))
|
, _edgeWidth (DbU::fromLambda(Cfg::getParamInt("anabatic.edgeWidth" , 4)->asInt()))
|
||||||
, _edgeCostH (Cfg::getParamDouble("anabatic.edgeCostH", 9.0)->asDouble())
|
, _edgeCostH (Cfg::getParamDouble("anabatic.edgeCostH", 9.0)->asDouble())
|
||||||
, _edgeCostK (Cfg::getParamDouble("anabatic.edgeCostK",-10.0)->asDouble())
|
, _edgeCostK (Cfg::getParamDouble("anabatic.edgeCostK",-10.0)->asDouble())
|
||||||
, _hEdgeLocal (Cfg::getParamInt("kite.hTracksReservedLocal",0)->asInt())
|
, _edgeHInc (Cfg::getParamDouble("anabatic.edgeHInc" , 1.5)->asDouble())
|
||||||
, _vEdgeLocal (Cfg::getParamInt("kite.vTracksReservedLocal",0)->asInt())
|
|
||||||
{
|
{
|
||||||
if (cg == NULL) cg = AllianceFramework::get()->getCellGauge();
|
if (cg == NULL) cg = AllianceFramework::get()->getCellGauge();
|
||||||
if (rg == NULL) rg = AllianceFramework::get()->getRoutingGauge();
|
if (rg == NULL) rg = AllianceFramework::get()->getRoutingGauge();
|
||||||
|
@ -118,9 +108,8 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ConfigurationConcrete::ConfigurationConcrete ( const ConfigurationConcrete& other )
|
Configuration::Configuration ( const Configuration& other )
|
||||||
: Configuration()
|
: _gmetalh (other._gmetalh)
|
||||||
, _gmetalh (other._gmetalh)
|
|
||||||
, _gmetalv (other._gmetalv)
|
, _gmetalv (other._gmetalv)
|
||||||
, _gcontact (other._gcontact)
|
, _gcontact (other._gcontact)
|
||||||
, _cg (NULL)
|
, _cg (NULL)
|
||||||
|
@ -131,13 +120,14 @@ namespace Anabatic {
|
||||||
, _allowedDepth (other._allowedDepth)
|
, _allowedDepth (other._allowedDepth)
|
||||||
, _edgeCostH (other._edgeCostH)
|
, _edgeCostH (other._edgeCostH)
|
||||||
, _edgeCostK (other._edgeCostK)
|
, _edgeCostK (other._edgeCostK)
|
||||||
|
, _edgeHInc (other._edgeHInc)
|
||||||
{
|
{
|
||||||
if (other._cg) _cg = other._cg->getClone();
|
if (other._cg) _cg = other._cg->getClone();
|
||||||
if (other._rg) _rg = other._rg->getClone();
|
if (other._rg) _rg = other._rg->getClone();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ConfigurationConcrete::~ConfigurationConcrete ()
|
Configuration::~Configuration ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << "About to delete attribute _rg (RoutingGauge)." << endl;
|
cdebug_log(145,0) << "About to delete attribute _rg (RoutingGauge)." << endl;
|
||||||
_cg->destroy ();
|
_cg->destroy ();
|
||||||
|
@ -145,99 +135,99 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ConfigurationConcrete* ConfigurationConcrete::clone () const
|
Configuration* Configuration::clone () const
|
||||||
{ return new ConfigurationConcrete(*this); }
|
{ return new Configuration(*this); }
|
||||||
|
|
||||||
|
|
||||||
bool ConfigurationConcrete::isGMetal ( const Layer* layer ) const
|
bool Configuration::isGMetal ( const Layer* layer ) const
|
||||||
{ return (layer and ((layer == _gmetalh) or (layer == _gmetalv))); }
|
{ return (layer and ((layer == _gmetalh) or (layer == _gmetalv))); }
|
||||||
|
|
||||||
|
|
||||||
bool ConfigurationConcrete::isGContact ( const Layer* layer ) const
|
bool Configuration::isGContact ( const Layer* layer ) const
|
||||||
{ return (layer and (layer == _gcontact)); }
|
{ return (layer and (layer == _gcontact)); }
|
||||||
|
|
||||||
const Layer* ConfigurationConcrete::getGContactLayer () const
|
const Layer* Configuration::getGContactLayer () const
|
||||||
{ return _gcontact; }
|
{ return _gcontact; }
|
||||||
|
|
||||||
const Layer* ConfigurationConcrete::getGHorizontalLayer () const
|
const Layer* Configuration::getGHorizontalLayer () const
|
||||||
{ return _gmetalh; }
|
{ return _gmetalh; }
|
||||||
|
|
||||||
const Layer* ConfigurationConcrete::getGVerticalLayer () const
|
const Layer* Configuration::getGVerticalLayer () const
|
||||||
{ return _gmetalv; }
|
{ return _gmetalv; }
|
||||||
|
|
||||||
size_t ConfigurationConcrete::getDepth () const
|
size_t Configuration::getDepth () const
|
||||||
{ return _rg->getDepth(); }
|
{ return _rg->getDepth(); }
|
||||||
|
|
||||||
|
|
||||||
size_t ConfigurationConcrete::getAllowedDepth () const
|
size_t Configuration::getAllowedDepth () const
|
||||||
{ return _allowedDepth; }
|
{ return _allowedDepth; }
|
||||||
|
|
||||||
|
|
||||||
size_t ConfigurationConcrete::getLayerDepth ( const Layer* layer ) const
|
size_t Configuration::getLayerDepth ( const Layer* layer ) const
|
||||||
{ return _rg->getLayerDepth(layer); }
|
{ return _rg->getLayerDepth(layer); }
|
||||||
|
|
||||||
|
|
||||||
CellGauge* ConfigurationConcrete::getCellGauge () const
|
CellGauge* Configuration::getCellGauge () const
|
||||||
{ return _cg; }
|
{ return _cg; }
|
||||||
|
|
||||||
|
|
||||||
RoutingGauge* ConfigurationConcrete::getRoutingGauge () const
|
RoutingGauge* Configuration::getRoutingGauge () const
|
||||||
{ return _rg; }
|
{ return _rg; }
|
||||||
|
|
||||||
|
|
||||||
RoutingLayerGauge* ConfigurationConcrete::getLayerGauge ( size_t depth ) const
|
RoutingLayerGauge* Configuration::getLayerGauge ( size_t depth ) const
|
||||||
{ return _rg->getLayerGauge(depth); }
|
{ return _rg->getLayerGauge(depth); }
|
||||||
|
|
||||||
|
|
||||||
const Layer* ConfigurationConcrete::getRoutingLayer ( size_t depth ) const
|
const Layer* Configuration::getRoutingLayer ( size_t depth ) const
|
||||||
{ return _rg->getRoutingLayer(depth); }
|
{ return _rg->getRoutingLayer(depth); }
|
||||||
|
|
||||||
|
|
||||||
Layer* ConfigurationConcrete::getContactLayer ( size_t depth ) const
|
Layer* Configuration::getContactLayer ( size_t depth ) const
|
||||||
{ return _rg->getContactLayer(depth); }
|
{ return _rg->getContactLayer(depth); }
|
||||||
|
|
||||||
|
|
||||||
DbU::Unit ConfigurationConcrete::getSliceHeight () const
|
DbU::Unit Configuration::getSliceHeight () const
|
||||||
{ return _cg->getSliceHeight(); }
|
{ return _cg->getSliceHeight(); }
|
||||||
|
|
||||||
|
|
||||||
DbU::Unit ConfigurationConcrete::getSliceStep () const
|
DbU::Unit Configuration::getSliceStep () const
|
||||||
{ return _cg->getSliceStep(); }
|
{ return _cg->getSliceStep(); }
|
||||||
|
|
||||||
|
|
||||||
DbU::Unit ConfigurationConcrete::getPitch ( const Layer* layer, Flags flags ) const
|
DbU::Unit Configuration::getPitch ( const Layer* layer, Flags flags ) const
|
||||||
{ return getPitch( getLayerDepth(layer), flags ); }
|
{ return getPitch( getLayerDepth(layer), flags ); }
|
||||||
|
|
||||||
|
|
||||||
DbU::Unit ConfigurationConcrete::getOffset ( const Layer* layer ) const
|
DbU::Unit Configuration::getOffset ( const Layer* layer ) const
|
||||||
{ return getOffset( getLayerDepth(layer) ); }
|
{ return getOffset( getLayerDepth(layer) ); }
|
||||||
|
|
||||||
|
|
||||||
DbU::Unit ConfigurationConcrete::getExtensionCap ( const Layer* layer ) const
|
DbU::Unit Configuration::getExtensionCap ( const Layer* layer ) const
|
||||||
{ return getExtensionCap( getLayerDepth(layer) ); }
|
{ return getExtensionCap( getLayerDepth(layer) ); }
|
||||||
|
|
||||||
|
|
||||||
DbU::Unit ConfigurationConcrete::getWireWidth ( const Layer* layer ) const
|
DbU::Unit Configuration::getWireWidth ( const Layer* layer ) const
|
||||||
{ return getWireWidth( getLayerDepth(layer) ); }
|
{ return getWireWidth( getLayerDepth(layer) ); }
|
||||||
|
|
||||||
|
|
||||||
Flags ConfigurationConcrete::getDirection ( const Layer* layer ) const
|
Flags Configuration::getDirection ( const Layer* layer ) const
|
||||||
{ return getDirection( getLayerDepth(layer) ); }
|
{ return getDirection( getLayerDepth(layer) ); }
|
||||||
|
|
||||||
|
|
||||||
float ConfigurationConcrete::getSaturateRatio () const
|
float Configuration::getSaturateRatio () const
|
||||||
{ return _saturateRatio; }
|
{ return _saturateRatio; }
|
||||||
|
|
||||||
|
|
||||||
size_t ConfigurationConcrete::getSaturateRp () const
|
size_t Configuration::getSaturateRp () const
|
||||||
{ return _saturateRp; }
|
{ return _saturateRp; }
|
||||||
|
|
||||||
|
|
||||||
DbU::Unit ConfigurationConcrete::getGlobalThreshold () const
|
DbU::Unit Configuration::getGlobalThreshold () const
|
||||||
{ return _globalThreshold; }
|
{ return _globalThreshold; }
|
||||||
|
|
||||||
|
|
||||||
DbU::Unit ConfigurationConcrete::getPitch ( size_t depth, Flags flags ) const
|
DbU::Unit Configuration::getPitch ( size_t depth, Flags flags ) const
|
||||||
{
|
{
|
||||||
if (flags == Flags::NoFlags) return _rg->getLayerPitch(depth);
|
if (flags == Flags::NoFlags) return _rg->getLayerPitch(depth);
|
||||||
|
|
||||||
|
@ -264,27 +254,27 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DbU::Unit ConfigurationConcrete::getOffset ( size_t depth ) const
|
DbU::Unit Configuration::getOffset ( size_t depth ) const
|
||||||
{ return _rg->getLayerOffset(depth); }
|
{ return _rg->getLayerOffset(depth); }
|
||||||
|
|
||||||
|
|
||||||
DbU::Unit ConfigurationConcrete::getWireWidth ( size_t depth ) const
|
DbU::Unit Configuration::getWireWidth ( size_t depth ) const
|
||||||
{ return _rg->getLayerWireWidth(depth); }
|
{ return _rg->getLayerWireWidth(depth); }
|
||||||
|
|
||||||
|
|
||||||
DbU::Unit ConfigurationConcrete::getExtensionCap ( size_t depth ) const
|
DbU::Unit Configuration::getExtensionCap ( size_t depth ) const
|
||||||
{ return _extensionCaps[depth]; }
|
{ return _extensionCaps[depth]; }
|
||||||
|
|
||||||
|
|
||||||
Flags ConfigurationConcrete::getDirection ( size_t depth ) const
|
Flags Configuration::getDirection ( size_t depth ) const
|
||||||
{ return _rg->getLayerDirection(depth); }
|
{ return _rg->getLayerDirection(depth); }
|
||||||
|
|
||||||
|
|
||||||
void ConfigurationConcrete::setAllowedDepth ( size_t allowedDepth )
|
void Configuration::setAllowedDepth ( size_t allowedDepth )
|
||||||
{ _allowedDepth = (allowedDepth > getDepth()) ? getDepth() : allowedDepth; }
|
{ _allowedDepth = (allowedDepth > getDepth()) ? getDepth() : allowedDepth; }
|
||||||
|
|
||||||
|
|
||||||
void ConfigurationConcrete::_setTopRoutingLayer ( Name name )
|
void Configuration::_setTopRoutingLayer ( Name name )
|
||||||
{
|
{
|
||||||
for ( size_t depth=0 ; depth<_rg->getDepth() ; ++depth ) {
|
for ( size_t depth=0 ; depth<_rg->getDepth() ; ++depth ) {
|
||||||
if (_rg->getRoutingLayer(depth)->getName() == name) {
|
if (_rg->getRoutingLayer(depth)->getName() == name) {
|
||||||
|
@ -299,44 +289,39 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ConfigurationConcrete::setSaturateRatio ( float ratio )
|
void Configuration::setSaturateRatio ( float ratio )
|
||||||
{ _saturateRatio = ratio; }
|
{ _saturateRatio = ratio; }
|
||||||
|
|
||||||
|
|
||||||
void ConfigurationConcrete::setSaturateRp ( size_t threshold )
|
void Configuration::setSaturateRp ( size_t threshold )
|
||||||
{ _saturateRp = threshold; }
|
{ _saturateRp = threshold; }
|
||||||
|
|
||||||
|
|
||||||
void ConfigurationConcrete::setGlobalThreshold ( DbU::Unit threshold )
|
void Configuration::setGlobalThreshold ( DbU::Unit threshold )
|
||||||
{ _globalThreshold = threshold; }
|
{ _globalThreshold = threshold; }
|
||||||
|
|
||||||
|
|
||||||
DbU::Unit ConfigurationConcrete::getEdgeLength () const
|
DbU::Unit Configuration::getEdgeLength () const
|
||||||
{ return _edgeLength; }
|
{ return _edgeLength; }
|
||||||
|
|
||||||
|
|
||||||
DbU::Unit ConfigurationConcrete::getEdgeWidth () const
|
DbU::Unit Configuration::getEdgeWidth () const
|
||||||
{ return _edgeWidth; }
|
{ return _edgeWidth; }
|
||||||
|
|
||||||
|
|
||||||
size_t ConfigurationConcrete::getHEdgeLocal () const
|
float Configuration::getEdgeCostH () const
|
||||||
{ return _hEdgeLocal; }
|
|
||||||
|
|
||||||
|
|
||||||
size_t ConfigurationConcrete::getVEdgeLocal () const
|
|
||||||
{ return _vEdgeLocal; }
|
|
||||||
|
|
||||||
|
|
||||||
float ConfigurationConcrete::getEdgeCostH () const
|
|
||||||
{ return _edgeCostH; }
|
{ return _edgeCostH; }
|
||||||
|
|
||||||
|
|
||||||
float ConfigurationConcrete::getEdgeCostK () const
|
float Configuration::getEdgeCostK () const
|
||||||
{ return _edgeCostK; }
|
{ return _edgeCostK; }
|
||||||
|
|
||||||
|
|
||||||
|
float Configuration::getEdgeHInc () const
|
||||||
|
{ return _edgeHInc; }
|
||||||
|
|
||||||
void ConfigurationConcrete::print ( Cell* cell ) const
|
|
||||||
|
void Configuration::print ( Cell* cell ) const
|
||||||
{
|
{
|
||||||
string topLayerName = "UNKOWN";
|
string topLayerName = "UNKOWN";
|
||||||
const Layer* topLayer = _rg->getRoutingLayer( _allowedDepth );
|
const Layer* topLayer = _rg->getRoutingLayer( _allowedDepth );
|
||||||
|
@ -349,13 +334,13 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
string ConfigurationConcrete::_getTypeName () const
|
string Configuration::_getTypeName () const
|
||||||
{
|
{
|
||||||
return "ConfigurationConcrete";
|
return "Configuration";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
string ConfigurationConcrete::_getString () const
|
string Configuration::_getString () const
|
||||||
{
|
{
|
||||||
ostringstream os;
|
ostringstream os;
|
||||||
|
|
||||||
|
@ -365,7 +350,7 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Record* ConfigurationConcrete::_getRecord () const
|
Record* Configuration::_getRecord () const
|
||||||
{
|
{
|
||||||
Record* record = new Record ( _getString() );
|
Record* record = new Record ( _getString() );
|
||||||
record->add ( getSlot( "_rg" , _rg ) );
|
record->add ( getSlot( "_rg" , _rg ) );
|
||||||
|
@ -380,5 +365,4 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // Anabatic namespace.
|
} // Anabatic namespace.
|
||||||
|
|
|
@ -22,6 +22,66 @@ namespace Anabatic {
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
|
|
||||||
|
const unsigned int Flags::NoFlags = 0;
|
||||||
|
// Flags used for both objects states & functions arguments.
|
||||||
|
const unsigned int Flags::Horizontal = (1 << 0);
|
||||||
|
const unsigned int Flags::Vertical = (1 << 1);
|
||||||
|
const unsigned int Flags::Source = (1 << 2);
|
||||||
|
const unsigned int Flags::Target = (1 << 3);
|
||||||
|
const unsigned int Flags::Invalidated = (1 << 4);
|
||||||
|
// Flags for GCell objects states only.
|
||||||
|
const unsigned int Flags::DeviceGCell = (1 << 5);
|
||||||
|
const unsigned int Flags::ChannelGCell = (1 << 6);
|
||||||
|
const unsigned int Flags::StrutGCell = (1 << 7);
|
||||||
|
const unsigned int Flags::MatrixGCell = (1 << 8);
|
||||||
|
const unsigned int Flags::IoPadGCell = (1 << 9);
|
||||||
|
const unsigned int Flags::Saturated = (1 << 10);
|
||||||
|
// Flags for Anabatic objects states only.
|
||||||
|
const unsigned int Flags::DemoMode = (1 << 5);
|
||||||
|
const unsigned int Flags::WarnOnGCellOverload = (1 << 6);
|
||||||
|
const unsigned int Flags::DestroyGCell = (1 << 7);
|
||||||
|
const unsigned int Flags::DestroyBaseContact = (1 << 8);
|
||||||
|
const unsigned int Flags::DestroyBaseSegment = (1 << 9);
|
||||||
|
// Flags for NetDatas objects states only.
|
||||||
|
const unsigned int Flags::GlobalRouted = (1 << 5);
|
||||||
|
// Masks.
|
||||||
|
const unsigned int Flags::WestSide = Horizontal|Target;
|
||||||
|
const unsigned int Flags::EastSide = Horizontal|Source;
|
||||||
|
const unsigned int Flags::SouthSide = Vertical |Target;
|
||||||
|
const unsigned int Flags::NorthSide = Vertical |Source;
|
||||||
|
const unsigned int Flags::AllSides = WestSide|EastSide|SouthSide|NorthSide ;
|
||||||
|
const unsigned int Flags::EndsMask = Source|Target;
|
||||||
|
const unsigned int Flags::DirectionMask = Horizontal|Vertical;
|
||||||
|
const unsigned int Flags::DestroyMask = DestroyGCell|DestroyBaseContact|DestroyBaseSegment;
|
||||||
|
const unsigned int Flags::GCellTypeMask = DeviceGCell|ChannelGCell|StrutGCell|MatrixGCell|IoPadGCell;
|
||||||
|
// Flags for functions arguments only.
|
||||||
|
const unsigned int Flags::Create = (1 << 5);
|
||||||
|
const unsigned int Flags::WithPerpands = (1 << 6);
|
||||||
|
const unsigned int Flags::WithSelf = (1 << 7);
|
||||||
|
const unsigned int Flags::AboveLayer = (1 << 8);
|
||||||
|
const unsigned int Flags::BelowLayer = (1 << 9);
|
||||||
|
const unsigned int Flags::OpenSession = (1 << 10);
|
||||||
|
const unsigned int Flags::Realignate = (1 << 11);
|
||||||
|
const unsigned int Flags::NativeConstraints = (1 << 12);
|
||||||
|
const unsigned int Flags::ForceMove = (1 << 13);
|
||||||
|
const unsigned int Flags::WarnOnError = (1 << 14);
|
||||||
|
const unsigned int Flags::Topology = (1 << 15);
|
||||||
|
const unsigned int Flags::GlobalSegment = (1 << 16);
|
||||||
|
const unsigned int Flags::AllowTerminal = (1 << 17);
|
||||||
|
const unsigned int Flags::AllowLocal = (1 << 18);
|
||||||
|
const unsigned int Flags::IgnoreContacts = (1 << 19);
|
||||||
|
const unsigned int Flags::Propagate = (1 << 20);
|
||||||
|
const unsigned int Flags::Superior = (1 << 21);
|
||||||
|
const unsigned int Flags::DoglegOnLeft = (1 << 22);
|
||||||
|
const unsigned int Flags::DoglegOnRight = (1 << 23);
|
||||||
|
const unsigned int Flags::WithNeighbors = (1 << 24);
|
||||||
|
const unsigned int Flags::NoCheckLayer = (1 << 25);
|
||||||
|
const unsigned int Flags::HalfSlacken = (1 << 26);
|
||||||
|
const unsigned int Flags::NoGCellShrink = (1 << 27);
|
||||||
|
const unsigned int Flags::CParanoid = (1 << 28);
|
||||||
|
const unsigned int Flags::CheckLowDensity = (1 << 29);
|
||||||
|
const unsigned int Flags::NoUpdate = (1 << 30);
|
||||||
|
|
||||||
|
|
||||||
Flags::~Flags ()
|
Flags::~Flags ()
|
||||||
{ }
|
{ }
|
||||||
|
|
|
@ -85,7 +85,6 @@ namespace Anabatic {
|
||||||
|
|
||||||
void Vertex::notify ( Vertex* vertex, unsigned int flags )
|
void Vertex::notify ( Vertex* vertex, unsigned int flags )
|
||||||
{
|
{
|
||||||
//Vertex* vertex = getOwner();
|
|
||||||
cdebug_log(111,0) << "Vertex::notify() " << vertex << endl;
|
cdebug_log(111,0) << "Vertex::notify() " << vertex << endl;
|
||||||
// Take into account the GCell modification here.
|
// Take into account the GCell modification here.
|
||||||
}
|
}
|
||||||
|
@ -181,6 +180,7 @@ namespace Anabatic {
|
||||||
, _sources ()
|
, _sources ()
|
||||||
, _targets ()
|
, _targets ()
|
||||||
, _searchArea ()
|
, _searchArea ()
|
||||||
|
, _searchAreaHalo(0)
|
||||||
, _connectedsId (-1)
|
, _connectedsId (-1)
|
||||||
, _queue ()
|
, _queue ()
|
||||||
{
|
{
|
||||||
|
@ -217,6 +217,8 @@ namespace Anabatic {
|
||||||
Point center = rp->getBoundingBox().getCenter();
|
Point center = rp->getBoundingBox().getCenter();
|
||||||
GCell* gcell = _anabatic->getGCellUnder( center );
|
GCell* gcell = _anabatic->getGCellUnder( center );
|
||||||
|
|
||||||
|
cdebug_log(112,0) << "| " << rp << endl;
|
||||||
|
|
||||||
if (not gcell) {
|
if (not gcell) {
|
||||||
cerr << Error( "Dijkstra::load(): %s of %s is not under any GCell.\n"
|
cerr << Error( "Dijkstra::load(): %s of %s is not under any GCell.\n"
|
||||||
" It will be ignored so the routing may be incomplete."
|
" It will be ignored so the routing may be incomplete."
|
||||||
|
@ -244,7 +246,7 @@ namespace Anabatic {
|
||||||
vertex->setFrom ( NULL );
|
vertex->setFrom ( NULL );
|
||||||
vertex->clearRestriction();
|
vertex->clearRestriction();
|
||||||
_targets.insert( vertex );
|
_targets.insert( vertex );
|
||||||
cdebug_log(112,0) << "Add Vertex: " << vertex << endl;
|
cdebug_log(112,0) << "| Add: " << vertex << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,6 +256,7 @@ namespace Anabatic {
|
||||||
rp->getBodyHook()->attach( vcontact->getBodyHook() );
|
rp->getBodyHook()->attach( vcontact->getBodyHook() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_searchArea.inflate( _searchAreaHalo );
|
||||||
cdebug_log(112,0) << "Search area: " << _searchArea << endl;
|
cdebug_log(112,0) << "Search area: " << _searchArea << endl;
|
||||||
cdebug_tabw(112,-1);
|
cdebug_tabw(112,-1);
|
||||||
DebugSession::close();
|
DebugSession::close();
|
||||||
|
|
|
@ -39,6 +39,7 @@ namespace Anabatic {
|
||||||
, _capacity (0)
|
, _capacity (0)
|
||||||
, _realOccupancy (0)
|
, _realOccupancy (0)
|
||||||
, _estimateOccupancy(0.0)
|
, _estimateOccupancy(0.0)
|
||||||
|
, _historicCost (0.0)
|
||||||
, _source (source)
|
, _source (source)
|
||||||
, _target (target)
|
, _target (target)
|
||||||
, _axis (0)
|
, _axis (0)
|
||||||
|
@ -222,6 +223,25 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t Edge::ripup ()
|
||||||
|
{
|
||||||
|
AnabaticEngine* anabatic = getAnabatic();
|
||||||
|
DbU::Unit globalThreshold = Session::getSliceHeight()*3;
|
||||||
|
size_t netCount = 0;
|
||||||
|
|
||||||
|
for ( size_t i=0 ; i<_segments.size(); ) {
|
||||||
|
if (_segments[i]->getLength() >= globalThreshold) {
|
||||||
|
NetData* netData = anabatic->getNetData( _segments[i]->getNet() );
|
||||||
|
if (netData->isGlobalRouted()) ++netCount;
|
||||||
|
|
||||||
|
anabatic->ripup( _segments[i], Flags::Propagate );
|
||||||
|
} else
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
return netCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Edge::_setSource ( GCell* source )
|
void Edge::_setSource ( GCell* source )
|
||||||
{
|
{
|
||||||
if (source == _target)
|
if (source == _target)
|
||||||
|
@ -299,6 +319,7 @@ namespace Anabatic {
|
||||||
s.insert( s.size()-1, " "+DbU::getValueString(_axis) );
|
s.insert( s.size()-1, " "+DbU::getValueString(_axis) );
|
||||||
s.insert( s.size()-1, " "+getString(_realOccupancy) );
|
s.insert( s.size()-1, " "+getString(_realOccupancy) );
|
||||||
s.insert( s.size()-1, "/"+getString(_capacity) );
|
s.insert( s.size()-1, "/"+getString(_capacity) );
|
||||||
|
s.insert( s.size()-1, " h:"+getString(_historicCost) );
|
||||||
s.insert( s.size()-1, " "+getString(_flags) );
|
s.insert( s.size()-1, " "+getString(_flags) );
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
|
@ -325,7 +325,7 @@ namespace Anabatic {
|
||||||
if (not anabatic) throw Error( "GCell::create(): NULL anabatic argument." );
|
if (not anabatic) throw Error( "GCell::create(): NULL anabatic argument." );
|
||||||
if (not anabatic->getCell()) throw Error( "GCell::create(): AnabaticEngine has no Cell loaded." );
|
if (not anabatic->getCell()) throw Error( "GCell::create(): AnabaticEngine has no Cell loaded." );
|
||||||
|
|
||||||
Session::open( anabatic );
|
anabatic->openSession();
|
||||||
GCell* gcell = new GCell ( anabatic
|
GCell* gcell = new GCell ( anabatic
|
||||||
, anabatic->getCell()->getAbutmentBox().getXMin()
|
, anabatic->getCell()->getAbutmentBox().getXMin()
|
||||||
, anabatic->getCell()->getAbutmentBox().getYMin() );
|
, anabatic->getCell()->getAbutmentBox().getYMin() );
|
||||||
|
@ -539,6 +539,16 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GCell* GCell::getNeighborAt ( Flags side, DbU::Unit axis ) const
|
||||||
|
{
|
||||||
|
if (side & Flags::EastSide ) return getEast (axis);
|
||||||
|
if (side & Flags::WestSide ) return getWest (axis);
|
||||||
|
if (side & Flags::NorthSide) return getNorth(axis);
|
||||||
|
if (side & Flags::SouthSide) return getSouth(axis);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
GCell* GCell::getUnder ( DbU::Unit x, DbU::Unit y ) const
|
GCell* GCell::getUnder ( DbU::Unit x, DbU::Unit y ) const
|
||||||
{
|
{
|
||||||
const GCell* current = this;
|
const GCell* current = this;
|
||||||
|
@ -594,7 +604,7 @@ namespace Anabatic {
|
||||||
|
|
||||||
GCell* GCell::vcut ( DbU::Unit x )
|
GCell* GCell::vcut ( DbU::Unit x )
|
||||||
{
|
{
|
||||||
cdebug_log(119,1) << "GCell::vcut() @x:" << DbU::getValueString(x) << " " << this << endl;
|
cdebug_log(110,1) << "GCell::vcut() @x:" << DbU::getValueString(x) << " " << this << endl;
|
||||||
|
|
||||||
if ( (x < getXMin()) or (x > getXMax()) )
|
if ( (x < getXMin()) or (x > getXMax()) )
|
||||||
throw Error( "GCell::vcut(): Vertical cut axis at %s is outside GCell box,\n"
|
throw Error( "GCell::vcut(): Vertical cut axis at %s is outside GCell box,\n"
|
||||||
|
@ -604,7 +614,7 @@ namespace Anabatic {
|
||||||
);
|
);
|
||||||
|
|
||||||
GCell* chunk = _create( x, getYMin() );
|
GCell* chunk = _create( x, getYMin() );
|
||||||
cdebug_log(119,0) << "New chunk:" << chunk << endl;
|
cdebug_log(110,0) << "New chunk:" << chunk << endl;
|
||||||
|
|
||||||
_moveEdges( chunk, 0, Flags::EastSide );
|
_moveEdges( chunk, 0, Flags::EastSide );
|
||||||
Edge::create( this, chunk, Flags::Horizontal );
|
Edge::create( this, chunk, Flags::Horizontal );
|
||||||
|
@ -646,7 +656,7 @@ namespace Anabatic {
|
||||||
_revalidate();
|
_revalidate();
|
||||||
chunk->_revalidate();
|
chunk->_revalidate();
|
||||||
|
|
||||||
cdebug_tabw(119,-1);
|
cdebug_tabw(110,-1);
|
||||||
|
|
||||||
return chunk;
|
return chunk;
|
||||||
}
|
}
|
||||||
|
@ -654,7 +664,7 @@ namespace Anabatic {
|
||||||
|
|
||||||
GCell* GCell::hcut ( DbU::Unit y )
|
GCell* GCell::hcut ( DbU::Unit y )
|
||||||
{
|
{
|
||||||
cdebug_log(119,1) << "GCell::hcut() @y:" << DbU::getValueString(y) << " " << this << endl;
|
cdebug_log(110,1) << "GCell::hcut() @y:" << DbU::getValueString(y) << " " << this << endl;
|
||||||
|
|
||||||
if ( (y < getYMin()) or (y > getYMax()) )
|
if ( (y < getYMin()) or (y > getYMax()) )
|
||||||
throw Error( "GCell::hcut(): Horizontal cut axis at %s is outside GCell box,\n"
|
throw Error( "GCell::hcut(): Horizontal cut axis at %s is outside GCell box,\n"
|
||||||
|
@ -664,7 +674,7 @@ namespace Anabatic {
|
||||||
);
|
);
|
||||||
|
|
||||||
GCell* chunk = _create( getXMin(), y );
|
GCell* chunk = _create( getXMin(), y );
|
||||||
cdebug_log(119,0) << "New chunk:" << chunk << endl;
|
cdebug_log(110,0) << "New chunk:" << chunk << endl;
|
||||||
|
|
||||||
_moveEdges( chunk, 0, Flags::NorthSide );
|
_moveEdges( chunk, 0, Flags::NorthSide );
|
||||||
Edge::create( this, chunk, Flags::Vertical );
|
Edge::create( this, chunk, Flags::Vertical );
|
||||||
|
@ -698,7 +708,7 @@ namespace Anabatic {
|
||||||
_revalidate();
|
_revalidate();
|
||||||
chunk->_revalidate();
|
chunk->_revalidate();
|
||||||
|
|
||||||
cdebug_tabw(119,-1);
|
cdebug_tabw(110,-1);
|
||||||
|
|
||||||
return chunk;
|
return chunk;
|
||||||
}
|
}
|
||||||
|
@ -706,10 +716,10 @@ namespace Anabatic {
|
||||||
|
|
||||||
bool GCell::doGrid ()
|
bool GCell::doGrid ()
|
||||||
{
|
{
|
||||||
Session::open( getAnabatic() );
|
getAnabatic()->openSession();
|
||||||
|
|
||||||
const vector<GCell*>& gcells = getAnabatic()->getGCells();
|
//const vector<GCell*>& gcells = getAnabatic()->getGCells();
|
||||||
size_t ibegin = gcells.size();
|
//size_t ibegin = gcells.size();
|
||||||
DbU::Unit side = Session::getSliceHeight();
|
DbU::Unit side = Session::getSliceHeight();
|
||||||
|
|
||||||
Interval hspan = getSide( Flags::Horizontal );
|
Interval hspan = getSide( Flags::Horizontal );
|
||||||
|
@ -740,29 +750,32 @@ namespace Anabatic {
|
||||||
for ( ; ycut < vspan.getVMax() ; ycut += side ) {
|
for ( ; ycut < vspan.getVMax() ; ycut += side ) {
|
||||||
column = row;
|
column = row;
|
||||||
row = row->hcut( ycut );
|
row = row->hcut( ycut );
|
||||||
|
row->setType( Flags::MatrixGCell );
|
||||||
|
|
||||||
for ( DbU::Unit xcut = hspan.getVMin()+side ; xcut < hspan.getVMax() ; xcut += side ) {
|
for ( DbU::Unit xcut = hspan.getVMin()+side ; xcut < hspan.getVMax() ; xcut += side ) {
|
||||||
column = column->vcut( xcut );
|
column = column->vcut( xcut );
|
||||||
|
column->setType( Flags::MatrixGCell );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
column = row;
|
column = row;
|
||||||
for ( DbU::Unit xcut = hspan.getVMin()+side ; xcut < hspan.getVMax() ; xcut += side ) {
|
for ( DbU::Unit xcut = hspan.getVMin()+side ; xcut < hspan.getVMax() ; xcut += side ) {
|
||||||
column = column->vcut( xcut );
|
column = column->vcut( xcut );
|
||||||
|
column->setType( Flags::MatrixGCell );
|
||||||
}
|
}
|
||||||
|
|
||||||
setType( Flags::MatrixGCell );
|
setType( Flags::MatrixGCell );
|
||||||
|
|
||||||
size_t hLocal = - getAnabatic()->getConfiguration()->getHEdgeLocal();
|
//size_t hLocal = - getAnabatic()->getConfiguration()->getHEdgeLocal();
|
||||||
size_t vLocal = - getAnabatic()->getConfiguration()->getVEdgeLocal();
|
//size_t vLocal = - getAnabatic()->getConfiguration()->getVEdgeLocal();
|
||||||
for ( ; ibegin < gcells.size() ; ++ibegin ) {
|
//for ( ; ibegin < gcells.size() ; ++ibegin ) {
|
||||||
gcells[ibegin]->setType( Flags::MatrixGCell );
|
// gcells[ibegin]->setType( Flags::MatrixGCell );
|
||||||
|
|
||||||
for ( Edge* edge : gcells[ibegin]->getEdges(Flags::NorthSide|Flags::EastSide) ) {
|
// for ( Edge* edge : gcells[ibegin]->getEdges(Flags::NorthSide|Flags::EastSide) ) {
|
||||||
if (edge->isHorizontal()) edge->incCapacity( hLocal );
|
// if (edge->isHorizontal()) edge->incCapacity( hLocal );
|
||||||
else edge->incCapacity( vLocal );
|
// else edge->incCapacity( vLocal );
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
Session::close();
|
Session::close();
|
||||||
return true;
|
return true;
|
||||||
|
@ -1049,13 +1062,8 @@ namespace Anabatic {
|
||||||
|
|
||||||
Interval GCell::getSide ( unsigned int direction ) const
|
Interval GCell::getSide ( unsigned int direction ) const
|
||||||
{
|
{
|
||||||
Interval side;
|
if (direction & Flags::Vertical) return Interval( getYMin(), getYMax() );
|
||||||
switch ( direction ) {
|
return Interval( getXMin(), getXMax() );
|
||||||
default:
|
|
||||||
case Flags::Horizontal: side = Interval(getXMin(),getXMax()); break;
|
|
||||||
case Flags::Vertical: side = Interval(getYMin(),getYMax()); break;
|
|
||||||
}
|
|
||||||
return side;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1312,15 +1320,12 @@ namespace Anabatic {
|
||||||
localCounts [i] = 0.0;
|
localCounts [i] = 0.0;
|
||||||
_globalsCount[i] = 0.0;
|
_globalsCount[i] = 0.0;
|
||||||
|
|
||||||
switch ( Session::getDirection(i) ) {
|
if (Session::getDirection(i) & Flags::Horizontal) {
|
||||||
case Flags::Horizontal:
|
|
||||||
ufragments[i].setSpan ( getXMin(), getXMax() );
|
ufragments[i].setSpan ( getXMin(), getXMax() );
|
||||||
ufragments[i].setCapacity( (size_t)hcapacity );
|
ufragments[i].setCapacity( (size_t)hcapacity );
|
||||||
break;
|
} else {
|
||||||
case Flags::Vertical:
|
|
||||||
ufragments[i].setSpan ( getYMin(), getYMax() );
|
ufragments[i].setSpan ( getYMin(), getYMax() );
|
||||||
ufragments[i].setCapacity( (size_t)vcapacity );
|
ufragments[i].setCapacity( (size_t)vcapacity );
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1330,10 +1335,10 @@ namespace Anabatic {
|
||||||
for ( size_t i=0 ; i<_depth ; i++ ) uLengths1[i] = 0;
|
for ( size_t i=0 ; i<_depth ; i++ ) uLengths1[i] = 0;
|
||||||
contact->getLengths ( uLengths1, processeds );
|
contact->getLengths ( uLengths1, processeds );
|
||||||
for ( size_t i=0 ; i<_depth ; i++ ) {
|
for ( size_t i=0 ; i<_depth ; i++ ) {
|
||||||
switch ( Session::getDirection(i) ) {
|
if (Session::getDirection(i) & Flags::Horizontal)
|
||||||
case Flags::Horizontal: uLengths2[i] += uLengths1[i]+hpenalty; break;
|
uLengths2[i] += uLengths1[i]+hpenalty;
|
||||||
case Flags::Vertical: uLengths2[i] += uLengths1[i]+vpenalty; break;
|
else
|
||||||
}
|
uLengths2[i] += uLengths1[i]+vpenalty; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1415,8 +1420,7 @@ namespace Anabatic {
|
||||||
|
|
||||||
// Normalize: 0 < d < 1.0 (divide by H/V capacity).
|
// Normalize: 0 < d < 1.0 (divide by H/V capacity).
|
||||||
for ( size_t i=0 ; i<_depth ; i++ ) {
|
for ( size_t i=0 ; i<_depth ; i++ ) {
|
||||||
switch ( Session::getDirection(i) ) {
|
if (Session::getDirection(i) & Flags::Horizontal) {
|
||||||
case Flags::Horizontal:
|
|
||||||
if (width) {
|
if (width) {
|
||||||
_densities [i] = ((float)uLengths2[i]) / ( hcapacity * (float)width );
|
_densities [i] = ((float)uLengths2[i]) / ( hcapacity * (float)width );
|
||||||
_feedthroughs [i] += (float)(_blockages[i] / width);
|
_feedthroughs [i] += (float)(_blockages[i] / width);
|
||||||
|
@ -1426,8 +1430,7 @@ namespace Anabatic {
|
||||||
_feedthroughs [i] = 0;
|
_feedthroughs [i] = 0;
|
||||||
_fragmentations[i] = 0;
|
_fragmentations[i] = 0;
|
||||||
}
|
}
|
||||||
break;
|
} else {
|
||||||
case Flags::Vertical:
|
|
||||||
if (height) {
|
if (height) {
|
||||||
_densities [i] = ((float)uLengths2[i]) / ( vcapacity * (float)height );
|
_densities [i] = ((float)uLengths2[i]) / ( vcapacity * (float)height );
|
||||||
_feedthroughs [i] += (float)(_blockages[i] / height);
|
_feedthroughs [i] += (float)(_blockages[i] / height);
|
||||||
|
@ -1437,7 +1440,6 @@ namespace Anabatic {
|
||||||
_feedthroughs [i] = 0;
|
_feedthroughs [i] = 0;
|
||||||
_fragmentations[i] = 0;
|
_fragmentations[i] = 0;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_densities[i] >= 1.0) _flags |= Flags::Saturated;
|
if (_densities[i] >= 1.0) _flags |= Flags::Saturated;
|
||||||
|
@ -1455,6 +1457,25 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GCell::truncDensities ()
|
||||||
|
{
|
||||||
|
int hcapacity = (int)getHCapacity();
|
||||||
|
int vcapacity = (int)getVCapacity();
|
||||||
|
Box bBox = getBoundingBox();
|
||||||
|
|
||||||
|
for ( size_t i=0 ; i<_depth ; i++ ) {
|
||||||
|
if (Session::getDirection(i) & Flags::Horizontal) {
|
||||||
|
if (_blockages[i] > hcapacity * bBox.getWidth())
|
||||||
|
_blockages[i] = hcapacity * bBox.getWidth();
|
||||||
|
} else {
|
||||||
|
if (_blockages[i] > vcapacity * bBox.getHeight())
|
||||||
|
_blockages[i] = vcapacity * bBox.getHeight();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_flags &= ~Flags::Saturated;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t GCell::checkDensity () const
|
size_t GCell::checkDensity () const
|
||||||
{
|
{
|
||||||
if (isInvalidated()) const_cast<GCell*>(this)->updateDensity();
|
if (isInvalidated()) const_cast<GCell*>(this)->updateDensity();
|
||||||
|
@ -1485,10 +1506,8 @@ namespace Anabatic {
|
||||||
if (isInvalidated()) const_cast<GCell*>(this)->updateDensity();
|
if (isInvalidated()) const_cast<GCell*>(this)->updateDensity();
|
||||||
|
|
||||||
float capacity = 0.0;
|
float capacity = 0.0;
|
||||||
switch ( Session::getDirection(depth) ) {
|
if (Session::getDirection(depth) & Flags::Horizontal) capacity = getHCapacity();
|
||||||
case Flags::Horizontal: capacity = getHCapacity(); break;
|
else capacity = getVCapacity();
|
||||||
case Flags::Vertical: capacity = getVCapacity(); break;
|
|
||||||
}
|
|
||||||
|
|
||||||
cdebug_log(149,0) << " | hasFreeTrack [" << getId() << "] depth:" << depth << " "
|
cdebug_log(149,0) << " | hasFreeTrack [" << getId() << "] depth:" << depth << " "
|
||||||
<< Session::getRoutingGauge()->getRoutingLayer(depth)->getName()
|
<< Session::getRoutingGauge()->getRoutingLayer(depth)->getName()
|
||||||
|
@ -1543,15 +1562,12 @@ namespace Anabatic {
|
||||||
vector<AutoSegment*>::iterator isegment;
|
vector<AutoSegment*>::iterator isegment;
|
||||||
vector<AutoSegment*>::iterator iend;
|
vector<AutoSegment*>::iterator iend;
|
||||||
|
|
||||||
switch ( Session::getDirection(depth) ) {
|
if (Session::getDirection(depth) & Flags::Horizontal) {
|
||||||
case Flags::Horizontal:
|
|
||||||
iend = _hsegments.end ();
|
iend = _hsegments.end ();
|
||||||
isegment = _hsegments.begin();
|
isegment = _hsegments.begin();
|
||||||
break;
|
} else {
|
||||||
case Flags::Vertical:
|
|
||||||
iend = _vsegments.end ();
|
iend = _vsegments.end ();
|
||||||
isegment = _vsegments.begin();
|
isegment = _vsegments.begin();
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( ; (isegment != iend) ; isegment++ ) {
|
for ( ; (isegment != iend) ; isegment++ ) {
|
||||||
|
@ -1582,15 +1598,12 @@ namespace Anabatic {
|
||||||
vector<AutoSegment*>::iterator iend;
|
vector<AutoSegment*>::iterator iend;
|
||||||
set<Net*> globalNets;
|
set<Net*> globalNets;
|
||||||
|
|
||||||
switch ( Session::getDirection(depth) ) {
|
if (Session::getDirection(depth) & Flags::Horizontal) {
|
||||||
case Flags::Horizontal:
|
|
||||||
iend = _hsegments.end ();
|
iend = _hsegments.end ();
|
||||||
isegment = _hsegments.begin();
|
isegment = _hsegments.begin();
|
||||||
break;
|
} else {
|
||||||
case Flags::Vertical:
|
|
||||||
iend = _vsegments.end ();
|
iend = _vsegments.end ();
|
||||||
isegment = _vsegments.begin();
|
isegment = _vsegments.begin();
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( ; (isegment != iend) ; isegment++ ) {
|
for ( ; (isegment != iend) ; isegment++ ) {
|
||||||
|
@ -1626,15 +1639,12 @@ namespace Anabatic {
|
||||||
vector<AutoSegment*>::iterator isegment;
|
vector<AutoSegment*>::iterator isegment;
|
||||||
vector<AutoSegment*>::iterator iend;
|
vector<AutoSegment*>::iterator iend;
|
||||||
|
|
||||||
switch ( Session::getDirection(depth) ) {
|
if (Session::getDirection(depth) & Flags::Horizontal) {
|
||||||
case Flags::Horizontal:
|
|
||||||
iend = _hsegments.end ();
|
iend = _hsegments.end ();
|
||||||
isegment = _hsegments.begin ();
|
isegment = _hsegments.begin ();
|
||||||
break;
|
} else {
|
||||||
case Flags::Vertical:
|
|
||||||
iend = _vsegments.end ();
|
iend = _vsegments.end ();
|
||||||
isegment = _vsegments.begin ();
|
isegment = _vsegments.begin ();
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( ; (isegment != iend) ; isegment++ ) {
|
for ( ; (isegment != iend) ; isegment++ ) {
|
||||||
|
@ -1775,4 +1785,30 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool isLess ( const GCell* lhs, const GCell* rhs, Flags direction )
|
||||||
|
{
|
||||||
|
if (direction & Flags::Horizontal) {
|
||||||
|
if (lhs->getXMin() != rhs->getXMin()) return lhs->getXMin() < rhs->getXMin();
|
||||||
|
} else {
|
||||||
|
if (direction & Flags::Vertical) {
|
||||||
|
if (lhs->getYMin() != rhs->getYMin()) return lhs->getYMin() < rhs->getYMin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lhs->getId() < rhs->getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool isGreater ( const GCell* lhs, const GCell* rhs, Flags direction )
|
||||||
|
{
|
||||||
|
if (direction & Flags::Horizontal) {
|
||||||
|
if (lhs->getXMin() != rhs->getXMin()) return lhs->getXMin() > rhs->getXMin();
|
||||||
|
} else {
|
||||||
|
if (direction & Flags::Vertical) {
|
||||||
|
if (lhs->getYMin() != rhs->getYMin()) return lhs->getYMin() > rhs->getYMin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lhs->getId() > rhs->getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // Anabatic namespace.
|
} // Anabatic namespace.
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// -*- C++ -*-
|
// -*- mode: C++; explicit-buffer-name: "GlobalRoute.cpp<anabatic>" -*-
|
||||||
//
|
//
|
||||||
// This file is part of the Coriolis Software.
|
// This file is part of the Coriolis Software.
|
||||||
// Copyright (c) UPMC 2016-2016, All Rights Reserved
|
// Copyright (c) UPMC 2016-2016, All Rights Reserved
|
||||||
|
@ -63,7 +63,9 @@ namespace {
|
||||||
float congestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity();
|
float congestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity();
|
||||||
float congestionCost = 1.0 + _h / (1.0 + std::exp(_k * (congestion - 1.0)));
|
float congestionCost = 1.0 + _h / (1.0 + std::exp(_k * (congestion - 1.0)));
|
||||||
|
|
||||||
float distance = (float)source->getDistance() + congestionCost * (float)edge->getDistance();
|
float distance = (float)source->getDistance()
|
||||||
|
+ congestionCost * (float)edge->getDistance();
|
||||||
|
+ edge->getHistoricCost();
|
||||||
|
|
||||||
// Edge* sourceFrom = source->getFrom();
|
// Edge* sourceFrom = source->getFrom();
|
||||||
// if (sourceFrom) {
|
// if (sourceFrom) {
|
||||||
|
@ -77,6 +79,19 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void computeNextHCost ( Edge* edge, float edgeHInc )
|
||||||
|
{
|
||||||
|
float congestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity();
|
||||||
|
float hCost = edge->getHistoricCost();
|
||||||
|
|
||||||
|
float alpha = (congestion < 1.0) ? congestion : std::exp( std::log(8)*( congestion - 1 ) );
|
||||||
|
|
||||||
|
edge->setHistoricCost( alpha * (hCost + ((congestion < 1.0) ? 0.0 : edgeHInc) ));
|
||||||
|
|
||||||
|
cdebug_log(113,0) << edge << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // Anonymous namespace.
|
} // Anonymous namespace.
|
||||||
|
|
||||||
|
|
||||||
|
@ -119,10 +134,10 @@ namespace Anabatic {
|
||||||
//DebugSession::addToTrace( cell->getNet("a_from_pads(0)") );
|
//DebugSession::addToTrace( cell->getNet("a_from_pads(0)") );
|
||||||
//DebugSession::addToTrace( cell->getNet("ialu.not_aux104") );
|
//DebugSession::addToTrace( cell->getNet("ialu.not_aux104") );
|
||||||
//DebugSession::addToTrace( cell->getNet("mips_r3000_1m_dp_shift32_rshift_se_muxoutput(159)") );
|
//DebugSession::addToTrace( cell->getNet("mips_r3000_1m_dp_shift32_rshift_se_muxoutput(159)") );
|
||||||
|
//DebugSession::addToTrace( cell->getNet("mips_r3000_1m_dp_shift32_rshift_se_c1(3)") );
|
||||||
|
|
||||||
startMeasures();
|
startMeasures();
|
||||||
|
|
||||||
UpdateSession::open();
|
|
||||||
if (getGCells().size() == 1) {
|
if (getGCells().size() == 1) {
|
||||||
cmess1 << " o Building regular grid..." << endl;
|
cmess1 << " o Building regular grid..." << endl;
|
||||||
getSouthWestGCell()->doGrid();
|
getSouthWestGCell()->doGrid();
|
||||||
|
@ -130,22 +145,21 @@ namespace Anabatic {
|
||||||
cmess1 << " o Reusing existing grid." << endl;
|
cmess1 << " o Reusing existing grid." << endl;
|
||||||
}
|
}
|
||||||
cmess1 << Dots::asInt(" - GCells" ,getGCells().size()) << endl;
|
cmess1 << Dots::asInt(" - GCells" ,getGCells().size()) << endl;
|
||||||
UpdateSession::close();
|
|
||||||
|
|
||||||
stopMeasures();
|
stopMeasures();
|
||||||
printMeasures( "Anabatic Grid" );
|
printMeasures( "Anabatic Grid" );
|
||||||
|
|
||||||
Session::open( this );
|
|
||||||
setupSpecialNets();
|
setupSpecialNets();
|
||||||
setupPreRouteds ();
|
setupPreRouteds ();
|
||||||
setupNetDatas();
|
setupNetDatas();
|
||||||
Session::close();
|
|
||||||
|
|
||||||
|
openSession();
|
||||||
startMeasures();
|
startMeasures();
|
||||||
|
|
||||||
cmess1 << " o Running global routing..." << endl;
|
cmess1 << " o Running global routing..." << endl;
|
||||||
|
|
||||||
UpdateSession::open();
|
float edgeHInc = getConfiguration()->getEdgeHInc();
|
||||||
|
|
||||||
Dijkstra* dijkstra = new Dijkstra ( this );
|
Dijkstra* dijkstra = new Dijkstra ( this );
|
||||||
dijkstra->setDistance( DigitalDistance( getConfiguration()->getEdgeCostH()
|
dijkstra->setDistance( DigitalDistance( getConfiguration()->getEdgeCostH()
|
||||||
, getConfiguration()->getEdgeCostK() ) );
|
, getConfiguration()->getEdgeCostK() ) );
|
||||||
|
@ -165,24 +179,31 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
cmess2 << left << setw(6) << netCount << right;
|
cmess2 << left << setw(6) << netCount << right;
|
||||||
|
|
||||||
|
//Session::revalidate();
|
||||||
|
|
||||||
const vector<Edge*>& ovEdges = getOvEdges();
|
const vector<Edge*>& ovEdges = getOvEdges();
|
||||||
cmess2 << " ovEdges:" << ovEdges.size();
|
cmess2 << " ovEdges:" << ovEdges.size();
|
||||||
|
|
||||||
|
for ( Edge* edge : ovEdges ) computeNextHCost( edge, edgeHInc );
|
||||||
|
|
||||||
netCount = 0;
|
netCount = 0;
|
||||||
while ( not ovEdges.empty() ) {
|
size_t iEdge = 0;
|
||||||
Edge* ovEdge = ovEdges[0];
|
while ( iEdge < ovEdges.size() ) {
|
||||||
|
Edge* edge = ovEdges[iEdge];
|
||||||
|
netCount += edge->ripup();
|
||||||
|
|
||||||
vector<Segment*> segments = ovEdge->getSegments();
|
if (ovEdges[iEdge] == edge) {
|
||||||
for ( Segment* segment : segments ) {
|
cerr << Error( "AnabaticEngine::globalRoute(): Unable to ripup enough segments of edge:\n"
|
||||||
NetData* netData = getNetData( segment->getNet() );
|
" %s"
|
||||||
if (netData->isGlobalRouted()) ++netCount;
|
, getString(edge).c_str()
|
||||||
|
) << endl;
|
||||||
ripup( segment, Flags::Propagate );
|
++iEdge;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dijkstra->setSearchAreaHalo( Session::getSliceHeight()*3 );
|
||||||
|
|
||||||
cmess2 << " ripup:" << netCount;
|
cmess2 << " ripup:" << netCount;
|
||||||
|
|
||||||
stopMeasures();
|
stopMeasures();
|
||||||
cmess2 << " " << setw(10) << Timer::getStringTime (_timer.getCombTime())
|
cmess2 << " " << setw(10) << Timer::getStringTime (_timer.getCombTime())
|
||||||
<< " " << setw( 6) << Timer::getStringMemory(_timer.getIncrease()) << endl;
|
<< " " << setw( 6) << Timer::getStringMemory(_timer.getIncrease()) << endl;
|
||||||
|
@ -218,7 +239,7 @@ namespace Anabatic {
|
||||||
printMeasures( "Dijkstra" );
|
printMeasures( "Dijkstra" );
|
||||||
|
|
||||||
delete dijkstra;
|
delete dijkstra;
|
||||||
UpdateSession::close();
|
Session::close();
|
||||||
|
|
||||||
_state = EngineGlobalLoaded;
|
_state = EngineGlobalLoaded;
|
||||||
}
|
}
|
||||||
|
|
|
@ -377,7 +377,7 @@ namespace Anabatic {
|
||||||
void AnabaticEngine::_balanceGlobalDensity ( unsigned int depth )
|
void AnabaticEngine::_balanceGlobalDensity ( unsigned int depth )
|
||||||
{
|
{
|
||||||
startMeasures();
|
startMeasures();
|
||||||
Session::open( this );
|
openSession();
|
||||||
|
|
||||||
cmess1 << " o Balance Global Density "
|
cmess1 << " o Balance Global Density "
|
||||||
<< Session::getRoutingGauge()->getRoutingLayer(depth)->getName() << endl;
|
<< Session::getRoutingGauge()->getRoutingLayer(depth)->getName() << endl;
|
||||||
|
@ -435,7 +435,7 @@ namespace Anabatic {
|
||||||
set<Net*> globalNets;
|
set<Net*> globalNets;
|
||||||
GCell::Set invalidateds;
|
GCell::Set invalidateds;
|
||||||
|
|
||||||
Session::open( this );
|
openSession();
|
||||||
|
|
||||||
vector<AutoSegment*> segments;
|
vector<AutoSegment*> segments;
|
||||||
|
|
||||||
|
@ -482,7 +482,7 @@ namespace Anabatic {
|
||||||
unsigned long global = 0;
|
unsigned long global = 0;
|
||||||
|
|
||||||
startMeasures();
|
startMeasures();
|
||||||
Session::open( this );
|
openSession();
|
||||||
|
|
||||||
if (Session::getAllowedDepth() >= 3) {
|
if (Session::getAllowedDepth() >= 3) {
|
||||||
switch ( method ) {
|
switch ( method ) {
|
||||||
|
|
|
@ -2154,7 +2154,10 @@ namespace {
|
||||||
|
|
||||||
void GCellTopology::_doChannel ()
|
void GCellTopology::_doChannel ()
|
||||||
{
|
{
|
||||||
//throw Error( "GCellTopology::_doChannel() Unimplemented, blame goes to E. Lao." );
|
/*throw Error( "GCellTopology::_doChannel() Unimplemented, blame goes to E. Lao.\n"
|
||||||
|
" On: %s."
|
||||||
|
, getString(_gcell).c_str()
|
||||||
|
);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2192,7 +2195,7 @@ namespace Anabatic {
|
||||||
//cmess1 << Dots::asDouble(" - Saturation",getMeasure<double>(getCell(),"Sat.")->getData()) << endl;
|
//cmess1 << Dots::asDouble(" - Saturation",getMeasure<double>(getCell(),"Sat.")->getData()) << endl;
|
||||||
|
|
||||||
startMeasures();
|
startMeasures();
|
||||||
Session::open( this );
|
openSession();
|
||||||
|
|
||||||
forEach ( Net*, inet, getCell()->getNets() ) {
|
forEach ( Net*, inet, getCell()->getNets() ) {
|
||||||
if (NetRoutingExtension::isAutomaticGlobalRoute(*inet)) {
|
if (NetRoutingExtension::isAutomaticGlobalRoute(*inet)) {
|
||||||
|
|
|
@ -63,40 +63,42 @@ namespace {
|
||||||
{
|
{
|
||||||
cdebug_log(145,1) << "propagateConstraintFromRp() - " << rp << endl;
|
cdebug_log(145,1) << "propagateConstraintFromRp() - " << rp << endl;
|
||||||
|
|
||||||
forEach ( Component*, icomponent, rp->getSlaveComponents() ) {
|
for ( Component* component : rp->getSlaveComponents() ) {
|
||||||
cdebug_log(145,0) << "slave component: " << *icomponent << endl;
|
cdebug_log(145,0) << "slave component: " << component << endl;
|
||||||
AutoContact* sourceContact = Session::lookup( dynamic_cast<Contact*>(*icomponent) );
|
AutoContact* sourceContact = Session::lookup( dynamic_cast<Contact*>(component) );
|
||||||
if (sourceContact) {
|
if (sourceContact) {
|
||||||
cdebug_log(145,0) << "Start slave: " << sourceContact << endl;
|
cdebug_log(145,0) << "Start slave: " << sourceContact << endl;
|
||||||
|
|
||||||
set<AutoSegment*> verticalSegments;
|
set<AutoSegment*> verticalSegments;
|
||||||
set<AutoSegment*> horizontalSegments;
|
set<AutoSegment*> horizontalSegments;
|
||||||
|
|
||||||
forEach ( AutoSegment*, isegment, sourceContact->getAutoSegments() ) {
|
for ( AutoSegment* segment : sourceContact->getAutoSegments() ) {
|
||||||
cdebug_log(145,0) << "Examining: " << (*isegment) << endl;
|
cdebug_log(145,0) << "Examining: " << segment << endl;
|
||||||
AutoContact* targetContact = isegment->getOppositeAnchor(sourceContact);
|
AutoContact* targetContact = segment->getOppositeAnchor(sourceContact);
|
||||||
|
|
||||||
if (targetContact) {
|
if (targetContact) {
|
||||||
if (isegment->isHorizontal()) {
|
if (segment->isHorizontal()) {
|
||||||
cdebug_log(145,0) << "On horizontal stack " << (*isegment) << endl;
|
cdebug_log(145,0) << "On horizontal stack " << segment << endl;
|
||||||
horizontalSegments.insert( (*isegment) );
|
horizontalSegments.insert( segment );
|
||||||
} else {
|
} else {
|
||||||
cdebug_log(145,0) << "On vertical stack " << (*isegment) << endl;
|
cdebug_log(145,0) << "On vertical stack " << segment << endl;
|
||||||
verticalSegments.insert( (*isegment) );
|
verticalSegments.insert( segment );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Box constraintBox = sourceContact->getConstraintBox();
|
Box constraintBox = sourceContact->getConstraintBox();
|
||||||
|
cdebug_log(145,0) << "Contraint: " << constraintBox << endl;
|
||||||
|
|
||||||
// Propagate constraint through horizontally aligned segments.
|
// Propagate constraint through horizontally aligned segments.
|
||||||
cdebug_log(145,0) << "Propagate constraint on horizontal segments" << endl;
|
cdebug_log(145,0) << "Propagate constraint on horizontal segments" << endl;
|
||||||
|
|
||||||
set<AutoSegment*>::iterator ihorizontal = horizontalSegments.begin();
|
for ( AutoSegment* horizontal : horizontalSegments ) {
|
||||||
for ( ; ihorizontal != horizontalSegments.end() ; ++ihorizontal ) {
|
|
||||||
AutoContact* contact = NULL;
|
AutoContact* contact = NULL;
|
||||||
forEach ( AutoSegment*, ialigned, (*ihorizontal)->getAligneds() ) {
|
for ( AutoSegment* aligned : horizontal->getAligneds(Flags::WithSelf) ) {
|
||||||
contact = ialigned->getAutoTarget();
|
cdebug_log(145,0) << "aligned horizontal: " << aligned << endl;
|
||||||
|
|
||||||
|
contact = aligned->getAutoTarget();
|
||||||
cdebug_log(145,0) << "contact: " << contact << endl;
|
cdebug_log(145,0) << "contact: " << contact << endl;
|
||||||
if (contact) {
|
if (contact) {
|
||||||
cdebug_log(145,0) << "Apply to (target): " << contact << endl;
|
cdebug_log(145,0) << "Apply to (target): " << contact << endl;
|
||||||
|
@ -104,7 +106,7 @@ namespace {
|
||||||
, constraintBox.getYMax()
|
, constraintBox.getYMax()
|
||||||
, Flags::Horizontal|Flags::WarnOnError );
|
, Flags::Horizontal|Flags::WarnOnError );
|
||||||
}
|
}
|
||||||
contact = ialigned->getAutoSource();
|
contact = aligned->getAutoSource();
|
||||||
cdebug_log(145,0) << "contact: " << contact << endl;
|
cdebug_log(145,0) << "contact: " << contact << endl;
|
||||||
if (contact) {
|
if (contact) {
|
||||||
cdebug_log(145,0) << "Apply to (source): " << contact << endl;
|
cdebug_log(145,0) << "Apply to (source): " << contact << endl;
|
||||||
|
@ -118,18 +120,19 @@ namespace {
|
||||||
// Propagate constraint through vertically aligned segments.
|
// Propagate constraint through vertically aligned segments.
|
||||||
cdebug_log(145,0) << "Propagate constraint on vertical segments" << endl;
|
cdebug_log(145,0) << "Propagate constraint on vertical segments" << endl;
|
||||||
|
|
||||||
set<AutoSegment*>::iterator ivertical = verticalSegments.begin();
|
for ( AutoSegment* vertical : verticalSegments ) {
|
||||||
for ( ; ivertical != verticalSegments.end() ; ++ivertical ) {
|
|
||||||
AutoContact* contact = NULL;
|
AutoContact* contact = NULL;
|
||||||
forEach ( AutoSegment*, ialigned, (*ivertical)->getAligneds() ) {
|
for ( AutoSegment* aligned : vertical->getAligneds(Flags::WithSelf) ) {
|
||||||
contact = ialigned->getAutoTarget();
|
cdebug_log(145,0) << "aligned vertical: " << aligned << endl;
|
||||||
|
|
||||||
|
contact = aligned->getAutoTarget();
|
||||||
if (contact) {
|
if (contact) {
|
||||||
cdebug_log(145,0) << "Apply to (target): " << contact << endl;
|
cdebug_log(145,0) << "Apply to (target): " << contact << endl;
|
||||||
contact->restrictConstraintBox( constraintBox.getXMin()
|
contact->restrictConstraintBox( constraintBox.getXMin()
|
||||||
, constraintBox.getXMax()
|
, constraintBox.getXMax()
|
||||||
, Flags::Vertical|Flags::WarnOnError );
|
, Flags::Vertical|Flags::WarnOnError );
|
||||||
}
|
}
|
||||||
contact = ialigned->getAutoSource();
|
contact = aligned->getAutoSource();
|
||||||
if (contact) {
|
if (contact) {
|
||||||
cdebug_log(145,0) << "Apply to (source): " << contact << endl;
|
cdebug_log(145,0) << "Apply to (source): " << contact << endl;
|
||||||
contact->restrictConstraintBox( constraintBox.getXMin()
|
contact->restrictConstraintBox( constraintBox.getXMin()
|
||||||
|
|
|
@ -70,6 +70,8 @@ namespace Anabatic {
|
||||||
{
|
{
|
||||||
cmess1 << " o Looking for fixed or manually global routed nets." << endl;
|
cmess1 << " o Looking for fixed or manually global routed nets." << endl;
|
||||||
|
|
||||||
|
openSession();
|
||||||
|
|
||||||
for ( Net* net : getCell()->getNets() ) {
|
for ( Net* net : getCell()->getNets() ) {
|
||||||
if (net == _blockageNet) continue;
|
if (net == _blockageNet) continue;
|
||||||
if (net->getType() == Net::Type::POWER ) continue;
|
if (net->getType() == Net::Type::POWER ) continue;
|
||||||
|
@ -170,7 +172,7 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Session::revalidate();
|
Session::close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
|
||||||
const char* reopenSession = "Session::open(): Session already open for %s (internal error).";
|
const char* reopenSession = "Anabatic::Session::_open(): Session already open for %s (internal error).";
|
||||||
const char* openSessionError = "%s: Session has not been opened (internal error).";
|
const char* openSessionError = "%s: Session has not been opened (internal error).";
|
||||||
|
|
||||||
|
|
||||||
|
@ -96,7 +96,6 @@ namespace Anabatic {
|
||||||
{
|
{
|
||||||
if (_anabatic->getState() <= EngineActive) {
|
if (_anabatic->getState() <= EngineActive) {
|
||||||
_revalidate ();
|
_revalidate ();
|
||||||
|
|
||||||
_anabatic->updateDensity();
|
_anabatic->updateDensity();
|
||||||
}
|
}
|
||||||
UpdateSession::close();
|
UpdateSession::close();
|
||||||
|
@ -266,9 +265,9 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Session* Session::open ( AnabaticEngine* anbt )
|
Session* Session::_open ( AnabaticEngine* anbt )
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << "Session::open()" << endl;
|
cdebug_log(145,0) << "Anabatic::Session::_open()" << endl;
|
||||||
|
|
||||||
if (_session) {
|
if (_session) {
|
||||||
if (_session->_anabatic != anbt)
|
if (_session->_anabatic != anbt)
|
||||||
|
|
|
@ -107,6 +107,7 @@ namespace Anabatic {
|
||||||
NetData ( Net* );
|
NetData ( Net* );
|
||||||
inline bool isGlobalRouted () const;
|
inline bool isGlobalRouted () const;
|
||||||
inline bool isMixedPreRoute () const;
|
inline bool isMixedPreRoute () const;
|
||||||
|
inline bool isFixed () const;
|
||||||
inline Net* getNet () const;
|
inline Net* getNet () const;
|
||||||
inline NetRoutingState* getNetRoutingState () const;
|
inline NetRoutingState* getNetRoutingState () const;
|
||||||
inline const Box& getSearchArea () const;
|
inline const Box& getSearchArea () const;
|
||||||
|
@ -133,6 +134,7 @@ namespace Anabatic {
|
||||||
|
|
||||||
inline bool NetData::isGlobalRouted () const { return _flags & Flags::GlobalRouted; }
|
inline bool NetData::isGlobalRouted () const { return _flags & Flags::GlobalRouted; }
|
||||||
inline bool NetData::isMixedPreRoute () const { return (_state) ? _state->isMixedPreRoute() : false; }
|
inline bool NetData::isMixedPreRoute () const { return (_state) ? _state->isMixedPreRoute() : false; }
|
||||||
|
inline bool NetData::isFixed () const { return (_state) ? _state->isFixed () : false; }
|
||||||
inline Net* NetData::getNet () const { return _net; }
|
inline Net* NetData::getNet () const { return _net; }
|
||||||
inline NetRoutingState* NetData::getNetRoutingState () const { return _state; }
|
inline NetRoutingState* NetData::getNetRoutingState () const { return _state; }
|
||||||
inline const Box& NetData::getSearchArea () const { return _searchArea; }
|
inline const Box& NetData::getSearchArea () const { return _searchArea; }
|
||||||
|
@ -195,8 +197,10 @@ namespace Anabatic {
|
||||||
inline GCell* getGCellUnder ( DbU::Unit x, DbU::Unit y ) const;
|
inline GCell* getGCellUnder ( DbU::Unit x, DbU::Unit y ) const;
|
||||||
inline GCell* getGCellUnder ( Point ) const;
|
inline GCell* getGCellUnder ( Point ) const;
|
||||||
inline GCellsUnder getGCellsUnder ( Segment* ) const;
|
inline GCellsUnder getGCellsUnder ( Segment* ) const;
|
||||||
|
Interval getUSide ( Flags direction ) const;
|
||||||
int getCapacity ( Interval, Flags ) const;
|
int getCapacity ( Interval, Flags ) const;
|
||||||
size_t getNetsFromEdge ( const Edge*, NetSet& );
|
size_t getNetsFromEdge ( const Edge*, NetSet& );
|
||||||
|
virtual void openSession ();
|
||||||
inline void setState ( EngineState state );
|
inline void setState ( EngineState state );
|
||||||
inline void setDensityMode ( unsigned int );
|
inline void setDensityMode ( unsigned int );
|
||||||
inline void addOv ( Edge* );
|
inline void addOv ( Edge* );
|
||||||
|
@ -225,11 +229,14 @@ namespace Anabatic {
|
||||||
inline size_t getSaturateRp () const;
|
inline size_t getSaturateRp () const;
|
||||||
inline DbU::Unit getExtensionCap () const;
|
inline DbU::Unit getExtensionCap () const;
|
||||||
inline Net* getBlockageNet () const;
|
inline Net* getBlockageNet () const;
|
||||||
|
inline const ChipTools& getChipTools () const;
|
||||||
|
inline const vector<NetData*>& getNetOrdering () const;
|
||||||
void updateDensity ();
|
void updateDensity ();
|
||||||
size_t checkGCellDensities ();
|
size_t checkGCellDensities ();
|
||||||
inline void setGlobalThreshold ( DbU::Unit );
|
inline void setGlobalThreshold ( DbU::Unit );
|
||||||
inline void setSaturateRatio ( float );
|
inline void setSaturateRatio ( float );
|
||||||
inline void setSaturateRp ( size_t );
|
inline void setSaturateRp ( size_t );
|
||||||
|
inline void setBlockageNet ( Net* );
|
||||||
void chipPrep ();
|
void chipPrep ();
|
||||||
void setupSpecialNets ();
|
void setupSpecialNets ();
|
||||||
void setupPreRouteds ();
|
void setupPreRouteds ();
|
||||||
|
@ -261,10 +268,13 @@ namespace Anabatic {
|
||||||
void _saveNet ( Net* );
|
void _saveNet ( Net* );
|
||||||
void _destroyAutoContacts ();
|
void _destroyAutoContacts ();
|
||||||
void _destroyAutoSegments ();
|
void _destroyAutoSegments ();
|
||||||
|
void _check ( Net* net ) const;
|
||||||
|
bool _check ( const char* message ) const;
|
||||||
// Misc. functions.
|
// Misc. functions.
|
||||||
inline const Flags& flags () const;
|
inline const Flags& flags () const;
|
||||||
inline Flags& flags ();
|
inline Flags& flags ();
|
||||||
void reset ();
|
void reset ();
|
||||||
|
inline const Timer& getTimer () const;
|
||||||
void startMeasures ();
|
void startMeasures ();
|
||||||
void stopMeasures ();
|
void stopMeasures ();
|
||||||
void printMeasures ( const string& ) const;
|
void printMeasures ( const string& ) const;
|
||||||
|
@ -319,6 +329,7 @@ namespace Anabatic {
|
||||||
inline GCellsUnder AnabaticEngine::getGCellsUnder ( Segment* s ) const { return std::shared_ptr<RawGCellsUnder>( new RawGCellsUnder(this,s) ); }
|
inline GCellsUnder AnabaticEngine::getGCellsUnder ( Segment* s ) const { return std::shared_ptr<RawGCellsUnder>( new RawGCellsUnder(this,s) ); }
|
||||||
inline unsigned int AnabaticEngine::getDensityMode () const { return _densityMode; }
|
inline unsigned int AnabaticEngine::getDensityMode () const { return _densityMode; }
|
||||||
inline void AnabaticEngine::setDensityMode ( unsigned int mode ) { _densityMode=mode; }
|
inline void AnabaticEngine::setDensityMode ( unsigned int mode ) { _densityMode=mode; }
|
||||||
|
inline void AnabaticEngine::setBlockageNet ( Net* net ) { _blockageNet = net; }
|
||||||
inline const AutoContactLut& AnabaticEngine::_getAutoContactLut () const { return _autoContactLut; }
|
inline const AutoContactLut& AnabaticEngine::_getAutoContactLut () const { return _autoContactLut; }
|
||||||
inline const AutoSegmentLut& AnabaticEngine::_getAutoSegmentLut () const { return _autoSegmentLut; }
|
inline const AutoSegmentLut& AnabaticEngine::_getAutoSegmentLut () const { return _autoSegmentLut; }
|
||||||
inline const Flags& AnabaticEngine::flags () const { return _flags; }
|
inline const Flags& AnabaticEngine::flags () const { return _flags; }
|
||||||
|
@ -335,6 +346,8 @@ namespace Anabatic {
|
||||||
inline void AnabaticEngine::setSaturateRatio ( float ratio ) { _configuration->setSaturateRatio(ratio); }
|
inline void AnabaticEngine::setSaturateRatio ( float ratio ) { _configuration->setSaturateRatio(ratio); }
|
||||||
inline void AnabaticEngine::setSaturateRp ( size_t threshold ) { _configuration->setSaturateRp(threshold); }
|
inline void AnabaticEngine::setSaturateRp ( size_t threshold ) { _configuration->setSaturateRp(threshold); }
|
||||||
inline Net* AnabaticEngine::getBlockageNet () const { return _blockageNet; }
|
inline Net* AnabaticEngine::getBlockageNet () const { return _blockageNet; }
|
||||||
|
inline const ChipTools& AnabaticEngine::getChipTools () const { return _chipTools; }
|
||||||
|
inline const vector<NetData*>& AnabaticEngine::getNetOrdering () const { return _netOrdering; }
|
||||||
inline void AnabaticEngine::setGlobalThreshold ( DbU::Unit threshold ) { _configuration->setGlobalThreshold(threshold); }
|
inline void AnabaticEngine::setGlobalThreshold ( DbU::Unit threshold ) { _configuration->setGlobalThreshold(threshold); }
|
||||||
inline const NetDatas& AnabaticEngine::getNetDatas () const { return _netDatas; }
|
inline const NetDatas& AnabaticEngine::getNetDatas () const { return _netDatas; }
|
||||||
inline void AnabaticEngine::_updateLookup ( GCell* gcell ) { _matrix.updateLookup(gcell); }
|
inline void AnabaticEngine::_updateLookup ( GCell* gcell ) { _matrix.updateLookup(gcell); }
|
||||||
|
@ -356,6 +369,7 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline const Timer& AnabaticEngine::getTimer () const { return _timer; }
|
||||||
inline int AnabaticEngine::getStamp () const { return _stamp; }
|
inline int AnabaticEngine::getStamp () const { return _stamp; }
|
||||||
inline int AnabaticEngine::incStamp () { return ++_stamp; }
|
inline int AnabaticEngine::incStamp () { return ++_stamp; }
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ namespace Anabatic {
|
||||||
virtual bool getConstraints ( DbU::Unit& min , DbU::Unit& max ) const;
|
virtual bool getConstraints ( DbU::Unit& min , DbU::Unit& max ) const;
|
||||||
virtual Interval getSourceConstraints ( unsigned int flags=0 ) const;
|
virtual Interval getSourceConstraints ( unsigned int flags=0 ) const;
|
||||||
virtual Interval getTargetConstraints ( unsigned int flags=0 ) const;
|
virtual Interval getTargetConstraints ( unsigned int flags=0 ) const;
|
||||||
virtual unsigned int getDirection () const;
|
virtual Flags getDirection () const;
|
||||||
virtual size_t getGCells ( vector<GCell*>& ) const;
|
virtual size_t getGCells ( vector<GCell*>& ) const;
|
||||||
// Modifiers.
|
// Modifiers.
|
||||||
virtual void setDuSource ( DbU::Unit );
|
virtual void setDuSource ( DbU::Unit );
|
||||||
|
|
|
@ -215,7 +215,7 @@ namespace Anabatic {
|
||||||
// Accessors.
|
// Accessors.
|
||||||
inline unsigned long getId () const;
|
inline unsigned long getId () const;
|
||||||
inline unsigned int getFlags () const;
|
inline unsigned int getFlags () const;
|
||||||
virtual unsigned int getDirection () const = 0;
|
virtual Flags getDirection () const = 0;
|
||||||
inline GCell* getGCell () const;
|
inline GCell* getGCell () const;
|
||||||
virtual size_t getGCells ( vector<GCell*>& ) const = 0;
|
virtual size_t getGCells ( vector<GCell*>& ) const = 0;
|
||||||
inline AutoContact* getAutoSource () const;
|
inline AutoContact* getAutoSource () const;
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
// -*- C++ -*-
|
// -*- C++ -*-
|
||||||
//
|
//
|
||||||
// This file is part of the Coriolis Software.
|
// This file is part of the Coriolis Software.
|
||||||
|
@ -49,7 +48,7 @@ namespace Anabatic {
|
||||||
virtual bool getConstraints ( DbU::Unit& min, DbU::Unit& max ) const;
|
virtual bool getConstraints ( DbU::Unit& min, DbU::Unit& max ) const;
|
||||||
virtual Interval getSourceConstraints ( unsigned int flags=0 ) const;
|
virtual Interval getSourceConstraints ( unsigned int flags=0 ) const;
|
||||||
virtual Interval getTargetConstraints ( unsigned int flags=0 ) const;
|
virtual Interval getTargetConstraints ( unsigned int flags=0 ) const;
|
||||||
virtual unsigned int getDirection () const;
|
virtual Flags getDirection () const;
|
||||||
virtual size_t getGCells ( vector<GCell*>& ) const;
|
virtual size_t getGCells ( vector<GCell*>& ) const;
|
||||||
// Modifiers.
|
// Modifiers.
|
||||||
virtual void setDuSource ( DbU::Unit );
|
virtual void setDuSource ( DbU::Unit );
|
||||||
|
|
|
@ -50,115 +50,53 @@ namespace Anabatic {
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// Class : "Anabatic::Configuration" (decorator).
|
// Class : "Anabatic::Configuration".
|
||||||
|
|
||||||
class Configuration {
|
class Configuration {
|
||||||
public:
|
public:
|
||||||
// Constructor & Destructor.
|
// Constructor & Destructor.
|
||||||
virtual ~Configuration ();
|
Configuration ( const CellGauge* cg=NULL, const RoutingGauge* rg=NULL );
|
||||||
virtual Configuration* clone () const = 0;
|
|
||||||
// Methods.
|
|
||||||
virtual bool isGMetal ( const Layer* ) const = 0;
|
|
||||||
virtual bool isGContact ( const Layer* ) const = 0;
|
|
||||||
virtual const Layer* getGContactLayer () const = 0;
|
|
||||||
virtual const Layer* getGHorizontalLayer () const = 0;
|
|
||||||
virtual const Layer* getGVerticalLayer () const = 0;
|
|
||||||
virtual size_t getDepth () const = 0;
|
|
||||||
virtual size_t getAllowedDepth () const = 0;
|
|
||||||
virtual size_t getLayerDepth ( const Layer* ) const = 0;
|
|
||||||
virtual CellGauge* getCellGauge () const = 0;
|
|
||||||
virtual RoutingGauge* getRoutingGauge () const = 0;
|
|
||||||
virtual RoutingLayerGauge* getLayerGauge ( size_t depth ) const = 0;
|
|
||||||
virtual const Layer* getRoutingLayer ( size_t depth ) const = 0;
|
|
||||||
virtual Layer* getContactLayer ( size_t depth ) const = 0;
|
|
||||||
virtual DbU::Unit getSliceHeight () const = 0;
|
|
||||||
virtual DbU::Unit getSliceStep () const = 0;
|
|
||||||
virtual DbU::Unit getPitch ( size_t depth, Flags flags ) const = 0;
|
|
||||||
virtual DbU::Unit getOffset ( size_t depth ) const = 0;
|
|
||||||
virtual DbU::Unit getWireWidth ( size_t depth ) const = 0;
|
|
||||||
virtual DbU::Unit getExtensionCap ( size_t depth ) const = 0;
|
|
||||||
virtual Flags getDirection ( size_t depth ) const = 0;
|
|
||||||
virtual DbU::Unit getPitch ( const Layer*, Flags flags ) const = 0;
|
|
||||||
virtual DbU::Unit getOffset ( const Layer* ) const = 0;
|
|
||||||
virtual DbU::Unit getWireWidth ( const Layer* ) const = 0;
|
|
||||||
virtual DbU::Unit getExtensionCap ( const Layer* ) const = 0;
|
|
||||||
virtual Flags getDirection ( const Layer* ) const = 0;
|
|
||||||
virtual float getSaturateRatio () const = 0;
|
|
||||||
virtual size_t getSaturateRp () const = 0;
|
|
||||||
virtual DbU::Unit getGlobalThreshold () const = 0;
|
|
||||||
virtual void setAllowedDepth ( size_t ) = 0;
|
|
||||||
virtual void setSaturateRatio ( float ) = 0;
|
|
||||||
virtual void setSaturateRp ( size_t ) = 0;
|
|
||||||
virtual void setGlobalThreshold ( DbU::Unit ) = 0;
|
|
||||||
virtual DbU::Unit getEdgeLength () const = 0;
|
|
||||||
virtual DbU::Unit getEdgeWidth () const = 0;
|
|
||||||
virtual float getEdgeCostH () const = 0;
|
|
||||||
virtual float getEdgeCostK () const = 0;
|
|
||||||
virtual size_t getHEdgeLocal () const = 0;
|
|
||||||
virtual size_t getVEdgeLocal () const = 0;
|
|
||||||
virtual void print ( Cell* ) const = 0;
|
|
||||||
virtual Record* _getRecord () const = 0;
|
|
||||||
virtual string _getString () const = 0;
|
|
||||||
virtual string _getTypeName () const = 0;
|
|
||||||
protected:
|
|
||||||
Configuration ();
|
|
||||||
private:
|
|
||||||
Configuration ( const Configuration& );
|
Configuration ( const Configuration& );
|
||||||
Configuration& operator= ( const Configuration& );
|
virtual ~Configuration ();
|
||||||
private:
|
virtual Configuration* clone () const;
|
||||||
static Configuration* _default;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
|
||||||
// Class : "Anabatic::ConfigurationConcrete".
|
|
||||||
|
|
||||||
class ConfigurationConcrete : public Configuration {
|
|
||||||
friend class Configuration;
|
|
||||||
public:
|
|
||||||
// Constructor & Destructor.
|
|
||||||
ConfigurationConcrete ( const CellGauge* cg=NULL, const RoutingGauge* rg=NULL );
|
|
||||||
virtual ~ConfigurationConcrete ();
|
|
||||||
virtual ConfigurationConcrete* clone () const;
|
|
||||||
// Methods.
|
// Methods.
|
||||||
virtual bool isGMetal ( const Layer* ) const;
|
bool isGMetal ( const Layer* ) const;
|
||||||
virtual bool isGContact ( const Layer* ) const;
|
bool isGContact ( const Layer* ) const;
|
||||||
virtual const Layer* getGContactLayer () const;
|
const Layer* getGContactLayer () const;
|
||||||
virtual const Layer* getGHorizontalLayer () const;
|
const Layer* getGHorizontalLayer () const;
|
||||||
virtual const Layer* getGVerticalLayer () const;
|
const Layer* getGVerticalLayer () const;
|
||||||
virtual size_t getDepth () const;
|
size_t getDepth () const;
|
||||||
virtual size_t getAllowedDepth () const;
|
size_t getAllowedDepth () const;
|
||||||
virtual size_t getLayerDepth ( const Layer* ) const;
|
size_t getLayerDepth ( const Layer* ) const;
|
||||||
virtual CellGauge* getCellGauge () const;
|
CellGauge* getCellGauge () const;
|
||||||
virtual RoutingGauge* getRoutingGauge () const;
|
RoutingGauge* getRoutingGauge () const;
|
||||||
virtual RoutingLayerGauge* getLayerGauge ( size_t depth ) const;
|
RoutingLayerGauge* getLayerGauge ( size_t depth ) const;
|
||||||
virtual const Layer* getRoutingLayer ( size_t depth ) const;
|
const Layer* getRoutingLayer ( size_t depth ) const;
|
||||||
virtual Layer* getContactLayer ( size_t depth ) const;
|
Layer* getContactLayer ( size_t depth ) const;
|
||||||
virtual DbU::Unit getSliceHeight () const;
|
DbU::Unit getSliceHeight () const;
|
||||||
virtual DbU::Unit getSliceStep () const;
|
DbU::Unit getSliceStep () const;
|
||||||
virtual DbU::Unit getPitch ( size_t depth, Flags flags ) const;
|
DbU::Unit getPitch ( size_t depth, Flags flags ) const;
|
||||||
virtual DbU::Unit getOffset ( size_t depth ) const;
|
DbU::Unit getOffset ( size_t depth ) const;
|
||||||
virtual DbU::Unit getWireWidth ( size_t depth ) const;
|
DbU::Unit getWireWidth ( size_t depth ) const;
|
||||||
virtual DbU::Unit getExtensionCap ( size_t depth ) const;
|
DbU::Unit getExtensionCap ( size_t depth ) const;
|
||||||
virtual Flags getDirection ( size_t depth ) const;
|
Flags getDirection ( size_t depth ) const;
|
||||||
virtual DbU::Unit getPitch ( const Layer*, Flags flags ) const;
|
DbU::Unit getPitch ( const Layer*, Flags flags ) const;
|
||||||
virtual DbU::Unit getOffset ( const Layer* ) const;
|
DbU::Unit getOffset ( const Layer* ) const;
|
||||||
virtual DbU::Unit getWireWidth ( const Layer* ) const;
|
DbU::Unit getWireWidth ( const Layer* ) const;
|
||||||
virtual DbU::Unit getExtensionCap ( const Layer* ) const;
|
DbU::Unit getExtensionCap ( const Layer* ) const;
|
||||||
virtual Flags getDirection ( const Layer* ) const;
|
Flags getDirection ( const Layer* ) const;
|
||||||
virtual float getSaturateRatio () const;
|
float getSaturateRatio () const;
|
||||||
virtual size_t getSaturateRp () const;
|
size_t getSaturateRp () const;
|
||||||
virtual DbU::Unit getGlobalThreshold () const;
|
DbU::Unit getGlobalThreshold () const;
|
||||||
virtual void setAllowedDepth ( size_t );
|
void setAllowedDepth ( size_t );
|
||||||
virtual void setSaturateRatio ( float );
|
void setSaturateRatio ( float );
|
||||||
virtual void setSaturateRp ( size_t );
|
void setSaturateRp ( size_t );
|
||||||
virtual void setGlobalThreshold ( DbU::Unit );
|
void setGlobalThreshold ( DbU::Unit );
|
||||||
virtual DbU::Unit getEdgeLength () const;
|
DbU::Unit getEdgeLength () const;
|
||||||
virtual DbU::Unit getEdgeWidth () const;
|
DbU::Unit getEdgeWidth () const;
|
||||||
virtual float getEdgeCostH () const;
|
float getEdgeCostH () const;
|
||||||
virtual float getEdgeCostK () const;
|
float getEdgeCostK () const;
|
||||||
virtual size_t getHEdgeLocal () const;
|
float getEdgeHInc () const;
|
||||||
virtual size_t getVEdgeLocal () const;
|
|
||||||
virtual void print ( Cell* ) const;
|
virtual void print ( Cell* ) const;
|
||||||
virtual Record* _getRecord () const;
|
virtual Record* _getRecord () const;
|
||||||
virtual string _getString () const;
|
virtual string _getString () const;
|
||||||
|
@ -179,11 +117,9 @@ namespace Anabatic {
|
||||||
DbU::Unit _edgeWidth;
|
DbU::Unit _edgeWidth;
|
||||||
float _edgeCostH;
|
float _edgeCostH;
|
||||||
float _edgeCostK;
|
float _edgeCostK;
|
||||||
size_t _hEdgeLocal;
|
float _edgeHInc;
|
||||||
size_t _vEdgeLocal;
|
|
||||||
private:
|
private:
|
||||||
ConfigurationConcrete ( const ConfigurationConcrete& );
|
Configuration& operator= ( const Configuration& ) = delete;
|
||||||
ConfigurationConcrete& operator= ( const ConfigurationConcrete& );
|
|
||||||
void _setTopRoutingLayer ( Name name );
|
void _setTopRoutingLayer ( Name name );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -192,7 +128,5 @@ namespace Anabatic {
|
||||||
|
|
||||||
|
|
||||||
INSPECTOR_P_SUPPORT(Anabatic::Configuration);
|
INSPECTOR_P_SUPPORT(Anabatic::Configuration);
|
||||||
INSPECTOR_P_SUPPORT(Anabatic::ConfigurationConcrete);
|
|
||||||
|
|
||||||
|
|
||||||
#endif // ANABATIC_CONFIGURATION_H
|
#endif // ANABATIC_CONFIGURATION_H
|
||||||
|
|
|
@ -24,64 +24,65 @@ namespace Anabatic {
|
||||||
|
|
||||||
class Flags : public Hurricane::BaseFlags {
|
class Flags : public Hurricane::BaseFlags {
|
||||||
public:
|
public:
|
||||||
static const unsigned int NoFlags = 0;
|
static const unsigned int NoFlags ; // = 0;
|
||||||
// Flags used for both objects states & functions arguments.
|
// Flags used for both objects states & functions arguments.
|
||||||
static const unsigned int Horizontal = (1 << 0);
|
static const unsigned int Horizontal ; // = (1 << 0);
|
||||||
static const unsigned int Vertical = (1 << 1);
|
static const unsigned int Vertical ; // = (1 << 1);
|
||||||
static const unsigned int Source = (1 << 2);
|
static const unsigned int Source ; // = (1 << 2);
|
||||||
static const unsigned int Target = (1 << 3);
|
static const unsigned int Target ; // = (1 << 3);
|
||||||
static const unsigned int Invalidated = (1 << 4);
|
static const unsigned int Invalidated ; // = (1 << 4);
|
||||||
// Flags for GCell objects states only.
|
// Flags for GCell objects states only.
|
||||||
static const unsigned int DeviceGCell = (1 << 5);
|
static const unsigned int DeviceGCell ; // = (1 << 5);
|
||||||
static const unsigned int ChannelGCell = (1 << 6);
|
static const unsigned int ChannelGCell ; // = (1 << 6);
|
||||||
static const unsigned int StrutGCell = (1 << 7);
|
static const unsigned int StrutGCell ; // = (1 << 7);
|
||||||
static const unsigned int MatrixGCell = (1 << 8);
|
static const unsigned int MatrixGCell ; // = (1 << 8);
|
||||||
static const unsigned int IoPadGCell = (1 << 9);
|
static const unsigned int IoPadGCell ; // = (1 << 9);
|
||||||
static const unsigned int Saturated = (1 << 10);
|
static const unsigned int Saturated ; // = (1 << 10);
|
||||||
// Flags for Anabatic objects states only.
|
// Flags for Anabatic objects states only.
|
||||||
static const unsigned int DemoMode = (1 << 5);
|
static const unsigned int DemoMode ; // = (1 << 5);
|
||||||
static const unsigned int WarnOnGCellOverload = (1 << 6);
|
static const unsigned int WarnOnGCellOverload ; // = (1 << 6);
|
||||||
static const unsigned int DestroyGCell = (1 << 7);
|
static const unsigned int DestroyGCell ; // = (1 << 7);
|
||||||
static const unsigned int DestroyBaseContact = (1 << 8);
|
static const unsigned int DestroyBaseContact ; // = (1 << 8);
|
||||||
static const unsigned int DestroyBaseSegment = (1 << 9);
|
static const unsigned int DestroyBaseSegment ; // = (1 << 9);
|
||||||
// Flags for NetDatas objects states only.
|
// Flags for NetDatas objects states only.
|
||||||
static const unsigned int GlobalRouted = (1 << 5);
|
static const unsigned int GlobalRouted ; // = (1 << 5);
|
||||||
// Masks.
|
// Masks.
|
||||||
static const unsigned int WestSide = Horizontal|Target;
|
static const unsigned int WestSide ; // = Horizontal|Target;
|
||||||
static const unsigned int EastSide = Horizontal|Source;
|
static const unsigned int EastSide ; // = Horizontal|Source;
|
||||||
static const unsigned int SouthSide = Vertical |Target;
|
static const unsigned int SouthSide ; // = Vertical |Target;
|
||||||
static const unsigned int NorthSide = Vertical |Source;
|
static const unsigned int NorthSide ; // = Vertical |Source;
|
||||||
static const unsigned int AllSides = WestSide|EastSide|SouthSide|NorthSide ;
|
static const unsigned int AllSides ; // = WestSide|EastSide|SouthSide|NorthSide ;
|
||||||
static const unsigned int EndsMask = Source|Target;
|
static const unsigned int EndsMask ; // = Source|Target;
|
||||||
static const unsigned int DirectionMask = Horizontal|Vertical;
|
static const unsigned int DirectionMask ; // = Horizontal|Vertical;
|
||||||
static const unsigned int DestroyMask = DestroyGCell|DestroyBaseContact|DestroyBaseSegment;
|
static const unsigned int DestroyMask ; // = DestroyGCell|DestroyBaseContact|DestroyBaseSegment;
|
||||||
static const unsigned int GCellTypeMask = DeviceGCell|ChannelGCell|StrutGCell|MatrixGCell|IoPadGCell;
|
static const unsigned int GCellTypeMask ; // = DeviceGCell|ChannelGCell|StrutGCell|MatrixGCell|IoPadGCell;
|
||||||
// Flags for functions arguments only.
|
// Flags for functions arguments only.
|
||||||
static const unsigned int AboveLayer = (1 << 5);
|
static const unsigned int Create ; // = (1 << 5);
|
||||||
static const unsigned int BelowLayer = (1 << 6);
|
static const unsigned int WithPerpands ;
|
||||||
static const unsigned int OpenSession = (1 << 7);
|
static const unsigned int WithSelf ;
|
||||||
static const unsigned int Realignate = (1 << 8);
|
static const unsigned int AboveLayer ;
|
||||||
static const unsigned int NativeConstraints = (1 << 9);
|
static const unsigned int BelowLayer ;
|
||||||
static const unsigned int ForceMove = (1 << 10);
|
static const unsigned int OpenSession ;
|
||||||
static const unsigned int WithPerpands = (1 << 11);
|
static const unsigned int Realignate ;
|
||||||
static const unsigned int WarnOnError = (1 << 12);
|
static const unsigned int NativeConstraints ;
|
||||||
static const unsigned int Topology = (1 << 13);
|
static const unsigned int ForceMove ;
|
||||||
static const unsigned int GlobalSegment = (1 << 14);
|
static const unsigned int WarnOnError ;
|
||||||
static const unsigned int AllowTerminal = (1 << 15);
|
static const unsigned int Topology ;
|
||||||
static const unsigned int AllowLocal = (1 << 16);
|
static const unsigned int GlobalSegment ;
|
||||||
static const unsigned int IgnoreContacts = (1 << 17);
|
static const unsigned int AllowTerminal ;
|
||||||
static const unsigned int Propagate = (1 << 18);
|
static const unsigned int AllowLocal ;
|
||||||
static const unsigned int Superior = (1 << 19);
|
static const unsigned int IgnoreContacts ;
|
||||||
static const unsigned int DoglegOnLeft = (1 << 20);
|
static const unsigned int Propagate ;
|
||||||
static const unsigned int DoglegOnRight = (1 << 21);
|
static const unsigned int Superior ;
|
||||||
static const unsigned int WithNeighbors = (1 << 22);
|
static const unsigned int DoglegOnLeft ;
|
||||||
static const unsigned int NoCheckLayer = (1 << 23);
|
static const unsigned int DoglegOnRight ;
|
||||||
static const unsigned int HalfSlacken = (1 << 24);
|
static const unsigned int WithNeighbors ;
|
||||||
static const unsigned int NoGCellShrink = (1 << 25);
|
static const unsigned int NoCheckLayer ;
|
||||||
static const unsigned int CParanoid = (1 << 26);
|
static const unsigned int HalfSlacken ;
|
||||||
static const unsigned int Create = (1 << 27);
|
static const unsigned int NoGCellShrink ;
|
||||||
static const unsigned int CheckLowDensity = (1 << 28);
|
static const unsigned int CParanoid ;
|
||||||
static const unsigned int NoUpdate = (1 << 29);
|
static const unsigned int CheckLowDensity ;
|
||||||
|
static const unsigned int NoUpdate ;
|
||||||
public:
|
public:
|
||||||
inline Flags ( unsigned int flags = NoFlags );
|
inline Flags ( unsigned int flags = NoFlags );
|
||||||
inline Flags ( BaseFlags );
|
inline Flags ( BaseFlags );
|
||||||
|
@ -111,6 +112,13 @@ namespace Anabatic {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline Flags perpandicularTo ( Flags direction )
|
||||||
|
{
|
||||||
|
if (direction & Flags::Horizontal) return Flags::Vertical;
|
||||||
|
if (direction & Flags::Vertical ) return Flags::Horizontal;
|
||||||
|
return Flags::NoFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // Anabatic namespace.
|
} // Anabatic namespace.
|
||||||
|
|
||||||
|
|
|
@ -147,7 +147,7 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline Vertex::~Vertex () { }
|
inline Vertex::~Vertex () { _gcell->setObserver( GCell::Observable::Vertex, NULL ); }
|
||||||
inline Contact* Vertex::hasGContact ( Net* net ) { return _gcell->hasGContact(net); }
|
inline Contact* Vertex::hasGContact ( Net* net ) { return _gcell->hasGContact(net); }
|
||||||
inline unsigned int Vertex::getId () const { return _id; }
|
inline unsigned int Vertex::getId () const { return _id; }
|
||||||
inline GCell* Vertex::getGCell () const { return _gcell; }
|
inline GCell* Vertex::getGCell () const { return _gcell; }
|
||||||
|
@ -293,7 +293,9 @@ namespace Anabatic {
|
||||||
inline bool isBipoint () const;
|
inline bool isBipoint () const;
|
||||||
inline bool isSourceVertex ( Vertex* ) const;
|
inline bool isSourceVertex ( Vertex* ) const;
|
||||||
inline bool isTargetVertex ( Vertex* ) const;
|
inline bool isTargetVertex ( Vertex* ) const;
|
||||||
|
inline DbU::Unit getSearchAreaHalo () const;
|
||||||
inline void setDistance ( distance_t );
|
inline void setDistance ( distance_t );
|
||||||
|
inline void setSearchAreaHalo ( DbU::Unit );
|
||||||
void load ( Net* );
|
void load ( Net* );
|
||||||
void run ( Mode mode=Mode::Standart );
|
void run ( Mode mode=Mode::Standart );
|
||||||
private:
|
private:
|
||||||
|
@ -319,6 +321,7 @@ namespace Anabatic {
|
||||||
VertexSet _sources;
|
VertexSet _sources;
|
||||||
VertexSet _targets;
|
VertexSet _targets;
|
||||||
Box _searchArea;
|
Box _searchArea;
|
||||||
|
DbU::Unit _searchAreaHalo;
|
||||||
int _connectedsId;
|
int _connectedsId;
|
||||||
PriorityQueue _queue;
|
PriorityQueue _queue;
|
||||||
};
|
};
|
||||||
|
@ -330,7 +333,9 @@ namespace Anabatic {
|
||||||
inline bool Dijkstra::isBipoint () const { return _net and (_targets.size()+_sources.size() == 2); }
|
inline bool Dijkstra::isBipoint () const { return _net and (_targets.size()+_sources.size() == 2); }
|
||||||
inline bool Dijkstra::isSourceVertex ( Vertex* v ) const { return (_sources.find(v) != _sources.end()); }
|
inline bool Dijkstra::isSourceVertex ( Vertex* v ) const { return (_sources.find(v) != _sources.end()); }
|
||||||
inline bool Dijkstra::isTargetVertex ( Vertex* v ) const { return (_targets.find(v) != _targets.end()); }
|
inline bool Dijkstra::isTargetVertex ( Vertex* v ) const { return (_targets.find(v) != _targets.end()); }
|
||||||
|
inline DbU::Unit Dijkstra::getSearchAreaHalo () const { return _searchAreaHalo; }
|
||||||
inline void Dijkstra::setDistance ( distance_t cb ) { _distanceCb = cb; }
|
inline void Dijkstra::setDistance ( distance_t cb ) { _distanceCb = cb; }
|
||||||
|
inline void Dijkstra::setSearchAreaHalo ( DbU::Unit halo ) { _searchAreaHalo = halo; }
|
||||||
|
|
||||||
|
|
||||||
} // Anabatic namespace.
|
} // Anabatic namespace.
|
||||||
|
|
|
@ -62,6 +62,7 @@ namespace Anabatic {
|
||||||
inline unsigned int getCapacity () const;
|
inline unsigned int getCapacity () const;
|
||||||
inline unsigned int getRealOccupancy () const;
|
inline unsigned int getRealOccupancy () const;
|
||||||
inline unsigned int getEstimateOccupancy () const;
|
inline unsigned int getEstimateOccupancy () const;
|
||||||
|
inline float getHistoricCost () const;
|
||||||
DbU::Unit getDistance () const;
|
DbU::Unit getDistance () const;
|
||||||
inline GCell* getSource () const;
|
inline GCell* getSource () const;
|
||||||
inline GCell* getTarget () const;
|
inline GCell* getTarget () const;
|
||||||
|
@ -74,9 +75,11 @@ namespace Anabatic {
|
||||||
inline const vector<Segment*>& getSegments () const;
|
inline const vector<Segment*>& getSegments () const;
|
||||||
inline void incCapacity ( int );
|
inline void incCapacity ( int );
|
||||||
void incRealOccupancy ( int );
|
void incRealOccupancy ( int );
|
||||||
|
inline void setHistoricCost ( float );
|
||||||
void add ( Segment* );
|
void add ( Segment* );
|
||||||
void remove ( Segment* );
|
void remove ( Segment* );
|
||||||
void replace ( Segment* orig, Segment* repl );
|
void replace ( Segment* orig, Segment* repl );
|
||||||
|
size_t ripup ();
|
||||||
inline const Flags& flags () const;
|
inline const Flags& flags () const;
|
||||||
inline Flags& flags ();
|
inline Flags& flags ();
|
||||||
inline void revalidate () const;
|
inline void revalidate () const;
|
||||||
|
@ -110,6 +113,7 @@ namespace Anabatic {
|
||||||
unsigned int _capacity;
|
unsigned int _capacity;
|
||||||
unsigned int _realOccupancy;
|
unsigned int _realOccupancy;
|
||||||
float _estimateOccupancy;
|
float _estimateOccupancy;
|
||||||
|
float _historicCost;
|
||||||
GCell* _source;
|
GCell* _source;
|
||||||
GCell* _target;
|
GCell* _target;
|
||||||
DbU::Unit _axis;
|
DbU::Unit _axis;
|
||||||
|
@ -124,11 +128,13 @@ namespace Anabatic {
|
||||||
inline unsigned int Edge::getCapacity () const { return _capacity; }
|
inline unsigned int Edge::getCapacity () const { return _capacity; }
|
||||||
inline unsigned int Edge::getRealOccupancy () const { return _realOccupancy; }
|
inline unsigned int Edge::getRealOccupancy () const { return _realOccupancy; }
|
||||||
inline unsigned int Edge::getEstimateOccupancy () const { return _estimateOccupancy; }
|
inline unsigned int Edge::getEstimateOccupancy () const { return _estimateOccupancy; }
|
||||||
|
inline float Edge::getHistoricCost () const { return _historicCost; }
|
||||||
inline GCell* Edge::getSource () const { return _source; }
|
inline GCell* Edge::getSource () const { return _source; }
|
||||||
inline GCell* Edge::getTarget () const { return _target; }
|
inline GCell* Edge::getTarget () const { return _target; }
|
||||||
inline DbU::Unit Edge::getAxis () const { return _axis; }
|
inline DbU::Unit Edge::getAxis () const { return _axis; }
|
||||||
inline const vector<Segment*>& Edge::getSegments () const { return _segments; }
|
inline const vector<Segment*>& Edge::getSegments () const { return _segments; }
|
||||||
inline void Edge::incCapacity ( int delta ) { _capacity = ((int)_capacity+delta > 0) ? _capacity+delta : 0; }
|
inline void Edge::incCapacity ( int delta ) { _capacity = ((int)_capacity+delta > 0) ? _capacity+delta : 0; }
|
||||||
|
inline void Edge::setHistoricCost ( float hcost ) { _historicCost = hcost; }
|
||||||
inline const Flags& Edge::flags () const { return _flags; }
|
inline const Flags& Edge::flags () const { return _flags; }
|
||||||
inline Flags& Edge::flags () { return _flags; }
|
inline Flags& Edge::flags () { return _flags; }
|
||||||
inline void Edge::revalidate () const { /*if (_flags&Flags::Invalidated)*/ const_cast<Edge*>(this)->_revalidate(); }
|
inline void Edge::revalidate () const { /*if (_flags&Flags::Invalidated)*/ const_cast<Edge*>(this)->_revalidate(); }
|
||||||
|
|
|
@ -164,6 +164,7 @@ namespace Anabatic {
|
||||||
GCell* getEast ( DbU::Unit y ) const;
|
GCell* getEast ( DbU::Unit y ) const;
|
||||||
GCell* getSouth ( DbU::Unit x ) const;
|
GCell* getSouth ( DbU::Unit x ) const;
|
||||||
GCell* getNorth ( DbU::Unit x ) const;
|
GCell* getNorth ( DbU::Unit x ) const;
|
||||||
|
GCell* getNeighborAt ( Flags side, DbU::Unit axis ) const;
|
||||||
GCell* getUnder ( DbU::Unit x, DbU::Unit y ) const;
|
GCell* getUnder ( DbU::Unit x, DbU::Unit y ) const;
|
||||||
inline GCell* getUnder ( Point p ) const;
|
inline GCell* getUnder ( Point p ) const;
|
||||||
GCell* hcut ( DbU::Unit y );
|
GCell* hcut ( DbU::Unit y );
|
||||||
|
@ -215,6 +216,7 @@ namespace Anabatic {
|
||||||
void updateContacts ();
|
void updateContacts ();
|
||||||
size_t updateDensity ();
|
size_t updateDensity ();
|
||||||
inline void updateKey ( size_t depth );
|
inline void updateKey ( size_t depth );
|
||||||
|
void truncDensities ();
|
||||||
bool stepBalance ( size_t depth, Set& invalidateds );
|
bool stepBalance ( size_t depth, Set& invalidateds );
|
||||||
void rpDesaturate ( set<Net*>& );
|
void rpDesaturate ( set<Net*>& );
|
||||||
bool stepDesaturate ( size_t depth
|
bool stepDesaturate ( size_t depth
|
||||||
|
@ -445,6 +447,8 @@ namespace Anabatic {
|
||||||
// Utilities.
|
// Utilities.
|
||||||
|
|
||||||
string getVectorString ( float*, size_t );
|
string getVectorString ( float*, size_t );
|
||||||
|
bool isLess ( const GCell* lhs, const GCell* rhs, Flags direction );
|
||||||
|
bool isGreater ( const GCell* lhs, const GCell* rhs, Flags direction );
|
||||||
|
|
||||||
|
|
||||||
} // Anabatic namespace.
|
} // Anabatic namespace.
|
||||||
|
|
|
@ -110,7 +110,6 @@ namespace Anabatic {
|
||||||
static inline const set<AutoSegment*>& getDestroyeds ();
|
static inline const set<AutoSegment*>& getDestroyeds ();
|
||||||
static inline const vector<AutoSegment*>& getDoglegs ();
|
static inline const vector<AutoSegment*>& getDoglegs ();
|
||||||
static inline const set<Net*>& getNetsModificateds ();
|
static inline const set<Net*>& getNetsModificateds ();
|
||||||
static Session* open ( AnabaticEngine* );
|
|
||||||
static void close ();
|
static void close ();
|
||||||
static void setAnabaticFlags ( unsigned int );
|
static void setAnabaticFlags ( unsigned int );
|
||||||
static inline void dogleg ( AutoSegment* );
|
static inline void dogleg ( AutoSegment* );
|
||||||
|
@ -129,6 +128,7 @@ namespace Anabatic {
|
||||||
static AutoSegment* lookup ( Segment* );
|
static AutoSegment* lookup ( Segment* );
|
||||||
static inline void destroyRequest ( AutoSegment* );
|
static inline void destroyRequest ( AutoSegment* );
|
||||||
// Methods.
|
// Methods.
|
||||||
|
static Session* _open ( AnabaticEngine* );
|
||||||
bool _doDestroyBaseContact ();
|
bool _doDestroyBaseContact ();
|
||||||
bool _doDestroyBaseSegment ();
|
bool _doDestroyBaseSegment ();
|
||||||
bool _doDestroyTool ();
|
bool _doDestroyTool ();
|
||||||
|
@ -141,7 +141,7 @@ namespace Anabatic {
|
||||||
inline void _destroyRequest ( AutoSegment* );
|
inline void _destroyRequest ( AutoSegment* );
|
||||||
void _canonize ();
|
void _canonize ();
|
||||||
void _revalidateTopology ();
|
void _revalidateTopology ();
|
||||||
size_t _revalidate ();
|
virtual size_t _revalidate ();
|
||||||
DbU::Unit _getPitch ( size_t depth, unsigned int flags ) const;
|
DbU::Unit _getPitch ( size_t depth, unsigned int flags ) const;
|
||||||
Record* _getRecord () const;
|
Record* _getRecord () const;
|
||||||
string _getString () const;
|
string _getString () const;
|
||||||
|
|
|
@ -20,6 +20,7 @@ projects = [
|
||||||
#, "metis"
|
#, "metis"
|
||||||
#, "mauka"
|
#, "mauka"
|
||||||
, "anabatic"
|
, "anabatic"
|
||||||
|
, "katana"
|
||||||
, "knik"
|
, "knik"
|
||||||
, "katabatic"
|
, "katabatic"
|
||||||
, "kite"
|
, "kite"
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import optparse
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
cppPattern = re.compile( r".*\.(h|cpp)$" )
|
||||||
|
refactorPattern = re.compile( r"^\s*(?P<orig>[^\s]*)\s*-->\s*(?P<replace>[^\s]*)\s*$" )
|
||||||
|
|
||||||
|
|
||||||
|
class Refactor:
|
||||||
|
|
||||||
|
def __init__ ( self ):
|
||||||
|
self._substitutions = []
|
||||||
|
return
|
||||||
|
|
||||||
|
def _addRefactor ( self, original, replacement ):
|
||||||
|
self._substitutions.append( ( re.compile(original), replacement ) )
|
||||||
|
return
|
||||||
|
|
||||||
|
def doLineRefactor ( self, line ):
|
||||||
|
pline = line
|
||||||
|
for (original,replacement) in self._substitutions:
|
||||||
|
pline = original.sub( replacement, pline )
|
||||||
|
return pline
|
||||||
|
|
||||||
|
def doFileRefactor ( self, file ):
|
||||||
|
oldFile = file + '.noRefactor'
|
||||||
|
if not os.path.isfile(oldFile):
|
||||||
|
os.rename( file, oldFile )
|
||||||
|
|
||||||
|
fdold = open( oldFile, 'r' )
|
||||||
|
fdnew = open( file , 'w' )
|
||||||
|
|
||||||
|
while True:
|
||||||
|
oldline = fdold.readline()
|
||||||
|
if oldline == '': break
|
||||||
|
|
||||||
|
newline = self.doLineRefactor( oldline )
|
||||||
|
fdnew.write( newline )
|
||||||
|
|
||||||
|
fdnew.close()
|
||||||
|
fdold.close()
|
||||||
|
return
|
||||||
|
|
||||||
|
def loadPatterns ( self, file ):
|
||||||
|
fd = open( file, "r" )
|
||||||
|
if fd:
|
||||||
|
while True:
|
||||||
|
line = fd.readline()
|
||||||
|
if line == "" : break
|
||||||
|
if line[0] == '#' : continue
|
||||||
|
if line[0] == '\n': continue
|
||||||
|
|
||||||
|
m = refactorPattern.match( line )
|
||||||
|
if m:
|
||||||
|
print "o:\"%s\" r:\"%s\"" % ( m.group("orig"), m.group("replace") )
|
||||||
|
self._addRefactor( m.group("orig"), m.group("replace") )
|
||||||
|
fd.close ()
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__' :
|
||||||
|
|
||||||
|
parser = optparse.OptionParser ()
|
||||||
|
parser.add_option( '-t', '--tree' , action='store' , type='string', dest='tree' )
|
||||||
|
parser.add_option( '-p', '--patterns', action='store' , type='string', dest='patterns' )
|
||||||
|
parser.add_option( '-f', '--file' , action='append', type='string', dest='files' )
|
||||||
|
|
||||||
|
(options, args) = parser.parse_args()
|
||||||
|
|
||||||
|
if not options.patterns and not options.files: sys.exit( 1 )
|
||||||
|
|
||||||
|
refactor = Refactor()
|
||||||
|
refactor.loadPatterns( options.patterns )
|
||||||
|
|
||||||
|
rfiles = []
|
||||||
|
if options.patterns:
|
||||||
|
if options.tree:
|
||||||
|
for (root,dirs,tfiles) in os.walk(options.tree):
|
||||||
|
if 'CVS' in dirs: dirs.remove( 'CVS' )
|
||||||
|
if '.svn' in dirs: dirs.remove( '.svn' )
|
||||||
|
for file in tfiles:
|
||||||
|
if cppPattern.match( file ):
|
||||||
|
rfiles.append( os.path.join(root,file) )
|
||||||
|
|
||||||
|
allFiles = []
|
||||||
|
if options.files: allFiles += options.files
|
||||||
|
allFiles += rfiles
|
||||||
|
|
||||||
|
for file in allFiles:
|
||||||
|
print file
|
||||||
|
refactor.doFileRefactor( file )
|
||||||
|
|
||||||
|
sys.exit( 0 )
|
|
@ -398,7 +398,8 @@ class Report ( object ):
|
||||||
for attachement in self.attachements:
|
for attachement in self.attachements:
|
||||||
self.message.attach( attachement )
|
self.message.attach( attachement )
|
||||||
|
|
||||||
print "Sending mail report to <%s>" % self.conf.receivers
|
print "Sending mail report to:"
|
||||||
|
for receiver in self.conf.receivers: print ' <%s>' % receiver
|
||||||
session = smtplib.SMTP( 'localhost' )
|
session = smtplib.SMTP( 'localhost' )
|
||||||
session.sendmail( self.conf.sender, self.conf.receivers, self.message.as_string() )
|
session.sendmail( self.conf.sender, self.conf.receivers, self.message.as_string() )
|
||||||
session.quit()
|
session.quit()
|
||||||
|
@ -434,6 +435,9 @@ try:
|
||||||
if options.rmSource or options.rmAll: conf.rmSource = True
|
if options.rmSource or options.rmAll: conf.rmSource = True
|
||||||
if options.rmBuild or options.rmAll: conf.rmBuild = True
|
if options.rmBuild or options.rmAll: conf.rmBuild = True
|
||||||
|
|
||||||
|
if conf.doBuild: conf.openLog( 'build' )
|
||||||
|
if conf.doBenchs: conf.openLog( 'benchs' )
|
||||||
|
|
||||||
gitSupports = []
|
gitSupports = []
|
||||||
for supportRepo in conf.supportRepos:
|
for supportRepo in conf.supportRepos:
|
||||||
gitSupports.append( GitRepository( supportRepo, conf.srcDir+'/support' ) )
|
gitSupports.append( GitRepository( supportRepo, conf.srcDir+'/support' ) )
|
||||||
|
@ -472,9 +476,6 @@ try:
|
||||||
, ' <%s>' % ccbBin
|
, ' <%s>' % ccbBin
|
||||||
] )
|
] )
|
||||||
|
|
||||||
if conf.doBuild: conf.openLog( 'build' )
|
|
||||||
if conf.doBenchs: conf.openLog( 'benchs' )
|
|
||||||
|
|
||||||
buildCommand = '%s --root=%s --project=support --project=coriolis --project=chams --make="-j%%d install" %%s' \
|
buildCommand = '%s --root=%s --project=support --project=coriolis --project=chams --make="-j%%d install" %%s' \
|
||||||
% (ccbBin,conf.rootDir)
|
% (ccbBin,conf.rootDir)
|
||||||
benchsCommand = 'cd %s/benchs && ./bin/go.sh clean && ./bin/go.sh lvx' \
|
benchsCommand = 'cd %s/benchs && ./bin/go.sh clean && ./bin/go.sh lvx' \
|
||||||
|
|
|
@ -55,8 +55,13 @@ namespace CRL {
|
||||||
//_view->resizeColumnToContents ( 1 );
|
//_view->resizeColumnToContents ( 1 );
|
||||||
|
|
||||||
QHeaderView* horizontalHeader = _view->horizontalHeader();
|
QHeaderView* horizontalHeader = _view->horizontalHeader();
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
|
||||||
|
horizontalHeader->setSectionResizeMode ( 0, QHeaderView::Stretch );
|
||||||
|
horizontalHeader->setSectionResizeMode ( 1, QHeaderView::ResizeToContents );
|
||||||
|
#else
|
||||||
horizontalHeader->setResizeMode ( 0, QHeaderView::Stretch );
|
horizontalHeader->setResizeMode ( 0, QHeaderView::Stretch );
|
||||||
horizontalHeader->setResizeMode ( 1, QHeaderView::ResizeToContents );
|
horizontalHeader->setResizeMode ( 1, QHeaderView::ResizeToContents );
|
||||||
|
#endif
|
||||||
//horizontalHeader->setStretchLastSection( false );
|
//horizontalHeader->setStretchLastSection( false );
|
||||||
|
|
||||||
QHeaderView* verticalHeader = _view->verticalHeader();
|
QHeaderView* verticalHeader = _view->verticalHeader();
|
||||||
|
|
|
@ -2230,42 +2230,41 @@ endobj
|
||||||
482 0 obj
|
482 0 obj
|
||||||
<</Subtype/Type1C/Filter/FlateDecode/Length 5628>>
|
<</Subtype/Type1C/Filter/FlateDecode/Length 5628>>
|
||||||
stream
|
stream
|
||||||
xз╜XwXUW╤?х=E╪х∙╚─┼4%┬hh!T@:JS░"╫╠▀-&ov&cЛ!┼─lXPЯb└hT▄█⌠дcT┬q²{в┘ВЖ╧и╪ВfФЩЯ╬Ы├o÷С]ны{М╣жчКВШМёгхd▄···qL``ЮЭ▌аyи9А 9┘рЁ─1┐ы'v√└ЭВ▐║Э─Fш╕4╗T
|
xÚXwXUW¶?È=E¼È•«€Š4%ˆhh!D@¤*MAŠô^Ä.¶˜¼Ù™Œ±‡(°aA@Å‹¢Q1V4NKŒQ!Æuî]ÞÛç&óÞ›™÷Çûæ¾}Îw9gïµ×Z{¯ßï·<C3AF>#“1zzzÆAA¾ÑŽÁyÉ9á 9…Ò³À1ƒÙ'v–„ü÷<C3BC>¡ü€FÛ¦4¨T
|
||||||
┴╛hа┬J=qТ q╢╬(≈█f╫E&Тнэ0▓Нg▄╔╩9╫█╡нХКИ╠сЩ&;MvЖIOM/J_≥╪дjIBQ┌URnч┼┌Тт╢"+╩${+Гин⌠ХmРD╚╧╧╧╘YиVЁrРr┼рss°$О╛tН1zC8FЮG
цXСф23qLSMgДf03└йc#ф≤╠`■лhф▓к▄cф36лф√╠cЛGf"3┴qbчc°≥и▄3┘qe╕2с≤В7ф²Я`<≥ИлLfЦцлfФ0s_ф▐ЯgФ1L д3!L(ф└3С≥LиD1яLЁ░Yлт0ъ0k≤9┐=f°·╔ч2╫К┐r6(~пНAGТКGК/въ╔K√*Ш┴
gьO93Н}╝░╚ЮNpЩ╪7ЪH≤"<6ЬюЮГаЗ┐ёЪyПю░)C╒├╛B├зmf;Л■А├К█Ж╫5~ъx©Яф}&╚M╝▐чk╨ыТР┬ЛГЕ╕Р╧РСР╥fаfyf╥мyscs/╔Л*,P╡Mr╔ф_Щ░ЧЮШ≈*5гДJыSУ0%▌Б
∙ЛяE)ш&'Ж6╜m╗=Вe╧Dн╛╙о<▓╠'│D▒Ы+cр2Б┐c╖F┤v$╤·,<Qr┼°Ю╫│CР╘dNeД≥╗сЫWх=р╢УXИ▒р#╣5у5┤ш▌~{ZТсz≥[▐GEN%┌v|&'hrлА│о=░╔а8Р <-М╘И╘yпrЪ&БsXаa°zЗЙ:▄?
А
|
‰¬hÁˆJ=qô q´¾(—<>f½E&ôÎÜ0’îgŒ¥»9½<39>²Îèëé±Óý';MvöIOM/J_™¼ÄjIBQ‚URnÞŠ‚ôÔ´"+»${+çÉΓèmòD«9¹¹©YÉV³ròrŠÒssœ$ï¬tî1zC8FàG
ÃXóÆ23qLSMgäf03„Êc#Ƙ±`”ÌhÆ’ËŒcÆ36ÌÆ–±cìGf"3‰qbÞcœ™ÉŒ3…qe¦2Ó˜÷7Æ<37>ñ`<™éÌLfãÃÌf|™9ŒãÏ0s™@fÄ3!L(Æ„3ó™LÉD1ÑL³<>YÌÔ0ß0kßAŒ3NÏRo™ÞõAƒ9
|
||||||
ТБVШ-*
|
?h÷ #úƒõ£õ—ëïÒ¿%K•ýĆ³ì§œ÷>WÈUp'¸~Þ›$L|`ðó`ýÁQƒÿ<x`È”!QCV!Cm†6³vÊðÃõF{<7B>Þ¿o¼ßøã>“Õ&W‡Gï5ÝlzyDöˆórSùùyù[³`³<³Ûæ¼¹±¹—Rv(Ù&¹R ~HðýK•šcr¥ì©z˜Gñ†JöŽè¢”m““{›ŽÖ6Ôžû²ƒ\"gVÕgÉØ“@¢Èü•1é ñÁ±S£C;[
|
||||||
_:?;&%QК(Z≤©╫rШ╚с_²╬\y∙э$╞╡Н╤^°V┘AБ°КН·Я╠%и÷╖ЛJш∙ЖeЗ╬║<ЦХбK8t╝⌡О"ъXъ╒┴╚`(Ж=Uтё≥ЯЩVt╓М6*~AV |