<> <> <> <<>> DIRECTORY CD, D2Basic, Properties, Rope, RTBasic; Route: CEDAR DEFINITIONS = BEGIN <> <> <> <> <> << The routing area is rectangular but may have irregular routing barriers on the edges of the rectangle.>> << The pins may not lie in the routing area proper (that is, they must lie outside the routing area of within the route barriers).>> << The pins must be accessable by straight line segments on the layer for the routing material used. A via or contact will be inserted if necessary.>> << The routing area (except for the routing barriers) is owned by Route. Route will disregard any pre-existing material in the routing area proper.>> <<>> <> << Pins must have fixed positions on the sides parallel to the trunk layer direction. Pins on the channel ends (routing area sides parallel to the branch direction) are positioned by the channel router to minimize the routing area.>> << Channel routing algorithms do not exploit the area in the shadow of routing barriers well.>> <<>> <> << The routing area is not altered from the input specification. The SwitchBox router does the best it can in the area specified.>> <> RopeList: TYPE = LIST OF Rope.ROPE; Layer: TYPE = CD.Layer; Object: TYPE = CD.Object; Rect: TYPE = D2Basic.Rect; RectList: TYPE = LIST OF Rect; RefRect: TYPE = REF Rect; Position: TYPE = D2Basic.Pos; PositionList: TYPE = LIST OF Position; Number: TYPE = D2Basic.Number; SideOrNone: TYPE = {bottom, right, top, left, none}; Side: TYPE = SideOrNone[bottom .. left]; DirectionOrNone: TYPE = RTBasic.DirectionOrNone; Direction: TYPE = RTBasic.Direction; PropList: TYPE = Properties.PropList; Optimization: TYPE = {full, noIncompletes}; <> Error: ERROR [errorType: ErrorType _ callingError, explanation: Rope.ROPE _ NIL]; Signal: SIGNAL [errorType: ErrorType _ callingError, explanation: Rope.ROPE _ NIL]; ErrorType: TYPE = {programmingError, callingError, noResource, other}; <> RoutingArea: TYPE = REF RoutingAreaRec; RoutingAreaRec: TYPE = RECORD [ name: Rope.ROPE _ NIL, rules: DesignRules _ NIL, routingSides: PRIVATE REF ANY _ NIL, properties: PRIVATE REF ANY _ NIL, nets: PRIVATE REF ANY _ NIL, parms: PRIVATE REF ANY _ NIL, privateData: PRIVATE REF ANY _ NIL]; CreateRoutingArea: PROC [routingAreaName: Rope.ROPE _ NIL, designRules: DesignRules, properties: PropList _ NIL] RETURNS [routingArea: RoutingArea]; <> <> DesignRules: TYPE = REF DesignRulesRec; DesignRulesRec: TYPE = RECORD[ horizLayer, vertLayer, trunkLayer, branchLayer: Layer, CDLambda: Number, trunkDirection, branchDirection: DirectionOrNone, trunkWidth, trunkSpacing, trunkToContact, trunkToTrunk, trunkOffset, branchWidth, branchSpacing, branchToContact, branchToBranch, branchOffset, contactSize, contactToContact, pinSpacing, trunkToEdge: Number _ 0, technology: PRIVATE REF ANY _ NIL]; CreateDesignRules: PROC [technologyKey: ATOM, horizLayer, vertLayer: Layer, trunkDirection: Direction, properties: PropList _ NIL] RETURNS [designRules: DesignRules]; <> <> <> RoutingBarrier: TYPE = REF RoutingBarrierRec; RoutingBarrierList: TYPE = LIST OF RoutingBarrier; RoutingBarrierRec: TYPE = RECORD[ layer: Layer _ CD.combined, barrier: RectList _ NIL, properties: PropList _ NIL]; CreateRoutingBarrier: PROC [layer: Layer, barrier: RectList _ NIL, properties: PropList _ NIL] RETURNS [routingBarrier: RoutingBarrier]; <> <<>> IncludeRoutingAreaSide: PROC [routingArea: Route.RoutingArea, side: Side, sideFiducial: Position, barriers: RoutingBarrierList _ NIL, properties: PropList _ NIL]; <> <> Pin: TYPE = REF PinRec; PinList: TYPE = LIST OF Pin; PinRec: TYPE = RECORD[ pin: CD.Instance _ NIL, side: Side]; CreatePin: PROC [cdPin: CD.Instance, side: Side] RETURNS [pin: Pin]; <> <<>> IncludeNet: PROC [routingArea: RoutingArea, netName: Rope.ROPE, connections: PinList, properties: PropList _ NIL]; <> <> RoutingResult: TYPE = REF RoutingResultRec; RoutingResultRec: TYPE = RECORD[ routingArea: RoutingArea, polyLength, metalLength, metal2Length: Route.Number _ 0, polyToMetal, metalToMetal2, numTrunkTracks, numIncompletes: NAT _ 0, routingRect: Rect _ Rect[0, 0, 0, 0], moreAreaRequired: BOOL _ FALSE, incompleteNets, breakAtExitNets: RopeList _ NIL]; PositionVec: TYPE = ARRAY Side OF Position; ChannelRoute: PROC [routingArea: RoutingArea, sideOrgins: PositionVec, routingRect: Rect, opt: Optimization _ full] RETURNS [routingResult: RoutingResult]; <> SwitchBoxRoute: PROC [routingArea: RoutingArea, sideOrgins: PositionVec, routingRect: Rect, opt: Optimization _ full] RETURNS [routingResult: RoutingResult]; <> MazeRoute: PROC [routingArea: RoutingArea, sideCoords: PositionVec, routingRect: Rect, opt: Optimization] RETURNS [routingResult: RoutingResult]; <> <> RetrieveRouting: PROC [routingResult: RoutingResult, cellName: Rope.ROPE _ NIL, retrieveRect: RefRect _ NIL, properties: PropList _ NIL] RETURNS [object: Object, externalConnections: PinList]; <> <> < use routingRect from RoutingResult.>> <> Destroy: PROC [routingArea: RoutingArea]; <> <<>> END.