GCPrivate.mesa
Copyright © 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
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};
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:   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];
Determine order in which to route channels.
EnumerateChannelsInTopologicalOrder: PROC
[context: GC.Context, eachChannel: EachChannelAction] RETURNS [quit: BOOLEAN];
Enumerate routing channels in route order.
EachChannelAction: TYPE = PROC[context: GC.Context, channel: Channel] RETURNS [quit: BOOLEANFALSE];
AssignCoordinates: PROC [context: GC.Context];
Assign locations to all channels and components.
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]]]};
find lower left position of a channel
UpperChannelPosition: PROC[channel: Channel] RETURNS [position: CD.Position] = INLINE {RETURN[RTBasic.PQToXY[channel.direction, UpperChannelPQ[channel]]]};
find upper right position of a channel
LowerChannelPQ: PROC[channel: Channel] RETURNS [pq: RTBasic.PQPos];
find lower left position of a channel in PQ space
UpperChannelPQ: PROC[channel: Channel] RETURNS [pq: RTBasic.PQPos];
find upper right position of a channel in PQ space
ChannelLimits: PUBLIC PROC[channel: Channel] RETURNS [lower, upper: INT];
find limits of width of a Phoenix channel
CreateChannels: PROC [context: GC.Context];
create channels for the context
DestroyChannels: PUBLIC PROC [context: GC.Context];
destroy channels for the context
PinOnList: PUBLIC PROC [netDesc: GCPrivate.NetDesc, phyPin: GCPrivate.PhyPinDesc]
RETURNS [onList: BOOLEANFALSE];
onList ← TRUE iff phyPin is on the global routing list for net
IncludeOb: PUBLIC PROC[
cell:   CD.Object,
ob:   CD.Object,
position:  CD.Position    ← [0, 0],
orientation: CD.Orientation ← original]
RETURNS[application: CD.Instance];
include an object in a cell; position refers to base of interest rect
END.