Merge branch 'devel_anabatic' of ssh://bop-t/users/largo2/git/coriolis into devel_anabatic

This commit is contained in:
Jean-Paul Chaput 2017-10-27 10:13:33 +02:00
commit e4575cf8c2
13 changed files with 779 additions and 218 deletions

View File

@ -41,6 +41,8 @@ namespace Anabatic {
const BaseFlags Flags::Saturated = (1L << 11);
const BaseFlags Flags::StdCellRow = (1L << 12);
const BaseFlags Flags::ChannelRow = (1L << 13);
const BaseFlags Flags::HRailGCell = (1L << 14);
const BaseFlags Flags::VRailGCell = (1L << 15);
const BaseFlags Flags::IllimitedCapacity = (1L << 5);
// Flags for Anabatic objects states only.
const BaseFlags Flags::DemoMode = (1L << 5);
@ -66,12 +68,16 @@ namespace Anabatic {
| MatrixGCell
| IoPadGCell
| StdCellRow
| ChannelRow;
| ChannelRow
| HRailGCell
| VRailGCell;
const BaseFlags Flags::RowGCellMask = StdCellRow|ChannelRow;
const BaseFlags Flags::AnalogGCellMask = DeviceGCell
| HChannelGCell
| VChannelGCell
| StrutGCell;
| StrutGCell
| HRailGCell
| VRailGCell;
// Flags for functions arguments only.
const BaseFlags Flags::Create = (1L << 5);
const BaseFlags Flags::WithPerpands = (1L << 6);
@ -168,6 +174,8 @@ namespace Anabatic {
s += (_flags & (uint64_t)DeviceGCell ) ? 'd' : '-';
s += (_flags & (uint64_t)HChannelGCell) ? 'c' : '-';
s += (_flags & (uint64_t)VChannelGCell) ? 'c' : '-';
s += (_flags & (uint64_t)HRailGCell ) ? 'r' : '-';
s += (_flags & (uint64_t)VRailGCell ) ? 'r' : '-';
s += (_flags & (uint64_t)StrutGCell ) ? 's' : '-';
s += (_flags & (uint64_t)MatrixGCell ) ? 'm' : '-';
s += (_flags & (uint64_t)StdCellRow ) ? 'S' : '-';

File diff suppressed because it is too large Load Diff

View File

@ -74,7 +74,7 @@ namespace Anabatic {
if (_stateFlags.contains(Flags::EastSide)) {
if ( (_iedge < _gcell->getEastEdges().size())
and _filterFlags.contains(Flags::EastSide)) break;
// cdebug_log(110,0) << "Switching to North side." << endl;
//cdebug_log(110,0) << "Switching to North side." << endl;
_stateFlags = Flags::NorthSide;
_iedge = 0;
// cdebug_log(110,0) << this << endl;
@ -83,7 +83,7 @@ namespace Anabatic {
if (_stateFlags.contains(Flags::NorthSide)) {
if ( (_iedge < _gcell->getNorthEdges().size())
and _filterFlags.contains(Flags::NorthSide)) break;
// cdebug_log(110,0) << "Switching to West side." << endl;
//cdebug_log(110,0) << "Switching to West side." << endl;
_stateFlags = Flags::WestSide;
_iedge = 0;
// cdebug_log(110,0) << this << endl;
@ -92,7 +92,7 @@ namespace Anabatic {
if (_stateFlags.contains(Flags::WestSide)) {
if ( (_iedge < _gcell->getWestEdges().size())
and _filterFlags.contains(Flags::WestSide)) break;
// cdebug_log(110,0) << "Switching to South side." << endl;
//cdebug_log(110,0) << "Switching to South side." << endl;
_stateFlags = Flags::SouthSide;
_iedge = 0;
continue;
@ -100,7 +100,7 @@ namespace Anabatic {
if (_stateFlags.contains(Flags::SouthSide)) {
if ( (_iedge < _gcell->getSouthEdges().size())
and _filterFlags.contains(Flags::SouthSide)) break;
// cdebug_log(110,0) << "All edges done." << endl;
//cdebug_log(110,0) << "All edges done." << endl;
_stateFlags = 0;
_iedge = 0;
break;;

View File

@ -505,6 +505,34 @@ namespace Anabatic {
}
GCell* GCell::getEastNMatrix() const
{
if (!this->getEast()->isMatrix()) return this->getEast();
else {
GCell* gcell = this->getEast();
while(gcell->getEast()){
if (!gcell->getEast()->isMatrix()) break;
else gcell = gcell->getEast();
}
return gcell->getEast();
}
}
GCell* GCell::getNorthNMatrix() const
{
if (!this->getNorth()->isMatrix()) return this->getNorth();
else {
GCell* gcell = this->getNorth();
while(gcell->getNorth()){
if (!gcell->getNorth()->isMatrix()) break;
else gcell = gcell->getNorth();
}
return gcell->getNorth();
}
}
GCell* GCell::getWest ( DbU::Unit y ) const
{
for ( Edge* edge : _westEdges ) {
@ -718,7 +746,8 @@ namespace Anabatic {
bool GCell::doGrid ()
{
getAnabatic()->openSession();
bool openSession = Session::isOpen();
if (not openSession) getAnabatic()->openSession();
DbU::Unit side = Session::getSliceHeight();
Interval hspan = getSide( Flags::Horizontal );
@ -776,7 +805,7 @@ namespace Anabatic {
// }
//}
Session::close();
if (not openSession) Session::close();
return true;
}
@ -1702,6 +1731,12 @@ namespace Anabatic {
string s = Super::_getString();
s.insert( s.size()-1, " "+getString(getBoundingBox()) );
s.insert( s.size()-1, " "+getString(_flags) );
/* string s = "<GCell at(" + DbU::getValueString(getXMin())
+ "-" + DbU::getValueString(getYMin())
+ "-" + DbU::getValueString(getXMax())
+ "-" + DbU::getValueString(getYMax())
+ "-" + DbU::getValueString(getHeight())
+ "-" + DbU::getValueString(getWidth()) + ")";*/
return s;
}

View File

@ -758,6 +758,8 @@ namespace {
AutoContact* _doVChannel ();
AutoContact* _doStrut ();
AutoContact* _doDevice ();
AutoContact* _doHRail ();
AutoContact* _doVRail ();
void _doIoPad ();
unsigned int getNumberGlobals ();
@ -1232,6 +1234,8 @@ namespace {
if (_gcell->isDevice ()) targetContact = _doDevice ();
else if (_gcell->isHChannel()) targetContact = _doHChannel();
else if (_gcell->isVChannel()) targetContact = _doVChannel();
else if (_gcell->isHRail ()) targetContact = _doHRail();
else if (_gcell->isVRail ()) targetContact = _doVRail();
else if (_gcell->isStrut ()) targetContact = _doStrut ();
else if (_gcell->isIoPad ()) _doIoPad();
else
@ -2972,6 +2976,100 @@ namespace {
}
AutoContact* GCellTopology::_doHRail ()
{
cdebug_log(145,1) << "void GCellTopology::_doHRail ()" << _gcell << endl;
cdebug_log(145,0) << "FromHook: " << _fromHook << endl;
cdebug_log(145,0) << "North : " << north() << endl;
cdebug_log(145,0) << "East : " << east() << endl;
cdebug_log(145,0) << "South : " << south() << endl;
cdebug_log(145,0) << "West : " << west() << endl;
cdebug_log(145,0) << "_routingPads.size(): " << _routingPads.size() << endl;
RoutingPad* rpNE = NULL;
RoutingPad* rpSW = NULL;
_southWestContact = NULL;
if (_routingPads.size() == 1){
rpNE = rpSW = _routingPads[0];
} else {
cdebug_log(145,0) << "Case _routingPads.size() != 1 "<< endl;
throw Error( "GCellTopology::_doHRail() Unexpected case.\n"
" On: %s."
, getString(_gcell).c_str() );
}
cdebug_log(145,0) << "rp: " << _routingPads[0] << endl;
AutoContact* ac = doRp_AccessAnalog( _gcell, rpNE, NoFlags );
if (east()) {
cdebug_log(145,0) << "East" << endl;
push( east(), ac, SouthWest );
}
if (west()) {
cdebug_log(145,0) << "West" << endl;
push( west(), ac, SouthWest );
}
if (south()) {
cdebug_log(145,0) << "South" << endl;
push( south(), ac, SouthWest );
}
if (north()){
cdebug_log(145,0) << "North" << endl;
push( north(), ac, SouthWest );
}
cdebug_log(145,0) << "doHRail done" << endl;
cdebug_tabw(145,-1);
return _southWestContact;
}
AutoContact* GCellTopology::_doVRail ()
{
cdebug_log(145,1) << "void GCellTopology::_doVRail ()" << _gcell << endl;
cdebug_log(145,0) << "FromHook: " << _fromHook << endl;
cdebug_log(145,0) << "North : " << north() << endl;
cdebug_log(145,0) << "East : " << east() << endl;
cdebug_log(145,0) << "South : " << south() << endl;
cdebug_log(145,0) << "West : " << west() << endl;
cdebug_log(145,0) << "_routingPads.size(): " << _routingPads.size() << endl;
RoutingPad* rpNE = NULL;
RoutingPad* rpSW = NULL;
_southWestContact = NULL;
if (_routingPads.size() == 1){
rpNE = rpSW = _routingPads[0];
} else {
cdebug_log(145,0) << "Case _routingPads.size() != 1 "<< endl;
throw Error( "GCellTopology::_doVRail() Unexpected case.\n"
" On: %s."
, getString(_gcell).c_str() );
}
cdebug_log(145,0) << "rp: " << _routingPads[0] << endl;
AutoContact* ac = doRp_AccessAnalog( _gcell, rpNE, NoFlags );
if (east()) {
cdebug_log(145,0) << "East" << endl;
push( east(), ac, SouthWest );
}
if (west()) {
cdebug_log(145,0) << "West" << endl;
push( west(), ac, SouthWest );
}
if (south()) {
cdebug_log(145,0) << "South" << endl;
push( south(), ac, SouthWest );
}
if (north()){
cdebug_log(145,0) << "North" << endl;
push( north(), ac, SouthWest );
}
cdebug_log(145,0) << "doVRail done" << endl;
cdebug_tabw(145,-1);
return _southWestContact;
}
unsigned int GCellTopology::getNumberGlobals ()
{
unsigned int i = 0;
@ -3500,7 +3598,8 @@ namespace Anabatic {
forEach ( RoutingPad*, startRp, routingPads ) {
bool segmentFound = false;
cdebug_log(145,0) << "startRp: " << startRp << endl;
cdebug_log(145,0) << "startRp : " << startRp << endl;
cdebug_log(145,0) << "startHook: " << startHook << endl;
forEach ( Hook*, ihook, startRp->getBodyHook()->getHooks() ) {
cdebug_log(145,0) << "Component " << ihook->getComponent() << endl;
Segment* segment = dynamic_cast<Segment*>( ihook->getComponent() );

View File

@ -41,6 +41,8 @@ namespace Anabatic {
static const BaseFlags Saturated ; // = (1 << 11);
static const BaseFlags StdCellRow ; // = (1 << 12);
static const BaseFlags ChannelRow ; // = (1 << 13);
static const BaseFlags HRailGCell ; // = (1 << 14);
static const BaseFlags VRailGCell ; // = (1 << 15);
// Flags for Edge objects states only.
static const BaseFlags IllimitedCapacity ; // = (1 << 5);
// Flags for Anabatic objects states only.
@ -60,9 +62,9 @@ namespace Anabatic {
static const BaseFlags EndsMask ; // = Source|Target;
static const BaseFlags DirectionMask ; // = Horizontal|Vertical;
static const BaseFlags DestroyMask ; // = DestroyGCell|DestroyBaseContact|DestroyBaseSegment;
static const BaseFlags GCellTypeMask ; // = DeviceGCell|HChannelGCell|VChannelGCell|StrutGCell|MatrixGCell|IoPadGCell;
static const BaseFlags GCellTypeMask ; // = DeviceGCell|HChannelGCell|VChannelGCell|StrutGCell|MatrixGCell|IoPadGCell|HRailGCell|VRailGCell;
static const BaseFlags RowGCellMask ; // = StdCellRow|ChannelRow;
static const BaseFlags AnalogGCellMask ; // = DeviceGCell|HChannelGCell|VChannelGCell|StrutGCell;
static const BaseFlags AnalogGCellMask ; // = DeviceGCell|HChannelGCell|VChannelGCell|StrutGCell|HRailGCell|VRailGCell;
// Flags for functions arguments only.
static const BaseFlags Create ; // = (1 << 5);
static const BaseFlags WithPerpands ;

View File

@ -44,16 +44,17 @@ namespace Anabatic {
class IntervalC
{
public:
enum iFlag { None = 0
, iHorizontal = (1<<0)
, iVertical = (1<<1)
, iSet = (1<<2)
enum iFlag { None = 0
, iFHorizontal = (1<<0)
, iFVertical = (1<<1)
, iSet = (1<<2)
};
public:
IntervalC();
IntervalC(const IntervalC&);
IntervalC(IntervalC&);
IntervalC( DbU::Unit, DbU::Unit, DbU::Unit );
~IntervalC();
void set ( DbU::Unit, DbU::Unit, DbU::Unit );
void setRange ( DbU::Unit, DbU::Unit );
@ -83,8 +84,8 @@ namespace Anabatic {
DbU::Unit _axis;
};
inline void IntervalC::setAsH () { _flags = ((_flags & ~(0x3)) | iHorizontal); }
inline void IntervalC::setAsV () { _flags = ((_flags & ~(0x3)) | iVertical ); }
inline void IntervalC::setAsH () { _flags = ((_flags & ~(0x3)) | iFHorizontal); }
inline void IntervalC::setAsV () { _flags = ((_flags & ~(0x3)) | iFVertical ); }
inline void IntervalC::setAxis ( DbU::Unit axis ) { _axis = axis; }
inline DbU::Unit IntervalC::getAxis () const { return _axis; }
inline DbU::Unit IntervalC::getCenter() const { return getMin()+getMax(); }
@ -92,8 +93,8 @@ namespace Anabatic {
inline DbU::Unit IntervalC::getMax () const { return _max; }
inline void IntervalC::setiSet () { _flags |= iSet; }
inline bool IntervalC::isiSet () const { return _flags & iSet; }
inline bool IntervalC::isH () const { return _flags & iHorizontal; }
inline bool IntervalC::isV () const { return _flags & iVertical ; }
inline bool IntervalC::isH () const { return _flags & iFHorizontal; }
inline bool IntervalC::isV () const { return _flags & iFVertical ; }
inline void IntervalC::setFlags ( Flags flags ) { _flags = flags; }
inline Flags IntervalC::getFlags () const { return _flags; }
@ -213,7 +214,7 @@ namespace Anabatic {
inline int getConnexId () const;
inline int getDegree () const;
inline int getRpCount () const;
inline Edge* getFrom () const;
Edge* getFrom () const;
inline Vertex* getPredecessor () const;
inline void setDistance ( DbU::Unit );
inline void setStamp ( int );
@ -239,8 +240,8 @@ namespace Anabatic {
inline bool isWRestricted () const;
inline bool hasRestrictions() const;
inline void setRestricted ();
inline void clearRestriction ();
void setRestricted ();
void clearRestriction ();
inline void setNRestricted ();
inline void setSRestricted ();
inline void setERestricted ();
@ -266,7 +267,7 @@ namespace Anabatic {
Point getNextPathPoint ( Point, const Vertex* ) const;
//////////////////////////////////////// GRDATA
void setIntervals ( Vertex* );
inline bool hasAData () const;
bool isiSet () const;
DbU::Unit getIAxis () const;
DbU::Unit getIMax () const;
@ -281,7 +282,6 @@ namespace Anabatic {
void clearFrom2 ();
Edge* getFrom2 () const;
void setFrom2 ( Edge* );
void createIntervFrom2 ();
DbU::Unit getPIMax2 () const;
DbU::Unit getPIMin2 () const;
DbU::Unit getPIAxis2 () const;
@ -346,7 +346,7 @@ namespace Anabatic {
inline int Vertex::getBranchId () const { return hasValidStamp() ? _branchId : 0; }
inline int Vertex::getDegree () const { return hasValidStamp() ? _degree : 0; }
inline int Vertex::getRpCount () const { return hasValidStamp() ? _rpCount : 0; }
inline Edge* Vertex::getFrom () const { return _from; }
//inline Edge* Vertex::getFrom () const { return _from; }
inline void Vertex::setDistance ( DbU::Unit distance ) { _distance=distance; }
inline void Vertex::setFrom ( Edge* from ) { _from=from; }
inline void Vertex::setStamp ( int stamp ) { _stamp=stamp; }
@ -377,8 +377,9 @@ namespace Anabatic {
inline bool Vertex::isWRestricted () const { return (_flags & WRestricted); }
inline bool Vertex::hasRestrictions () const { return ( isNRestricted()||isSRestricted()||isERestricted()||isWRestricted()) ; }
inline void Vertex::setRestricted () { _flags |= 0xF; }
inline void Vertex::clearRestriction () { _flags &= ~(0xF); }
inline bool Vertex::hasAData () const { return (_adata !=NULL)? true : false; }
//inline void Vertex::setRestricted () { _flags |= 0xF; }
//inline void Vertex::clearRestriction () { _flags &= ~(0xF); }
inline void Vertex::setNRestricted () { _flags |= NRestricted; }
inline void Vertex::setSRestricted () { _flags |= SRestricted; }
inline void Vertex::setERestricted () { _flags |= ERestricted; }

View File

@ -143,6 +143,8 @@ namespace Anabatic {
inline bool isMatrix () const;
inline bool isRow () const;
inline bool isIoPad () const;
inline bool isHRail () const;
inline bool isVRail () const;
inline bool isStdCellRow () const;
inline bool isChannelRow () const;
bool isWest ( GCell* ) const;
@ -176,6 +178,9 @@ namespace Anabatic {
inline GCell* getSouth () const;
inline GCell* getNorth () const;
GCell* getEastNMatrix () const;
GCell* getNorthNMatrix () const;
inline Edge* getWestEdge () const;
inline Edge* getEastEdge () const;
inline Edge* getSouthEdge () const;
@ -323,6 +328,8 @@ namespace Anabatic {
inline bool GCell::isMatrix () const { return _flags & Flags::MatrixGCell; }
inline bool GCell::isRow () const { return _flags & Flags::RowGCellMask; }
inline bool GCell::isIoPad () const { return _flags & Flags::IoPadGCell; }
inline bool GCell::isHRail () const { return _flags & Flags::HRailGCell; }
inline bool GCell::isVRail () const { return _flags & Flags::VRailGCell; }
inline bool GCell::isStdCellRow () const { return _flags & Flags::StdCellRow; }
inline bool GCell::isChannelRow () const { return _flags & Flags::ChannelRow; }
inline bool GCell::isSaturated () const { return _flags & Flags::Saturated; }

View File

@ -85,7 +85,7 @@ stylesTable = \
, (Drawing, 'gmetalv' , { 'color':'200,200,255', 'pattern':'light_antihash1.8', 'border':1 })
, (Drawing, 'gcut' , { 'color':'255,255,190', 'border':1 })
, (Drawing, 'Anabatic::Edge' , { 'color':'255,255,190', 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':4 })
, (Drawing, 'Anabatic::GCell', { 'color':'255,0,0' , 'pattern':'0000000000000000', 'threshold':0.10*scale, 'border':4 })
, (Drawing, 'Anabatic::GCell', { 'color':'255,0,0' , 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':4 })
)
# ----------------------------------------------------------------------

View File

@ -833,7 +833,7 @@ void Cell::flattenNets ( const Instance* instance, uint64_t flags )
vector<HyperNet> hyperNets;
vector<HyperNet> topHyperNets;
for ( Occurrence occurrence : getHyperNetRootNetOccurrences().getSubSet(NotFilter<Occurrence>(Occurrence_Contains(instance))) ) {
for ( Occurrence occurrence : getHyperNetRootNetOccurrences().getSubSet(Occurrence_Contains(instance)) ) {
Net* net = static_cast<Net*>(occurrence.getEntity());
if (net->isClock() and (flags & Flags::NoClockFlatten)) continue;

View File

@ -394,6 +394,20 @@ extern "C" {
}
extern Layer* PYDERIVEDLAYER_O ( PyObject* pyObject )
{
Layer* layer = NULL;
if (IsPyLayer(pyObject)) layer = PYLAYER_O(pyObject);
if (not layer and IsPyBasicLayer(pyObject) ) layer = PYBASICLAYER_O(pyObject);
if (not layer and IsPyContactLayer(pyObject) ) layer = PYCONTACTLAYER_O(pyObject);
if (not layer and IsPyViaLayer(pyObject) ) layer = PYVIALAYER_O(pyObject);
if (not layer and IsPyDiffusionLayer(pyObject) ) layer = PYDIFFUSIONLAYER_O(pyObject);
if (not layer and IsPyRegularLayer(pyObject) ) layer = PYREGULARLAYER_O(pyObject);
if (not layer and IsPyTransistorLayer(pyObject)) layer = PYTRANSISTORLAYER_O(pyObject);
return layer;
}
#endif // End of Shared Library Code Part.
} // extern "C".

View File

@ -46,6 +46,7 @@ extern "C" {
extern PyObject* PyLayer_LinkDerived ( Hurricane::Layer* object );
extern void PyLayer_LinkPyType ();
extern void PyLayer_postModuleInit ();
extern Layer* PYDERIVEDLAYER_O ( PyObject* );
# define IsPyLayer(v) ( (v)->ob_type == &PyTypeLayer )
# define PYLAYER(v) ( (PyLayer*)(v) )

View File

@ -140,7 +140,8 @@ namespace {
DebugSession::open( _data->getNet(), 144, 146 );
// Temporary.
_data->setSymAxis( _katana->getCell()->getAbutmentBox().getCenter().getX() );
//_data->setSymAxis( _katana->getCell()->getAbutmentBox().getCenter().getX() );
_data->setSymAxis( NetRoutingExtension::getSymAxis(_data->getNet()) );
cmess2 << " - Net: \"" << _data->getNet()->getName() << "\" ";
cmess2 << "@" << DbU::getValueString(_data->getSymAxis()) << " ";