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')
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))
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()
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):
("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)
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",
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,
# 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,
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,
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,
# 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)