⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spice.java

📁 The ElectricTM VLSI Design System is an open-source Electronic Design Automation (EDA) system that c
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
//                        {//                            if (ni.getProto().getName().equals("P-Poly-RPO-Resistor")) fun = PrimitiveNode.Function.RESPPOLY;//                            if (ni.getProto().getName().equals("N-Poly-RPO-Resistor")) fun = PrimitiveNode.Function.RESNPOLY;//                        }//                        if (fun == PrimitiveNode.Function.WRESIST)//                        {//                            if (ni.getProto().getName().equals("P-Well-RPO-Resistor")) fun = PrimitiveNode.Function.RESPWELL;//                            if (ni.getProto().getName().equals("N-Well-RPO-Resistor")) fun = PrimitiveNode.Function.RESNWELL;//                        }                        if (fun == PrimitiveNode.Function.RESPPOLY || fun == PrimitiveNode.Function.RESNPOLY ||                        	fun == PrimitiveNode.Function.RESPWELL || fun == PrimitiveNode.Function.RESNWELL)                        {                            partName = "XR";                            double width = ni.getLambdaBaseYSize();                            double length = ni.getLambdaBaseXSize();                            if (Simulation.isSpiceWriteTransSizeInLambda())                            {                                extra = " L="+length+" W="+width;                            } else                            {                                extra = " L="+formatParam(length+"*LAMBDA", TextDescriptor.Unit.NONE, false)+                                	" W="+formatParam(width+"*LAMBDA", TextDescriptor.Unit.NONE, false);                            }                            String prepend = "";                            if (fun == PrimitiveNode.Function.RESPPOLY) prepend = "rppo1rpo"; else                            	if (fun == PrimitiveNode.Function.RESNPOLY) prepend = "rnpo1rpo"; else                                	if (fun == PrimitiveNode.Function.RESPWELL) prepend = "rpwod "; else                                    	if (fun == PrimitiveNode.Function.RESNWELL) prepend = "rnwod ";                            if (layoutTechnology == Technology.getCMOS90Technology() ||                                (cell.getView() == View.LAYOUT && cell.getTechnology() == Technology.getCMOS90Technology()))                            {                                if (fun == PrimitiveNode.Function.RESPPOLY) prepend = "GND rpporpo"; else                                	if (fun == PrimitiveNode.Function.RESNPOLY) prepend = "GND rnporpo";                            }                            extra = prepend + extra;                        }                    }					writeTwoPort(ni, partName, extra, cni, netList, context, segmentedNets);				} else if (fun.isCapacitor())				{					Variable capacVar = ni.getVar(Schematics.SCHEM_CAPACITANCE);					String extra = "";					if (capacVar != null)					{                        if (USE_JAVA_CODE) {                            extra = evalParam(context, no, capacVar, forceEval);                        } else {                            if (capacVar.getCode() == CodeExpression.Code.SPICE) {                                if (!useCDL && Simulation.isSpiceUseCellParameters()) {                                    Object obj = context.evalSpice(capacVar, false);                                    extra = String.valueOf(obj);                                } else {                                    extra = capacVar.describe(context, ni);                                }                            }                            if (extra == "")                                extra = capacVar.describe(context, ni);                            if (TextUtils.isANumber(extra))                            {                                double pureValue = TextUtils.atof(extra);                                extra = TextUtils.formatDoublePostFix(pureValue); // displayedUnits(pureValue, TextDescriptor.Unit.CAPACITANCE, TextUtils.UnitScale.NONE);                            } else                                extra = formatParam(extra, capacVar.getUnit(), false);                        }					}					writeTwoPort(ni, "C", extra, cni, netList, context, segmentedNets);				} else if (fun == PrimitiveNode.Function.INDUCT)				{					Variable inductVar = ni.getVar(Schematics.SCHEM_INDUCTANCE);					String extra = "";					if (inductVar != null)					{                        if (USE_JAVA_CODE) {                            extra = evalParam(context, no, inductVar, forceEval);                        } else {                            if (inductVar.getCode() == CodeExpression.Code.SPICE) {                                if (!useCDL && Simulation.isSpiceUseCellParameters()) {                                    Object obj = context.evalSpice(inductVar, false);                                    extra = String.valueOf(obj);                                } else {                                    extra = inductVar.describe(context, ni);                                }                            }                            if (extra == "")                                extra = inductVar.describe(context, ni);                            if (TextUtils.isANumber(extra))                            {                                double pureValue = TextUtils.atof(extra);                                extra = TextUtils.formatDoublePostFix(pureValue); // displayedUnits(pureValue, TextDescriptor.Unit.INDUCTANCE, TextUtils.UnitScale.NONE);                            } else                                extra = formatParam(extra, inductVar.getUnit(), false);                        }					}					writeTwoPort(ni, "L", extra, cni, netList, context, segmentedNets);				} else if (fun == PrimitiveNode.Function.DIODE || fun == PrimitiveNode.Function.DIODEZ)				{					Variable diodeVar = ni.getVar(Schematics.SCHEM_DIODE);					String extra = "";					if (diodeVar != null)						extra = diodeVar.describe(context, ni);					if (extra.length() == 0) extra = "DIODE";					writeTwoPort(ni, "D", extra, cni, netList, context, segmentedNets);				}				continue;			}			// the default is to handle everything else as a transistor			if (((PrimitiveNode)niProto).getGroupFunction() != PrimitiveNode.Function.TRANS)				continue;			Network gateNet = netList.getNetwork(ni.getTransistorGatePort());			CellSignal gateCs = cni.getCellSignal(gateNet);			Network sourceNet = netList.getNetwork(ni.getTransistorSourcePort());			CellSignal sourceCs = cni.getCellSignal(sourceNet);			Network drainNet = netList.getNetwork(ni.getTransistorDrainPort());			CellSignal drainCs = cni.getCellSignal(drainNet);			CellSignal biasCs = null;			PortInst biasPort = ni.getTransistorBiasPort();			if (biasPort != null)			{				biasCs = cni.getCellSignal(netList.getNetwork(biasPort));			}			// make sure transistor is connected to nets			if (gateCs == null || sourceCs == null || drainCs == null)			{				String message = "WARNING: " + ni + " not fully connected in " + cell;				dumpErrorMessage(message);			}			// get model information			String modelName = null;            String defaultBulkName = null;			Variable modelVar = ni.getVar(SPICE_MODEL_KEY);			if (modelVar != null) modelName = modelVar.getObject().toString();            // special case for ST090 technology which has stupid non-standard transistor            // models which are subcircuits            boolean st090laytrans = false;            boolean tsmc090laytrans = false;            if (cell.getView() == View.LAYOUT && layoutTechnology == Technology.getCMOS90Technology()) {                if (layoutTechnology.getSelectedFoundry().getType() == Foundry.Type.TSMC)                    tsmc090laytrans = true;                else if (layoutTechnology.getSelectedFoundry().getType() == Foundry.Type.ST)                    st090laytrans = true;            }			String modelChar = "";			if (fun == PrimitiveNode.Function.TRANSREF)					// self-referential transistor			{				modelChar = "X";				biasCs = cni.getCellSignal(groundNet);				modelName = niProto.getName();			} else if (fun == PrimitiveNode.Function.TRANMOS)			// NMOS (Enhancement) transistor			{				modelChar = "M";				biasCs = cni.getCellSignal(groundNet);                defaultBulkName = "gnd";				if (modelName == null) modelName = "N";                if (st090laytrans) {                    modelChar = "XM";                    modelName = "nsvt";                }                if (tsmc090laytrans) {                    modelName = "nch";                }            } else if (fun == PrimitiveNode.Function.TRA4NMOS)			// NMOS (Complementary) 4-port transistor			{				modelChar = "M";				if (modelName == null) modelName = "N";                if (st090laytrans) {                    modelChar = "XM";                    modelName = "nsvt";                }                if (tsmc090laytrans) {                    modelName = "nch";                }			} else if (fun == PrimitiveNode.Function.TRADMOS)			// DMOS (Depletion) transistor			{				modelChar = "M";				biasCs = cni.getCellSignal(groundNet);				if (modelName == null) modelName = "D";			} else if (fun == PrimitiveNode.Function.TRA4DMOS)			// DMOS (Depletion) 4-port transistor			{				modelChar = "M";				if (modelName == null) modelName = "D";			} else if (fun == PrimitiveNode.Function.TRAPMOS)			// PMOS (Complementary) transistor			{				modelChar = "M";				biasCs = cni.getCellSignal(powerNet);                defaultBulkName = "vdd";				if (modelName == null) modelName = "P";                if (st090laytrans) {                    modelChar = "XM";                    modelName = "psvt";                }                if (tsmc090laytrans) {                    modelName = "pch";                }            } else if (fun == PrimitiveNode.Function.TRA4PMOS)			// PMOS (Complementary) 4-port transistor			{				modelChar = "M";				if (modelName == null) modelName = "P";                if (st090laytrans) {                    modelChar = "XM";                    modelName = "psvt";                }                if (tsmc090laytrans) {                    modelName = "pch";                }            } else if (fun == PrimitiveNode.Function.TRANPN)			// NPN (Junction) transistor			{				modelChar = "Q";				if (modelName == null) modelName = "NBJT";			} else if (fun == PrimitiveNode.Function.TRA4NPN)			// NPN (Junction) 4-port transistor			{				modelChar = "Q";				if (modelName == null) modelName = "NBJT";			} else if (fun == PrimitiveNode.Function.TRAPNP)			// PNP (Junction) transistor			{				modelChar = "Q";				if (modelName == null) modelName = "PBJT";			} else if (fun == PrimitiveNode.Function.TRA4PNP)			// PNP (Junction) 4-port transistor			{				modelChar = "Q";				if (modelName == null) modelName = "PBJT";			} else if (fun == PrimitiveNode.Function.TRANJFET)			// NJFET (N Channel) transistor			{				modelChar = "J";				biasCs = null;				if (modelName == null) modelName = "NJFET";			} else if (fun == PrimitiveNode.Function.TRA4NJFET)			// NJFET (N Channel) 4-port transistor			{				modelChar = "J";				if (modelName == null) modelName = "NJFET";			} else if (fun == PrimitiveNode.Function.TRAPJFET)			// PJFET (P Channel) transistor			{				modelChar = "J";				biasCs = null;				if (modelName == null) modelName = "PJFET";			} else if (fun == PrimitiveNode.Function.TRA4PJFET)			// PJFET (P Channel) 4-port transistor			{				modelChar = "J";				if (modelName == null) modelName = "PJFET";			} else if (fun == PrimitiveNode.Function.TRADMES ||			// DMES (Depletion) transistor				fun == PrimitiveNode.Function.TRA4DMES)					// DMES (Depletion) 4-port transistor			{				modelChar = "Z";				biasCs = null;				modelName = "DMES";			} else if (fun == PrimitiveNode.Function.TRAEMES ||			// EMES (Enhancement) transistor				fun == PrimitiveNode.Function.TRA4EMES)					// EMES (Enhancement) 4-port transistor			{				modelChar = "Z";				biasCs = null;				modelName = "EMES";			} else if (fun == PrimitiveNode.Function.TRANS)				// special transistor			{				modelChar = "Q";			}			if (ni.getName() != null) modelChar += getSafeNetName(ni.getName(), false);			StringBuffer infstr = new StringBuffer();            String drainName = drainCs.getName();            String gateName = gateCs.getName();            String sourceName = sourceCs.getName();            if (segmentedNets != null) {                drainName = segmentedNets.getNetName(ni.getTransistorDrainPort());                gateName = segmentedNets.getNetName(ni.getTransistorGatePort());                sourceName = segmentedNets.getNetName(ni.getTransistorSourcePort());            }			infstr.append(modelChar + " " + drainName + " " + gateName + " " + sourceName);			if (biasCs != null) {                String biasName = biasCs.getName();                if (segmentedNets != null && ni.getTransistorBiasPort() != null)                    biasName = segmentedNets.getNetName(ni.getTransistorBiasPort());                infstr.append(" " + biasName);            } else {                if (cell.getView() == View.LAYOUT && defaultBulkName != null)                    infstr.append(" " + defaultBulkName);            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -