From 53682af668ac705776a378ad5ff26ee4f69dbd71 Mon Sep 17 00:00:00 2001 From: Tim Edwards Date: Tue, 13 Dec 2022 16:02:49 -0500 Subject: [PATCH] Added a new special device model name "Short" which enables the use of a resistor type as a FET extended drain, allowing the FET drain node to short across to the other side of the resistor so that the resistor is absorbed into the FET device. Used with the GF180MCU process to describe the salicide-block ESD FET types. --- VERSION | 2 +- extract/ExtBasic.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 182f1c4b..4c6e14dd 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -8.3.351 +8.3.352 diff --git a/extract/ExtBasic.c b/extract/ExtBasic.c index ae4764a9..d58c36fd 100644 --- a/extract/ExtBasic.c +++ b/extract/ExtBasic.c @@ -2005,6 +2005,30 @@ extOutputDevices(def, transList, outFile) if (!strcmp(devptr->exts_deviceName, "Ignore")) continue; + /* Model type "Short" in the techfile indicates a device */ + /* to short across the first two nodes (the gate and the */ + /* source). This solves the specific issue of a transistor */ + /* extended drain where the drain is a resistor but the */ + /* resistor is part of the model and should not be output. */ + + if (!strcmp(devptr->exts_deviceName, "Short")) + { + fprintf(outFile, "equiv "); + + /* To do: Use parameters to specify which terminals */ + /* are shorted. */ + + /* gate */ + node = (NodeRegion *)extGetRegion(reg->treg_tile); + fprintf(outFile, "\"%s\" ", extNodeName(node)); + + /* First non-gate terminal */ + node = (NodeRegion *)extTransRec.tr_termnode[0]; + fprintf(outFile, "\"%s\"\n", extNodeName(node)); + + continue; + } + /* Original-style FET record backward compatibility */ if (devptr->exts_deviceClass != DEV_FET) fprintf(outFile, "device "); @@ -2916,7 +2940,12 @@ extTransPerimFunc(bp) } else { - TxError("Error: Asymmetric device with multiple terminals!\n"); + /* Do not generate error messages on "Ignore" or "Short" + * device types + */ + if (strcmp(extTransRec.tr_devrec->exts_deviceName, "Ignore") && + strcmp(extTransRec.tr_devrec->exts_deviceName, "Short")) + TxError("Error: Asymmetric device with multiple terminals!\n"); break; }