Fabmaster
Introduction
Fabmaster is a PCB fabrication and assembly data extraction format produced by Mentor Graphics (now Siemens EDA) tools, primarily Expedition and PADS. The exporter generates a structured ASCII text file containing board data in named sections.
KiCad supports PCB layout import only. Fabmaster carries no schematic data.
Supported file extensions:
-
.txt— Primary extension -
.fab— Alternative extension
The importer operates in three phases. The read phase tokenizes the entire file into rows and fields. The process phase detects sections by inspecting header row column names and populates internal data structures. The load phase converts the internal data into KiCad board objects.
File Structure
Fabmaster files are section-based delimited text. Each section begins with a header row, followed by a metadata row, followed by zero or more data rows.
Delimiter and Quoting
Fields within a row are separated by exclamation marks (!). Rows end with a trailing
! before the newline, so the parser discards the final empty field.
Fields that contain the ! delimiter are enclosed in double quotes. Quoted mode is
toggled when a quote character appears at the start of a field or immediately after
another quote.
Character Encoding
Files are ASCII. The importer uppercases all characters on read, so field matching is case-insensitive in practice.
Row Types
Each row begins with a single-character type identifier in the first field.
| Type | Purpose |
|---|---|
|
Header row. Defines column names for the section that follows. |
|
Data row. Contains one record of section data. |
|
Metadata row. Carries scale factor and unit information for the section. |
A section always has the structure: one A row, one J row, then zero or more S
rows. Data rows continue until a row with a different type prefix or the end of file.
A!REFDES!COMPCLASS!COMPPARTNUMBER!...! (1)
J!...!...!MILS!...! (2)
S!U1!IC!74HC00!...! (3)
S!R1!DISCRETE!10K!...! (3)
S!C3!DISCRETE!100NF!...! (3)
(4)
A!NETNAME!REFDES!PINNUMBER!...! (1)
J!...!...!...! (2)
S!VCC!U1!14!...! (3)
S!GND!U1!7!...! (3)
| 1 | Header row (A) defines column names for the section. |
| 2 | Metadata row (J) carries unit and scale information. |
| 3 | Data rows (S) contain one record each. |
| 4 | Blank line or new A row marks the section boundary. |
Column Name Normalization
Some Fabmaster export variants include underscores in column names (e.g.,
GRAPHIC_DATA_NAME) while others omit them (e.g., GRAPHICDATANAME). The importer
strips all underscores from column names before matching, so both forms are equivalent.
Units
The J (metadata) row contains the unit system for coordinate values in the section.
The unit string appears in fields 7 through 9 of the metadata row. The importer scans
these fields and uses the first recognized value.
| Unit String | Interpretation |
|---|---|
|
Thousandths of an inch (default if no unit is found) |
|
Millimeters |
|
Micrometers. The importer applies a 10x scale relative to the millimeter conversion path. |
|
Inches |
Section Detection
The importer identifies each section by examining the first two or three column names
in the A (header) row, after stripping underscores. The detection logic is evaluated
in order; the first match wins.
| Column 1 | Column 2 | Column 3 | Section Type |
|---|---|---|---|
|
|
— |
EXTRACT_REFDES |
|
|
— |
EXTRACT_NETS |
|
|
(empty) |
EXTRACT_BASIC_LAYERS |
|
|
— |
EXTRACT_GRAPHICS |
|
|
|
EXTRACT_TRACES |
|
|
— |
FABMASTER_EXTRACT_PINS (detected but not processed) |
|
|
|
EXTRACT_PINS |
|
|
— |
EXTRACT_VIAS |
|
|
— |
EXTRACT_PAD_SHAPES |
|
— |
— |
EXTRACT_PADSTACKS |
|
— |
— |
EXTRACT_FULL_LAYERS |
Section Definitions
Each section below documents the column header signature and the meaning of each
column. All coordinate values are in the unit specified by the section’s J row.
The Y axis is inverted on import (Fabmaster uses Y-up, KiCad uses Y-down).
EXTRACT_PADSTACKS
Defines padstack geometry including per-layer pad sizes and drill definitions.
Header signature:
A!PADNAME!RECNUMBER!LAYER!FIXFLAG!VIAFLAG!PADSHAPE1!PADWIDTH!PADHGHT! PADXOFF!PADYOFF!PADFLASH!PADSHAPENAME!TRELSHAPE1!TRELWIDTH!TRELHGHT! TRELXOFF!TRELYOFF!TRELFLASH!TRELSHAPENAME!APADSHAPE1!APADWIDTH!APADHGHT! APADXOFF!APADYOFF!APADFLASH!APADSHAPENAME!
| Column | Type | Description |
|---|---|---|
PADNAME |
string |
Padstack identifier. Multiple rows share the same PADNAME, one per layer. |
RECNUMBER |
integer |
Layer sequence number within this padstack. Record 1 defines the primary copper pad shape and dimensions. |
LAYER |
string |
Layer name. Copper layer names match the stackup. Special layers use a tilde
prefix: |
FIXFLAG |
string |
Fixed pad flag. |
VIAFLAG |
string |
|
PADSHAPE1 |
string |
Pad shape name or drill hit value (on |
PADWIDTH |
decimal |
Pad width in section units. On |
PADHGHT |
decimal |
Pad height in section units. On |
PADXOFF |
decimal |
Pad X offset from center. |
PADYOFF |
decimal |
Pad Y offset from center. |
PADFLASH |
string |
Pad flash type. |
PADSHAPENAME |
string |
Named shape reference. On |
The remaining column groups (TREL and APAD prefixes) follow the same pattern for thermal relief and antipad definitions.
The importer processes this section in two passes. The first pass
(processPadStackLayers) extracts copper layer names and ordering from the LAYER and
RECNUMBER columns to build the board stackup before layers have been assigned. The
second pass (processPadStacks) reads pad geometry with scaling applied.
Drill Rows
Rows where LAYER is ~DRILL define the drill hole. PADSHAPE1 contains the drill
hit diameter. PADWIDTH and PADHGHT specify X and Y drill sizes for non-round holes.
When X equals Y, the drill hit value is used for both dimensions to handle exports
that do not correctly populate the X/Y fields for round drills.
Special Layer Rows
Rows where the layer name begins with ~ are technical layers. ~TSM and ~BSM
set solder mask pad dimensions. ~TSP and ~BSP set solder paste pad dimensions.
All other tilde-prefixed layers are skipped.
EXTRACT_PAD_SHAPES
Defines custom pad shape geometry using graphic primitives. Only FIG_SHAPE-prefixed
records are processed; other pad shape records are skipped.
Header signature:
A!SUBCLASS!PAD_SHAPE_NAME!GRAPHIC_DATA_NAME!GRAPHIC_DATA_NUMBER!RECORD_TAG! GRAPHIC_DATA_1!GRAPHIC_DATA_2!GRAPHIC_DATA_3!GRAPHIC_DATA_4!GRAPHIC_DATA_5! GRAPHIC_DATA_6!GRAPHIC_DATA_7!GRAPHIC_DATA_8!GRAPHIC_DATA_9!PAD_STACK_NAME! REFDES!PIN_NUMBER!
| Column | Type | Description |
|---|---|---|
SUBCLASS |
string |
Layer name for this pad shape element. |
PAD_SHAPE_NAME |
string |
Shape name. Must begin with `FIG_SHAPE ` followed by the shape identifier. |
GRAPHIC_DATA_NAME |
string |
Graphic primitive type (LINE, ARC, CIRCLE, etc.). |
GRAPHIC_DATA_NUMBER |
integer |
Primitive sequence number. |
RECORD_TAG |
string |
Space-separated pair |
GRAPHIC_DATA_1..9 |
varies |
Primitive-specific parameters. See the graphic data types section. |
PAD_STACK_NAME |
string |
Parent padstack name. |
REFDES |
string |
Component reference designator for instance-specific pad shapes. |
PIN_NUMBER |
string |
Pin number for instance-specific pad shapes. |
EXTRACT_FULL_LAYERS
Full layer stackup definition with material properties.
Header signature:
A!LAYER_SORT!LAYER_SUBCLASS!LAYER_ARTWORK!LAYER_USE!LAYER_CONDUCTOR! LAYER_DIELECTRIC_CONSTANT!LAYER_ELECTRICAL_CONDUCTIVITY!LAYER_MATERIAL! LAYER_SHIELD_LAYER!LAYER_THERMAL_CONDUCTIVITY!LAYER_THICKNESS!
| Column | Type | Description |
|---|---|---|
LAYER_SORT |
integer |
Layer ordering index. |
LAYER_SUBCLASS |
string |
Layer name. Empty for unnamed stackup layers, in which case the importer
generates a name from the sort index (e.g., |
LAYER_ARTWORK |
string |
|
LAYER_USE |
string |
Layer usage designation. |
LAYER_CONDUCTOR |
string |
|
LAYER_DIELECTRIC_CONSTANT |
decimal |
Relative permittivity. Parsed but not applied to the board. |
LAYER_ELECTRICAL_CONDUCTIVITY |
decimal |
Electrical conductivity. Parsed but not applied. |
LAYER_MATERIAL |
string |
Material name. Rows with material |
LAYER_SHIELD_LAYER |
string |
Shield layer flag. |
LAYER_THERMAL_CONDUCTIVITY |
decimal |
Thermal conductivity. Parsed but not applied. |
LAYER_THICKNESS |
decimal |
Layer thickness. Parsed but not applied. |
EXTRACT_BASIC_LAYERS
Simplified layer definition with only class and subclass. Used when the full layer stackup section is not present.
Header signature:
A!CLASS!SUBCLASS!
| Column | Type | Description |
|---|---|---|
CLASS |
string |
Layer class. |
SUBCLASS |
string |
Layer name. |
EXTRACT_VIAS
Via placement data.
Header signature:
A!VIA_X!VIA_Y!PAD_STACK_NAME!NET_NAME!TEST_POINT!
| Column | Type | Description |
|---|---|---|
VIA_X |
decimal |
Via X coordinate. |
VIA_Y |
decimal |
Via Y coordinate. |
PAD_STACK_NAME |
string |
Padstack name that defines the via size and drill. |
NET_NAME |
string |
Net name assigned to this via. |
TEST_POINT |
string |
|
The importer determines via type (through, blind, or buried) based on the copper layer span of the referenced padstack.
EXTRACT_PINS
Pin placement data with mirror information. This is the preferred pin format.
Header signature:
A!SYM_NAME!SYM_MIRROR!PIN_NAME!PIN_NUMBER!PIN_X!PIN_Y!PAD_STACK_NAME!REFDES! PIN_ROTATION!TEST_POINT!
| Column | Type | Description |
|---|---|---|
SYM_NAME |
string |
Symbol (footprint) name. |
SYM_MIRROR |
string |
|
PIN_NAME |
string |
Logical pin name. |
PIN_NUMBER |
string |
Physical pin number. Pins are sorted by this field. |
PIN_X |
decimal |
Pin X coordinate in absolute board units. |
PIN_Y |
decimal |
Pin Y coordinate in absolute board units. |
PAD_STACK_NAME |
string |
Padstack name for this pin. |
REFDES |
string |
Component reference designator. When empty, the importer uses SYM_NAME as the key for grouping pins. |
PIN_ROTATION |
decimal |
Pin rotation in degrees. |
TEST_POINT |
string |
|
FABMASTER_EXTRACT_PINS
An older pin format without the SYM_MIRROR column. Detected by the column signature
SYMNAME, PINNAME (without SYMMIRROR in the third position). This section type is
recognized but not currently processed by the importer.
EXTRACT_TRACES
Trace, zone, and reference designator graphics on copper and non-copper layers.
Header signature:
A!CLASS!SUBCLASS!GRAPHIC_DATA_NAME!GRAPHIC_DATA_NUMBER!RECORD_TAG!GRAPHIC_DATA_1! GRAPHIC_DATA_2!GRAPHIC_DATA_3!GRAPHIC_DATA_4!GRAPHIC_DATA_5!GRAPHIC_DATA_6! GRAPHIC_DATA_7!GRAPHIC_DATA_8!GRAPHIC_DATA_9!NET_NAME!
| Column | Type | Description |
|---|---|---|
CLASS |
string |
Record class. Determines how the record is routed:
|
SUBCLASS |
string |
Layer name. |
GRAPHIC_DATA_NAME |
string |
Graphic primitive type. |
GRAPHIC_DATA_NUMBER |
integer |
Primitive sequence number. |
RECORD_TAG |
string |
Space-separated |
GRAPHIC_DATA_1..9 |
varies |
Primitive-specific parameters. |
NET_NAME |
string |
Net assignment for this trace segment. |
Records with zero width are treated as zone outlines. Records with nonzero width are treated as trace segments.
EXTRACT_GRAPHICS
Board-level and component-level graphic elements.
Header signature:
A!GRAPHIC_DATA_NAME!GRAPHIC_DATA_NUMBER!RECORD_TAG!GRAPHIC_DATA_1!GRAPHIC_DATA_2! GRAPHIC_DATA_3!GRAPHIC_DATA_4!GRAPHIC_DATA_5!GRAPHIC_DATA_6!GRAPHIC_DATA_7! GRAPHIC_DATA_8!GRAPHIC_DATA_9!SUBCLASS!SYM_NAME!REFDES!
| Column | Type | Description |
|---|---|---|
GRAPHIC_DATA_NAME |
string |
Graphic primitive type. |
GRAPHIC_DATA_NUMBER |
integer |
Primitive sequence number. |
RECORD_TAG |
string |
Space-separated |
GRAPHIC_DATA_1..9 |
varies |
Primitive-specific parameters. |
SUBCLASS |
string |
Layer name. |
SYM_NAME |
string |
Symbol name for component-level graphics. |
REFDES |
string |
Reference designator. When empty, the graphic is assigned to the board level. When populated, the graphic is associated with the named component. |
EXTRACT_NETS
Net-to-pin connectivity mapping.
Header signature:
A!NET_NAME!REFDES!PIN_NUMBER!PIN_NAME!PIN_GROUND!PIN_POWER!
| Column | Type | Description |
|---|---|---|
NET_NAME |
string |
Net name. |
REFDES |
string |
Component reference designator. |
PIN_NUMBER |
string |
Pin number on the component. |
PIN_NAME |
string |
Pin name. |
PIN_GROUND |
string |
|
PIN_POWER |
string |
|
EXTRACT_REFDES
Component placement and properties.
Header signature:
A!REFDES!COMP_CLASS!COMP_PART_NUMBER!COMP_HEIGHT!COMP_DEVICE_LABEL! COMP_INSERTION_CODE!SYM_TYPE!SYM_NAME!SYM_MIRROR!SYM_ROTATE!SYM_X!SYM_Y! COMP_VALUE!COMP_TOL!COMP_VOLTAGE!
| Column | Type | Description |
|---|---|---|
REFDES |
string |
Component reference designator. |
COMP_CLASS |
string |
Component classification. See the component class table below. |
COMP_PART_NUMBER |
string |
Manufacturer part number. |
COMP_HEIGHT |
string |
Component height. |
COMP_DEVICE_LABEL |
string |
Device type label. |
COMP_INSERTION_CODE |
string |
Insertion code for assembly. |
SYM_TYPE |
string |
Symbol type. See the symbol type table below. |
SYM_NAME |
string |
Footprint symbol name. |
SYM_MIRROR |
string |
|
SYM_ROTATE |
decimal |
Rotation angle in degrees. |
SYM_X |
decimal |
Component X position. |
SYM_Y |
decimal |
Component Y position. |
COMP_VALUE |
string |
Component value. |
COMP_TOL |
string |
Component tolerance. |
COMP_VOLTAGE |
string |
Component voltage rating. |
Graphic Data Types
Graphic primitives are used across multiple sections (traces, graphics, custom pads). The GRAPHIC_DATA_NAME field identifies the primitive type and determines the interpretation of the GRAPHIC_DATA_1 through GRAPHIC_DATA_9 fields.
Primitive Types
| GRAPHIC_DATA_NAME | GRAPHIC_DATA Field Assignments |
|---|---|
|
DATA_1: start X, DATA_2: start Y, DATA_3: end X, DATA_4: end Y, DATA_5: width |
|
DATA_1: start X, DATA_2: start Y, DATA_3: end X, DATA_4: end Y, DATA_5: center X,
DATA_6: center Y, DATA_7: radius, DATA_8: width, DATA_9: direction
( |
|
DATA_1: center X, DATA_2: center Y, DATA_3: diameter X, DATA_4: diameter Y, DATA_5: width. X and Y diameters must be equal. Stored internally as a 360-degree arc. |
|
DATA_1: corner 1 X, DATA_2: corner 1 Y, DATA_3: corner 2 X, DATA_4: corner 2 Y,
DATA_5: fill flag ( |
|
DATA_1: center X, DATA_2: center Y, DATA_3: width, DATA_4: height,
DATA_5: fill flag ( |
|
Same format as FIG_RECTANGLE. Processed identically. |
|
DATA_1: center X, DATA_2: center Y, DATA_3: size X, DATA_4: size Y, DATA_5: width or fill. The suffix indicates the oblong orientation. |
|
DATA_1: center X, DATA_2: center Y, DATA_3: size X, DATA_4: size Y, DATA_5: width |
|
DATA_1: center X, DATA_2: center Y, DATA_3: size X, DATA_4: size Y, DATA_5: width. Equilateral triangle with vertex pointing upward. |
|
DATA_1: center X, DATA_2: center Y, DATA_3: size X, DATA_4: size Y, DATA_5: width. Square rotated 45 degrees. |
|
DATA_1: center X, DATA_2: center Y, DATA_3: size X, DATA_4: size Y, DATA_5: width. Hexagon with horizontal top and bottom edges (first vertex at 0 degrees). |
|
DATA_1: center X, DATA_2: center Y, DATA_3: size X, DATA_4: size Y, DATA_5: width. Hexagon with vertical left and right edges (first vertex at 90 degrees). |
|
DATA_1: center X, DATA_2: center Y, DATA_3: size X, DATA_4: size Y, DATA_5: width. Regular octagon sized across flats with horizontal and vertical sides. |
|
DATA_1: position X, DATA_2: position Y, DATA_3: rotation (degrees), DATA_4:
mirror ( |
Graphic Types
The GRAPHIC_DATA_10 field (when present) classifies the graphic element’s connectivity role.
| Value | Meaning |
|---|---|
|
Connected copper element |
|
Unconnected element |
|
Shape definition (treated as non-connected) |
|
Void/cutout in a copper area (treated as non-connected) |
|
Polygon fill (treated as non-connected) |
Record Tag Format
The RECORD_TAG field groups related graphic primitives. It contains space-separated
integers: "id seq [subseq]". All primitives sharing the same id belong to the
same logical object (a trace, a zone outline, or a graphic group). The seq value
orders primitives within the group. The optional subseq provides a third level of
ordering.
Pad Shape Types
The PADSHAPE1 field in EXTRACT_PADSTACKS defines the pad geometry. Only record 1 (the primary copper layer) sets the pad shape; subsequent records provide per-layer size overrides.
| Shape String | KiCad Mapping | Notes |
|---|---|---|
|
PAD_SHAPE::CIRCLE |
Height is forced equal to width. |
|
PAD_SHAPE::RECTANGLE |
Width and height are independent. |
|
PAD_SHAPE::ROUNDRECT |
Rectangle with rounded corners. |
|
PAD_SHAPE::RECTANGLE |
Height is forced equal to width. |
|
PAD_SHAPE::OVAL |
Oblong pad (stadium shape). |
|
PAD_SHAPE::RECTANGLE |
Mapped to rectangle with an octagon flag. The importer sets an internal flag to chamfer the corners. |
|
PAD_SHAPE::CUSTOM |
References a custom pad shape defined in the EXTRACT_PAD_SHAPES section. PADSHAPENAME provides the shape identifier. |
Enumerations
Component Class (COMP_CLASS)
| Value | Meaning |
|---|---|
|
Input/output component |
|
Integrated circuit |
|
Discrete component |
Any other value maps to no classification.
Symbol Type (SYM_TYPE)
| Value | Meaning |
|---|---|
|
Standard component package |
|
Mechanical element (mounting hole, heatsink, etc.) |
|
Drawing format element |
|
Drafting annotation |
Any other value maps to no type.
Layer Mapping
The importer assigns KiCad layers based on a combination of layer ordering (for copper layers) and name pattern matching (for technical layers).
Copper Layers
Conductive layers are collected and sorted by their LAYER_SORT index. The first conductive layer becomes F.Cu, the last becomes B.Cu, and intermediate layers are assigned sequential inner copper layer IDs.
Technical Layers
Non-conductive layers are mapped by name pattern matching.
| Name Pattern | KiCad Layer |
|---|---|
Contains |
B.SilkS |
Contains |
F.SilkS |
Contains |
B.Mask |
Contains |
F.Mask |
Contains |
B.Paste |
Contains |
F.Paste |
Contains |
Dwgs.User |
Synthetic Layers
The importer creates additional layer mappings that are not present in the Fabmaster file:
| Name | KiCad Layer |
|---|---|
|
F.Fab |
|
B.Fab |
|
F.CrtYd |
|
B.CrtYd |
User Layers
Layers that do not match any known pattern (excluding AUTOSILK) are assigned to
User_1 through User_9 in order of appearance. Each assignment increments the user
layer index by 2. Layers beyond User_9 are disabled and their elements are not
imported.
Zone Processing
Zones in Fabmaster come in two forms: outline records with no net code, and fill records with a net code. The importer uses the outlines and determines net assignment by geometric overlap matching. For each unnetted zone outline, the importer counts how many vertices of the outline lie on edges of netted fill zones on the same layer. The net with the highest match count is assigned to the outline.
After net assignment, the original fill-only zones are removed from the board. Zone priorities are ordered by bounding box area, with larger zones receiving lower priority so that smaller zones can cut into them at overlapping regions.
Board Outline
Zone records on the OUTLINE or DESIGN_OUTLINE layer are treated as board edge
geometry and mapped to the Edge.Cuts layer.
Imported Elements
-
Padstacks with shapes (circle, rectangle, rounded rectangle, square, oblong, octagon, custom) including drill definitions with plated/unplated distinction, per-layer sizes, and pad offsets
-
Traces and arcs on copper layers with width and net assignment
-
Vias with through-hole, blind, and buried type detection based on copper layer span
-
Component placement with position, rotation, mirroring, and classification (IO, IC, discrete, mechanical)
-
Part number, value, tolerance, and voltage fields per component
-
Net-to-pin mapping with power and ground pin flags
-
Copper zones with hole support, net assignment by geometric overlap matching, and priority ordering by bounding box area
-
Route keepout and via keepout rule areas
-
Board outline on the design outline layer mapped to Edge.Cuts
-
Graphics (lines, arcs, circles, rectangles, text, oblongs, crosses, and polygon shapes) at both board and component level
Limitations
-
The FABMASTER_EXTRACT_PINS section (older pin format without SYM_MIRROR) is detected but not processed.
-
The
processSymbolsfunction is declared but not implemented. -
Device type, component value, and tolerance text fields from trace-class records are not imported to avoid overlapping text.
-
Non-standard layers map to User_1 through User_9; more than five additional layers exceed the available user layer slots.
-
Custom pad shapes are only processed for the primary copper layer; inner layer custom pad shapes are not imported.
-
The format does not distinguish between open polylines and closed polygons. The importer uses a heuristic (checking if start and end points coincide) that may not always be correct.
-
Material and dielectric properties from the layer stackup are parsed but not applied.
-
Footprint library browsing is not supported; Fabmaster files are board-import only.