<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 02 - Transistors Model for not uniform wafer (variant KP property)
Definicion de variables para calcular el Kp que varia sobre la oblea
Step1:  Variacion por cuadro de Kp del 0.0004%
Step2:  Matriz de Trasconductancia ideal KP_n_Ideal
Step3:  Matriz de Trasconductancia ideal KP_p_Ideal
Step4:  OPCION 1 Creacion de las matrices del material con variaciones en Kp_n y Kp_p a partir de la esquina
Step5:  OPCION 2 Creacion de las matrices del material con variaciones en Kp_n y Kp_p del centro hacia afuera
Step6:  Inicializando la matriz de dibujo en el material
Step7:  Ingrese las dimensiones LxW de los transistores
Step8:  OPCION 1 de Diseño de 4 transistores de optimizacion de espacio con centroide comun en la oblea, para usar 2 de esos en la simulacion del espejo de corriente
Step9:  OPCION 2, Diseño de 2 transistores de centroide comun con source compartido (ver imagen). Diseno sugerido de diferentes articulos
Step10:  Calculo del valor promedio de KP para cada transistor
Step11:  Con variacion de variacion a partir de la esquina de Kp en la oblea
Step12:  Con variacion del centro hacia afuera de Kp en la oblea
Step13:  NGSPICE Simulations - 01 Current Mirror
Circuitos a simular
Step14:  Funcion para editar los archivo de simulacion del espejo NMOS 'espejoNmosPythonFile.cir' y el espejo P 'espejoPmosPythonFile.cir'
Step15:  Espejo NMOS con variaciones  de KP_n en la oblea
Simulacion con variacion desde la esquina de Kp_n en la oblea y diseno 1 de ahorro de espacio, centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.
Step16:  Simulacion con variacion desde el centro de Kp_n en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.
Step17:  Simulacion con variacion desde la esquina de Kp_n en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.
Step18:  Simulacion con variacion desde el centro de Kp_n en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.
Step19:  Espejo PMOS con variaciones de KP_p en la oblea
Simulacion con variacion desde la esquina de Kp_p en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.
Step20:  Simulacion con variacion desde el centro de Kp_p en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.
Step21:  Simulacion con variacion desde la esquina de Kp_p en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.
Step22:  Simulacion con variacion desde el centro de Kp_p en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.
<ASSISTANT_TASK:>
Python Code:
from IPython.core.display import Image, display
display(Image(url='images/TipicalValuesLongChannel.png'))
Explanation: 02 - Transistors Model for not uniform wafer (variant KP property)
Definicion de variables para calcular el Kp que varia sobre la oblea
End of explanation
%matplotlib inline
import math
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import pylab as plb
def matrix(m_length,m_width):
    "Return matrix with no homogeneus resitivity"
    m = np.zeros((m_length,m_width))
    return m
Material_length=963e-6
scmos_process = 3.e-6
wafer_thickness = 0.05e-6
KP_n_base = 120e-6
KP_p_base = 40e-6
size_m = Material_length/scmos_process
delta_KP=0.05e-6
plt.style.use('ggplot')
Explanation: Variacion por cuadro de Kp del 0.0004%
End of explanation
KP_n_Ideal = matrix(int(size_m),int(size_m))
for i in range(0,int(math.sqrt(KP_n_Ideal.size))):
    for j in range(0,int(math.sqrt(KP_n_Ideal.size))):
        KP_n_Ideal[i][j]= KP_n_base
        
plt.matshow(KP_n_Ideal)
plt.show()
Explanation: Matriz de Trasconductancia ideal KP_n_Ideal
End of explanation
KP_p_Ideal = matrix(int(size_m),int(size_m))
for i in range(0,int(math.sqrt(KP_p_Ideal.size))):
    for j in range(0,int(math.sqrt(KP_p_Ideal.size))):
        KP_p_Ideal[i][j]= KP_p_base
        
plt.matshow(KP_p_Ideal)
plt.show()
Explanation: Matriz de Trasconductancia ideal KP_p_Ideal
End of explanation
Kp_n = matrix(int(size_m),int(size_m))
def corner_kp_n():
    for i in range(0,int(math.sqrt(Kp_n.size))):
        for j in range(0,int(math.sqrt(Kp_n.size))):
            Kp_n[i][j]= KP_n_base+(i+j)*delta_KP
