DIRECTORY CD, D2Basic, PWPins, RefTab, Rope, Route; PWRoute: CEDAR DEFINITIONS = { Objects: TYPE = LIST OF CD.Object; RouteType: TYPE = {channel, switchBox}; Rect: TYPE = D2Basic.Rect; RefRect: TYPE = REF Rect; Optimization: TYPE = Route.Optimization; AbutChRouteListX: PROC [ listOb: Objects, bottomListOb: Objects _ NIL, topListOb: Objects _ NIL, params: RouterParams _ defaultRouterParams] RETURNS [obj: CD.Object]; AbutChRouteListY: PROC [ listOb: Objects, leftListOb: Objects _ NIL, rightListOb: Objects _ NIL, params: RouterParams _ defaultRouterParams] RETURNS [obj: CD.Object]; HorV: TYPE = {horizontal, vertical}; AbutSbRoute: PROC [ bottomOb, rightOb, topOb, leftOb: CD.Object _ NIL, trunkDir: HorV _ horizontal, params: RouterParams _ defaultRouterParams] RETURNS [obj: CD.Object]; RouterParams: TYPE = REF RouterParamsRec; RouterParamsRec: TYPE = RECORD [ trunkLayer: Rope.ROPE, -- "poly", "metal" or "metal2", runs length of area branchLayer: Rope.ROPE, -- branch goes across the area technologyKey: ATOM _ $cmosB, -- $cmosA or $cmosB makeTabKeyProc: MakeTabKeyProc _ NIL, -- NIL means pinName=netName wireWidthProc: WireWidthProc _ NIL, -- to control the width of a trunk wire context: REF ANY _ NIL, -- context to use as parameter for above procs opt: Optimization _ full, -- controls runtime vs quality signalIncomplete: BOOLEAN _ TRUE, -- SIGNAL if there are any incompletes signalBreakAtExit: BOOLEAN _ TRUE, -- SIGNAL if constraint loop was resolved at exit signalSinglePinNets: BOOLEAN _ TRUE, -- SIGNAL if there are any single pin nets signalCoincidentPins: BOOLEAN _ TRUE, -- SIGNAL if there any pins are coincident okToDiddleLLPins: BOOLEAN _ FALSE, -- TRUE => ok to move pins on end of switchBox okToDiddleURPins: BOOLEAN _ FALSE, -- TRUE => ok to move pins on end of switchBox viaTable: RefTab.Ref _ NIL -- hash table for testing contact definitions ]; MakeTabKeyProc: TYPE = PROC[pinInst: CD.Instance, context: REF ANY _ NIL] RETURNS [tabIndex: Rope.ROPE]; WireWidthProc: TYPE = PROC[netName: Rope.ROPE, context: REF ANY _ NIL] RETURNS [wireWidth: INT]; defaultRouterParams: RouterParams; MakeChannel: PUBLIC PROC[obj1, obj2, bottomOrLeftObj, topOrRightObj: CD.Object, retrieveRect: RefRect _ NIL, params: RouterParams _ defaultRouterParams, isX: BOOL _ TRUE, routeType: RouteType _ channel] RETURNS [channel: CD.Object]; DoRoute: PUBLIC PROC [obj1, obj2, bottomOrLeftObj, topOrRightObj: CD.Object, params: RouterParams, isX: BOOL, routeType: RouteType] RETURNS [result: Route.RoutingResult]; GetRouting: PUBLIC PROC [result: Route.RoutingResult, retrieveRect: RefRect _ NIL, params: RouterParams _ defaultRouterParams] RETURNS [channel: CD.Object]; XferPinsProc: TYPE = PROC [technologyKey: ATOM, inst: CD.Instance, routingLayer: CD.Layer, width: INT] RETURNS [cell: CD.Object]; defaultXferPins: XferPinsProc; ForEachPinProc: TYPE = PROC [inst: CD.Instance] RETURNS [obj: CD.Object]; SelectNamesProc: TYPE = PROC [name: Rope.ROPE] RETURNS [keepIt: BOOL]; KeepAll: SelectNamesProc; XferPins: PUBLIC PROC [technologyKey: ATOM, template: CD.Object, objSide: PWPins.Side, minWidth: INT, routingLayerDes: Rope.ROPE, selectNameProc: SelectNamesProc _ KeepAll, xferPinsProc: XferPinsProc _ defaultXferPins] RETURNS [cell: CD.Object]; }. 8PWRoute.mesa Copyright c 1985, 1986 by Xerox Corporation. All rights reserved. Last Edited by: February 6, 1987 2:06:53 pm PST Frank Bowers May 20, 1986 10:47:08 am PDT -- AbutChRoute: uses a channel router to connect adjacent objects; listOb contains objects that are to be interconnected by routing between each pair of objects. topListOb, bottomListOb (for AbutChRouteListX) and rightListOb, leftListOb (for AbutChRouteListY) carry pins that indicate nets to exit the channel from the ends; pin location are not significant for these objects. parms define routing layers and widths as well as how to construct hte nets from the pins. The returned object contains the objects in listOb in addition to objects that define the routing between pairs of objects; the size of the returned object is determined by area required for the routing. -- AbutSBRoute: uses a switchBox router to connect adjacent objects. bottomOb, rightOb, topOb, leftOb define the pin positions and the size of the routing area. AbutSBRoute will fail interconntection for which it does not have room to route (exception: pins too close on edge of switchbox will cause a signal; proceeding from a design rule violation signal can cause a design rule violation). The returned object is just the routing area. -- All the parameters for the channel and switchbox router Both the channel and the switchbox router will signal if design rule violations are found on the input. Proceeding from the signals will cause design rule violations in the routing!! NOTE: Setting okToDiddle??Pins TRUE allows the router to move pins on the ends of a switchBox up to one design rule spacing. Set these parameters 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 okToDiddle??Pins TRUE!!! build the equivalent classes (nets) of pins width of the wire for a given net -- Given two cells that we plan to abut ( and 0 to 2 cells other cells), this module parses the corresponding edges, extracts the pins, builds nets according to the names on the pins, then calls the router to produce a cell containing the channel routing. retrieveRect is interpreted as follows: the lower left corner of the routing area is placed at (0, 0); then the returned object is expanded to fill retrieveRect; if retrieveRect is NIL or smaller than the routing area, then no expansion takes place. The combination of DoRoute and GetRouting perform the same function as MakeChannel. These procedures allow the object size to be adjusted after routing. -- XferPins maps the pins ont ths specified side (objSide) of template to the specified layer (routingLayer) for fouting; it first determines the space required to map the pins to the specified layer (routingLayer). If any maping is required, then it does the following: an empty cell is created: one dimension is the max [specified width(minWidth), required width as determined by the pins]; the other is the same as the side of the template; then it parses the side of the template, and for every pin it constructs a mapping object; the object is rotated according to the side in use, and the right side corresponds to the original orientation. routingLayer may be "poly", "metal", or "metal2" Κ7˜codešœ ™ Kšœ Οmœ7™BK™0K™)K˜—šΟk ˜ Kšžœ žœ˜)K˜—KšΟnœžœž œž˜K˜Kšœ žœžœžœ ˜"Kšœ žœ˜'Kšœžœ˜Kšœ žœžœ˜Kšœžœ˜(K™Kšœ’™’šŸœžœ˜Kšœ˜Kšœžœ˜Kšœžœ˜Kšœ,žœžœ ˜E—šŸœžœ˜Kšœ˜Kšœžœ˜Kšœžœ˜Kšœ,žœžœ ˜E—K™Kšœ£Οbœ™ΉK™Kšœžœ˜$šŸ œžœ˜Kšœ"žœ žœ˜2K˜Kšœ,žœžœ ˜E—K™Kšœ:™:Kšœžœžœ˜)šœžœžœ˜ KšœžœΟc3˜LKšœžœ‘˜=Kšœžœ ‘˜2Kšœ!žœ‘˜BKšœžœ‘(˜LKšœ žœž œ‘.˜HKšœ‘˜:Kšœžœžœ‘&˜IKšœžœžœ‘1˜UKšœžœžœ‘*˜OKšœžœžœ‘*˜PKšœžœžœ‘.˜QKšœžœžœ‘.˜QKšœžœ‘-˜IKšœ˜K˜—Kšœ·™·K˜KšŸœ™“K™Kšœ+™+Kš œžœžœ žœžœžœžœžœžœ˜hKšœ!™!Kšœžœžœžœ žœžœžœžœ žœ˜`K˜Kšœ"˜"K˜Kšœϊ™ϊKšŸ œžœžœ-žœ!žœ3žœžœ"žœ žœ ˜θK˜Kšœ™™™š Ÿœžœžœ.žœ$žœ˜ƒKšžœ˜&K˜—Kš Ÿ œžœžœ7žœ.žœ žœ ˜œK˜KšœΈ™ΈKšœžœžœžœžœžœžœžœžœ ˜Kšœ˜KšŸœžœžœžœ˜IKš Ÿœžœžœž œžœ žœ˜FKšœ˜KšŸœžœžœžœ žœ)žœžœ[žœžœ ˜υK˜Kšžœ˜K˜K™—…— ΰO