IF
NOT fault
THEN {
Writing output files (too much pins for one part => split into 2 parts
out ← FS.StreamOpen[Rope.Cat[fileName,".top.part"],$create];
IO.PutF[out, "4096 2048 -100 -100 1500 1500 700 -100 %gT PARC-%gT U\n",
IO.rope[fileName], IO.rope[fileName]];
FOR y
IN [1..pGARows]
DO
FOR x
IN [1..pGASideSize]
DO
InsertPin[x, y, 0, 0, pga, out];
ENDLOOP;
ENDLOOP;
FOR y
IN [pGARows+1..pGASideSize/2]
DO
FOR x
IN [1..pGARows]
DO
InsertPin[x, y, 0, 0, pga, out];
ENDLOOP;
FOR x
IN [pGASideSize-pGARows+1..pGASideSize]
DO
InsertPin[x, y, 0, 0, pga, out];
ENDLOOP;
ENDLOOP;
IO.Close[out];
cmd.out.PutRope[Rope.Cat["File ", fileName,".top.part Written\n"]];
out ← FS.StreamOpen[Rope.Cat[fileName,".bottom.part"],$create];
IO.PutF[out, "4096 2048 -100 -100 1500 1500 700 -100 %gB PARC-%gB U\n",
IO.rope[fileName], IO.rope[fileName]];
FOR y
IN [pGASideSize/2+1..pGASideSize-pGARows]
DO
FOR x
IN [1..pGARows]
DO
InsertPin[x, y, 0, pGASideSize/2, pga, out];
ENDLOOP;
FOR x
IN [pGASideSize-pGARows+1..pGASideSize]
DO
InsertPin[x, y, 0, pGASideSize/2, pga, out];
ENDLOOP;
ENDLOOP;
FOR y
IN [pGASideSize-pGARows+1..pGASideSize]
DO
FOR x
IN [1..pGASideSize]
DO
InsertPin[x, y, 0, pGASideSize/2, pga, out];
ENDLOOP;
ENDLOOP;
IO.Close[out];
IO.PutF[cmd.out, "File %g.bottom.part Written\n", IO.rope[fileName]];
out ← FS.StreamOpen[Rope.Cat[fileName,".inner.part"],$create];
IO.PutF[out, "4096 2048 -100 -100 1500 1500 700 -100 %gI PARC-%gI U\n",
IO.rope[fileName], IO.rope[fileName]];
FOR y
IN [2..pGARows]
DO
FOR x
IN [2..pGASideSize-1]
DO
InsertPin[x, y, 1, 1, pga, out];
ENDLOOP;
ENDLOOP;
FOR y
IN [pGARows+1..pGASideSize-pGARows]
DO
FOR x
IN [2..pGARows]
DO
InsertPin[x, y, 1, 1, pga, out];
ENDLOOP;
FOR x
IN [pGASideSize-pGARows+1..pGASideSize-1]
DO
InsertPin[x, y, 1, 1, pga, out];
ENDLOOP;
ENDLOOP;
FOR y
IN [pGASideSize-pGARows+1..pGASideSize-1]
DO
FOR x
IN [2..pGASideSize-1]
DO
InsertPin[x, y, 1, 1, pga, out];
ENDLOOP;
ENDLOOP;
IO.Close[out];
IO.PutF[cmd.out, "File %g.inner.part Written\n", IO.rope[fileName]];
out ← FS.StreamOpen[Rope.Cat[fileName,".outer.part"],$create];
IO.PutF[out, "4096 2048 -100 -100 1500 1500 700 -100 %gO PARC-%gO U\n",
IO.rope[fileName], IO.rope[fileName]];
FOR x
IN [1..pGASideSize]
DO
InsertPin[x, 1, 0, 0, pga, out];
ENDLOOP;
FOR y
IN [2..pGASideSize-1]
DO
InsertPin[1, y, 0, 0, pga, out];
InsertPin[pGASideSize, y, 0, 0, pga, out];
ENDLOOP;
FOR x
IN [1..pGASideSize]
DO
InsertPin[x, pGASideSize, 0, 0, pga, out];
ENDLOOP;
IO.Close[out];
IO.PutF[cmd.out, "File %g.outer.part Written\n", IO.rope[fileName]];
out ← FS.StreamOpen[Rope.Cat[fileName,".sides.part"],$create];
IO.PutF[out, "4096 2048 -300 -100 1800 2000 700 -100 %gS PARC-%gS U\n",
IO.rope[fileName], IO.rope[fileName]];
IO.PutF[out, "0 0 DUMMY 1 0 1 0 11\n"];
FOR y
IN [1..pGASideSize]
DO
InsertPin[1, y, 2, 0, pga, out];
InsertPin[2, y, 2, 0, pga, out];
InsertPin[pGASideSize-1, y, 2, 0, pga, out];
InsertPin[pGASideSize, y, 2, 0, pga, out];
ENDLOOP;
IO.Close[out];
IO.PutF[cmd.out, "File %g.sides.part Written\n", IO.rope[fileName]];
out ← FS.StreamOpen[Rope.Cat[fileName,".center.part"],$create];
IO.PutF[out, "4096 2048 -300 -100 1800 2000 1100 -100 %gC PARC-%gC U\n",
IO.rope[fileName], IO.rope[fileName]];
FOR y
IN [1..pGARows]
DO
FOR x
IN [3..pGASideSize-2]
DO
InsertPin[x, y, 2, 0, pga, out];
ENDLOOP;
ENDLOOP;
FOR y
IN [pGARows+1..pGASideSize-pGARows]
DO
FOR x
IN [3..pGARows]
DO
InsertPin[x, y, 2, 0, pga, out];
ENDLOOP;
FOR x
IN [pGASideSize-pGARows+1..pGASideSize-2]
DO
InsertPin[x, y, 2, 0, pga, out];
ENDLOOP;
ENDLOOP;
FOR y
IN [pGASideSize-pGARows+1..pGASideSize]
DO
FOR x
IN [3..pGASideSize-2]
DO
InsertPin[x, y, 2, 0, pga, out];
ENDLOOP;
ENDLOOP;
IO.Close[out];
IO.PutF[cmd.out, "File %g.center.part Written\n", IO.rope[fileName]];
};