{ ---------------------------------------------------------------------------- ]

  Zdrojový text knihovny pouzder řady MQFP
  ========================================

  PH 2007

  

  Knihovna vytvořena dle normy JEDEC MS-022 Metric Plastic Quad Flatpack Family
  z prosince 1996 (vydání B).

  Čísla vrstev upravena pro program Layout verze 4.40.  Knihovnu lze vygenerovat
  příkazem

  genlib -o mqfp.pcb mqfp.pas

  Po otevření vygenerované knihovny v programu Layout je nutno se přesvědčit,
  zda je nastaven Dimensions | Basic Grid = 0.025 mm, pak knihovnu zapsat zpět.

  Logické typy pájecích bodů může být třeba upravit dle uživatelových tabulek 
  rozměrů (viz komentář níže).

[ ---------------------------------------------------------------------------- }


{ všeobecně využitelné funkce }

function Min (a, b: integer) : integer;
begin
  if a < b then Result := a else Result := b;
end;

function Max (a, b: integer) : integer;
begin
  if a > b then Result := a else Result := b;
end;

function Avg (a, b: integer) : integer;
begin
  Result := (a + b) div 2;
end;

function GetPoint (x, y: integer) : Point;
begin
  Result.x := x;
  Result.y := y;
end;

function GetRect (x1, y1, x2, y2: integer) : Rect;
begin
  Result.Left   := x1;
  Result.Bottom := y1;
  Result.Right  := x2;
  Result.Top    := y2;
end;

function GetRect0 (w, h: integer) : Rect;
begin
  Result.Left   := -w;
  Result.Bottom := -h;
  Result.Right  :=  w;
  Result.Top    :=  h;
end;

function RectCenter (r: Rect) : Point;
begin
  Result.x := Avg (r.Left, r.Right);
  Result.y := Avg (r.Top,  r.Bottom);
end;

function StretchRect (r: Rect; dx, dy: integer) : Rect;
begin
  Result.Left   := r.Left   - dx;
  Result.Bottom := r.Bottom - dy;
  Result.Right  := r.Right  + dx;
  Result.Top    := r.Top    + dy;
end;

{ ---------------------------------------------------------------------------- }

{ procedury pro vykreslení základních tvarů }

{ Procedura DrawPin konvertuje logické typy pájecích bodů na jejich čísla 
  v souboru typu *.pcb formátu užívaného verzí 4.40.  (Složitost kombinování 
  čísla typu a rotace je důsledkem kompatibility s formátem verzí 4.2 a 4.30.) }

procedure DrawPin (PinNumber: integer; x, y: integer; PadType: integer; Rotation: integer);
begin
  if Rotation = 90 then
    PadType := PadType + 256;
  if      (PadType >= 128) and (PadType < 256) then
    PadType := PadType + 128
  else if (PadType >= 256) and (PadType < 384) then
    PadType := PadType - 128;
  if      (PadType >=  64) and (PadType < 128) then
    PadType := PadType + 64
  else if (PadType >= 128) and (PadType < 192) then
    PadType := PadType - 64;
  Pin (PinNumber, x, y, PadType);
end;

procedure DrawRect (r: Rect; LineType, Layer: integer);
begin
  Line (r.Left,  r.Top,
        r.Right, r.Top, LineType, Layer);
  Line (r.Right, r.Bottom);
  Line (r.Left,  r.Bottom);
  Line (r.Left,  r.Top);
end;

procedure DrawSquare (Center: Point; Size: integer; LineType, Layer: integer);
  var r: Rect;
begin
  r := GetRect (Center.x - Size div 2, Center.y - Size div 2,
                Center.x + Size div 2, Center.y + Size div 2);
  DrawRect (r, LineType, Layer);
end;

procedure DrawCircle (Center: Point; Size: integer; LineType, Layer: integer);
begin
  Arc (0, Center.x, Center.y, Size div 2, LineType, Layer);
  Arc (1, Center.x, Center.y, Size div 2);
  Arc (2, Center.x, Center.y, Size div 2);
  Arc (3, Center.x, Center.y, Size div 2);
end;

