DIRECTORY Real USING [FixI, RealException], spGlobals USING [EnterFunctions, Failure, function]; spFunctions: CEDAR PROGRAM IMPORTS Real, spGlobals EXPORTS spGlobals= BEGIN functionError: SIGNAL[s: STRING]= CODE; SimpleFET: spGlobals.function= { Vgate: NAT= 0; Vsource: NAT= 1; Vdrain: NAT= 2; Vt: NAT= 0; Gain: NAT= 1; Vds, Vgst: REAL; Vds_ args[Vdrain] - args[Vsource]; IF Vds >= 0 THEN { Vgst_ args[Vgate] - args[Vsource] - parms[Vt]; v_ IF Vgst > 0 THEN IF Vds > Vgst THEN 0.5*parms[Gain]*Vgst*Vgst ELSE parms[Gain]*(Vgst - 0.5*Vds)*Vds ELSE 0.01*parms[Gain]; } ELSE { Vds_ -Vds; Vgst_ args[Vgate] - args[Vdrain] - parms[Vt]; v_ IF Vgst > 0 THEN IF Vds > Vgst THEN -0.5*parms[Gain]*Vgst*Vgst ELSE -parms[Gain]*(Vgst - 0.5*Vds)*Vds ELSE -0.01*parms[Gain]; }; }; -- SimpleFET PulseGen: spGlobals.function= { onLevel: NAT= 0; offLevel: NAT= 1; period: NAT= 2; width: NAT= 3; tRise: NAT= 4; tFall: NAT= 5; tDelay: NAT= 6; time: REAL_ t - parms[tDelay]; tRel: REAL_ IF time <= 0.0 THEN parms[width] ELSE time - Real.FixI[time/parms[period] ! Real.RealException=> spGlobals.Failure[750]]*parms[period]; v_ SELECT tRel FROM >= parms[width] => parms[offLevel], < parms[tRise] => parms[offLevel] + (parms[onLevel] - parms[offLevel])*tRel/parms[tRise], <= parms[width] - parms[tFall] => parms[onLevel], ENDCASE => parms[offLevel] + (parms[width] - tRel)* (parms[onLevel] - parms[offLevel])/parms[tFall]; }; -- PulseGen OneShotGen: spGlobals.function= { onLevel: NAT= 0; offLevel: NAT= 1; width: NAT= 2; tRise: NAT= 3; tFall: NAT= 4; tDelay: NAT= 5; tRel: REAL_ t - parms[tDelay]; v_ IF tRel < 0.0 OR tRel >= parms[width] THEN parms[offLevel] ELSE IF tRel < parms[tRise] THEN parms[offLevel] + (parms[onLevel] - parms[offLevel])*tRel/parms[tRise] ELSE IF tRel <= parms[width] - parms[tFall] THEN parms[onLevel] ELSE parms[offLevel] + (parms[width] - tRel)* (parms[onLevel] - parms[offLevel])/parms[tFall]; }; -- OneShotGen StepGen: spGlobals.function= { onLevel: NAT= 0; offLevel: NAT= 1; tRise: NAT= 2; tDelay: NAT= 3; v_ IF t <= parms[tDelay] THEN parms[offLevel] ELSE IF t >= parms[tDelay] + parms[tRise] THEN parms[onLevel] ELSE parms[offLevel] + (t - parms[tDelay])* (parms[onLevel] - parms[offLevel])/parms[tRise]; }; -- StepGen spGlobals.EnterFunctions[["OneShotGen", OneShotGen, 0, 6]]; spGlobals.EnterFunctions[["PulseGen", PulseGen, 0, 7]]; spGlobals.EnterFunctions[["SimpleFET", SimpleFET, 3, 2]]; spGlobals.EnterFunctions[["StepGen", StepGen, 0, 4]]; END. CHANGE LOG Wilhem, April 6, 1982 12:17 PM Barth, 7-May-82 10:56:56 PDT Chen, June 7, 1984 8:14:24 pm PDT, cedarized. McCreight, May 3, 1985 3:30:57 pm PDT, modified PulseGen to give OffLevel if t Cedar6.0. þFile: spFunctions.mesa Copyright (C) 1985 by Xerox Corporation. All rights reserved. Last Edited by: Sweetsun Chen, July 22, 1985 8:04:13 pm PDT args indices parms indices gives OffLevel if t™>™J™+—J™šÏk ˜ Jšœœ˜!Jšœ œ%˜4—J˜šœ œ˜Jšœ˜Jšœ ˜—J˜Jš˜J˜Jšœœœœ˜'J˜šœ ˜ Jšœ ™ Jšœœ˜Jšœ œ˜Jšœœ˜Jšœ ™ Jšœœ˜ Jšœœ˜ J˜Jšœ œ˜J˜Jšœ"˜"šœ œ˜Jšœ.˜.šœ˜šœ œ˜Jšœ œ˜,Jšœ!˜%—Jšœ˜—Jšœ˜—šœ˜Jšœ ˜ Jšœ-˜-šœ˜šœ ˜Jšœ œ˜-Jšœ"˜&—Jšœ˜—Jšœ˜—JšœÏc ˜—J˜šœ˜Jšœ9™9Jšœ ™ Jšœ œ˜Jšœ œ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜J˜Jšœœ˜šœœœ œ˜1šœ#˜#Jšœ=˜=——šœ˜šœ˜Jšœ#˜#JšœY˜YJšœ1˜1šœ,˜3Jšœ0˜0———Jšœž ˜—J˜šœ!˜!Jšœ œ˜Jšœ œ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜J˜Jšœœ˜J˜šœ˜Jšœ œœ˜:š˜šœ˜JšœF˜F—š˜Jšœ%œ˜:šœ)˜-Jšœ0˜0————Jšœž ˜—J˜šœ˜Jšœ œ˜Jšœ œ˜Jšœœ˜Jšœœ˜J˜šœ˜Jšœœ˜*š˜Jšœ#œ˜8šœ'˜+Jšœ0˜0———Jšœž ˜ —J˜Jšœ;˜;Jšœ7˜7Jšœ9˜9Jšœ5˜5J˜Jšœ˜J˜šœ˜ J˜Jšœ˜Jšœ˜Jšœœ ˜-Jšœ"œ0˜UJšœœ˜2——…— °Ý