MCPadFrameImpl.mesa
Copyright © 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
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;
-- Specify the types of the items composing the pad frame descriptor
padDescr ← PWDescr.RopesToDescr[padNames];
PWDescr.SetTypePad[padDescr, "empty0",     PGA144.Segment[3,3], $Empty];
PWDescr.SetTypePad[padDescr, "MExt",     PGA144.Segment[6,4], $IOTst];
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, "VSelArrayxAB",  PGA144.Single[56],  $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, "empty7", PGA144.Segment[92, 4],     $Empty];
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];
-- This generates a standard pad frame; Pradeep will use the same one, so that we can share probe cards
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 ROPELIST[
"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",
"VSelArrayxAB",
"accessMatchingCAMxAB",
"accessAddressedCAMxAB",
"ldMatchxBA",
"killAllLinesxAB",
"wtMatchingVPVxAB",
"wtAddressedVPVxAB",
"PQSelArrayVPandAIDxAB",
"ldAIDandVPxAB",
"prechCBxBA",
"drCBforWritexAB",
"drCBforMatchxBA",
"prechMatchxAB",
"accessMatchingRamxAB",
"connectAccessLinesxAB",
"empty7",
"ldRPandFlagsxAB",
"drRBLinesxAB",
"PQSelArrayRPandFlagsxAB",
"ArrayAdrsxAB",
"CyclexAB"
];
END.