The listing that follows is an operating range analysis control file for a Josephson binary counter circuit.
3 stage Josephson counter, operating range analysis
.check
.exec
# Margins of a Josephson binary counter
# This is an example of an operating range analysis input file
#
# After sourcing the file, optionally enter "mplot -on" to see results
# graphically, then "check" to initiate run. The results will be left
# in a file.
#
compose checkPNTS values 50p 135p 185p 235p 285p 335p 385p 435p 485p
checkFAIL = 0
# above two lines are required in header, the rest are optional
#
# central value of first variable, number of evaluation steps above and
# below, step delta:
checkVAL1 = 13
checkSTP1 = 5
checkDEL1 = .5
#
# same thing for second variable
checkVAL2 = 38
checkSTP2 = 5
checkDEL2 = 1
#
# one can define other initialized constants here as well
failthres = 1
#
# end of header
.endc
.control
#
# The following code is evaluated just after the time variable exceeds
# each one of the checkPNTS
#
if time > checkPNTS[0]
if time < checkPNTS[1]
# time is 50p, set quiescent phase differences. Uninitialized variables
# do not require declaration in header
p0 = v(200) - v(201)
p1 = v(300) - v(301)
p2 = v(400) - v(401)
checkFAIL = 0
# echo "tp1" to screen
echo tp1
end
end
if time > checkPNTS[1]
if time < checkPNTS[2]
# time = 135p, state should be '001'. if not set checkFAIL to 1
# pi and the other variables in the 'constants' plot are known
if abs(v(200) - v(201) + p0 - 2*pi) > failthres
checkFAIL = 1;
end
if abs(v(300) - v(301) - p1) > failthres
checkFAIL = 1;
end
if abs(v(400) - v(401) - p2) > failthres
checkFAIL = 1;
end
echo tp2
end
end
if time > checkPNTS[2]
if time < checkPNTS[3]
# time = 185p, state should be '010'. if not set checkFAIL to 1
if abs(v(200) - v(201) - p0) > failthres
checkFAIL = 1;
end
if abs(v(300) - v(301) + p1 - 2*pi) > failthres
checkFAIL = 1;
end
if abs(v(400) - v(401) - p2) > failthres
checkFAIL = 1;
end
echo tp3
end
end
if time > checkPNTS[3]
if time < checkPNTS[4]
# time = 235p, state should be '011'. if not set checkFAIL to 1
if abs(v(200) - v(201) + p0 - 2*pi) > failthres
checkFAIL = 1;
end
if abs(v(300) - v(301) + p1 - 2*pi) > failthres
checkFAIL = 1;
end
if abs(v(400) - v(401) - p2) > failthres
checkFAIL = 1;
end
echo tp4
end
end
if time > checkPNTS[4]
if time < checkPNTS[5]
# time = 285p, state should be '100'. if not set checkFAIL to 1
if abs(v(200) - v(201) - p0) > failthres
checkFAIL = 1;
end
if abs(v(300) - v(301) - p1) > failthres
checkFAIL = 1;
end
if abs(v(400) - v(401) + p2 - 2*pi) > failthres
checkFAIL = 1;
end
echo tp5
end
end
if time > checkPNTS[5]
if time < checkPNTS[6]
# time = 335p, state should be '101'. if not set checkFAIL to 1
if abs(v(200) - v(201) + p0 - 2*pi) > failthres
checkFAIL = 1;
end
if abs(v(300) - v(301) - p1) > failthres
checkFAIL = 1;
end
if abs(v(400) - v(401) + p2 - 2*pi) > failthres
checkFAIL = 1;
end
echo tp6
end
end
if time > checkPNTS[6]
if time < checkPNTS[7]
# time = 385p, state should be '110'. if not set checkFAIL to 1
if abs(v(200) - v(201) - p0) > failthres
checkFAIL = 1;
end
if abs(v(300) - v(301) + p1 - 2*pi) > failthres
checkFAIL = 1;
end
if abs(v(400) - v(401) + p2 - 2*pi) > failthres
checkFAIL = 1;
end
echo tp7
end
end
if time > checkPNTS[7]
if time < checkPNTS[8]
# time = 435p, state should be '111'. if not set checkFAIL to 1
if abs(v(200) - v(201) + p0 - 2*pi) > failthres
checkFAIL = 1;
end
if abs(v(300) - v(301) + p1 - 2*pi) > failthres
checkFAIL = 1;
end
if abs(v(400) - v(401) + p2 - 2*pi) > failthres
checkFAIL = 1;
end
end
end
#
# end of pass/fail logic
.endc
.tran 1p 500p uic
.subckt count 1 4 5 6 7
c1 4 0 3.2p
r1 3 8 .4
r2 4 9 1.1
b1 3 0 6 jj1
b2 5 0 7 jj1
l1 3 4 2.0p
l2 4 5 2.0p
l3 1 2 2.0p
l4 2 0 2.0p
l5 8 0 1.4p
l6 9 0 .1p
k1 l1 l3 .99
k2 l2 l4 .99
.ends count
r1 17 2 50
r2 1 6 50
r3 1 10 50
r4 1 14 50
r5 3 18 50
r6 7 13 50
r7 11 13 50
r8 15 13 50
r9 3 20 50
r10 4 5 .43
r11 8 9 .43
r12 12 19 .43
r13 16 30 .5
l1 5 6 2.1p
l2 9 10 2.1p
l3 19 14 2.1p
l4 30 0 2p
x1 3 2 4 100 101 count
x2 7 6 8 200 201 count
x3 11 10 12 300 301 count
x4 15 14 16 400 401 count
*
* These are the sources which vary
* In general, the $value1 or $value2 symbols can replace any numerical
* parameter in the circuit description. No checking is done as to whether
* the substitution makes sense.
*
*flux bias
v1 13 0 pulse(0 $value1%m 10p 10p)
*gate bias
v2 1 0 pulse(0 $value2%m 10p 10p)
*
*
v3 20 0 pwl(0 0 70p 0
+ 75p 15m 90p 15m 100p -15m 115p -15m
+ 125p 15m 140p 15m 150p -15m 165p -15m
+ 175p 15m 190p 15m 200p -15m 215p -15m
+ 225p 15m 240p 15m 250p -15m 265p -15m
+ 275p 15m 290p 15m 300p -15m 315p -15m
+ 325p 15m 340p 15m 350p -15m 365p -15m
+ 375p 15m 390p 15m 400p -15m 415p -15m
+ 425p 15m 440p 15m 450p -15m 465p -15m 500p -15m)
*
* flux bias first stage
v4 18 0 pulse(0 13m 10p 10p)
*gate bias first stage
v5 17 0 pulse(0 39m 8p 10p)
*
*Nb 3000 A/cm2 area = 20 square microns
.model jj1 jj(rtype=1,cct=1,icon=10m,vg=2.8m,delv=0.08m,
+ icrit=0.6m,r0=49.999998,rn=2.745098,cap=0.777093p)
.end