procedure RoundRect (r: Rect; a: integer; LineType, Layer: integer);
begin
  Line (r.Left  + a, r.Bottom,     r.Right - a, r.Bottom,  LineType, Layer);
  Line (r.Left  + a, r.Top,        r.Right - a, r.Top,     LineType, Layer);
  Line (r.Left,      r.Bottom + a, r.Left,      r.Top - a, LineType, Layer);
  Line (r.Right,     r.Bottom + a, r.Right,     r.Top - a, LineType, Layer);
  Arc (0, r.Right - a, r.Top    - a, a, LineType, Layer);
  Arc (1, r.Left  + a, r.Top    - a);
  Arc (2, r.Left  + a, r.Bottom + a);
  Arc (3, r.Right - a, r.Bottom + a);
end;

procedure MitreRect (r: Rect; Corner: integer; LineType, Layer: integer);
begin
  Line (r.Left, r.Top, r.Right, r.Top, LineType, Layer);
  Line (r.Right, r.Bottom);
  Line (r.Left + Corner, r.Bottom);     {skosí levý dolní roh} 
  Line (r.Left, r.Bottom + Corner);
  Line (r.Left, r.Top);
end;

{ ---------------------------------------------------------------------------- }

var
  OutLineLayer, InnerLayer, LegendLayer: integer;
  OuterLine, InnerLine, LegendLine: integer;    {logické typy čar}

procedure CentralName (Center: Point; LineType, Layer: integer);
begin
  ComponentName    (Center.x, Center.y, 10, 0, LineType, Layer);
{ další dva nápisy vytvoří verze 4.40 automaticky, proto jsou vykomentovány }
{ ComponentValue   (Center.x, Center.y,  0, 0, LineType, Layer);  {nebo posunout kousek dolů?}
{ ComponentPackage (Center.x, Center.y,  0, 0, LineType, Layer);  {dtto}
end;

{ vytváření pouzder }

function um2gu (Micrometers: integer) : integer;        {převádí tisíciny mm na vnitřní jednotky}
begin
  Result := Micrometers div 25;
end;

procedure GenericMQFP (Variation: string; N: integer; D, D1, Pitch: integer;
			     PadType: integer; PadOffset, OutlineMargin: integer);
var
  Name:  string;
  Frame: Rect;
  u, v:  integer;
  i, j:  integer;
begin
  Name := 'MQFP-' + Variation;
  Component (Name, 'VALUE', Name) begin
    Frame := GetRect0 (um2gu (D) div 2, um2gu (D) div 2);
    CentralName (RectCenter (Frame), LegendLine, LegendLayer);
    MitreRect (StretchRect (Frame, um2gu (OutlineMargin), um2gu (OutlineMargin)), um2gu (1000), OuterLine, OutlineLayer);
    u := -(N div 4 - 1) * Pitch div 2;  {souřadnice pinu 1 v tisícinách mm}
    v := um2gu (D + PadOffset) div 2;   {souřadnice horní řady ve vnitřních jednotkách}
    j := 1;
    for i := 1 to N div 4 do begin
      DrawPin (j,  um2gu (u + (i - 1) * Pitch), -v, PadType, 90);
      j := j + 1;
    end;
    for i := 1 to N div 4 do begin
      DrawPin (j,  v,  um2gu (u + (i - 1) * Pitch), PadType,  0);
      j := j + 1;
    end;
    for i := 1 to N div 4 do begin
      DrawPin (j, -um2gu (u + (i - 1) * Pitch),  v, PadType, 90);
      j := j + 1;
    end;
    for i := 1 to N div 4 do begin
      DrawPin (j, -v, -um2gu (u + (i - 1) * Pitch), PadType,  0);
      j := j + 1;
    end;
    RoundRect (GetRect0 (um2gu (D1) div 2, um2gu (D1) div 2), um2gu (600), InnerLine, InnerLayer);
    RoundRect (GetRect0 (um2gu (D1 - 800) div 2, um2gu (D1 - 800) div 2), um2gu (400), InnerLine, InnerLayer);
    DrawCircle (GetPoint (- um2gu (D1) div 2 + um2gu (1400), - um2gu (D1) div 2 + um2gu (1400)), um2gu (800), InnerLine, InnerLayer);

    Text (1,           um2gu (u), - v - um2gu (OutlineMargin + 900), 6, 0, OuterLine, OutlineLayer);
    Text (N div 4,   - um2gu (u), - v - um2gu (OutlineMargin + 900), 6, 0, OuterLine, OutlineLayer);
    Text (N div 2,     v + um2gu (OutlineMargin + 900), - um2gu (u), 6, 1, OuterLine, OutlineLayer);
    Text (3 * N div 4, um2gu (u),   v + um2gu (OutlineMargin + 900), 6, 2, OuterLine, OutlineLayer);
    Text (N,         - v - um2gu (OutlineMargin + 900), um2gu (u),   6, 3, OuterLine, OutlineLayer);
  end;
end;

{ ---------------------------------------------------------------------------- }

var
  Pad100, Pad080, Pad065: integer;      {logické typy pájecích bodů pro jednotlivé rozteče vývodů}

begin
  OutlineLayer := 4 + 15 + 4;   {čísla vrstev zvýšena pro verzi 4.40}
  InnerLayer   := 4 + 14 + 4;
  LegendLayer  := 4 + 13 + 4;
  OuterLine  := 0;              {standardně odpovídá šířce 0,1  / 0,102 mm}
  InnerLine  := 1;              {standardně odpovídá šířce 0,15 / 0,152 mm}
  LegendLine := 2;              {standardně odpovídá šířce 0,2  / 0,203 mm}

  Pad100 := 85;  {v programu Layout jsou předdefinovány jako obdélníky rozměru 0,5 x 0,9 mm}
  Pad080 := 85;
  Pad065 := 85;

{ ---------------------------------------------------------------------------- ]

  Následující tabulka vygeneruje řadu MQFP pouzder dle normy JEDEC MS-022B,
  z které jsou přímo převzaty údaje v prvních pěti sloupcích (tj. prvních
  5 parametrů volané procedury).  Stejně tak je odtud převzato i jejich značení
  písmeny N až e v komentáři.

  Šestý parametr je logický typ pájecího bodu.  Zde uvedený typ je spíše
  provizorní, vycházející z předdefinované tabulky rozměrů pájecích bodů
  v programu Layout.  Uživatel může do proměnných Pad100, Pad080, Pad065 zapsat
  čísla typů odpovídající jeho vlastní tabulce rozměrů, popřípadě do ní nějaké
  pájecí body také dodefinovat.

  Předposlední sedmý parametr určuje posunutí středu pájecího bodu vůči poloze
  konce vývodu dle normy (záporná hodnota značí posunutí směrem k ose pouzdra).
  Hodnotu si může uživatel upravit podle zvoleného typu pájecího bodu a svých
  technologických požadavků.  Konečně osmý parametr udává posunutí vnějšího
  obrysu pouzdra vůči koncům vývodů.

  Všechny míry jsou uvedeny v tisícinách milimetru.

[ ---------------------------------------------------------------------------- }

  {            Variation N      D     D1     e   PadType          }
  GenericMQFP ('AA',    36, 13200, 10000, 1000,  Pad100, -250, 500);
  GenericMQFP ('AB',    44, 13200, 10000,  800,  Pad080, -250, 500);
  GenericMQFP ('AC',    52, 13200, 10000,  650,  Pad065, -250, 500);

  GenericMQFP ('BA',    52, 17200, 14000, 1000,  Pad100, -250, 500);
  GenericMQFP ('BB',    64, 17200, 14000,  800,  Pad080, -250, 500);
  GenericMQFP ('BC',    80, 17200, 14000,  650,  Pad065, -250, 500);
  GenericMQFP ('BD',    52, 17200, 14000, 1000,  Pad100, -250, 500);  {stejné jako BA až na výšku}
  GenericMQFP ('BE',    64, 17200, 14000,  800,  Pad080, -250, 500);
  GenericMQFP ('BF',    80, 17200, 14000,  650,  Pad065, -250, 500);

  GenericMQFP ('CA-2',  76, 23200, 20000, 1000,  Pad100, -250, 500);  
  GenericMQFP ('CA-1',  76, 23200, 20000, 1000,  Pad100, -250, 500);  {stejné jako CA-2 až na výšku}
  GenericMQFP ('CA',    76, 23200, 20000, 1000,  Pad100, -250, 500);  {označení zjednodušeno oproti normě}
  GenericMQFP ('CB-2',  88, 23200, 20000,  800,  Pad080, -250, 500);  
  GenericMQFP ('CB-1',  88, 23200, 20000,  800,  Pad080, -250, 500);  {stejné jako CB-2 až na výšku}
  GenericMQFP ('CB',    88, 23200, 20000,  800,  Pad080, -250, 500);  {označení zjednodušeno oproti normě}  
  GenericMQFP ('CC-2', 112, 23200, 20000,  650,  Pad065, -250, 500);  
  GenericMQFP ('CC-1', 112, 23200, 20000,  650,  Pad065, -250, 500);  {stejné jako CC-2 až na výšku}
  GenericMQFP ('CC',   112, 23200, 20000,  650,  Pad065, -250, 500);  {označení zjednodušeno oproti normě}  

  GenericMQFP ('DA-2', 120, 31200, 28000,  800,  Pad080, -250, 500);  
  GenericMQFP ('DA-1', 120, 31200, 28000,  800,  Pad080, -250, 500);  {stejné jako DA-2 až na výšku}  
  GenericMQFP ('DA',   120, 31200, 28000,  800,  Pad080, -250, 500);  {označení zjednodušeno oproti normě}  
  GenericMQFP ('DB-2', 128, 31200, 28000,  800,  Pad080, -250, 500);  
  GenericMQFP ('DB-1', 128, 31200, 28000,  800,  Pad080, -250, 500);  {stejné jako DB-2 až na výšku}  
  GenericMQFP ('DB',   128, 31200, 28000,  800,  Pad080, -250, 500);  {označení zjednodušeno oproti normě}  
  GenericMQFP ('DC-2', 144, 31200, 28000,  650,  Pad065, -250, 500);  
  GenericMQFP ('DC-1', 144, 31200, 28000,  650,  Pad065, -250, 500);  {stejné jako DC-2 až na výšku}  
  GenericMQFP ('DC',   144, 31200, 28000,  650,  Pad065, -250, 500);  {označení zjednodušeno oproti normě}  
  GenericMQFP ('DD-2', 160, 31200, 28000,  650,  Pad065, -250, 500);  
  GenericMQFP ('DD-1', 160, 31200, 28000,  650,  Pad065, -250, 500);  {stejné jako DD-2 až na výšku}  
  GenericMQFP ('DD',   160, 31200, 28000,  650,  Pad065, -250, 500);  {označení zjednodušeno oproti normě}  

  GenericMQFP ('EA',   184, 35200, 32000,  650,  Pad065, -250, 500);  

  GenericMQFP ('FA',   232, 43200, 40000,  650,  Pad065, -250, 500);

  GenericMQFP ('GA-2',  64, 23200, 20000, 1000,  Pad100, -250, 500);
  GenericMQFP ('GA-1',  64, 23200, 20000, 1000,  Pad100, -250, 500);  {stejné jako GA-2 až na výšku}
  GenericMQFP ('GA',    64, 23200, 20000, 1000,  Pad100, -250, 500);  {označení zjednodušeno oproti normě}
  GenericMQFP ('GB-2',  80, 23200, 20000,  800,  Pad080, -250, 500);
  GenericMQFP ('GB-1',  80, 23200, 20000,  800,  Pad080, -250, 500);  {stejné jako GB-2 až na výšku}
  GenericMQFP ('GB',    80, 23200, 20000,  800,  Pad080, -250, 500);  {označení zjednodušeno oproti normě}
  GenericMQFP ('GC-2', 100, 23200, 20000,  650,  Pad065, -250, 500);
  GenericMQFP ('GC-1', 100, 23200, 20000,  650,  Pad065, -250, 500);  {stejné jako GC-2 až na výšku}
  GenericMQFP ('GC',   100, 23200, 20000,  650,  Pad065, -250, 500);  {označení zjednodušeno oproti normě}

  Writeln ('Vytvorena pouzdra MQFP');
end.

