Modified the "lef write -toplayer" option so that masterslice layers

are considered an exception to the "-toplayer" restriction;  this is
because masterslice well/substrate layers will affect the electrical
connectivity between port and sustrate or well.
This commit is contained in:
Tim Edwards 2020-10-07 16:26:56 -04:00
parent c86d3ebb60
commit 4e5f7251b7
1 changed files with 20 additions and 4 deletions

View File

@ -1107,6 +1107,7 @@ lefWriteMacro(def, f, scale, setback, toplayer, domaster)
char *propvalue, *class = NULL;
Label *lab, *tlab, *reflab;
Rect boundary, labr;
PlaneMask pmask;
SearchContext scx;
CellDef *lefFlatDef;
CellUse lefFlatUse, lefSourceUse;
@ -1181,6 +1182,7 @@ lefWriteMacro(def, f, scale, setback, toplayer, domaster)
TTMaskZero(&lc.rmask);
TTMaskZero(&boundmask);
TTMaskZero(&lmask);
pmask = 0;
/* Any layer which has a port label attached to it should by */
/* necessity be considered a routing layer. Usually this will not */
@ -1196,6 +1198,7 @@ lefWriteMacro(def, f, scale, setback, toplayer, domaster)
lefLayer *lefl = (lefLayer *)HashGetValue(he);
if (lefl && (lefl->lefClass == CLASS_ROUTE || lefl->lefClass == CLASS_VIA
|| (domaster && lefl->lefClass == CLASS_MASTER)))
{
if (lefl->type != -1)
{
TTMaskSetType(&lc.rmask, lefl->type);
@ -1210,6 +1213,10 @@ lefWriteMacro(def, f, scale, setback, toplayer, domaster)
if (lefl->obsType != -1)
TTMaskSetType(&lc.rmask, lefl->obsType);
if (domaster && lefl->lefClass == CLASS_MASTER)
pmask |= DBTypePlaneMaskTbl[lefl->type];
}
if (lefl && (lefl->lefClass == CLASS_BOUND))
if (lefl->type != -1)
TTMaskSetType(&boundmask, lefl->type);
@ -1497,8 +1504,19 @@ lefWriteMacro(def, f, scale, setback, toplayer, domaster)
{
/* Option to output only the topmost layer of a network */
/* as PIN geometry. All layers below it are considered */
/* obstructions. */
if (toplayer) pNum = pTop;
/* obstructions. Masterslice layers are considered an */
/* exception, as they are often needed for ensuring */
/* connectivity between power supply and wells. */
if (toplayer && (pNum != pTop))
{
if (domaster & (pmask != 0))
{
if (!PlaneMaskHashPlane(&pmask, pNum))
continue;
}
else continue;
}
lc.pNum = pNum;
DBSrPaintArea((Tile *)NULL, SelectDef->cd_planes[pNum],
@ -1540,8 +1558,6 @@ lefWriteMacro(def, f, scale, setback, toplayer, domaster)
&TiPlaneRect, &lc.rmask,
lefWriteGeometry, (ClientData) &lc);
lc.lefMode = LEF_MODE_PORT;
if (toplayer) break; /* Stop after processing topmost layer */
}
DBCellClearDef(lc.lefYank);
lab->lab_flags |= PORT_VISITED;