<> <> <> <> <> 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.