DIRECTORY CD, D2Basic, HashTable, Properties, Rope, RTBasic; Route: CEDAR DEFINITIONS = BEGIN RopeList: TYPE = LIST OF Rope.ROPE; Layer: TYPE = CD.Layer; Object: TYPE = CD.Object; Instance: TYPE = CD.Instance; Rect: TYPE = D2Basic.Rect; RectList: TYPE = LIST OF Rect; RefRect: TYPE = REF Rect; Position: TYPE = D2Basic.Vector; PositionList: TYPE = LIST OF Position; Number: TYPE = D2Basic.Number; SideOrNone: TYPE = RTBasic.SideOrNone; Side: TYPE = RTBasic.Side; 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.undefLayer, 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 _ [0, 0], 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]; trunkWidthKey: REF ATOM; branchWidthKey: REF ATOM; 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, signalSinglePinNets, signalCoincidentPins: BOOLEAN _ TRUE] RETURNS [routingResult: RoutingResult]; SwitchBoxRoute: PROC [routingArea: RoutingArea, sideOrgins: PositionVec, routingRect: Rect, opt: Optimization _ full, signalSinglePinNets, signalCoincidentPins: BOOLEAN _ TRUE, okToDiddleLLPins, okToDiddleURPins: BOOLEAN _ FALSE] 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, viaTable: HashTable.Table _ NIL] RETURNS [object: Object, externalConnections: PinList]; Destroy: PROC [routingArea: RoutingArea]; END. XRoute.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Last Edited by: Preas, December 18, 1986 5:04:01 pm PST Theory This interface provides the procedures necessary to define and route an interconnection area using the major algorithms: channel router, and switchbox router. The client program must first define the routing area (design rules, boundries on each side of the routing area) and include the interconnection nets to be routed. Next, one of the routing algorithms is invoked; this algorithm passes back summary routing information (required size, whether expansion is needed, list of incomplete nets if any). Finally, the routing area is made into a ChipNDale cell by invoking RetreiveRouting. Route supports both fixed coordinate routing (SwitchBox) where the pin and side locations are not modified by the algorithm and topological routing (Channel) where the routing area is expanded to the required size to hold all of the routing. Each side of the routing area (including the pins on that side) has a separate origin to allow for expandable routing areas and topological routing algorithms. The separate coordinate systems for the 1 to 4 sides are related by the sideCoords vector that specifies the plsition of the fiducial in the routing coordinate space. Each coordinate system must have the same scale; up and right are the positive directions. The routing area proper is defined by routingRect; ares may be removed from consideration by placing routing barriers in the routingRect. The following restrictions apply: 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. Channel Router restrictions: 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. SwitchBox Router restrictions: The routing area is not altered from the input specification. The SwitchBox router does the best it can in the area specified. Common Types Errors Routing Areas Create a RoutingArea. The RoutingArea definition includes the design rules (conductor and via widths and spacings) and definition of the routing area sides. Design Rules Define the routing design rules. technologyKey values must correspond to ChipNDale technologies. Routing Area Sides A RoutingBarrier describes one of the routing layers adjacent to the associated side. The barrer extends from the routing area side to the fartherest extent of the barrier rectangle. Create a routing barrier for a layer. Only barriers on the sides parallel to te trunk direction are used. Create a routing area side. Each side is typically a ChipNDale object, and hence has its own coordinate system: the barriers, pins and the sideFiducial have coordinates with respect to the side. sideFiducial is used to position the side with respect to each other (see *Route procedures); it is normally the ChipNDale cell orgin The coordinate position of the sideFiducial that is perpendicular to the Side (y for top and bottom, x for left and right) determines the edge of the routing area in the coordinate space of the side. Barriers should be used to block any area that is in the routing area but not to be used for routing. Interconnections Create a pin. Use IncludeNet to specify the pins that are to be connected. Create a net within the interconnection area. Mutiple calls for same net create independent connections. Used for "properties" keys to specify wiring widths Routing Operations Channel Route the routing area. sideOrgins defines the orgins of the side objects in the coordinate space where the routing is to take place. The sideFiducials are placed at the sideCoords respectively. Routing area sides parallel to trunk direction may be moved by ChannelRoute. Use combination of routingRect and retrieveRect (RetrieveRouting) to adjust the coordinates if necessary. NOTE: Error conditions are indicated through Errors and Signals. Proceeding from signals will cause design rule violations in the routing. Signals are raised instead of Errors so debugging will be easier! Use signalSinglePinNets and signalCoincidentPins = FALSE with caution!!! SwitchBox Route the routing area. sideOrgins defines the orgins of the side objects. The sideFiducials are placed at the sideOrgins respectively. Side positions are not changed by SwitchBoxRoute. Incompletes should be remidied by increasing the routing area size. NOTE: Error conditions are indicated through Errors and Signals. Proceeding from signals will cause design rule violations in the routing. Signals are raised instead of Errors so debugging will be easier! Use signalSinglePinNets and signalCoincidentPins = FALSE with caution!!! NOTE: Setting okToDiddlePins TRUE allows the router to move pins on the ends of a switchBox up to one design rule spacing. Set this parameter to true only if this will not cause design rule violations in the output. This means that the pins on the end of the switchbox must be "sparse" and have no interfering material close by. If you don't know what this means, do't set okToDiddlePins TRUE!!! Maze Route the routing area. sideCoords define the limits of the routing area. The sideFiducials are placed at the sideCoords respectively. Data Retrevial Create a ChipNDale object and include the routing in the object. RetreiveRouting is a separate procedure to allow routingArea size to be modified after routing is complete. The externalConnections describe the location of a pin connecting the routingArea to the external environment. Equivalent information is recorded as pins in the ChipNDale object. retreiveRect = NIL => use routingRect from RoutingResult. viaTable is a hash table for reuse of via definitions; NIL => construct a new hash table for this channel. Clean Up Remove circular references so garbage collection can work Κ˜Jšœ ™ Jšœ Οmœ1™