DIRECTORY Real USING [FixI, RealException], ThymeGlobals USING [EnterFunctions, Failure, function]; ThymeFunctions: CEDAR PROGRAM IMPORTS Real, ThymeGlobals = BEGIN FunctionError: SIGNAL[s: STRING]= CODE; SimpleFET: ThymeGlobals.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: ThymeGlobals.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=> ThymeGlobals.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: ThymeGlobals.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: ThymeGlobals.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 ThymeGlobals.EnterFunctions[["OneShotGen", OneShotGen, 0, 6]]; ThymeGlobals.EnterFunctions[["PulseGen", PulseGen, 0, 7]]; ThymeGlobals.EnterFunctions[["SimpleFET", SimpleFET, 3, 2]]; ThymeGlobals.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. ,ThymeFunctions.mesa Copyright (C) 1985 by Xerox Corporation. All rights reserved. Last Edited by: Christian LeCocq January 27, 1987 3:42:39 pm PST Sweetsun Chen, July 22, 1985 8:04:13 pm PDT args indices parms indices gives OffLevel if t™>™K™0Kšœ(Οk™+—K™š ˜ Kšœœ˜!Kšœ œ%˜7—K˜šΟnœœ˜š˜Kšœ˜Kšœ ˜ ——K˜Kšœ˜K˜Kšž œœœœ˜'K˜šž œ˜#Kšœ ™ Kšœœ˜Kšœ œ˜Kšœœ˜Kšœ ™ Kšœœ˜ Kšœœ˜ Kšœ œ˜Kšœ#˜#šœ œ˜Kšœ/˜/šœœ œ˜Kšœ œ˜,Kšœ!˜%—Kšœ˜Kšœ˜—šœ˜Kšœ ˜ Kšœ.˜.šœœ ˜Kšœ œ˜-Kšœ"˜&—Kšœ˜Kšœ˜—KšœΟc ˜—K˜šžœ˜"Kšœœ™9Kšœ ™ Kšœ œ˜Kšœ œ˜Kšœœ˜Kšœœ˜Kšœœ˜Kšœœ˜Kšœœ˜Kšœœ˜š œœœ œœ$˜VKšœ@˜@—šœ˜šœ˜Kšœ#˜#KšœY˜YKšœ1˜1KšœW˜^——KšœŸ ˜—K˜šž œ˜$Kšœ œ˜Kšœ œ˜Kšœœ˜Kšœœ˜Kšœœ˜Kšœœ˜Kšœœ˜šœ˜Kšœ œœ˜:š˜šœ˜KšœF˜F—š˜Kšœ%œ˜:šœ)˜-Kšœ0˜0————KšœŸ ˜—K˜šžœ˜!Kšœ œ˜Kšœ œ˜Kšœœ˜Kšœœ˜šœ˜Kšœœ˜*š˜Kšœ#œ˜8šœ'˜+Kšœ0˜0———KšœŸ ˜ —K˜Kšœ>˜>Kšœ:˜:Kšœ<˜