* ./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.
This commit is contained in:
Jean-Paul Chaput 2010-12-04 15:23:51 +00:00
parent 828b1d6b6f
commit c86e720066
10 changed files with 80 additions and 51 deletions

View File

@ -42,6 +42,6 @@
<vdd>vdd</vdd> <vdd>vdd</vdd>
<vss>vss</vss> <vss>vss</vss>
<clock>^do_not_find_ck$</clock> <clock>^do_not_find_ck$</clock>
<obstacle>^obstacleNet$</obstacle> <blockage>^blockageNet$</blockage>
</signals> </signals>
</environment> </environment>

View File

@ -67,6 +67,7 @@ namespace CRL {
if ( isFlattenLeaf() ) s += 'C'; if ( isFlattenLeaf() ) s += 'C';
if ( isFeed() ) s += 'F'; if ( isFeed() ) s += 'F';
if ( isPad() ) s += 'P';
if ( isGds() ) s += 'G'; if ( isGds() ) s += 'G';
if ( isDelete() ) s += 'D'; if ( isDelete() ) s += 'D';

View File

@ -90,7 +90,7 @@ namespace {
, TagsPOWER , TagsPOWER
, TagsGROUND , TagsGROUND
, TagsClock , TagsClock
, TagsObstacle , TagsBlockage
, TagsTableSize , TagsTableSize
}; };
enum State { HurricaneTechnology = 1 enum State { HurricaneTechnology = 1
@ -140,7 +140,7 @@ namespace {
void parsePOWER (); void parsePOWER ();
void parseGROUND (); void parseGROUND ();
void parseClock (); void parseClock ();
void parseObstacle (); void parseBlockage ();
virtual void _postLoad (); virtual void _postLoad ();
virtual const char* _getMessage ( MessageId id ); virtual const char* _getMessage ( MessageId id );
@ -185,7 +185,7 @@ namespace {
addTagEntry ( TagsSignals , "vdd" , (tagParser_t)&XmlEnvironmentParser::parsePOWER ); addTagEntry ( TagsSignals , "vdd" , (tagParser_t)&XmlEnvironmentParser::parsePOWER );
addTagEntry ( TagsSignals , "vss" , (tagParser_t)&XmlEnvironmentParser::parseGROUND ); addTagEntry ( TagsSignals , "vss" , (tagParser_t)&XmlEnvironmentParser::parseGROUND );
addTagEntry ( TagsSignals , "clock" , (tagParser_t)&XmlEnvironmentParser::parseClock ); 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() ); 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" ); setPOWER ( "vdd" );
setGROUND ( "vss" ); setGROUND ( "vss" );
setCLOCK ( "^ck$" ); setCLOCK ( "^ck$" );
setOBSTACLE ( "^obs$" ); setBLOCKAGE ( "^obs$" );
setPad ( "^.*_px$" ); setPad ( "^.*_px$" );
_LIBRARIES.append ( "." ); _LIBRARIES.append ( "." );
@ -555,7 +555,7 @@ namespace CRL {
regfree ( &_PowerRegex ); regfree ( &_PowerRegex );
regfree ( &_GroundRegex ); regfree ( &_GroundRegex );
regfree ( &_ClockRegex ); regfree ( &_ClockRegex );
regfree ( &_ObstacleRegex ); regfree ( &_BlockageRegex );
regfree ( &_padRegex ); 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; _BLOCKAGE = value;
_setRegex ( &_ObstacleRegex , _OBSTACLE , "Obstacle" ); _setRegex ( &_BlockageRegex , _BLOCKAGE , "Blockage" );
} }
@ -679,7 +679,7 @@ namespace CRL {
<< " - Power Signal := \"" << _POWER << "\"\n" << " - Power Signal := \"" << _POWER << "\"\n"
<< " - Ground Signal := \"" << _GROUND << "\"\n" << " - Ground Signal := \"" << _GROUND << "\"\n"
<< " - Clock Signal := \"" << _CLOCK << "\"\n" << " - Clock Signal := \"" << _CLOCK << "\"\n"
<< " - Obstacles := \"" << _OBSTACLE << "\"\n" << " - Blockages := \"" << _BLOCKAGE << "\"\n"
<< " o Special Cells.\n" << " o Special Cells.\n"
<< " - Pads := \"" << _pad << "\"\n\n"; << " - Pads := \"" << _pad << "\"\n\n";
@ -778,7 +778,7 @@ namespace CRL {
record->add ( getSlot ( "_POWER" , &_POWER ) ); record->add ( getSlot ( "_POWER" , &_POWER ) );
record->add ( getSlot ( "_GROUND" , &_GROUND ) ); record->add ( getSlot ( "_GROUND" , &_GROUND ) );
record->add ( getSlot ( "_CLOCK" , &_CLOCK ) ); record->add ( getSlot ( "_CLOCK" , &_CLOCK ) );
record->add ( getSlot ( "_OBSTACLE" , &_OBSTACLE ) ); record->add ( getSlot ( "_BLOCKAGE" , &_BLOCKAGE ) );
record->add ( getSlot ( "_pad" , &_pad ) ); record->add ( getSlot ( "_pad" , &_pad ) );
record->add ( getSlot ( "_LIBRARIES" , &_LIBRARIES ) ); record->add ( getSlot ( "_LIBRARIES" , &_LIBRARIES ) );
return record; return record;

View File

@ -478,7 +478,7 @@ namespace {
void ApParser::_parseConnector () void ApParser::_parseConnector ()
{ {
static DbU::Unit XCON, YCON, WIDTH; static DbU::Unit XCON, YCON, WIDTH;
static unsigned int index; static unsigned int index;
static char pinName[1024]; static char pinName[1024];
static Net* net; static Net* net;
@ -700,8 +700,9 @@ namespace {
); );
instance->setPlacementStatus ( Instance::PlacementStatus::FIXED ); instance->setPlacementStatus ( Instance::PlacementStatus::FIXED );
} else { } else {
bool ignoreInstance = (masterCellName == padreal);
Catalog::State* instanceState = _framework->getCatalog()->getState ( masterCellName ); 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 _printError ( false
, "No logical instance associated to physical instance %s." , "No logical instance associated to physical instance %s."
, getString(instanceName).c_str() , getString(instanceName).c_str()
@ -722,6 +723,8 @@ namespace {
return; return;
} }
ignoreInstance = ignoreInstance and _cell->isTerminal();
instance = Instance::create ( _cell instance = Instance::create ( _cell
, instanceName , instanceName
, masterCell , masterCell
@ -733,7 +736,7 @@ namespace {
, Instance::PlacementStatus::FIXED , Instance::PlacementStatus::FIXED
, true // Checking of recursive calls , true // Checking of recursive calls
); );
_cell->setTerminal ( false ); _cell->setTerminal ( ignoreInstance );
} }
} }
} }
@ -786,6 +789,7 @@ namespace {
_state = catalogProperty->getState (); _state = catalogProperty->getState ();
_state->setPhysical ( true ); _state->setPhysical ( true );
if ( _state->isFlattenLeaf() ) _cell->setFlattenLeaf ( true ); if ( _state->isFlattenLeaf() ) _cell->setFlattenLeaf ( true );
if ( _framework->isPad(_cell) ) _state->setPad ( true );
IoFile fileStream ( cellPath ); IoFile fileStream ( cellPath );
fileStream.open ( "r" ); fileStream.open ( "r" );

View File

@ -39,6 +39,7 @@
namespace CRL { namespace CRL {
using Hurricane::Cell; using Hurricane::Cell;
using Hurricane::Net;
class RoutingGauge; class RoutingGauge;
class CellGauge; class CellGauge;
@ -65,9 +66,10 @@ namespace CRL {
inline bool isCLOCK ( const char* name ); inline bool isCLOCK ( const char* name );
inline bool isCLOCK ( const string& name ); inline bool isCLOCK ( const string& name );
inline bool isCLOCK ( const Name& name ); inline bool isCLOCK ( const Name& name );
inline bool isOBSTACLE ( const char* name ); inline bool isBLOCKAGE ( const char* name );
inline bool isOBSTACLE ( const string& name ); inline bool isBLOCKAGE ( const string& name );
inline bool isOBSTACLE ( const Name& name ); inline bool isBLOCKAGE ( const Name& name );
inline bool isBLOCKAGE ( const Net* net );
inline bool isPad ( const char* name ); inline bool isPad ( const char* name );
inline bool isPad ( const string& name ); inline bool isPad ( const string& name );
inline bool isPad ( const Name& 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 char* name ) { return _environment.isCLOCK(name); }
inline bool AllianceFramework::isCLOCK ( const string& name ) { return isCLOCK(name.c_str()); } 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::isCLOCK ( const Name& name ) { return isCLOCK(getString(name)); }
inline bool AllianceFramework::isOBSTACLE ( const char* name ) { return _environment.isOBSTACLE(name); } inline bool AllianceFramework::isBLOCKAGE ( const char* name ) { return _environment.isBLOCKAGE(name); }
inline bool AllianceFramework::isOBSTACLE ( const string& name ) { return isOBSTACLE(name.c_str()); } inline bool AllianceFramework::isBLOCKAGE ( const string& name ) { return isBLOCKAGE(name.c_str()); }
inline bool AllianceFramework::isOBSTACLE ( const Name& name ) { return isOBSTACLE(getString(name)); } 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 char* name ) { return _environment.isPad(name); }
inline bool AllianceFramework::isPad ( const string& name ) { return isPad(name.c_str()); } inline bool AllianceFramework::isPad ( const string& name ) { return isPad(name.c_str()); }
inline bool AllianceFramework::isPad ( const Name& name ) { return isPad(getString(name)); } inline bool AllianceFramework::isPad ( const Name& name ) { return isPad(getString(name)); }

View File

@ -86,11 +86,12 @@ namespace CRL {
// Flags Constants. // Flags Constants.
enum Flags { FlattenLeaf = 1 << 0 enum Flags { FlattenLeaf = 1 << 0
, Feed = 1 << 1 , Feed = 1 << 1
, GDS = 1 << 2 , Pad = 1 << 2
, Delete = 1 << 3 , GDS = 1 << 3
, Logical = 1 << 4 , Delete = 1 << 4
, Physical = 1 << 5 , Logical = 1 << 5
, InMemory = 1 << 6 , Physical = 1 << 6
, InMemory = 1 << 7
, Views = Physical|Logical , Views = Physical|Logical
}; };
// Constructors. // Constructors.
@ -99,6 +100,7 @@ namespace CRL {
// Predicates. // Predicates.
inline bool isFlattenLeaf () const; inline bool isFlattenLeaf () const;
inline bool isFeed () const; inline bool isFeed () const;
inline bool isPad () const;
inline bool isGds () const; inline bool isGds () const;
inline bool isDelete () const; inline bool isDelete () const;
inline bool isPhysical () const; inline bool isPhysical () const;
@ -108,6 +110,7 @@ namespace CRL {
inline bool setFlags ( unsigned int mask, bool value ); inline bool setFlags ( unsigned int mask, bool value );
inline bool setFlattenLeaf ( bool value ); inline bool setFlattenLeaf ( bool value );
inline bool setFeed ( bool value ); inline bool setFeed ( bool value );
inline bool setPad ( bool value );
inline bool setGds ( bool value ); inline bool setGds ( bool value );
inline bool setDelete ( bool value ); inline bool setDelete ( bool value );
inline bool setPhysical ( 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 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::isFlattenLeaf () const { return (_flags&FlattenLeaf)?1:0; }
inline bool Catalog::State::isFeed () const { return (_flags&Feed )?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::isGds () const { return (_flags&GDS )?1:0; }
inline bool Catalog::State::isDelete () const { return (_flags&Delete )?1:0; } inline bool Catalog::State::isDelete () const { return (_flags&Delete )?1:0; }
inline bool Catalog::State::isPhysical () const { return (_flags&Physical )?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::setFlattenLeaf ( bool value ) { return setFlags(FlattenLeaf,value); }
inline bool Catalog::State::setFeed ( bool value ) { return setFlags(Feed ,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::setGds ( bool value ) { return setFlags(GDS ,value); }
inline bool Catalog::State::setDelete ( bool value ) { return setFlags(Delete ,value); } inline bool Catalog::State::setDelete ( bool value ) { return setFlags(Delete ,value); }
inline bool Catalog::State::setPhysical ( bool value ) { return setFlags(Physical ,value); } inline bool Catalog::State::setPhysical ( bool value ) { return setFlags(Physical ,value); }
@ -224,6 +229,7 @@ namespace CRL {
public: public:
static inline bool isFlattenLeaf ( const Cell* ); static inline bool isFlattenLeaf ( const Cell* );
static inline bool isFeed ( const Cell* ); static inline bool isFeed ( const Cell* );
static inline bool isPad ( const Cell* );
static inline bool isGds ( const Cell* ); static inline bool isGds ( const Cell* );
static inline bool isDelete ( const Cell* ); static inline bool isDelete ( const Cell* );
static inline bool isPhysical ( 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 setFlags ( const Cell*, unsigned int mask, bool value );
static inline bool setFlattenLeaf ( const Cell*, bool value ); static inline bool setFlattenLeaf ( const Cell*, bool value );
static inline bool setFeed ( 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 setGds ( const Cell*, bool value );
static inline bool setDelete ( const Cell*, bool value ); static inline bool setDelete ( const Cell*, bool value );
static inline bool setPhysical ( 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 ) inline bool CatalogExtension::isDelete ( const Cell* cell )
{ {
Catalog::State* state = _get(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 ) inline bool CatalogExtension::setGds ( const Cell* cell, bool value )
{ {
Catalog::State* state = _get(cell); Catalog::State* state = _get(cell);

View File

@ -60,7 +60,7 @@ namespace CRL {
inline const std::string& getPOWER () const; inline const std::string& getPOWER () const;
inline const std::string& getGROUND () const; inline const std::string& getGROUND () const;
inline const std::string& getCLOCK () 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& getPad () const;
inline const std::string& getCATALOG () const; inline const std::string& getCATALOG () const;
inline SearchPath& getLIBRARIES (); inline SearchPath& getLIBRARIES ();
@ -69,7 +69,7 @@ namespace CRL {
bool isPOWER ( const char* name ) const; bool isPOWER ( const char* name ) const;
bool isGROUND ( const char* name ) const; bool isGROUND ( const char* name ) const;
bool isCLOCK ( 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; bool isPad ( const char* name ) const;
// Modifiers. // Modifiers.
@ -87,7 +87,7 @@ namespace CRL {
void setPOWER ( const char* value ); void setPOWER ( const char* value );
void setGROUND ( const char* value ); void setGROUND ( const char* value );
void setCLOCK ( const char* value ); void setCLOCK ( const char* value );
void setOBSTACLE ( const char* value ); void setBLOCKAGE ( const char* value );
void setPad ( const char* value ); void setPad ( const char* value );
inline void setCATALOG ( const char* value ); inline void setCATALOG ( const char* value );
inline void setWORKING_LIBRARY ( const char* value ); inline void setWORKING_LIBRARY ( const char* value );
@ -114,14 +114,14 @@ namespace CRL {
std::string _POWER; std::string _POWER;
std::string _GROUND; std::string _GROUND;
std::string _CLOCK; std::string _CLOCK;
std::string _OBSTACLE; std::string _BLOCKAGE;
std::string _pad; std::string _pad;
std::string _CATALOG; std::string _CATALOG;
SearchPath _LIBRARIES; SearchPath _LIBRARIES;
regex_t _PowerRegex; regex_t _PowerRegex;
regex_t _GroundRegex; regex_t _GroundRegex;
regex_t _ClockRegex; regex_t _ClockRegex;
regex_t _ObstacleRegex; regex_t _BlockageRegex;
regex_t _padRegex; regex_t _padRegex;
bool _inConstructor; bool _inConstructor;
@ -145,7 +145,7 @@ namespace CRL {
inline const std::string& Environment::getPOWER () const { return _POWER; } inline const std::string& Environment::getPOWER () const { return _POWER; }
inline const std::string& Environment::getGROUND () const { return _GROUND; } inline const std::string& Environment::getGROUND () const { return _GROUND; }
inline const std::string& Environment::getCLOCK () const { return _CLOCK; } 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::getPad () const { return _pad; }
inline const std::string& Environment::getCATALOG () const { return _CATALOG; } inline const std::string& Environment::getCATALOG () const { return _CATALOG; }
inline SearchPath& Environment::getLIBRARIES () { return _LIBRARIES; } inline SearchPath& Environment::getLIBRARIES () { return _LIBRARIES; }

View File

@ -428,7 +428,7 @@ namespace {
DbU::Unit axis = (sliceHeight * (slices-2)) / 2 + sliceHeight; DbU::Unit axis = (sliceHeight * (slices-2)) / 2 + sliceHeight;
DbU::Unit width = sliceHeight * (slices-2); DbU::Unit width = sliceHeight * (slices-2);
Net* net = Net::create ( cell, "obstacleNet" ); Net* net = Net::create ( cell, "blockageNet" );
Horizontal::create ( net Horizontal::create ( net
, BLOCKAGE2 , BLOCKAGE2

View File

@ -294,12 +294,12 @@ namespace {
} }
} }
Net* obstacleNet = NULL; Net* blockageNet = NULL;
forEach ( Net*, inet, cell->getNets() ) { forEach ( Net*, inet, cell->getNets() ) {
Net* net = *inet; Net* net = *inet;
if ( (obstacleNet == NULL) and _framework->isOBSTACLE(net->getName()) ) if ( (blockageNet == NULL) and _framework->isBLOCKAGE(net->getName()) )
obstacleNet = net; blockageNet = net;
if ( not net->isExternal() ) continue; if ( not net->isExternal() ) continue;
@ -380,12 +380,12 @@ namespace {
CHECK_STATUS(_status); CHECK_STATUS(_status);
#endif #endif
if ( obstacleNet != 0 ) { if ( blockageNet != 0 ) {
_status = lefwStartMacroObs (); _status = lefwStartMacroObs ();
CHECK_STATUS(_status); CHECK_STATUS(_status);
const Layer* blockageLayer = NULL; const Layer* blockageLayer = NULL;
forEach ( Component*, icomponent, obstacleNet->getComponents() ) { forEach ( Component*, icomponent, blockageNet->getComponents() ) {
if ( dynamic_cast<Segment*>(*icomponent) == NULL ) continue; if ( dynamic_cast<Segment*>(*icomponent) == NULL ) continue;
if ( blockageLayer != (*icomponent)->getLayer() ) { if ( blockageLayer != (*icomponent)->getLayer() ) {

View File

@ -105,15 +105,15 @@ namespace {
void Obstruction ( Cell* cell, Layer* layer, const Box& bb ) void Obstruction ( Cell* cell, Layer* layer, const Box& bb )
{ {
Net* obsNet = cell->getNet ( "obstaclenet" ); Net* blockageNet = cell->getNet ( "blockagenet" );
if (!layer) if (!layer)
throw Error("No layer for obstacle"); throw Error("No layer for blockage");
if ( obsNet == NULL ) if ( blockageNet == NULL )
obsNet = Net::create ( cell, "obstaclenet" ); blockageNet = Net::create ( cell, "blockagenet" );
Pad::create ( obsNet, layer, bb ); Pad::create ( blockageNet, layer, bb );
} }
@ -292,12 +292,12 @@ namespace CRL {
if (!layer) if (!layer)
throw Error("Unknown Layer: " + string(geom->getLayer(i))); throw Error("Unknown Layer: " + string(geom->getLayer(i)));
BasicLayer* basicLayer = dynamic_cast<BasicLayer*>(layer); BasicLayer* basicLayer = dynamic_cast<BasicLayer*>(layer);
const Name* obstacleLayerName = getObstacleLayerName(basicLayer); const Name* blockageLayerName = getBlockageLayerName(basicLayer);
if (obstacleLayerName) if (blockageLayerName)
layer = technology->getLayer(*obstacleLayerName); layer = technology->getLayer(*blockageLayerName);
if (!layer) if (!layer)
if (obstacleLayerName) if (blockageLayerName)
throw Error("Unknown layer: " + obstacleLayerName->_getString()); throw Error("Unknown layer: " + blockageLayerName->_getString());
else else
throw Error("Unknow Layer: (null) Name"); throw Error("Unknow Layer: (null) Name");
break; break;