Corrected an error in the calculation of the number of contact
cuts per contact area during parasitic resistance extraction. Previously, the result was divided by the via pitch twice, resulting in most contact areas being reported as a single cut.
This commit is contained in:
parent
7aa846443a
commit
656b5dbabe
|
|
@ -831,14 +831,12 @@ ResDoContacts(contact, nodes, resList)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
viawidth += spacing;
|
viawidth += spacing;
|
||||||
squaresf = (float)((contact->cp_width * cscale) - minside) / (float)viawidth;
|
squaresf = (float)((contact->cp_width * cscale) - minside);
|
||||||
squaresf *= ExtCurStyle->exts_unitsPerLambda;
|
|
||||||
squaresf /= (float)viawidth;
|
squaresf /= (float)viawidth;
|
||||||
squaresx = (int)squaresf;
|
squaresx = (int)squaresf;
|
||||||
squaresx++;
|
squaresx++;
|
||||||
|
|
||||||
squaresf = (float)((contact->cp_height * cscale) - minside) / (float)viawidth;
|
squaresf = (float)((contact->cp_height * cscale) - minside);
|
||||||
squaresf *= ExtCurStyle->exts_unitsPerLambda;
|
|
||||||
squaresf /= (float)viawidth;
|
squaresf /= (float)viawidth;
|
||||||
squaresy = (int)squaresf;
|
squaresy = (int)squaresf;
|
||||||
squaresy++;
|
squaresy++;
|
||||||
|
|
|
||||||
|
|
@ -880,7 +880,7 @@ ResDoSimplify(tolerance, rctol, goodies)
|
||||||
/* we're calculating lumped values so that the capacitance */
|
/* we're calculating lumped values so that the capacitance */
|
||||||
/* values get calculated correctly. */
|
/* values get calculated correctly. */
|
||||||
|
|
||||||
(void) ResDistributeCapacitance(ResNodeList,goodies->rg_nodecap);
|
(void) ResDistributeCapacitance(ResNodeList, goodies->rg_nodecap);
|
||||||
|
|
||||||
if (((tolerance > bigres) || ((ResOptionsFlags & ResOpt_Simplify) == 0)) &&
|
if (((tolerance > bigres) || ((ResOptionsFlags & ResOpt_Simplify) == 0)) &&
|
||||||
((ResOptionsFlags & ResOpt_DoLumpFile) == 0))
|
((ResOptionsFlags & ResOpt_DoLumpFile) == 0))
|
||||||
|
|
@ -895,9 +895,9 @@ ResDoSimplify(tolerance, rctol, goodies)
|
||||||
oldres->rr_status &= ~RES_HEAP;
|
oldres->rr_status &= ~RES_HEAP;
|
||||||
if (oldres->rr_status & RES_TDI_IGNORE)
|
if (oldres->rr_status & RES_TDI_IGNORE)
|
||||||
{
|
{
|
||||||
ResDeleteResPointer(oldres->rr_node[0], oldres);
|
ResDeleteResPointer(oldres->rr_node[0], oldres);
|
||||||
ResDeleteResPointer(oldres->rr_node[1], oldres);
|
ResDeleteResPointer(oldres->rr_node[1], oldres);
|
||||||
ResEliminateResistor(oldres, &ResResList);
|
ResEliminateResistor(oldres, &ResResList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -940,7 +940,6 @@ ResDoSimplify(tolerance, rctol, goodies)
|
||||||
goodies->rg_Tdi != -1)
|
goodies->rg_Tdi != -1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
||||||
/* Simplify network; resistors are still in milliohms, so use
|
/* Simplify network; resistors are still in milliohms, so use
|
||||||
* millitolerance.
|
* millitolerance.
|
||||||
*/
|
*/
|
||||||
|
|
@ -963,7 +962,6 @@ ResDoSimplify(tolerance, rctol, goodies)
|
||||||
}
|
}
|
||||||
if (ResOriginNode != NULL)
|
if (ResOriginNode != NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* if Tdi is enabled, prune all branches whose end nodes */
|
/* if Tdi is enabled, prune all branches whose end nodes */
|
||||||
/* have time constants less than the tolerance. */
|
/* have time constants less than the tolerance. */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue