<> <> <> <> DIRECTORY CD, CDSymbolicObjects, Connections, RefTab, RefTabExtras, PWPins, Rope, RTBasic; ConnectionsImpl: CEDAR PROGRAM IMPORTS CDSymbolicObjects, RefTab, RefTabExtras, PWPins EXPORTS Connections = BEGIN OPEN Connections; <> CreateForRopes: PUBLIC PROC [mod: NAT _ 17] RETURNS [Table] ~ { RETURN[RefTab.Create[mod, RefTabExtras.EqualRope, RefTabExtras.HashRope]]}; <> Fetch: PUBLIC PROC [table: Table, key: Key] RETURNS [found: BOOL, net: Net] ~ { <> <> <> value: REF; [found, value] _ RefTab.Fetch[table, key]; net _ NARROW[value]}; Store: PUBLIC PROC [table: Table, key: Key, net: Net] RETURNS [BOOL] ~ { <> <> RETURN[RefTab.Store[table, key, net]]}; InsertPins: PUBLIC PROC [table: Table, object: CD.Object, pinFilter: PinFilterProc, makeHashKey: HashKeyProc] ~ { <> EachPin: CDSymbolicObjects.InstEnumerator = { <<[inst: CD.Instance] RETURNS [quit: BOOL _ FALSE]>> usePin: BOOL _ IF pinFilter = NIL THEN TRUE ELSE pinFilter[inst, object]; IF usePin THEN InsertSegments[table, object, inst, makeHashKey]}; IF object # NIL THEN [] _ PWPins.EnumerateEdgePins[object, EachPin]; }; <> EnumerateNets: PUBLIC PROC [table: Table, action: EachNetAction] RETURNS [BOOL] ~ { <> <> <> <> eachPair: RefTab.EachPairAction ~ {quit _ action[key, NARROW [val]]}; RETURN [RefTab.Pairs[table, eachPair]]}; EnumerateSegments: PUBLIC PROC [net: Net, action: EachSegmentAction] RETURNS [quit: BOOL _ FALSE] ~ { <> <> <> <> FOR l: Segments _ net.segments, l.rest WHILE ~quit AND l # NIL DO segment: Segment _ l.first; quit _ action[net, segment]; ENDLOOP}; <> <> InsertSegments: PROC [table: Table, object: CD.Object, instance: CD.Instance, makeHashKey: HashKeyProc] ~ { found: BOOL; val: REF; net: Net; side: RTBasic.Side _ FromSideToSide[PWPins.GetSide[object, instance].side]; rect: CD.Rect _ CDSymbolicObjects.Denotes[instance]; name: Rope.ROPE _ CDSymbolicObjects.GetName[instance]; segment: Segment _ NEW[SegmentRec _ [name: name, object: object, range: CoordsAlongSide[instance, side, object], side: side, layer: CDSymbolicObjects.GetLayer[instance], segmentDat: NIL]]; tabIndex: Rope.ROPE _ IF makeHashKey=NIL THEN name ELSE makeHashKey[instance]; [found, val] _ Fetch[table, tabIndex]; net _ IF ~found THEN NEW[NetRec _ [name: name]] ELSE NARROW[val]; net.segments _ CONS[segment, net.segments]; [] _ Store[table, tabIndex, net]}; CoordsAlongSide: PROC [instance: CD.Instance, side: RTBasic.Side, object: CD.Object] RETURNS [range: Range] ~ { rect: CD.Rect _ CDSymbolicObjects.Denotes[instance]; SELECT side FROM top, bottom => range _ [rect.x1 - object.bbox.x1, rect.x2 - object.bbox.x1]; left, right => range _ [rect.y1 - object.bbox.y1, rect.y2 - object.bbox.y1]; ENDCASE}; FromSideToSide: PROC [side: PWPins.Side] RETURNS [routeSide: RTBasic.Side] = { routeSide _ SELECT side FROM left => left, right => right, top => top, bottom => bottom, ENDCASE => ERROR; }; END.