From 8fb96db14c8f48cf0aaef6c802b848f0948ab0b2 Mon Sep 17 00:00:00 2001 From: Tim Edwards Date: Fri, 24 Mar 2023 17:11:27 -0400 Subject: [PATCH] Found one additional issue in the extraction that causes incorrect partitioning of unshielded areas reaching outward from any given edge, caused by using a boundary value in the 2nd recursion call that had been modified for the 1st recursion call and so was no longer valid. --- extract/ExtBasic.c | 2 ++ extract/ExtCouple.c | 13 ++++--------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/extract/ExtBasic.c b/extract/ExtBasic.c index ed24af75..22ccc228 100644 --- a/extract/ExtBasic.c +++ b/extract/ExtBasic.c @@ -706,6 +706,8 @@ extOutputNodes(nodeList, outFile) { intR = (reg->nreg_resist + rround) / ExtCurStyle->exts_resistScale; finC = reg->nreg_cap/ExtCurStyle->exts_capScale; + /* Avoid negative capacitance caused by round-off near zero */ + if (finC < 0.0) finC = 0.0; fprintf(outFile, "node \"%s\" %d %lg", text, intR, finC); } diff --git a/extract/ExtCouple.c b/extract/ExtCouple.c index e41f0a3b..bffe1893 100644 --- a/extract/ExtCouple.c +++ b/extract/ExtCouple.c @@ -1403,11 +1403,6 @@ extSideOverlap(tp, esws) subcap = (ExtCurStyle->exts_perimCap[ta][outtype] * MIN(areaAccountedFor, length)); rbp->nreg_cap -= subcap; - /* XXX WIP XXX */ - TxPrintf("(4) Subtracting cap value %g in clip area %d %d %d %d\n", - subcap, - ov.o_clip.r_xbot, ov.o_clip.r_ybot, - ov.o_clip.r_xtop, ov.o_clip.r_ytop); /* 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)) @@ -1528,7 +1523,7 @@ extWalkTop(area, mask, func, bp, esws) if (lookRight) { aloc = *area; - aloc.r_xbot = bloc.b_segment.r_xtop; + aloc.r_xbot = RIGHT(tp); bloc.b_segment.r_xtop = bp->b_segment.r_xtop; bloc.b_segment.r_xbot = aloc.r_xbot; if (extWalkTop(&aloc, mask, func, &bloc, esws) != 0) @@ -1640,7 +1635,7 @@ extWalkBottom(area, mask, func, bp, esws) if (lookRight) { aloc = *area; - aloc.r_xbot = bloc.b_segment.r_xtop; + aloc.r_xbot = RIGHT(tp); bloc.b_segment.r_xtop = bp->b_segment.r_xtop; bloc.b_segment.r_xbot = aloc.r_xbot; if (extWalkBottom(&aloc, mask, func, &bloc, esws) != 0) @@ -1752,7 +1747,7 @@ extWalkRight(area, mask, func, bp, esws) if (lookUp) { aloc = *area; - aloc.r_ybot = bloc.b_segment.r_ytop; + aloc.r_ybot = TOP(tp); bloc.b_segment.r_ytop = bp->b_segment.r_ytop; bloc.b_segment.r_ybot = aloc.r_ybot; if (extWalkRight(&aloc, mask, func, &bloc, esws) != 0) @@ -1864,7 +1859,7 @@ extWalkLeft(area, mask, func, bp, esws) if (lookUp) { aloc = *area; - aloc.r_ybot = bloc.b_segment.r_ytop; + aloc.r_ybot = TOP(tp); bloc.b_segment.r_ytop = bp->b_segment.r_ytop; bloc.b_segment.r_ybot = aloc.r_ybot; if (extWalkLeft(&aloc, mask, func, &bloc, esws) != 0)