Found that "extresist" double-counts contacts because no attempt

was made to limit the ExtFindRegions() search to one plane per
contact.  Fixed this simply by doubling the resistance per via
so that the final result is correct.
This commit is contained in:
Tim Edwards 2023-09-29 10:48:05 -04:00
parent b156e79b2c
commit dacbfc4e1f
3 changed files with 18 additions and 7 deletions

View File

@ -1 +1 @@
8.3.436
8.3.437

View File

@ -132,9 +132,8 @@ ResGetReCell()
* results: none
*
* Side Effects: All contacts in the design are broken into their
* constituent
* layers. There should be no contacts in ResDef after this procedure
* runs.
* constituent layers. There should be no contacts in ResDef after
* this procedure runs.
*
*
*------------------------------------------------------------------------
@ -147,7 +146,7 @@ ResDissolveContacts(contacts)
Tile *tp;
TileTypeBitMask residues;
for (; contacts != (ResContactPoint *) NULL; contacts = contacts->cp_nextcontact)
for (; contacts != (ResContactPoint *)NULL; contacts = contacts->cp_nextcontact)
{
oldtype=contacts->cp_type;
@ -224,7 +223,6 @@ ResMakePortBreakpoints(def)
rect->r_ytop++;
}
/* If label is on a contact, the contact has been dissolved. */
/* Assume that the uppermost residue is the port. This may */
/* not necessarily be the case. Could do a boundary scan on */
@ -1032,6 +1030,11 @@ ResExtractNet(node, goodies, cellname)
/* Find all contacts in design and note their position */
/* NOTE: ExtFindRegions() will call ResFirst or ResEach for BOTH */
/* planes of a contact. Rather than attempting to limit the */
/* search, ResDoContacts() will just double the resistance per via */
/* so that the final value is correct. */
ResContactList = (ResContactPoint *)ExtFindRegions(ResUse->cu_def,
&(ResUse->cu_def->cd_bbox),
&DBAllButSpaceAndDRCBits,

View File

@ -894,7 +894,15 @@ ResDoContacts(contact, nodes, resList)
resistor->rr_cl = squaresy;
resistor->rr_width = squaresx;
resistor->rr_value =
/* NOTE: ExtFindRegions() finds tiles on the top AND */
/* bottom planes of the contact. So there are two */
/* tile entries per contact, in parallel. To prevent */
/* double-counting, double the resistance of each */
/* entry; this is (probably?) easier than limiting the */
/* entries to a single plane per contact. */
resistor->rr_value = 2.0 *
(float)ExtCurStyle->exts_viaResist[contact->cp_type] /
(float)(squaresx * squaresy);
#ifdef ARIEL