# Formato Gerber: storia, varianti e viewer

> Cos'è il formato Gerber e da dove nasce, le sue varianti (RS-274D, RS-274X, X2), il drill Excellon, come si compongono i layer di una PCB e perché molti produttori preferiscono oggi formati come ODB++ e IPC-2581.

Pubblicato: 2026-06-24
Aggiornato: 2026-08-25
Ambito: elettronica
Riferimento normativo: Formato Gerber: storia, varianti e viewer <https://en.wikipedia.org/wiki/Gerber_format>

Pagina: <https://www.stline.it/wiki/gerber-viewer/>

---

Un circuito stampato non si descrive con un solo file: ogni **layer fisico** della board è un file a sé, e per vederla bisogna ricomporli tutti allineati. Questa pagina spiega da dove nasce il formato Gerber, quali varianti esistono, da quali file è fatta una board e perché oggi molti produttori si appoggiano a formati più ricchi.

## Una breve storia

Il nome viene da **Gerber Scientific**, l'azienda di Joseph Gerber che fra gli anni '60 e '80 produceva i **fotoplotter** vettoriali usati per incidere le pellicole (i *film*) da cui si fabbricavano i circuiti stampati. Il formato Gerber nasce come linguaggio di controllo di quelle macchine — un sottoinsieme dello standard EIA **RS-274** per le macchine a controllo numerico.