corner_kp_n()
plt.matshow(Kp_n)
plt.show()
Kp_p = matrix(int(size_m),int(size_m))
def corner_kp_p():
    for i in range(0,int(math.sqrt(Kp_p.size))):
        for j in range(0,int(math.sqrt(Kp_p.size))):
            Kp_p[i][j]= KP_p_base+(i+j)*delta_KP
corner_kp_p()
plt.matshow(Kp_p)
plt.show()
Explanation: OPCION 1 Creacion de las matrices del material con variaciones en Kp_n y Kp_p a partir de la esquina
End of explanation
Kp_n = matrix(int(size_m),int(size_m))
def centroid_KP_n(center,i,j):
    "Return a value of KP_n for a single shape"
    difJ=abs(center-j)
    difI=abs(center-i)
    xy=0
    if difJ > difI:
        xy=difJ
    else:
        xy=difI
    Kpn= KP_n_base+(xy)*delta_KP
        
    return Kpn
def center_kp_n():
    for i in range(0,int(math.sqrt(Kp_n.size))):
        for j in range(0,int(math.sqrt(Kp_n.size))):
            Kp_n[i][j]= centroid_KP_n((int(math.sqrt(Kp_n.size))-1)/2,i,j)
center_kp_n()
plt.matshow(Kp_n)
plt.show()
Kp_p = matrix(int(size_m),int(size_m))
def centroid_KP_p(center,i,j):
    "Return a value of KP_n for a single shape"
    difJ=abs(center-j)
    difI=abs(center-i)
    xy=0
    if difJ > difI:
        xy=difJ
    else:
        xy=difI
    Kpp= KP_p_base+(xy)*delta_KP
        
    return Kpp
def center_kp_p():
    for i in range(0,int(math.sqrt(Kp_p.size))):
        for j in range(0,int(math.sqrt(Kp_p.size))):
            Kp_p[i][j]= centroid_KP_p((int(math.sqrt(Kp_p.size))-1)/2,i,j)
center_kp_p()
plt.matshow(Kp_p)
plt.show()
Explanation: OPCION 2 Creacion de las matrices del material con variaciones en Kp_n y Kp_p del centro hacia afuera
End of explanation
paint_matrix = matrix(int(size_m),int(size_m))
plt.matshow(paint_matrix)
plt.show()
Explanation: Inicializando la matriz de dibujo en el material
End of explanation
display(Image(url='images/WLCMOS.png'))
W_base=2
WTA=60
WTB=60
WTC=60
WTD=60
lenght_active_si_transistor = 6
L=2
Explanation: Ingrese las dimensiones LxW de los transistores
End of explanation
display(Image(url='images/Transistor.png'))
print("Diseno para ahorro de espacio en el transistor, W_base de 2 unidades")
paint_matrix = matrix(int(size_m),int(size_m))
common_source=9
def opcion1():
    M_center=int((int(math.sqrt(paint_matrix.size))-1)/2)
    TA = matrix(W_base,int((WTA/W_base+1)*(lenght_active_si_transistor/2)))
    for i in range(M_center-2-TA.shape[0],M_center-2):
        for j in range(M_center-2-TA.shape[1],M_center-2):
            paint_matrix[i][j]=1
    TB = matrix(W_base,int((WTB/W_base+1)*(lenght_active_si_transistor/2)))
    for i in range(M_center-2-TB.shape[0],M_center-2):
        for j in range(M_center+3,TB.shape[1]+M_center+3):
            paint_matrix[i][j]=2
    TC = matrix(W_base,int((WTC/W_base+1)*(lenght_active_si_transistor/2)))
    for i in range(M_center+3,TC.shape[0]+M_center+3):
        for j in range(M_center-2-TC.shape[1],M_center-2):
            paint_matrix[i][j]=3
    TD = matrix(W_base,int((WTD/W_base+1)*(lenght_active_si_transistor/2)))
    for i in range(M_center+3,TD.shape[0]+M_center+3):
        for j in range(M_center+3,TD.shape[1]+M_center+3):
            paint_matrix[i][j]=4
