<> <> <> <> <> <<>> DIRECTORY Real USING [InlineFixI, 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.InlineFixI[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.