DIRECTORY CD, CDFrame, CDPinObjects, IFUPW, IO, PW, PWPins, Rope; IFUPWPad144: CEDAR PROGRAM IMPORTS CDFrame, CDPinObjects, IO, IFUPW, PW, PWPins, Rope EXPORTS IFUPW = BEGIN Pad144ToSideIndex: PUBLIC PROC[pad: INT] RETURNS[side: IFUPW.Side, index: INT] = { SELECT pad FROM IN [1..1] => RETURN[top, 0]; IN [2..36] => RETURN[left, 36-pad]; IN [37..73] => RETURN[bottom, pad-37]; IN [74..108] => RETURN[right, pad-74]; IN [109..144] => RETURN[top, 145-pad]; ENDCASE => ERROR}; Pad144FromSideIndex: PUBLIC PROC[side: IFUPW.Side, index: INT] RETURNS[pad: INT] = { RETURN[SELECT side FROM top => (144-index)MOD 144 +1, bottom => index+37, left => 36-index, right => index+74, ENDCASE => ERROR]}; Pad144: PUBLIC PROC[design: CD.Design, side: IFUPW.Side, index: INT, pad: IFUPW.Pad144Type, data1, data2, enable: Rope.ROPE _ NIL] RETURNS[frame: IFUPW.Frame] = { labelFound: BOOL _ FALSE; findLabelProc: PWPins.InstanceEnumerator ~ { IF NOT Rope.Equal[CDPinObjects.GetName[inst], "label"] THEN RETURN[FALSE]; labelFound _ TRUE; pos _ inst.location; size _ inst.ob.size; RETURN[TRUE]}; renameProc: PWPins.RenameProc ~ { IF Rope.Find[oldRope, "vdd", 0, FALSE]#-1 THEN RETURN[oldRope]; IF Rope.Find[oldRope, "gnd", 0, FALSE]#-1 THEN RETURN[oldRope]; IF Rope.Find[oldRope, "dataOut", 0, FALSE]#-1 THEN RETURN[data2]; IF Rope.Find[oldRope, "dataIn", 0, FALSE]#-1 THEN RETURN[data1]; IF Rope.Find[oldRope, "data", 0, FALSE]#-1 THEN RETURN[data1]; IF Rope.Find[oldRope, "enable", 0, FALSE]#-1 THEN RETURN[enable]; ERROR}; pos, size: CD.Position _ [0, 0]; cell, text: CD.Object; name: Rope.ROPE _ IF data1#NIL THEN data1 ELSE data2; CheckPads[]; IF name#NIL THEN { [ ] _ PWPins.EnumerateDeepPins[pads[pad], findLabelProc]; text _ IF labelFound THEN CDFrame.ScaledText[design, name, [size.x, size.y-12], IFUPW.cmosMet] ELSE NIL}; cell _ PWPins.RenamePins[design, pads[pad], renameProc]; IF text#NIL THEN [] _ PW.IncludeInCell [cell, text, [pos.x+(size.x-text.size.x)/2, pos.y+(size.y-text.size.y)/2]]; SELECT side FROM top => { }; left => cell _ PW.Rot90 [design, cell]; bottom => cell _ PW.Rot180 [design, cell]; right => cell _ PW.Rot270 [design, cell]; ENDCASE => ERROR; IF pad=ext THEN name _ CDFrame.ID["PadExt"] ELSE IF name=NIL THEN name _ IO.PutFR["Pad%g", IO.int[ Pad144FromSideIndex[side, index] ] ]; PW.RenameObject[design, cell, name]; frame _ NEW[CDFrame.FrameSeq[0]]; frame.data _ cell; frame.shell _ CDFrame.ShellFromObject[cell]}; pads: REF ARRAY IFUPW.Pad144Type OF CD.Object; padDesign: CD.Design _ NIL; RawPad: PUBLIC PROC[type: IFUPW.Pad144Type] RETURNS[CD.Object] = {CheckPads[]; RETURN[pads[type]]}; CheckPads: PROC = { IF padDesign#NIL THEN RETURN; pads _ NEW[ARRAY IFUPW.Pad144Type OF CD.Object]; padDesign _ PW.OpenDesign["CmosPadLibraryPGA144x.dale"]; pads[ext] _ PW.Get[padDesign, "Extension"]; -- 8 lambda extension pads[empty] _ PW.Get[padDesign, "EmptyPad"]; -- PadVdd PadGnd Vdd Gnd pads[in] _ PW.Get[padDesign, "InputPad"]; -- data pads[out] _ PW.Get[padDesign, "OutputPad"]; -- dataOut enWt pads[tri] _ PW.Get[padDesign, "IOTristatePad"]; -- dataIn dataOut enWt pads[clock] _ PW.Get[padDesign, "ClockPad"]; -- data pads[padgnd] _ PW.Get[padDesign, "PadGndPad"]; -- Gnd pads[padvdd] _ PW.Get[padDesign, "PadVddPad"]; -- Vdd pads[gndcnr] _ PW.Get[padDesign, "GndCornerPad"]; pads[vddcnr] _ PW.Get[padDesign, "VddCornerPad"]; pads[gnd] _ PW.Get[padDesign, "GndPad"]; pads[vdd] _ PW.Get[padDesign, "VddPad"] }; END. ŒIFUPWPad144.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Last Edited by Curry, January 28, 1986 3:47:59 pm PST ʘšœ™Jšœ<™