<> <> <> <> <> DIRECTORY CD, Rope, Route, RouteDiGraph, RoutePrivate; RouteChannel: CEDAR DEFINITIONS = BEGIN maxTrack: NAT = 600; -- MUST be even!!! maxPinsOnCh: NAT = 2000; ZMaxTracks: TYPE = NAT[0 .. maxTrack]; MaxTracks: TYPE = NAT[1 .. maxTrack]; MPinsOnCh: TYPE = NAT[1 .. maxPinsOnCh]; ZMPinsOnCh: TYPE = NAT[0 .. maxPinsOnCh]; ChanSideOrNone: TYPE = {none, chanBottom, chanTop, chanLeft, chanRight}; ChanSide: TYPE = ChanSideOrNone[chanBottom .. chanRight]; ChanSideName: ARRAY ChanSide OF Rope.ROPE; ChanLRSide: TYPE = ChanSide[chanLeft .. chanRight]; ChanTBSide: TYPE = ChanSide[chanBottom .. chanTop]; AboveOrBelow: TYPE = {above, below}; AboveOrBelowName: ARRAY AboveOrBelow OF Rope.ROPE; GoingDirection: TYPE = {leftToRight, rightToLeft}; GoingName: ARRAY GoingDirection OF Rope.ROPE; RoutingChannelSides: TYPE = REF RoutingChannelSidesRec; RoutingChannelSidesRec: TYPE = RECORD [ sideOrg, sideFiducial: RoutePrivate.PQPosition _ [0, 0], routeAreaCoord: Route.Number _ 0, extSide: Route.Side, barrierList: ARRAY RoutePrivate.RoutingLayer OF RoutePrivate.PQRectList _ ALL[NIL], enclosingBarrier: RoutePrivate.PQRect _ [[0, 0], [0, 0]], properties: Route.PropList _ NIL]; RoutingChannelPins: TYPE = REF RoutingChannelPinsRec; RoutingChannelPinsRec: TYPE = RECORD [ cEnd1, cEnd2: Route.Number _ 0, count: ZMPinsOnCh _ 0, size: ZMPinsOnCh _ maxPinsOnCh, sides: ARRAY MPinsOnCh OF PinPosition _ ALL[NIL]]; ChanParms: TYPE = REF ChanParmsRec; ChanParmsRec: TYPE = RECORD [ maxToConvert, emptyTrackLimit: Route.Number]; RoutingChannelTracks: TYPE = REF RoutingChannelTracksRec; RoutingChannelTracksRec: TYPE = RECORD [ count, maxCount: ZMaxTracks _ 0, size: ZMaxTracks _ maxTrack, tracks: ARRAY MaxTracks OF Track]; Track: TYPE = REF TrackRec; TrackRec: TYPE = RECORD [ oldTrackNum, trackNum: ZMaxTracks _ 0, trackPos, maxFeatureOnTrack: Route.Number _ 0, firstSeg: Segment _ NIL, blocked: BOOLEAN _ FALSE, keep: BOOLEAN _ FALSE]; Segment: TYPE = REF SegmentRec; SegmentList: TYPE = LIST OF Segment; SegmentRec: TYPE = RECORD [ exteriorPins: ARRAY ChanLRSide OF ChanPin _ ALL[NIL], interiorPins: ChanPinList _ NIL, routingLayer: RoutePrivate.RoutingLayer _ trunk, qWidth: Route.Number _ 0, constraintNode: RouteDiGraph.Node _ NIL, trackNum, trackConstraint, secTrackConstraint: ZMaxTracks _ 0, nextSeg: Segment _ NIL, net: RoutePrivate.Net _ NIL, failed, exitBreak: BOOLEAN _ FALSE]; SegmentConstraint: TYPE = REF SegmentConstraintRec; SegmentConstraintRec: TYPE = RECORD [ name: Rope.ROPE _ NIL, segment: Segment]; PinPosition: TYPE = REF PinPositionRec; PinPositionRec: TYPE = RECORD [ pinIndex: ZMPinsOnCh, pLoc: Route.Number _ 0, blocked: BOOLEAN _ FALSE, pins: ARRAY ChanTBSide OF ChanPin _ ALL[NIL], innerPins: ChanPinList _ NIL]; ChanPinType: TYPE = {noPin, chanConnect, dogLeg, compPin, exitPin}; ChanPin: TYPE = REF ChanPinRec; ChanPinList: TYPE = LIST OF ChanPin; ChanPinRec: TYPE = RECORD [ pinSide: ChanSideOrNone, qLoc, pWidth: Route.Number _ 0, kindOfPin: ChanPinType, pinPosition: PinPosition, trackConstraint: ZMaxTracks _ 0, -- track Consdtraint of segment attached to pin conctSeg: ARRAY ChanLRSide OF Segment _ ALL[NIL], altConctSeg: ARRAY ChanLRSide OF Segment _ ALL[NIL], -- used only if non pin dog leg outside range pin: InternPin _ NIL]; ChannelData: TYPE = REF ChannelDataRec; ChannelDataRec: TYPE = RECORD [ constraints: RouteDiGraph.Graph _ NIL, chanSides: ARRAY ChanSide OF RoutingChannelSides _ ALL[NIL], chanTracks: RoutingChannelTracks _ NIL, chanPins: RoutingChannelPins _ NIL, chanParms: ChanParms _ NIL]; InternPin: TYPE = REF InternPinRec; InternPinList: TYPE = LIST OF InternPin; InternPinRec: TYPE = RECORD[ name: Rope.ROPE, chanSide: ChanSide, location: RoutePrivate.PQPosition, pWidth: Route.Number, layer: RoutePrivate.RoutingLayer, pin: Route.Pin _ NIL]; Density: TYPE = REF DensityRec; DensityRec: TYPE = RECORD [ maxDensity: Route.Number _ 0, values: ARRAY RouteChannel.MPinsOnCh OF Route.Number _ ALL[0]]; <> TrackSequence: TYPE = {start, outsideInTop, outsideInBottom, botToTop, topToBot}; DirectionSequence: TYPE = {start, leftToRight, rightToLeft, alternateLeft, alternateRight}; Method: TYPE = REF MethodRec; MethodRec: TYPE = RECORD[ trackSequence: TrackSequence _ start, directionSequence: DirectionSequence _ start]; trackSequenceName: ARRAY RouteChannel.TrackSequence OF Rope.ROPE; directionSequenceName: ARRAY RouteChannel.DirectionSequence OF Rope.ROPE; InitChannel: PROCEDURE[routingArea: Route.RoutingArea, sideOrgins: Route.PositionVec, routingRect: Route.Rect, routerUsed: RoutePrivate.RouterUsed, signalSinglePinNets, signalCoincidentPins: BOOLEAN _ TRUE, okToDiddleLLPins, okToDiddleURPins: BOOLEAN _ FALSE]; <> <<>> FindPinPos: PROC [routingArea: Route.RoutingArea, thisPLoc: Route.Number] RETURNS [index: RouteChannel.ZMPinsOnCh]; <> <> <<>> GenerateConstraints: PROCEDURE[routingArea: Route.RoutingArea, routerUsed: RoutePrivate.RouterUsed] RETURNS [anythingToDo: BOOLEAN]; <> <> <<>> TopoWiring: PROCEDURE[routingArea: Route.RoutingArea, opt: Route.Optimization] RETURNS [routingResult: Route.RoutingResult]; <> EnumTracks: PROC [routingArea: Route.RoutingArea, eachAction: EachTrackActionProc] RETURNS [quit: BOOLEAN _ FALSE]; EachTrackActionProc: TYPE = PROC[routingArea: Route.RoutingArea, track: Track, trackIndex: MaxTracks] RETURNS [quit: BOOLEAN _ FALSE]; EnumPins: PROC [routingArea: Route.RoutingArea, pinPosition: PinPosition, eachAction: EachPinActionProc] RETURNS [quit: BOOLEAN _ FALSE]; EnumPinsOnSeg: PROC [routingArea: Route.RoutingArea, seg: Segment, eachAction: EachPinActionProc] RETURNS [quit: BOOLEAN _ FALSE]; EachPinActionProc: TYPE = PROC[routingArea: Route.RoutingArea, pinPosition: PinPosition, pin: ChanPin] RETURNS [quit: BOOLEAN _ FALSE]; EnumPinPositions: PROC [routingArea: Route.RoutingArea, eachAction: EachPinPositionActionProc] RETURNS [quit: BOOLEAN _ FALSE]; EachPinPositionActionProc: TYPE = PROC[routingArea: Route.RoutingArea, pinPosition: PinPosition, pinIndex: RouteChannel.MPinsOnCh] RETURNS [quit: BOOLEAN _ FALSE]; EnumSegmentsProc: TYPE = PROCEDURE[ routingArea: Route.RoutingArea, name: Rope.ROPE, netPart: NAT, pos1, pos2: Route.Position, width: Route.Number, layer: Route.Layer]; -- Call back for wiring segments EnumPinsProc: TYPE = PROCEDURE[ routingArea: Route.RoutingArea, name: Rope.ROPE, netPart: NAT, pos: Route.Position, layer: Route.Layer, pin: Route.Pin]; -- Call back for channel pins EnumViasProc: TYPE = PROCEDURE[ routingArea: Route.RoutingArea, name: Rope.ROPE, netPart: NAT, pos, size: Route.Position, -- rectangle of size centered on pos layer1, layer2: Route.Layer]; -- Call back for tunnel ends EnumExitsProc: TYPE = PROCEDURE[ routingArea: Route.RoutingArea, name: Rope.ROPE, netPart: NAT, pos: Route.Position, layer: Route.Layer, pin: Route.Pin, constructedExit: BOOLEAN]; -- Call back for channel exits EnumIncompletesProc: TYPE = PROCEDURE[ routingArea: Route.RoutingArea, name: Rope.ROPE, netPart: NAT, pos1, pos2: Route.Position]; -- Call back for incomplete connections GetRouting: PROCEDURE[ routingArea: Route.RoutingArea, rect: Route.Rect, properties: Route.PropList, EnumSegments: EnumSegmentsProc, EnumPins: EnumPinsProc, EnumVias: EnumViasProc, EnumExits: EnumExitsProc, EnumIncompletes: EnumIncompletesProc] RETURNS [externalConnections: Route.PinList]; -- Enumerate routing results entities RetrieveSegments: EnumSegmentsProc; RetrieveVias: EnumViasProc; RetrievePins: EnumPinsProc; RetrieveExits: EnumExitsProc; RetrieveIncompletes: EnumIncompletesProc; Destroy: PROC [routingArea: Route.RoutingArea]; <> ClearChan: PROCEDURE[routingArea: Route.RoutingArea]; <> <<>> TrackLoc: PROC [routingArea: Route.RoutingArea, track: RouteChannel.ZMaxTracks] RETURNS [loc: Route.Number]; <> TrackSeg: PROC [routingArea: Route.RoutingArea, track: RouteChannel.MaxTracks] RETURNS [RouteChannel.Segment]; <> TrackSegAbs: PROC [routingArea: Route.RoutingArea, track: RouteChannel.MaxTracks] RETURNS [RouteChannel.Segment]; <> ChannelWidth: PROC [routingArea: Route.RoutingArea] RETURNS [Route.Number]; <> InfluenceTracks: PROC [routingArea: Route.RoutingArea, wireWidth: Route.Number] RETURNS [Route.Number]; <> ExtSideToIntSide: PROC [routingArea: Route.RoutingArea, extSide: Route.Side] RETURNS [intSide: RouteChannel.ChanSide]; <> <<>> IntSideToExtSide: PROC [routingArea: Route.RoutingArea, intSide: RouteChannel.ChanSide] RETURNS [extSide: Route.Side]; <> WriteConstraints: PROC [graph: RouteDiGraph.Graph]; <> GetPinsOnSeg: PROC [seg: Segment] RETURNS [pinList: ChanPinList]; <> GetSegsOnPin: PROC [pin: ChanPin] RETURNS [segList: SegmentList]; <> DestroyOldConstraints: PROC [routingArea: Route.RoutingArea]; <> ComputeDensity: PROC [routingArea: Route.RoutingArea] RETURNS [density: Density]; <> Length: PROC [seg: RouteChannel.Segment] RETURNS [Route.Number]; <> <<>> WriteResult: PROCEDURE [result: Route.RoutingResult, method: Method]; <> <<>> Overlap: PROC [r1, r2: RoutePrivate.Range] RETURNS [overlap: RoutePrivate.Range]; <> Overlaps: PUBLIC PROC [r1, r2: RoutePrivate.Range] RETURNS [BOOL] = INLINE {RETURN [(r1.l<=r2.r) AND (r2.l<=r1.r)]}; Equal: PUBLIC PROC [r1, r2: RoutePrivate.Range] RETURNS [BOOL] = INLINE {RETURN [(r1.l=r2.l) AND (r1.r=r2.r)]}; Gap: PROC [r1, r2: RoutePrivate.Range] RETURNS [gap: RoutePrivate.Range]; <> Span: PROC [r1, r2: RoutePrivate.Range] RETURNS [result: RoutePrivate.Range]; <> AddPoints: PROC [p, s: RoutePrivate.PQPosition] RETURNS [RoutePrivate.PQPosition] = <<--p displaced by d>> INLINE {RETURN [RoutePrivate.PQPosition[p: p.p+s.p, q: p.q+s.q]]}; SubPoints: PROC [pos, neg: RoutePrivate.PQPosition] RETURNS [RoutePrivate.PQPosition] = <<--pos displaced by -neg>> INLINE {RETURN [RoutePrivate.PQPosition[p: pos.p-neg.p, q: pos.q-neg.q]]}; FindConstraintLimits: PROC [routingArea: Route.RoutingArea, nextLower, nextHigher: RouteChannel.MPinsOnCh, pinAction: RouteChannel.EachPinActionProc] RETURNS [minLimit, maxLimit: RouteChannel.MPinsOnCh]; <> CheckPins: PROCEDURE[seg: RouteChannel.Segment, pin: RouteChannel.ChanPin, sideOfSeg: RouteChannel.ChanLRSide]; <> CheckSegs: PROCEDURE[seg: RouteChannel.Segment, pin: RouteChannel.ChanPin]; <> AuditPins: PROC [routingArea: Route.RoutingArea]; <> AuditSegs: PROC [routingArea: Route.RoutingArea]; <> Combine: PROCEDURE [l1, l2, l3: ChanPinList] RETURNS [l: RouteChannel.ChanPinList _ NIL]; MembRopeList: PROCEDURE [ref: Rope.ROPE, list: Route.RopeList] RETURNS [BOOL]; GetRange: PROC [pinList: ChanPinList] RETURNS [range: RoutePrivate.Range]; <> PinsOnSide: PROC [routingArea: Route.RoutingArea, seg: RouteChannel.Segment] RETURNS [left, top, right, bottom: BOOLEAN]; END.