DIRECTORY Basics, BitTwiddling, Convert, ImagerFont, IO, Real, Rope, RoseBehavior, RoseWireClasses, RoseWireTypes, RoseWireTypeUse, RoseWiring, VFonts; RoseFixedSequenceImpl: CEDAR PROGRAM IMPORTS BitTwiddling, ImagerFont, IO, Real, Rope, RoseWireTypes, RoseWireTypeUse, RoseWiring EXPORTS RoseWireClasses, RoseWireTypes = BEGIN OPEN RoseWireTypes; SwitchVal: TYPE = RoseBehavior.SwitchVal; Level: TYPE = RoseBehavior.Level; FixSeqRep: TYPE = REF FixSeqRec; FixSeqRec: TYPE = RECORD [ rwt: RoseWireType, name: ROPE, bitSize, wordSize: NAT, repAux: Mesa _ [], vanillaMaxWidth: INT _ 0, vanillaMaxWidthFont: ImagerFont.Font _ NIL, ewc: RoseWireClass, ewt: RoseWireType, eltBitSize, stepBits, eltPad: NAT, eltDefaultFormat: Format, length: NAT]; WireFlavorName: PUBLIC ARRAY WireFlavor OF ROPE _ [ simple: "Simple", switch: "Switch", drive: "Drive" ]; GetFixedSequence: PUBLIC PROC [prototype: Wire, flavor: WireFlavor] RETURNS [rwc: RoseWireClass] = { name: ROPE = RoseWiring.WireName[prototype]; rwtUser: RoseWireTypeUse.RoseWireTypeUser = RoseWireTypeUse.CreateUser[]; moduleRefs: ARRAY RoseWireTypeUse.ModuleRefType OF LOR; length: NAT = prototype.elements.size; cedarTypeName: ROPE = name.Cat[WireFlavorName[flavor]]; ewc: RoseWireClass = RoseWiring.GetWiring[prototype.elements[0], flavor]; ewt: RoseWireType = ewc.super.GetType[ewc, prototype.elements[0]]; eltBitSize: NAT = ewt.class.super.Bits[ewt]; stepBits: NAT = SELECT TRUE FROM eltBitSize < 1 => ERROR, eltBitSize <= 2 => eltBitSize, eltBitSize <= 4 => 4, eltBitSize <= 8 => 8, eltBitSize <= Basics.bitsPerWord => Basics.bitsPerWord, eltBitSize MOD Basics.bitsPerWord = 0 => eltBitSize, ENDCASE => ERROR; eltsPerWord: NAT = Basics.bitsPerWord / stepBits; bitSize: NAT = IF length <= eltsPerWord THEN length*stepBits ELSE ((length + eltsPerWord-1) / eltsPerWord) * eltsPerWord * stepBits; wordSize: NAT = (bitSize + Basics.bitsPerWord-1) / Basics.bitsPerWord; fsr: FixSeqRep _ NEW [FixSeqRec _ [ rwt: NIL, name: cedarTypeName, bitSize: bitSize, wordSize: wordSize, ewc: ewc, ewt: ewt, eltBitSize: eltBitSize, stepBits: stepBits, eltPad: stepBits - eltBitSize, eltDefaultFormat: ewc.super.GetFormat[ewt, NIL], length: length]]; em: Mesa = ewc.super.MesaRepresentation[ewc]; bitBucket: ROPE; IF prototype.structure # sequence THEN ERROR; rwtUser.NoteMesa[em]; [bitBucket, moduleRefs] _ rwtUser.DestroyUser[]; IF bitBucket.Length[] # 0 THEN ERROR; fsr.repAux.directory _ moduleRefs[Directory]; fsr.repAux.imports _ moduleRefs[Import]; IF moduleRefs[Export] # NIL OR moduleRefs[Open] # NIL THEN ERROR; fsr.repAux.mesa _ IO.PutFR[ "%g: TYPE = PACKED ARRAY [0 .. %g) OF %g", [rope[fsr.name]], [integer[fsr.length]], [rope[em.mesa]] ]; rwc _ NEW[RoseWireClassRec _ [ structure: sequence, dereference: FALSE, addressContaining: ewc.dereference OR ewc.addressContaining, classData: fsr, super: fixSeqSuperClasses[flavor]]]; fsr.rwt _ NEW[RoseWireTypeRec _ [ class: rwc, typeData: NIL, length: fsr.length, other: NIL]]; }; fixSeqSuperClasses: ARRAY WireFlavor OF RoseWireSuperClass _ ALL[NIL]; FixSeqGetType: PROC [rwc: RoseWireClass, wire: Wire] RETURNS [rwt: RoseWireType] = { fsr: FixSeqRep = NARROW[rwc.classData]; IF wire.structure # sequence THEN ERROR; rwt _ fsr.rwt; }; FixSeqListFormats: PROC [rwt: RoseWireType] RETURNS [lor: LOR] = { lor _ LIST["vanilla"]; }; FixSeqGetFormat: PROC [rwt: RoseWireType, formatName: ROPE] RETURNS [format: Format] = { format _ SELECT TRUE FROM formatName.Equal["vanilla"], formatName=NIL => vanillaFormat, ENDCASE => ERROR; }; FixSeqSelectorOffset: PROC [rwt: RoseWireType, sel: Selector] RETURNS [dBits: NAT] = { fsr: FixSeqRep = NARROW[rwt.class.classData]; WITH sel SELECT FROM whole => RETURN [0]; field => ERROR; subscript => RETURN [Suboff[fsr, index]]; ENDCASE => ERROR; }; Suboff: PROC [fsr: FixSeqRep, i: NAT] RETURNS [dBits: NAT] = { dBits _ fsr.stepBits * i + fsr.eltPad; }; FixSeqSubType: PROC [rwt: RoseWireType, sel: Selector] RETURNS [RoseWireType] = { fsr: FixSeqRep = NARROW[rwt.class.classData]; WITH sel SELECT FROM whole => RETURN [rwt]; field => ERROR; subscript => RETURN [fsr.ewt]; ENDCASE => ERROR; }; FixSeqSubClass: PROC [rwc: RoseWireClass, sel: Selector] RETURNS [RoseWireClass] = { fsr: FixSeqRep = NARROW[rwc.classData]; WITH sel SELECT FROM whole => RETURN [rwc]; field => ERROR; subscript => RETURN [fsr.ewc]; ENDCASE => ERROR; }; FixSeqBits: PROC [rwt: RoseWireType] RETURNS [n: INT] = { fsr: FixSeqRep = NARROW[rwt.class.classData]; n _ fsr.bitSize; }; FixSeqMesaRepresentation: PROC [rwc: RoseWireClass] RETURNS [mesa: Mesa] = { fsr: FixSeqRep = NARROW[rwc.classData]; mesa _ [mesa: fsr.name]; }; FixSeqMesaRepAux: PROC [rwc: RoseWireClass] RETURNS [mesa: Mesa] = { fsr: FixSeqRep = NARROW[rwc.classData]; mesa _ fsr.repAux; }; FixSeqInitialize: PROC [rwt: RoseWireType, p: Ptr, steady: BOOL] = { fsr: FixSeqRep = NARROW[rwt.class.classData]; FOR i: NAT IN [0 .. fsr.length) DO fsr.ewc.super.Initialize[ fsr.ewt, BitTwiddling.OffsetPtr[p, Suboff[fsr, i]], steady ]; ENDLOOP; steady _ steady; }; FixSeqTransduce: PROC [fromS: Strength, fromT, toT: RoseWireType, fromP, toP: Ptr] = { fsr: FixSeqRep = NARROW[fromT.class.classData]; IF fromT.class.structure # sequence THEN ERROR; IF toT.class.structure # sequence THEN ERROR; IF fromT.length # toT.length THEN ERROR; IF toT.class.dereference THEN toP _ BitTwiddling.DeReferencePtr[toP]; FOR i: NAT IN [0 .. fsr.length) DO subFrom: Ptr = BitTwiddling.OffsetPtr[fromP, Suboff[fsr, i]]; sel: Selector = [subscript[i]]; subTo: Ptr = BitTwiddling.OffsetPtr[toP, toT.class.super.SelectorOffset[toT, sel]]; fsr.ewc.super.Transduce[ fromS: fromS, fromT: fsr.ewt, toT: toT.class.super.SubType[toT, sel], fromP: subFrom, toP: subTo]; toT _ toT; ENDLOOP; toT _ toT; }; FixSeqInitQ: PROC [rwt: RoseWireType, p: Ptr, cap: Strength] = TRUSTED { fsr: FixSeqRep = NARROW[rwt.class.classData]; FOR i: NAT IN [0 .. fsr.length) DO subType: RoseWireType = fsr.ewt; subType.class.super.InitQ[ subType, BitTwiddling.OffsetPtr[p, Suboff[fsr, i]], cap]; cap _ cap; ENDLOOP; cap _ cap; }; FixSeqInitUD: PROC [rwt: RoseWireType, p: Ptr, cap: Strength] RETURNS [isInput: BOOL] = TRUSTED { fsr: FixSeqRep = NARROW[rwt.class.classData]; isInput _ TRUE; FOR i: NAT IN [0 .. fsr.length) DO subType: RoseWireType = fsr.ewt; subInput: BOOL _ subType.class.super.InitUD[ subType, BitTwiddling.OffsetPtr[p, Suboff[fsr, i]], cap]; isInput _ isInput AND subInput; ENDLOOP; cap _ cap; }; FixSeqComputeLevel: PROC [rwt: RoseWireType, p: Ptr, xPhobic: BOOL] RETURNS [delay: BOOL] = TRUSTED { fsr: FixSeqRep = NARROW[rwt.class.classData]; delay _ FALSE; FOR i: NAT IN [0 .. fsr.length) DO subType: RoseWireType = fsr.ewt; subDelay: BOOL _ subType.class.super.ComputeLevel[ subType, BitTwiddling.OffsetPtr[p, Suboff[fsr, i]], xPhobic]; delay _ delay OR subDelay; ENDLOOP; xPhobic _ xPhobic; }; vanillaFormat: Format _ NEW [FormatRep _ [ FormatValue: RecursivelyFormatValue, ParseValue: RecursivelyParseValue, MaxWidth: RecursivelyMaxWidth, key: "vanilla"]]; RecursivelyFormatValue: PROC [rwt: RoseWireType, f: Format, p: Ptr] RETURNS [r: ROPE] = { fsr: FixSeqRep = NARROW[rwt.class.classData]; to: STREAM = IO.ROS[]; to.PutRope["["]; FOR i: NAT IN [0 .. fsr.length) DO sf: Format = fsr.eltDefaultFormat; IF i # 0 THEN to.PutRope[" "]; to.PutRope[sf.FormatValue[ fsr.ewt, sf, BitTwiddling.OffsetPtr[p, Suboff[fsr, i]] ]]; ENDLOOP; to.PutRope["]"]; r _ to.RopeFromROS[]; }; RecursivelyParseValue: PROC [rwt: RoseWireType, f: Format, p: Ptr, s: STREAM] RETURNS [ok: BOOL] = { ENABLE IO.Error, IO.EndOfStream => {ok _ FALSE; CONTINUE}; fsr: FixSeqRep = NARROW[rwt.class.classData]; Consume: PROC [goal: ROPE] = { toke: ROPE = s.GetTokenRope[WireValBreak].token; IF NOT toke.Equal[goal] THEN IO.Error[SyntaxError, s]; }; ok _ TRUE; Consume["["]; FOR i: NAT IN [0 .. fsr.length) DO sf: Format = fsr.eltDefaultFormat; IF i # 0 THEN [] _ s.SkipWhitespace[]; IF NOT sf.ParseValue[ fsr.ewt, sf, BitTwiddling.OffsetPtr[p, Suboff[fsr, i]], s ] THEN RETURN [FALSE]; ENDLOOP; Consume["]"]; }; RecursivelyMaxWidth: PROC [rwt: RoseWireType, fmt: Format, font: VFonts.Font] RETURNS [max: INT] = { fsr: FixSeqRep = NARROW[rwt.class.classData]; AddRope: PROC [r: ROPE, times: NAT _ 1] = { max _ max + Real.Round[times * ImagerFont.RopeWidth[font, r].x]; }; IF fsr.vanillaMaxWidthFont = font THEN RETURN [fsr.vanillaMaxWidth]; fsr.vanillaMaxWidthFont _ font; max _ 0; AddRope["[]", 1]; AddRope[" ", fsr.length-1]; max _ max + fsr.length * fsr.eltDefaultFormat.MaxWidth[ fsr.ewt, fsr.eltDefaultFormat, font ]; fsr.vanillaMaxWidth _ max; }; Start: PROC = { FOR wf: WireFlavor IN WireFlavor DO fixSeqSuperClasses[wf] _ NEW[RoseWireSuperClassRec _ [ GetType: FixSeqGetType, ListFormats: FixSeqListFormats, GetFormat: FixSeqGetFormat, SelectorOffset: FixSeqSelectorOffset, SubType: FixSeqSubType, SubClass: FixSeqSubClass, Bits: FixSeqBits, MesaRepresentation: FixSeqMesaRepresentation, MesaRepAux: FixSeqMesaRepAux, flavor: wf, Initialize: FixSeqInitialize, Transduce: FixSeqTransduce, InitQ: FixSeqInitQ, InitUD: FixSeqInitUD, ComputeLevel: FixSeqComputeLevel ]]; ENDLOOP; }; Start[]; END. °RoseFixedSequenceImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Barth, September 5, 1985 6:37:22 pm PDT Spreitzer, October 1, 1985 6:31:31 pm PDT Κ „– "cedar" style˜codešœ™Kšœ Οmœ1™K˜&K˜K˜—š  œžœ$žœ˜QKšœžœ˜-šžœžœž˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ ˜Kšžœžœ˜—Kšœ˜K˜—š œžœ%žœ˜TKšœžœ˜'šžœžœž˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ ˜Kšžœžœ˜—Kšœ˜K˜—š  œžœžœžœ˜9Kšœžœ˜-K˜Kšœ˜K˜—š œžœžœ˜LKšœžœ˜'Kšœ˜Kšœ˜K˜—š œžœžœ˜DKšœžœ˜'Kšœ˜Kšœ˜K˜—š œžœ%žœ˜DKšœžœ˜-šžœžœžœž˜"šœ˜K˜Kšœ*˜*Kšœ˜K˜—Kšžœ˜—Kšœ˜K˜K˜—š œžœA˜VKšœžœ˜/Kšžœ"žœžœ˜/Kšžœ žœžœ˜-Kšžœžœžœ˜(Kšžœžœ(˜Ešžœžœžœž˜"Kšœ=˜=Kšœ˜KšœS˜S˜K˜ K˜Kšœ'˜'K˜Kšœ ˜ —Kšœ ˜ Kšžœ˜—Kšœ ˜ K˜K˜—šΠbn œžœ.žœ˜HKšœžœ˜-šžœžœžœž˜"K˜ ˜K˜Kšœ*˜*K˜—Kšœ ˜ Kšžœ˜—Kšœ ˜ K˜K˜—š ‘ œžœ,žœ žœžœ˜aKšœžœ˜-Kšœ žœ˜šžœžœžœž˜"K˜ šœ žœ˜,K˜Kšœ*˜*K˜—Kšœžœ ˜Kšžœ˜—Kšœ ˜ K˜K˜—š ‘  œžœ&žœžœ žœžœ˜eKšœžœ˜-Kšœžœ˜šžœžœžœž˜"K˜ šœ žœ$˜2K˜Kšœ*˜*Kšœ ˜ —Kšœžœ ˜Kšžœ˜—Kšœ˜K˜K˜—šœžœ˜*Kšœ$˜$K˜"Kšœ˜Kšœ˜K˜—š œžœ(žœžœ˜YKšœžœ˜-Kšœžœžœžœ˜K˜šžœžœžœž˜"Kšœ"˜"Kšžœžœ˜˜K˜K˜Kšœ)˜)K˜—Kšžœ˜—K˜K˜K˜K˜—š  œžœ+žœžœžœ˜dKš žœžœžœžœžœ˜:Kšœžœ˜-š œžœžœ˜Kšœžœ&˜0Kšžœžœžœžœ˜6K˜—Kšœžœ˜ K˜ šžœžœžœž˜"Kšœ"˜"Kšžœžœ˜&šž˜šžœ˜K˜K˜Kšœ*˜*K˜K˜—Kšžœžœžœ˜—Kšžœ˜—K˜ K˜K˜—š œžœ5žœžœ˜dKšœžœ˜-š œžœžœ žœ ˜+Kšœ@˜@K˜—Kšžœ žœžœ˜DKšœ˜K˜K˜Kšœ˜šœ7˜7K˜Kšœ˜K˜K˜—Kšœ˜K˜K˜—š œžœ˜šžœžœ ž˜#šœžœ˜6Kšœ˜Kšœ˜Kšœ˜Kšœ%˜%Kšœ˜Kšœ˜Kšœ˜Kšœ-˜-Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜K˜K˜K˜ Kšœ˜—Kšžœ˜—K˜—K˜K˜K˜Kšžœ˜—…—#¬/ΰ