<> <> <> <> <> <> <<>> DIRECTORY CD, DABasics, DesignRules, Rope; Route: CEDAR DEFINITIONS = BEGIN <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> Pin: TYPE = REF PinRec; PinList: TYPE = LIST OF Pin; PinRec: TYPE = RECORD[ min, max, depth: CD.Number _ 0, layer: CD.Layer, side: DABasics.Side]; Result: TYPE = REF ResultRec; ResultRec: TYPE = RECORD [ object: CD.Object, polyLength, metalLength, metal2Length: DABasics.Number _ 0, polyToMetal, metalToMetal2, numTrunkTracks, numIncompletes: NAT _ 0, incompleteNets: LIST OF Label _ NIL]; Optimization: TYPE = {full, noIncompletes}; Label: TYPE = Rope.ROPE; <> Error: ERROR [errorType: ErrorType _ callingError, explanation: Rope.ROPE _ NIL]; Signal: SIGNAL [errorType: ErrorType _ callingError, explanation: Rope.ROPE _ NIL]; ErrorType: TYPE = {programmingError, callingError, noResource, other}; <> DesignRulesParameters: TYPE = REF DesignRulesParametersRec; DesignRulesParametersRec: TYPE = RECORD [ horizLayer, vertLayer: CD.Layer, -- ChipNDale layers for the indicatde direction trunkDirection: DABasics.Direction, -- direction of the trunk layer trunkToTrunk, pinSpacing, trunkToEdge: NAT, technology: CD.Technology -- ChipNDale technology ]; <> DefaultDesignRulesParameters: PROC [technologyHint: REF, horizLayer, vertLayer: CD.Layer, trunkDirection: DABasics.Direction] RETURNS [designRules: DesignRulesParameters]; <> <> <> <> <> <> <> <> <> <> <> <<>> Channel: PROC [enumerateNets: EnumerateChannelNetsProc, min, max: CD.Number, rulesParameters: DesignRulesParameters, name: Rope.ROPE _ NIL, brokenNets: BrokenNetProc _ NIL, enumerateObstructions: EnumerateChannelBarriersProc _ NIL, channelData: REF _ NIL, optimization: Optimization _ full, signalSinglePinNets, signalCoincidentPins: BOOL _ TRUE] RETURNS [result: Result]; <> <> <<>> <> BrokenNetProc: TYPE = PROC [channelData, netData: REF, sourceNet: Label, regionNumber, numberOfRegions: NAT] RETURNS [newLabel: Label]; <> EnumerateChannelNetsProc: TYPE = PROC [channelData: REF, eachNet: EachChannelNetProc]; EachChannelNetProc: TYPE = PROC [name: Label, enumeratePins: EnumerateChannelPinsProc, exitLeftOrBottom, exitRightOrTop: BOOL _ FALSE, mayExit: BOOL _ TRUE, trunkSize: CD.Number _ 0, channelData, netData: REF _ NIL]; <> EnumerateChannelPinsProc: TYPE = PROC [channelData, netData: REF, eachPin: EachChannelPinProc]; EachChannelPinProc: TYPE = PROC [bottomOrLeftSide: BOOL, min, max, depth: CD.Number _ 0, layer: CD.Layer]; <> <<>> EnumerateChannelBarriersProc: TYPE = PROC [channelData: REF, eachObstruction: EachChannelBarrierProc]; EachChannelBarrierProc: TYPE = PROC [side: DABasics.Side, min, max, depth: CD.Number, layer: CD.Layer]; <> <> SwitchBox: PROC [enumerateNets: EnumerateSwitchBoxNetsProc, routingRect: DABasics.Rect, rulesParameters: DesignRulesParameters, name: Rope.ROPE _ NIL, enumerateObstructions: EnumerateSwitchBoxBarriersProc _ NIL, switchBoxData: REF, optimization: Optimization _ full, signalSinglePinNets, signalCoincidentPins: BOOL _ TRUE, okToDiddleLLPins, okToDiddleURPins: BOOL _ FALSE] RETURNS [result: Result]; <> <> <<>> <> <<>> <> <<>> EnumerateSwitchBoxNetsProc: TYPE = PROC [switchBoxData: REF, eachNet: EachSwitchBoxNetProc]; EachSwitchBoxNetProc: TYPE = PROC [name: Label, enumeratePins: EnumerateSwitchBoxPinsProc, trunkSize: CD.Number _ 0, switchBoxData: REF, netData: REF]; <> EnumerateSwitchBoxPinsProc: TYPE = PROC [switchBoxData, netData: REF, eachPin: EachSwitchBoxPinProc]; EachSwitchBoxPinProc: TYPE = PROC [side: DABasics.Side, min, max, depth: CD.Number _ 0, layer: CD.Layer]; <> < mimimum trunk width) are used if the pin is on the "end" of the channel.>> <> <<>> EnumerateSwitchBoxBarriersProc: TYPE = PROC [switchBoxData: REF, eachObstruction: EachSwitchBoxBarrierProc]; EachSwitchBoxBarrierProc: TYPE = PROC [side: DABasics.Side, rect: CD.Rect, layer: CD.Layer]; <> <> IntermediateResult: TYPE = REF IntermediateResultRec; IntermediateResultRec: TYPE = RECORD [ routingArea: REF ANY _ NIL, resultData: ResultData ]; ResultData: TYPE = REF ResultDataRec; ResultDataRec: TYPE = RECORD [ polyLength, metalLength, metal2Length: CD.Number _ 0, polyToMetal, metalToMetal2, numTrunkTracks, numIncompletes: NAT _ 0, routingRect: DABasics.Rect _ [0, 0, 0, 0], moreAreaRequired: BOOL _ FALSE, incompleteNets: LIST OF Rope.ROPE _ NIL ]; ChannelRoute: PROC [enumerateNets: EnumerateChannelNetsProc, min, max: CD.Number, rulesParameters: DesignRulesParameters, rules: DesignRules, name: Rope.ROPE _ NIL, enumerateObstructions: EnumerateChannelBarriersProc _ NIL, channelData: REF _ NIL, optimization: Optimization _ full, signalSinglePinNets, signalCoincidentPins: BOOL _ TRUE] RETURNS [intermediateResult: IntermediateResult]; <> <> ChannelRetrieve: PROC [intermediateResult: IntermediateResult, enumerateNets: Route.EnumerateChannelNetsProc, brokenNets: BrokenNetProc _ NIL, channelData: REF_ NIL, retrieveRect: REF DABasics.Rect _ NIL] RETURNS [result: Result]; <> <> SwitchBoxRoute: PUBLIC PROC [enumerateNets: EnumerateSwitchBoxNetsProc, routingRect: DABasics.Rect, rulesParameters: DesignRulesParameters, rules: DesignRules, name: Rope.ROPE, enumerateObstructions: EnumerateSwitchBoxBarriersProc, switchBoxData: REF, optimization: Route.Optimization, signalSinglePinNets, signalCoincidentPins: BOOL, okToDiddleLLPins, okToDiddleURPins: BOOL] RETURNS [intermediateResult: IntermediateResult]; <> <> SwitchBoxRetrieve: PUBLIC PROC [intermediateResult: IntermediateResult] RETURNS [result: Route.Result]; <> <> DesignRules: TYPE = REF DesignRulesRec; DesignRulesRec: TYPE = RECORD[ trunkLayer, branchLayer: CD.Layer, trunkDirection, branchDirection: DABasics.Direction, trunkWidth, trunkSpacing, trunkToContact, trunkToTrunk, trunkOffset, branchWidth, branchSpacing, branchToContact, branchToBranch, branchOffset, contactSize, contactToContact, pinSpacing, trunkToEdge: NAT _ 0]; DefaultDesignRules: PROC [designRuleParameters: DesignRulesParameters] RETURNS [designRules: DesignRules]; <> END.