Corrected a problem that can cause super-long run times for

extraction.  The plane mask array that denotes for each type which
planes should be searched for connecting types is supposed to be
a rare case that covers situations where planes connect by types
that are not contacts.  Instead, many planes were in this array,
causing the worst-case extraction methods to be run constantly.
This commit is contained in:
Tim Edwards 2019-01-28 22:36:20 -05:00
parent 90b413b582
commit 61beaeaf83
1 changed files with 27 additions and 1 deletions

View File

@ -425,10 +425,36 @@ DBTechFinalConnect()
* for those planes to which each type 'base' connects, exclusive
* of its home plane and those planes to which it connects as a
* contact.
*
* Note that DBAllConnPlanes() is used to check for connectivity
* (e.g., during extraction) where connections are made where no
* contact exists. This is VERY compute-intensive, so adding
* planes unnecessarily must be avoided at all costs. Consider
* that a better alternative might be to designate layers that
* connect to other planes as contacts themselves (such as
* nsd, which connects to nwell) and restrict the "connect" section
* to types in a plane (such as poly and transistor).
*/
for (base = TT_TECHDEPBASE; base < DBNumTypes; base++)
{
DBAllConnPlanes[base] = DBTechTypesToPlanes(&DBConnectTbl[base]);
TileTypeBitMask baseConnList;
/* For one, remove all contact types from the list of */
/* connecting types. Otherwise, simple connect */
/* expressions like "*m1 *m1" have the unintended */
/* consequence of connecting the metal2 plane (because */
/* via contains m1) to the active plane (because active */
/* contacts also contain m1). */
baseConnList = DBConnectTbl[base];
for (s = 0; s < dbNumContacts; s++)
{
ls = dbContactInfo[s];
TTMaskClearType(&baseConnList, ls->l_type);
}
DBAllConnPlanes[base] = DBTechTypesToPlanes(&baseConnList);
DBAllConnPlanes[base] &= ~(PlaneNumToMaskBit(DBPlane(base)));
DBAllConnPlanes[base] &= ~DBConnPlanes[base];
}