November 30, 2016
Steve DiBartolomeo
Artwork Conversion Software, Inc.
The SEMI E-142 map specification is quite powerful and flexible. That enables the format to serve many different purposes, but also makes it quite difficult to write a comprehensive and robust reader. While we read and write most E-142 files, there are a number of possible legal files whose structure we do not support. If you enounter such a file, you can send it to Artwork and we will determine how to best support it.
If you open a SEMI-E142 map file with a text editor, you will see a structure similar to this one.
The Header Information
<?xml version="1.0" encoding="ISO-8859-1"?>
<MapData xmlns="urn:semi-org:xsd.E142-1.V1005.SubstrateMap">
<Layouts>
<Layout LayoutId="WaferMap" DefaultUnits="mm" TopLevel="true">
<Dimension X="1" Y="1" />
<DeviceSize X="200.000000" Y="200.000000" />
<ChildLayouts>
<ChildLayout LayoutId="LAYOUT" />
</ChildLayouts>
</Layout>
<Layout LayoutId="LAYOUT" DefaultUnits="mm">
<Dimension X="320" Y="309" />
<StepSize X="0.630000" Y="0.640000" />
<ProductId> TESTDEVICE_00 </ProductId>
</Layout>
</Layouts>
<Substrates>
<Substrate SubstrateType="Wafer" SubstrateId=" XXX555ABCD ">
<LotId> NNN014506 </LotId>
<GoodDevices>68635</GoodDevices>
</Substrate>
</Substrates>
<SubstrateMaps>
<SubstrateMap
SubstrateType="Wafer" SubstrateId=" XXX555ABCD "
LayoutSpecifier="WaferMap/LAYOUT" Orientation="180"
OriginLocation="UpperRight" AxisDirection="DownLeft">
<Overlay MapName="SortGrade" MapVersion="1"
>
<BinCodeMap BinType="Ascii" NullBin="." MapType="2DArray">
<BinDefinitions>
<BinDefinition BinCode="X" BinDescription="BIN0" BinQuality="Pass" />
<BinDefinition BinCode="R" BinDescription="REF" BinQuality="Reference" />
<BinDefinition BinCode="-" BinDescription="SKIPDIE" BinQuality="Skip" />
<BinDefinition BinCode="E" BinDescription="UGLYDIE" BinQuality="Edge" />
<BinDefinition BinCode="X" BinCount="3609" BinDescription="BIN0" />
<BinDefinition BinCode="P" BinDescription="BIN1" BinQuality="Pass" />
<BinDefinition BinCode="F" BinDescription="FIRST_FAIL" BinQuality="Fail" />
</BinDefinitions>
The header is followed by the map data.
<BinCode>................................................................................EEEEEEEEEEEEE
<BinCode>........................................................................EEEEEEEEEEEEEEEEEEEEE
<BinCode>..................................................................EEEEEEEEEEEEEEEEEEEEEEEEEEE
<BinCode>.............................................................EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
<BinCode>........................................................EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
<BinCode>....................................................EEEEEEEEEEEEEEEEEEEEEEEEEEEEXXXXXXXXXXXXX
<BinCode>.................................................EEEEEEEEEEEEEEEEEEEEEEEXXXXXXPPPPPPPPPPPPPPP
<BinCode>..............................................EEEEEEEEEEEEEEEEEEEEXXXPPPPPPPPPPPPPPPPPPPPPPPP
<BinCode>...........................................EEEEEEEEEEEEEEEEEE-XPPPPPXPPPPPPPPPXPPPPPPPPPPPPPP
<BinCode>........................................EEEEEEEEEEEEEEEEEXXXXPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
<BinCode>.....................................EEEEEEEEEEEEEEEEXXXXXXXXPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
<BinCode>..................................EEEEEEEEEEEEEEEXXXXXXXXPPPXPPPPPPPPPXPPPPPPPPPPPPPPPPPPPPPP
<BinCode>................................EEEEEEEEEEEEEEXXXXXXXPPPPPPPXPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
<BinCode>..............................EEEEEEEEEEEEEXXXPPPPPPPPPPPPPPXPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
<BinCode>...........................EEEEEEEEEEEEEXXPPPPPPPPPPPPPPPPPPXPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
<BinCode>.........................EEEEEEEEEEEEEXPPPPPPPPPPPPPPPPPPPPPXPPPPPXPPPPPPPPPPPPPPPPPPPPPPPPPP
<BinCode>.......................EEEEEEEEEEEEXPPPPPPPPPPPPPPPPPPPPPPPPXPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
<BinCode>.....................EEEEEEEEEEEEPPPPPPPPPPPPPPPPPPPPPPPPPPPXPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
and at the end of the file all of the sections are closed:
</BinCodeMap>
</Overlay>
</SubstrateMap>
</SubstrateMaps>
</MapData>
The wafer generally has a flat or notch use to orient it correctly. We've seen some variation in the 0 and 180 interpretation but the one shown below is per the standard:
The wafer map is an array organized as rows and columns. However the so called origin where the row and columns are counted from can vary. Sometimes this origin is determined by the behavior of the wafer prober. Too often, there is no information in the file that clearly indicates the origin. Here is what should be included:
If not specified, E142 indicates that LowerLeft is the default and Axis direction default = UpRight.
There should always be at least one reference die referenced in the map data. We need to know two things for the reference information to be useful:
If there is more than one reference die then they should each have a unique name or identifier.
Each device is assigned to a bin. There are a number of allowed formats for the bin. These are:
ASCII - A single ASCII character (1 byte per die).
Decimal -- a 3 digit decimal in the range from 000-255; again taking up one byte per die
hexadecimal -- a 2 digit hexadecimal in the range from 00-FF (again taking up one byte per die
integer2 -- a 4 digit hexadecimal value in the range from 0000-FFFF taking up two bytes per die.
Spacing and Delimiters
1. When BinTytpe=Decimal there must be spaces added between each device and each row of devices should be on a new line:
000 001 001 002 001 002 001 001 002 002 001 000 000 002 001 001 001 001
2. When BinTytpe=ASCII, Hexadecimal or Integer2 there must not be spaces between bins and each row should be on a new line
NullBin
This is a special bin code that represents either non-existent die (since the wafer is round and the array is rectangular) or die that are simply not probed.
There are a number of ways to list out the bin ID's. Some are easily "man readable" and some not. If not specified in the file the default (according to the spec) is 2DArray.
2DArray
All the die in a row are represented in a single BinCode entry. The length of each row and the number of rows corresponds with the the row/column dimensions specified earlier in the file. Locations in the layout that do not contain a die (or a die that was probed) should be assigned to the NullBin value.
In the illustration above, any die position not labeled = 0. So the Map output would look like this:
<bincode>0000000</bincode> <bincode>000UXYX</bincode> <bincode>00UUUUU</bincode> <bincode>0UXXYXX</bincode> <bincode>0UXYXXX</bincode> <bincode>0XXXXYX</bincode>
Row/Column
This encoding relies on a starting XY array position and a length (number of die) followed by a list of bin values whose length is equal to the number of die. I guess the advantage here is that one does not have to explicitly list the null die locations.
So for the same illustration the encoding would look like this:
003 001 4 U X Y Z 002 002 5 U U U U 001 003 6 U X X Y X X 001 004 6 U X Y X X X 001 005 6 X X X X Y X
A carriage return/linefeed is not needed between the "rows" using this encoding but it would make the file easier to view manually.
003 001 4 U X Y Z 002 002 5 U U U U 001 003 6 U X X Y X X 001 004 6 U X Y X X X 001 005 6 X X X X Y X
It does not even require that there be any particular order to the column/row data as long as the origin is properly known.
Array Format
This format relies on the reading software knowing the column width and number of rows and then dividing the long string of bin values by row. According to the spec, the array starts at the top left. (Not sure how this interacts with other parameters such as the Array Origin.)The data structure is one long string of bin values.
and the data in the XML file might look like this:
000000000UXYX00UUUU0UXXYXX0UXYXXX0XXXXYX