예제 #1
0
def SetupInitialResistorSystem(device, region, net_doping=1e16):
    '''
      resistor physics
    '''
    devsim.set_parameter(device=device, region=region, name='net_doping', value=net_doping)
    devsim.node_solution(device=device, region=region, name='Potential')
    devsim.edge_from_node_model(device=device, region=region, node_model='Potential')

    # node models
    for name, equation in (
        ("NetDoping",                 "net_doping"),
      ("IntrinsicElectrons",        "NetDoping"),
      ("IntrinsicCharge",           "-IntrinsicElectrons + NetDoping"),
      ("IntrinsicCharge:Potential", "-IntrinsicElectrons:Potential"),
    ):
        devsim.node_model(device=device, region=region, name=name, equation=equation)

    # edge models
    for name, equation in (
        ("ElectricField",              "(Potential@n0 - Potential@n1)*EdgeInverseLength"),
      ("ElectricField:Potential@n0", "EdgeInverseLength"),
      ("ElectricField:Potential@n1", "-EdgeInverseLength"),
      ("PotentialEdgeFlux",              "Permittivity*ElectricField"),
      ("PotentialEdgeFlux:Potential@n0", "diff(Permittivity*ElectricField, Potential@n0)"),
      ("PotentialEdgeFlux:Potential@n1", "-PotentialEdgeFlux:Potential@n0"),
    ):
        devsim.edge_model(device=device, region=region, name=name, equation=equation)

    ####
    #### PotentialEquation
    ####
    devsim.equation(device=device, region=region, name="PotentialEquation", variable_name="Potential", edge_model="PotentialEdgeFlux", variable_update="log_damp")
예제 #2
0
def createSiliconPotentialOnly(device, region):
    ie = devsim.node_model(device=device,
                           region=region,
                           name="IntrinsicElectrons",
                           equation="n_i*exp(Potential/V_t)")
    res = devsim.node_model(device=device,
                            region=region,
                            name="IntrinsicElectrons:Potential",
                            equation="diff(%s, Potential)" % ie)
    for name, equation in (
        ("IntrinsicHoles", "n_i^2/IntrinsicElectrons"),
        ("IntrinsicHoles:Potential",
         "diff(n_i^2/IntrinsicElectrons, Potential)"),
        ("IntrinsicCharge", "IntrinsicHoles-IntrinsicElectrons + NetDoping"),
        ("IntrinsicCharge:Potential",
         "diff(IntrinsicHoles-IntrinsicElectrons, Potential)"),
        ("PotentialIntrinsicNodeCharge", "-ElectronCharge*IntrinsicCharge"),
        ("PotentialIntrinsicNodeCharge:Potential",
         "diff(-ElectronCharge*IntrinsicCharge, Potential)"),
    ):
        devsim.node_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    for name, equation in (
        ("ElectricField", "(Potential@n0-Potential@n1)*EdgeInverseLength"),
        ("ElectricField:Potential@n0", "EdgeInverseLength"),
        ("ElectricField:Potential@n1", "-ElectricField:Potential@n0"),
        ("PotentialEdgeFlux", "Permittivity*ElectricField"),
        ("PotentialEdgeFlux:Potential@n0",
         "diff(Permittivity*ElectricField,Potential@n0)"),
        ("PotentialEdgeFlux:Potential@n1", "-PotentialEdgeFlux:Potential@n0"),
    ):
        devsim.edge_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    devsim.equation(device=device,
                    region=region,
                    name="PotentialEquation",
                    variable_name="Potential",
                    node_model="PotentialIntrinsicNodeCharge",
                    edge_model="PotentialEdgeFlux",
                    variable_update="log_damp")
예제 #3
0
def SetupCarrierResistorContact(device,
                                contact,
                                use_circuit_bias=False,
                                circuit_node=""):
    '''
    Electron continuity equation at contact
  '''
    if circuit_node:
        bias_name = circuit_node
    else:
        bias_name = contact + "bias"
    region = devsim.get_region_list(device=device, contact=contact)[0]
    if 'celec' not in devsim.get_node_model_list(device=device, region=region):
        devsim.node_model(
            device=device,
            region=region,
            name="celec",
            equation=
            "0.5*(NetDoping+(NetDoping^2 + 4 * IntrinsicDensity^2)^(0.5))")

    for name, equation in (
        ("%snodeelectrons" % contact, "Electrons - celec"),
        ("%snodeelectrons:Electrons" % contact, "1."),
    ):
        devsim.contact_node_model(device=device,
                                  contact=contact,
                                  name=name,
                                  equation=equation)

    if use_circuit_bias:
        devsim.contact_equation(device=device,
                                contact=contact,
                                name="ElectronContinuityEquation",
                                variable_name="Electrons",
                                node_model="%snodeelectrons" % contact,
                                edge_current_model="ElectronCurrent",
                                circuit_node=bias_name)
    else:
        devsim.contact_equation(device=device,
                                contact=contact,
                                name="ElectronContinuityEquation",
                                variable_name="Electrons",
                                node_model="%snodeelectrons" % contact,
                                edge_current_model="ElectronCurrent")
예제 #4
0
def setup_dg_volume(device, region, normalized=False):
    #
    # Lambda Equations
    #
    #em = (
    #  ("Le_eqn",         "Le/b_n"),
    #  ("Le_eqn:Le",      "1/b_n"),
    #  ("Lh_eqn",         "Lh/b_p"),
    #  ("Lh_eqn:Lh",      "1/b_p"),
    #)
    em = (
        #    ("Le_eqn",         "Le - AtOx*1e2"),
        ("Le_eqn", "Le - AtOx*b_nox*SurfaceArea/(NodeVolume*x_np)"),
        ("Le_eqn:Le", "1"),
        #    ("Lh_eqn",         "Lh"),
        ("Lh_eqn", "Lh - AtOx*b_pox*SurfaceArea/(NodeVolume*x_pp)"),
        ("Lh_eqn:Lh", "1"),
    )

    for e in em:
        ds.node_model(device=device, region=region, name=e[0], equation=e[1])
def CreateNodeModel(device, region, model, expression):
    '''
      Creates a node model
    '''
    result = ds.node_model(device=device,
                           region=region,
                           name=model,
                           equation=expression)
    if debug:
        print(("NODEMODEL {d} {r} {m} \"{re}\"".format(d=device,
                                                       r=region,
                                                       m=model,
                                                       re=result)))
예제 #6
0
def createPotentialOnly(device, region):
    for name, equation in (
        ("IntrinsicElectrons",                     "n_i*exp(Potential/V_t)"),
      ("IntrinsicElectrons:Potential",           "diff(n_i*exp(Potential/V_t), Potential)"),
      ("IntrinsicHoles",                         "n_i^2/IntrinsicElectrons"),
      ("IntrinsicHoles:Potential",               "diff(n_i^2/IntrinsicElectrons, Potential)"),
      ("IntrinsicCharge",                        "IntrinsicHoles-IntrinsicElectrons + NetDoping"),
      ("IntrinsicCharge:Potential",              "diff(IntrinsicHoles-IntrinsicElectrons, Potential)"),
      ("PotentialIntrinsicNodeCharge",           "-ElectronCharge*IntrinsicCharge"),
      ("PotentialIntrinsicNodeCharge:Potential", "diff(-ElectronCharge*IntrinsicCharge, Potential)"),
    ):
        devsim.node_model(device=device, region=region, name=name, equation=equation)

    for name, equation in (
        ("EField",              "(Potential@n0-Potential@n1)*EdgeInverseLength"),
      ("EField:Potential@n0", "EdgeInverseLength"),
      ("EField:Potential@n1", "-EField:Potential@n0"),
    ):
        devsim.edge_model(device=device, region=region, name=name, equation=equation)

    devsim.element_from_edge_model(edge_model="EField", device=device, region=region)
    devsim.element_from_edge_model(edge_model="EField", derivative="Potential", device=device, region=region)

    foo="dot2d(EField_x, EField_y, unitx, unity)"
    for name, equation in (
        ("ElectricField", foo),
      ("ElectricField:Potential@en0", "diff(%s, Potential@en0)" % foo),
      ("ElectricField:Potential@en1", "diff(%s, Potential@en1)" % foo),
      ("ElectricField:Potential@en2", "diff(%s, Potential@en2)" % foo),
      ("PotentialEdgeFlux", "Permittivity*ElectricField"),
      ("PotentialEdgeFlux:Potential@en0", "diff(Permittivity*ElectricField,Potential@en0)"),
      ("PotentialEdgeFlux:Potential@en1", "diff(Permittivity*ElectricField,Potential@en1)"),
      ("PotentialEdgeFlux:Potential@en2", "diff(Permittivity*ElectricField,Potential@en2)"),
    ):
        devsim.element_model(device=device, region=region, name=name, equation=equation)

    devsim.equation(device=device, region=region, name="PotentialEquation", variable_name="Potential",
                    node_model="PotentialIntrinsicNodeCharge", element_model="PotentialEdgeFlux", variable_update="log_damp")
예제 #7
0
devsim.edge_from_node_model(device=device, region=region, node_model="Potential")

devsim.edge_model(device=device, region=region, name="ElectricField", equation="(Potential@n0 - Potential@n1)*EdgeInverseLength")
devsim.edge_model(device=device, region=region, name="ElectricField:Potential@n0", equation="EdgeInverseLength")
devsim.edge_model(device=device, region=region, name="ElectricField:Potential@n1", equation="-EdgeInverseLength")

devsim.set_parameter(device=device, region=region, name="topbias", value=1.0e-0)
devsim.set_parameter(device=device, region=region, name="botbias", value=0.0)

devsim.edge_model(device=device, region=region, name="PotentialEdgeFlux", equation="Permittivity*ElectricField")
devsim.edge_model(device=device, region=region, name="PotentialEdgeFlux:Potential@n0", equation="diff(Permittivity*ElectricField, Potential@n0)")
devsim.edge_model(device=device, region=region, name="PotentialEdgeFlux:Potential@n1", equation="-PotentialEdgeFlux:Potential@n0")

devsim.equation(device=device, region=region, name="PotentialEquation", variable_name="Potential", edge_model="PotentialEdgeFlux", variable_update="default")

devsim.node_model(device=device, region=region, name="topnode_model"          , equation="Potential - topbias")
devsim.node_model(device=device, region=region, name="topnode_model:Potential", equation="1")

devsim.node_model(device=device, region=region, name="botnode_model"          , equation="Potential - botbias")
devsim.node_model(device=device, region=region, name="botnode_model:Potential", equation="1")

devsim.contact_equation(device=device, contact="top", name="PotentialEquation", variable_name="Potential", node_model="topnode_model", edge_charge_model="PotentialEdgeFlux")
devsim.contact_equation(device=device, contact="bot", name="PotentialEquation", variable_name="Potential", node_model="botnode_model", edge_charge_model="PotentialEdgeFlux")

devsim.solve(type="dc", absolute_error=1.0, relative_error=1e-10, maximum_iterations=30)

print(devsim.get_contact_charge(device=device, contact="top", equation="PotentialEquation"))
print(devsim.get_contact_charge(device=device, contact="bot", equation="PotentialEquation"))

devsim.write_devices(file="trimesh3.msh", type="devsim_data")
예제 #8
0
def createDriftDiffusion(device, region):
    for name, equation in (
        ("PotentialNodeCharge"          , "-ElectronCharge*(Holes -Electrons + NetDoping)"),
      ("PotentialNodeCharge:Electrons", "+ElectronCharge"),
      ("PotentialNodeCharge:Holes"    , "-ElectronCharge"),
    ):
        devsim.node_model(device=device, region=region, name=name, equation=equation)

    devsim.equation(device=device, region=region, name="PotentialEquation", variable_name="Potential", node_model="PotentialNodeCharge",
                    element_model="PotentialEdgeFlux", variable_update="log_damp")

    for name, equation in (
        ("vdiff"              , "(Potential@n0 - Potential@n1)/V_t"),
      ("vdiff:Potential@n0" , "V_t^(-1)"),
      ("vdiff:Potential@n1" , "-V_t^(-1)"),
      ("Bern01"             , "B(vdiff)"),
      ("Bern01:Potential@n0", "dBdx(vdiff)*vdiff:Potential@n0"),
      ("Bern01:Potential@n1", "dBdx(vdiff)*vdiff:Potential@n1"),
      ("Bern10"             , "Bern01 + vdiff"),
      ("Bern10:Potential@n0", "Bern01:Potential@n0 + vdiff:Potential@n0"),
      ("Bern10:Potential@n1", "Bern01:Potential@n1 + vdiff:Potential@n1"),
    ):
        devsim.edge_model(device=device, region=region, name=name, equation=equation)

    Jn      ="ElectronCharge*mu_n*EdgeInverseLength*V_t*(Electrons@n1*Bern10 - Electrons@n0*Bern01)"
    dJndn0  ="simplify(diff( %s, Electrons@n0))" % Jn
    dJndn1  ="simplify(diff( %s, Electrons@n1))" % Jn
    dJndpot0="simplify(diff( %s, Potential@n0))" % Jn
    dJndpot1="simplify(diff( %s, Potential@n1))" % Jn
    for name, equation in (
        ("ElectronCurrent"             , Jn),
      ("ElectronCurrent:Electrons@n0", dJndn0),
      ("ElectronCurrent:Electrons@n1", dJndn1),
      ("ElectronCurrent:Potential@n0", dJndpot0),
      ("ElectronCurrent:Potential@n1", dJndpot1),
    ):
        devsim.edge_model(device=device, region=region, name=name, equation=equation)

    Jp      ="-ElectronCharge*mu_p*EdgeInverseLength*V_t*(Holes@n1*Bern01 - Holes@n0*Bern10)"
    dJpdp0  ="simplify(diff(%s, Holes@n0))" % Jp
    dJpdp1  ="simplify(diff(%s, Holes@n1))" % Jp
    dJpdpot0="simplify(diff(%s, Potential@n0))" % Jp
    dJpdpot1="simplify(diff(%s, Potential@n1))" % Jp

    for name, equation in (
        ("HoleCurrent"             , Jp),
      ("HoleCurrent:Holes@n0"    , dJpdp0),
      ("HoleCurrent:Holes@n1"    , dJpdp1),
      ("HoleCurrent:Potential@n0", dJpdpot0),
      ("HoleCurrent:Potential@n1", dJpdpot1),
    ):
        devsim.edge_model(device=device, region=region, name=name, equation=equation)

    NCharge="-ElectronCharge * Electrons"
    dNChargedn="-ElectronCharge"
    for name, equation in (
        ("NCharge",           NCharge),
      ("NCharge:Electrons", dNChargedn),
    ):
        devsim.node_model(device=device, region=region, name=name, equation=equation)

    PCharge="-ElectronCharge * Holes"
    dPChargedp="-ElectronCharge"
    for name, equation in (
        ("PCharge", PCharge),
      ("PCharge:Holes", dPChargedp),
    ):
        devsim.node_model(device=device, region=region, name=name, equation=equation)


    ni=devsim.get_parameter(device=device, region=region, name="n_i")
    for name, value in (
        ("n1", ni),
      ("p1", ni),
      ("taun", 1e-5),
      ("taup", 1e-5),
    ):
        devsim.set_parameter(device=device, region=region, name=name, value=value)

    USRH="-ElectronCharge*(Electrons*Holes - n_i^2)/(taup*(Electrons + n1) + taun*(Holes + p1))"
    dUSRHdn="simplify(diff($USRH, Electrons))"
    dUSRHdp="simplify(diff($USRH, Holes))"
    for name, equation in (
        ("USRH", USRH),
      ("USRH:Electrons", dUSRHdn),
      ("USRH:Holes", dUSRHdp),
    ):
        devsim.node_model(device=device, region=region, name=name, equation=equation)

    devsim.equation(device=device, region=region, name="ElectronContinuityEquation", variable_name="Electrons",
                    edge_model="ElectronCurrent", variable_update="positive",
                    time_node_model="NCharge", node_model="USRH")

    devsim.equation(device=device, region=region, name="HoleContinuityEquation", variable_name="Holes",
                    edge_model="HoleCurrent", variable_update="positive",
                    time_node_model="PCharge", node_model="USRH")
예제 #9
0
def set_dg_parameters(device, region):
    ##From Cogenda default Si physics:
    #TODO: parameter units
    ds.set_parameter(device=device,
                     region=region,
                     name="h",
                     value=6.62606876e-34)  # J*s
    ds.set_parameter(device=device,
                     region=region,
                     name="hbar",
                     value=1.054571596e-34)  # J*s
    ds.set_parameter(device=device, region=region, name="Gamman", value=1)
    ds.set_parameter(device=device, region=region, name="Gammap", value=1)
    ds.set_parameter(device=device, region=region, name="Gammanox", value=1)
    ds.set_parameter(device=device, region=region, name="Gammapox", value=1)
    ds.set_parameter(device=device,
                     region=region,
                     name="mass_electron",
                     value=9.10938188e-31)  # kg
    ds.node_model(device=device,
                  region=region,
                  name="meff_elec",
                  equation="1.0903*mass_electron")
    ds.node_model(device=device,
                  region=region,
                  name="meff_hole",
                  equation="1.1525*mass_electron")
    ds.node_model(device=device,
                  region=region,
                  name="b_n",
                  equation="(1e4*Gamman*hbar^2)/(q*6*meff_elec)")  # eV*cm^2
    ds.node_model(device=device,
                  region=region,
                  name="b_p",
                  equation="(1e4*Gammap*hbar^2)/(q*6*meff_hole)")  # eV*cm^2
    # Oxide
    #
    #ds.node_model(device=device, region=region, name="b_nox", equation="1e-100") # eV*cm^2
    ds.node_model(
        device=device,
        region=region,
        name="b_nox",
        equation="1e4*Gammanox*hbar^2/(6*q*0.14*mass_electron)")  # eV*cm^2
    ds.node_model(
        device=device,
        region=region,
        name="b_pox",
        equation="1e4*Gammapox*hbar^2/(6*q*1.0*mass_electron)")  # eV*cm^2
    #ds.node_model(device=device, region=region, name="b_nox", equation="10*hbar^2/(6*q*0.14*mass_electron)") # eV*cm^2
    #ds.node_model(device=device, region=region, name="b_pox", equation="10*hbar^2/(6*q*0.14*mass_electron)") # eV*cm^2

    #ds.node_model(device=device, region=region, name="b_nox", equation="(1e4*Gammanox*hbar^2)/(q*6*meff_elec)") # eV*cm^2
    #ds.node_model(device=device, region=region, name="b_pox", equation="(1e4*Gammapox*hbar^2)/(q*6*meff_hole)") # eV*cm^2
    ds.node_model(device=device,
                  region=region,
                  name="x_np",
                  equation="1e2*hbar/(2*0.4*mass_electron*q*3.15)^0.5")  # cm
    ds.node_model(device=device,
                  region=region,
                  name="x_pp",
                  equation="1e2*hbar/(2*0.4*mass_electron*q*4.50)^0.5")  # cm
    #const PetscScalar b_nox = hbar*hbar/(6*e*0.14*me);
    #const PetscScalar b_pox = hbar*hbar/(6*e*1.0*me);
    #const PetscScalar bn = mt->band->Gamman()*hbar*hbar/(6*e*mt->band->EffecElecMass(T));
    #const PetscScalar bp = mt->band->Gammap()*hbar*hbar/(6*e*mt->band->EffecHoleMass(T));
    #  const PetscScalar x_np = hbar/sqrt(2*0.4*me*3.15*eV);
    #  const PetscScalar x_pp = hbar/sqrt(2*0.4*me*4.50*eV);
    #    eV = 1.602176462e-19*J;
    #    e    = 1.602176462e-19*C;
    #    ELECMASS  = 1.0903*me;
    #    HOLEMASS  = 1.1525*me;

    #
    # Edge Integration
    #
    em = (
        ("b_n", "b_ne", "arithmetic", ()),
        ("b_p", "b_pe", "arithmetic", ()),
    )
    for e in em:
        ds.edge_average_model(device=device,
                              region=region,
                              node_model=e[0],
                              edge_model=e[1],
                              average_type=e[2])
        for d in e[3]:
            ds.edge_average_model(device=device,
                                  region=region,
                                  node_model=e[0],
                                  edge_model=e[1],
                                  average_type=e[2],
                                  derivative=d)
예제 #10
0
파일: erf1.py 프로젝트: xj361685640/devsim
device="MyDevice"
region="MyRegion"

# basic linear circuit solved by itself
devsim.circuit_element(name="V1", n1=1,        n2=0,        value=1.0)
devsim.circuit_element(name="R1", n1=1,        n2="cnode1", value=5.0)
devsim.circuit_element(name="R2", n1="cnode1", n2=0,        value=5.0)

devsim.solve(type="dc", absolute_error=1.0, relative_error=1e-14, maximum_iterations=3)

devsim.circuit_alter(name="V1", value=2.0)
devsim.solve(type="dc", absolute_error=1.0, relative_error=1e-14, maximum_iterations=30)

test_common.CreateSimpleMesh(device, region)

devsim.node_model(device=device, region=region, name="erf", equation="erf(x);")
devsim.print_node_values(device=device, region=region, name="erf")
devsim.node_model(device=device, region=region, name="d_erf_dx", equation="diff(erf(x),x);")
devsim.print_node_values(device=device, region=region, name="d_erf_dx")
devsim.node_model(device=device, region=region, name="erfc", equation="erfc(x);")
devsim.print_node_values(device=device, region=region, name="erfc")
devsim.node_model(device=device, region=region, name="d_erfc_dx", equation="diff(erfc(x),x);")
devsim.print_node_values(device=device, region=region, name="d_erfc_dx")

devsim.node_model(device=device, region=region, name="d_abs_dx", equation="diff(abs(x),x);")
devsim.print_node_values(device=device, region=region, name="d_abs_dx")

devsim.set_parameter(name="param", value=-1.0)
devsim.node_model(device=device, region=region, name="deptest", equation="param;")
devsim.print_node_values(device=device, region=region, name="deptest")
devsim.set_parameter(name="param", value=1.0)
예제 #11
0
def createSiliconDriftDiffusion(device, region):
    for name, equation in (
        ("PotentialNodeCharge",
         "-ElectronCharge*(Holes -Electrons + NetDoping)"),
        ("PotentialNodeCharge:Electrons", "+ElectronCharge"),
        ("PotentialNodeCharge:Holes", "-ElectronCharge"),
    ):
        devsim.node_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    devsim.equation(device=device,
                    region=region,
                    name="PotentialEquation",
                    variable_name="Potential",
                    node_model="PotentialNodeCharge",
                    edge_model="PotentialEdgeFlux",
                    variable_update="log_damp")

    createBernoulli(device, region)
    createElectronCurrent(device, region)
    createHoleCurrent(device, region)

    NCharge = "-ElectronCharge * Electrons"
    dNChargedn = "-ElectronCharge"
    devsim.node_model(device=device,
                      region=region,
                      name="NCharge",
                      equation=NCharge)
    devsim.node_model(device=device,
                      region=region,
                      name="NCharge:Electrons",
                      equation=dNChargedn)

    PCharge = "-ElectronCharge * Holes"
    dPChargedp = "-ElectronCharge"
    devsim.node_model(device=device,
                      region=region,
                      name="PCharge",
                      equation=PCharge)
    devsim.node_model(device=device,
                      region=region,
                      name="PCharge:Holes",
                      equation=dPChargedp)

    ni = devsim.get_parameter(device=device, region=region, name="n_i")
    devsim.set_parameter(device=device, region=region, name="n1", value=ni)
    devsim.set_parameter(device=device, region=region, name="p1", value=ni)
    devsim.set_parameter(device=device, region=region, name="taun", value=1e-5)
    devsim.set_parameter(device=device, region=region, name="taup", value=1e-5)

    USRH = "-ElectronCharge*(Electrons*Holes - n_i^2)/(taup*(Electrons + n1) + taun*(Holes + p1))"
    dUSRHdn = "simplify(diff(%s, Electrons))" % USRH
    dUSRHdp = "simplify(diff(%s, Holes))" % USRH
    devsim.node_model(device=device, region=region, name="USRH", equation=USRH)
    devsim.node_model(device=device,
                      region=region,
                      name="USRH:Electrons",
                      equation=dUSRHdn)
    devsim.node_model(device=device,
                      region=region,
                      name="USRH:Holes",
                      equation=dUSRHdp)

    devsim.equation(device=device,
                    region=region,
                    name="ElectronContinuityEquation",
                    variable_name="Electrons",
                    edge_model="ElectronCurrent",
                    variable_update="positive",
                    time_node_model="NCharge",
                    node_model="USRH")

    devsim.equation(device=device,
                    region=region,
                    name="HoleContinuityEquation",
                    variable_name="Holes",
                    edge_model="HoleCurrent",
                    variable_update="positive",
                    time_node_model="PCharge",
                    node_model="USRH")
예제 #12
0
devsim.add_2d_interface(mesh="mos", name="gate_oxide", region0="gate", region1="oxide")
devsim.add_2d_interface(mesh="mos", name="bulk_oxide", region0="bulk", region1="oxide")
devsim.finalize_mesh(mesh="mos")
devsim.create_device(mesh="mos", device=device)


format_dict= {
    'gate_doping' : gate_doping,
  'source_doping' : source_doping,
  'drain_doping' : drain_doping,
  'body_doping' : body_doping,
  'bulk_doping' : bulk_doping,
  'x_gate_left' : x_gate_left,
  'x_gate_right' : x_gate_right,
  'x_diffusion_decay' : x_diffusion_decay,
  'y_diffusion' : y_diffusion,
  'y_diffusion_decay' : y_diffusion_decay,
  'y_bulk_bottom' : y_bulk_bottom,
}

devsim.node_model(name="NetDoping"   , device=device, region="gate", equation="%(gate_doping)s" % format_dict)
devsim.node_model(name="DrainDoping" , device=device, region="bulk", equation="0.25*%(drain_doping)s*erfc((x-%(x_gate_left)s)/%(x_diffusion_decay)s)*erfc((y-%(y_diffusion)s)/%(y_diffusion_decay)s)" % format_dict)
devsim.node_model(name="SourceDoping", device=device, region="bulk", equation="0.25*%(source_doping)s*erfc(-(x-%(x_gate_right)s)/%(x_diffusion_decay)s)*erfc((y-%(y_diffusion)s)/%(y_diffusion_decay)s)" % format_dict)
devsim.node_model(name="BodyDoping", device=device, region="bulk", equation="0.5*%(body_doping)s*erfc(-(y-%(y_bulk_bottom)s)/%(y_diffusion_decay)s)" % format_dict)
devsim.node_model(name="NetDoping"   , device=device, region="bulk", equation="DrainDoping + SourceDoping + %(bulk_doping)s + BodyDoping" % format_dict)

devsim.write_devices( file="mos_2d", type="vtk")
devsim.write_devices( file="mos_2d.flps", type="floops")

예제 #13
0
def SetupCarrierResistorSystem(device, region):
    '''
    This adds electron continuity
  '''
    devsim.node_solution(device=device, region=region, name='Electrons')
    devsim.edge_from_node_model(device=device,
                                region=region,
                                node_model='Electrons')
    devsim.set_node_values(device=device,
                           region=region,
                           name='Electrons',
                           init_from='IntrinsicElectrons')

    ####
    #### PotentialNodeCharge
    ####
    for name, equation in (
        ("PotentialNodeCharge", "-ElectronCharge*(-Electrons + NetDoping)"),
        ("PotentialNodeCharge:Electrons", "+ElectronCharge"),
    ):
        devsim.node_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    ####
    #### PotentialEquation modified for carriers present
    ####
    devsim.equation(device=device,
                    region=region,
                    name='PotentialEquation',
                    variable_name='Potential',
                    node_model='PotentialNodeCharge',
                    edge_model="PotentialEdgeFlux",
                    variable_update="default")

    ####
    #### vdiff, Bern01, Bern10
    ####
    for name, equation in (
        ("vdiff", "(Potential@n0 - Potential@n1)/ThermalVoltage"),
        ("vdiff:Potential@n0", "ThermalVoltage^(-1)"),
        ("vdiff:Potential@n1", "-ThermalVoltage^(-1)"),
        ("Bern01", "B(vdiff)"),
        ("Bern01:Potential@n0", "dBdx(vdiff)*vdiff:Potential@n0"),
        ("Bern01:Potential@n1", "dBdx(vdiff)*vdiff:Potential@n1"),
        ("Bern10", "Bern01 + vdiff"),
        ("Bern10:Potential@n0", "Bern01:Potential@n0 + vdiff:Potential@n0"),
        ("Bern10:Potential@n1", "Bern01:Potential@n1 + vdiff:Potential@n1"),
    ):
        devsim.edge_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    ####
    #### Electron Current
    ####
    current_equation = "ElectronCharge*mu_n*EdgeInverseLength*ThermalVoltage*(Electrons@n1*Bern10 - Electrons@n0*Bern01)"
    for name, equation in (
        ("ElectronCurrent", current_equation),
        ("ElectronCurrent:Electrons@n0",
         "simplify(diff(%s, Electrons@n0))" % current_equation),
        ("ElectronCurrent:Electrons@n1",
         "simplify(diff(%s, Electrons@n1))" % current_equation),
        ("ElectronCurrent:Potential@n0",
         "simplify(diff(%s, Potential@n0))" % current_equation),
        ("ElectronCurrent:Potential@n1",
         "simplify(diff(%s, Potential@n1))" % current_equation),
    ):
        devsim.edge_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    ####
    #### Time derivative term
    ####
    for name, equation in (
        ("NCharge", "-ElectronCharge * Electrons"),
        ("NCharge:Electrons", "-ElectronCharge"),
    ):
        devsim.node_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    ####
    #### Electron Continuity Equation
    ####
    devsim.equation(device=device,
                    region=region,
                    name="ElectronContinuityEquation",
                    variable_name="Electrons",
                    edge_model="ElectronCurrent",
                    time_node_model="NCharge",
                    variable_update="positive")
예제 #14
0
    quantum_data[index] = qdict

#print max(get_node_model_values(device=device, region=region_si, name='n_classical'))
#print max(get_node_model_values(device=device, region=region_si, name='n_quantum'))

if carrier_var == 'Electrons':
    ds.edge_model(device=device,
                  region=region_si,
                  name="surface_term",
                  equation="del_log_n1*EdgeCouple")
    ds.edge_model(device=device,
                  region=region_si,
                  name="edge_volume_term",
                  equation="del_log_n2*EdgeNodeVolume")
    ds.node_model(device=device,
                  region=region_si,
                  name="volume_term",
                  equation="Le_eqn*NodeVolume")
elif carrier_var == 'Holes':
    ds.edge_model(device=device,
                  region=region_si,
                  name="surface_term",
                  equation="del_log_p1*EdgeCouple")
    ds.edge_model(device=device,
                  region=region_si,
                  name="edge_volume_term",
                  equation="del_log_p2*EdgeNodeVolume")
    ds.node_model(device=device,
                  region=region_si,
                  name="volume_term",
                  equation="Lh_eqn*NodeVolume")
else:
예제 #15
0
devsim.add_2d_region( mesh="dog", material="gas", region="gas2", yl=1.0, yh=1.001)
devsim.add_2d_region( mesh="dog", material="Oxide", region="r0", xl=xmin, xh=xmax, yl=ymid1, yh=ymin)
devsim.add_2d_region( mesh="dog", material="Silicon", region="r1", xl=xmin, xh=xmax, yl=ymid2, yh=ymid1)
devsim.add_2d_region( mesh="dog", material="Silicon", region="r2", xl=xmin, xh=xmax, yl=ymid2, yh=ymax)
#warn when leftover triangles are not encapsulated by region
# not specifying bounding box means all intersecting nodes
#bounding box is optional
devsim.add_2d_interface( mesh="dog", name="i0", region0="r0", region1="r1")
devsim.add_2d_interface( mesh="dog", name="i1", region0="r1", region1="r2", xl=0, xh=1, yl=ymid2, yh=ymid2, bloat=1.0e-10)
devsim.add_2d_contact( mesh="dog", name="top", region="r0", yl=ymin, yh=ymin, bloat=1.0e-10, material="metal")
devsim.add_2d_contact( mesh="dog", name="bot", region="r2", yl=ymax, yh=ymax, bloat=1.0e-10, material="metal")
#contact can only apply interface
devsim.finalize_mesh( mesh="dog")
devsim.create_device(mesh="dog", device=device)

devsim.node_model(device=device, name="NetDoping", region="gas1", equation="1e18")
devsim.node_model(device=device, name="NetDoping", region="r0",   equation="1e18")
devsim.node_model(device=device, name="NetDoping", region="r1",   equation="-1e15")
devsim.node_model(device=device, name="NetDoping", region="r2",   equation="-1e15")
devsim.node_model(device=device, name="NetDoping", region="gas2", equation="-1e15")

devsim.interface_normal_model(device=device, region="r0", interface="i0")
devsim.interface_normal_model(device=device, region="r1", interface="i0")
devsim.interface_normal_model(device=device, region="r1", interface="i1")
devsim.interface_normal_model(device=device, region="r2", interface="i1")

devsim.set_parameter(name="raxis_zero", value=0.0)
devsim.set_parameter(name="raxis_variable", value="x")

for region in ("r0", "r1", "r2"):
    devsim.cylindrical_node_volume(  device=device, region=region)
예제 #16
0
### Create the bulk equation
###
devsim.equation(device=device, region=region, name="PotentialEquation", variable_name="Potential",
                edge_model="DField", variable_update="default")

# the topbias is a circuit node, and we want to prevent it from being overridden by a parameter
devsim.set_parameter(device=device, region=region, name="botbias", value=0.0)

for name, equation in (
    ("topnode_model", "Potential - topbias"),
  ("topnode_model:Potential", "1"),
  ("topnode_model:topbias", "-1"),
  ("botnode_model", "Potential - botbias"),
  ("botnode_model:Potential", "1"),
):
    devsim.node_model(device=device, region=region, name=name, equation=equation)

# attached to circuit node
devsim.contact_equation(device=device, contact="top", name="PotentialEquation", variable_name="Potential",
                        node_model="topnode_model", edge_charge_model="DField", circuit_node="topbias")
# attached to ground
devsim.contact_equation(device=device, contact="bot", name="PotentialEquation", variable_name="Potential",
                        node_model="botnode_model", edge_charge_model="DField")

#
# Voltage source
#
devsim.circuit_element(name="V1", n1=1,         n2=0, value=1.0, acreal=1.0)
devsim.circuit_element(name="R1", n1="topbias", n2=1, value=1e3)

#
예제 #17
0
# See the License for the specific language governing permissions and
# limitations under the License.

#Purpose: Fermi integral and inverse

import devsim
import test_common

device = "MyDevice"
region = "MyRegion"

test_common.CreateSimpleMesh(device, region)

devsim.set_parameter(name="Nc", value=1e22)
devsim.node_model(device=device,
                  region=region,
                  name="Electrons",
                  equation="2e15*(1 - x) + 1e10;")
devsim.node_model(device=device,
                  region=region,
                  name="r",
                  equation="Electrons/Nc;")
devsim.node_model(device=device,
                  region=region,
                  name="Eta",
                  equation="InvFermi(r);")
devsim.node_model(device=device,
                  region=region,
                  name="r2",
                  equation="Fermi(Eta);")

devsim.node_model(device=device,