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
Massoud Pedram May 6, 1988 6:50:22 pm PDT
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
ChanPinType: TYPE = {min, max}; -- indicates type of ChanPin
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:    GC.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,
trackInfo: TrackInfo ← NIL,
any:      REF        ← 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,
intersectionList:   LIST OF IntersectionPinDesc ← NIL -- channel intersections on channel to be connected
]; -- 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  ← [ ]];
IntersectionPinDesc: TYPE = REF IntersectionPinDescRec; -- intersection pin descriptor
IntersectionPinDescRec: TYPE = RECORD [
channel: Channel ← NIL
];
ChanPinDesc:  TYPE = REF ChanPinDescRec;
ChanPinDescRec:  TYPE = RECORD [
net:  CoreRouteFlat.Net,
position:  INT,
type: ChanPinType];
TrackInfo: TYPE = REF TrackInfoRec;
-- information about max track density and its range(s) along channel
TrackInfoRec: TYPE = RECORD [
rangeList: RTBasic.RangeList, trackDensity: INT];
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, layoutStyle: GC.LayoutStyle] RETURNS [result: GC.Result];
DoInitialGlobalRoute: PROC [context: GC.Context, layoutStyle: GC.LayoutStyle];
DoImproveGlobalRoute: PROC [context: GC.Context, layoutStyle: GC.LayoutStyle];
ComputeTrackInfo: PROC[context: GC.Context, channel: Channel] RETURNS [maxTrackInfo: GCPrivate.TrackInfo] ;
EstimateChanWidth: PROC [context: GC.Context, channel: Channel] RETURNS[width: INT];
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
IntersectionOnList: PUBLIC PROC [netDesc: GCPrivate.NetDesc, int: GCPrivate.IntersectionPinDesc]
RETURNS [onList: BOOLEANFALSE];
onList ← TRUE iff Intersection 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.