Corrected the ext2sim output and extresist to properly handle

2-terminal devices without complaining.  The previous handling
seemed to be technically correct other than spitting out warnings
about missing terminals.
This commit is contained in:
Tim Edwards 2023-02-24 12:58:46 -05:00
parent 7b485efa9b
commit e72f85fd10
3 changed files with 32 additions and 15 deletions

View File

@ -1 +1 @@
8.3.370 8.3.371

View File

@ -1169,22 +1169,28 @@ simdevVisit(dev, hc, scale, trans)
} }
} }
if (is_subckt && subnode) if (dev->dev_class != DEV_DIODE && dev->dev_class != DEV_NDIODE &&
dev->dev_class != DEV_PDIODE)
{ {
/* As a general policy on subcircuits supporting extresist, */ if (is_subckt && subnode)
/* output the subcircuit node as the last port of the */ {
/* subcircuit definition. */ /* As a general policy on subcircuits supporting extresist, */
putc(' ', esSimF); /* output the subcircuit node as the last port of the */
simdevSubstrate(hierName, subnode->efnode_name->efnn_hier, /* subcircuit definition, *except* for the use of the 'x' */
dev->dev_type, 0.0, FALSE, esSimF); /* device type for diodes. */
}
/* Support gemini's substrate comparison */ putc(' ', esSimF);
else if (esFormat == LBL && subnode) simdevSubstrate(hierName, subnode->efnode_name->efnn_hier,
{
putc(' ', esSimF);
simdevSubstrate(hierName, subnode->efnode_name->efnn_hier,
dev->dev_type, 0.0, FALSE, esSimF); dev->dev_type, 0.0, FALSE, esSimF);
}
/* Support gemini's substrate comparison */
else if (esFormat == LBL && subnode)
{
putc(' ', esSimF);
simdevSubstrate(hierName, subnode->efnode_name->efnn_hier,
dev->dev_type, 0.0, FALSE, esSimF);
}
} }
GeoTransRect(trans, &dev->dev_rect, &r); GeoTransRect(trans, &dev->dev_rect, &r);
@ -1228,7 +1234,7 @@ simdevVisit(dev, hc, scale, trans)
/* Output source and drain attributes */ /* Output source and drain attributes */
if (source->dterm_attrs) if (source->dterm_attrs)
fprintf(esSimF, " s=%s", source->dterm_attrs); fprintf(esSimF, " s=%s", source->dterm_attrs);
if (drain->dterm_attrs) if ((source != drain) && drain->dterm_attrs)
fprintf(esSimF, " d=%s", drain->dterm_attrs); fprintf(esSimF, " d=%s", drain->dterm_attrs);
/* Output length, width, and position as attributes */ /* Output length, width, and position as attributes */

View File

@ -1322,8 +1322,19 @@ ResFixUpConnections(simDev, layoutDev, simNode, nodename)
layoutDev->rd_inside.r_xbot, layoutDev->rd_inside.r_ybot, layoutDev->rd_inside.r_xbot, layoutDev->rd_inside.r_ybot,
nodename); nodename);
} }
if (simDev->source == simNode) if (simDev->source == simNode)
{ {
/* Check for devices with only one terminal. If it was cast as drain, */
/* then swap it with the source so that the code below handles it */
/* correctly. */
if (layoutDev->rd_fet_source == NULL && layoutDev->rd_fet_drain != NULL)
{
layoutDev->rd_fet_source = layoutDev->rd_fet_drain;
layoutDev->rd_fet_drain = (struct resnode *)NULL;
}
if (simDev->drain == simNode) if (simDev->drain == simNode)
{ {
if (((source = layoutDev->rd_fet_source) != NULL) && if (((source = layoutDev->rd_fet_source) != NULL) &&