@@ -540,3 +540,211 @@ end
540540 # title = "RC Circuit Test with VariableResistor")
541541 # savefig(plt, "rc_circuit_test_variable_resistor")
542542end
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