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;