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:
parent
505155497e
commit
16c0a65adc
|
|
@ -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. */
|
||||
|
|
|
|||
|
|
@ -1242,9 +1242,9 @@ ExtTechSimplePerimCap(argc, argv)
|
|||
|
||||
DBTechNoisyNameMask(argv[1], &types);
|
||||
TTMaskSetMask(allExtractTypes, &types);
|
||||
TTMaskZero(¬types);
|
||||
TTMaskSetType(¬types, TT_SPACE);
|
||||
plane1 = DBTechNoisyNamePlane(argv[2]);
|
||||
|
||||
TTMaskCom2(¬types, &types);
|
||||
TTMaskAndMask(&types, &DBPlaneTypes[plane1]);
|
||||
TTMaskAndMask(¬types, &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], ¬types);
|
||||
for (t = 0; t < DBNumTypes; t++)
|
||||
{
|
||||
if (!TTMaskHasType(¬types, t))
|
||||
continue;
|
||||
|
||||
if (!TTMaskHasType(¬types, 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(¬types, &types);
|
||||
TTMaskZero(¬types);
|
||||
TTMaskSetType(¬types, TT_SPACE);
|
||||
|
||||
TTMaskCom2(¬types, &types);
|
||||
TTMaskAndMask(&types, &DBPlaneTypes[plane1]);
|
||||
TTMaskAndMask(¬types, &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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue