DIRECTORY Basics, ImagerFont, IO, Real, Rope, RoseBehavior, RoseTransduce, RoseWireClasses, RoseWireTypes, VFonts; RoseBitImpl: CEDAR PROGRAM IMPORTS ImagerFont, IO, Real, Rope, RoseTransduce EXPORTS RoseWireClasses, RoseTransduce = BEGIN OPEN RoseWireTypes; SwitchVal: TYPE = RoseBehavior.SwitchVal; Level: TYPE = RoseBehavior.Level; GetBit: PUBLIC PROC RETURNS [RoseWireClass] = {RETURN[bitClass]}; bitSuperClass: RoseWireSuperClass _ NEW[RoseWireSuperClassRec _ [ GetType: BitGetType, ListFormats: BitListFormats, GetFormat: BitGetFormat, Bits: BitBits, MesaRepresentation: BitMesaRepresentation, MesaRepAux: BitMesaRepAux, flavor: switch, Initialize: BitInitialize, Transduce: BitTransduce, InitQ: BitInitQ, InitUD: BitInitUD, ComputeLevel: BitComputeLevel, CopyQ: BitCopyQ, CopyUD: BitCopyUD, CopyLevel: BitCopyLevel, EqualUD: BitEqualUD, MaxinQ: BitMaxinQ, MaxinUD: BitMaxinUD ]]; bitClass: RoseWireClass _ NEW[RoseWireClassRec _ [ structure: atom, dereference: FALSE, addressContaining: FALSE, classData: NIL, super: bitSuperClass]]; BitGetType: PROC [rwc: RoseWireClass, wire: Wire] RETURNS [rwt: RoseWireType] = { IF wire.structure # atom THEN ERROR; RETURN[bitType]; }; bitType: PUBLIC RoseWireType _ NEW[RoseWireTypeRec _ [ class: bitClass, typeData: NIL, length: 0, other: NIL]]; BitListFormats: PROC [rwt: RoseWireType] RETURNS [lor: LOR] = { lor _ LIST["full", "numeric"]; }; BitGetFormat: PROC [rwt: RoseWireType, formatName: ROPE] RETURNS [format: Format] = { format _ SELECT TRUE FROM formatName.Equal["full"], formatName=NIL => fullFormat, formatName.Equal["numeric"], formatName=NIL => numericFormat, ENDCASE => ERROR; }; BitBits: PROC [rwt: RoseWireType] RETURNS [n: INT] = {RETURN[Basics.bitsPerWord]}; BitMesaRepresentation: PROC [rwc: RoseWireClass] RETURNS [mesa: Mesa] = { mesa _ [mesa: "SwitchVal"]}; BitMesaRepAux: PROC [rwc: RoseWireClass] RETURNS [mesa: Mesa] = { mesa _ [ mesa: "SwitchVal: TYPE = RoseBehavior.SwitchVal", directory: LIST["RoseBehavior"] ]; }; SwitchValPtr: TYPE = LONG POINTER TO SwitchVal; BitInitialize: PROC [rwt: RoseWireType, p: Ptr, steady: BOOL] = { WriteSwitch[ p, IF steady THEN [s: [q: charge, u: none, d: charge], val: L] ELSE [s: [q: charge, u: charge, d: charge], val: X] ]; }; BitTransduce: PROC [fromS: Strength, fromT, toT: RoseWireType, fromP, toP: Ptr] = { IF fromT # bitType THEN ERROR; IF toT # RoseTransduce.boolType THEN ERROR; RoseTransduce.WriteBool[ toP, SELECT ReadSwitch[fromP].val FROM L => FALSE, H => TRUE, X => ERROR, ENDCASE => ERROR ]; }; BitInitQ: PROC [rwt: RoseWireType, p: Ptr, cap: Strength] = TRUSTED { svp: SwitchValPtr = SVPFromPtr[p]; svp.s[q] _ cap; }; BitInitUD: PROC [rwt: RoseWireType, p: Ptr, cap: Strength] RETURNS [isInput: BOOL] = TRUSTED { svp: SwitchValPtr = SVPFromPtr[p]; u, d: Strength; [u, d] _ Parts[svp.val, cap]; svp.s[u] _ Block[u, svp.s[q]]; svp.s[d] _ Block[d, svp.s[q]]; isInput _ svp.s[q] = input; }; Block: PROC [a, b: Strength] RETURNS [c: Strength] = {c _ IF a < b THEN none ELSE a}; Parts: PROC [l: Level, s: Strength] RETURNS [u, d: Strength] = { RETURN [ SELECT l FROM L => none, H, X => s, ENDCASE => ERROR, SELECT l FROM H => none, L, X => s, ENDCASE => ERROR]}; BitComputeLevel: PROC [rwt: RoseWireType, p: Ptr, xPhobic: BOOL] RETURNS [delay: BOOL] = TRUSTED { svp: SwitchValPtr = SVPFromPtr[p]; temp: Level _ IF svp.s[u] = none AND svp.s[d] > none THEN L ELSE IF svp.s[d] = none AND svp.s[u] > none THEN H ELSE X; IF NOT (delay _ xPhobic AND temp = X) THEN svp.val _ temp; }; BitCopyQ: PROC [rwt: RoseWireType, from, to: Ptr] = TRUSTED { fromSVP: SwitchValPtr = SVPFromPtr[from]; toSVP: SwitchValPtr = SVPFromPtr[to]; toSVP.s[q] _ fromSVP.s[q]; }; BitCopyUD: PROC [rwt: RoseWireType, from, to: Ptr] = TRUSTED { fromSVP: SwitchValPtr = SVPFromPtr[from]; toSVP: SwitchValPtr = SVPFromPtr[to]; toSVP.s[u] _ fromSVP.s[u]; toSVP.s[d] _ fromSVP.s[d]; }; BitCopyLevel: PROC [rwt: RoseWireType, from, to: Ptr] = TRUSTED { fromSVP: SwitchValPtr = SVPFromPtr[from]; toSVP: SwitchValPtr = SVPFromPtr[to]; toSVP.val _ fromSVP.val; }; BitEqualUD: PROC [rwt: RoseWireType, p1, p2: Ptr] RETURNS [equal: BOOL] = TRUSTED { svp1: SwitchValPtr = SVPFromPtr[p1]; svp2: SwitchValPtr = SVPFromPtr[p2]; equal _ svp1.s[u] = svp2.s[u] AND svp1.s[d] = svp2.s[d]; }; BitMaxinQ: PROC [rwt: RoseWireType, from, to: Ptr] RETURNS [increase: BOOL] = TRUSTED { fromSVP: SwitchValPtr = SVPFromPtr[from]; toSVP: SwitchValPtr = SVPFromPtr[to]; increase _ FALSE; IF toSVP.s[q] "0", H => "1", X => "X", ENDCASE => ERROR; }; NumericParseValue: PROC [rwt: RoseWireType, f: Format, p: Ptr, s: STREAM] RETURNS [ok: BOOL] = { c: CHAR = s.GetChar[]; val: SwitchVal; SELECT c FROM '0 => val _ [s: [q: charge, u: none, d: charge], val: L]; 'X => val _ [s: [q: charge, u: charge, d: charge], val: X]; '1 => val _ [s: [q: charge, u: charge, d: none], val: H]; ENDCASE => RETURN [FALSE]; WriteSwitch[p, val]; ok _ TRUE; }; NumericMaxWidth: PROC [rwt: RoseWireType, fmt: Format, font: VFonts.Font] RETURNS [max: INT] = { max _ Real.Round[ImagerFont.RopeWidth[font, "X"].x]; }; DriveName: ARRAY Drive OF ROPE = [ test: "0", see: "1", none: "2", chargeWeak: "3", chargeMediumWeak: "4", charge: "5", chargeMediumStrong: "6", chargeStrong: "7", chargeVeryStrong: "8", driveWeak: "9", driveMediumWeak: "A", drive: "B", driveMediumStrong: "C", driveStrong: "D", driveVeryStrong: "E", input: "F" ]; LevelName: ARRAY Level OF ROPE = [L: "L", X: "X", H: "H"]; fullFormat: Format _ NEW [FormatRep _ [ FormatValue: FullFormatValue, ParseValue: FullParseValue, MaxWidth: FullMaxWidth, key: "full"]]; FullFormatValue: PROC [rwt: RoseWireType, f: Format, p: Ptr] RETURNS [r: ROPE] = { val: SwitchVal = ReadSwitch[p]; r _ Rope.Cat[ DriveName[val.s[q]], DriveName[val.s[u]], DriveName[val.s[d]], LevelName[val.val] ]; }; FullParseValue: PROC [rwt: RoseWireType, f: Format, p: Ptr, s: STREAM] RETURNS [ok: BOOL] = { ENABLE IO.Error, IO.EndOfStream => {ok _ FALSE; CONTINUE}; val: SwitchVal; ok _ TRUE; val.s[q] _ ParseDrive[s]; val.s[u] _ ParseDrive[s]; val.s[d] _ ParseDrive[s]; val.val _ ParseLevel[s]; WriteSwitch[p, val]; }; ParseDrive: PROC [s: STREAM] RETURNS [d: Drive] = { c: CHAR = s.GetChar[]; FOR drive: Drive IN Drive DO IF c = DriveName[drive].Fetch[0] THEN RETURN [drive]; ENDLOOP; IO.Error[SyntaxError, s]; }; ParseLevel: PROC [s: STREAM] RETURNS [l: Level] = { c: CHAR = s.GetChar[]; FOR level: Level IN Level DO IF c = LevelName[level].Fetch[0] THEN RETURN [level]; ENDLOOP; IO.Error[SyntaxError, s]; }; FullMaxWidth: PROC [rwt: RoseWireType, fmt: Format, font: VFonts.Font] RETURNS [max: INT] = { max _ Real.Round[ImagerFont.RopeWidth[font, "FFFX?"].x]; }; ReadSwitch: PUBLIC PROC [p: Ptr] RETURNS [s: SwitchVal] = TRUSTED { svp: SwitchValPtr = SVPFromPtr[p]; s _ svp^; }; WriteSwitch: PUBLIC PROC [p: Ptr, s: SwitchVal] = TRUSTED { svp: SwitchValPtr = SVPFromPtr[p]; svp^ _ s; }; SVPFromPtr: PROC [p: Ptr] RETURNS [svp: SwitchValPtr] = { svp _ LOOPHOLE[p.word]; IF p.bit # 0 THEN ERROR; }; END. ͺRoseBitImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Barth, September 5, 1985 6:37:22 pm PDT Spreitzer, September 30, 1985 9:23:57 pm PDT Κ C– "cedar" style˜codešœ™Kšœ Οmœ1™Kšœ)˜)Kšœ%˜%K˜K˜K˜K˜—š  œžœ&žœ˜AKšœ)˜)Kšœ%˜%K˜K˜K˜—š   œžœ"žœ žœžœ˜SKšœ$˜$Kšœ$˜$Kšœžœ˜8K˜K˜—š   œžœ$žœ žœžœ˜WKšœ)˜)Kšœ%˜%Kšœ žœ˜Kšžœžœ&žœ˜KK˜K˜—š   œžœ$žœ žœžœ˜XKšœ)˜)Kšœ%˜%Kšœ.˜.Kšœ.˜.Kšœ žœ˜Kšžœžœžœ˜9Kšžœžœžœ˜9K˜K˜—šœžœ˜*Kšœ ˜ K˜Kšœ˜Kšœ˜K˜—š œžœ(žœžœ˜Ušœžœž˜!Kšžœ˜ Kšžœ˜ K˜ Kšžœžœ˜—K˜K˜—š  œžœ+žœžœžœ˜`Kšœžœ˜Kšœ˜šžœž˜ Kšœ9˜9Kšœ;˜;Kšœ9˜9Kšžœžœžœ˜—Kšœ˜Kšœžœ˜ K˜K˜—š œžœ5žœžœ˜`Kšœ4˜4K˜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˜—š œžœ(žœžœ˜RK˜˜ K˜K˜K˜K˜K˜—K˜K˜—š  œžœ+žœžœžœ˜]Kš žœžœžœžœžœ˜:Kšœ˜Kšœžœ˜ K˜K˜K˜K˜Kšœ˜K˜K˜—š  œžœžœžœ˜3Kšœžœ˜šžœžœž˜Kšžœžœžœ ˜5Kšžœ˜—Kšžœ˜K˜K˜—š  œžœžœžœ˜3Kšœžœ˜šžœžœž˜Kšžœžœžœ ˜5Kšžœ˜—Kšžœ˜K˜K˜—š  œžœ5žœžœ˜]Kšœ8˜8K˜K˜—š   œžœžœ žœžœ˜CKšœ"˜"K˜ K˜K˜—š  œžœžœžœ˜;Kšœ"˜"K˜ K˜K˜—š  œžœ žœ˜9Kšœžœ ˜Kšžœ žœžœ˜K˜K˜—Kšžœ˜—…—L)9