DIRECTORY DABasics, Cabbage, CabbagePrivate, Connections, CD, Rope; CabbageImpl: CEDAR PROGRAM IMPORTS CabbagePrivate EXPORTS Cabbage = BEGIN OPEN Cabbage; Error: PUBLIC ERROR[errorType: ErrorType _ callingError, explanation: Rope.ROPE _ NIL] = CODE; Signal: PUBLIC SIGNAL[errorType: ErrorType _ callingError, explanation: Rope.ROPE _ NIL] = CODE; defaultPadRingParams: PUBLIC PadRingParams _ NEW[PadRingParamsRec _ ["metal", "metal2"]]; Center: PUBLIC PROC [inner, bottomLeft, bottom, bottomRight, right, topRight, top, topLeft, left: CD.Object, parms: PadRingParams] RETURNS [innerPos: DABasics.Position] = { handle: CabbagePrivate.Handle _ CabbagePrivate.CreateHandle[inner, bottomLeft, bottom, bottomRight, right, topRight, top, topLeft, left, NIL, parms, NIL, normal]; lowerY: INT _ handle.bottom.origin.y + handle.bottom.size.y; upperY: INT _ handle.top.origin.y - handle.inner.size.y; lowerX: INT _ handle.left.origin.x + handle.left.size.x; upperX: INT _ handle.right.origin.x - handle.inner.size.x; innerPos _ [(lowerX + upperX)/2, (lowerY + upperY)/2]}; PadRoute: PUBLIC PROC [inner, bottomLeft, bottom, bottomRight, right, topRight, top, topLeft, left: CD.Object, innerPos: DABasics.Position, connections: Connections.Table, parms: PadRingParams _ defaultPadRingParams, name: Rope.ROPE] RETURNS [chip: CD.Object] = { handle: CabbagePrivate.Handle _ CabbagePrivate.CreateHandle[inner, bottomLeft, bottom, bottomRight, right, topRight, top, topLeft, left, connections, parms, name, normal]; CabbagePrivate.CheckInnerPos[handle, innerPos]; CabbagePrivate.DistributePower[handle]; CabbagePrivate.GlobalRoute[handle]; CabbagePrivate.DetailedRoute[handle]; chip _ CabbagePrivate.MakeChip[handle]}; PadLimitedRoute: PUBLIC PROC [inner, bottomLeft, bottom, bottomRight, right, topRight, top, topLeft, left: CD.Object, innerPos: DABasics.Position, connections: Connections.Table, parms: PadRingParams _ defaultPadRingParams, name: Rope.ROPE] RETURNS [chip: CD.Object] = { handle: CabbagePrivate.Handle _ CabbagePrivate.CreateHandle[inner, bottomLeft, bottom, bottomRight, right, topRight, top, topLeft, left, connections, parms, name, padLimited]; CabbagePrivate.CheckInnerPos[handle, innerPos]; CabbagePrivate.DistributePower[handle]; CabbagePrivate.GlobalRoute[handle]; CabbagePrivate.DetailedRoute[handle]; chip _ CabbagePrivate.MakeChip[handle]}; END. βCabbageImpl.mesa Copyright Σ 1986, 1987 by Xerox Corporation. All rights reversed. Created by Bryan Preas, April 2, 1987 11:10:28 am PST Bertrand Serlet April 27, 1987 0:24:58 am PDT Bryan Preas August 21, 1987 10:59:09 am PDT Signals Utilities Returns the innerPos needed for centering the inner in the pad frame. This is usually what is desired. However the position of the inner cell can be positioned other than in the center. Route the chip Route a pad limited chip Κ˜– "Cedar" stylešœ™JšœB™BJšœ2Οk™5Icodešœ-™-Kšœ+™+—J˜š œ˜ Jšœ0œ˜9—J˜šΟn œœ˜Jšœ˜Jšœ ˜Jšœœ ˜—head™Kš žœœœ8œœœ˜^Kš žœœœ8œœœ˜`—™ šœœœ)˜YK˜—Kšœ»™»š žœœœOœœ"˜¬Kšœ‰œ œ ˜’Kšœœ1˜ ?