From c86e72006657c16159f48e2465444d88b2ee002e Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Sat, 4 Dec 2010 15:23:51 +0000 Subject: [PATCH] * ./crlcore: - Change: Rename "obstacle" to "blockage" in all the places it still appears to be completly homogeneous. - New: In Catalog, adds a "Pad" attribute to mark cells that are pads. - Change: In ApParser, discard "padreal" instances as a cause for a Cell to be non-terminal. This is for LeafPlugOccurrences to consider the terminals of those cells. - Change: In ApParser, makes use of the new Pad flag in Catalog. --- crlcore/etc/environment.alliance.xml | 2 +- crlcore/src/ccore/Catalog.cpp | 1 + crlcore/src/ccore/Environment.cpp | 28 ++++++++--------- crlcore/src/ccore/alliance/ap/ApParser.cpp | 10 ++++-- crlcore/src/ccore/crlcore/AllianceFramework.h | 15 +++++---- crlcore/src/ccore/crlcore/Catalog.h | 31 ++++++++++++++++--- crlcore/src/ccore/crlcore/Environment.h | 12 +++---- crlcore/src/ccore/iccad04/Iccad04Lefdef.cpp | 2 +- crlcore/src/ccore/lefdef/LefExport.cpp | 10 +++--- crlcore/src/ccore/lefdef/LefParser.cpp | 20 ++++++------ 10 files changed, 80 insertions(+), 51 deletions(-) diff --git a/crlcore/etc/environment.alliance.xml b/crlcore/etc/environment.alliance.xml index 367ed251..db126178 100644 --- a/crlcore/etc/environment.alliance.xml +++ b/crlcore/etc/environment.alliance.xml @@ -42,6 +42,6 @@ vdd vss ^do_not_find_ck$ - ^obstacleNet$ + ^blockageNet$ diff --git a/crlcore/src/ccore/Catalog.cpp b/crlcore/src/ccore/Catalog.cpp index 196fb3da..704cb9c5 100644 --- a/crlcore/src/ccore/Catalog.cpp +++ b/crlcore/src/ccore/Catalog.cpp @@ -67,6 +67,7 @@ namespace CRL { if ( isFlattenLeaf() ) s += 'C'; if ( isFeed() ) s += 'F'; + if ( isPad() ) s += 'P'; if ( isGds() ) s += 'G'; if ( isDelete() ) s += 'D'; diff --git a/crlcore/src/ccore/Environment.cpp b/crlcore/src/ccore/Environment.cpp index 4dc8e36b..a7b41e52 100644 --- a/crlcore/src/ccore/Environment.cpp +++ b/crlcore/src/ccore/Environment.cpp @@ -90,7 +90,7 @@ namespace { , TagsPOWER , TagsGROUND , TagsClock - , TagsObstacle + , TagsBlockage , TagsTableSize }; enum State { HurricaneTechnology = 1 @@ -140,7 +140,7 @@ namespace { void parsePOWER (); void parseGROUND (); void parseClock (); - void parseObstacle (); + void parseBlockage (); virtual void _postLoad (); virtual const char* _getMessage ( MessageId id ); @@ -185,7 +185,7 @@ namespace { addTagEntry ( TagsSignals , "vdd" , (tagParser_t)&XmlEnvironmentParser::parsePOWER ); addTagEntry ( TagsSignals , "vss" , (tagParser_t)&XmlEnvironmentParser::parseGROUND ); addTagEntry ( TagsSignals , "clock" , (tagParser_t)&XmlEnvironmentParser::parseClock ); - addTagEntry ( TagsSignals , "obstacle" , (tagParser_t)&XmlEnvironmentParser::parseObstacle ); + addTagEntry ( TagsSignals , "blockage" , (tagParser_t)&XmlEnvironmentParser::parseBlockage ); setVariable ( "CORIOLIS_TOP", _environment.getCORIOLIS_TOP() ); } @@ -487,9 +487,9 @@ namespace { } - void XmlEnvironmentParser::parseObstacle () + void XmlEnvironmentParser::parseBlockage () { - _environment.setOBSTACLE ( readTextAsString().toStdString().c_str() ); + _environment.setBLOCKAGE ( readTextAsString().toStdString().c_str() ); } @@ -541,7 +541,7 @@ namespace CRL { setPOWER ( "vdd" ); setGROUND ( "vss" ); setCLOCK ( "^ck$" ); - setOBSTACLE ( "^obs$" ); + setBLOCKAGE ( "^obs$" ); setPad ( "^.*_px$" ); _LIBRARIES.append ( "." ); @@ -555,7 +555,7 @@ namespace CRL { regfree ( &_PowerRegex ); regfree ( &_GroundRegex ); regfree ( &_ClockRegex ); - regfree ( &_ObstacleRegex ); + regfree ( &_BlockageRegex ); regfree ( &_padRegex ); } @@ -594,9 +594,9 @@ namespace CRL { } - bool Environment::isOBSTACLE ( const char* name ) const + bool Environment::isBLOCKAGE ( const char* name ) const { - return regexec ( &_ObstacleRegex, name, 0, NULL, 0 ) == 0; + return regexec ( &_BlockageRegex, name, 0, NULL, 0 ) == 0; } @@ -627,10 +627,10 @@ namespace CRL { } - void Environment::setOBSTACLE ( const char* value ) + void Environment::setBLOCKAGE ( const char* value ) { - _OBSTACLE = value; - _setRegex ( &_ObstacleRegex , _OBSTACLE , "Obstacle" ); + _BLOCKAGE = value; + _setRegex ( &_BlockageRegex , _BLOCKAGE , "Blockage" ); } @@ -679,7 +679,7 @@ namespace CRL { << " - Power Signal := \"" << _POWER << "\"\n" << " - Ground Signal := \"" << _GROUND << "\"\n" << " - Clock Signal := \"" << _CLOCK << "\"\n" - << " - Obstacles := \"" << _OBSTACLE << "\"\n" + << " - Blockages := \"" << _BLOCKAGE << "\"\n" << " o Special Cells.\n" << " - Pads := \"" << _pad << "\"\n\n"; @@ -778,7 +778,7 @@ namespace CRL { record->add ( getSlot ( "_POWER" , &_POWER ) ); record->add ( getSlot ( "_GROUND" , &_GROUND ) ); record->add ( getSlot ( "_CLOCK" , &_CLOCK ) ); - record->add ( getSlot ( "_OBSTACLE" , &_OBSTACLE ) ); + record->add ( getSlot ( "_BLOCKAGE" , &_BLOCKAGE ) ); record->add ( getSlot ( "_pad" , &_pad ) ); record->add ( getSlot ( "_LIBRARIES" , &_LIBRARIES ) ); return record; diff --git a/crlcore/src/ccore/alliance/ap/ApParser.cpp b/crlcore/src/ccore/alliance/ap/ApParser.cpp index 37858e4a..c628a9b8 100644 --- a/crlcore/src/ccore/alliance/ap/ApParser.cpp +++ b/crlcore/src/ccore/alliance/ap/ApParser.cpp @@ -478,7 +478,7 @@ namespace { void ApParser::_parseConnector () { - static DbU::Unit XCON, YCON, WIDTH; + static DbU::Unit XCON, YCON, WIDTH; static unsigned int index; static char pinName[1024]; static Net* net; @@ -700,8 +700,9 @@ namespace { ); instance->setPlacementStatus ( Instance::PlacementStatus::FIXED ); } else { + bool ignoreInstance = (masterCellName == padreal); Catalog::State* instanceState = _framework->getCatalog()->getState ( masterCellName ); - if ( (masterCellName != padreal) and ( not instanceState or (not instanceState->isFeed()) ) ) { + if ( not ignoreInstance and ( not instanceState or (not instanceState->isFeed()) ) ) { _printError ( false , "No logical instance associated to physical instance %s." , getString(instanceName).c_str() @@ -722,6 +723,8 @@ namespace { return; } + ignoreInstance = ignoreInstance and _cell->isTerminal(); + instance = Instance::create ( _cell , instanceName , masterCell @@ -733,7 +736,7 @@ namespace { , Instance::PlacementStatus::FIXED , true // Checking of recursive calls ); - _cell->setTerminal ( false ); + _cell->setTerminal ( ignoreInstance ); } } } @@ -786,6 +789,7 @@ namespace { _state = catalogProperty->getState (); _state->setPhysical ( true ); if ( _state->isFlattenLeaf() ) _cell->setFlattenLeaf ( true ); + if ( _framework->isPad(_cell) ) _state->setPad ( true ); IoFile fileStream ( cellPath ); fileStream.open ( "r" ); diff --git a/crlcore/src/ccore/crlcore/AllianceFramework.h b/crlcore/src/ccore/crlcore/AllianceFramework.h index 8d54f911..6ed7aed9 100644 --- a/crlcore/src/ccore/crlcore/AllianceFramework.h +++ b/crlcore/src/ccore/crlcore/AllianceFramework.h @@ -39,6 +39,7 @@ namespace CRL { using Hurricane::Cell; + using Hurricane::Net; class RoutingGauge; class CellGauge; @@ -65,9 +66,10 @@ namespace CRL { inline bool isCLOCK ( const char* name ); inline bool isCLOCK ( const string& name ); inline bool isCLOCK ( const Name& name ); - inline bool isOBSTACLE ( const char* name ); - inline bool isOBSTACLE ( const string& name ); - inline bool isOBSTACLE ( const Name& name ); + inline bool isBLOCKAGE ( const char* name ); + inline bool isBLOCKAGE ( const string& name ); + inline bool isBLOCKAGE ( const Name& name ); + inline bool isBLOCKAGE ( const Net* net ); inline bool isPad ( const char* name ); inline bool isPad ( const string& name ); inline bool isPad ( const Name& name ); @@ -143,9 +145,10 @@ namespace CRL { inline bool AllianceFramework::isCLOCK ( const char* name ) { return _environment.isCLOCK(name); } inline bool AllianceFramework::isCLOCK ( const string& name ) { return isCLOCK(name.c_str()); } inline bool AllianceFramework::isCLOCK ( const Name& name ) { return isCLOCK(getString(name)); } - inline bool AllianceFramework::isOBSTACLE ( const char* name ) { return _environment.isOBSTACLE(name); } - inline bool AllianceFramework::isOBSTACLE ( const string& name ) { return isOBSTACLE(name.c_str()); } - inline bool AllianceFramework::isOBSTACLE ( const Name& name ) { return isOBSTACLE(getString(name)); } + inline bool AllianceFramework::isBLOCKAGE ( const char* name ) { return _environment.isBLOCKAGE(name); } + inline bool AllianceFramework::isBLOCKAGE ( const string& name ) { return isBLOCKAGE(name.c_str()); } + inline bool AllianceFramework::isBLOCKAGE ( const Name& name ) { return isBLOCKAGE(getString(name)); } + inline bool AllianceFramework::isBLOCKAGE ( const Net* net ) { return isBLOCKAGE(net->getName()); } inline bool AllianceFramework::isPad ( const char* name ) { return _environment.isPad(name); } inline bool AllianceFramework::isPad ( const string& name ) { return isPad(name.c_str()); } inline bool AllianceFramework::isPad ( const Name& name ) { return isPad(getString(name)); } diff --git a/crlcore/src/ccore/crlcore/Catalog.h b/crlcore/src/ccore/crlcore/Catalog.h index 78a41249..31b66e43 100644 --- a/crlcore/src/ccore/crlcore/Catalog.h +++ b/crlcore/src/ccore/crlcore/Catalog.h @@ -86,11 +86,12 @@ namespace CRL { // Flags Constants. enum Flags { FlattenLeaf = 1 << 0 , Feed = 1 << 1 - , GDS = 1 << 2 - , Delete = 1 << 3 - , Logical = 1 << 4 - , Physical = 1 << 5 - , InMemory = 1 << 6 + , Pad = 1 << 2 + , GDS = 1 << 3 + , Delete = 1 << 4 + , Logical = 1 << 5 + , Physical = 1 << 6 + , InMemory = 1 << 7 , Views = Physical|Logical }; // Constructors. @@ -99,6 +100,7 @@ namespace CRL { // Predicates. inline bool isFlattenLeaf () const; inline bool isFeed () const; + inline bool isPad () const; inline bool isGds () const; inline bool isDelete () const; inline bool isPhysical () const; @@ -108,6 +110,7 @@ namespace CRL { inline bool setFlags ( unsigned int mask, bool value ); inline bool setFlattenLeaf ( bool value ); inline bool setFeed ( bool value ); + inline bool setPad ( bool value ); inline bool setGds ( bool value ); inline bool setDelete ( bool value ); inline bool setPhysical ( bool value ); @@ -180,6 +183,7 @@ namespace CRL { inline Catalog::State::State () : _flags(0), _depth(1), _cell(NULL), _library(NULL) { } inline bool Catalog::State::isFlattenLeaf () const { return (_flags&FlattenLeaf)?1:0; } inline bool Catalog::State::isFeed () const { return (_flags&Feed )?1:0; } + inline bool Catalog::State::isPad () const { return (_flags&Pad )?1:0; } inline bool Catalog::State::isGds () const { return (_flags&GDS )?1:0; } inline bool Catalog::State::isDelete () const { return (_flags&Delete )?1:0; } inline bool Catalog::State::isPhysical () const { return (_flags&Physical )?1:0; } @@ -194,6 +198,7 @@ namespace CRL { } inline bool Catalog::State::setFlattenLeaf ( bool value ) { return setFlags(FlattenLeaf,value); } inline bool Catalog::State::setFeed ( bool value ) { return setFlags(Feed ,value); } + inline bool Catalog::State::setPad ( bool value ) { return setFlags(Pad ,value); } inline bool Catalog::State::setGds ( bool value ) { return setFlags(GDS ,value); } inline bool Catalog::State::setDelete ( bool value ) { return setFlags(Delete ,value); } inline bool Catalog::State::setPhysical ( bool value ) { return setFlags(Physical ,value); } @@ -224,6 +229,7 @@ namespace CRL { public: static inline bool isFlattenLeaf ( const Cell* ); static inline bool isFeed ( const Cell* ); + static inline bool isPad ( const Cell* ); static inline bool isGds ( const Cell* ); static inline bool isDelete ( const Cell* ); static inline bool isPhysical ( const Cell* ); @@ -233,6 +239,7 @@ namespace CRL { static inline bool setFlags ( const Cell*, unsigned int mask, bool value ); static inline bool setFlattenLeaf ( const Cell*, bool value ); static inline bool setFeed ( const Cell*, bool value ); + static inline bool setPad ( const Cell*, bool value ); static inline bool setGds ( const Cell*, bool value ); static inline bool setDelete ( const Cell*, bool value ); static inline bool setPhysical ( const Cell*, bool value ); @@ -272,6 +279,13 @@ namespace CRL { } + inline bool CatalogExtension::isPad ( const Cell* cell ) + { + Catalog::State* state = _get(cell); + return (state == NULL) ? false : state->isPad(); + } + + inline bool CatalogExtension::isDelete ( const Cell* cell ) { Catalog::State* state = _get(cell); @@ -321,6 +335,13 @@ namespace CRL { } + inline bool CatalogExtension::setPad ( const Cell* cell, bool value ) + { + Catalog::State* state = _get(cell); + return (state == NULL) ? false : state->setPad(value); + } + + inline bool CatalogExtension::setGds ( const Cell* cell, bool value ) { Catalog::State* state = _get(cell); diff --git a/crlcore/src/ccore/crlcore/Environment.h b/crlcore/src/ccore/crlcore/Environment.h index ced3f042..21052d40 100644 --- a/crlcore/src/ccore/crlcore/Environment.h +++ b/crlcore/src/ccore/crlcore/Environment.h @@ -60,7 +60,7 @@ namespace CRL { inline const std::string& getPOWER () const; inline const std::string& getGROUND () const; inline const std::string& getCLOCK () const; - inline const std::string& getOBSTACLE () const; + inline const std::string& getBLOCKAGE () const; inline const std::string& getPad () const; inline const std::string& getCATALOG () const; inline SearchPath& getLIBRARIES (); @@ -69,7 +69,7 @@ namespace CRL { bool isPOWER ( const char* name ) const; bool isGROUND ( const char* name ) const; bool isCLOCK ( const char* name ) const; - bool isOBSTACLE ( const char* name ) const; + bool isBLOCKAGE ( const char* name ) const; bool isPad ( const char* name ) const; // Modifiers. @@ -87,7 +87,7 @@ namespace CRL { void setPOWER ( const char* value ); void setGROUND ( const char* value ); void setCLOCK ( const char* value ); - void setOBSTACLE ( const char* value ); + void setBLOCKAGE ( const char* value ); void setPad ( const char* value ); inline void setCATALOG ( const char* value ); inline void setWORKING_LIBRARY ( const char* value ); @@ -114,14 +114,14 @@ namespace CRL { std::string _POWER; std::string _GROUND; std::string _CLOCK; - std::string _OBSTACLE; + std::string _BLOCKAGE; std::string _pad; std::string _CATALOG; SearchPath _LIBRARIES; regex_t _PowerRegex; regex_t _GroundRegex; regex_t _ClockRegex; - regex_t _ObstacleRegex; + regex_t _BlockageRegex; regex_t _padRegex; bool _inConstructor; @@ -145,7 +145,7 @@ namespace CRL { inline const std::string& Environment::getPOWER () const { return _POWER; } inline const std::string& Environment::getGROUND () const { return _GROUND; } inline const std::string& Environment::getCLOCK () const { return _CLOCK; } - inline const std::string& Environment::getOBSTACLE () const { return _OBSTACLE; } + inline const std::string& Environment::getBLOCKAGE () const { return _BLOCKAGE; } inline const std::string& Environment::getPad () const { return _pad; } inline const std::string& Environment::getCATALOG () const { return _CATALOG; } inline SearchPath& Environment::getLIBRARIES () { return _LIBRARIES; } diff --git a/crlcore/src/ccore/iccad04/Iccad04Lefdef.cpp b/crlcore/src/ccore/iccad04/Iccad04Lefdef.cpp index b65e67ed..3bd54a45 100644 --- a/crlcore/src/ccore/iccad04/Iccad04Lefdef.cpp +++ b/crlcore/src/ccore/iccad04/Iccad04Lefdef.cpp @@ -428,7 +428,7 @@ namespace { DbU::Unit axis = (sliceHeight * (slices-2)) / 2 + sliceHeight; DbU::Unit width = sliceHeight * (slices-2); - Net* net = Net::create ( cell, "obstacleNet" ); + Net* net = Net::create ( cell, "blockageNet" ); Horizontal::create ( net , BLOCKAGE2 diff --git a/crlcore/src/ccore/lefdef/LefExport.cpp b/crlcore/src/ccore/lefdef/LefExport.cpp index e986153c..473488be 100644 --- a/crlcore/src/ccore/lefdef/LefExport.cpp +++ b/crlcore/src/ccore/lefdef/LefExport.cpp @@ -294,12 +294,12 @@ namespace { } } - Net* obstacleNet = NULL; + Net* blockageNet = NULL; forEach ( Net*, inet, cell->getNets() ) { Net* net = *inet; - if ( (obstacleNet == NULL) and _framework->isOBSTACLE(net->getName()) ) - obstacleNet = net; + if ( (blockageNet == NULL) and _framework->isBLOCKAGE(net->getName()) ) + blockageNet = net; if ( not net->isExternal() ) continue; @@ -380,12 +380,12 @@ namespace { CHECK_STATUS(_status); #endif - if ( obstacleNet != 0 ) { + if ( blockageNet != 0 ) { _status = lefwStartMacroObs (); CHECK_STATUS(_status); const Layer* blockageLayer = NULL; - forEach ( Component*, icomponent, obstacleNet->getComponents() ) { + forEach ( Component*, icomponent, blockageNet->getComponents() ) { if ( dynamic_cast(*icomponent) == NULL ) continue; if ( blockageLayer != (*icomponent)->getLayer() ) { diff --git a/crlcore/src/ccore/lefdef/LefParser.cpp b/crlcore/src/ccore/lefdef/LefParser.cpp index c7261fdc..b04f744e 100644 --- a/crlcore/src/ccore/lefdef/LefParser.cpp +++ b/crlcore/src/ccore/lefdef/LefParser.cpp @@ -105,15 +105,15 @@ namespace { void Obstruction ( Cell* cell, Layer* layer, const Box& bb ) { - Net* obsNet = cell->getNet ( "obstaclenet" ); + Net* blockageNet = cell->getNet ( "blockagenet" ); if (!layer) - throw Error("No layer for obstacle"); + throw Error("No layer for blockage"); - if ( obsNet == NULL ) - obsNet = Net::create ( cell, "obstaclenet" ); + if ( blockageNet == NULL ) + blockageNet = Net::create ( cell, "blockagenet" ); - Pad::create ( obsNet, layer, bb ); + Pad::create ( blockageNet, layer, bb ); } @@ -292,12 +292,12 @@ namespace CRL { if (!layer) throw Error("Unknown Layer: " + string(geom->getLayer(i))); BasicLayer* basicLayer = dynamic_cast(layer); - const Name* obstacleLayerName = getObstacleLayerName(basicLayer); - if (obstacleLayerName) - layer = technology->getLayer(*obstacleLayerName); + const Name* blockageLayerName = getBlockageLayerName(basicLayer); + if (blockageLayerName) + layer = technology->getLayer(*blockageLayerName); if (!layer) - if (obstacleLayerName) - throw Error("Unknown layer: " + obstacleLayerName->_getString()); + if (blockageLayerName) + throw Error("Unknown layer: " + blockageLayerName->_getString()); else throw Error("Unknow Layer: (null) Name"); break;