Dijkstra and Net can manage different wire width.
in Dijkstra.cpp/.h, Edge.cpp/.h, GCell.cpp/.h: *Change: GlobalRouting wires can have different wires' width. One Net's wires has one width only. in NetRoutingProperty.cpp/.h, PyNetRoutingProperty.cpp/.h: *New: A wire width parameter is added. It can be set through python script.
This commit is contained in:
parent
8a73b03fd8
commit
e1724ca785
|
@ -231,7 +231,7 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Vertex::isRestricted ( const Vertex* v1, const Vertex* v2, DbU::Unit hpitch, DbU::Unit vpitch )
|
bool Vertex::isRestricted ( const Vertex* v1, const Vertex* v2, const Edge* e, DbU::Unit hpitch, DbU::Unit vpitch, Net* net )
|
||||||
{
|
{
|
||||||
bool restricted = true;
|
bool restricted = true;
|
||||||
GCell* c1 = v1->getGCell();
|
GCell* c1 = v1->getGCell();
|
||||||
|
@ -274,7 +274,12 @@ namespace Anabatic {
|
||||||
||(c2->getHeight() < vpitch)
|
||(c2->getHeight() < vpitch)
|
||||||
||(restricted)
|
||(restricted)
|
||||||
) return true;
|
) return true;
|
||||||
else return false;
|
else {
|
||||||
|
if ((v2->getGCell()->isStrut())){
|
||||||
|
if (e->isMaxCapacity(net)) return true;
|
||||||
|
else return false;
|
||||||
|
} else return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1160,8 +1165,8 @@ namespace Anabatic {
|
||||||
|
|
||||||
DbU::Unit Dijkstra::_distance ( const Vertex* current, const Vertex* vneighbour, const Edge* e )
|
DbU::Unit Dijkstra::_distance ( const Vertex* current, const Vertex* vneighbour, const Edge* e )
|
||||||
{
|
{
|
||||||
if (Vertex::isRestricted(current, vneighbour)) return Vertex::unreachable;
|
if (Vertex::isRestricted(current, vneighbour, e)) return Vertex::unreachable;
|
||||||
else return current->getDistance() + e->getDistance();
|
else return current->getDistance() + e->getDistance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1526,7 +1531,7 @@ namespace Anabatic {
|
||||||
Vertex* current = _queue.top();
|
Vertex* current = _queue.top();
|
||||||
GCell* gcurrent = current->getGCell();
|
GCell* gcurrent = current->getGCell();
|
||||||
|
|
||||||
cdebug_log(111,1) << "Current:" << current << endl;
|
//cdebug_log(111,1) << "Current:" << current << endl;
|
||||||
_queue.pop();
|
_queue.pop();
|
||||||
|
|
||||||
if ( current->isAxisTarget() and needAxisTarget()) unsetFlags(Mode::AxisTarget);
|
if ( current->isAxisTarget() and needAxisTarget()) unsetFlags(Mode::AxisTarget);
|
||||||
|
@ -1534,6 +1539,7 @@ namespace Anabatic {
|
||||||
cdebug_log(111,1) << "Looking for neighbors:" << endl;
|
cdebug_log(111,1) << "Looking for neighbors:" << endl;
|
||||||
|
|
||||||
for ( Edge* edge : current->getGCell()->getEdges() ) {
|
for ( Edge* edge : current->getGCell()->getEdges() ) {
|
||||||
|
cdebug_log(111,0) << "[Current]: " << current << endl;
|
||||||
cdebug_log(111,0) << "@ Edge " << edge << endl;
|
cdebug_log(111,0) << "@ Edge " << edge << endl;
|
||||||
|
|
||||||
if (edge == current->getFrom()) {
|
if (edge == current->getFrom()) {
|
||||||
|
@ -1565,7 +1571,7 @@ namespace Anabatic {
|
||||||
cdebug_tabw(111,1);
|
cdebug_tabw(111,1);
|
||||||
if (current->getFrom()) {
|
if (current->getFrom()) {
|
||||||
cdebug_log(111,0) << "| From: " << current->getFrom()->getOpposite(gcurrent) << endl;
|
cdebug_log(111,0) << "| From: " << current->getFrom()->getOpposite(gcurrent) << endl;
|
||||||
current->getIntervFrom().print();
|
//current->getIntervFrom().print();
|
||||||
}
|
}
|
||||||
if (current->getFrom2()) {
|
if (current->getFrom2()) {
|
||||||
cdebug_log(111,0) << "| From2: " << current->getFrom2()->getOpposite(gcurrent) << endl;
|
cdebug_log(111,0) << "| From2: " << current->getFrom2()->getOpposite(gcurrent) << endl;
|
||||||
|
@ -1582,7 +1588,10 @@ namespace Anabatic {
|
||||||
bool isDistance2shorter = _isDistance2Shorter ( distance, current, vneighbor, edge ); // ANALOG
|
bool isDistance2shorter = _isDistance2Shorter ( distance, current, vneighbor, edge ); // ANALOG
|
||||||
|
|
||||||
if ( (distance == vneighbor->getDistance())
|
if ( (distance == vneighbor->getDistance())
|
||||||
and ( (not gcurrent->isMatrix()) and (not gneighbor->isMatrix()) ) ) {
|
and (not gcurrent->isMatrix() )
|
||||||
|
and (not gneighbor->isMatrix())
|
||||||
|
and (vneighbor->getFrom2() == NULL)
|
||||||
|
) {
|
||||||
_pushEqualDistance( distance, isDistance2shorter, current, vneighbor, edge ); // ANALOG
|
_pushEqualDistance( distance, isDistance2shorter, current, vneighbor, edge ); // ANALOG
|
||||||
} else
|
} else
|
||||||
if ( (distance < vneighbor->getDistance()) and (distance != Vertex::unreachable) ) {
|
if ( (distance < vneighbor->getDistance()) and (distance != Vertex::unreachable) ) {
|
||||||
|
@ -1602,7 +1611,9 @@ namespace Anabatic {
|
||||||
|
|
||||||
vneighbor->setBranchId( current->getBranchId() );
|
vneighbor->setBranchId( current->getBranchId() );
|
||||||
vneighbor->setDistance( distance );
|
vneighbor->setDistance( distance );
|
||||||
|
cdebug_log(111,0) << "setFrom1: " << vneighbor << endl;
|
||||||
vneighbor->setFrom ( edge );
|
vneighbor->setFrom ( edge );
|
||||||
|
vneighbor->setFrom2( NULL );
|
||||||
_queue.push( vneighbor );
|
_queue.push( vneighbor );
|
||||||
cdebug_log(111,0) << "Push: (size:" << _queue.size() << ") " << vneighbor << endl;
|
cdebug_log(111,0) << "Push: (size:" << _queue.size() << ") " << vneighbor << endl;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1661,6 +1672,8 @@ namespace Anabatic {
|
||||||
while ( current ) {
|
while ( current ) {
|
||||||
cdebug_log(112,0) << endl;
|
cdebug_log(112,0) << endl;
|
||||||
cdebug_log(112,0) << "| " << current << " | " << endl;
|
cdebug_log(112,0) << "| " << current << " | " << endl;
|
||||||
|
if (current->getFrom()) cdebug_log(112,0) << " | From :" << current->getFrom()->getOpposite(current->getGCell()) << " | " << endl;
|
||||||
|
if (current->getFrom2()) cdebug_log(112,0) << " | From2:" << current->getFrom2()->getOpposite(current->getGCell()) << " | " << endl;
|
||||||
|
|
||||||
if (!current->getGCell()->isMatrix()){
|
if (!current->getGCell()->isMatrix()){
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////// ANALOG
|
//////////////////////////////////////////////////////////////////////////////////////////// ANALOG
|
||||||
|
@ -1773,7 +1786,7 @@ namespace Anabatic {
|
||||||
, targetContact
|
, targetContact
|
||||||
, _anabatic->getConfiguration()->getGHorizontalLayer()
|
, _anabatic->getConfiguration()->getGHorizontalLayer()
|
||||||
, constraint.getCenter()
|
, constraint.getCenter()
|
||||||
, DbU::fromLambda(2.0)
|
, state->getWPitch()*Session::getPitch(Hurricane::DataBase::getDB()->getTechnology()->getLayer("METAL2"))//DbU::fromLambda(2.0)
|
||||||
);
|
);
|
||||||
for ( Edge* through : aligneds ) through->add( segment );
|
for ( Edge* through : aligneds ) through->add( segment );
|
||||||
if (state){
|
if (state){
|
||||||
|
@ -1787,7 +1800,7 @@ namespace Anabatic {
|
||||||
, targetContact
|
, targetContact
|
||||||
, _anabatic->getConfiguration()->getGVerticalLayer()
|
, _anabatic->getConfiguration()->getGVerticalLayer()
|
||||||
, constraint.getCenter()
|
, constraint.getCenter()
|
||||||
, DbU::fromLambda(2.0)
|
, state->getWPitch()*Session::getPitch(Hurricane::DataBase::getDB()->getTechnology()->getLayer("METAL3"))//DbU::fromLambda(2.0)
|
||||||
);
|
);
|
||||||
for ( Edge* through : aligneds ) through->add( segment );
|
for ( Edge* through : aligneds ) through->add( segment );
|
||||||
if (state){
|
if (state){
|
||||||
|
@ -1995,7 +2008,7 @@ namespace Anabatic {
|
||||||
, targetSym
|
, targetSym
|
||||||
, _anabatic->getConfiguration()->getGHorizontalLayer()
|
, _anabatic->getConfiguration()->getGHorizontalLayer()
|
||||||
, axis
|
, axis
|
||||||
, DbU::fromLambda(2.0)
|
, state->getWPitch()*Session::getPitch(Hurricane::DataBase::getDB()->getTechnology()->getLayer("METAL2"))
|
||||||
);
|
);
|
||||||
cdebug_log(112,0) << "|| " << segment2 << endl;
|
cdebug_log(112,0) << "|| " << segment2 << endl;
|
||||||
} else if (v) {
|
} else if (v) {
|
||||||
|
@ -2034,7 +2047,7 @@ namespace Anabatic {
|
||||||
, targetSym
|
, targetSym
|
||||||
, _anabatic->getConfiguration()->getGVerticalLayer()
|
, _anabatic->getConfiguration()->getGVerticalLayer()
|
||||||
, axis
|
, axis
|
||||||
, DbU::fromLambda(2.0)
|
, state->getWPitch()*Session::getPitch(Hurricane::DataBase::getDB()->getTechnology()->getLayer("METAL3"))
|
||||||
);
|
);
|
||||||
cdebug_log(112,0) << "|| " << segment2 << endl;
|
cdebug_log(112,0) << "|| " << segment2 << endl;
|
||||||
}
|
}
|
||||||
|
@ -2115,15 +2128,15 @@ namespace Anabatic {
|
||||||
void Dijkstra::_pushEqualDistance ( DbU::Unit distance, bool isDistance2shorter, Vertex* current, Vertex* vneighbor, Edge* edge )
|
void Dijkstra::_pushEqualDistance ( DbU::Unit distance, bool isDistance2shorter, Vertex* current, Vertex* vneighbor, Edge* edge )
|
||||||
{
|
{
|
||||||
GCell* gneighbor = edge->getOpposite(current->getGCell());
|
GCell* gneighbor = edge->getOpposite(current->getGCell());
|
||||||
cdebug_log(111,0) << "[case: Distance EQUAL + SameSide]" << endl;
|
|
||||||
cdebug_log(111,0) << "Previous getfrom:" << vneighbor->getFrom()->getOpposite( gneighbor ) << endl;
|
|
||||||
|
|
||||||
GCell* gnext = vneighbor->getGCell();
|
GCell* gnext = vneighbor->getGCell();
|
||||||
GCell* gprev = vneighbor->getFrom()->getOpposite(gnext);
|
GCell* gprev = vneighbor->getFrom()->getOpposite(gnext);
|
||||||
Vertex* vprev = gprev->getObserver<Vertex>(GCell::Observable::Vertex);
|
Vertex* vprev = gprev->getObserver<Vertex>(GCell::Observable::Vertex);
|
||||||
|
|
||||||
if ((distance == vneighbor->getDistance()) and vneighbor->areSameSide(vprev, current)){
|
if ((distance == vneighbor->getDistance()) and vneighbor->areSameSide(vprev, current)){
|
||||||
|
cdebug_log(111,0) << "[case: Distance EQUAL + SameSide]" << endl;
|
||||||
|
cdebug_log(111,0) << "Previous getfrom:" << vneighbor->getFrom()->getOpposite( gneighbor ) << endl;
|
||||||
cdebug_log(111,0) << "[case: Other GetFROM]" << endl;
|
cdebug_log(111,0) << "[case: Other GetFROM]" << endl;
|
||||||
|
cdebug_log(111,0) << "setFrom2: " << vneighbor << endl;
|
||||||
vneighbor->setFrom2 ( edge );
|
vneighbor->setFrom2 ( edge );
|
||||||
vneighbor->setFlags(Vertex::From2Mode);
|
vneighbor->setFlags(Vertex::From2Mode);
|
||||||
//vneighbor->createIntervFrom2();
|
//vneighbor->createIntervFrom2();
|
||||||
|
@ -2131,9 +2144,11 @@ namespace Anabatic {
|
||||||
vneighbor->unsetFlags(Vertex::From2Mode);
|
vneighbor->unsetFlags(Vertex::From2Mode);
|
||||||
if (isDistance2shorter) {
|
if (isDistance2shorter) {
|
||||||
vneighbor->setFlags(Vertex::UseFromFrom2);
|
vneighbor->setFlags(Vertex::UseFromFrom2);
|
||||||
cdebug_log(111,0) << "setFromFrom2: " << vneighbor << endl;
|
//cdebug_log(111,0) << "setFromFrom2: " << vneighbor << endl;
|
||||||
}
|
}
|
||||||
cdebug_log(111,0) << "Push BIS : " << vneighbor << endl;
|
cdebug_log(111,0) << "Push BIS : " << vneighbor << endl;
|
||||||
|
cdebug_log(111,0) << "From1: " << vneighbor->getFrom()->getOpposite(vneighbor->getGCell()) << endl;
|
||||||
|
cdebug_log(111,0) << "From2: " << vneighbor->getFrom2()->getOpposite(vneighbor->getGCell()) << endl;
|
||||||
vneighbor->getIntervFrom().print();
|
vneighbor->getIntervFrom().print();
|
||||||
vneighbor->getIntervFrom2().print();
|
vneighbor->getIntervFrom2().print();
|
||||||
}
|
}
|
||||||
|
@ -2143,12 +2158,12 @@ namespace Anabatic {
|
||||||
void Dijkstra::_updateGRAData ( Vertex* vneighbor, bool isDistance2shorter, Vertex* current )
|
void Dijkstra::_updateGRAData ( Vertex* vneighbor, bool isDistance2shorter, Vertex* current )
|
||||||
{
|
{
|
||||||
vneighbor->unsetFlags(Vertex::UseFromFrom2);
|
vneighbor->unsetFlags(Vertex::UseFromFrom2);
|
||||||
cdebug_log(111,0) << "unsetFromFrom2: " << vneighbor << endl;
|
//cdebug_log(111,0) << "unsetFromFrom2: " << vneighbor << endl;
|
||||||
vneighbor->clearFrom2();
|
vneighbor->clearFrom2();
|
||||||
if (isDistance2shorter) {
|
if (isDistance2shorter) {
|
||||||
vneighbor->setFlags(Vertex::UseFromFrom2);
|
vneighbor->setFlags(Vertex::UseFromFrom2);
|
||||||
cdebug_log(111,0) << "setFromFrom2: " << vneighbor << endl;
|
//cdebug_log(111,0) << "setFromFrom2: " << vneighbor << endl;
|
||||||
} else cdebug_log(111,0) << "DON'T setFromFrom2: " << vneighbor << endl;
|
}// else cdebug_log(111,0) << "setFrom1: " << vneighbor << endl;
|
||||||
|
|
||||||
vneighbor->setIntervals( current );
|
vneighbor->setIntervals( current );
|
||||||
vneighbor->getIntervFrom().print();
|
vneighbor->getIntervFrom().print();
|
||||||
|
@ -2204,7 +2219,7 @@ namespace Anabatic {
|
||||||
if (current->getConnexId() == _connectedsId) return true;
|
if (current->getConnexId() == _connectedsId) return true;
|
||||||
from = NULL;
|
from = NULL;
|
||||||
if (useFrom2) {
|
if (useFrom2) {
|
||||||
cdebug_log(112,0) << "USE FROM2: " << current->getFrom2() << endl;
|
cdebug_log(112,0) << "USE FROM2: " << current->getFrom2()->getOpposite(current->getGCell()) << endl;
|
||||||
current->setFrom(current->getFrom2());
|
current->setFrom(current->getFrom2());
|
||||||
current->setIntervfrom(current->getPIMin2(), current->getPIMax2(), current->getPIAxis2());
|
current->setIntervfrom(current->getPIMin2(), current->getPIMax2(), current->getPIAxis2());
|
||||||
current->clearFrom2();
|
current->clearFrom2();
|
||||||
|
@ -2226,6 +2241,7 @@ namespace Anabatic {
|
||||||
cdebug_log(112,0) << ", axis: " << DbU::getValueString(current->getPIAxis()) << endl;
|
cdebug_log(112,0) << ", axis: " << DbU::getValueString(current->getPIAxis()) << endl;
|
||||||
current->getPredecessor()->setInterv(current->getPIMin(), current->getPIMax(), current->getPIAxis());
|
current->getPredecessor()->setInterv(current->getPIMin(), current->getPIMax(), current->getPIAxis());
|
||||||
current->getIntervFrom().print();
|
current->getIntervFrom().print();
|
||||||
|
//if (current->getPredecessor()->getGCell()->isStrut()) _updateRealOccupancy( current );
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -2298,6 +2314,22 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Dijkstra::_updateRealOccupancy ( Vertex* current )
|
||||||
|
{
|
||||||
|
cerr << "void Dijkstra::_updateRealOccupancy ( Vertex* current ): " << current << endl;
|
||||||
|
GCell* gcurrent = current->getGCell();
|
||||||
|
GCell* gnext = current->getPredecessor()->getGCell();
|
||||||
|
Edge* e = gcurrent->getEdgeTo(gnext);
|
||||||
|
|
||||||
|
NetRoutingState* state = NetRoutingExtension::get( _net );
|
||||||
|
cerr << "e: " << e << endl;
|
||||||
|
e->incRealOccupancy2(state->getWPitch());
|
||||||
|
cerr << "e: " << e << endl;
|
||||||
|
if (current->getGCell()->getWestEdge()) cerr << "W occupancy: " << current->getGCell()->getWestEdge()->getRealOccupancy() << "/" << current->getGCell()->getWestEdge()->getCapacity() << endl;
|
||||||
|
if (current->getGCell()->getEastEdge()) cerr << "E occupancy: " << current->getGCell()->getEastEdge()->getRealOccupancy() << "/" << current->getGCell()->getEastEdge()->getCapacity() << endl;
|
||||||
|
if (current->getGCell()->getNorthEdge()) cerr << "N occupancy: " << current->getGCell()->getNorthEdge()->getRealOccupancy() << "/" << current->getGCell()->getNorthEdge()->getCapacity() << endl;
|
||||||
|
if (current->getGCell()->getSouthEdge()) cerr << "S occupancy: " << current->getGCell()->getSouthEdge()->getRealOccupancy() << "/" << current->getGCell()->getSouthEdge()->getCapacity() << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // Anabatic namespace.
|
} // Anabatic namespace.
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "hurricane/Error.h"
|
#include "hurricane/Error.h"
|
||||||
#include "hurricane/Segment.h"
|
#include "hurricane/Segment.h"
|
||||||
|
#include "hurricane/DataBase.h"
|
||||||
|
#include "hurricane/Technology.h"
|
||||||
#include "anabatic/Edge.h"
|
#include "anabatic/Edge.h"
|
||||||
#include "anabatic/GCell.h"
|
#include "anabatic/GCell.h"
|
||||||
#include "anabatic/AnabaticEngine.h"
|
#include "anabatic/AnabaticEngine.h"
|
||||||
|
@ -182,6 +184,10 @@ namespace Anabatic {
|
||||||
_realOccupancy = occupancy;
|
_realOccupancy = occupancy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Edge::incRealOccupancy2 ( int value )
|
||||||
|
{
|
||||||
|
_realOccupancy += value;
|
||||||
|
}
|
||||||
|
|
||||||
Segment* Edge::getSegment ( const Net* owner ) const
|
Segment* Edge::getSegment ( const Net* owner ) const
|
||||||
{
|
{
|
||||||
|
@ -195,7 +201,13 @@ namespace Anabatic {
|
||||||
void Edge::add ( Segment* segment )
|
void Edge::add ( Segment* segment )
|
||||||
{
|
{
|
||||||
_segments.push_back( segment );
|
_segments.push_back( segment );
|
||||||
incRealOccupancy( 1 ); // Need to take the wire width into account.
|
Horizontal* h = dynamic_cast<Horizontal*>(segment);
|
||||||
|
Vertical* v = dynamic_cast<Vertical*>(segment);
|
||||||
|
DbU::Unit pitch = 0;
|
||||||
|
if (h) pitch = Session::getPitch(Hurricane::DataBase::getDB()->getTechnology()->getLayer("METAL2"));
|
||||||
|
if (v) pitch = Session::getPitch(Hurricane::DataBase::getDB()->getTechnology()->getLayer("METAL3"));
|
||||||
|
|
||||||
|
incRealOccupancy( segment->getWidth()/pitch ); // Need to take the wire width into account.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -300,6 +312,20 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Edge::isMaxCapacity ( Net* net ) const
|
||||||
|
{
|
||||||
|
if (net){
|
||||||
|
Hurricane::NetRoutingState* state = Hurricane::NetRoutingExtension::get( net );
|
||||||
|
//cerr << "bool Edge::isMaxCapacity ( Net* net ) const: " << net << endl;
|
||||||
|
//cerr << "WPitch: " << state->getWPitch() << endl;
|
||||||
|
|
||||||
|
return ( (_realOccupancy +state->getWPitch()) > _capacity ) ? true : false;
|
||||||
|
} else {
|
||||||
|
return ( _realOccupancy >= _capacity ) ? true : false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Edge::translate ( const DbU::Unit&, const DbU::Unit& )
|
void Edge::translate ( const DbU::Unit&, const DbU::Unit& )
|
||||||
{
|
{
|
||||||
cerr << Error( "Edge::translate(): On %s,\n"
|
cerr << Error( "Edge::translate(): On %s,\n"
|
||||||
|
|
|
@ -1665,6 +1665,20 @@ namespace Anabatic {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GCell::setEdgesOccupancy ( unsigned int width, unsigned int height )
|
||||||
|
{
|
||||||
|
getEastEdge()->setCapacity(width);
|
||||||
|
getWestEdge()->setCapacity(width);
|
||||||
|
getNorthEdge()->setCapacity(height);
|
||||||
|
getSouthEdge()->setCapacity(height);
|
||||||
|
getEastEdge()->setRealOccupancy(0);
|
||||||
|
getWestEdge()->setRealOccupancy(0);
|
||||||
|
getNorthEdge()->setRealOccupancy(0);
|
||||||
|
getSouthEdge()->setRealOccupancy(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
string GCell::_getTypeName () const
|
string GCell::_getTypeName () const
|
||||||
{ return getString(_extensionName); }
|
{ return getString(_extensionName); }
|
||||||
|
|
||||||
|
|
|
@ -244,7 +244,7 @@ namespace Anabatic {
|
||||||
bool hasRP ( Net* ) const;
|
bool hasRP ( Net* ) const;
|
||||||
bool hasVRP ( Net* ) const;
|
bool hasVRP ( Net* ) const;
|
||||||
bool hasHRP ( Net* ) const;
|
bool hasHRP ( Net* ) const;
|
||||||
static bool isRestricted ( const Vertex* v1, const Vertex* v2, DbU::Unit hpitch = 0, DbU::Unit vpitch = 0);
|
static bool isRestricted ( const Vertex* v1, const Vertex* v2, const Edge* e, DbU::Unit hpitch = 0, DbU::Unit vpitch = 0, Net* net = NULL);
|
||||||
bool areSameSide ( const Vertex*, const Vertex* ) const;
|
bool areSameSide ( const Vertex*, const Vertex* ) const;
|
||||||
|
|
||||||
inline bool isFromFrom2 () const;
|
inline bool isFromFrom2 () const;
|
||||||
|
@ -518,6 +518,7 @@ namespace Anabatic {
|
||||||
void _updateGRAData ( Vertex*, bool, Vertex* );
|
void _updateGRAData ( Vertex*, bool, Vertex* );
|
||||||
void _initiateUpdateIntervals ( Vertex* );
|
void _initiateUpdateIntervals ( Vertex* );
|
||||||
bool _updateIntervals ( bool&, Vertex*, bool&, int&, Edge* );
|
bool _updateIntervals ( bool&, Vertex*, bool&, int&, Edge* );
|
||||||
|
void _updateRealOccupancy ( Vertex* );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AnabaticEngine* _anabatic;
|
AnabaticEngine* _anabatic;
|
||||||
|
|
|
@ -73,8 +73,11 @@ namespace Anabatic {
|
||||||
Interval getSide () const;
|
Interval getSide () const;
|
||||||
Segment* getSegment ( const Net* ) const;
|
Segment* getSegment ( const Net* ) const;
|
||||||
inline const vector<Segment*>& getSegments () const;
|
inline const vector<Segment*>& getSegments () const;
|
||||||
|
inline void setCapacity ( int );
|
||||||
inline void incCapacity ( int );
|
inline void incCapacity ( int );
|
||||||
|
inline void setRealOccupancy ( int );
|
||||||
void incRealOccupancy ( int );
|
void incRealOccupancy ( int );
|
||||||
|
void incRealOccupancy2 ( int );
|
||||||
inline void setHistoricCost ( float );
|
inline void setHistoricCost ( float );
|
||||||
void add ( Segment* );
|
void add ( Segment* );
|
||||||
void remove ( Segment* );
|
void remove ( Segment* );
|
||||||
|
@ -83,6 +86,8 @@ namespace Anabatic {
|
||||||
inline const Flags& flags () const;
|
inline const Flags& flags () const;
|
||||||
inline Flags& flags ();
|
inline Flags& flags ();
|
||||||
inline void revalidate () const;
|
inline void revalidate () const;
|
||||||
|
|
||||||
|
bool isMaxCapacity ( Net* net = NULL ) const;
|
||||||
void _setSource ( GCell* );
|
void _setSource ( GCell* );
|
||||||
void _setTarget ( GCell* );
|
void _setTarget ( GCell* );
|
||||||
private:
|
private:
|
||||||
|
@ -133,13 +138,14 @@ namespace Anabatic {
|
||||||
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::setCapacity ( int c ) { _capacity = ((int) c > 0) ? c : 0; }
|
||||||
|
inline void Edge::setRealOccupancy ( int c ) { _realOccupancy = ((int) c > 0) ? c : 0; }
|
||||||
inline void Edge::setHistoricCost ( float hcost ) { _historicCost = hcost; }
|
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(); }
|
||||||
|
|
||||||
|
|
||||||
} // Anabatic namespace.
|
} // Anabatic namespace.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -171,6 +171,12 @@ namespace Anabatic {
|
||||||
inline GCell* getEast () const;
|
inline GCell* getEast () const;
|
||||||
inline GCell* getSouth () const;
|
inline GCell* getSouth () const;
|
||||||
inline GCell* getNorth () const;
|
inline GCell* getNorth () const;
|
||||||
|
|
||||||
|
inline Edge* getWestEdge () const;
|
||||||
|
inline Edge* getEastEdge () const;
|
||||||
|
inline Edge* getSouthEdge () const;
|
||||||
|
inline Edge* getNorthEdge () const;
|
||||||
|
|
||||||
GCell* getWest ( DbU::Unit y ) const;
|
GCell* getWest ( DbU::Unit y ) const;
|
||||||
GCell* getEast ( DbU::Unit y ) const;
|
GCell* getEast ( DbU::Unit y ) const;
|
||||||
GCell* getSouth ( DbU::Unit x ) const;
|
GCell* getSouth ( DbU::Unit x ) const;
|
||||||
|
@ -237,6 +243,8 @@ namespace Anabatic {
|
||||||
bool stepNetDesaturate ( size_t depth
|
bool stepNetDesaturate ( size_t depth
|
||||||
, set<Net*>& globalNets
|
, set<Net*>& globalNets
|
||||||
, Set& invalidateds );
|
, Set& invalidateds );
|
||||||
|
|
||||||
|
void setEdgesOccupancy (unsigned int, unsigned int);
|
||||||
// Misc. functions.
|
// Misc. functions.
|
||||||
inline const Flags& flags () const;
|
inline const Flags& flags () const;
|
||||||
inline Flags& flags ();
|
inline Flags& flags ();
|
||||||
|
@ -323,6 +331,12 @@ namespace Anabatic {
|
||||||
inline GCell* GCell::getEast () const { return _eastEdges.empty() ? NULL : _eastEdges[0]->getOpposite(this); }
|
inline GCell* GCell::getEast () const { return _eastEdges.empty() ? NULL : _eastEdges[0]->getOpposite(this); }
|
||||||
inline GCell* GCell::getSouth () const { return _southEdges.empty() ? NULL : _southEdges[0]->getOpposite(this); }
|
inline GCell* GCell::getSouth () const { return _southEdges.empty() ? NULL : _southEdges[0]->getOpposite(this); }
|
||||||
inline GCell* GCell::getNorth () const { return _northEdges.empty() ? NULL : _northEdges[0]->getOpposite(this); }
|
inline GCell* GCell::getNorth () const { return _northEdges.empty() ? NULL : _northEdges[0]->getOpposite(this); }
|
||||||
|
|
||||||
|
inline Edge* GCell::getWestEdge () const { return _westEdges.empty() ? NULL : _westEdges[0]; }
|
||||||
|
inline Edge* GCell::getEastEdge () const { return _eastEdges.empty() ? NULL : _eastEdges[0]; }
|
||||||
|
inline Edge* GCell::getSouthEdge () const { return _southEdges.empty() ? NULL : _southEdges[0]; }
|
||||||
|
inline Edge* GCell::getNorthEdge () const { return _northEdges.empty() ? NULL : _northEdges[0]; }
|
||||||
|
|
||||||
inline GCell* GCell::getUnder ( Point p ) const { return getUnder(p.getX(),p.getY()); }
|
inline GCell* GCell::getUnder ( Point p ) const { return getUnder(p.getX(),p.getY()); }
|
||||||
inline const vector<Contact*>& GCell::getGContacts () const { return _gcontacts; }
|
inline const vector<Contact*>& GCell::getGContacts () const { return _gcontacts; }
|
||||||
inline size_t GCell::getDepth () const { return _depth; }
|
inline size_t GCell::getDepth () const { return _depth; }
|
||||||
|
|
|
@ -135,6 +135,10 @@ namespace Hurricane {
|
||||||
w->endObject();
|
w->endObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NetRoutingState::setWPitch ( unsigned int w )
|
||||||
|
{
|
||||||
|
if (w != 0) _wPitch = w;
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// Class : "JsonNetRoutingProperty"
|
// Class : "JsonNetRoutingProperty"
|
||||||
|
|
|
@ -72,6 +72,8 @@ namespace Hurricane {
|
||||||
inline void setFlags ( uint32_t mask );
|
inline void setFlags ( uint32_t mask );
|
||||||
inline void unsetFlags ( uint32_t mask );
|
inline void unsetFlags ( uint32_t mask );
|
||||||
inline bool isSelfSym () const;
|
inline bool isSelfSym () const;
|
||||||
|
void setWPitch ( uint32_t );
|
||||||
|
inline uint32_t getWPitch () const;
|
||||||
DbU::Unit getSymValue ( DbU::Unit ) const;
|
DbU::Unit getSymValue ( DbU::Unit ) const;
|
||||||
std::string _getString () const;
|
std::string _getString () const;
|
||||||
Record* _getRecord () const;
|
Record* _getRecord () const;
|
||||||
|
@ -84,10 +86,11 @@ namespace Hurricane {
|
||||||
Net* _symNet;
|
Net* _symNet;
|
||||||
uint32_t _flags;
|
uint32_t _flags;
|
||||||
DbU::Unit _axis;
|
DbU::Unit _axis;
|
||||||
|
uint32_t _wPitch;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
inline NetRoutingState::NetRoutingState ( Net* net, uint32_t flags ) : _net(net), _symNet(NULL), _flags(flags), _axis(0) { }
|
inline NetRoutingState::NetRoutingState ( Net* net, uint32_t flags ) : _net(net), _symNet(NULL), _flags(flags), _axis(0), _wPitch(1) { }
|
||||||
|
|
||||||
inline bool NetRoutingState::isExcluded () const { return _flags & Excluded; };
|
inline bool NetRoutingState::isExcluded () const { return _flags & Excluded; };
|
||||||
inline bool NetRoutingState::isFixed () const { return _flags & Fixed; };
|
inline bool NetRoutingState::isFixed () const { return _flags & Fixed; };
|
||||||
|
@ -111,6 +114,7 @@ namespace Hurricane {
|
||||||
inline void NetRoutingState::setSymAxis ( DbU::Unit axis ) { _axis = axis; }
|
inline void NetRoutingState::setSymAxis ( DbU::Unit axis ) { _axis = axis; }
|
||||||
inline bool NetRoutingState::isSelfSym () const { return (_symNet == NULL) and (isSymmetric()); }
|
inline bool NetRoutingState::isSelfSym () const { return (_symNet == NULL) and (isSymmetric()); }
|
||||||
inline bool NetRoutingState::isSymSlave () const { return (_symNet != NULL) and (not isSymMaster()); }
|
inline bool NetRoutingState::isSymSlave () const { return (_symNet != NULL) and (not isSymMaster()); }
|
||||||
|
inline uint32_t NetRoutingState::getWPitch () const { return _wPitch; }
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
|
@ -180,6 +184,10 @@ namespace Hurricane {
|
||||||
static inline void setSymAxis ( const Net*, DbU::Unit );
|
static inline void setSymAxis ( const Net*, DbU::Unit );
|
||||||
static inline void setFlags ( const Net*, uint32_t mask );
|
static inline void setFlags ( const Net*, uint32_t mask );
|
||||||
static inline void unsetFlags ( const Net*, uint32_t mask );
|
static inline void unsetFlags ( const Net*, uint32_t mask );
|
||||||
|
|
||||||
|
static inline uint32_t getWPitch ( const Net* );
|
||||||
|
static inline void setWPitch ( const Net*, uint32_t w );
|
||||||
|
|
||||||
static NetRoutingState* get ( const Net* );
|
static NetRoutingState* get ( const Net* );
|
||||||
static NetRoutingState* create ( Net*, uint32_t flags=0 );
|
static NetRoutingState* create ( Net*, uint32_t flags=0 );
|
||||||
private:
|
private:
|
||||||
|
@ -307,6 +315,20 @@ namespace Hurricane {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline uint32_t NetRoutingExtension::getWPitch ( const Net* net )
|
||||||
|
{
|
||||||
|
NetRoutingState* state = get( net );
|
||||||
|
return (state == NULL) ? 0 : state->getWPitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void NetRoutingExtension::setWPitch ( const Net* net, uint32_t w )
|
||||||
|
{
|
||||||
|
NetRoutingState* state = get( net );
|
||||||
|
if (state != NULL) state->setWPitch( w );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // Hurricane namespace.
|
} // Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -136,6 +136,8 @@ extern "C" {
|
||||||
ExtensionSetUIntFunction(setFlags ,NetRoutingExtension)
|
ExtensionSetUIntFunction(setFlags ,NetRoutingExtension)
|
||||||
ExtensionSetUIntFunction(unsetFlags ,NetRoutingExtension)
|
ExtensionSetUIntFunction(unsetFlags ,NetRoutingExtension)
|
||||||
ExtensionSetLongFunction(setSymAxis ,NetRoutingExtension)
|
ExtensionSetLongFunction(setSymAxis ,NetRoutingExtension)
|
||||||
|
ExtensionGetUIntFunction(getWPitch ,NetRoutingExtension)
|
||||||
|
ExtensionSetUIntFunction(setWPitch ,NetRoutingExtension)
|
||||||
|
|
||||||
|
|
||||||
static PyObject* PyNetRoutingExtension_getSymNet ( PyObject*, PyObject* args )
|
static PyObject* PyNetRoutingExtension_getSymNet ( PyObject*, PyObject* args )
|
||||||
|
@ -214,6 +216,8 @@ extern "C" {
|
||||||
, "Returns the NetRoutingState, or None has not been created yet." }
|
, "Returns the NetRoutingState, or None has not been created yet." }
|
||||||
, { "create" , (PyCFunction)PyNetRoutingExtension_create , METH_VARARGS|METH_CLASS
|
, { "create" , (PyCFunction)PyNetRoutingExtension_create , METH_VARARGS|METH_CLASS
|
||||||
, "Returns the NetRoutingState, create it if needs be." }
|
, "Returns the NetRoutingState, create it if needs be." }
|
||||||
|
, { "setWPitch" , (PyCFunction)PyNetRoutingExtension_setWPitch , METH_VARARGS|METH_CLASS , "To be documented." }
|
||||||
|
, { "getWPitch" , (PyCFunction)PyNetRoutingExtension_getWPitch , METH_NOARGS |METH_CLASS , "To be documented." }
|
||||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -83,11 +83,13 @@ extern "C" {
|
||||||
DirectGetBoolAttribute(PyNetRoutingState_isAnalog ,isAnalog ,PyNetRoutingState,NetRoutingState)
|
DirectGetBoolAttribute(PyNetRoutingState_isAnalog ,isAnalog ,PyNetRoutingState,NetRoutingState)
|
||||||
DirectGetUIntAttribute(PyNetRoutingState_getFlags ,getFlags ,PyNetRoutingState,NetRoutingState)
|
DirectGetUIntAttribute(PyNetRoutingState_getFlags ,getFlags ,PyNetRoutingState,NetRoutingState)
|
||||||
DirectGetLongAttribute(PyNetRoutingState_getSymAxis ,getSymAxis ,PyNetRoutingState,NetRoutingState)
|
DirectGetLongAttribute(PyNetRoutingState_getSymAxis ,getSymAxis ,PyNetRoutingState,NetRoutingState)
|
||||||
|
DirectGetUIntAttribute(PyNetRoutingState_getWPitch ,getWPitch ,PyNetRoutingState,NetRoutingState)
|
||||||
|
|
||||||
// Standart Mutators (Attributes).
|
// Standart Mutators (Attributes).
|
||||||
DirectSetUInt32Attribute(PyNetRoutingState_setFlags ,setFlags ,PyNetRoutingState,NetRoutingState)
|
DirectSetUInt32Attribute(PyNetRoutingState_setFlags ,setFlags ,PyNetRoutingState,NetRoutingState)
|
||||||
DirectSetUInt32Attribute(PyNetRoutingState_unsetFlags,unsetFlags,PyNetRoutingState,NetRoutingState)
|
DirectSetUInt32Attribute(PyNetRoutingState_unsetFlags,unsetFlags,PyNetRoutingState,NetRoutingState)
|
||||||
DirectSetLongAttribute (PyNetRoutingState_setSymAxis,setSymAxis,PyNetRoutingState,NetRoutingState)
|
DirectSetLongAttribute (PyNetRoutingState_setSymAxis,setSymAxis,PyNetRoutingState,NetRoutingState)
|
||||||
|
DirectSetUInt32Attribute(PyNetRoutingState_setWPitch ,setWPitch ,PyNetRoutingState,NetRoutingState)
|
||||||
|
|
||||||
|
|
||||||
PyMethodDef PyNetRoutingState_Methods[] =
|
PyMethodDef PyNetRoutingState_Methods[] =
|
||||||
|
@ -111,6 +113,8 @@ extern "C" {
|
||||||
, { "setSymAxis" , (PyCFunction)PyNetRoutingState_setSymAxis , METH_VARARGS , "To be documented." }
|
, { "setSymAxis" , (PyCFunction)PyNetRoutingState_setSymAxis , METH_VARARGS , "To be documented." }
|
||||||
, { "getNet" , (PyCFunction)PyNetRoutingState_getNet , METH_VARARGS , "To be documented." }
|
, { "getNet" , (PyCFunction)PyNetRoutingState_getNet , METH_VARARGS , "To be documented." }
|
||||||
, { "getSymNet" , (PyCFunction)PyNetRoutingState_getSymNet , METH_VARARGS , "To be documented." }
|
, { "getSymNet" , (PyCFunction)PyNetRoutingState_getSymNet , METH_VARARGS , "To be documented." }
|
||||||
|
, { "getWPitch" , (PyCFunction)PyNetRoutingState_getWPitch , METH_NOARGS , "To be documented." }
|
||||||
|
, { "setWPitch" , (PyCFunction)PyNetRoutingState_setWPitch , METH_VARARGS , "To be documented." }
|
||||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue