Requires: Utmost IV
Minimum Versions: Utmost IV 1.10.6.R
This example describes how to use a script to compare two model cards.
It is not necessary for the model parameters to appear in the same order
in each of the model cards. It is not necessary for the model parameters
to have the same ‘case’ in each of the model cards. For example, a
parameter called ‘VTH0’ is the same as a parameter called ‘vth0’, since
SPICE is case insensitive.
The script will generate a report output file when it is done which will
describe the model differences or let you know that the models are
identical. The script will alert you to the following differences.
- Model card types are different
- Parameter values are different
- Parameter expressions are different
- Parameter is an expression in one card and a value in the other
- Parameter exists only in one of the cards
The Utmost IV script is shown here
script_ex02.sjs. The models in this example are called
nmos1
and
nmos2
and are contained in the files
script_ex02_model1.l and
script_ex02_model2.l.
The script file and the input model library files must be saved into the
directory from which you run the following command.
utmost4 -s script_ex02.sjs
When the script runs, the models will be read in from the
input library files, then an output report
script_ex02_report.txt will be generated which will describe any differences in the model cards.
Files
script_ex02_model1.l
.MODEL nmos1 NMOS (
+LEVEL = 49 VERSION = 3.3 TNOM = 27
+TOX = 1.4e-08 XJ = 1.5e-07 NCH = 1.7e+17
+VTH0 = 0.7 K1 = 0.5 K2 = -0.0186
+K3 = 80 K3B = 0 W0 = 2.5e-06
+NLX = 1.74e-07 DVT0W = 0 DVT1W = 0
+DVT2W = -0.032 DVT0 = 2.2 DVT1 = 0.53
+DVT2 = -0.032 U0 = 0.067 UA = 2.25e-09
+UB = 5.9e-19 UC = -4.6e-11 VSAT = 80000
+A0 = 1 AGS = 0 B0 = 0
+B1 = 0 KETA = -0.047 A1 = 0
+A2 = 1 RDSW = 0 PRWG = 0
+PRWB = 0 WR = 1 WINT = 0
+LINT = 0 XL = 0 XW = 0
+DWG = 0 DWB = 0 VOFF = -0.1
+CDSCD = 0 CDSCB = 0 ETA0 = 0.08
+ETAB = -0.07 DSUB = 0.56 PCLM = 1.3
+PDIBLC1 = 0.39 PDIBLC2 = 0.0086 PDIBLCB = 0
+DROUT = 0.56 PSCBE1 = 8e+08 PSCBE2 = 5e-05
+PVAG = 0 DELTA = 0.01 MOBMOD = 1
+PRT = 0 UTE = -1.5 KT1 = 0
+KT1L = 0 KT2 = 0 UA1 = 4.3e-09
+UB1 = -7.6e-18 UC1 = -5.6e-11 AT = 33000
+NQSMOD = 0 WL = 0 WLN = 1
+WW = 0 WWN = 1 WWL = 0
+LL = 0 LLN = 1 LW = 0
+LWN = 1 LWL = 0 CAPMOD = 2
+TPB = 0 TPBSW = 0 TPBSWG = 0
+TCJ = 0 TCJSW = 0 TCJSWG = 0
+NOFF = 1 ACDE = 1 MOIN = 15 )
script_ex02_model2.l
.MODEL nmos2 NMOS (
+LEVEL = 49 VERSION = 3.3 TNOM = 27
+tox = 1.4e-08 XJ = 1.5e-07 NCH = 1.7e+17
+VTH0 = '0.7 + dvth' K1 = '0.5' K2 = -0.0186
+K3 = 80 K3B = 0 W0 = 2.5e-06
+NLX = 1.74e-07 DVT0W = 0 DVT1W = 0
+DVT2W = -0.032 dvt0 = 2.2 DVT1 = 0.53
+DVT2 = -0.032 U0 = 0.072 UA = 2.25e-09
+UB = 7.4e-19 uc = -4.6e-11 VSAT = 80000
+A0 = 1 AGS = 0 B0 = 0
+B1 = 0 KETA = -0.047 A1 = 0
+A2 = 1 RDSW = 0 PRWG = 0
+CDSCD = 0 CDSCB = 0 ETA0 = 0.08
+ETAB = -0.07 DSUB = 0.56 PCLM = 1.3
+PDIBLC1 = 0.39 PDIBLC2 = 0.0086 PDIBLCB = 0
+DROUT = 0.56 PSCBE1 = 8e+08 PSCBE2 = 5e-05
+PVAG = 0 DELTA = 0.01 MOBMOD = 1
+PRWB = 0 WR = 1 WINT = 0
+DWG = 0 DWB = 0 VOFF = -0.1
+NFACTOR = 1 CIT = 0 CDSC = 0.00024
+PRT = 0 UTE = -1.5 KT1 = 0
+KT1L = 0 KT2 = 0 UA1 = 4.3e-09
+UB1 = -7.6e-18 UC1 = -5.6e-11 AT = 33000
+NQSMOD = 0 WL = 0 WLN = 1
+WW = 0 WWN = 1 WWL = 0
+LL = 0 LLN = 1 LW = 0
+LWN = 1 LWL = 0 CAPMOD = 2
+TPB = 0 TPBSW = 0 TPBSWG = 0
+TCJ = 0 TCJSW = 0 TCJSWG = 0
+NOFF = 1 ACDE = 1 MOIN = 15 )
script_ex02_report.txt
Differences found between models:
First Second
Model Model
Name nmos1 nmos2
VTH0 0.7 '0.7 + dvth'
K1 0.5 '0.5'
U0 0.067 0.072
UB 5.9e-19 7.4e-19
LINT 0 ---
XL 0 ---
XW 0 ---
NFACTOR --- 1
CIT --- 0
CDSC --- 0.00024
script_ex02.sjs
var i;
var reportFileName = "script_ex02_report.txt";
var diff = reportText = "";
var myDir;
var myLib1, myCardType1, parNames1, numPars1, par1isVal, par1Val;
var myLib2, myCardType2, parNames2, numPars2, par2isVal, par2Val;
var parName;
var file1 = "script_ex02_model1.l";
var file2 = "script_ex02_model2.l";
var modelName1 = "nmos1";
var modelName2 = "nmos2";
var column = "optVal";
myDir = Silvaco.Utmost4.openCurrentWorkingDirectory ();
myLib1 = Silvaco.Utmost4.makeModelLibrary ();
myLib2 = Silvaco.Utmost4.makeModelLibrary ();
myLib1.importModelCards (myDir, file1, "", "", modelName1, column);
myLib2.importModelCards (myDir, file2, "", "", modelName2, column);
/* Compare the type of the cards */
myCardType1 = myLib1.getCardType (modelName1);
myCardType2 = myLib2.getCardType (modelName2);
if (myCardType1!=myCardType2){
diff += "Type\t" + myCardType1 + "\t" + myCardType2 + "\n\n";
}
/* Compare the number of parameters */
parNames1 = myLib1.getParamNames (modelName1);
parNames2 = myLib2.getParamNames (modelName2);
numPars1 = parNames1.length;
numPars2 = parNames2.length;
for (i=0;i<numPars1;i++)
{
parName = parNames1[i];
par1Val = readValue (myLib1, modelName1, parName, column, par1isVal);
if (myLib2.hasParameter (modelName2, parName))
{
par2Val = readValue (myLib2, modelName2, parName, column, par2isVal);
if (par1isVal != par2isVal || par1Val != par2Val)
diff += parName + "\t\t" + par1Val + "\t\t" + par2Val + "\n";
}
else
diff += parName + "\t\t" + par1Val + "\t\t---\n";
}
for (i=0;i<numPars2;i++)
{
parName = parNames2[i];
par2Val = readValue (myLib2, modelName2, parName, column, par2isVal);
if (!myLib1.hasParameter (modelName1, parName))
diff += parName + "\t\t---\t\t" + par2Val + "\n";
}
if (diff.length > 0)
{
reportText = "\n\nDifferences found between models:\n\n";
reportText += "\t\tFirst\t\tSecond\n";
reportText += "\t\tModel\t\tModel\n\n";
reportText += "Name\t\t" + modelName1 + "\t\t" + modelName2 + "\n\n";
reportText += diff;
}
else
reportText = "\n\nThe models are identical"+"\n";
Silvaco.Utmost4.writeToFile (myDir, reportFileName, reportText, "overwrite");
function readValue (modelLib, modelName, paramName, column, parIsVal)
{
var parVal;
parIsVal = modelLib.getValue (modelName, parName, "isVal");
if (parIsVal)
parVal = modelLib.getValue (modelName, parName, column);
else
parVal = "'" + modelLib.getValue (modelName, parName, "expr") + "'";
return parVal;
}