Il fotoplotter muoveva una sorgente luminosa: *flashava* una forma (un'**apertura**) in una posizione per creare un pad, oppure *tracciava* una linea esponendo la pellicola lungo un percorso per creare una pista. Da qui i concetti ancora oggi centrali — apertura, *flash*, *draw* — e il motivo per cui un Gerber è un disegno vettoriale e non un'immagine raster. Poiché ogni fabbricante leggeva quel linguaggio, il Gerber è diventato lo **standard di fatto** per scambiare l'artwork delle PCB.

## Le varianti del formato

- **RS-274D** (Gerber "standard") — conteneva solo i movimenti; la forma delle aperture stava in un **file separato** (la *aperture wheel*) da comunicare a parte. Ambiguo e fragile: bastava un disallineamento fra disegno e tabella aperture per sbagliare la board. Oggi obsoleto.
- **RS-274X** (Extended Gerber, *X1*) — incorpora nel file le definizioni di apertura e il formato delle coordinate, e aggiunge **regioni** (G36/G37), **polarità** dark/clear (LPD/LPC), **step-and-repeat** e **macro di apertura**. È la variante usata da decenni e quella che questo viewer interpreta.
- **Gerber X2** (2014) — aggiunge **attributi** (metadati) che dichiarano il significato di ogni file: funzione del layer, dati di foratura, attributi di netlist. Il set diventa **auto-descrittivo** invece di affidarsi ai nomi file. È mantenuto da **Ucamco**, erede di Gerber Scientific per il formato.
- **Gerber Job File** (`.gbrjob`) — file companion che descrive l'intero job (stack-up, ordine dei layer, materiali) accanto ai Gerber X2.

## Il formato Gerber in pratica (RS-274X)

Il **Gerber** descrive ogni layer come una sequenza di **aperture** (cerchi, rettangoli, forme custom via macro) che vengono *flashate* in una posizione (un pad) o *tracciate* lungo un percorso (una pista). L'**RS-274X** incorpora nel file sia la definizione delle aperture sia il formato delle coordinate; le **regioni** (G36/G37) riempiono aree, la **polarità** clear (LPC) "scava" il rame già depositato.

Ogni file Gerber contiene un solo layer. Un sistema di coordinate comune (origine e unità) garantisce che layer diversi si sovrappongano correttamente.

### La direttiva che decide tutto: il formato delle coordinate

C'è una riga, all'inizio di ogni file, da cui dipende se la board sarà grande dieci centimetri o dieci metri. Le coordinate nel Gerber sono **interi senza virgola**: `X1500Y2000` non dice millimetri, dice «mille­cinquecento unità», e quanto vale un'unità lo stabilisce la direttiva **`FS`** (*Format Specification*) insieme a **`MO`** (*Mode*, pollici o millimetri).

| Direttiva | Interi | Decimali | `X1500` significa | Se la si sbaglia |
|---|---|---|---|---|
| `%FSLAX46Y46*%` | 4 | 6 | 0,0015 mm | riferimento |
| `%FSLAX35Y35*%` | 3 | 5 | 0,015 mm | × 10 |
| `%FSLAX24Y24*%` | 2 | 4 | 0,15 mm | × 100 |
| `%FSLAX23Y23*%` | 2 | 3 | 1,5 mm | × 1000 |

La forma `%FSLAX46Y46*%` si legge così: `L` = zeri iniziali omessi (*leading zeros omitted*), `A` = coordinate assolute, poi `X46` = 4 cifre intere e 6 decimali per la coordinata X, `Y46` idem. Con `MO` in millimetri, l'unità elementare è quindi 10⁻⁶ mm.

L'ultima colonna della tabella è il motivo per cui questa direttiva conta più di tutte le altre: **un errore di una cifra scala la board di un fattore dieci**, e il file si apre benissimo. Non c'è nessun errore di sintassi, nessun avviso: c'è una board di dimensioni sbagliate, che il fab produrrebbe volentieri se il file di outline avesse lo stesso errore. È anche il motivo per cui il primo controllo su un Gerber ricevuto è sempre **misurare qualcosa di noto** — il passo di un connettore, la diagonale della board — e non guardare se «sembra giusto».

Due varianti storiche si incontrano ancora, e vanno riconosciute. Gli zeri **finali** omessi (`T` invece di `L`) esistono ancora in file vecchi e cambiano completamente l'interpretazione della stessa cifra. E le coordinate **incrementali** (`I` invece di `A`, con `G91`) sono deprecate da decenni ma compaiono in output di CAD antichi: ogni coordinata è uno spostamento dalla precedente, quindi un singolo errore di parsing sposta tutto il resto del layer.

### Archi: G74 e G75, il bug che nessuno vede

Un arco in Gerber si traccia con `G02` (senso orario) o `G03` (antiorario) dando il punto finale e l'**offset del centro** (`I`, `J`) rispetto al punto di partenza. Ma l'interpretazione di quell'offset dipende da una modalità dichiarata a parte:

- **`G74`** — *single quadrant*: l'arco non può attraversare un quadrante, `I` e `J` sono senza segno e il verso va dedotto. Modalità storica, deprecata.
- **`G75`** — *multi quadrant*: `I` e `J` sono con segno e l'arco può percorrere fino al cerchio intero. È la modalità corretta.

Interpretare un file `G74` come `G75` (o viceversa) non produce un errore: produce **archi che vanno dalla parte sbagliata**, o cerchi al posto di quarti di cerchio. Su un layer di rame si vede; su un layer di solder mask o su una fresatura di contorno, molto meno — e il pezzo esce con un profilo diverso da quello disegnato. Il renderer di questo strumento implementa entrambe le modalità, che è esattamente il motivo per cui vale citarle.

## I file di una board

Una board tipica è un insieme di file, uno per piano fisico più la foratura e il bordo:

- **Rame (copper)** — uno per ogni strato conduttivo: top, bottom ed eventuali strati interni. È dove vivono piste e pad.
- **Solder mask** — la maschera di saldatura, un file per lato. Le sue aperture indicano dove il rame resta esposto.
- **Serigrafia (silkscreen)** — scritte e contorni dei componenti, un file per lato.
- **Pasta saldante (solder paste)** — le aperture dello stencil per la pasta sui pad SMD, un file per lato.
- **Drill (Excellon)** — non è un Gerber ma un file Excellon a parte, con le coordinate dei fori per diametro.
- **Bordo (outline / Edge Cuts)** — il contorno meccanico della scheda, un Gerber dedicato.

## Perché più file, e come si compongono

Separare i layer è necessario perché ognuno va su un processo di fabbricazione diverso (incisione del rame, serigrafia, foratura). Per **vedere** la board si fa l'operazione inversa: si caricano tutti i file e si sovrappongono allineati sullo stesso sistema di coordinate, così che pad, piste, maschera e fori cadano esattamente dove devono. Ogni layer riceve un colore e si può accendere/spegnere per ispezionare la board strato per strato.

## Identificazione dei layer

I nomi dei file **non sono standardizzati** fra i CAD: lo stesso layer può chiamarsi `top.gtl`, `board-F_Cu.gbr` (KiCad), `top_copper.gbr` e così via, e i drill possono avere estensione `.drl` o `.txt`. È proprio per questo che il Gerber X2, aggiungendo attributi di funzione, riduce l'ambiguità. Il viewer riconosce il tipo di ogni file combinando nome/estensione e contenuto; i file estranei (BOM, pick&place, PDF, README) vengono ignorati senza errore, mentre un layer ambiguo resta marcato come "sconosciuto" e può essere assegnato a mano.

### Estensioni comuni per layer

| Layer | Estensioni tipiche |
|---|---|
| Rame top / bottom | `.gtl` / `.gbl`, `F_Cu.gbr` / `B_Cu.gbr` |
| Solder mask top / bottom | `.gts` / `.gbs`, `F_Mask.gbr` / `B_Mask.gbr` |
| Serigrafia top / bottom | `.gto` / `.gbo`, `F_Silkscreen.gbr` / `B_Silkscreen.gbr` |
| Pasta top / bottom | `.gtp` / `.gbp`, `F_Paste.gbr` / `B_Paste.gbr` |
| Bordo (outline) | `.gko`, `.gm1`, `Edge_Cuts.gbr` |
| Drill (Excellon) | `.drl`, `.txt`, `.xln` |

La colonna di sinistra è il significato; quella di destra mostra le due convenzioni più diffuse (Protel/legacy e KiCad). Sono esempi, non uno standard: è esattamente l'ambiguità che gli attributi del Gerber X2 eliminano.

### Cosa il renderer copre, per davvero

Dire che un viewer «interpreta il Gerber» non significa niente: quello che conta è quali direttive gestisce, perché le mancanti non danno errore, danno un disegno diverso. Questa è la copertura effettiva, letta dal sorgente del renderer:

| Gruppo | Supportato dal renderer | Non supportato |
|---|---|---|
| Direttive estese | `FS` `MO` `AD` `AM` `AB` `SR` `LP` `LM` `LR` `LS` | attributi `TF`/`TA`/`TO` (metadati X2: letti, non usati per il disegno) |
| Codici G | `G01` `G02` `G03` `G04` `G36` `G37` `G70` `G71` `G74` `G75` `G90` `G91` | — |
| Primitive di macro | `1` cerchio, `4` outline, `5` poligono, `7` thermal, `21` linea centrata, `22` linea da angolo | `2`/`20` linea vettoriale, `6` moiré |
| Excellon | `M48` `M71` `M72` `M15` `M16`, tool table | routing con compensazione raggio |

Tre righe meritano un commento. **`AB`** (*Aperture Block*) e **`SR`** (*Step and Repeat*) sono le direttive con cui si descrive un pannello — la stessa board ripetuta su una griglia — e sono quelle che i viewer semplici ignorano: il risultato è che si vede una board sola invece di dodici, e il pannello sembra sbagliato quando è il viewer a essere incompleto. **`LM`/`LR`/`LS`** (mirror, rotate, scale) sono le trasformazioni introdotte dal Gerber X2: senza di esse le aperture ruotate finiscono nel posto giusto con l'orientamento sbagliato.

E fra le primitive di macro non supportate, la **`20`** (linea vettoriale) è l'unica che si incontri con qualche frequenza, in macro generate da CAD non recenti; la **`6`** (moiré) serve ai target di fiducializzazione ottica ed è rara. Una macro che le usi viene ignorata nella parte non supportata invece di far fallire il caricamento, che è la scelta giusta per un viewer ma va saputo.

## Oltre il Gerber: ODB++ e IPC-2581

Il Gerber classico descrive solo l'**artwork** di ogni layer: non porta in sé lo stack-up, la netlist, i componenti o lo span dei fori. Per la fabbricazione e soprattutto per l'**assemblaggio** questo lascia margini di ambiguità che il fab deve colmare a mano. Per questo molti produttori preferiscono oggi formati "intelligenti":

- **ODB++** (nato in Valor, oggi Siemens) — non un file ma un **database** (un albero di cartelle) che raccoglie in un unico pacchetto rame, foratura, netlist, componenti, stack-up, test-point e regole DFM. Molto diffuso per ridurre il setup e gli scambi col fab.
- **IPC-2581** (detto anche *DPMX*) — standard **aperto e neutrale**, un singolo file XML con l'intero modello di prodotto (stack-up, netlist, componenti, foratura, dati DFM). Spinto come alternativa aperta all'ODB++ proprietario.

Gerber **X2** colma in parte il divario aggiungendo attributi, ma ODB++ e IPC-2581 nascono per portare **nativamente** netlist, componenti e stack-up. Nella pratica un fab accetta quasi sempre il Gerber (X2 o RS-274X + Excellon), e in parallelo ODB++ o IPC-2581 quando il flusso di assemblaggio li richiede.

## Come viene resa la board

La board è rasterizzata su canvas WebGL2 da un motore scritto in **Rust e compilato a WebAssembly**: interpreta direttamente le polarità dark/clear (LPD/LPC) e le regioni di pour (G36/G37), così le clearance "scavano" davvero il rame e le piste restano leggibili anche dentro un piano. I layer sono composti con trasparenza per layer, con misure punto-punto e selezione degli elementi.

---

Strumento web: **[Gerber Viewer](/tools/gerber-viewer/)**. Motore: **WASM Gerber Viewer** (renderer Rust/WASM su WebGL2, MIT).
