Skip to content

Releases: wafertools/wafermap

v0.33.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 10:07

Breaking

  • sectorCount is 4, 8 or 16. The compass names cover 16 bearings, so 32 has no names to give its sectors;
    it is corrected to the default with an 'analysis-option-corrected' warning, like any other unusable value.

Changed

  • An expanded map's window widens for the Summary panel. Opening the panel in a map's Expand modal, or in a wafer
    opened from a gallery, makes the window wider by the room the panel needs, so the map keeps its size instead of
    giving up more than half its width; closing the panel narrows it again. The window stays within the screen (a
    floating window moves left if it would run off the edge), does nothing when maximised, and leaves a width the user
    has dragged it to. A wafer opened in a separate browser window is resized the same way where the browser allows it.
  • The report builders load when a report is opened. The Summary panel's report button and the gallery's load
    renderSummaryReport with a dynamic import() instead of with the map, which takes about 10 KB gzipped out of what
    rendering a map downloads (core is ~143 KB with this release's additions); the first report opens a moment later while it loads.
    renderWaferReportHtml and renderLotReportHtml are unchanged public exports.
  • The Summary panel leads into the report, and the report acts on the map. "What stands out" ends with a Full
    report
    link that opens the same report the Summary report button does, which begins with that same section. In
    a report opened from the panel, a click on a finding's row closes it and shows that finding on the map, as its
    row in the panel does (on a lot report that is split into several groups, a finding the panel does not hold is
    ignored). Opened on its own, the report is a plain page and its rows do nothing.
  • The reports and the Summary panel count and order bins, findings and statistics the same way. One count of dies
    per bin (partial and edge-excluded dies left out) and one order (pass bins first, then fail bins by count) feed the
    panel's bars and the reports' tables, under one title that states the population ("Hard Bin Breakdown — % of dies
    (N=…)"); the reports show the soft-bin breakdown as well when the data has soft bins, in the same columns for a
    wafer and a lot. The reports' findings table is arranged as the panel's list is: each spatial pattern with the
    findings it explains beneath it, then the rest by region, most severe first. The wafer report's Test Values table
    has the panel's full columns (N, min, quartiles, median, mean, max, σ) and the share of dies inside each test's
    limits; a lot's has N, min, mean, max, σ (pooled exactly) and limit yield, and says why it has no quartiles. The
    lot overview names the unweighted mean of wafer yields "Mean per-wafer yield" everywhere.
  • The Summary panel and the HTML reports read yields the same way. One computation gives each wafer's
    difference from the lot median (with the lot's outlier rule naming the outliers) and each ring or quadrant's
    difference from the wafer or lot it divides. The panel's wafer and region rows print that difference in points
    and tint a shortfall of 1, 2 or 4 or more points, as the report's tables do; the report's wafer table says
    "low outlier" in words, as the panel always has. The panel's findings mark severity as three dots filled by level
    rather than a colour-only dot, as the reports do. The reports draw bin bars in the colour the map gives that bin
    (the live colours when opened from a panel, the default palette otherwise).
  • The Summary panel opens with "What stands out", the same synthesis the HTML reports open with (a headline, up to
    three items ranked by the dies each costs, an "also" line, and what was compared), in place of the findings
    narrative above the findings list. It is a section of its own, so a clean wafer or lot says "Nothing stands out"
    where the findings list is absent. The names in it (a region, a bin) select that finding on the map; the Findings
    section's Detail button opens the same sentences above the full list. Where the wafers in a lot were judged by
    different pass bins, the items rest on yield alone and name no pass bins.
  • The weakest finding severity is called "Minor" where it is shown (the Summary panel's severity filter and the
    reports); the value in StatsFinding.severity is unchanged.
  • A merged region on a wafer is graded with its constituents' multiple-testing correction. The merged finding's
    p-value is multiplied by the weakest constituent's adjusted-to-raw ratio before severity is assigned, the same rule the
    lot merge applies, and stats.adjustedPValue is set. A merge can no longer grade more severe than the correction its
    parts carry allows, so a few merged findings show a lower severity.
  • A lot stack by standard deviation or count carries no test limits. Its values are spreads and tallies, not
    measurements of the test, so result.testDefs has the limits removed and nothing is judged against them: no
    limit fail findings, limit yield, capability index or out-of-spec colouring. Stacks by mean, median, minimum
    and maximum keep them.
  • A sector run and a quadrant over the same part of the wafer are one finding. "Sectors W–S" and
    "Quadrant SW" make one statement, so the one with the smaller p-value is shown and the other is listed
    under it (absorbedIds). They must be the same comparison (metric, variable and direction) and cover
    angles that overlap by at least three fifths of their union, by geometry. A single sector inside a
    quadrant, and a mean against a limit fail rate, stay separate. Wafer and lot findings follow the same rule.
  • Lot findings merge adjacent regions. A run of adjacent sectors, quadrants or rings that carries one
    signal is one lot finding ("Sectors E–N", "Rings 1–2"), as on a single wafer. Each wafer's regions are
    added up, the rest being the wafer's other regions, and those per-wafer figures are combined across the
    wafers as the single regions are (Stouffer's Z, the same gates). The run is adjusted with the
    Benjamini–Hochberg multiplier of its weakest region and is reported only if it passes on its own;
    otherwise its separate rows stay. "N/M wafers" counts the wafers where the merged region itself differs at
    the analysis's significance level.
  • A merged run is compared with the rest of its region family. As for each region on its own: sectors
    leave out the centre dies, so a merged sector run's "rest of the map" is the other sectors' dies.
  • Adjacent regions merge per metric. A test's mean finding and its limit fail rate are kept apart when
    adjacent sectors, quadrants and rings are merged, so a run such as sectors E, NE and N reads as one
    finding ("Sectors E–N"), and a quadrant with both a mean and a limit finding lists both. A run of limit
    fail rates merges too, recomputed over the union of its regions. A run of quadrants is named in order
    round the wafer.
  • A lot's spatial pattern is decided from the lot. analyzeWaferLot stacks the lot's wafers by die
    position, finds the positions where failures recur (an exact binomial test on each position's 3×3
    neighbourhood, Benjamini–Hochberg across positions), classifies that area with the same classifier and
    thresholds as a single wafer, and reports the pattern once, on every wafer whose failures are concentrated
    in it. A pattern visible on every wafer is reported on every wafer under one label, with the ring, edge-arc
    and cluster findings it explains listed under it. Wafers on a different grid, and lots too small for
    failures to recur significantly, keep the per-wafer count. The wafer-level classifier and its thresholds
    are unchanged (WM-811K: 64.1% overall).
  • Outlier wafers have one rule, read by both the lot findings and the Summary panel's
    Wafer Yield list, so they always name the same wafers. From 3 to 7 wafers it is Dixon's Q
    test on the lowest and highest wafer (95% → notable, 99% → unusual); from 8 wafers,
    Tukey's fences over per-wafer yield (1.5 × IQR → notable, 3 × IQR → unusual). Either
    way the wafer must also be at least 3 yield points from the median. The
    finding's stats.method is 'dixon-q' or 'tukey-fence', and effect.effectSize is
    that test's statistic (Q, or the distance from the median in IQR units). The Wafer Yield
    list labels high outliers as well as low ones.

Added

  • Compact layout for multi-project wafers. A Compact layout row in the Overlays menu, on a single map and on the
    gallery, draws the dies on a grid with the empty rows and columns removed and each group of dies outlined, so a
    sparse layout fills the map instead of leaving each die a few pixels wide. It is offered when the occupied columns
    and rows repeat at a regular pitch, or at the reticleConfig width and height, or a multiple of it (a product on
    every second reticle), when every wafer supplies the same ones; viewOptions: { compact: true } applies it regardless. Only the layout changes:
    every die is still drawn and counted, so legends, yield and statistics are the same, and hover text and axis
    labels give original die coordinates. A die with no bin keeps its place. The notch marker follows rotation and
    flips, and so does the XY indicator, which sits in a margin beside the grid. A gallery builds one layout from every
    wafer shown, so its cards stay comparable. The wafer outline, ring, quadrant and reticle overlays describe the
    physical wafer and are not drawn in this layout.
  • Rotating or flipping a map switches the XY indicator on. The first Rotate or Flip from the Orientation menu, on a
    single map or a gallery, turns on the +X/+Y arrows in whatever layout is showing, so the reader can see which way
    the die coordinates run. They stay on until switched off in the Overlays menu, and Reset orientation does not
    change them.
  • **An Axis labels row in the Ov...
Read more

v0.32.0

Choose a tag to compare

@github-actions github-actions released this 27 Sep 14:45

Breaking

  • Input values of the wrong type are treated as missing. A bin, site number or test value
    that is not a number, or a pass/fail verdict that is not true/false, is left out of the
    die — the same rule as a value outside the STDF V4 ranges — and still reported as
    input-values-not-numbers. A die whose only bin was text therefore has no verdict rather
    than a fail, which can change yield for such input. The input objects are not modified.
  • Test values on dies from buildWaferMap are read-only snapshots. A map holds test values and
    verdicts as one column per test. die.testValues and die.testPass on a built die build a frozen
    object from those columns on each read, keeping nothing on the die, so die.testValues !== die.testValues. Assigning to either field throws a TypeError; changing a key of the frozen
    object throws in strict-mode code and is ignored otherwise. Pass the values to buildWaferMap,
    or copy the die with your own object ({ ...die, testValues: mine }). A spread, structuredClone or JSON.stringify of a built die
    gives plain objects with the same values. A die no longer shares the input record's
    testValues/testPass objects, so changing the input after the build does not change the map.
    Dies a host builds itself keep ordinary objects.
  • Pre-built dies get the same input checks as results. Wrong-type and out-of-range
    values are treated as missing, and a die whose coordinates STDF cannot store is kept as an
    unpositioned die.
  • WaferMapResult.view is removed. It was marked @internal: the renderers build their own
    draw list whenever they draw, so a result no longer carries one. Read the result's own fields
    (plotMode, metadata, isLotStack, hbinDefs, sbinDefs, testDefs). This makes each
    result smaller (about 86 bytes less per die) and roughly halves the copy the Web Worker makes of
    a result. The internal dataAxisFlip field takes its place.

Changed

  • The legend filters to several bins or metadata values at once. Ctrl/Cmd+click on a legend
    entry — the map's legend or the gallery's strip, where Ctrl/Cmd+Enter/Space works from the
    keyboard — adds or removes a value; a plain click shows only that value, or clears the
    filter when it is the only one shown. highlightBin accepts number | number[] and
    highlightMetadataValue accepts string | string[].
  • A finding and the legend filter agree. Clicking a finding about a bin filters the legend
    to that bin, and one about yield or a test clears the filter — in a single map and in the
    gallery alike. Changing the legend filter releases the finding, as changing the selection
    does, including a selection made on a gallery card while a lot finding is active.
  • Lot regional findings are tested on all wafers' data together. A yield, bin,
    functional pass-rate, limit-fail or test-value difference in a region is combined across
    every wafer (Stouffer's Z over each wafer's own test, weighted by die count) and reported
    with the wafer analysis's gates, redundancy collapse and opposite-region re-test, instead of
    by counting wafers whose own analysis reported it — a pattern present on every wafer but
    too faint on some to pass alone is the lot's pattern. The sentence gives the lot's figure
    and "higher/lower on N/M wafers, all wafers' data combined", N counting the wafers whose
    region differs in that direction; stats.method is 'stouffer-z'. Clusters, edge arcs and
    spatial-pattern labels are still counted by the wafers that report them. Lot findings keep
    absorbed restatements in the list, marked by absorbedIds, as wafer findings do.
  • Selected dies are shown by fading the rest of the map. Every unselected die is faded
    towards the map background and the selection is outlined, so selected dies keep their full
    colour and it is clear which dies are selected whatever the selection's shape — a block, a
    ring, an edge arc. A finding highlighted from the Summary panel, a gallery lot finding and
    setSelection are drawn the same way. The fade and outline sit under the axes and legend.
  • A map opens in select mode. A drag draws a selection box; hold Space and drag, use the
    arrow keys, or choose Pan in the toolbar to pan.
  • Clicking the only selected die again clears the selection. Clicking a die inside a
    larger selection still selects just that die.
  • Changing the selection on the map releases an active finding. A click, box select,
    right-click, Esc or clearSelection clears the Summary panel's active finding and its bin
    highlight, so the panel never shows a finding the map no longer highlights.

Fixed

  • Regional findings report patterns confined to one region. A bin, limit-fail or
    functional-fail rate that is zero in the rest of the wafer and raised in a region (a bin
    found only at the edge) counts as the largest relative change for the effect gate and for
    severity, for every region family: rings, quadrants, sectors, reticle positions and test
    sites. On a lot whose wafers carry bin 2 only at the edge, the lot finding reads "seen on
    8/8 wafers".
  • Yield and functional pass-rate findings are judged by their failure rate. The relative
    effect of a pass rate is measured on its failures: yield 98% → 94% is failures 2% → 6%, and
    reaches the same verdict as the bin rate of the same dies.
  • A region is not reported as deviating only because another region deviates more. A
    finding opposite in direction to a stronger finding for the same variable and region family
    must still hold when compared with the rest of the wafer without that region, so an edge
    rich in a bin, a limit fail or high test values no longer makes the inner rings read as low
    in it (or high in yield).
  • The soft bin that restates yield is absorbed into the yield finding, as the hard pass bin
    is: the one soft bin every passing die carries and no failing die does.
  • An edge ring made of scattered fails is classified as an edge ring. The spatial-pattern
    classifier recognises an edge ring from the failing dies' positions — most fails at the rim
    and spread round at least 60% of it — when no connected group of fails is large enough to
    judge shape by, and before the scratch rule, so a short run along the rim is not a scratch.
    Against WM-811K: detection 86.4%, edge-ring recall 75% (precision 92%), scratch recall 24%.
  • Lot spatial-pattern rows count related labels together and state the lot's figures.
    Edge-ring and edge-local wafers count as one edge pattern, and centre and donut as one,
    naming each label's wafer count ("Spatial pattern: edge (edge-ring on 5, edge-local on 2) —
    seen on 7/13 wafers"); the sentence gives the lot's count, not any one wafer's confidence or figures.
    The gallery highlights each counted wafer's failing dies.
  • Findings, their severities and "seen on N wafers" counts can change.

Performance

  • Insights no longer blocks while its test statistics are computed. The Overview's Test Values
    table is built in slices, showing "Computing test statistics…" until it is ready, and when the
    gallery's summary panel is computing the same statistics at the time, the two share the one
    calculation instead of each doing it.
  • Gallery cards are drawn only when on screen. A card below the fold keeps its map up to date
    and is drawn as it scrolls into view. Printing and the gallery PNG draw every card first, so
    both still show the whole gallery. On a 25-wafer, 266k-die lot, with 4 cards on screen:
    switching to value mode takes 0.4 s in Chrome (was 1.1 s) and 0.5 s in WebKit (was 2.0 s);
    the gallery opens in 1.8 s and 2.0 s.
  • The gallery draws about twice as fast in WebKit (the desktop app on Linux and macOS, and
    Safari). Die fills and outlines are drawn as many small canvas paths rather than one per
    colour, which WebKit rasterises far faster. On a 25-wafer, 266k-die lot the gallery opens in
    4.0 s (was 7.0 s) and a switch to value or stacked mode takes 1.8–2.3 s (was 3.8–4.4 s).
    Chrome draws identical pixels; in WebKit only anti-aliased edge pixels differ.
  • The lot Summary report opens about five times faster on a large lot. Its Test Values table
    finds each test's minimum, mean and maximum in one pass instead of sorting every die's value.
    On a 25-wafer, 266k-die lot the "Summary report" button takes 0.4 s in Chrome (was 6.0 s) and
    0.9 s from click to report in WebKit (was 4.7 s). The report is unchanged (compared as HTML).
    Boxplot quartiles and the histogram's outlier range are found the same way as the Summary
    panel's, by selection, with the same figures.
  • Test-value analysis (enableTestValueAnalysis) is two to three times faster on large lots.
    Spec-limit findings count each region's dies in one pass instead of re-reading every die for
    every region, the test list is read column by column, and per-test statistics find their
    quartiles by selection. Findings are unchanged (compared byte for byte on a 266k-die lot with
    5,289 findings). On that lot: 18.9 s → 7.2 s in Chrome, 25.6 s → 10.7 s in WebKit.
  • Analysis is about a third faster in Chrome on large lots. Merging findings in adjacent
    regions, pairing hard and soft bins that cover the same dies, and assigning dies to regions
    now compare die positions as numbers rather than as a text key per die. Findings are
    unchanged (compared byte for byte on a 266k-die lot). On that lot, load-time analysis takes
    2.5 s in Chrome (was 3.7 s).
  • Stacked modes and mode switches in the gallery are faster. Stacked cards key die positions by
    number rather than by a string per die, and a map no longer rebuilds a key for every die on
    each redraw unless dies are selected. On a 25-wafer, 266k-die lot in Chrome: switching to
    stacked bins 2.0 s → 1.6 s, to value mode 1.3 s → 1.1 s.
  • The lot summary panel's test statistics are computed about three times faster. Th...
Read more

v0.31.0

Choose a tag to compare

@github-actions github-actions released this 25 Sep 14:32

Breaking

  • The 74 deprecated exports are removed: the 73 deprecated in 0.30.0 (the low-level drawing
    pipeline, the chart-data builders, the region builders and the helpers exported by accident)
    and renderFindingsReportHtml, deprecated in 0.30.3. Each named its replacement in a console
    notice. Upgrading lists every name with
    what to use instead; the main replacements:

    Removed Use instead
    resolveBinColors, getBinColorScheme binColorsForMaps(results), or getBinColors() on a map or gallery controller
    valueToViridis, valueToGreyscale, getValueColorScheme resolveValueColorFn(name, reversed)
    buildYieldData, buildYieldDataCombined lotYieldSeries on analyzeWaferLot's result
    buildBinParetoData, buildBinClusterData stats.hardBinCounts, stats.softBinCounts
    buildCapabilityData, buildTestBoxplotData, buildTestTrendData, trendCentre stats.capability, stats.perTestStats, perWaferTestStats (with computePerTestStats)
    buildTestPassRateData, hasJudgeableTests, computeFunctionalYield stats.testSpecYield, stats.testFlagYield, stats.functionalYield
    buildRegionYieldData, buildRingRegions, buildQuadrantRegions, classifyDie, getRingLabel stats.regionYield
    classifyPattern stats.spatialPattern
    renderSummaryReportHtml, renderLotSummaryReportHtml, renderFindingsReportHtml renderWaferReportHtml(result, summary?), renderLotReportHtml(results)
    openHtmlReport openReportModal(html), setReportOpener
    createWafer, generateDies, clipDiesToWafer buildWaferMap({ layout: true, waferConfig, dieConfig })
    aggregateValues, aggregateBinCounts, getUniqueBins buildWaferMap's lotStack
    STANDARD_WAFER_DIAMETERS_MM, resolveGridPitch buildWaferMap's standardDiameters; each die's width/height
    getDieTestValue, isParametricTest, isPositionedDie, metadataCategoricalValue die.testValues?.[n], testType !== 'F', hasPosition, metadataDisplayValue

    buildView, toCanvas, buildHoverText, buildMapTitle, the transform and affine*
    helpers, the histogram, scatter and correlation data builders, the sector, reticle and
    test-site region builders, parseRegionKey, contrastTextColor, dieHasTestData,
    resolveMetadataColumns, discoverDieMetadataKeys, buildDieListSection and
    DEFAULT_FACET_CURATION have no public replacement: the renderers and the analysis do that
    work themselves.

  • 63 types that belonged only to removed functions are removed with them, among them the
    chart-data types, the draw-list types (View, ViewOptions, ViewRect and the rest),
    PitchResult, ToCanvasResult, HitTarget, DieListOptions and the geometry inputs
    WaferSpec, DieSpec and ReticleSpec. Upgrading lists them all. PlotMode stays.

  • buildWaferMap takes one argument. The second (WaferMapOptions) set only the starting
    result.plotMode, which the Web Worker never passed, so a build on and off the main thread
    could start in different modes. Set the starting mode with renderWaferMap's or
    renderWaferGallery's viewOptions.plotMode.

  • downloadFilename is a prefix for every saved file, on renderWaferMap and
    renderWaferGallery: <downloadFilename>_W05_hard-bin.png, <downloadFilename>_W05_die-list.csv.
    It applies to CSVs, charts, gallery cards and detached windows as well as the map's or gallery's
    PNG, which it no longer names outright. Parts the prefix already names are not repeated. A host
    that matched the exact name its onSaveImage receives should match on the prefix.

  • Values outside the STDF V4 ranges are treated as missing. 0.30.4 reported them with the
    input-values-outside-stdf warning and used them as given; buildWaferMap now leaves them out,
    and the warning says what it did:

    • a bin outside 0–32767 or not a whole number: the die has no bin (so it is neither pass nor fail);
    • a coordinate outside ±32767 or not a whole number: the die has no position, in either axis;
    • a test number outside 0–4294967295: that test is left out of every die and of testDefs;
    • a test value that is not finite: that value is left out;
    • a site number outside 0–255: the die has no site;
    • a waferConfig.orientation other than 0, 90, 180 or 270 (or an equivalent such as −90): the
      map is built at 0. WaferConfig.orientation is typed 0 | 90 | 180 | 270.

    The caller's input objects are not modified. A derived test whose testNumber is outside
    0–4294967295 is dropped with a derived-test-invalid warning.

  • WaferViewOptions.showPartialDies and isYieldEligibleDie's includePartial are removed.
    No map buildWaferMap builds has partial dies, so neither had anything to act on. A saved
    preference that still carries showPartialDies is ignored. Partial dies a host supplies
    itself are drawn in muted grey and always left out of yield.

Added

  • Insights charts draw spec limits as well as test limits. The boxplot, histogram,
    wafer-to-wafer trend and scatter show a test's spec limits (specLow/specHigh, labelled
    LSL/USL, long dashes) beside its test limits (Lo/Hi limit, short dashes). When a test has
    both, a Limits choice (Test + spec, the default; Test limits; Spec limits; None) applies to
    all four charts. Labels that would overlap move to a second row, Axis includes limits
    covers every limit shown, and the scatter marks limits outside its plotted range at the edge,
    as the other charts do. The wafer map still judges pass/fail by the test limits.
  • Chart gridlines are lighter (the border colour at 40% opacity), so the data and the limit
    lines stand out from the grid in every theme. The scatter draws its limits in the same amber
    as the other charts, and its limit labels sit on a panel-coloured backing where lines cross
    them.

Changed

  • The data-and-stats layer is ~49 KB gzipped, from ~61 KB, with the removed exports gone.

Fixed

  • Charts opened from a gallery card's right-click menu are saved under the card's lot and
    wafer
    , as they are from a single map.

Documentation

  • New page, Upgrading: what to change
    for each breaking release, starting with 0.31.0.
  • Every version has a GitHub release, created when its tag is pushed, with that version's
    changelog section as its notes.

npm: @wafertools/wafermap@0.31.0 ·
Upgrading ·
What's New ·
Full changelog