DIRECTORY CD, CDBasics, CDCells, CDOrient, CDPinObjects, MC, MCPadFrame, Onion, PGA144, PW, PWDescr, PWPins, Rope; MCPadFrameImpl: CEDAR PROGRAM IMPORTS CD, CDBasics, CDCells, CDOrient, CDPinObjects, MC, Onion, PGA144, PW, PWDescr, PWPins, Rope EXPORTS MCPadFrame = BEGIN OPEN MCPadFrame, PW; RenamePadsProc: PWPins.RenameProc = BEGIN newRope _ SELECT TRUE FROM Rope.Match["MExt.enableWrite", oldRope] => "drMBusxBA", Rope.Match["MCmd.enableWrite", oldRope] => "drMBusxBA", Rope.Match["MData.enableWrite", oldRope] => "drMBusxBA", Rope.Match["MExt[*].dataIn", oldRope] => oldRope, Rope.Match["MExt[*].dataOut", oldRope] => oldRope, Rope.Match["MCmd[*].dataIn", oldRope] => oldRope, Rope.Match["MCmd[*].dataOut", oldRope] => oldRope, Rope.Match["MData[*].dataIn", oldRope] => oldRope, Rope.Match["MData[*].dataOut", oldRope] => oldRope, Rope.Match["*.dataIn", oldRope] => Rope.Substr[oldRope, 0, Rope.Size[oldRope]-7], Rope.Match["*.dataOut", oldRope] => Rope.Substr[oldRope, 0, Rope.Size[oldRope]-8], Rope.Match["*.enableWrite", oldRope] => "NotDebug", ENDCASE => oldRope; END; PadFrame: PUBLIC PROC [design: CD.Design] RETURNS [frame: PW.ObPtr] = BEGIN padDescr: PWDescr.Descriptor; padDescr _ PWDescr.RopesToDescr[padNames]; PWDescr.SetTypePad[padDescr, "empty0", PGA144.Segment[3,3], $Empty]; PWDescr.SetTypePad[padDescr, "MCmd", PGA144.Segment[6,4], $IOTst]; PWDescr.SetTypePad[padDescr, "MCSelected", PGA144.Single[10], $In]; PWDescr.SetTypePad[padDescr, "nMAdCycle", PGA144.Single[11], $In]; PWDescr.SetTypePad[padDescr, "Reset", PGA144.Single[12], $In]; PWDescr.SetTypePad[padDescr, "phA", PGA144.Single[13], $Clock]; PWDescr.SetTypePad[padDescr, "nphA", PGA144.Single[14], $Clock]; PWDescr.SetTypePad[padDescr, "phB", PGA144.Single[15], $Clock]; PWDescr.SetTypePad[padDescr, "nphB", PGA144.Single[16], $Clock]; PWDescr.SetTypePad[padDescr, "ldRPandFlagsxAB", PGA144.Single[17], $IOTst]; PWDescr.SetTypePad[padDescr, "drRBLinesxAB", PGA144.Single[20], $IOTst]; PWDescr.SetTypePad[padDescr, "PQSelArrayRPandFlagsxAB", PGA144.Single[21],$IOTst]; PWDescr.SetTypePad[padDescr, "empty1", PGA144.Segment[22,2], $Empty]; PWDescr.SetTypePad[padDescr, "empty2", PGA144.Segment[38,4], $Empty]; PWDescr.SetTypePad[padDescr, "NotDebug", PGA144.Single[42], $In]; PWDescr.SetTypePad[padDescr, "CtlRPVxAB", PGA144.Single[43], $IOTst]; PWDescr.SetTypePad[padDescr, "CtlVPVxAB", PGA144.Single[44], $IOTst]; PWDescr.SetTypePad[padDescr, "arrayAdrsSelPBusxBA",PGA144.Single[45], $IOTst]; PWDescr.SetTypePad[padDescr, "ResetxBA", PGA144.Single[46], $IOTst]; PWDescr.SetTypePad[padDescr, "setRefxAB", PGA144.Single[47], $IOTst]; PWDescr.SetTypePad[padDescr, "matchValidxAB", PGA144.Single[48], $IOTst]; PWDescr.SetTypePad[padDescr, "wtVictimRPVxAB", PGA144.Single[49], $IOTst]; PWDescr.SetTypePad[padDescr, "wtMatchingRPVxAB", PGA144.Single[50], $IOTst]; PWDescr.SetTypePad[padDescr, "wtAddressedRPVxAB", PGA144.Single[51], $IOTst]; PWDescr.SetTypePad[padDescr, "VInSelVBusxAB", PGA144.Single[52], $IOTst]; PWDescr.SetTypePad[padDescr, "ldAdrsInLinexAB", PGA144.Single[53], $IOTst]; PWDescr.SetTypePad[padDescr, "accessMatchingCAMxAB",PGA144.Single[56], $IOTst]; PWDescr.SetTypePad[padDescr, "accessAddressedCAMxAB",PGA144.Single[57], $IOTst]; PWDescr.SetTypePad[padDescr, "ldMatchxBA", PGA144.Single[58], $IOTst]; PWDescr.SetTypePad[padDescr, "killAllLinesxAB", PGA144.Single[59], $IOTst]; PWDescr.SetTypePad[padDescr, "wtMatchingVPVxAB", PGA144.Single[60], $IOTst]; PWDescr.SetTypePad[padDescr, "wtAddressedVPVxAB",PGA144.Single[61], $IOTst]; PWDescr.SetTypePad[padDescr, "PQSelArrayVPandAIDxAB",PGA144.Single[62], $IOTst]; PWDescr.SetTypePad[padDescr, "ldAIDandVPxAB", PGA144.Single[63], $IOTst]; PWDescr.SetTypePad[padDescr, "prechCBxBA", PGA144.Single[64], $IOTst]; PWDescr.SetTypePad[padDescr, "drCBforWritexAB", PGA144.Single[65], $IOTst]; PWDescr.SetTypePad[padDescr, "drCBforMatchxBA", PGA144.Single[66], $IOTst]; PWDescr.SetTypePad[padDescr, "CyclexAB", PGA144.Segment[67, 2], $IOTst]; PWDescr.SetTypePad[padDescr, "empty3", PGA144.Segment[69 ,4], $Empty]; PWDescr.SetTypePad[padDescr, "prechMatchxAB", PGA144.Single[87], $IOTst]; PWDescr.SetTypePad[padDescr, "accessMatchingRamxAB", PGA144.Single[88], $IOTst]; PWDescr.SetTypePad[padDescr, "connectAccessLinesxAB", PGA144.Single[89], $IOTst]; PWDescr.SetTypePad[padDescr, "empty4", PGA144.Segment[92,7],$Empty]; PWDescr.SetTypePad[padDescr, "ArrayAdrsxAB", PGA144.Segment[99, 5], $IOTst]; PWDescr.SetTypePad[padDescr, "empty7", PGA144.Segment[104,4],$Empty]; PWDescr.SetTypePad[padDescr, "empty5", PGA144.Segment[110,3],$Empty]; PWDescr.SetTypePad[padDescr, "MData", PGA144.Segment[113, 25], $IOTst]; PWDescr.SetTypePad[padDescr, "empty6", PGA144.Segment[140,5],$Empty]; frame _ PGA144.MakePadFrame[design, padDescr, padFrameInnerSize]; frame _ PGA144.MakeOuter[design, frame, RenamePadsProc]; END; RingWidth: Onion.RingWidthProc -- [netName: ROPE] RETURNS [ringWidth: D2Basic.Number] -- = { ringWidth _ IF Rope.Equal[netName, "Vdd"] THEN MC.VddRingWidth ELSE IF Rope.Equal[netName, "Gnd"] THEN MC.GndRingWidth ELSE 8; }; Shell: PUBLIC PROC [design: CD.Design, obj: CD.ObPtr] RETURNS [shell: CD.ObPtr] = { extend: INT _ 350*l; outer: CD.ObPtr _ PW.CreateEmptyCell[]; params: Onion.LayersParameters _ NEW[Onion.LayersParametersRec _ Onion.defaultLayersParameters^]; ReplicatePin: PWPins.AppEnumerator -- [app: CD.ApplicationPtr] RETURNS [quit: BOOL _ FALSE] -- = { name: ROPE _ CDPinObjects.GetName[app]; realSize: CD.Position _ CDOrient.OrientedSize[app.ob.size, app.orientation]; location: CD.Position _ CDBasics.SubPoints[app.location, CDBasics.BaseOfRect[CD.InterestRect[obj]]]; IF CDPinObjects.GetLayer[app]#params.radialLayer THEN { MC.TTYOut["*** Shell: Pin ", name, " discarded: not of radialLayer material.\n"]; RETURN; }; IF Rope.Equal[name, "Vdd"] OR Rope.Equal[name, "Gnd"] THEN RETURN; [] _ Onion.IncludePin[outer, name, CDPinObjects.GetLayer[app], realSize, SELECT PWPins.GetSide[obj, app].side FROM PWPins.bottom => [location.x, location.y-extend], PWPins.top => [location.x, location.y+extend], PWPins.left => [location.x-extend, location.y], PWPins.right => [location.x+extend, location.y], ENDCASE => ERROR]; }; MC.TTYOut["Starting Shell.\n"]; params.ringWidth _ RingWidth; params.wireExtendProc _ NIL; [] _ PWPins.EnumerateEdgePins[obj, ReplicatePin]; [] _ Onion.IncludeOb[outer, obj, [0, 0]]; [] _ Onion.IncludePin[outer, "Vdd", params.radialLayer, [150*l, 4], [-extend+200*l, -extend]]; [] _ Onion.IncludePin[outer, "Gnd", params.radialLayer, [150*l, 4], [-extend+1000*l, -extend]]; [] _ Onion.IncludePin[outer, "Vdd", params.radialLayer, [150*l, 4], [-extend+2200*l, -extend]]; [] _ Onion.IncludePin[outer, "Gnd", params.radialLayer, [150*l, 4], [-extend+3200*l, -extend]]; CDCells.SetInterestRect[outer, [-extend, -extend, PW.Size[obj].x+extend, PW.Size[obj].y+extend]]; PW.IncludeInDirectory[design, outer, "Shell"]; shell _ Onion.LRSRoute[design, obj, outer, [extend, extend], params].cell; MC.TTYOut["Shell Finished.\n"]; }; l: INT = CD.lambda; padFrameInnerSize: PUBLIC CD.Position _ [7600*l, 6000*l]; padNames: PUBLIC LIST OF ROPE _ LIST[ "MCmd", "MCSelected", -- "MExt", -- "MData", "nMAdCycle", "Reset", "phA", "nphA", "phB", "nphB", "empty0", "empty1", "empty2", "empty3", "empty4", "empty5", "empty6", "NotDebug", "CtlRPVxAB", "CtlVPVxAB", "arrayAdrsSelPBusxBA", "ResetxBA", "setRefxAB", "matchValidxAB", "wtVictimRPVxAB", "wtMatchingRPVxAB", "wtAddressedRPVxAB", "VInSelVBusxAB", "ldAdrsInLinexAB", "accessMatchingCAMxAB", "accessAddressedCAMxAB", "ldMatchxBA", "killAllLinesxAB", "wtMatchingVPVxAB", "wtAddressedVPVxAB", "PQSelArrayVPandAIDxAB", "ldAIDandVPxAB", "prechCBxBA", "drCBforWritexAB", "drCBforMatchxBA", "prechMatchxAB", "accessMatchingRamxAB", "connectAccessLinesxAB", "empty7", "ldRPandFlagsxAB", "drRBLinesxAB", "PQSelArrayRPandFlagsxAB", "ArrayAdrsxAB", "CyclexAB" ]; END. ŽMCPadFrameImpl.mesa Copyright c 1984 by Xerox Corporation. All rights reserved. Written by: Sindhu, June 7, 1985 10:48:56 pm PDT Last Edited by: Sindhu, July 11, 1985 8:06:18 am PDT Last Edited by: Serlet, July 10, 1985 2:53:13 am PDT -- Specify the types of the items composing the pad frame descriptor PWDescr.SetTypePad[padDescr, "MExt", PGA144.Segment[6,4], $IOTst]; PWDescr.SetTypePad[padDescr, "VSelArrayxAB", PGA144.Single[56], $IOTst]; PWDescr.SetTypePad[padDescr, "empty7", PGA144.Segment[92, 4], $Empty]; -- This generates a standard pad frame; Pradeep will use the same one, so that we can share probe cards "VSelArrayxAB", Κž˜codešœ™Kšœ Οmœ1™