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:
Jean-Paul Chaput 2018-03-25 00:58:22 +01:00
parent 23cb020ed3
commit 0fa6f8be9b
11 changed files with 60 additions and 57 deletions

View File

@ -1143,7 +1143,7 @@ namespace Anabatic {
AutoContact* source = getAutoSource();
AutoContact* target = getAutoTarget();
if (isLocal() and source->isTurn() and target->isTurn() and not isUserDefined()) {
AutoSegment* sourcePerpand = source->getPerpandicular(this);
AutoSegment* targetPerpand = target->getPerpandicular(this);

View File

@ -35,6 +35,7 @@ namespace Anabatic {
using Hurricane::setInBound;
using Hurricane::tab;
using Hurricane::Name;
using Hurricane::Entity;
using Hurricane::Net;
using Hurricane::Component;
using Hurricane::Components;
@ -48,7 +49,7 @@ namespace Anabatic {
class AutoContact;
typedef std::map<Contact*,AutoContact*> AutoContactLut;
typedef std::map<Contact*,AutoContact*,Entity::CompareById> AutoContactLut;
// -------------------------------------------------------------------

View File

@ -48,6 +48,7 @@ namespace Anabatic {
using Hurricane::DbU;
using Hurricane::Box;
using Hurricane::Hook;
using Hurricane::Entity;
using Hurricane::Component;
using Hurricane::Contact;
using Hurricane::Segment;
@ -70,13 +71,13 @@ namespace Anabatic {
// -------------------------------------------------------------------
// Collections.
typedef Hurricane::Filter<AutoSegment*> AutoSegmentHF;
typedef Hurricane::Locator<AutoSegment*> AutoSegmentHL;
typedef Hurricane::Collection<AutoSegment*> AutoSegmentHC;
typedef GenericCollection<AutoSegment*> AutoSegments;
typedef GenericLocator<AutoSegment*> AutoSegmentLocator;
typedef GenericFilter<AutoSegment*> AutoSegmentFilter;
typedef map<Segment*,AutoSegment*> AutoSegmentLut;
typedef Hurricane::Filter<AutoSegment*> AutoSegmentHF;
typedef Hurricane::Locator<AutoSegment*> AutoSegmentHL;
typedef Hurricane::Collection<AutoSegment*> AutoSegmentHC;
typedef GenericCollection<AutoSegment*> AutoSegments;
typedef GenericLocator<AutoSegment*> AutoSegmentLocator;
typedef GenericFilter<AutoSegment*> AutoSegmentFilter;
typedef map<Segment*,AutoSegment*,Entity::CompareById> AutoSegmentLut;
// -------------------------------------------------------------------

View File

@ -42,16 +42,16 @@ routingGaugesTable = {}
routingGaugesTable['msxlib'] = \
( ( '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 ) )
, ( 'METAL3' , ( Gauge.Vertical , Gauge.Default, 2, 0.0, 0, 10, 3, 2, 8 ) )
, ( 'METAL4' , ( Gauge.Horizontal, Gauge.Default, 3, 0.0, 0, 10, 3, 2, 8 ) )
, ( 'METAL5' , ( Gauge.Vertical , Gauge.Default, 4, 0.0, 0, 10, 3, 2, 8 ) )
#, ( 'METAL6' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 10, 5, 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, 4, 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, 4, 2, 8 ) )
#, ( 'METAL6' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 10,10, 2, 8 ) )
)
routingGaugesTable['msxlib-2M'] = \
( ( '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 ) )
)

View File

@ -106,35 +106,35 @@ layersExtensionsTable = \
# Routing Layers (symbolic).
, ('METAL1.minimum.width' , 2.0)
, ('METAL1.metal1.extention.cap' , 2.0)
, ('METAL1.metal1.extention.width' , 0.5)
, ('METAL2.minimum.width' , 3.0)
, ('METAL2.metal2.extention.cap' , 1.5)
, ('METAL3.minimum.width' , 3.0)
, ('METAL3.metal3.extention.cap' , 1.5)
, ('METAL4.minimum.width' , 3.0)
, ('METAL4.metal4.extention.cap' , 1.5)
, ('METAL5.minimum.width' , 3.0)
, ('METAL5.metal5.extention.cap' , 1.5)
, ('METAL6.minimum.width' , 5.0)
, ('METAL6.metal6.extention.cap' , 2.5)
, ('METAL1.metal1.extention.width' , 1.0)
, ('METAL2.minimum.width' , 4.0)
, ('METAL2.metal2.extention.cap' , 2.0)
, ('METAL3.minimum.width' , 4.0)
, ('METAL3.metal3.extention.cap' , 2.0)
, ('METAL4.minimum.width' , 4.0)
, ('METAL4.metal4.extention.cap' , 2.0)
, ('METAL5.minimum.width' , 4.0)
, ('METAL5.metal5.extention.cap' , 2.0)
, ('METAL6.minimum.width' , 10.0)
, ('METAL6.metal6.extention.cap' , 5.0)
#, ('METAL7.minimum.width' , 2.0)
#, ('METAL7.metal7.extention.cap' , 2.5)
#, ('METAL8.minimum.width' , 2.0)
#, ('METAL8.metal8.extention.cap' , 2.5)
# Blockages (symbolic).
, ('BLOCKAGE1.minimum.width' , 3.0)
, ('BLOCKAGE1.minimum.width' , 4.0)
, ('BLOCKAGE1.blockage1.extention.cap' , 2.0)
, ('BLOCKAGE1.blockage1.extention.width', 0.5)
, ('BLOCKAGE2.minimum.width' , 3.0)
, ('BLOCKAGE2.minimum.width' , 4.0)
, ('BLOCKAGE2.blockage2.extention.cap' , 2.0)
, ('BLOCKAGE3.minimum.width' , 3.0)
, ('BLOCKAGE3.minimum.width' , 4.0)
, ('BLOCKAGE3.blockage3.extention.cap' , 2.0)
, ('BLOCKAGE4.minimum.width' , 3.0)
, ('BLOCKAGE4.minimum.width' , 4.0)
, ('BLOCKAGE4.blockage4.extention.cap' , 2.0)
, ('BLOCKAGE5.minimum.width' , 3.0)
, ('BLOCKAGE5.minimum.width' , 4.0)
, ('BLOCKAGE5.blockage5.extention.cap' , 2.0)
, ('BLOCKAGE6.minimum.width' , 4.0)
, ('BLOCKAGE6.minimum.width' , 8.0)
, ('BLOCKAGE6.blockage6.extention.cap' , 2.5)
#, ('BLOCKAGE7.minimum.width' , 2.0)
#, ('BLOCKAGE7.blockage6.extention.cap' , 4.0)
@ -169,16 +169,16 @@ layersExtensionsTable = \
, ('CONT_POLY.metal1.enclosure' , 1.0)
# VIAs (i.e. Metal <--> Metal) (symbolic).
, ('VIA12.minimum.side' , 3.0)
, ('VIA12.minimum.side' , 2.0)
, ('VIA12.metal1.enclosure' , 1.0)
, ('VIA12.metal2.enclosure' , 1.0)
, ('VIA23.minimum.side' , 3.0)
, ('VIA23.minimum.side' , 2.0)
, ('VIA23.metal2.enclosure' , 1.0)
, ('VIA23.metal3.enclosure' , 1.0)
, ('VIA34.minimum.side' , 3.0)
, ('VIA34.minimum.side' , 2.0)
, ('VIA34.metal3.enclosure' , 1.0)
, ('VIA34.metal4.enclosure' , 1.0)
, ('VIA45.minimum.side' , 3.0)
, ('VIA45.minimum.side' , 2.0)
, ('VIA45.metal4.enclosure' , 1.0)
, ('VIA45.metal5.enclosure' , 1.0)
, ('VIA56.minimum.side' , 5.0)

View File

@ -226,7 +226,7 @@ def loadLayersExtensions ( layersExtensionsTable, confFile ):
elements = rule[0].split('.')
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
elif len(elements) == 3 or len(elements) == 4:
ruleLayer = layersLUT.lookup( elements[0], LayersLUT.Composite|LayersLUT.MissingError )
@ -239,7 +239,6 @@ def loadLayersExtensions ( layersExtensionsTable, confFile ):
,str(rule)
])
if elements[0].startswith('via') or elements[0].startswith('metal'):
if isinstance(rule[1],tuple):
value = ( toDbU(rule[1][0]), toDbU(rule[1][1]) )

View File

@ -345,7 +345,7 @@ namespace Vhdl {
out << "architecture structural of " << cellName << " is\n\n";
++tab;
set<Cell*> masterCells;
set<Cell*,Hurricane::Entity::CompareById> masterCells;
forEach ( Instance*, iinstance, getCell()->getInstances() ) {
masterCells.insert( iinstance->getMasterCell() );
}

View File

@ -1022,8 +1022,8 @@ void Cell::uniquify(unsigned int depth)
deepNets.pop_back();
}
vector<Instance*> toUniquify;
set<Cell*> masterCells;
vector<Instance*> toUniquify;
set<Cell*,Entity::CompareById> masterCells;
for ( Instance* instance : getInstances() ) {
Cell* masterCell = instance->getMasterCell();

View File

@ -38,6 +38,7 @@ namespace Katana {
using Hurricane::DbU;
using Hurricane::Point;
using Hurricane::Interval;
using Hurricane::Entity;
using Hurricane::Net;
using Hurricane::NetRoutingState;
using Hurricane::NetRoutingExtension;
@ -115,6 +116,8 @@ namespace Katana {
}
typedef std::map<Net*,DataSymmetric*,Entity::CompareById> DataSymmetricMap;
} // Katana namespace.
#endif // KATANA_DATA_SYMMETRIC_H

View File

@ -93,8 +93,7 @@ namespace Katana {
RoutingPlane* getRoutingPlaneByLayer ( const Layer* ) const;
Track* getTrackByPosition ( const Layer*, DbU::Unit axis, uint32_t mode=Constant::Nearest ) const;
DataSymmetric* getDataSymmetric ( Net* );
inline const std::map<Net*,DataSymmetric*>&
getSymmetrics () const;
inline const DataSymmetricMap& getSymmetrics () const;
inline Block* getBlock ( size_t i ) const;
inline void printConfiguration () const;
void printCompletion () const;
@ -140,17 +139,17 @@ namespace Katana {
virtual string _getTypeName () const;
private:
// Attributes.
static Name _toolName;
protected:
CellViewer* _viewer;
Configuration* _configuration;
vector<Block*> _blocks;
vector<RoutingPlane*> _routingPlanes;
NegociateWindow* _negociateWindow;
double _minimumWL;
std::map<Net*,DataSymmetric*> _symmetrics;
uint32_t _mode;
mutable bool _toolSuccess;
static Name _toolName;
protected:
CellViewer* _viewer;
Configuration* _configuration;
vector<Block*> _blocks;
vector<RoutingPlane*> _routingPlanes;
NegociateWindow* _negociateWindow;
double _minimumWL;
DataSymmetricMap _symmetrics;
uint32_t _mode;
mutable bool _toolSuccess;
protected:
// Constructors & Destructors.
KatanaEngine ( Cell* );
@ -180,8 +179,7 @@ namespace Katana {
inline uint32_t KatanaEngine::getVTracksReservedLocal () const { return _configuration->getVTracksReservedLocal(); }
inline uint32_t KatanaEngine::getRipupLimit ( uint32_t type ) const { return _configuration->getRipupLimit(type); }
inline bool KatanaEngine::profileEventCosts () const { return _configuration->profileEventCosts(); }
inline const std::map<Net*,DataSymmetric*>&
KatanaEngine::getSymmetrics () const { return _symmetrics; }
inline const DataSymmetricMap& KatanaEngine::getSymmetrics () const { return _symmetrics; }
inline Block* KatanaEngine::getBlock ( size_t i ) const { return (i < _blocks.size()) ? _blocks[i] : NULL; }
inline NegociateWindow* KatanaEngine::getNegociateWindow () { return _negociateWindow; }
inline size_t KatanaEngine::getRoutingPlanesSize () const { return _routingPlanes.size(); }

View File

@ -45,6 +45,7 @@ namespace Katana {
using Hurricane::Interval;
using Hurricane::DbU;
using Hurricane::Box;
using Hurricane::Entity;
using Hurricane::Net;
using Hurricane::Layer;
using Anabatic::GCell;
@ -56,7 +57,7 @@ namespace Katana {
class TrackSegment;
typedef map<Segment*,TrackElement*> TrackElementLut;
typedef map<Segment*,TrackElement*,Entity::CompareById> TrackElementLut;
typedef void (SegmentOverlapCostCB)( const TrackElement*, TrackCost& );