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;
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"];
};