Determinism correction of Hurricane, CRL core & Katana.
* Bug: In Hurricane::Cell::uniquify(), a set<Cell*> sorted on pointers was remaining. Now sorted on Entity::Id. * Bug: In CRL::VhdlEntity, in the driver, the components where driven in pointer order (set<> again). Now use ids. * Bug: In CRL/etc/scn6m_deep_09/technology.conf, the symbolic extentions for VIAs and layers were wrong. Have to be multiplied by two. * Change: In AnabaticEngine, AutoContact and AutoSegment LUTs are now sorted on Entity::Id. Should not have had any impact, but better safe than sorry. * Change: In KatanaEngine, Symmetric contraint map<> is now sorted on Entity::id. Idem for TrackSegmentLut.
This commit is contained in:
parent
23cb020ed3
commit
0fa6f8be9b
|
@ -35,6 +35,7 @@ namespace Anabatic {
|
||||||
using Hurricane::setInBound;
|
using Hurricane::setInBound;
|
||||||
using Hurricane::tab;
|
using Hurricane::tab;
|
||||||
using Hurricane::Name;
|
using Hurricane::Name;
|
||||||
|
using Hurricane::Entity;
|
||||||
using Hurricane::Net;
|
using Hurricane::Net;
|
||||||
using Hurricane::Component;
|
using Hurricane::Component;
|
||||||
using Hurricane::Components;
|
using Hurricane::Components;
|
||||||
|
@ -48,7 +49,7 @@ namespace Anabatic {
|
||||||
class AutoContact;
|
class AutoContact;
|
||||||
|
|
||||||
|
|
||||||
typedef std::map<Contact*,AutoContact*> AutoContactLut;
|
typedef std::map<Contact*,AutoContact*,Entity::CompareById> AutoContactLut;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
|
|
|
@ -48,6 +48,7 @@ namespace Anabatic {
|
||||||
using Hurricane::DbU;
|
using Hurricane::DbU;
|
||||||
using Hurricane::Box;
|
using Hurricane::Box;
|
||||||
using Hurricane::Hook;
|
using Hurricane::Hook;
|
||||||
|
using Hurricane::Entity;
|
||||||
using Hurricane::Component;
|
using Hurricane::Component;
|
||||||
using Hurricane::Contact;
|
using Hurricane::Contact;
|
||||||
using Hurricane::Segment;
|
using Hurricane::Segment;
|
||||||
|
@ -70,13 +71,13 @@ namespace Anabatic {
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// Collections.
|
// Collections.
|
||||||
|
|
||||||
typedef Hurricane::Filter<AutoSegment*> AutoSegmentHF;
|
typedef Hurricane::Filter<AutoSegment*> AutoSegmentHF;
|
||||||
typedef Hurricane::Locator<AutoSegment*> AutoSegmentHL;
|
typedef Hurricane::Locator<AutoSegment*> AutoSegmentHL;
|
||||||
typedef Hurricane::Collection<AutoSegment*> AutoSegmentHC;
|
typedef Hurricane::Collection<AutoSegment*> AutoSegmentHC;
|
||||||
typedef GenericCollection<AutoSegment*> AutoSegments;
|
typedef GenericCollection<AutoSegment*> AutoSegments;
|
||||||
typedef GenericLocator<AutoSegment*> AutoSegmentLocator;
|
typedef GenericLocator<AutoSegment*> AutoSegmentLocator;
|
||||||
typedef GenericFilter<AutoSegment*> AutoSegmentFilter;
|
typedef GenericFilter<AutoSegment*> AutoSegmentFilter;
|
||||||
typedef map<Segment*,AutoSegment*> AutoSegmentLut;
|
typedef map<Segment*,AutoSegment*,Entity::CompareById> AutoSegmentLut;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
|
|
|
@ -42,16 +42,16 @@ routingGaugesTable = {}
|
||||||
|
|
||||||
routingGaugesTable['msxlib'] = \
|
routingGaugesTable['msxlib'] = \
|
||||||
( ( 'METAL1' , ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, 0, 10, 2, 2, 7 ) )
|
( ( 'METAL1' , ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, 0, 10, 2, 2, 7 ) )
|
||||||
, ( 'METAL2' , ( Gauge.Horizontal, Gauge.Default, 1, 0.0, 0, 10, 3, 2, 8 ) )
|
, ( 'METAL2' , ( Gauge.Horizontal, Gauge.Default, 1, 0.0, 0, 10, 4, 2, 8 ) )
|
||||||
, ( 'METAL3' , ( Gauge.Vertical , Gauge.Default, 2, 0.0, 0, 10, 3, 2, 8 ) )
|
, ( 'METAL3' , ( Gauge.Vertical , Gauge.Default, 2, 0.0, 0, 10, 4, 2, 8 ) )
|
||||||
, ( 'METAL4' , ( Gauge.Horizontal, Gauge.Default, 3, 0.0, 0, 10, 3, 2, 8 ) )
|
, ( 'METAL4' , ( Gauge.Horizontal, Gauge.Default, 3, 0.0, 0, 10, 4, 2, 8 ) )
|
||||||
, ( 'METAL5' , ( Gauge.Vertical , Gauge.Default, 4, 0.0, 0, 10, 3, 2, 8 ) )
|
, ( 'METAL5' , ( Gauge.Vertical , Gauge.Default, 4, 0.0, 0, 10, 4, 2, 8 ) )
|
||||||
#, ( 'METAL6' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 10, 5, 2, 8 ) )
|
#, ( 'METAL6' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 10,10, 2, 8 ) )
|
||||||
)
|
)
|
||||||
|
|
||||||
routingGaugesTable['msxlib-2M'] = \
|
routingGaugesTable['msxlib-2M'] = \
|
||||||
( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, 0, 10, 2, 2, 7 ) )
|
( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, 0, 10, 2, 2, 7 ) )
|
||||||
, ( 'METAL2', ( Gauge.Vertical , Gauge.Default, 1, 0.0, 0, 10, 3, 2, 8 ) )
|
, ( 'METAL2', ( Gauge.Vertical , Gauge.Default, 1, 0.0, 0, 10, 4, 2, 8 ) )
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -106,35 +106,35 @@ layersExtensionsTable = \
|
||||||
# Routing Layers (symbolic).
|
# Routing Layers (symbolic).
|
||||||
, ('METAL1.minimum.width' , 2.0)
|
, ('METAL1.minimum.width' , 2.0)
|
||||||
, ('METAL1.metal1.extention.cap' , 2.0)
|
, ('METAL1.metal1.extention.cap' , 2.0)
|
||||||
, ('METAL1.metal1.extention.width' , 0.5)
|
, ('METAL1.metal1.extention.width' , 1.0)
|
||||||
, ('METAL2.minimum.width' , 3.0)
|
, ('METAL2.minimum.width' , 4.0)
|
||||||
, ('METAL2.metal2.extention.cap' , 1.5)
|
, ('METAL2.metal2.extention.cap' , 2.0)
|
||||||
, ('METAL3.minimum.width' , 3.0)
|
, ('METAL3.minimum.width' , 4.0)
|
||||||
, ('METAL3.metal3.extention.cap' , 1.5)
|
, ('METAL3.metal3.extention.cap' , 2.0)
|
||||||
, ('METAL4.minimum.width' , 3.0)
|
, ('METAL4.minimum.width' , 4.0)
|
||||||
, ('METAL4.metal4.extention.cap' , 1.5)
|
, ('METAL4.metal4.extention.cap' , 2.0)
|
||||||
, ('METAL5.minimum.width' , 3.0)
|
, ('METAL5.minimum.width' , 4.0)
|
||||||
, ('METAL5.metal5.extention.cap' , 1.5)
|
, ('METAL5.metal5.extention.cap' , 2.0)
|
||||||
, ('METAL6.minimum.width' , 5.0)
|
, ('METAL6.minimum.width' , 10.0)
|
||||||
, ('METAL6.metal6.extention.cap' , 2.5)
|
, ('METAL6.metal6.extention.cap' , 5.0)
|
||||||
#, ('METAL7.minimum.width' , 2.0)
|
#, ('METAL7.minimum.width' , 2.0)
|
||||||
#, ('METAL7.metal7.extention.cap' , 2.5)
|
#, ('METAL7.metal7.extention.cap' , 2.5)
|
||||||
#, ('METAL8.minimum.width' , 2.0)
|
#, ('METAL8.minimum.width' , 2.0)
|
||||||
#, ('METAL8.metal8.extention.cap' , 2.5)
|
#, ('METAL8.metal8.extention.cap' , 2.5)
|
||||||
|
|
||||||
# Blockages (symbolic).
|
# Blockages (symbolic).
|
||||||
, ('BLOCKAGE1.minimum.width' , 3.0)
|
, ('BLOCKAGE1.minimum.width' , 4.0)
|
||||||
, ('BLOCKAGE1.blockage1.extention.cap' , 2.0)
|
, ('BLOCKAGE1.blockage1.extention.cap' , 2.0)
|
||||||
, ('BLOCKAGE1.blockage1.extention.width', 0.5)
|
, ('BLOCKAGE1.blockage1.extention.width', 0.5)
|
||||||
, ('BLOCKAGE2.minimum.width' , 3.0)
|
, ('BLOCKAGE2.minimum.width' , 4.0)
|
||||||
, ('BLOCKAGE2.blockage2.extention.cap' , 2.0)
|
, ('BLOCKAGE2.blockage2.extention.cap' , 2.0)
|
||||||
, ('BLOCKAGE3.minimum.width' , 3.0)
|
, ('BLOCKAGE3.minimum.width' , 4.0)
|
||||||
, ('BLOCKAGE3.blockage3.extention.cap' , 2.0)
|
, ('BLOCKAGE3.blockage3.extention.cap' , 2.0)
|
||||||
, ('BLOCKAGE4.minimum.width' , 3.0)
|
, ('BLOCKAGE4.minimum.width' , 4.0)
|
||||||
, ('BLOCKAGE4.blockage4.extention.cap' , 2.0)
|
, ('BLOCKAGE4.blockage4.extention.cap' , 2.0)
|
||||||
, ('BLOCKAGE5.minimum.width' , 3.0)
|
, ('BLOCKAGE5.minimum.width' , 4.0)
|
||||||
, ('BLOCKAGE5.blockage5.extention.cap' , 2.0)
|
, ('BLOCKAGE5.blockage5.extention.cap' , 2.0)
|
||||||
, ('BLOCKAGE6.minimum.width' , 4.0)
|
, ('BLOCKAGE6.minimum.width' , 8.0)
|
||||||
, ('BLOCKAGE6.blockage6.extention.cap' , 2.5)
|
, ('BLOCKAGE6.blockage6.extention.cap' , 2.5)
|
||||||
#, ('BLOCKAGE7.minimum.width' , 2.0)
|
#, ('BLOCKAGE7.minimum.width' , 2.0)
|
||||||
#, ('BLOCKAGE7.blockage6.extention.cap' , 4.0)
|
#, ('BLOCKAGE7.blockage6.extention.cap' , 4.0)
|
||||||
|
@ -169,16 +169,16 @@ layersExtensionsTable = \
|
||||||
, ('CONT_POLY.metal1.enclosure' , 1.0)
|
, ('CONT_POLY.metal1.enclosure' , 1.0)
|
||||||
|
|
||||||
# VIAs (i.e. Metal <--> Metal) (symbolic).
|
# VIAs (i.e. Metal <--> Metal) (symbolic).
|
||||||
, ('VIA12.minimum.side' , 3.0)
|
, ('VIA12.minimum.side' , 2.0)
|
||||||
, ('VIA12.metal1.enclosure' , 1.0)
|
, ('VIA12.metal1.enclosure' , 1.0)
|
||||||
, ('VIA12.metal2.enclosure' , 1.0)
|
, ('VIA12.metal2.enclosure' , 1.0)
|
||||||
, ('VIA23.minimum.side' , 3.0)
|
, ('VIA23.minimum.side' , 2.0)
|
||||||
, ('VIA23.metal2.enclosure' , 1.0)
|
, ('VIA23.metal2.enclosure' , 1.0)
|
||||||
, ('VIA23.metal3.enclosure' , 1.0)
|
, ('VIA23.metal3.enclosure' , 1.0)
|
||||||
, ('VIA34.minimum.side' , 3.0)
|
, ('VIA34.minimum.side' , 2.0)
|
||||||
, ('VIA34.metal3.enclosure' , 1.0)
|
, ('VIA34.metal3.enclosure' , 1.0)
|
||||||
, ('VIA34.metal4.enclosure' , 1.0)
|
, ('VIA34.metal4.enclosure' , 1.0)
|
||||||
, ('VIA45.minimum.side' , 3.0)
|
, ('VIA45.minimum.side' , 2.0)
|
||||||
, ('VIA45.metal4.enclosure' , 1.0)
|
, ('VIA45.metal4.enclosure' , 1.0)
|
||||||
, ('VIA45.metal5.enclosure' , 1.0)
|
, ('VIA45.metal5.enclosure' , 1.0)
|
||||||
, ('VIA56.minimum.side' , 5.0)
|
, ('VIA56.minimum.side' , 5.0)
|
||||||
|
|
|
@ -226,7 +226,7 @@ def loadLayersExtensions ( layersExtensionsTable, confFile ):
|
||||||
|
|
||||||
elements = rule[0].split('.')
|
elements = rule[0].split('.')
|
||||||
if len(elements) == 2:
|
if len(elements) == 2:
|
||||||
ruleLayer = layersLUT.lookup( elements[0], LayersLUT.Real|LayersLUT.MissingError )
|
ruleLayer = layersLUT.lookup( elements[0], LayersLUT.Real|LayersLUT.Composite|LayersLUT.MissingError )
|
||||||
subLayer = None
|
subLayer = None
|
||||||
elif len(elements) == 3 or len(elements) == 4:
|
elif len(elements) == 3 or len(elements) == 4:
|
||||||
ruleLayer = layersLUT.lookup( elements[0], LayersLUT.Composite|LayersLUT.MissingError )
|
ruleLayer = layersLUT.lookup( elements[0], LayersLUT.Composite|LayersLUT.MissingError )
|
||||||
|
@ -239,7 +239,6 @@ def loadLayersExtensions ( layersExtensionsTable, confFile ):
|
||||||
,str(rule)
|
,str(rule)
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
if elements[0].startswith('via') or elements[0].startswith('metal'):
|
if elements[0].startswith('via') or elements[0].startswith('metal'):
|
||||||
if isinstance(rule[1],tuple):
|
if isinstance(rule[1],tuple):
|
||||||
value = ( toDbU(rule[1][0]), toDbU(rule[1][1]) )
|
value = ( toDbU(rule[1][0]), toDbU(rule[1][1]) )
|
||||||
|
|
|
@ -345,7 +345,7 @@ namespace Vhdl {
|
||||||
out << "architecture structural of " << cellName << " is\n\n";
|
out << "architecture structural of " << cellName << " is\n\n";
|
||||||
++tab;
|
++tab;
|
||||||
|
|
||||||
set<Cell*> masterCells;
|
set<Cell*,Hurricane::Entity::CompareById> masterCells;
|
||||||
forEach ( Instance*, iinstance, getCell()->getInstances() ) {
|
forEach ( Instance*, iinstance, getCell()->getInstances() ) {
|
||||||
masterCells.insert( iinstance->getMasterCell() );
|
masterCells.insert( iinstance->getMasterCell() );
|
||||||
}
|
}
|
||||||
|
|
|
@ -1022,8 +1022,8 @@ void Cell::uniquify(unsigned int depth)
|
||||||
deepNets.pop_back();
|
deepNets.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<Instance*> toUniquify;
|
vector<Instance*> toUniquify;
|
||||||
set<Cell*> masterCells;
|
set<Cell*,Entity::CompareById> masterCells;
|
||||||
|
|
||||||
for ( Instance* instance : getInstances() ) {
|
for ( Instance* instance : getInstances() ) {
|
||||||
Cell* masterCell = instance->getMasterCell();
|
Cell* masterCell = instance->getMasterCell();
|
||||||
|
|
|
@ -38,6 +38,7 @@ namespace Katana {
|
||||||
using Hurricane::DbU;
|
using Hurricane::DbU;
|
||||||
using Hurricane::Point;
|
using Hurricane::Point;
|
||||||
using Hurricane::Interval;
|
using Hurricane::Interval;
|
||||||
|
using Hurricane::Entity;
|
||||||
using Hurricane::Net;
|
using Hurricane::Net;
|
||||||
using Hurricane::NetRoutingState;
|
using Hurricane::NetRoutingState;
|
||||||
using Hurricane::NetRoutingExtension;
|
using Hurricane::NetRoutingExtension;
|
||||||
|
@ -115,6 +116,8 @@ namespace Katana {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef std::map<Net*,DataSymmetric*,Entity::CompareById> DataSymmetricMap;
|
||||||
|
|
||||||
} // Katana namespace.
|
} // Katana namespace.
|
||||||
|
|
||||||
#endif // KATANA_DATA_SYMMETRIC_H
|
#endif // KATANA_DATA_SYMMETRIC_H
|
||||||
|
|
|
@ -93,8 +93,7 @@ namespace Katana {
|
||||||
RoutingPlane* getRoutingPlaneByLayer ( const Layer* ) const;
|
RoutingPlane* getRoutingPlaneByLayer ( const Layer* ) const;
|
||||||
Track* getTrackByPosition ( const Layer*, DbU::Unit axis, uint32_t mode=Constant::Nearest ) const;
|
Track* getTrackByPosition ( const Layer*, DbU::Unit axis, uint32_t mode=Constant::Nearest ) const;
|
||||||
DataSymmetric* getDataSymmetric ( Net* );
|
DataSymmetric* getDataSymmetric ( Net* );
|
||||||
inline const std::map<Net*,DataSymmetric*>&
|
inline const DataSymmetricMap& getSymmetrics () const;
|
||||||
getSymmetrics () const;
|
|
||||||
inline Block* getBlock ( size_t i ) const;
|
inline Block* getBlock ( size_t i ) const;
|
||||||
inline void printConfiguration () const;
|
inline void printConfiguration () const;
|
||||||
void printCompletion () const;
|
void printCompletion () const;
|
||||||
|
@ -140,17 +139,17 @@ namespace Katana {
|
||||||
virtual string _getTypeName () const;
|
virtual string _getTypeName () const;
|
||||||
private:
|
private:
|
||||||
// Attributes.
|
// Attributes.
|
||||||
static Name _toolName;
|
static Name _toolName;
|
||||||
protected:
|
protected:
|
||||||
CellViewer* _viewer;
|
CellViewer* _viewer;
|
||||||
Configuration* _configuration;
|
Configuration* _configuration;
|
||||||
vector<Block*> _blocks;
|
vector<Block*> _blocks;
|
||||||
vector<RoutingPlane*> _routingPlanes;
|
vector<RoutingPlane*> _routingPlanes;
|
||||||
NegociateWindow* _negociateWindow;
|
NegociateWindow* _negociateWindow;
|
||||||
double _minimumWL;
|
double _minimumWL;
|
||||||
std::map<Net*,DataSymmetric*> _symmetrics;
|
DataSymmetricMap _symmetrics;
|
||||||
uint32_t _mode;
|
uint32_t _mode;
|
||||||
mutable bool _toolSuccess;
|
mutable bool _toolSuccess;
|
||||||
protected:
|
protected:
|
||||||
// Constructors & Destructors.
|
// Constructors & Destructors.
|
||||||
KatanaEngine ( Cell* );
|
KatanaEngine ( Cell* );
|
||||||
|
@ -180,8 +179,7 @@ namespace Katana {
|
||||||
inline uint32_t KatanaEngine::getVTracksReservedLocal () const { return _configuration->getVTracksReservedLocal(); }
|
inline uint32_t KatanaEngine::getVTracksReservedLocal () const { return _configuration->getVTracksReservedLocal(); }
|
||||||
inline uint32_t KatanaEngine::getRipupLimit ( uint32_t type ) const { return _configuration->getRipupLimit(type); }
|
inline uint32_t KatanaEngine::getRipupLimit ( uint32_t type ) const { return _configuration->getRipupLimit(type); }
|
||||||
inline bool KatanaEngine::profileEventCosts () const { return _configuration->profileEventCosts(); }
|
inline bool KatanaEngine::profileEventCosts () const { return _configuration->profileEventCosts(); }
|
||||||
inline const std::map<Net*,DataSymmetric*>&
|
inline const DataSymmetricMap& KatanaEngine::getSymmetrics () const { return _symmetrics; }
|
||||||
KatanaEngine::getSymmetrics () const { return _symmetrics; }
|
|
||||||
inline Block* KatanaEngine::getBlock ( size_t i ) const { return (i < _blocks.size()) ? _blocks[i] : NULL; }
|
inline Block* KatanaEngine::getBlock ( size_t i ) const { return (i < _blocks.size()) ? _blocks[i] : NULL; }
|
||||||
inline NegociateWindow* KatanaEngine::getNegociateWindow () { return _negociateWindow; }
|
inline NegociateWindow* KatanaEngine::getNegociateWindow () { return _negociateWindow; }
|
||||||
inline size_t KatanaEngine::getRoutingPlanesSize () const { return _routingPlanes.size(); }
|
inline size_t KatanaEngine::getRoutingPlanesSize () const { return _routingPlanes.size(); }
|
||||||
|
|
|
@ -45,6 +45,7 @@ namespace Katana {
|
||||||
using Hurricane::Interval;
|
using Hurricane::Interval;
|
||||||
using Hurricane::DbU;
|
using Hurricane::DbU;
|
||||||
using Hurricane::Box;
|
using Hurricane::Box;
|
||||||
|
using Hurricane::Entity;
|
||||||
using Hurricane::Net;
|
using Hurricane::Net;
|
||||||
using Hurricane::Layer;
|
using Hurricane::Layer;
|
||||||
using Anabatic::GCell;
|
using Anabatic::GCell;
|
||||||
|
@ -56,7 +57,7 @@ namespace Katana {
|
||||||
class TrackSegment;
|
class TrackSegment;
|
||||||
|
|
||||||
|
|
||||||
typedef map<Segment*,TrackElement*> TrackElementLut;
|
typedef map<Segment*,TrackElement*,Entity::CompareById> TrackElementLut;
|
||||||
typedef void (SegmentOverlapCostCB)( const TrackElement*, TrackCost& );
|
typedef void (SegmentOverlapCostCB)( const TrackElement*, TrackCost& );
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue