* ./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>
|
||||
<vss>vss</vss>
|
||||
<clock>^do_not_find_ck$</clock>
|
||||
<obstacle>^obstacleNet$</obstacle>
|
||||
<blockage>^blockageNet$</blockage>
|
||||
</signals>
|
||||
</environment>
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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" );
|
||||
|
|
|
@ -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)); }
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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<Segment*>(*icomponent) == NULL ) continue;
|
||||
|
||||
if ( blockageLayer != (*icomponent)->getLayer() ) {
|
||||
|
|
|
@ -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<BasicLayer*>(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;
|
||||
|
|
Loading…
Reference in New Issue