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:
parent
b156e79b2c
commit
dacbfc4e1f
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue