Beispiel #1
0
def run_initial_bias(use_circuit_bias, net_doping=1e16):
    '''
    use_circuit for topbias
  '''
    test_common.SetupResistorConstants(device, region)
    test_common.SetupInitialResistorSystem(device, region, net_doping)
    test_common.SetupInitialResistorContact(device=device,
                                            contact='top',
                                            use_circuit_bias=use_circuit_bias)
    test_common.SetupInitialResistorContact(device=device, contact='bot')

    #####
    ##### Initial DC Solution
    #####
    devsim.solve(type='dc',
                 absolute_error=1.0,
                 relative_error=1e-10,
                 maximum_iterations=30)

    for name in ("Potential", "IntrinsicElectrons"):
        devsim.print_node_values(device=device, region=region, name=name)

    test_common.SetupCarrierResistorSystem(device, region)
    test_common.SetupCarrierResistorContact(device=device,
                                            contact='top',
                                            use_circuit_bias=use_circuit_bias)
    test_common.SetupCarrierResistorContact(device, contact='bot')
Beispiel #2
0
def simulate_charge(device, contact, equation, solver_params):
    factor = 1e7  #from F/cm^2 to fF/um^2
    dv = 0.001
    v1 = get_parameter(device=device, name=GetContactBiasName(contact))
    q1 = get_contact_charge(device=device,
                            contact=contact,
                            equation="PotentialEquation")
    v2 = v1 + 0.001
    set_parameter(name=GetContactBiasName(contact), value=v2)
    devsim.solve(**solver_params)
    q2 = get_contact_charge(device=device,
                            contact=contact,
                            equation="PotentialEquation")
    return (v1, (factor * (q2 - q1) / dv))
Beispiel #3
0
def rampparam(device, region, param, stop, step_size, min_step, solver_params=None, callback=None):
    '''
      Ramps param with assignable callback function
    '''
    start_param=ds.get_parameter(device=device, region=region, name=param)
    if (start_param < stop):
        step_sign=1
    else:
        step_sign=-1
    last_param=start_param
    while(abs(last_param - stop) > min_step):
        print("last end %e %e" % (last_param, stop))
        next_param=last_param + step_sign * step_size
        if next_param < stop:
            next_step_sign=1
        else:
            next_step_sign=-1

        if next_step_sign != step_sign:
            next_param=stop
            print("setting to last param %e" % (stop))
            print("setting next param %e" % (next_param))
        ds.set_parameter(device=device, region=region, name=param, value=next_param)
        try:
            ds.solve(**solver_params)
        except ds.error as msg:
            if str(msg).find("Convergence failure") != 0:
                raise
            ds.set_parameter(device=device, region=region, name=param, value=last_param)
            step_size *= 0.5
            print("setting new step size %e" % (step_size))
            #raise NameError("STOP")
            if step_size < min_step:
                raise RuntimeError("Min step size too small")
            continue
        last_param=next_param
        if callback:
            callback()
Beispiel #4
0
for region in regions:
    test_common.SetupResistorConstants(device, region)
    test_common.SetupInitialResistorSystem(device, region, net_doping=1e16)

for contact in contacts:
    test_common.SetupInitialResistorContact(device, contact=contact)

test_common.SetupContinuousPotentialAtInterface(device, interface)

#####
##### Initial DC Solution
#####
devsim.set_parameter(name="topbias", value=0.0)
devsim.set_parameter(name="botbias", value=0.0)
devsim.solve(type='dc',
             absolute_error=1.0,
             relative_error=1e-10,
             maximum_iterations=30)

for region in regions:
    for name in ("Potential", "IntrinsicElectrons"):
        devsim.print_node_values(device=device, region=region, name=name)

for region in regions:
    test_common.SetupCarrierResistorSystem(device, region)

for contact in contacts:
    test_common.SetupCarrierResistorContact(device, contact=contact)

test_common.SetupContinuousElectronsAtInterface(device, interface)

for v in (0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10):
Beispiel #5
0
    ("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)

#
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.solve(type="ac", frequency=1e10)
devsim.solve(type="ac", frequency=1e15)

Beispiel #6
0
    setSiliconParameters(device, i)
    createSiliconPotentialOnly(device, i)
for i in oxide_regions:
    setOxideParameters(device, i)
    createOxidePotentialOnly(device, "oxide")

createSiliconPotentialOnlyContact(device, "gate", "gate")
createSiliconPotentialOnlyContact(device, "bulk", "drain")
createSiliconPotentialOnlyContact(device, "bulk", "source")
createSiliconPotentialOnlyContact(device, "bulk", "body")

createSiliconOxideInterface(device, "bulk_oxide")
createSiliconOxideInterface(device, "gate_oxide")

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

createSolution(device, "gate", "Electrons")
createSolution(device, "gate", "Holes")
devsim.set_node_values(device=device,
                       region="gate",
                       name="Electrons",
                       init_from="IntrinsicElectrons")
devsim.set_node_values(device=device,
                       region="gate",
                       name="Holes",
Beispiel #7
0
devsim.create_device(mesh="dog", device=device)

test_common.SetupResistorConstants(device, region)
test_common.SetupInitialResistorSystem(device, region, net_doping=1e17)

test_common.SetupInitialResistorContact(device=device,
                                        contact="top",
                                        use_circuit_bias=True,
                                        circuit_node="topbias")
test_common.SetupInitialResistorContact(device=device,
                                        contact="bot",
                                        use_circuit_bias=False)
devsim.set_parameter(name="botbias", value=0.0)

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

test_common.SetupCarrierResistorSystem(device=device, region=region)
test_common.SetupCarrierResistorContact(device=device,
                                        contact="top",
                                        use_circuit_bias=True,
                                        circuit_node="topbias")
test_common.SetupCarrierResistorContact(device=device,
                                        contact="bot",
                                        use_circuit_bias=False)

for v in (0.0, 1e-3):
    devsim.circuit_alter(name="V1", value=v)
    devsim.solve(type='dc',
                 absolute_error=1.0e10,
Beispiel #8
0
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import devsim

# ssac circuit only
devsim.circuit_element(name="V1", n1=1, n2=0, value=1.0, acreal=1.0)
#lambda = 0.04
devsim.circuit_element(name="R1", n1=1, n2=2, value=5)
devsim.circuit_element(name="C1", n1=2, n2=0, value=5)

print("transient_dc")
devsim.solve(type="transient_dc",
             absolute_error=1.0,
             relative_error=1e-14,
             maximum_iterations=3)
devsim.circuit_alter(name="V1", value=0.0)

print("transient_tr")
devsim.solve(type="transient_tr",
             absolute_error=1.0,
             relative_error=1e-14,
             maximum_iterations=3,
             tdelta=1e-3,
             charge_error=1e-2)
devsim.solve(type="transient_tr",
             absolute_error=1.0,
             relative_error=1e-14,
             maximum_iterations=3,
             tdelta=1e-3,
Beispiel #9
0
    set_parameter(device=device,
                  region=region_si,
                  name="Nconstant",
                  value=float(d))
    set_node_values(device=device,
                    region=region_si,
                    name="Potential",
                    init_from="zero")
    set_node_values(device=device,
                    region=region_ox,
                    name="Potential",
                    init_from="zero")

    set_parameter(name=GetContactBiasName("top"), value=vneg)
    devsim.solve(**solver_params)

    def mycb():
        res = simulate_charge(device=device,
                              contact="top",
                              equation="PotentialEquation",
                              solver_params=solver_params)
        cdict['v'].append(res[0])
        cdict['q'].append(res[1])

    ramp.rampparam(device="",
                   region="",
                   param=GetContactBiasName("top"),
                   stop=vstop,
                   step_size=cstep,
                   min_step=0.01,
Beispiel #10
0
    ds.set_parameter(device=device,
                     region=region_si,
                     name="Nconstant",
                     value=float(d))
    ds.set_node_values(device=device,
                       region=region_si,
                       name="Potential",
                       init_from="zero")
    ds.set_node_values(device=device,
                       region=region_ox,
                       name="Potential",
                       init_from="zero")

    ds.set_parameter(name=GetContactBiasName("top"), value=vneg)
    ds.solve(**solver_params)

    def mycb():
        res = simulate_charge(device=device,
                              contact="top",
                              equation="PotentialEquation",
                              solver_params=solver_params)
        cdict['v'].append(res[0])
        cdict['q'].append(res[1])

    ramp.rampparam(device="",
                   region="",
                   param=GetContactBiasName("top"),
                   stop=vstop,
                   step_size=cstep,
                   min_step=0.01,
Beispiel #11
0
# Copyright 2013 Devsim LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# ssac circuit only
import devsim

devsim.circuit_element(name="V1", n1=1, n2=0, value=1.0, acreal=1.0)
devsim.circuit_element(name="R1", n1=1, n2=2, value=5)
devsim.circuit_element(name="C1", n1=2, n2=0, value=5)

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