Skip to content

Commit a4f34fc

Browse files
committed
add MOSFET tests
1 parent ab30e8c commit a4f34fc

File tree

1 file changed

+208
-0
lines changed

1 file changed

+208
-0
lines changed

test/Electrical/analog.jl

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,3 +540,211 @@ end
540540
# title = "RC Circuit Test with VariableResistor")
541541
# savefig(plt, "rc_circuit_test_variable_resistor")
542542
end
543+
544+
@testset "NMOS Transistor"
545+
546+
@mtkmodel SimpleNMOSCircuit begin
547+
@components begin
548+
Q1 = NMOS()
549+
Vcc = Voltage()
550+
Vb = Voltage()
551+
ground = Ground()
552+
553+
Vcc_const = Constant(k=V_cc)
554+
Vb_const = Constant(k=V_b)
555+
end
556+
557+
@parameters begin
558+
V_cc = 5.0
559+
V_b = 3.5
560+
end
561+
@equations begin
562+
#voltage sources
563+
connect(Vcc_const.output, Vcc.V)
564+
connect(Vb_const.output, Vb.V)
565+
566+
#ground connections
567+
connect(Vcc.n, Vb.n, ground.g, Q1.s)
568+
569+
#other stuff
570+
connect(Vcc.p, Q1.d)
571+
connect(Vb.p, Q1.g)
572+
end
573+
end
574+
575+
@mtkbuild sys = SimpleNMOSCircuit(V_cc = 5.0, V_b = 3.5)
576+
577+
prob = ODEProblem(sys, Pair[], (0.0, 10.0))
578+
sol = solve(prob)
579+
@test sol[sys.Q1.d.i][1] 0.0874
580+
@test sol[sys.Q1.s.i][1] -0.0874
581+
@test sol[sys.Q1.g.i][1] == 0.0
582+
@test sol[sys.Q1.d.v][1] == 5.0
583+
@test sol[sys.Q1.s.v] < sol[sys.Q1.d.v]
584+
585+
# test device symmetry
586+
@mtkmodel FlippedNMOSCircuit begin
587+
@components begin
588+
Q1 = NMOS()
589+
Vcc = Voltage()
590+
Vb = Voltage()
591+
ground = Ground()
592+
593+
Vcc_const = Constant(k=V_cc)
594+
Vb_const = Constant(k=V_b)
595+
end
596+
597+
@parameters begin
598+
V_cc = 5.0
599+
V_b = 3.5
600+
end
601+
@equations begin
602+
#voltage sources
603+
connect(Vcc_const.output, Vcc.V)
604+
connect(Vb_const.output, Vb.V)
605+
606+
#ground connections
607+
connect(Vcc.n, Vb.n, ground.g, Q1.d)
608+
609+
#other stuff
610+
connect(Vcc.p, Q1.s)
611+
connect(Vb.p, Q1.g)
612+
end
613+
end
614+
615+
@mtkbuild flipped_sys = FlippedNMOSCircuit(V_cc=5.0, V_b=3.5)
616+
617+
flipped_prob = ODEProblem(flipped_sys, Pair[], (0.0, 10.0))
618+
flipped_sol = solve(flipped_prob)
619+
@test flipped_sol[flipped_sys.Q1.d.i][1] -0.0874
620+
@test flipped_sol[flipped_sys.Q1.s.i][1] 0.0874
621+
@test flipped_sol[flipped_sys.Q1.s.v] > flipped_sol[flipped_sys.Q1.d.v]
622+
623+
# channel length modulation
624+
@mtkmodel SimpleNMOSCircuit begin
625+
@components begin
626+
Q1 = NMOS(use_channel_length_modulation = false)
627+
Vcc = Voltage()
628+
Vb = Voltage()
629+
ground = Ground()
630+
631+
Vcc_const = Constant(k=V_cc)
632+
Vb_const = Constant(k=V_b)
633+
end
634+
635+
@parameters begin
636+
V_cc = 5.0
637+
V_b = 3.5
638+
end
639+
@equations begin
640+
#voltage sources
641+
connect(Vcc_const.output, Vcc.V)
642+
connect(Vb_const.output, Vb.V)
643+
644+
#ground connections
645+
connect(Vcc.n, Vb.n, ground.g, Q1.s)
646+
647+
#other stuff
648+
connect(Vcc.p, Q1.d)
649+
connect(Vb.p, Q1.g)
650+
end
651+
end
652+
653+
@mtkbuild sys = SimpleNMOSCircuit(V_cc = 5.0, V_b = 3.5)
654+
655+
prob = ODEProblem(sys, Pair[], (0.0, 10.0))
656+
sol = solve(prob)
657+
@test sol[sys.Q1.d.i][1] 0.0729
658+
@test sol[sys.Q1.s.i][1] -0.0729
659+
end
660+
661+
662+
@testset "PMOS Transistor"
663+
664+
@mtkmodel SimplePMOSCircuit begin
665+
@components begin
666+
Q1 = SimplePMOS(use_channel_length_modulation = false)
667+
Vs = Voltage()
668+
Vb = Voltage()
669+
Vd = Voltage()
670+
ground = Ground()
671+
672+
Vs_const = Constant(k=V_s)
673+
Vb_const = Constant(k=V_b)
674+
Vd_const = Constant(k=V_d)
675+
end
676+
677+
@parameters begin
678+
V_s = 5.0
679+
V_b = 3.5
680+
V_d = 0.0
681+
end
682+
@equations begin
683+
#voltage sources
684+
connect(Vs_const.output, Vs.V)
685+
connect(Vb_const.output, Vb.V)
686+
connect(Vd_const.output, Vd.V )
687+
688+
#ground connections
689+
connect(Vs.n, Vb.n, ground.g, Vd.n)
690+
691+
connect(Vd.p, Q1.d)
692+
#other stuff
693+
connect(Vs.p, Q1.s)
694+
connect(Vb.p, Q1.g)
695+
end
696+
end
697+
698+
@mtkbuild sys = SimplePMOSCircuit(V_s=5.0, V_b=2.5, V_d = 3)
699+
700+
prob = ODEProblem(sys, Pair[], (0.0, 10.0))
701+
sol = solve(prob)
702+
703+
@test sol[sys.Q1.d.i][1] -0.0091998
704+
@test sol[sys.Q1.s.i][1] 0.0091998
705+
706+
# device symmetry
707+
@mtkmodel FlippedPMOSCircuit begin
708+
@components begin
709+
Q1 = PMOS()
710+
Vs = Voltage()
711+
Vb = Voltage()
712+
Vd = Voltage()
713+
ground = Ground()
714+
715+
Vs_const = Constant(k=V_s)
716+
Vb_const = Constant(k=V_b)
717+
Vd_const = Constant(k=V_d)
718+
end
719+
720+
@parameters begin
721+
V_s = 5.0
722+
V_b = 3.5
723+
V_d = 0.0
724+
end
725+
@equations begin
726+
#voltage sources
727+
connect(Vs_const.output, Vs.V)
728+
connect(Vb_const.output, Vb.V)
729+
connect(Vd_const.output, Vd.V )
730+
731+
#ground connections
732+
connect(Vs.n, Vb.n, ground.g, Vd.n)
733+
734+
connect(Vd.p, Q1.s)
735+
#other stuff
736+
connect(Vs.p, Q1.d)
737+
connect(Vb.p, Q1.g)
738+
end
739+
end
740+
741+
@mtkbuild flipped_sys = FlippedPMOSCircuit(V_s=5.0, V_b=2.5, V_d = 3)
742+
743+
flipped_prob = ODEProblem(flipped_sys, Pair[], (0.0, 10.0))
744+
flipped_sol = solve(flipped_prob)
745+
746+
flipped_sol[flipped_sys.Q1.d.i][1] 0.0091998
747+
flipped_sol[flipped_sys.Q1.s.i][1] -0.0091998
748+
749+
750+
end

0 commit comments

Comments
 (0)