DIRECTORY CD, CMosB, PWPins, PWRoute, IO, Rope; CDFrame: CEDAR DEFINITIONS = BEGIN Frame: TYPE = REF FrameSeq; FrameSeq: TYPE = RECORD[ shell: REF ShellRec _ NIL, data: REF _ NIL, father: Frame _ NIL, xory: XorY, unordered: BOOL _ FALSE, orient: CD.Orientation _ CD.original, seq: SEQUENCE seqSize: CARDINAL OF Frame ]; ShellRec: TYPE = RECORD[ name: IO.ROPE, size: Size _ TameSize[], pos: CD.Position _ [0,0], pins: ARRAY Side OF REF PinSeq ]; PinSeq: TYPE = RECORD[ locInfo: LocInfo _ unk, seq: SEQUENCE seqSize: CARDINAL OF REF PinRec ]; XorY: TYPE = {x,y}; LocInfo: TYPE = {unk, implied, floating, sequencial, fixed}; PinRec: TYPE = RECORD [ name: IO.ROPE, side: Side, pos: CD.Position, size: CD.Position, layer: CD.Layer ]; Side5: TYPE = PWPins.Side; Side: TYPE = Side5[bottom..none); SideRope: ARRAY Side OF IO.ROPE; Size: TYPE = RECORD[x, y: INT, xfree, yfree: Freedom]; Freedom: TYPE = {fixed, tame, wild}; minSize: CD.Position = [14*CMosB.lambda, 16*CMosB.lambda]; TameSize: PROC[pair: CD.Position _ minSize] RETURNS[size:Size] = INLINE {RETURN[[pair.x, pair.y, tame, tame]]}; WildSize: PROC[pair: CD.Position _ minSize] RETURNS[size:Size] = INLINE {RETURN[[pair.x, pair.y, wild, wild]]}; FixedSize: PROC[pair: CD.Position _ minSize] RETURNS[size:Size] = INLINE {RETURN[[pair.x, pair.y, fixed, fixed]]}; FlipSize: PROC[size: Size] RETURNS[Size] = INLINE {RETURN[[size.y, size.x, size.yfree, size.xfree]]}; GlueSpec: TYPE = RECORD[ tDir: PWRoute.HorV, params: PWRoute.RouterParams _ NIL, class: GlueClass _ fill, type: ARRAY Side OF GlueSideType, obj: ARRAY Side OF CD.Object _ ALL[NIL] ]; GlueSideType: TYPE = {cap, conn, pwr, ext, chan, sum, diff}; GlueClass: TYPE = {fill, ext, xlt, chan, pwr, sb, bad}; SetGlueClass: PROC[glue: REF GlueSpec]; NewFrame: PROC[size: INT, xory: XorY, name: IO.ROPE, data: REF_NIL, unord: BOOL_FALSE] RETURNS [new: Frame]; NewExpandFrame: PROC[name: IO.ROPE, proc: ExpandProc] RETURNS [frame: Frame]; NewObjectFrame: PROC[cell: CD.Object] RETURNS[frame: Frame]; NewShellFileFrame: PROC[name: IO.ROPE] RETURNS [frame: Frame]; Glue: PROC[ name: IO.ROPE _ NIL, l,r,b,t: GlueSideType _ cap, -- cap conn ext chan sum diff bObj,rObj,tObj,lObj: CD.Object _ NIL, tDir: PWRoute.HorV _ horizontal, -- vertical horizontal tLayer: IO.ROPE _ NIL, -- metal metal2 poly bLayer: IO.ROPE _ NIL, xlate: BOOL _ FALSE ] -- metal2 poly metal RETURNS [new: Frame]; ID: PROC[name: IO.ROPE] RETURNS[unique: IO.ROPE]; FullFrameName: PROC[frame: Frame] RETURNS[name: IO.ROPE]; FlattenOnce: PROC[frame: Frame] RETURNS[new: Frame]; TestMergeProc: TYPE = PROC[frame: Frame] RETURNS[merge: BOOL]; TestMergeNodes: PROC[frame: Frame, testProc: TestMergeProc _ NIL -- TRUE -- ] RETURNS[new: Frame]; NextSide: PROC[side: Side] RETURNS [next: Side]; PrevSide: PROC[side: Side] RETURNS [prev: Side]; OppSide: PROC[side: Side] RETURNS [opp: Side]; GetSidePos: PROC[pin: REF PinRec] RETURNS [INT]; SetSidePos: PROC[pin: REF PinRec, pos: INT]; ShellFromDesign: PROC[design: REF] RETURNS [shell: REF ShellRec]; ShellFromObject: PROC[cell: CD.Object] RETURNS [shell: REF ShellRec]; ShellFromFile: PROC[shellName: IO.ROPE] RETURNS [shell: REF ShellRec]; ShellToFile: PROC[shell: REF ShellRec]; ShellToBlock: PROC[design: CD.Design, shell: REF ShellRec] RETURNS [obj: CD.Object]; ShellToObject: PROC[design: CD.Design, shell: REF ShellRec, detailed: BOOL _ TRUE] RETURNS[cell: CD.Object]; FrameToObject: PROC[frame: Frame, design: CD.Design, detailed: BOOL _ TRUE] RETURNS [obj: CD.Object]; BlankCell: PROC[design: CD.Design, size: CD.Position] RETURNS[cell: CD.Object]; ExpandProc: TYPE = PROC[frame: Frame, design: CD.Design _ NIL] RETURNS [new: Frame]; SpecificFrameProc: TYPE = PROC[frame: Frame, name: IO.ROPE, design: CD.Design _ NIL] RETURNS [new: Frame, done: BOOL]; ExpandFrame: ExpandProc; DeleteZeroFrames: PROC[frame: Frame] RETURNS[new: Frame]; ReadShellFrame: SpecificFrameProc; WriteShellFrame: SpecificFrameProc; ReOrient: PROC[frame: Frame, design: CD.Design, orient: CD.Orientation _ CD.original]; EnumProc: TYPE = PROC[frame: Frame]; EnumFrameTopFirst: PROC[frame: Frame, proc: EnumProc]; EnumFrameBotFirst: PROC[frame: Frame, proc: EnumProc]; EnumFrameBotOnly: PROC[frame: Frame, proc: EnumProc]; TellKidsAboutDad: PROC [dad: Frame]; Neighbor: PROC [leaf: Frame, side: Side] RETURNS[neighbor: Frame, ok: BOOL]; ListFrame: PROC[frame: Frame, limit: INT _ -1] RETURNS[listing: IO.ROPE]; LogFrame: PROC[frame: Frame, limit: INT _ -1, out: IO.STREAM _ NIL]; SizeCode: PROC[a: INT] RETURNS[INT]; SizePos: PROC[size: CD.Position] RETURNS[CD.Position]; ObjSize: PROC[ob: CD.Object] RETURNS[size: CD.Position]; GetSize: PROC[frame: Frame]; PutSize: PROC[frame: Frame]; PutPos: PROC[frame: Frame, new: CD.Position]; GetPins: PROC[frame: Frame]; FixOneSize: PROC[frame: Frame] RETURNS[fixed1: BOOL _ FALSE]; ScaledText: PROC[design: CD.Design, text: IO.ROPE, box: CD.Position, layer: CD.Layer] RETURNS[cell: CD.Object]; GetLog: PROC RETURNS[IO.STREAM]; END. àCDFrame.mesa Copyright c 1985 by Xerox Corporation. All rights resersed. Last Edited by: Curry, January 23, 1986 7:43:06 am PST CDFrame is a simple tree representation scheme to be used to structure the pieces of large devices as they are actually glued together. The idea is that hard to describe size and routing 'adjustments' can be made using measurements from other parts of the device while it is represented in this form. CDFrame defines a simple shell for CD.Object's which just contains the side, size, location and layer of all the external pins. CDFrame knows how to extract this shell from and object, write it to a file, read back the file and use the representation as a representation for the object itself. Ê[˜šœ ™ Jšœ<™šžœœ)œ  œ˜MJšœ ˜—J˜Jšžœœœ˜8Jšžœœœ˜8Jšžœœœ˜6Jš ž œœœ œœ˜6Jšž œœœœ˜/J˜Jš žœœ œœ œ ˜DJš žœœœ œ œ ˜FJš ž œœ œœœ œ ˜GJšž œœœ ˜(Jš ž œœ œœ œœ ˜Vš ž œœ œœœœ˜SJšœœ ˜—š ž œœœœœ˜KJšœœ ˜—šž œœ œœ ˜7Jšœœ ˜—J˜J˜š ž œœœœ œ˜AJšœ˜—šœœ˜š œœœ œ œ˜:Jšœœ˜!——Jšœ˜Jšžœœœ ˜:Jšœ%˜%Jšœ%˜%J˜Jš žœœœœœ ˜VJ˜Jšžœœœ˜&Jšžœœ˜6Jšžœœ˜7Jšžœœ˜6J˜Jšžœœ˜&šžœœ˜,Jšœœ˜$—Jš ž œœœœ œœ˜MJš žœœœ œœœ˜HJš žœœœœœ˜)Jš žœœœ œœ ˜;J˜Jš žœœœ œœ ˜8Jšžœœ˜!Jšžœœ˜!Jšžœœœ ˜2Jšžœœ˜!Jš ž œœœ œœ˜@J˜šž œœ œœœœœ˜WJšœœ ˜—J˜Jš žœœœœœ˜ J˜Jšœ˜J˜——…—dŸ