opcion1()
plt.matshow(paint_matrix)
plt.show()
Explanation: OPCION 1 de Diseño de 4 transistores de optimizacion de espacio con centroide comun en la oblea, para usar 2 de esos en la simulacion del espejo de corriente
End of explanation
display(Image(url='images/currentmirrorlayout.png'))
print("Diseno propuesto para layout del espejo de corriente")
paint_matrix = matrix(int(size_m),int(size_m))
common_source=9
def opcion2():
    
    M_center=int((int(math.sqrt(paint_matrix.size))-1)/2)
    Trasistor_branch_per_side=1
    shape_sides=4
    Transistor_branches=Trasistor_branch_per_side*shape_sides
    branch_W=int(WTA/Transistor_branches)
    TSource=matrix(int(2*branch_W+(lenght_active_si_transistor/2)*3),int(2*branch_W+(lenght_active_si_transistor/2)*3))
    for i in range(M_center-int(TSource.shape[0]/2),M_center+int(TSource.shape[0]/2)):
        for j in range(M_center-int(TSource.shape[0]/2),M_center+int(TSource.shape[0]/2)):
            paint_matrix[i][j]=common_source
    TA_1 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center-2-TA_1.shape[0],M_center-2):
        for j in range(M_center-TA_1.shape[1]-int(TSource.shape[0]/2),M_center-int(TSource.shape[0]/2)):
            paint_matrix[i][j]=4
    TA_2 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center+3,TA_2.shape[0]+M_center+3):
        for j in range(M_center+int(TSource.shape[0]/2)-1,TA_2.shape[1]+M_center+int(TSource.shape[0]/2)-1):
            paint_matrix[i][j]=4   
    TA_3 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center-TA_3.shape[1]-int(TSource.shape[0]/2),M_center-int(TSource.shape[0]/2)):
        for j in range(M_center+3,TA_3.shape[0]+M_center+3):
            paint_matrix[i][j]=4
    TA_4 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center+int(TSource.shape[0]/2)-1,TA_4.shape[1]+M_center+int(TSource.shape[0]/2)-1):
        for j in range(M_center-2-TA_4.shape[0],M_center-2):
            paint_matrix[i][j]=4
    TB_1 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center+3,TB_1.shape[0]+M_center+3):
        for j in range(M_center-TB_1.shape[1]-int(TSource.shape[0]/2),M_center-int(TSource.shape[0]/2)):
            paint_matrix[i][j]=5
    TB_2 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center-2-TB_2.shape[0],M_center-2):
        for j in range(M_center+int(TSource.shape[0]/2)-1,TB_2.shape[1]+M_center+int(TSource.shape[0]/2)-1):
            paint_matrix[i][j]=5
    TB_3 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center-TB_3.shape[1]-int(TSource.shape[0]/2),M_center-int(TSource.shape[0]/2)):
        for j in range(M_center-2-TB_3.shape[0],M_center-2):
            paint_matrix[i][j]=5
    TB_4 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center+int(TSource.shape[0]/2)-1,TB_4.shape[1]+M_center+int(TSource.shape[0]/2)-1):
        for j in range(M_center+3,TB_4.shape[0]+M_center+3):
            paint_matrix[i][j]=5 
        
opcion2()
plt.matshow(paint_matrix)
plt.show()
Explanation: OPCION 2, Diseño de 2 transistores de centroide comun con source compartido (ver imagen). Diseno sugerido de diferentes articulos:
[1] http://class.ece.iastate.edu/vlsi2/docs/Papers%20Done/1999-08-MWSCAS-ML.pdf
[2] http://www.wseas.us/e-library/conferences/2005venice/papers/508-397.pdf
End of explanation
def prom_KP_n_for_transistor(transistor_num,common_source):
    "Return a prom value of KP_n for a single transistor in the wafer"
    Kpn_sum=0
    Kpn_found=0
    for i in range(0,int(math.sqrt(paint_matrix.size))):
        for j in range(0,int(math.sqrt(paint_matrix.size))):
            if paint_matrix[i][j] == transistor_num:
                Kpn_sum += Kp_n[i][j]
                Kpn_found += 1
            if paint_matrix[i][j] == common_source:
                Kpn_sum += Kp_n[i][j]
                Kpn_found += 1
                
    Kpn_prom=Kpn_sum/(Kpn_found)
        
    return Kpn_prom
