Manage pads for external components in CRL::GdsParser.

* New: In CRM::GdsSteam::makeExternals(), now take into accounts Pad
    for Net external components. Also delete the original components
    after creating the copy in the right Net.
      So now the PLL terminals are correctly seen.
This commit is contained in:
Jean-Paul Chaput 2021-04-18 20:37:19 +02:00
parent 7d1e1f8c44
commit 3b6b588a74
1 changed files with 29 additions and 1 deletions

View File

@ -932,7 +932,7 @@ namespace {
_stream >> _record;
} else { _validSyntax = false; return _validSyntax; }
readTextbody( layer );
readTextbody( layer );
//cdebug(101,0) << "GdsStream::readText() - return:" << _validSyntax << endl;
return _validSyntax;
@ -985,6 +985,11 @@ namespace {
if (_record.isSTRING()) {
_text = _record.getName();
_stream >> _record;
if (not layer) {
cerr << Error( "GdsStream::readTextbody(): Discarted text is \"%s\"."
, _text.c_str()
) << endl;
}
}
else {
_validSyntax = false;
@ -1483,8 +1488,13 @@ namespace {
void GdsStream::addNetReference ( Net* net, const Layer* layer, DbU::Unit x, DbU::Unit y )
{
cdebug_log(101,0) << "addNetReference(): " << net << " " << layer << " "
<< DbU::getValueString(x) << " " << DbU::getValueString(y) << endl;
if (not layer) return;
string layerName = getString( layer->getName() );
auto inet = _netReferences.find( net );
if (inet == _netReferences.end()) {
_netReferences[ net ] = vector<PinPoint>();
@ -1510,6 +1520,8 @@ namespace {
<< " @" << ref._position
<< endl;
if (not layer) continue;
vector<Component*> toDestroy;
for ( Component* component : net->getCell()
->getComponentsUnder( Box(ref._position).inflate(1),layer->getMask() ) ) {
cdebug_log(101,0) << "| " << component << endl;
@ -1523,6 +1535,7 @@ namespace {
, href->getTargetX()
);
NetExternalComponents::setExternal( h );
toDestroy.push_back( component );
} else {
Vertical* vref = dynamic_cast<Vertical*>( component );
if (vref) {
@ -1534,9 +1547,24 @@ namespace {
, vref->getTargetY()
);
NetExternalComponents::setExternal( v );
toDestroy.push_back( component );
} else {
Pad* pref = dynamic_cast<Pad*>( component );
if (pref) {
Pad* p = Pad::create( net
, pref->getLayer()
, pref->getBoundingBox()
);
NetExternalComponents::setExternal( p );
toDestroy.push_back( component );
}
}
}
}
for ( Component* component : toDestroy ) {
component->destroy();
}
}
}
}