DIRECTORY CD, GC, D2Orient, IPCTG, HashTable, IPTop, Rope, Route, RouteDiGraph, RTBasic, RTStructure; GCPrivate: CEDAR DEFINITIONS IMPORTS RTBasic = BEGIN nameProp: ATOM; TopologicalOrder: TYPE = RouteDiGraph.Graph; IntersectionType: TYPE = {normal, inverted}; -- indicates method to connect el or order breaking tee intersections Channel: TYPE = REF ChannelRec; ChannelRec: TYPE = RECORD [ name: Rope.ROPE _ NIL, -- the channel name connections: HashTable.Table _ NIL, -- pins and exits on channel per net width: CD.Number _ 0, -- actual channel with after routing, estimate before routing position: CD.Position _ [0, 0], -- position in coordinate system of containing object direction: RTBasic.Direction _ horizontal, -- direction of the channel lowerIntType, upperIntType: IntersectionType _ normal, ch: IPCTG.Channel _ NIL, result: Route.RoutingResult _ NIL, cdObject, chanShell, bottomOrLeftShell, topOrRightShell, bottomOrLeftExitShell, topOrRightExitShell: CD.Object _ NIL, topoOrder: RouteDiGraph.Node _ NIL ]; NetDesc: TYPE = REF NetDescRec; -- channel.connections entry NetDescRec: TYPE = RECORD [ bottomOrLeftExit, topOrRightExit: BOOLEAN _ FALSE, -- TRUE iff net has exit on indicated side pinList: LIST OF PhyPinDesc _ NIL -- physical pins on channel sides to be connected ]; PhyPinDesc: TYPE = REF PhyPinDescRec; -- physical pin descriptor PhyPinDescRec: TYPE = RECORD [ instance: RTStructure.Instance _ NIL, oPin: RTStructure.ObjectPin _ NIL, pPin: RTStructure.PhysicalPin _ NIL ]; 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: PROCEDURE[num: INT] RETURNS [orien: CD.Orientation]; LowerChannelPosition: PROCEDURE[channel: Channel] RETURNS [position: CD.Position] = INLINE {RETURN[RTBasic.PQToXY[channel.direction, LowerChannelPQ[channel]]]}; UpperChannelPosition: PROCEDURE[channel: Channel] RETURNS [position: CD.Position] = INLINE {RETURN[RTBasic.PQToXY[channel.direction, UpperChannelPQ[channel]]]}; LowerChannelPQ: PROCEDURE[channel: Channel] RETURNS [pq: RTBasic.PQPos]; UpperChannelPQ: PROCEDURE[channel: Channel] RETURNS [pq: RTBasic.PQPos]; ChannelLimits: PUBLIC PROCEDURE[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: D2Orient.Orientation_original] RETURNS [application: CD.Instance]; END. ΈGCPrivate.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. by Bryan Preas, January 15, 1987 11:46:28 am PST 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 Κχ˜šœ™Jšœ Οmœ1™˜ Jšœ%™%J˜—š Ÿœž œžœ žœ žœžœ>˜ Jšœ&™&J˜—šŸœž œžœ˜HJšœ1™1J˜—šŸœž œžœ˜HJšœ2™2J˜—š Ÿ œžœž œžœžœ˜NJšœ)™)J˜—šŸœžœ žœ ˜+Kšœ™J˜—šŸœžœžœ žœ ˜3Kšœ ™ J˜—š Ÿ œžœžœ<žœ žœžœ˜tKšœ?™?J˜—š Ÿ œžœžœžœ žœ ˜8Kšœ žœ>žœžœ ˜mKšœE™EK™—Jšžœ˜—J˜J˜J˜—…— δ“