DIRECTORY CD, GC, IPCTG, RefTab, IPTop, Rope, Route, RouteDiGraph, RTBasic, CoreRouteFlat; GCPrivate: CEDAR DEFINITIONS IMPORTS RTBasic = BEGIN nameProp: ATOM; TopologicalOrder: TYPE = RouteDiGraph.Graph; IntersectionType: TYPE = {normal, inverted}; Channel: TYPE = REF ChannelRec; ChannelRec: TYPE = RECORD [ name: Rope.ROPE _ NIL, -- the channel name connections: RefTab.Ref _ NIL, -- pins and exits on channel per net width: CD.Number _ 0, -- estimate before routing, final val after position: CD.Position _ [0, 0], -- coord sys of containing obj direction: RTBasic.Direction _ horizontal, -- direction of the channel lowerIntType: IntersectionType _ normal, upperIntType: IntersectionType _ normal, ch: IPCTG.Channel _ NIL, intermediateResult: Route.IntermediateResult _ NIL, cdObject: CD.Object _ NIL, bottomOrLeftShell: CD.Object _ NIL, topOrRightShell: CD.Object _ NIL, topoOrder: RouteDiGraph.Node _ NIL]; NetDesc: TYPE = REF NetDescRec; -- channel.connections entry NetDescRec: TYPE = RECORD [ bottomOrLeftExit: BOOLEAN _ FALSE, -- TRUE iff net has exit on indicated side topOrRightExit: BOOLEAN _ FALSE, -- TRUE iff net has exit on indicated side pinList: LIST OF PhyPinDesc _ NIL]; -- phy pins on chan sides to be conntd PhyPinDesc: TYPE = REF PhyPinDescRec; -- physical pin descriptor PhyPinDescRec: TYPE = RECORD [ instance: CoreRouteFlat.Instance _ NIL, oPin: CoreRouteFlat.ONode _ NIL, pPin: CoreRouteFlat.Pin _ [ ]]; FindTopologicalOrder: PROC [topology: IPTop.Ref] RETURNS [topologicalOrder: TopologicalOrder]; EnumerateChannelsInTopologicalOrder: PROC [context: GC.Context, eachChannel: EachChannelAction] RETURNS [quit: BOOLEAN]; EachChannelAction: TYPE = PROC[context: GC.Context, channel: Channel] RETURNS [quit: BOOLEAN _ FALSE]; AssignCoordinates: PROC [context: GC.Context]; DoDetailRoute: PROC [context: GC.Context] RETURNS [result: GC.Result]; DoInitialGlobalRoute: PROC [context: GC.Context]; CDOrien: PROC[num: INT] RETURNS [orien: CD.Orientation]; LowerChannelPosition: PROC[channel: Channel] RETURNS [position: CD.Position] = INLINE {RETURN[RTBasic.PQToXY[channel.direction, LowerChannelPQ[channel]]]}; UpperChannelPosition: PROC[channel: Channel] RETURNS [position: CD.Position] = INLINE {RETURN[RTBasic.PQToXY[channel.direction, UpperChannelPQ[channel]]]}; LowerChannelPQ: PROC[channel: Channel] RETURNS [pq: RTBasic.PQPos]; UpperChannelPQ: PROC[channel: Channel] RETURNS [pq: RTBasic.PQPos]; ChannelLimits: PUBLIC PROC[channel: Channel] RETURNS [lower, upper: INT]; CreateChannels: PROC [context: GC.Context]; DestroyChannels: PUBLIC PROC [context: GC.Context]; PinOnList: PUBLIC PROC [netDesc: GCPrivate.NetDesc, phyPin: GCPrivate.PhyPinDesc] RETURNS [onList: BOOLEAN _ FALSE]; IncludeOb: PUBLIC PROC[ cell: CD.Object, ob: CD.Object, position: CD.Position _ [0, 0], orientation: CD.Orientation _ original] RETURNS[application: CD.Instance]; END. $GCPrivate.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Bryan Preas, January 15, 1987 11:46:28 am PST Don Curry December 7, 1987 11:29:50 am PST indicates method to connect el or order breaking tee intersections Determine order in which to route channels. Enumerate routing channels in route order. Assign locations to all channels and components. find lower left position of a channel find upper right position of a channel find lower left position of a channel in PQ space find upper right position of a channel in PQ space find limits of width of a Phoenix channel create channels for the context destroy channels for the context onList _ TRUE iff phyPin is on the global routing list for net include an object in a cell; position refers to base of interest rect Κx˜šœ™Jšœ Οmœ1™˜›Jšœ%™%J˜—š Ÿœžœžœ žœ žœžœ>˜›Jšœ&™&J˜—šŸœžœžœ˜CJšœ)žœ™1J˜—šŸœžœžœ˜CJšœ*žœ™2J˜—š Ÿ œžœžœžœžœ˜IJšœ)™)J˜—šŸœžœ žœ ˜+Jšœ™J˜—šŸœžœžœ žœ ˜3Jšœ ™ J˜—šŸ œžœžœ;˜QJšžœ žœžœ˜"Jšœ žœ2™?J˜—šŸ œžœžœ˜Jšœžœ˜Jšœžœ ˜Jšœ žœ˜#šœ žœ˜'Jšžœžœ ˜"—JšœE™EJ™—Jšžœ˜—J˜J˜J˜—…— ΐ\