* ./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:
parent
828b1d6b6f
commit
c86e720066
|
@ -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>
|
||||||
|
|
|
@ -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';
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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" );
|
||||||
|
|
|
@ -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)); }
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() ) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue