Several important fixes to the handling of coupling capacitance,

which had become fouled up due to the changes in the way that the
substrate is defined and handled.  Worked through a large torture
test until all types of substrate coupling and overlap shielding
were resolved to be extracted as expected.
This commit is contained in:
Tim Edwards 2022-02-23 20:57:30 -05:00
parent 505155497e
commit 16c0a65adc
2 changed files with 23 additions and 53 deletions

View File

@ -867,15 +867,8 @@ extSideOverlap(tp, esws)
}
/* Add in the new capacitance. */
if (tb == TT_SPACE)
{
/* Is tp a space tile? If so, extGetRegion points to garbage;
* make terminal 2 point to ground.
*/
rbp->nreg_cap += cap;
if (CAP_DEBUG) extNregAdjustCap(rbp, cap, "sideoverlap_to_subs");
}
else
if (tb != TT_SPACE)
{
int oa = ExtCurStyle->exts_planeOrder[esws->plane_of_boundary];
int ob = ExtCurStyle->exts_planeOrder[esws->plane_checked];
@ -900,12 +893,13 @@ extSideOverlap(tp, esws)
rbp->nreg_cap -= subcap;
/* Ignore residual error at ~zero zeptoFarads. Probably */
/* there should be better handling of round-off here. */
if ((rbp->nreg_cap > -0.001) && (rbp->nreg_cap < 0.001)) rbp->nreg_cap = 0;
if ((rbp->nreg_cap > -0.001) && (rbp->nreg_cap < 0.001))
rbp->nreg_cap = 0;
if (CAP_DEBUG)
extNregAdjustCap(rbp, -subcap, "obsolete_perimcap");
} else if (CAP_DEBUG)
extNregAdjustCap(rbp, 0.0,
"obsolete_perimcap (skipped, wrong direction)");
extNregAdjustCap(rbp, -subcap, "obsolete_perimcap");
}
else if (CAP_DEBUG)
extNregAdjustCap(rbp, 0.0, "obsolete_perimcap (skipped, wrong direction)");
/* If the nodes are electrically connected, then we don't add */
/* any side overlap capacitance to the node. */

View File

@ -1242,9 +1242,9 @@ ExtTechSimplePerimCap(argc, argv)
DBTechNoisyNameMask(argv[1], &types);
TTMaskSetMask(allExtractTypes, &types);
TTMaskZero(&nottypes);
TTMaskSetType(&nottypes, TT_SPACE);
plane1 = DBTechNoisyNamePlane(argv[2]);
TTMaskCom2(&nottypes, &types);
TTMaskAndMask(&types, &DBPlaneTypes[plane1]);
TTMaskAndMask(&nottypes, &DBPlaneTypes[plane1]);
@ -1260,8 +1260,13 @@ ExtTechSimplePerimCap(argc, argv)
DBTechNoisyNameMask(argv[argc - 3], &subtypes);
TTMaskSetMask(allExtractTypes, &subtypes);
}
else
else if (ExtCurStyle->exts_globSubstratePlane != -1)
{
TTMaskZero(&subtypes);
TTMaskSetMask(&subtypes, &ExtCurStyle->exts_globSubstrateTypes);
}
else
TTMaskSetOnlyType(&subtypes, TT_SPACE);
/* Part 1: Perimeter cap */
@ -1328,6 +1333,9 @@ ExtTechSimplePerimCap(argc, argv)
TTMaskClearType(&subtypes, ExtCurStyle->exts_globSubstrateDefaultType);
/* But space is */
TTMaskSetType(&subtypes, TT_SPACE);
/* All types on the substrate plane that are not substrate */
/* are by definition shielding types. */
@ -1352,9 +1360,7 @@ ExtTechSimplePerimCap(argc, argv)
TTMaskSetMask(&ExtCurStyle->exts_sideEdges[s], &nottypes);
for (t = 0; t < DBNumTypes; t++)
{
if (!TTMaskHasType(&nottypes, t))
continue;
if (!TTMaskHasType(&nottypes, t)) continue;
if (DBIsContact(t)) continue;
TTMaskSetMask(&ExtCurStyle->exts_sideOverlapOtherTypes[s][t], &subtypes);
@ -1377,33 +1383,6 @@ ExtTechSimplePerimCap(argc, argv)
ExtCurStyle->exts_sideOverlapShieldPlanes[s][r] |= pshield;
}
}
/* Reverse case (swap "types" and "subtypes") */
if ((plane2 != -1) && TTMaskHasType(&subtypes, s))
{
ExtCurStyle->exts_sidePlanes |= PlaneNumToMaskBit(plane2);
TTMaskSetType(&ExtCurStyle->exts_sideTypes[plane2], s);
for (t = TT_TECHDEPBASE; t < DBNumTypes; t++)
{
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;
}
}
}
}
@ -1611,10 +1590,7 @@ ExtTechSimpleSideOverlapCap(argv)
TTMaskSetMask(allExtractTypes, &types);
plane1 = DBTechNoisyNamePlane(argv[2]);
// TTMaskCom2(&nottypes, &types);
TTMaskZero(&nottypes);
TTMaskSetType(&nottypes, TT_SPACE);
TTMaskCom2(&nottypes, &types);
TTMaskAndMask(&types, &DBPlaneTypes[plane1]);
TTMaskAndMask(&nottypes, &DBPlaneTypes[plane1]);
@ -1655,12 +1631,12 @@ ExtTechSimpleSideOverlapCap(argv)
for (plane3 = PL_TECHDEPBASE; plane3 < DBNumPlanes; plane3++)
{
pnum3 = ExtCurStyle->exts_planeOrder[plane3];
if ((forward == TRUE) && (pnum3 > pnum2 && pnum3 < pnum1))
if ((forward == FALSE) && (pnum3 > pnum2 && pnum3 < pnum1))
{
TTMaskSetMask(&shields, &DBPlaneTypes[plane3]);
pshield |= PlaneNumToMaskBit(plane3);
}
else if ((forward == FALSE) && (pnum3 < pnum2 && pnum3 > pnum1))
else if ((forward == TRUE) && (pnum3 < pnum2 && pnum3 > pnum1))
{
TTMaskSetMask(&shields, &DBPlaneTypes[plane3]);
pshield |= PlaneNumToMaskBit(plane3);