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

A

Header row. Defines column names for the section that follows.

S

Data row. Contains one record of section data.

J

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

MILS

Thousandths of an inch (default if no unit is found)

MILLIMETERS

Millimeters

MICRONS

Micrometers. The importer applies a 10x scale relative to the millimeter conversion path.

INCHES

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

REFDES

COMPCLASS

 — 

EXTRACT_REFDES

NETNAME

REFDES

 — 

EXTRACT_NETS

CLASS

SUBCLASS

(empty)

EXTRACT_BASIC_LAYERS

GRAPHICDATANAME

GRAPHICDATANUMBER

 — 

EXTRACT_GRAPHICS

CLASS

SUBCLASS

GRAPHICDATANAME

EXTRACT_TRACES

SYMNAME

PINNAME

 — 

FABMASTER_EXTRACT_PINS (detected but not processed)

SYMNAME

SYMMIRROR

PINNAME

EXTRACT_PINS

VIAX

VIAY

 — 

EXTRACT_VIAS

SUBCLASS

PADSHAPENAME

 — 

EXTRACT_PAD_SHAPES

PADNAME

 — 

 — 

EXTRACT_PADSTACKS

LAYERSORT

 — 

 — 

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: ~DRILL for drill definition, TSM/BSM for top/bottom solder mask, TSP/BSP for top/bottom solder paste. INTERNAL_PAD_DEF rows are skipped.

FIXFLAG

string

Fixed pad flag.

VIAFLAG

string

V if this padstack is a via pad.

PADSHAPE1

string

Pad shape name or drill hit value (on ~DRILL rows). See the pad shapes table below.

PADWIDTH

decimal

Pad width in section units. On ~DRILL rows, this is the drill X dimension.

PADHGHT

decimal

Pad height in section units. On ~DRILL rows, this is the drill Y dimension.

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 ~DRILL rows, a name starting with P indicates the drill is plated. For SHAPE pads, this references a custom pad definition.

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 "id seq" that groups primitives into a single pad shape.

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., In.Cu3 or Dielectric3).

LAYER_ARTWORK

string

POSITIVE or NEGATIVE artwork polarity.

LAYER_USE

string

Layer usage designation.

LAYER_CONDUCTOR

string

YES or NO. Determines whether the layer is conductive.

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 AIR are skipped.

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. ETCH marks the layer as conductive with positive polarity. ANTI ETCH marks the layer as conductive with negative polarity. All other values create non-conductive layers.

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

YES if this via is a test point.

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

YES if the symbol is mirrored to the back side.

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

YES if this pin is a test point.

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: REF DES records become footprint reference designator positions. DEVICE TYPE, COMPONENT VALUE, and TOLERANCE records are skipped to avoid overlapping text. All other classes become traces or zones.

SUBCLASS

string

Layer name.

GRAPHIC_DATA_NAME

string

Graphic primitive type.

GRAPHIC_DATA_NUMBER

integer

Primitive sequence number.

RECORD_TAG

string

Space-separated "id seq [subseq]" grouping tag.

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 "id seq [subseq]" grouping tag.

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

YES if this pin is a ground pin.

PIN_POWER

string

YES if this pin is a power pin.

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

YES if the component is placed on the back side.

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

LINE

DATA_1: start X, DATA_2: start Y, DATA_3: end X, DATA_4: end Y, DATA_5: width

ARC

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 (COUNTERCLOCKWISE or clockwise by default)

CIRCLE

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.

RECTANGLE

DATA_1: corner 1 X, DATA_2: corner 1 Y, DATA_3: corner 2 X, DATA_4: corner 2 Y, DATA_5: fill flag (1 = filled)

FIG_RECTANGLE

DATA_1: center X, DATA_2: center Y, DATA_3: width, DATA_4: height, DATA_5: fill flag (1 = filled). Unlike RECTANGLE, coordinates specify center and size rather than two corners.

SQUARE

Same format as FIG_RECTANGLE. Processed identically.

OBLONG_X / OBLONG_Y

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.

CROSS

DATA_1: center X, DATA_2: center Y, DATA_3: size X, DATA_4: size Y, DATA_5: width

TRIANGLE_1

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.

DIAMOND

DATA_1: center X, DATA_2: center Y, DATA_3: size X, DATA_4: size Y, DATA_5: width. Square rotated 45 degrees.

HEXAGON_X

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).

HEXAGON_Y

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).

OCTAGON

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.

TEXT

DATA_1: position X, DATA_2: position Y, DATA_3: rotation (degrees), DATA_4: mirror (YES/NO), DATA_5: alignment (LEFT, CENTER, RIGHT), DATA_6: font specification (space-separated: size, font, height, width, italic, char spacing, line spacing, thickness), DATA_7: text string

Graphic Types

The GRAPHIC_DATA_10 field (when present) classifies the graphic element’s connectivity role.

Value Meaning

CONNECT

Connected copper element

NOTCONNECT

Unconnected element

SHAPE

Shape definition (treated as non-connected)

VOID

Void/cutout in a copper area (treated as non-connected)

POLYGON

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

CIRCLE

PAD_SHAPE::CIRCLE

Height is forced equal to width.

RECTANGLE

PAD_SHAPE::RECTANGLE

Width and height are independent.

ROUNDED_RECT

PAD_SHAPE::ROUNDRECT

Rectangle with rounded corners.

SQUARE

PAD_SHAPE::RECTANGLE

Height is forced equal to width.

OBLONG / OBLONG_X / OBLONG_Y

PAD_SHAPE::OVAL

Oblong pad (stadium shape).

OCTAGON

PAD_SHAPE::RECTANGLE

Mapped to rectangle with an octagon flag. The importer sets an internal flag to chamfer the corners.

SHAPE

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

IO

Input/output component

IC

Integrated circuit

DISCRETE

Discrete component

Any other value maps to no classification.

Symbol Type (SYM_TYPE)

Value Meaning

PACKAGE

Standard component package

MECHANICAL

Mechanical element (mounting hole, heatsink, etc.)

FORMAT

Drawing format element

DRAFTING

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 SILK (but not AUTOSILK) or DISPLAY, with B

B.SilkS

Contains SILK (but not AUTOSILK) or DISPLAY, without B

F.SilkS

Contains MASK or MSK, with B

B.Mask

Contains MASK or MSK, without B

F.Mask

Contains PAST, with B

B.Paste

Contains PAST, without B

F.Paste

Contains NCLEGEND

Dwgs.User

Synthetic Layers

The importer creates additional layer mappings that are not present in the Fabmaster file:

Name KiCad Layer

ASSEMBLY_TOP

F.Fab

ASSEMBLY_BOTTOM

B.Fab

PLACE_BOUND_TOP

F.CrtYd

PLACE_BOUND_BOTTOM

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 processSymbols function 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.