DIRECTORY Commander USING [CommandProc, Register], Convert USING [RopeFromCard], Rope USING [Cat, Equal, Fetch, FromChar, Length, ROPE], FS USING [StreamOpen], IO USING [card, Close, EndOf, EndOfStream, GetInt, GetLineRope, GetTokenRope, int, PutF, RIS, rope, STREAM]; Pga207: CEDAR PROGRAM IMPORTS IO, Commander, Convert, Rope, FS = BEGIN ROPE: TYPE = Rope.ROPE; Pin: TYPE = RECORD [ pinName: ROPE, pinLocation: ROPE, pinSite: NAT, pinType: ROPE, pinSwap: NAT ]; PGAPinsRep: TYPE = ARRAY[1..pGASideSize] OF ARRAY[1..pGASideSize] OF Pin; PGAPins: TYPE = REF PGAPinsRep; pGASideSize: CARD ~ 17; pGARows: CARD ~ 4; pin1Pad: CARD ~ 28; standardPad: CARD ~ 29; powerPad: CARD ~ 30; cornerPad: CARD ~ 31; diameter: CARD ~ 19; -- Max diameter of the lead in mills BadFile: SIGNAL []; XYFromRope: PROC [location: ROPE] RETURNS [x, y: CARD] ~ { c: CHAR; SELECT Rope.Length[location] FROM -- verify the correct length = 2 => { y _ Rope.Fetch[location, 1] - '0; }; = 3 => { y _ (Rope.Fetch[location, 1] - '0) * 10 + Rope.Fetch[location, 2] - '0; }; ENDCASE => ERROR; c _ Rope.Fetch[location, 0]; -- Takes first character SELECT c FROM -- SOME LETTERS ARE MISSING IN THE NUMBERING IN ['A..'H] => x _ c - 'A + 1 - 0; IN ['J..'N] => x _ c - 'A + 1 - 1; = 'P => x _ c - 'A + 1 - 2; = 'R => x _ c - 'A + 1 - 3; IN ['T..'U] => x _ c - 'A + 1 - 4; ENDCASE => ERROR; }; Location: PROC [x, y: CARD] RETURNS [location: ROPE] ~ { c: CHAR; SELECT x FROM -- SOME LETTERS ARE MISSING IN THE NUMBERING IN [1..8] => c _ x - 1 + 'A + 0; IN [9..13] => c _ x - 1 + 'A + 1; = 14 => c _ x - 1 + 'A + 2; = 15 => c _ x - 1 + 'A + 3; IN [16..17] => c _ x - 1 + 'A + 4; ENDCASE => ERROR; location _ Rope.Cat[Rope.FromChar[c], Convert.RopeFromCard[y]]; }; InsertPin: PROC [x: CARD, y: CARD, pga: PGAPins, out: IO.STREAM] ~ { type, pad: INT; SELECT TRUE FROM Rope.Equal [pga[x][y].pinType, "U", FALSE] => { type _ 0; pad _ standardPad; }; Rope.Equal [pga[x][y].pinType, "I", FALSE] => { type _ 1; pad _ standardPad; }; Rope.Equal [pga[x][y].pinType, "O", FALSE] => { type _ 2; pad _ standardPad; }; Rope.Equal [pga[x][y].pinType, "D", FALSE] => { type _ 3; pad _ standardPad; }; Rope.Equal [pga[x][y].pinType, "P", FALSE] => { type _ 4; pad _ powerPad; }; Rope.Equal [pga[x][y].pinType, "G", FALSE] => { type _ 5; pad _ powerPad; }; ENDCASE => ERROR; IF x = 1 AND y = 1 THEN pad _ pin1Pad; IF x = pGASideSize AND y = 1 THEN pad _ cornerPad; IF x = pGASideSize AND y = pGASideSize THEN pad _ cornerPad; IF x = 1 AND y = pGASideSize THEN pad _ cornerPad; IO.PutF[out, "%g %g ", IO.int[100*(x-1)], IO.int[100*(y-1)]]; IO.PutF[out, "%g %g ", IO.rope[pga[x][y].pinName], IO.int[pga[x][y].pinSwap]]; IO.PutF[out, "%g %g ", IO.int[diameter], IO.int[pga[x][y].pinSite]]; IO.PutF[out, "%g %g\n", IO.int[type], IO.int[pad]]; }; Pga207Proc: Commander.CommandProc = BEGIN GetLine: PROC [] ~ { firstToken, secondToken: ROPE; firstToken _ IO.GetTokenRope[in ! IO.EndOfStream => CONTINUE].token; secondToken _ IO.GetTokenRope[in ! IO.EndOfStream => CONTINUE].token; IF firstToken = NIL OR secondToken = NIL THEN { IO.PutF[cmd.out, "File %g is too short: line %g is missing or incomplete.\n", IO.rope[Rope.Cat[fileName,".tioga"]], IO.card[i+1]]; SIGNAL BadFile[]; }; [x, y] _ XYFromRope[secondToken]; IF x < 1 OR pGASideSize < x OR y < 1 OR pGASideSize < y THEN { IO.PutF[cmd.out, "Line %g: %g not a valid pin location.\n", IO.card[i], IO.rope[secondToken]]; SIGNAL BadFile[]; }; IF NOT Rope.Equal[pGAPins[x][y].pinName, "NC"] THEN ERROR; pGAPins[x][y].pinName _ firstToken; pGAPins[x][y].pinLocation _ secondToken; IF Rope.Equal[firstToken, "VCC", FALSE] OR Rope.Equal[firstToken, "VCCO", FALSE] OR Rope.Equal[firstToken, "VCCI", FALSE] OR Rope.Equal[firstToken, "VCCT", FALSE] THEN { pGAPins[x][y].pinSite _ 0; -- Site 0 = site 256 pGAPins[x][y].pinType _ "P"; -- Power pGAPins[x][y].pinSwap _ 1; } ELSE IF Rope.Equal[firstToken, "GND", FALSE] OR Rope.Equal[firstToken, "VSSO", FALSE] OR Rope.Equal[firstToken, "VSSI", FALSE] OR Rope.Equal[firstToken, "VSST", FALSE] THEN { pGAPins[x][y].pinSite _ 0; -- Site 0 = site 256 pGAPins[x][y].pinType _ "G"; -- Ground pGAPins[x][y].pinSwap _ 1; } ELSE { pGAPins[x][y].pinSite _ 1; pGAPins[x][y].pinType _ IO.GetTokenRope[in ! IO.EndOfStream => CONTINUE].token; pGAPins[x][y].pinSwap _ IO.GetInt[in ! IO.EndOfStream => CONTINUE]; }; [] _ IO.GetLineRope[in ! IO.EndOfStream => CONTINUE]; -- flush the end of the line }; i: NAT; x, y: CARD; in: IO.STREAM; out: IO.STREAM; fault: BOOLEAN _ FALSE; fileName: ROPE _ IO.GetTokenRope[IO.RIS[cmd.commandLine]].token; pGAPins: PGAPins _ NEW[PGAPinsRep]; FOR x IN [1..pGASideSize] DO FOR y IN [1..pGASideSize] DO pGAPins[x][y].pinName _ "NC"; pGAPins[x][y].pinLocation _ Location[x, y]; pGAPins[x][y].pinSite _ 0; -- Site 0 = site 256 pGAPins[x][y].pinType _ "U"; pGAPins[x][y].pinSwap _ 1; ENDLOOP; ENDLOOP; in _ FS.StreamOpen[Rope.Cat[fileName,".tioga"]]; i _ 1; WHILE NOT IO.EndOf[in] DO GetLine[! BadFile => { fault _ TRUE; CONTINUE; }]; i _ i + 1; ENDLOOP; IF NOT fault THEN { out _ FS.StreamOpen[Rope.Cat[fileName,".part"],$create]; IO.PutF[out, "4096 2048 -100 -100 1500 1500 700 -100 %g207 PARC-%g207 U\n", IO.rope[fileName], IO.rope[fileName]]; FOR x IN [1..pGARows] DO FOR y IN [1..pGASideSize] DO InsertPin[x, y, pGAPins, out]; ENDLOOP; ENDLOOP; FOR x IN [pGARows+1..pGASideSize-pGARows] DO FOR y IN [1..pGARows] DO InsertPin[x, y, pGAPins, out]; ENDLOOP; FOR y IN [pGASideSize-pGARows+1..pGASideSize] DO InsertPin[x, y, pGAPins, out]; ENDLOOP; ENDLOOP; FOR x IN [pGASideSize-pGARows+1..pGASideSize] DO FOR y IN [1..pGASideSize] DO InsertPin[x, y, pGAPins, out]; ENDLOOP; ENDLOOP; IO.Close[out]; IO.PutF[cmd.out, "File %g.part Written\n", IO.rope[fileName]]; }; END; Commander.Register[ key: "Pga207", proc: Pga207Proc, doc: "Transform the input file: \tFilename.tioga into: \n\t\tFilename.part (to be used by the NewPart program)."]; END. dFile: Pga207.mesa Christophe Cuenod March 24, 1989 11:13:25 am PST Enables to generate the 207 pin parts (Cypress Sparc...) for EXPERT. (generates 208 pins PGA but pad stack for pin one can be choosen nul) Requires 1 input file: Filename.tioga and generates file Filename.part (to be transformed by the NewPart program). The file Filename.tioga has one line per defined pin. The line format is: PinName PinLocation (b12... ) PinType (I, O, D, ...) and SwapNumber. (i.e. A0 K2 O 0) try to assign twice the same pin!! Filling the array with No Connect pins Reading Input file: Writing output file ส -program– "Cedar" style–i(firstHeadersAfterPage) {1} .cvx .def (firstPageNumber) {1} .cvx .def (oneSidedFormat) {.false} .cvx .def˜– "Cedar" stylešฯnœ ™Kšœ0™0šœ>ฯkœ™EKšœžœ.™E—K™šœF™FKšœ+™+—K™Kšœ–žœžœ™ K™K™—šž ˜ Kšœ žœ˜(Kšœžœ˜Kšœžœ'žœ˜7Kšžœžœ˜KšžœžœQžœžœ˜l—K˜šœžœž˜Kšžœžœžœ˜+—Kšž˜Kšžœžœžœ˜šœžœžœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜ Kšœ žœ˜Kšœ ž˜ K˜—Kš œ žœžœžœžœžœ˜IKšœ žœžœ ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœฯc$˜9K˜Icodešœžœ˜L˜š  œžœ žœžœžœ˜:Lšœžœ˜šžœžœŸ˜>˜Lšœ!˜!L˜—˜LšœG˜GL˜—Kšžœžœ˜—LšœŸ˜5šžœžœŸ.˜Lšžœ<žœ žœ˜`Lšžœ ˜L˜—šžœžœ)žœžœ˜:Lšœ"™"—Lšœ#˜#Kšœ(˜(šžœžœžœ žœžœ žœžœ žœžœ˜ฉKšœŸ˜0KšœŸ˜&Kšœ˜K˜—šžœžœžœžœ žœžœ žœžœ žœžœ˜ฎKšœŸ˜0KšœŸ ˜'Kšœ˜K˜—šžœ˜Kšœ˜Kšœžœžœžœ˜OLšœžœ žœžœ˜CL˜—LšœžœžœžœŸ˜RL˜—Kšœžœ˜Kšœžœ˜ Kšœžœžœ˜Kšœžœžœ˜Jšœžœžœ˜Kš œ žœžœžœžœ˜@Kšœžœ ˜#K™K™&K˜šžœžœž˜šžœžœž˜Kšœ˜Kšœ+˜+KšœŸ˜0Kšœ˜Kšœ˜Kšžœ˜—Kšžœ˜—K™K™K˜Kšœžœ)˜0J˜šžœžœžœ ž˜šœ˜Jšœžœ˜ Jšžœ˜ Jšœ˜—J˜ Kšžœ˜—K˜šžœžœžœ˜K™K™K™Kšœžœ0˜8K˜KšžœJžœžœ˜ršžœžœž˜šžœžœž˜Kšœ˜Kšžœ˜—Kšžœ˜—šžœžœ"ž˜,šžœžœž˜Kšœ˜Kšžœ˜—šžœžœ&ž˜0Kšœ˜Kšžœ˜—Kšžœ˜—šžœžœ&ž˜0šžœžœž˜Kšœ˜Kšžœ˜—Kšžœ˜—Kšžœ ˜Kšžœ+žœ˜@K˜—Kšžœ˜—šœ˜Kšœ”˜”—Kšžœ˜—…—"ฅ