Skip to content

Commit dc87a8c

Browse files
Corrected two errors with the wiring tool: (1) Ignore
"angles"-type width rules when calculating the default metal width DRC rule (this width when present will always be larger than the minimum metal width), and (2) If an exiting wire is larger than the contact size, then set the contact size such that the contact PLUS the surrounding metal is the width of the exiting wire. The existing code sets the contact size itself to the width of the exiting wire, such that when surrounding material is added, the contact is larger than it needs to be. The fix to (1) will also fix other places where the default DRC width rule is computed, which includes LEF and DEF handling and computing rendered text sizes when reading GDS.
1 parent e0c95d6 commit dc87a8c

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

drc/DRCtech.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4237,8 +4237,8 @@ DRCGetDefaultLayerWidth(ttype)
42374237
/* Skip area rule */
42384238
if (cptr->drcc_flags & DRC_AREA) continue;
42394239

4240-
/* FORWARD rules only, and no MAXWIDTH */
4241-
if ((cptr->drcc_flags & (DRC_REVERSE | DRC_MAXWIDTH)) == 0)
4240+
/* FORWARD rules only, and no MAXWIDTH or SPLITTILE */
4241+
if ((cptr->drcc_flags & (DRC_REVERSE | DRC_MAXWIDTH | DRC_SPLITTILE)) == 0)
42424242
{
42434243
set = &cptr->drcc_mask;
42444244
if (TTMaskHasType(set, ttype) && TTMaskEqual(set, &cptr->drcc_corner))

wiring/wireOps.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -826,7 +826,23 @@ WireAddContact(newType, newWidth)
826826

827827
gotContact:
828828
totalSize = conSize + 2 * oldOverlap;
829-
if (totalSize < WireWidth) totalSize = WireWidth;
829+
830+
/* If the contact size + overlap is less than the wire width,
831+
* then make the contact size equal to the wire width - the
832+
* overlap so that the full contact area isn't larger than
833+
* the exiting wire width.
834+
*/
835+
if (updown == WIRING_CONTACT_UP)
836+
{
837+
if (totalSize < (WireWidth - 2 * conSurround2))
838+
totalSize = WireWidth - 2 * conSurround2;
839+
}
840+
else
841+
{
842+
if (totalSize < (WireWidth - 2 * conSurround1))
843+
totalSize = WireWidth - 2 * conSurround1;
844+
}
845+
830846
contactArea = oldLeg;
831847
if ((contactArea.r_xtop - contactArea.r_xbot) < totalSize)
832848
{

0 commit comments

Comments
 (0)