Prefix all Cell from a GDS file with "gds_" to avoid cell overload.

* Bug: In CRL::GdsParser, the PLL was using copies of the standard cell
    with the same name. And unfortunately, they where found *before*
    the FlexLib one when using DataBase::getCell(). As their I/O where
    wrong it was leading to a massive netlist connexion corruption in
    blif2vst.
      To avoid that, any Cell created by the GDS parser is now prefixed
    by "gds_".
* Change: In CRL::GdsStream CTOR, report when the file cannot be opened
    instead of saying that the GDS file is corrupted (misleading).
This commit is contained in:
Jean-Paul Chaput 2021-04-09 13:55:08 +02:00
parent 3eb3f52bc8
commit 3276950ec4
1 changed files with 12 additions and 4 deletions

View File

@ -745,6 +745,13 @@ namespace {
if (_gdsLayerTable.empty()) _staticInit(); if (_gdsLayerTable.empty()) _staticInit();
_stream.open( gdsPath, ios_base::in|ios_base::binary ); _stream.open( gdsPath, ios_base::in|ios_base::binary );
if (not _stream.is_open()) {
cerr << Error( "GdsStream::GdsStream(): Unable to open stream, check path.\n"
" \"%s\""
, _gdsPath.c_str() ) << endl;
_validSyntax = false;
return;
}
_stream >> _record; _stream >> _record;
if (not _record.isHEADER()) { if (not _record.isHEADER()) {
@ -857,13 +864,14 @@ namespace {
if (_record.isSTRNAME()) { if (_record.isSTRNAME()) {
if (_library) { if (_library) {
_cell = _library->getCell( _record.getName() ); string cellName = "gds_" + _record.getName();
_cell = _library->getCell( cellName );
if (not _cell) { if (not _cell) {
cerr << Warning( "GdsStream::readStructure(): No Cell named \"%s\" in Library \"%s\" (created)." cerr << Warning( "GdsStream::readStructure(): No Cell named \"gds_%s\" in Library \"%s\" (created)."
, _record.getName().c_str() , _record.getName().c_str()
, getString(_library).c_str() , getString(_library).c_str()
) << endl; ) << endl;
_cell = Cell::create( _library, _record.getName() ); _cell = Cell::create( _library, cellName );
} }
} }
_stream >> _record; _stream >> _record;
@ -1192,7 +1200,7 @@ namespace {
// << " " << Transformation(xpos,ypos,orient) // << " " << Transformation(xpos,ypos,orient)
// << " in " << _cell << endl; // << " in " << _cell << endl;
_delayedInstances.push_back( DelayedInstance( _cell _delayedInstances.push_back( DelayedInstance( _cell
, masterName , "gds_" + masterName
, Transformation(xpos,ypos,orient)) ); , Transformation(xpos,ypos,orient)) );
} }