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 =
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:
BOOLEAN ←
FALSE];
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: BOOLEAN ← FALSE];
onList ← TRUE iff phyPin is on the global routing list for net
IntersectionOnList:
PUBLIC
PROC [netDesc: GCPrivate.NetDesc, int: GCPrivate.IntersectionPinDesc]
RETURNS [onList: BOOLEAN ← FALSE];
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.