📄 spice.java
字号:
// {// 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 + -