def prom_KP_p_for_transistor(transistor_num,common_source):
    "Return a prom value of KP_p for a single transistor in the wafer"
    Kpp_sum=0
    Kpp_found=0
    for i in range(0,int(math.sqrt(paint_matrix.size))):
        for j in range(0,int(math.sqrt(paint_matrix.size))):
            if paint_matrix[i][j] == transistor_num:
                Kpp_sum += Kp_p[i][j]
                Kpp_found += 1
            if paint_matrix[i][j] == common_source:
                Kpp_sum += Kp_p[i][j]
                Kpp_found += 1
                
    Kpp_prom=Kpp_sum/(Kpp_found)
        
    return Kpp_prom
Explanation: Calculo del valor promedio de KP para cada transistor
End of explanation
print("Para la opcion de diseno 1: Transistores ahorro de espacio con centroide: \n")
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
corner_kp_n()
plt.matshow(Kp_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Kpn_T1=prom_KP_n_for_transistor(1,common_source)
Kpn_T2=prom_KP_n_for_transistor(2,common_source)
Kpn_T3=prom_KP_n_for_transistor(3,common_source)
Kpn_T4=prom_KP_n_for_transistor(4,common_source)
print("Kp_n Transistor 1: "+str(Kpn_T1))
print("Kp_n Transistor 2: "+str(Kpn_T2))
print("Kp_n Transistor 3: "+str(Kpn_T3))
print("Kp_n Transistor 4: "+str(Kpn_T4))
corner_kp_p()
Kpp_T1=prom_KP_p_for_transistor(1,common_source)
Kpp_T2=prom_KP_p_for_transistor(2,common_source)
Kpp_T3=prom_KP_p_for_transistor(3,common_source)
Kpp_T4=prom_KP_p_for_transistor(4,common_source)
print("Kp_p Transistor 1: "+str(Kpp_T1))
print("Kp_p Transistor 2: "+str(Kpp_T2))
print("Kp_p Transistor 3: "+str(Kpp_T3))
print("Kp_p Transistor 4: "+str(Kpp_T4))
print("Para la opcion de diseno 2: Transistores con source comun en centroide: \n")
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
corner_kp_n()
plt.matshow(Kp_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Kpn_T1=prom_KP_n_for_transistor(4,common_source)
Kpn_T2=prom_KP_n_for_transistor(5,common_source)
print("Kp_n Transistor 1: "+str(Kpn_T1))
print("Kp_n Transistor 2: "+str(Kpn_T2))
corner_kp_p()
Kpp_T1=prom_KP_p_for_transistor(4,common_source)
Kpp_T2=prom_KP_p_for_transistor(5,common_source)
print("Kp_p Transistor 1: "+str(Kpp_T1))
print("Kp_p Transistor 2: "+str(Kpp_T2))
Explanation: Con variacion de variacion a partir de la esquina de Kp en la oblea
End of explanation
print("Para la opcion de diseno 1: Transistores ahorro de espacio con centroide: \n")
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
center_kp_n()
plt.matshow(Kp_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Kpn_T1=prom_KP_n_for_transistor(1,common_source)
Kpn_T2=prom_KP_n_for_transistor(2,common_source)
Kpn_T3=prom_KP_n_for_transistor(3,common_source)
Kpn_T4=prom_KP_n_for_transistor(4,common_source)
print("Kp_n Transistor 1: "+str(Kpn_T1))
print("Kp_n Transistor 2: "+str(Kpn_T2))
print("Kp_n Transistor 3: "+str(Kpn_T3))
print("Kp_n Transistor 4: "+str(Kpn_T4))
center_kp_p()
Kpp_T1=prom_KP_p_for_transistor(1,common_source)
Kpp_T2=prom_KP_p_for_transistor(2,common_source)
Kpp_T3=prom_KP_p_for_transistor(3,common_source)
Kpp_T4=prom_KP_p_for_transistor(4,common_source)
print("Kp_p Transistor 1: "+str(Kpp_T1))
print("Kp_p Transistor 2: "+str(Kpp_T2))
print("Kp_p Transistor 3: "+str(Kpp_T3))
print("Kp_p Transistor 4: "+str(Kpp_T4))
print("Para la opcion de diseno 2: Transistores con source comun en centroide: \n")
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
center_kp_n()
plt.matshow(Kp_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Kpn_T1=prom_KP_n_for_transistor(4,common_source)
Kpn_T2=prom_KP_n_for_transistor(5,common_source)
print("Kp_n Transistor 1: "+str(Kpn_T1))
print("Kp_n Transistor 2: "+str(Kpn_T2))
center_kp_p()
Kpp_T1=prom_KP_p_for_transistor(4,common_source)
Kpp_T2=prom_KP_p_for_transistor(5,common_source)
print("Kp_p Transistor 1: "+str(Kpp_T1))
print("Kp_p Transistor 2: "+str(Kpp_T2))
Explanation: Con variacion del centro hacia afuera de Kp en la oblea
End of explanation
display(Image(url='images/espejo_n.png'))
print("Espejo NMOS")
display(Image(url='images/espejo_p.png'))
print("Espejo PMOS")
Explanation: NGSPICE Simulations - 01 Current Mirror
Circuitos a simular:
End of explanation
import sys
import fileinput
def modificar_cir_Espejo_NMOS(W,L,Kp_T1,Kp_T2):
    text="* Simulación Circuito Espejo de Corriente con Ncmos, valores reales de Kp_n y Vt"+"\n"+ \
    "* Universidad Nacional de Colombia 2016"+"\n"+ \
    "* CMOS Analógico"+"\n"+ \
    "* Grupo Jorge Garzón, Esteban Iafrancesco A"+"\n"+ \
    "\n"+\
    "VDD VDD 0 DC 10 AC 0"+"\n"+\
    "V2 VR 0 DC 10 AC 0"+"\n"+\
    "VRD RDN VR DC 0 AC 0"+"\n"+\
    "RD RDN DRAIN 1000"+"\n"+\
    "RP VDD GATE 2000"+"\n"+\
    "M1 DRAIN GATE 0 0 nmosideal W="+str(W)+" L="+str(L)+"\n"+\
    "M2 GATE GATE 0 0 nmosideal W="+str(W)+" L="+str(L)+"\n"+\
    "\n"+\
    "VRD2 RDN2 VR DC 0 AC 0"+"\n"+\
    "RD2 RDN2 DRAIN2 1000"+"\n"+\
    "RP2 VDD GATE2 2000"+"\n"+\
    "M3 DRAIN2 GATE2 0 0 nmos1 W="+str(W)+" L="+str(L)+"\n"+\
    "M4 GATE2 GATE2 0 0 nmos2 W="+str(W)+" L="+str(L)+"\n"+\
    "\n"+\
    ".model nmosideal nmos LEVEL=1 Vto=0.8 KP=120u LAMBDA=0.01 U0=650"+"\n"+\
    ".model nmos1 nmos LEVEL=1 Vto=0.8 KP="+str(Kp_T1)+" LAMBDA=0.01 U0=650"+"\n"+\
    ".model nmos2 nmos LEVEL=1 Vto=0.8 KP="+str(Kp_T2)+" LAMBDA=0.01 U0=650"+"\n"+\
    "\n"+\
    ".control"+"\n"+\
    "set color0 =white"+"\n"+\
    "set color1=black"+"\n"+\
    "op"+"\n"+\
    "show all"+"\n"+\
    "dc vdd 0.7 12 0.01"+"\n"+\
    "plot i(vrd) i(vrd2)"+"\n"+\
    ".endc"+"\n"
    for i, line in enumerate(fileinput.input('../spice-simulations/espejoNmosPythonFile.cir', inplace=1)):
        if i == 1: sys.stdout.write(text) # replace 'sit' and write
    fileinput.close()
def modificar_cir_Espejo_PMOS(W,L,Kp_T1,Kp_T2):
    text="* Simulación Circuito Espejo de Corriente con Ncmos, valores reales de Kp_n y Vt"+"\n"+ \
    "* Universidad Nacional de Colombia 2016"+"\n"+ \
    "* CMOS Analógico"+"\n"+ \
    "* Grupo Jorge Garzón, Esteban Iafrancesco A"+"\n"+ \
    "\n"+\
    "VDD VDD 0 DC -10 AC 0"+"\n"+\
    "V2 VR 0 DC -10 AC 0"+"\n"+\
    "VRD RDN VR DC 0 AC 0"+"\n"+\
    "RD RDN DRAIN 1000"+"\n"+\
    "RP VDD GATE 2000"+"\n"+\
    "M1 DRAIN GATE 0 0 pmosideal W="+str(W)+" L="+str(L)+"\n"+\
    "M2 GATE GATE 0 0 pmosideal W="+str(W)+" L="+str(L)+"\n"+\
    "\n"+\
    "VRD2 RDN2 VR DC 0 AC 0"+"\n"+\
    "RD2 RDN2 DRAIN2 1000"+"\n"+\
    "RP2 VDD GATE2 2000"+"\n"+\
    "M3 DRAIN2 GATE2 0 0 pmos1 W="+str(W)+" L="+str(L)+"\n"+\
    "M4 GATE2 GATE2 0 0 pmos2 W="+str(W)+" L="+str(L)+"\n"+\
    "\n"+\
    ".model pmosideal pmos LEVEL=1 Vto=-0.9 KP=40u LAMBDA=0.0125 U0=250"+"\n"+\
    ".model pmos1 pmos LEVEL=1 Vto=-0.9 KP="+str(Kp_T1)+" LAMBDA=0.0125 U0=250"+"\n"+\
    ".model pmos2 pmos LEVEL=1 Vto=-0.9 KP="+str(Kp_T2)+" LAMBDA=0.0125 U0=250"+"\n"+\
    "\n"+\
    ".control"+"\n"+\
    "set color0 =white"+"\n"+\
    "set color1=black"+"\n"+\
    "op"+"\n"+\
    "show all"+"\n"+\
    "dc vdd -0.8 -12 -0.01"+"\n"+\
    "plot i(vrd) i(vrd2)"+"\n"+\
    ".endc"+"\n"
    for i, line in enumerate(fileinput.input('../spice-simulations/espejoPmosPythonFile.cir', inplace=1)):
        if i == 1: sys.stdout.write(text) # replace 'sit' and write
    fileinput.close()
Explanation: Funcion para editar los archivo de simulacion del espejo NMOS 'espejoNmosPythonFile.cir' y el espejo P 'espejoPmosPythonFile.cir'
End of explanation
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
corner_kp_n()
plt.matshow(Kp_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Kpn_T1=prom_KP_n_for_transistor(1,common_source)
Kpn_T2=prom_KP_n_for_transistor(2,common_source)
Kpn_T3=prom_KP_n_for_transistor(3,common_source)
Kpn_T4=prom_KP_n_for_transistor(4,common_source)
#modificar_cir_Espejo_NMOS(WTA,L,Kpn_T1,Kpn_T2)
display(Image(url='images/corner_TA_TB.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_n de la oblea. Transistores TA y TB")
#modificar_cir_Espejo_NMOS(WTA,L,Kpn_T1,Kpn_T3)
display(Image(url='images/corner_TA_TC.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_n de la oblea. Transistores TA y TC")
#modificar_cir_Espejo_NMOS(WTA,L,Kpn_T2,Kpn_T3)
display(Image(url='images/corner_TB_TC.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_n de la oblea. Transistores TB y TC")
Explanation: Espejo NMOS con variaciones  de KP_n en la oblea
Simulacion con variacion desde la esquina de Kp_n en la oblea y diseno 1 de ahorro de espacio, centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.
End of explanation
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
center_kp_n()
plt.matshow(Kp_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Kpn_T1=prom_KP_n_for_transistor(1,common_source)
Kpn_T2=prom_KP_n_for_transistor(2,common_source)
Kpn_T3=prom_KP_n_for_transistor(3,common_source)
Kpn_T4=prom_KP_n_for_transistor(4,common_source)
#modificar_cir_Espejo_NMOS(WTA,L,Kpn_T1,Kpn_T2)
display(Image(url='images/cetroid_Kp_TA_TB_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_n de la oblea. Transistores TA y TB")
#modificar_cir_Espejo_NMOS(WTA,L,Kpn_T2,Kpn_T3)
display(Image(url='images/cetroid_Kp_TB_TC_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_n de la oblea. Transistores TB y TC")
Explanation: Simulacion con variacion desde el centro de Kp_n en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.
End of explanation
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
corner_kp_n()
plt.matshow(Kp_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Kpn_T1=prom_KP_n_for_transistor(4,common_source)
Kpn_T2=prom_KP_n_for_transistor(5,common_source)
#modificar_cir_Espejo_NMOS(WTA,L,Kpn_T1,Kpn_T2)
display(Image(url='images/corner_Kp_CS_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_n de la oblea. Diseno de source compartido")
Explanation: Simulacion con variacion desde la esquina de Kp_n en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.
End of explanation
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
center_kp_n()
plt.matshow(Kp_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Kpn_T1=prom_KP_n_for_transistor(4,common_source)
Kpn_T2=prom_KP_n_for_transistor(5,common_source)
#modificar_cir_Espejo_NMOS(WTA,L,Kpn_T1,Kpn_T2)
display(Image(url='images/center_Kp_CS_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_n de la oblea. Diseno de source compartido")
Explanation: Simulacion con variacion desde el centro de Kp_n en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.
End of explanation
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
corner_kp_p()
plt.matshow(Kp_p)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Kpp_T1=prom_KP_p_for_transistor(1,common_source)
Kpp_T2=prom_KP_p_for_transistor(2,common_source)
Kpp_T3=prom_KP_p_for_transistor(3,common_source)
Kpp_T4=prom_KP_p_for_transistor(4,common_source)
#modificar_cir_Espejo_PMOS(WTA,L,Kpp_T1,Kpp_T2)
display(Image(url='images/corner_TA_TB_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal PMOS, Azul Espejo Con variaciones en KP_p de la oblea. Transistores TA y TB")
#modificar_cir_Espejo_PMOS(WTA,L,Kpp_T1,Kpp_T3)
display(Image(url='images/corner_TA_TC_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal PMOS, Azul Espejo Con variaciones en KP_p de la oblea. Transistores TA y TC")
#modificar_cir_Espejo_PMOS(WTA,L,Kpp_T2,Kpp_T3)
display(Image(url='images/corner_TB_TC_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal PMOS, Azul Espejo Con variaciones en KP_p de la oblea. Transistores TB y TC")
Explanation: Espejo PMOS con variaciones de KP_p en la oblea
Simulacion con variacion desde la esquina de Kp_p en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.
End of explanation
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
center_kp_p()
plt.matshow(Kp_p)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Kpp_T1=prom_KP_p_for_transistor(1,common_source)
Kpp_T2=prom_KP_p_for_transistor(2,common_source)
Kpp_T3=prom_KP_p_for_transistor(3,common_source)
Kpp_T4=prom_KP_p_for_transistor(4,common_source)
#modificar_cir_Espejo_PMOS(WTA,L,Kpp_T1,Kpp_T2)
display(Image(url='images/center_Kp_LS_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_p de la oblea. Transistores TA y TB")
#modificar_cir_Espejo_PMOS(WTA,L,Kpp_T2,Kpp_T3)
display(Image(url='images/center_Kp_LS_p_RB_RC.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_p de la oblea. Transistores TB y TC")
Explanation: Simulacion con variacion desde el centro de Kp_p en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.
End of explanation
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
corner_kp_p()
plt.matshow(Kp_p)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Kpp_T1=prom_KP_p_for_transistor(4,common_source)
Kpp_T2=prom_KP_p_for_transistor(5,common_source)
#modificar_cir_Espejo_PMOS(WTA,L,Kpp_T1,Kpp_T2)
display(Image(url='images/center_Kp_CS_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_p de la oblea. Diseno de source compartido")
Explanation: Simulacion con variacion desde la esquina de Kp_p en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.
End of explanation
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
center_kp_p()
plt.matshow(Kp_p)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Kpp_T1=prom_KP_p_for_transistor(4,common_source)
Kpp_T2=prom_KP_p_for_transistor(5,common_source)
#modificar_cir_Espejo_PMOS(WTA,L,Kpp_T1,Kpp_T2)
display(Image(url='images/center_Kp_CS_p_btr.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_p de la oblea. Diseno de source compartido")
Explanation: Simulacion con variacion desde el centro de Kp_p en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.
End of explanation
<END_TASK>