10.4.3. SPECTRE simulator interface¶
This demo shows how to use the SPECTRE simulator interface.
Read chapter SPICE OPUS simulator interface to learn about the circuit and its description. The file names are the same as in the SPICE OPUS example, except that the files are using the SPECTRE syntax.
File: demo/evaluation/01-simulator-spectre/runme.py
# Test Spectre simulator interface
from pyopus.simulator import simulatorClass
if __name__=='__main__':
# Job list for simulator
jobList=[
{ # First job - op analysis
'name': 'dcop',
'definitions': [
{ 'file': 'cmos180n.scs', 'section': 'tm' },
{ 'file': 'opamp.scs' }
],
'params': {
'vdd': 1.8,
'temperature': 25
},
'options': {
'reltol': 0.001
},
'saves': [
'p("vdd", "pwr")', 'all()'
],
'command': 'op()'
},
{ # Second job - op analysis with different temperature
'name': 'dcop100',
'definitions': [
{ 'file': 'cmos180n.scs', 'section': 'tm' },
{ 'file': 'opamp.scs' }
],
'params': {
'vdd': 1.6,
'temperature': 100
},
'options': {
'reltol': 0.001
},
'saves': [
],
'command': 'op()'
},
{ # Third job - op analysis with different supply voltage
'name': 'dcopv33',
'definitions': [
{ 'file': 'cmos180n.scs', 'section': 'tm' },
{ 'file': 'opamp.scs' }
],
'params': {
'vdd': 2.0,
'temperature': 25
},
'options': {
'reltol': 0.001
},
'saves': [
],
'command': 'op()'
},
{ # Fourth job - op analysis with different library
'name': 'dcopff',
'definitions': [
{ 'file': 'cmos180n.scs', 'section': 'ws' },
{ 'file': 'opamp.scs' }
],
'params': {
'vdd': 2.0,
'temperature': 25
},
'options': {
'reltol': 0.001
},
'saves': [
],
'command': 'op()'
},
{ # Fifth job - op analysis with different library
'name': 'dcopff100',
'definitions': [
{ 'file': 'cmos180n.scs', 'section': 'ws' },
{ 'file': 'opamp.scs' }
],
'params': {
'vdd': 2.0,
'temperature': 100
},
'options': {
'reltol': 0.001
},
'saves': [
],
'command': 'op()'
}
]
# Input parameters
inParams={
'mirr_w': 7.46e-005,
'mirr_l': 5.63e-007
}
# Create simulator
sim=simulatorClass("Spectre")(debug=10, saveSplit=False)
# Set job list and optimize it
sim.setJobList(jobList)
# Print optimized job groups
ngroups=sim.jobGroupCount()
print("\nJob Groups:")
for i in range(ngroups):
group=sim.jobGroup(i)
gstr=''
for j in group:
gstr+=" %d (%s), " % (j, jobList[j]['name'])
print(" %d: %s" % (i, gstr))
print("")
# Set input parameters
sim.setInputParameters(inParams)
# Go through all job groups, write file, run it and collect results
for i in range(ngroups):
# Run jobs in job group.
(jobIndices, status)=sim.runJobGroup(i)
print("")
for j in jobIndices:
# Job name
jobName=jobList[j]['name']
# Load results
res=sim.readResults(j, status)
# Print results
if res is not None:
print("Job %d (%s): Vout=%e" % (j, jobName, res.v("out")))
print("Job %d (%s): Isrc=%e" % (j, jobName, res.i("vdd")))
try:
print("Job %d (%s): Pvdd=%e" % (j, jobName, res.p("vdd", "pwr")))
except:
pass
else:
print("Job %d (%s): no results" % (j, name))
print("")
sim.cleanup()