Corrected the "def read" command so that when reading PIN blocks,

all geometry will be handled;  the previous behavior expected only
a single rectangle per pin and so would only acknowledge the last
entry in any list of rectangles for the pin.
This commit is contained in:
Tim Edwards 2021-09-15 14:45:14 -04:00
parent bfab888bc9
commit 35a65a9ba1
2 changed files with 30 additions and 9 deletions

View File

@ -1 +1 @@
8.3.208
8.3.209

View File

@ -945,6 +945,7 @@ DefReadPins(f, rootDef, sname, oscale, total)
int pinUse = PORT_USE_DEFAULT;
int pinNum = 0;
TileType curlayer = -1;
LinkedRect *rectList = NULL, *newRect;
Rect *currect, topRect;
Transform t;
lefLayer *lefl;
@ -1108,6 +1109,13 @@ DefReadPins(f, rootDef, sname, oscale, total)
case DEF_PINS_PROP_LAYER:
curlayer = LefReadLayer(f, FALSE);
currect = LefReadRect(f, curlayer, oscale);
newRect = (LinkedRect *)mallocMagic(sizeof(LinkedRect));
newRect->r_type = curlayer;
newRect->r_r = *currect;
newRect->r_next = rectList;
rectList = newRect;
if (pending)
{
/* If layer was unknown, set to space and force */
@ -1118,10 +1126,16 @@ DefReadPins(f, rootDef, sname, oscale, total)
else
flags |= LABEL_STICKY;
GeoTransRect(&t, currect, &topRect);
DBPaint(rootDef, &topRect, curlayer);
DBPutLabel(rootDef, &topRect, -1, pinname, curlayer,
pinNum | pinDir | pinUse | flags);
while (rectList != NULL)
{
GeoTransRect(&t, &rectList->r_r, &topRect);
DBPaint(rootDef, &topRect, rectList->r_type);
DBPutLabel(rootDef, &topRect, -1, pinname,
rectList->r_type,
pinNum | pinDir | pinUse | flags);
freeMagic(rectList);
rectList = rectList->r_next;
}
pending = FALSE;
pinNum++;
}
@ -1141,10 +1155,17 @@ DefReadPins(f, rootDef, sname, oscale, total)
else
flags |= LABEL_STICKY;
GeoTransRect(&t, currect, &topRect);
DBPaint(rootDef, &topRect, curlayer);
DBPutLabel(rootDef, &topRect, -1, pinname, curlayer,
pinNum | pinDir | pinUse | flags);
while (rectList != NULL)
{
GeoTransRect(&t, &rectList->r_r, &topRect);
DBPaint(rootDef, &topRect, rectList->r_type);
DBPutLabel(rootDef, &topRect, -1, pinname,
rectList->r_type,
pinNum | pinDir | pinUse | flags);
freeMagic(rectList);
rectList = rectList->r_next;
}
pending = FALSE;
pinNum++;
}
break;