Corrected the handling of the "defaultsideoverlap" statement so that it

works for the first pair of types/plane being below the second pair of
types/plane (upward fringing from the top of a wire to an overlapping
wire above it), which was not being handled due to an implicit assumption
that plane1 < plane2, which does not have to be the case.
This commit is contained in:
Tim Edwards 2020-06-10 10:52:54 -04:00
parent 035195bb47
commit 7540854184
1 changed files with 24 additions and 31 deletions

View File

@ -1410,6 +1410,7 @@ ExtTechSimpleSideOverlapCap(argv)
int plane1, plane2, plane3, pnum1, pnum2, pnum3;
PlaneMask pshield;
EdgeCap *cnew;
bool forward;
if (ExtCurStyle->exts_planeOrderStatus != seenPlaneOrder)
{
@ -1442,6 +1443,19 @@ ExtTechSimpleSideOverlapCap(argv)
pnum1 = ExtCurStyle->exts_planeOrder[plane1];
pnum2 = ExtCurStyle->exts_planeOrder[plane2];
if (pnum1 == pnum2)
{
TechError("Cannot have fringing capacitance between "
"types on the same plane\n");
return;
}
/* Fringing cap works both directions. Consider the case plane1 < */
/* plane2 as the "forward" case, and plane1 > plane2 as the */
/* "reverse" case. */
forward = (plane1 < plane2) ? TRUE : FALSE;
/* Find all types in or below plane2 (i.e., ~(space)/plane2) */
/* Shield planes are the ones between plane1 and plane2 */
@ -1450,7 +1464,12 @@ ExtTechSimpleSideOverlapCap(argv)
for (plane3 = PL_TECHDEPBASE; plane3 < DBNumPlanes; plane3++)
{
pnum3 = ExtCurStyle->exts_planeOrder[plane3];
if (pnum3 > pnum2 && pnum3 < pnum1)
if ((forward == TRUE) && (pnum3 > pnum2 && pnum3 < pnum1))
{
TTMaskSetMask(&shields, &DBPlaneTypes[plane3]);
pshield |= PlaneNumToMaskBit(plane3);
}
else if ((forward == FALSE) && (pnum3 < pnum2 && pnum3 > pnum1))
{
TTMaskSetMask(&shields, &DBPlaneTypes[plane3]);
pshield |= PlaneNumToMaskBit(plane3);
@ -1500,36 +1519,10 @@ ExtTechSimpleSideOverlapCap(argv)
}
}
/* Reverse case (swap "types" and "ov") */
#if 0
if (TTMaskHasType(&ov, s))
{
ExtCurStyle->exts_sidePlanes |= PlaneNumToMaskBit(plane2);
TTMaskSetType(&ExtCurStyle->exts_sideTypes[plane2], s);
TTMaskSetMask(&ExtCurStyle->exts_sideEdges[s], &notov);
for (t = TT_SPACE; t < DBNumTypes; t++)
{
if (!TTMaskHasType(&notov, t)) continue;
if (DBIsContact(t)) continue;
TTMaskSetMask(&ExtCurStyle->exts_sideOverlapOtherTypes[s][t], &types);
ExtCurStyle->exts_sideOverlapOtherPlanes[s][t] |=
PlaneNumToMaskBit(plane1);
cnew = (EdgeCap *) mallocMagic((unsigned) (sizeof (EdgeCap)));
cnew->ec_cap = capVal;
cnew->ec_far = shields; /* Types that shield */
cnew->ec_near = types; /* Types we create cap with */
cnew->ec_pmask = PlaneNumToMaskBit(plane1);
cnew->ec_next = ExtCurStyle->exts_sideOverlapCap[s][t];
ExtCurStyle->exts_sideOverlapCap[s][t] = cnew;
for (r = TT_TECHDEPBASE; r < DBNumTypes; r++)
if (TTMaskHasType(&types, r))
ExtCurStyle->exts_sideOverlapShieldPlanes[s][r] |= pshield;
}
}
#endif /* 0 */
/* There is no "reverse case". Overlap from A->B will be different */
/* than B->A because it depends on the thickness of A and B. For */
/* the reverse case, the defaultsideoverlap statement must be */
/* repeated with the correct capacitance. */
}
}