<> <> <> <> DIRECTORY CoreCreate, PadFrame, PGA176; PGA176Impl: CEDAR PROGRAM IMPORTS PadFrame EXPORTS PGA176 = BEGIN OPEN CoreCreate, PGA176; SetPos: PUBLIC PROC [pga: PGADescr, pos: NAT] = {pga.globalPos _ pos}; NextS: PROC [pga: PGADescr] = { pos: NAT _ pga.globalPos+1; WHILE pos> AddPad: PROC [pga: PGADescr, public: WR, type: ATOM, pa1, pa2, pa3, pa4, pa5, pa6, pa7, pa8, pa9: PA _ []] ~ { pas: LIST OF PA _ NIL; IF pa9#[] THEN pas _ CONS [pa9, pas]; IF pa8#[] THEN pas _ CONS [pa8, pas]; IF pa7#[] THEN pas _ CONS [pa7, pas]; IF pa6#[] THEN pas _ CONS [pa6, pas]; IF pa5#[] THEN pas _ CONS [pa5, pas]; IF pa4#[] THEN pas _ CONS [pa4, pas]; IF pa3#[] THEN pas _ CONS [pa3, pas]; IF pa2#[] THEN pas _ CONS [pa2, pas]; IF pa1#[] THEN pas _ CONS [pa1, pas]; pga.pads _ PadFrame.AddPadList[pga.pads, public, type, pga.globalPos, pas]; }; <<-- set globalPos to the next signal pad position; put the pad on globalPos>> SPad: PUBLIC PROC [pga: PGADescr, public: WR, type: ATOM, pa1, pa2, pa3, pa4, pa5, pa6, pa7, pa8, pa9: PA _ []] ~ { NextS[pga]; AddPad[pga, public, type, pa1, pa2, pa3, pa4, pa5, pa6, pa7, pa8, pa9]; }; <<-- set globalPos to the next power pad position; put the pad on globalPos>> AddPadOnNextP: PROC [pga: PGADescr, public: WR, type: ATOM, pa1, pa2, pa3, pa4, pa5, pa6, pa7, pa8, pa9: PA _ []] ~ { NextP[pga]; AddPad[pga, public, type, pa1, pa2, pa3, pa4, pa5, pa6, pa7, pa8, pa9]; }; <<>> <<-- The following is a description of a padframe suited for a particular PGA>> pga176: PUBLIC PGADescr _ NEW[PGADescrRec _ [ left: 0, bottom: 49, right: 98, top: 147, size: 49, nbPads: 196, isPowerPad: IsPowerOnPGA176, name: "PGA176", doc: "Ibiden small PGA for EU and IFU; 36 signal and 12 power pads per side, plus corners" ]]; <<-- Corners are power pads too>> IsPowerOnPGA176: PROC [pos: NAT] RETURNS [is: BOOL] ~ { IF pos NOT IN [0..pga176.nbPads) THEN ERROR; -- not a valid pad position pos _ pos MOD pga176.size; -- reduce to one side in [0..48) RETURN[pos=0 OR pos=1 OR pos=5 OR pos=8 OR pos=14 OR pos=17 OR pos=23 OR pos=26 OR pos=32 OR pos=35 OR pos=41 OR pos=44 OR pos=48]; }; <<>> <<-- Prepares the PGA with the power pads>> MakePGA176: PUBLIC PROC RETURNS [pga: PGADescr] ~ { PutPowerPads: PROC [pga: PGADescr, corner: NAT] ~ { SetPos[pga, corner]; -- the corner pad AddPadOnNextP[pga, "PadGnd", $PadGnd]; AddPadOnNextP[pga, "PadVdd", $PadVdd]; AddPadOnNextP[pga, "Vdd", $Vdd]; AddPadOnNextP[pga, "PadGnd", $PadGnd]; AddPadOnNextP[pga, "Gnd", $Gnd]; AddPadOnNextP[pga, "PadVdd", $PadVdd]; AddPadOnNextP[pga, "Vdd", $Vdd]; AddPadOnNextP[pga, "PadGnd", $PadGnd]; AddPadOnNextP[pga, "Gnd", $Gnd]; AddPadOnNextP[pga, "PadVdd", $PadVdd]; AddPadOnNextP[pga, "Vdd", $Vdd]; AddPadOnNextP[pga, "PadGnd", $PadGnd]; }; pga _ pga176; pga.pads _ NIL; PutPowerPads[pga, pga176.left]; PutPowerPads[pga, pga176.bottom]; PutPowerPads[pga, pga176.right]; PutPowerPads[pga, pga176.top]; }; END.