DIRECTORY CD, DABasics, RTBasic, SC, SCPrivate; SCNewRoutePinsUtil: CEDAR DEFINITIONS = { ConnectionType: TYPE = {left, interior, right, unconnected}; PinClass: TYPE = {isPin, isExit}; PinList: TYPE = LIST OF PinInChan; PinInChan: TYPE = REF PinInChanRec; PinInChanRec: TYPE = RECORD[ layer: SC.Layer, net: SCPrivate.Net _ NIL, chanNet: ChanNetDat _ NIL, min, max, depth: SC.Number, pinClass: PinClass _ isPin, chanSide: RTBasic.Side _ bottom, nextPinInChan, prevPinInChan: PinInChan _ NIL, pinConn: ConnectionType _ unconnected, nextPinInNet, prevPinInNet: PinInChan _ NIL, localDensity: INT _ 0 , alwaysUse: BOOLEAN _ FALSE, chanNum: NAT _ 0, component: NAT _ 0, -- for union-find operation adjList: REF ANY _ NIL, dfsLabel: NAT _ 0]; NetDat: TYPE = REF NetDatRec; NetDatRec: TYPE = ARRAY SCPrivate.MaxChanSr OF ChanNetDat _ ALL[NIL]; ChanNetDat: TYPE = REF ChanNetDatRec; ChanNetDatRec: TYPE = RECORD[ net: SCPrivate.Net, firstPin, lastPin: PinInChan _ NIL, -- for all the pins in the net leftmost, rightmost: PinInChan _NIL, -- for net segmet exits: ARRAY SCPrivate.LRSide OF PinInChan _ ALL[NIL], pinCount: INT _ 0]; ChanNetList: TYPE = LIST OF ChanNetDat; ChanDat: TYPE = REF ChanDatRec; ChanDatRec: TYPE = RECORD [ head, tail: PinInChan]; InitGetChanPins: PROCEDURE [handle: SC.Handle, rowChan: SCPrivate.RowChan]; TermGetChanPins: PROCEDURE [handle: SC.Handle, rowChan: SCPrivate.RowChan]; EnterPin: PROCEDURE[rowChan: SCPrivate.RowChan, min, max, depth: SC.Number, layer: SC.Layer, net: SCPrivate.Net, side: SCPrivate.TBSide, alwaysUse: BOOLEAN] RETURNS[pinInChan: SCNewRoutePinsUtil.PinInChan]; EnterExit: PROCEDURE[rowChan: SCPrivate.RowChan, pos: SC.Number, layer: SC.Layer, net: SCPrivate.Net, side: SCPrivate.LRSide] RETURNS[pinInChan: SCNewRoutePinsUtil.PinInChan]; CreateNetDat: PROCEDURE [handle: SC.Handle, rowChan: SCPrivate.RowChan]; EnterANetSegInChan: PROCEDURE[handle: SC.Handle, rowChan: SCPrivate.RowChan, net: SCPrivate.Net, segProc: SegProc, pinProc: PinProc, exitProc: ExitProc]; PinProc: TYPE = PROC [min, max, depth: SC.Number, side: SC.Side, layer: SC.Layer, net: SCPrivate.Net]; ExitProc: TYPE = PROC [side: SCPrivate.LRSide, layer: SC.Layer, net: SCPrivate.Net]; SegProc: TYPE = PROC [segNum: SC.Number, net: SCPrivate.Net]; EnterAllNetSegInChan: PROCEDURE[handle: SC.Handle, rowChan: SCPrivate.RowChan, segProc: SegProc, pinProc: PinProc, exitProc: ExitProc]; MoveAPinInChan: PROCEDURE[rowChan: SCPrivate.RowChan, pin: PinInChan, deltaX: SC.Number] RETURNS [scan: BOOLEAN]; EnumPinsInNetChan: PROCEDURE[chanNetDat: ChanNetDat, side: DABasics.Side, doEachNetPin: EachNetPinProc]; EnumAllPinsInNetChan: PROCEDURE[chanNetDat: ChanNetDat, doEachNetPin: EachNetPinProc]; EachNetPinProc: TYPE = PROC[chanNetDat: ChanNetDat, pin: PinInChan]; EnumPinsInChan: PROCEDURE[rowChan: SCPrivate.RowChan, doEachPin: EachPinProc]; EachPinProc: TYPE = PROC[rowChan: SCPrivate.RowChan, pin: PinInChan]; }. ΘSCNewRoutePinsUtil.mesa Copyright Σ 1986, 1987 by Xerox Corporation. All rights reserved. Bryan Preas, August 4, 1987 12:14:52 pm PDT Cong, August 22, 1987 10:55:15 am PDT Logically, we treat exits as pins. So 'firstPin' may point to an exit. initialize for determining the width of a channel terminate determining the width of a channel enter a net on a channel into data structure enter exit data for a channel into routing data base Sort pins in the channel and link them by nets, and create corresponding net data records. Minmium route channels need special processing to include the minimun number of wire segments of minimum length enter a net segment into netDat, and enter pin connection info thru callback procs. call back with segProc at the end (right) of each segment. enter all net segments in the channel. move a pin by specified distance. enumerate pins in channel on net enumerate all pins in channel on net enumerate all pins in channel Κά˜codešœ™KšœB™BKšœ(Οk™+Kšœ"™%—K˜š ˜ Kšœœ ˜%K˜—šΟnœœ œ˜)K˜Kšœœ(˜