diff --git a/ext2sim/ext2sim.c b/ext2sim/ext2sim.c index 507dd1ea..2778ad0f 100644 --- a/ext2sim/ext2sim.c +++ b/ext2sim/ext2sim.c @@ -446,7 +446,7 @@ CmdExtToSim(w, cmd) case EXTTOSIM_DEFAULT: LocCapThreshold = 2; LocResistThreshold = 10; - EFTrimFlags = 0; + EFOutputFlags = 0; EFScale = 0.0; if (EFArgTech) { @@ -1307,8 +1307,8 @@ FILE *outf; suf = EFHNToStr(suffix); if (fetInfo[type].defSubs && strcasecmp(suf,fetInfo[type].defSubs) == 0) { l = strlen(suf) - 1; - if ( ( EFTrimFlags & EF_TRIMGLOB ) && suf[l] =='!' || - ( EFTrimFlags & EF_TRIMLOCAL ) && suf[l] == '#' ) + if ( ( EFOutputFlags & EF_TRIMGLOB ) && suf[l] =='!' || + ( EFOutputFlags & EF_TRIMLOCAL ) && suf[l] == '#' ) suf[l] = '\0' ; if ( esFormat == SU ) fprintf(outf, "S_"); diff --git a/ext2spice/ext2hier.c b/ext2spice/ext2hier.c index 717dadc9..390937e0 100644 --- a/ext2spice/ext2hier.c +++ b/ext2spice/ext2hier.c @@ -555,7 +555,8 @@ spcdevHierVisit(hc, dev, scale) case DEV_RES: case DEV_CAP: case DEV_CAPREV: - if (dev->dev_type == esNoModelType) + if ((dev->dev_type == esNoModelType) || + !strcmp(EFDevTypes[dev->dev_type], "None")) has_model = FALSE; break; } @@ -601,6 +602,9 @@ spcdevHierVisit(hc, dev, scale) case DEV_RES: devchar = 'R'; break; + case DEV_VOLT: + devchar = 'V'; + break; case DEV_CAP: case DEV_CAPREV: devchar = 'C'; @@ -638,6 +642,9 @@ spcdevHierVisit(hc, dev, scale) case DEV_CAPREV: fprintf(esSpiceF, "%d", esCapNum++); break; + case DEV_VOLT: + fprintf(esSpiceF, "%d", esVoltNum++); + break; case DEV_SUBCKT: case DEV_RSUBCKT: case DEV_CSUBCKT: @@ -792,6 +799,21 @@ spcdevHierVisit(hc, dev, scale) } break; + case DEV_VOLT: + /* Voltage source is "Vnnn term1 term2 0.0". It is used only to + * separate port names that have been shorted. + */ + if (dev->dev_nterm > 1) + spcdevOutNode(hc->hc_hierName, + source->dterm_node->efnode_name->efnn_hier, + "plus", esSpiceF); + if (dev->dev_nterm > 2) + spcdevOutNode(hc->hc_hierName, + drain->dterm_node->efnode_name->efnn_hier, + "minus", esSpiceF); + fprintf(esSpiceF, " 0.0"); + break; + case DEV_DIODE: case DEV_PDIODE: if (source == NULL) break; @@ -1083,7 +1105,8 @@ spcdevHierMergeVisit(hc, dev, scale) break; case DEV_RSUBCKT: case DEV_RES: - if (fp->dev->dev_type == esNoModelType) + if ((fp->dev->dev_type == esNoModelType) || + !strcmp(EFDevTypes[fp->dev->dev_type], "None")) m = esFMult[cfp->esFMIndex] + (fp->dev->dev_res / cfp->dev->dev_res); else @@ -1092,7 +1115,8 @@ spcdevHierMergeVisit(hc, dev, scale) case DEV_CSUBCKT: case DEV_CAP: case DEV_CAPREV: - if (fp->dev->dev_type == esNoModelType) + if ((fp->dev->dev_type == esNoModelType) || + !strcmp(EFDevTypes[fp->dev->dev_type], "None")) m = esFMult[cfp->esFMIndex] + (fp->dev->dev_cap / cfp->dev->dev_cap); else @@ -1481,7 +1505,8 @@ mergeThem: break; case DEV_RSUBCKT: case DEV_RES: - if (fp->dev->dev_type == esNoModelType) + if ((fp->dev->dev_type == esNoModelType) || + !strcmp(EFDevTypes[fp->dev->dev_type], "None")) m = esFMult[cfp->esFMIndex] + (fp->dev->dev_res / cfp->dev->dev_res); else @@ -1490,7 +1515,8 @@ mergeThem: case DEV_CSUBCKT: case DEV_CAP: case DEV_CAPREV: - if (fp->dev->dev_type == esNoModelType) + if ((fp->dev->dev_type == esNoModelType) || + !strcmp(EFDevTypes[fp->dev->dev_type], "None")) m = esFMult[cfp->esFMIndex] + (fp->dev->dev_cap / cfp->dev->dev_cap); else diff --git a/ext2spice/ext2spice.c b/ext2spice/ext2spice.c index bd7aaf81..8205abfd 100644 --- a/ext2spice/ext2spice.c +++ b/ext2spice/ext2spice.c @@ -65,7 +65,7 @@ float esScale = -1.0 ; /* negative if hspice the EFScale/100 otherwise */ unsigned short esFormat = SPICE3 ; -int esCapNum, esDevNum, esResNum, esDiodeNum; +int esCapNum, esDevNum, esResNum, esDiodeNum, esVoltNum; int esNodeNum; /* just in case we're extracting spice2 */ int esSbckNum; /* used in hspice node name shortening */ int esNoModelType; /* index for device type "None" (model-less device) */ @@ -137,20 +137,20 @@ esFormatSubs(outf, suf) if (outf) { l = strlen(suf) - 1; - if ((EFTrimFlags & EF_TRIMGLOB ) && suf[l] == '!' || - (EFTrimFlags & EF_TRIMLOCAL) && suf[l] == '#') + if ((EFOutputFlags & EF_TRIMGLOB ) && suf[l] == '!' || + (EFOutputFlags & EF_TRIMLOCAL) && suf[l] == '#') suf[l] = '\0' ; - if (EFTrimFlags & EF_CONVERTCOMMA) + if (EFOutputFlags & EF_CONVERTCOMMA) while ((specchar = strchr(suf, ',')) != NULL) *specchar = '|'; - if (EFTrimFlags & EF_CONVERTBRACKETS) + if (EFOutputFlags & EF_CONVERTBRACKETS) { while ((specchar = strchr(suf, '[')) != NULL) *specchar = '_'; while ((specchar = strchr(suf, ']')) != NULL) *specchar = '_'; } - if (EFTrimFlags & EF_CONVERTEQUAL) + if (EFOutputFlags & EF_CONVERTEQUAL) while ((specchar = strchr(suf, '=')) != NULL) *specchar = ':'; fprintf(outf, "%s", suf); @@ -213,13 +213,14 @@ Exttospice_Init(interp) #define EXTTOSPC_EXTRESIST 6 #define EXTTOSPC_RESISTORTEE 7 #define EXTTOSPC_SCALE 8 -#define EXTTOSPC_SUBCIRCUITS 9 -#define EXTTOSPC_HIERARCHY 10 -#define EXTTOSPC_BLACKBOX 11 -#define EXTTOSPC_RENUMBER 12 -#define EXTTOSPC_MERGENAMES 13 -#define EXTTOSPC_LVS 14 -#define EXTTOSPC_HELP 15 +#define EXTTOSPC_SHORT 9 +#define EXTTOSPC_SUBCIRCUITS 10 +#define EXTTOSPC_HIERARCHY 11 +#define EXTTOSPC_BLACKBOX 12 +#define EXTTOSPC_RENUMBER 13 +#define EXTTOSPC_MERGENAMES 14 +#define EXTTOSPC_LVS 15 +#define EXTTOSPC_HELP 16 void CmdExtToSpice(w, cmd) @@ -264,6 +265,8 @@ CmdExtToSpice(w, cmd) "extresist [on|off] incorporate information from extresist", "resistor tee [on|off] model resistor capacitance as a T-network", "scale [on|off] use .option card for scaling", + "short [voltage|resistor|none]\n" + " set method for handling shorted ports", "subcircuits [top|descend] [on|off|auto]\n" " standard cells become subcircuit calls", "hierarchy [on|off] output hierarchical spice for LVS", @@ -283,6 +286,12 @@ CmdExtToSpice(w, cmd) NULL }; + static char *cmdShortTypes[] = { + "none merge shorted ports", + "resistor separate shorted ports with 0 ohm resistor", + "voltage separate shorted ports with 0 volt source", + NULL + }; static char *cmdExtToSpcFormat[] = { "spice2", "spice3", @@ -314,6 +323,13 @@ CmdExtToSpice(w, cmd) NULL }; + static char *shorttypes[] = { + "none", + "resistor", + "voltage", + NULL + }; + typedef enum { IDX_YES, IDX_TRUE, IDX_ON, IDX_NO, IDX_FALSE, IDX_OFF, IDX_AUTO, IDX_TOP, IDX_DESCEND @@ -428,6 +444,36 @@ CmdExtToSpice(w, cmd) esMergeNames = FALSE; break; + case EXTTOSPC_SHORT: + if (cmd->tx_argc == 2) + { + if ((EFOutputFlags & EF_SHORT_MASK) == EF_SHORT_NONE) + Tcl_SetResult(magicinterp, "none", NULL); + else if ((EFOutputFlags & EF_SHORT_MASK) == EF_SHORT_R) + Tcl_SetResult(magicinterp, "resistor", NULL); + else if ((EFOutputFlags & EF_SHORT_MASK) == EF_SHORT_V) + Tcl_SetResult(magicinterp, "voltage source", NULL); + return; + } + idx = Lookup(cmd->tx_argv[2], cmdShortTypes); + if (idx < 0) goto usage; + else switch (idx) + { + case 0: + EFOutputFlags &= ~EF_SHORT_MASK; + EFOutputFlags |= EF_SHORT_NONE; + break; + case 1: + EFOutputFlags &= ~EF_SHORT_MASK; + EFOutputFlags |= EF_SHORT_R; + break; + case 2: + EFOutputFlags &= ~EF_SHORT_MASK; + EFOutputFlags |= EF_SHORT_V; + break; + } + break; + case EXTTOSPC_LVS: /* Apply default command settings for LVS */ /* hierarchy = on */ @@ -615,7 +661,7 @@ CmdExtToSpice(w, cmd) case EXTTOSPC_DEFAULT: LocCapThreshold = 2; LocResistThreshold = INFINITE_THRESHOLD; - EFTrimFlags = EF_CONVERTCOMMA | EF_CONVERTEQUAL; + EFOutputFlags = EF_CONVERTCOMMA | EF_CONVERTEQUAL; EFScale = 0.0; if (EFArgTech) { @@ -647,6 +693,7 @@ runexttospice: /* Reset the device indices */ esCapNum = 0; + esVoltNum = 0; esDevNum = 1000; esResNum = 0; esDiodeNum = 0; @@ -832,10 +879,10 @@ runexttospice: // This forces options TRIMGLOB and CONVERTEQUAL, not sure that's such a // good idea. . . - EFTrimFlags |= EF_TRIMGLOB | EF_CONVERTEQUAL | EF_CONVERTCOMMA; + EFOutputFlags |= EF_TRIMGLOB | EF_CONVERTEQUAL | EF_CONVERTCOMMA; if (IS_FINITE_F(EFCapThreshold)) flatFlags |= EF_FLATCAPS; if (esFormat == HSPICE) - EFTrimFlags |= EF_TRIMLOCAL; + EFOutputFlags |= EF_TRIMLOCAL; /* Write globals under a ".global" card */ @@ -1054,10 +1101,10 @@ main(argc, argv) /* Convert the hierarchical description to a flat one */ flatFlags = EF_FLATNODES; - EFTrimFlags |= EF_TRIMGLOB ; + EFOutputFlags |= EF_TRIMGLOB ; if (IS_FINITE_F(EFCapThreshold)) flatFlags |= EF_FLATCAPS; if (esFormat == HSPICE) { - EFTrimFlags |= EF_TRIMLOCAL ; + EFOutputFlags |= EF_TRIMLOCAL ; HashInit(&subcktNameTable, 32, HT_STRINGKEYS); #ifndef UNSORTED_SUBCKT DQInit(&subcktNameQueue, 64); @@ -1392,14 +1439,14 @@ subcktVisit(use, hierName, is_top) } else { - int savflags = EFTrimFlags; - EFTrimFlags = EF_CONVERTCOMMA; // Only substitute commas on subcircuit names + int savflags = EFOutputFlags; + EFOutputFlags = EF_CONVERTCOMMA; // Only substitute commas on subcircuit names /* Use full hierarchical decomposition for name */ /* (not just use->use_id. hierName already has use->use_id at end) */ EFHNSprintf(stmp, hierName); fprintf(esSpiceF, "X%s", stmp); - EFTrimFlags = savflags; + EFOutputFlags = savflags; tchars = 1 + strlen(stmp); } @@ -2393,7 +2440,8 @@ spcdevVisit(dev, hc, scale, trans) case DEV_CAPREV: if (dev->dev_nterm < 1) return 0; - if (dev->dev_type == esNoModelType) + if ((dev->dev_type == esNoModelType) || + !strcmp(EFDevTypes[dev->dev_type], "None")) has_model = FALSE; break; } @@ -2439,6 +2487,9 @@ spcdevVisit(dev, hc, scale, trans) case DEV_RES: devchar = 'R'; break; + case DEV_VOLT: + devchar = 'V'; + break; case DEV_CAP: case DEV_CAPREV: devchar = 'C'; @@ -2480,6 +2531,9 @@ spcdevVisit(dev, hc, scale, trans) case DEV_CAPREV: fprintf(esSpiceF, "%d", esCapNum++); break; + case DEV_VOLT: + fprintf(esSpiceF, "%d", esVoltNum++); + break; case DEV_SUBCKT: case DEV_RSUBCKT: case DEV_CSUBCKT: @@ -2631,6 +2685,19 @@ spcdevVisit(dev, hc, scale, trans) } break; + case DEV_VOLT: + /* The voltage source is "Vnnn term1 term2 0.0" and is used + * only to separate shorted port names. + */ + if (dev->dev_nterm > 1) + spcdevOutNode(hierName, source->dterm_node->efnode_name->efnn_hier, + name, esSpiceF); + if (dev->dev_nterm > 1) + spcdevOutNode(hierName, drain->dterm_node->efnode_name->efnn_hier, + name, esSpiceF); + fprintf(esSpiceF, " 0.0"); + break; + case DEV_DIODE: case DEV_PDIODE: @@ -3408,7 +3475,7 @@ retName: * EFHNSprintf -- * * Create a hierarchical node name. - * The flags in EFTrimFlags control whether global (!) or local (#) + * The flags in EFOutputFlags control whether global (!) or local (#) * suffixes are to be trimmed. Also substitutes \. with \@ if the * format is hspice. * @@ -3432,14 +3499,14 @@ EFHNSprintf(str, hierName) s = str; if (hierName->hn_parent) str = efHNSprintfPrefix(hierName->hn_parent, str); - if (EFTrimFlags) + if (EFOutputFlags) { cp = hierName->hn_name; - trimGlob = (EFTrimFlags & EF_TRIMGLOB); - trimLocal = (EFTrimFlags & EF_TRIMLOCAL); - convertComma = (EFTrimFlags & EF_CONVERTCOMMA); - convertEqual = (EFTrimFlags & EF_CONVERTEQUAL); - convertBrackets = (EFTrimFlags & EF_CONVERTBRACKETS); + trimGlob = (EFOutputFlags & EF_TRIMGLOB); + trimLocal = (EFOutputFlags & EF_TRIMLOCAL); + convertComma = (EFOutputFlags & EF_CONVERTCOMMA); + convertEqual = (EFOutputFlags & EF_CONVERTEQUAL); + convertBrackets = (EFOutputFlags & EF_CONVERTBRACKETS); while (c = *cp++) { switch (c) @@ -3465,9 +3532,9 @@ char *efHNSprintfPrefix(hierName, str) char *str; { char *cp, c; - bool convertEqual = (EFTrimFlags & EF_CONVERTEQUAL) ? TRUE : FALSE; - bool convertComma = (EFTrimFlags & EF_CONVERTCOMMA) ? TRUE : FALSE; - bool convertBrackets = (EFTrimFlags & EF_CONVERTBRACKETS) ? TRUE : FALSE; + bool convertEqual = (EFOutputFlags & EF_CONVERTEQUAL) ? TRUE : FALSE; + bool convertComma = (EFOutputFlags & EF_CONVERTCOMMA) ? TRUE : FALSE; + bool convertBrackets = (EFOutputFlags & EF_CONVERTBRACKETS) ? TRUE : FALSE; if (hierName->hn_parent) str = efHNSprintfPrefix(hierName->hn_parent, str); @@ -3750,6 +3817,9 @@ parallelDevs(f1, f2) case DEV_RSUBCKT: case DEV_CSUBCKT: break; + + case DEV_VOLT: + break; } return NOT_PARALLEL; } diff --git a/ext2spice/ext2spice.h b/ext2spice/ext2spice.h index 4a30d847..d8abf44c 100644 --- a/ext2spice/ext2spice.h +++ b/ext2spice/ext2spice.h @@ -62,7 +62,7 @@ extern float esScale; /* negative if hspice the EFScale/100 otherwise */ extern unsigned short esFormat; extern TileTypeBitMask initMask; -extern int esCapNum, esDevNum, esResNum, esDiodeNum; +extern int esCapNum, esDevNum, esResNum, esDiodeNum, esVoltNum; extern int esNodeNum; /* just in case we're extracting spice2 */ extern int esSbckNum; /* used in hspice node name shortening */ extern int esNoModelType; /* index for device type "None" (model-less device) */ @@ -144,8 +144,6 @@ typedef struct { TTMaskZero (&((nodeClientHier *) (node)->efnode_client)->m_w.visitMask); \ } - - /* attributes controlling the Area/Perimeter extraction of dev terminals */ #define ATTR_FLATAP "*[Ee][Xx][Tt]:[Aa][Pp][Ff]*" #define ATTR_HIERAP "*[Ee][Xx][Tt]:[Aa][Pp][Hh]*" diff --git a/extflat/EFargs.c b/extflat/EFargs.c index 4e5d6982..7c6a9f39 100644 --- a/extflat/EFargs.c +++ b/extflat/EFargs.c @@ -43,7 +43,7 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/ /* Command-line flags */ EFCapValue EFCapThreshold = 2; /* -c/-C: (fF) smallest interesting C */ int EFResistThreshold = 10; /* -r/-R: (Ohms) smallest interesting R */ -int EFTrimFlags = 0; /* -t: output of nodename trailing #!'s */ +int EFOutputFlags = 0; /* -t: output of nodename trailing #!'s */ char *EFSearchPath = NULL; /* -p: Search path for .ext files */ char *EFArgTech = NULL; /* -T: Tech specified on command line */ @@ -216,12 +216,12 @@ EFArgs(argc, argv, err_result, argsProc, cdata) case 't': if ((cp = ArgStr(&argc, &argv, "trim characters")) == NULL) goto usage; - if (strchr(cp, '!')) EFTrimFlags |= EF_TRIMGLOB; - if (strchr(cp, '#')) EFTrimFlags |= EF_TRIMLOCAL; - if (strchr(cp, ',')) EFTrimFlags |= EF_CONVERTCOMMA; - if (strchr(cp, '=')) EFTrimFlags |= EF_CONVERTEQUAL; - if (strchr(cp, '[')) EFTrimFlags |= EF_CONVERTBRACKETS; - if (strchr(cp, ']')) EFTrimFlags |= EF_CONVERTBRACKETS; + if (strchr(cp, '!')) EFOutputFlags |= EF_TRIMGLOB; + if (strchr(cp, '#')) EFOutputFlags |= EF_TRIMLOCAL; + if (strchr(cp, ',')) EFOutputFlags |= EF_CONVERTCOMMA; + if (strchr(cp, '=')) EFOutputFlags |= EF_CONVERTEQUAL; + if (strchr(cp, '[')) EFOutputFlags |= EF_CONVERTBRACKETS; + if (strchr(cp, ']')) EFOutputFlags |= EF_CONVERTBRACKETS; break; case 'C': EFCapThreshold = (EFCapValue)INFINITE_THRESHOLD_F; diff --git a/extflat/EFbuild.c b/extflat/EFbuild.c index 07d59fdd..976b3bd5 100644 --- a/extflat/EFbuild.c +++ b/extflat/EFbuild.c @@ -479,6 +479,35 @@ efBuildEquiv(def, nodeName1, nodeName2) else if (nn2->efnn_node == (EFNode *)NULL) return; /* Repeated "equiv" statement */ + /* If both names exist and are for different ports, then keep */ + /* them separate and add a zero ohm resistor or a zero volt */ + /* source between them, based on the method set by "ext2spice */ + /* shorts". */ + + if (nn1 && nn2 && (nn1->efnn_port >= 0) && (nn2->efnn_port >= 0) && + (nn1->efnn_port != nn2->efnn_port)) + { + if ((EFOutputFlags & EF_SHORT_MASK) != EF_SHORT_NONE) + { + int i; + int sdev; + char *argv[7], zeroarg[] = "0"; + + if ((EFOutputFlags & EF_SHORT_MASK) == EF_SHORT_R) + sdev = DEV_RES; + else + sdev = DEV_VOLT; + + for (i = 0; i < 10; i++) argv[i] = zeroarg; + argv[4] = StrDup((char **)NULL, nodeName1); + argv[7] = StrDup((char **)NULL, nodeName2); + efBuildDevice(def, sdev, "None", &GeoNullRect, 10, argv); + freeMagic(argv[4]); + freeMagic(argv[7]); + return; + } + } + /* If both names exist and are for different nodes, merge them */ if (nn1) { @@ -813,9 +842,24 @@ efBuildDevice(def, class, type, r, argc, argv) */ ttype = extGetDevType(type); + if (ttype < 0) + { + /* For zero-ohm resistors used to separate ports on the same */ + /* net, generate a unique devhash. */ + ttype = DBNumTypes; + while (1) + { + sprintf(devhash, "%dx%d_%d", r->r_xbot, r->r_ybot, ttype); + he = HashLookOnly(&def->def_devs, devhash); + if (he == NULL) break; + ttype++; + } + } + sprintf(devhash, "%dx%d_%d", r->r_xbot, r->r_ybot, ttype); he = HashFind(&def->def_devs, devhash); newdev = (Dev *)HashGetValue(he); + if (newdev) { /* Duplicate device. Duplicates will only appear in res.ext files diff --git a/extflat/EFread.c b/extflat/EFread.c index 714c3604..3404e5f7 100644 --- a/extflat/EFread.c +++ b/extflat/EFread.c @@ -44,8 +44,8 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/ #ifndef MAGIC_WRAPPER /* This must match the definition for extDevTable in extract/ExtBasic.c */ char *extDevTable[] = {"fet", "mosfet", "asymmetric", "bjt", "devres", - "devcap", "devcaprev", "diode", "pdiode", "ndiode", - "subckt", "rsubckt", "msubckt", "csubckt", NULL}; + "devcap", "devcaprev", "vsource", "diode", "pdiode", + "ndiode", "subckt", "rsubckt", "msubckt", "csubckt", NULL}; #endif /* diff --git a/extflat/EFvisit.c b/extflat/EFvisit.c index a556abe7..dd68ce9c 100644 --- a/extflat/EFvisit.c +++ b/extflat/EFvisit.c @@ -847,7 +847,7 @@ EFLookDist(hn1, hn2, pMinDist, pMaxDist) * EFHNOut -- * * Output a hierarchical node name. - * The flags in EFTrimFlags control whether global (!) or local (#) + * The flags in EFOutputFlags control whether global (!) or local (#) * suffixes are to be trimmed. * * Results: @@ -868,13 +868,13 @@ EFHNOut(hierName, outf) char *cp, c; if (hierName->hn_parent) efHNOutPrefix(hierName->hn_parent, outf); - if (EFTrimFlags) + if (EFOutputFlags) { cp = hierName->hn_name; - trimGlob = (EFTrimFlags & EF_TRIMGLOB); - trimLocal = (EFTrimFlags & EF_TRIMLOCAL); - convComma = (EFTrimFlags & EF_CONVERTCOMMA); - convBrackets = (EFTrimFlags & EF_CONVERTBRACKETS); + trimGlob = (EFOutputFlags & EF_TRIMGLOB); + trimLocal = (EFOutputFlags & EF_TRIMLOCAL); + convComma = (EFOutputFlags & EF_CONVERTCOMMA); + convBrackets = (EFOutputFlags & EF_CONVERTBRACKETS); while (c = *cp++) { if (*cp) diff --git a/extflat/extflat.h b/extflat/extflat.h index 56cc5554..3ae5bb37 100644 --- a/extflat/extflat.h +++ b/extflat/extflat.h @@ -37,13 +37,18 @@ typedef unsigned char U_char; #define EF_NONAMEMERGE 0x20 /* Don't merge unconnected nets */ /* with the same name. */ -/* Flags to control output of node names. Stored in EFTrimFlags */ +/* Flags to control output of node names. Stored in EFOutputFlags */ #define EF_TRIMGLOB 0x01 /* Delete trailing '!' from names */ #define EF_TRIMLOCAL 0x02 /* Delete trailing '#' from names */ #define EF_CONVERTCOMMA 0x04 /* Change ',' to '|' in names, else remove */ #define EF_CONVERTEQUAL 0x08 /* Change '=' to ':' in names, else remove */ #define EF_CONVERTBRACKETS 0x10 /* Change '[' and ']' to '_' in names */ +#define EF_SHORT_MASK 0x30 /* Mask for handling port shorts */ +#define EF_SHORT_NONE 0x00 /* Shorted ports are merged */ +#define EF_SHORT_R 0x10 /* Shorted ports separated with 0 ohm resistor */ +#define EF_SHORT_V 0x20 /* Shorted ports separated with 0 volt source */ + /* * capacitance type now set to float */ @@ -327,7 +332,7 @@ extern char *EFLayerNames[]; extern int EFLayerNumNames; /* Output control flags */ -extern int EFTrimFlags; +extern int EFOutputFlags; /* -------------------------- Exported procedures --------------------- */ diff --git a/extract/ExtBasic.c b/extract/ExtBasic.c index 90d33753..73c0d355 100644 --- a/extract/ExtBasic.c +++ b/extract/ExtBasic.c @@ -55,8 +55,8 @@ static char sccsid[] = "@(#)ExtBasic.c 4.13 MAGIC (Berkeley) 12/5/85"; #ifdef MAGIC_WRAPPER char *extDevTable[] = {"fet", "mosfet", "asymmetric", "bjt", "devres", - "devcap", "devcaprev", "diode", "pdiode", "ndiode", "subckt", - "rsubckt", "msubckt", "csubckt", NULL}; + "devcap", "devcaprev", "vsource", "diode", "pdiode", "ndiode", + "subckt", "rsubckt", "msubckt", "csubckt", NULL}; #endif /* --------------------- Data local to this file ---------------------- */ diff --git a/extract/extract.h b/extract/extract.h index 29988449..84a73fff 100644 --- a/extract/extract.h +++ b/extract/extract.h @@ -46,13 +46,14 @@ extern int ExtDoWarn; /* Bitmask of above */ #define DEV_RES 4 /* Resistor */ #define DEV_CAP 5 /* Capacitor */ #define DEV_CAPREV 6 /* Capacitor, terminals reversed */ -#define DEV_DIODE 7 /* Diode */ -#define DEV_PDIODE 8 /* pDiode, same as Diode */ -#define DEV_NDIODE 9 /* nDiode, terminals reversed */ -#define DEV_SUBCKT 10 /* general-purpose subcircuit */ -#define DEV_RSUBCKT 11 /* Resistor-like subcircuit. */ -#define DEV_MSUBCKT 12 /* MOSFET-like subcircuit. */ -#define DEV_CSUBCKT 13 /* Capacitor-like subcircuit. */ +#define DEV_VOLT 7 /* Voltage source (used for shorts) */ +#define DEV_DIODE 8 /* Diode */ +#define DEV_PDIODE 9 /* pDiode, same as Diode */ +#define DEV_NDIODE 10 /* nDiode, terminals reversed */ +#define DEV_SUBCKT 11 /* general-purpose subcircuit */ +#define DEV_RSUBCKT 12 /* Resistor-like subcircuit. */ +#define DEV_MSUBCKT 13 /* MOSFET-like subcircuit. */ +#define DEV_CSUBCKT 14 /* Capacitor-like subcircuit. */ /* Device names for .ext file output (new in version 7.2) */ /* (defined in extract/ExtBasic.c *and* extflat/EFread.c) */ @@ -60,14 +61,15 @@ extern int ExtDoWarn; /* Bitmask of above */ extern char *extDevTable[]; /* Extractor options */ -#define EXT_DOADJUST 0x01 /* Extract hierarchical adjustments */ -#define EXT_DOCAPACITANCE 0x02 /* Extract capacitance */ -#define EXT_DOCOUPLING 0x04 /* Extract coupling capacitance */ -#define EXT_DORESISTANCE 0x08 /* Extract resistance */ -#define EXT_DOLENGTH 0x10 /* Extract pathlengths */ -#define EXT_DOALL 0x1f /* ALL OF THE ABOVE */ -#define EXT_DOLOCAL 0x20 /* Write to local directory only */ -#define EXT_DOLABELCHECK 0x40 /* Check for connections by label */ + +#define EXT_DOADJUST 0x001 /* Extract hierarchical adjustments */ +#define EXT_DOCAPACITANCE 0x002 /* Extract capacitance */ +#define EXT_DOCOUPLING 0x004 /* Extract coupling capacitance */ +#define EXT_DORESISTANCE 0x008 /* Extract resistance */ +#define EXT_DOLENGTH 0x010 /* Extract pathlengths */ +#define EXT_DOALL 0x01f /* ALL OF THE ABOVE */ +#define EXT_DOLOCAL 0x020 /* Write to local directory only */ +#define EXT_DOLABELCHECK 0x040 /* Check for connections by label */ extern int ExtOptions; /* Bitmask of above */