X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Focs-0.1.3%2Fsbn%2FMpmosfet.m;fp=octave_packages%2Focs-0.1.3%2Fsbn%2FMpmosfet.m;h=c4fbae31a0c0dc3df5f3b9b8a92a62b0343bb300;hp=0000000000000000000000000000000000000000;hb=c880e8788dfc484bf23ce13fa2787f2c6bca4863;hpb=1705066eceaaea976f010f669ce8e972f3734b05 diff --git a/octave_packages/ocs-0.1.3/sbn/Mpmosfet.m b/octave_packages/ocs-0.1.3/sbn/Mpmosfet.m new file mode 100644 index 0000000..c4fbae3 --- /dev/null +++ b/octave_packages/ocs-0.1.3/sbn/Mpmosfet.m @@ -0,0 +1,153 @@ +## Copyright (C) 2006,2007,2008 Carlo de Falco +## +## This file is part of: +## OCS - A Circuit Simulator for Octave +## +## OCS is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program (see the file LICENSE); if not, +## see . +## +## author: Carlo de Falco + +## -*- texinfo -*- +## +## @deftypefn{Function File} @ +## {[@var{a},@var{b},@var{c}]=} Mpmosfet(@var{string},@var{parameters},@ +## @var{parameternames},@var{extvar},@var{intvar},@var{t}) +## +## SBN file implementing standard models for p-mosfets. +## +## @var{string} is used to select among models. Parameters are listed +## as inner items. Possible models are: +## +## @enumerate +## @item @var{string} = "simple" (Standard model for MOSFET) +## @itemize @minus +## @item rd -> parasitic resistance between drain and source +## @item k -> k parameter for usual mosfet model +## @item Vth -> threshold voltage +## @end itemize +## @item @var{string} = "lincap" (Adds RC parasitics) +## @itemize @minus +## @item rd -> parasitic resistance between drain and source +## @item k -> k parameter for usual mosfet model +## @item Vth -> threshold voltage +## @item Rs -> parasitic source resistance +## @item Rd -> parasitic drain resistance +## @item Cs -> gate-source capacitance +## @item Cd -> gate-drain capacitance +## @item Cb -> gate-bulk capacitance +## @end itemize +## @end enumerate +## +## See the @cite{IFF file format specifications} for details about +## the output structures. +## +## @seealso{prs_iff,asm_initialize_system,asm_build_system} +## @end deftypefn + +function [a,b,c]= Mpmosfet (string,parameters,parameternames,extvar,intvar,t) + + switch string + case "simple" + + rd = 1e6; + + for ii=1:length(parameternames) + eval([parameternames{ii} "=",... + num2str(parameters(ii)) " ;"]); + endfor + + vg = extvar(1); + vs = extvar(2); + vd = extvar(3); + vb = extvar(4); + + vgs = vg-vs; + vds = vd-vs; + + if (vgs > Vth) + + gm = 0; + gd = 1/rd; + id = vds*gd; + + elseif (((vgs-Vth) <= (vds)) && (vds<=0)) + + id = k*((vgs-Vth)*vds-(vds^2)/2)+vds/rd; + gm = k*vds; + gd = k*(vgs-Vth-vds)+1/rd; + + elseif (((vgs-Vth) <= (vds)) && (vds>0)) + + gm = 0; + gd = 1/rd; + id = vds*gd; + + else + + id = k*(vgs-Vth)^2/2+vds/rd; + gm = k*(vgs-Vth); + gd = 1/rd; + + endif + a = zeros(4); + + b = [0 0 0 0; + -gm (gm+gd) -gd 0; + gm -(gm+gd) gd 0; + 0 0 0 0 ]; + + c =[0 -id id 0]'; + break; + + case "lincap" + + ## Default parameter values + if isempty(intvar) + intvar = zeros(5,1); + endif + Rs = 1e2; Rd = 1e2; Cs = 1e-15; + Cd = 1e-15; Cb = 1e-12; + rd = inf; k = -1e-3; Vth = -.1; + + ## parameters given in input + + for ii=1:length(parameternames) + eval([parameternames{ii} "=",... + num2str(parameters(ii)) " ;"]) + endfor + + + mtdpmos = file_in_path(path,"Mtdpmos.cir"); + mtdpmos(end-3:end)=[]; + tmpstruct = prs_iff(mtdpmos); + + + tmpstruct.NLC.pvmatrix = [k Vth rd]; + tmpstruct.LCR(1).pvmatrix = [Rs; Rd]; + tmpstruct.LCR(2).pvmatrix = [Cs; Cd; Cb]; + + [A0,B,C] = asm_initialize_system(tmpstruct,[extvar;intvar]); + [A1,Jac,res] = asm_build_system(tmpstruct,[extvar;intvar],t); + + a = A0+A1; + b = B+Jac; + c = res + B*[extvar;intvar] + C; + + break; + + otherwise + error(["unknown option:" string]); + endswitch + +endfunction