Made some corrections to the "extresist" code to avoid issues with

extracting a port-to-port net that does not touch any devices.
The error happens in a fairly rare set of cases.
This commit is contained in:
Tim Edwards 2022-05-02 12:27:39 -04:00
parent fe2eb6d390
commit fcc884332b
6 changed files with 19 additions and 7 deletions

View File

@ -1 +1 @@
8.3.294
8.3.295

View File

@ -449,12 +449,13 @@ efBuildKill(def, name)
*/
void
efBuildEquiv(def, nodeName1, nodeName2)
efBuildEquiv(def, nodeName1, nodeName2, resist)
Def *def; /* Def for which we're adding a new node name */
char *nodeName1; /* One of node names to be made equivalent */
char *nodeName2; /* Other name to be made equivalent. One of nodeName1
* or nodeName2 must already be known.
*/
bool resist; /* True if "extresist on" option was selected */
{
EFNodeName *nn1, *nn2;
HashEntry *he1, *he2;
@ -520,12 +521,15 @@ efBuildEquiv(def, nodeName1, nodeName2)
freeMagic(argv[7]);
return;
}
else
else if (!resist)
{
/* Flag a strong warning */
TxError("Warning: Ports \"%s\" and \"%s\" are electrically shorted.\n",
nodeName1, nodeName2);
}
else
/* Do not merge the nodes when folding in extresist parasitics */
return;
}
/* If both names exist and are for different nodes, merge them */

View File

@ -313,7 +313,7 @@ readfile:
/* equiv node1 node2 */
case EQUIV:
efBuildEquiv(def, argv[1], argv[2]);
efBuildEquiv(def, argv[1], argv[2], resist);
break;
/* replaces "fet" (below) */

View File

@ -1499,6 +1499,7 @@ defCountVias(rootDef, MagicToLefTable, defViaTable, oscale)
int
defCheckFunc(tile)
Tile *tile;
{
return 1;
}

View File

@ -172,7 +172,9 @@ ResReadSim(simfile, fetproc, capproc, resproc, attrproc, mergeproc, subproc)
if (resproc) result = (*resproc)(line);
break;
case '=':
if (mergeproc) result = (*mergeproc)(line);
/* Do not merge nodes, as this interferes with */
/* extresist's primary function. */
/* if (mergeproc) result = (*mergeproc)(line); */
break;
case 'A':
if (attrproc)

View File

@ -710,6 +710,9 @@ resPortFunc(scx, lab, tpath, result)
HashEntry *entry;
ResSimNode *node;
// Ignore the top level cell
if (scx->scx_use->cu_id == NULL) return 0;
GeoTransRect(&scx->scx_trans, &lab->lab_rect, &r);
// To be expanded. Currently this handles digital signal inputs
@ -723,7 +726,8 @@ resPortFunc(scx, lab, tpath, result)
// direction is either INPUT or OUTPUT, then use SIGNAL is implied.
if ((puse == 0) && ((pclass == PORT_CLASS_INPUT)
|| (pclass == PORT_CLASS_OUTPUT)))
|| (pclass == PORT_CLASS_OUTPUT)
|| (pclass == PORT_CLASS_DEFAULT)))
puse = PORT_USE_SIGNAL;
if (puse == PORT_USE_SIGNAL || puse == PORT_USE_CLOCK) {
@ -742,7 +746,8 @@ resPortFunc(scx, lab, tpath, result)
if (lab->lab_flags & PORT_DIR_WEST)
portloc.p_x = r.r_xbot;
if ((pclass == PORT_CLASS_INPUT) || (pclass == PORT_CLASS_OUTPUT)) {
if ((pclass == PORT_CLASS_INPUT) || (pclass == PORT_CLASS_OUTPUT)
|| (pclass == PORT_CLASS_DEFAULT)) {
int len;
char *nodename;