@wafertools/wafermap 0.30.0 → 0.30.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +68 -9
- package/CHANGELOG.md +247 -0
- package/README.md +3 -3
- package/dist/packages/canvas-adapter/charts/barPanel.js +1 -1
- package/dist/packages/canvas-adapter/charts/binCluster.js +1 -1
- package/dist/packages/canvas-adapter/charts/boxplot.js +1 -1
- package/dist/packages/canvas-adapter/charts/capability.js +1 -1
- package/dist/packages/canvas-adapter/charts/chartShell.js +1 -1
- package/dist/packages/canvas-adapter/charts/correlation.js +2 -2
- package/dist/packages/canvas-adapter/charts/groupedBarPlot.d.ts +1 -0
- package/dist/packages/canvas-adapter/charts/histogram.js +1 -1
- package/dist/packages/canvas-adapter/charts/scatter.js +1 -1
- package/dist/packages/canvas-adapter/charts/testPassRate.js +1 -1
- package/dist/packages/canvas-adapter/charts/trend.js +1 -1
- package/dist/packages/canvas-adapter/chunked.d.ts +45 -0
- package/dist/packages/canvas-adapter/chunked.js +1 -0
- package/dist/packages/canvas-adapter/deprecated.d.ts +0 -3
- package/dist/packages/canvas-adapter/deprecated.js +1 -1
- package/dist/packages/canvas-adapter/dieList.js +1 -1
- package/dist/packages/canvas-adapter/exportName.d.ts +68 -0
- package/dist/packages/canvas-adapter/exportName.js +1 -0
- package/dist/packages/canvas-adapter/icons.js +2 -2
- package/dist/packages/canvas-adapter/index.d.ts +2 -1
- package/dist/packages/canvas-adapter/index.js +1 -1
- package/dist/packages/canvas-adapter/insightsTab.js +1 -1
- package/dist/packages/canvas-adapter/renderWaferGallery.d.ts +80 -3
- package/dist/packages/canvas-adapter/renderWaferGallery.js +1 -1
- package/dist/packages/canvas-adapter/renderWaferMap.d.ts +24 -2
- package/dist/packages/canvas-adapter/renderWaferMap.js +1 -1
- package/dist/packages/canvas-adapter/summaryPanel.d.ts +76 -15
- package/dist/packages/canvas-adapter/summaryPanel.js +3 -3
- package/dist/packages/canvas-adapter/toCanvas.js +1 -1
- package/dist/packages/canvas-adapter/toolbar.d.ts +6 -0
- package/dist/packages/canvas-adapter/toolbar.js +2 -2
- package/dist/packages/canvas-adapter/userGuideHtml.d.ts +1 -1
- package/dist/packages/canvas-adapter/userGuideHtml.js +15 -8
- package/dist/packages/canvas-adapter/version.d.ts +2 -2
- package/dist/packages/canvas-adapter/version.js +1 -1
- package/dist/packages/canvas-adapter/warnings.js +1 -1
- package/dist/packages/core/aggregates.js +1 -1
- package/dist/packages/core/deprecated.d.ts +8 -12
- package/dist/packages/core/deprecated.js +1 -1
- package/dist/packages/core/index.d.ts +1 -1
- package/dist/packages/core/index.js +1 -1
- package/dist/packages/core/utils.d.ts +67 -0
- package/dist/packages/core/utils.js +1 -1
- package/dist/packages/core/waferLabel.d.ts +12 -2
- package/dist/packages/core/waferLabel.js +1 -1
- package/dist/packages/renderer/binColors.d.ts +52 -0
- package/dist/packages/renderer/binColors.js +1 -1
- package/dist/packages/renderer/buildView.js +1 -1
- package/dist/packages/renderer/buildWaferMap.d.ts +30 -5
- package/dist/packages/renderer/buildWaferMap.js +1 -1
- package/dist/packages/renderer/deprecate.d.ts +7 -0
- package/dist/packages/renderer/deprecate.js +1 -1
- package/dist/packages/renderer/deprecated.d.ts +2 -2
- package/dist/packages/renderer/deprecated.js +1 -1
- package/dist/packages/renderer/index.d.ts +2 -1
- package/dist/packages/renderer/index.js +1 -1
- package/dist/packages/stats/analyzeWaferLot.js +1 -1
- package/dist/packages/stats/analyzeWaferMap.js +1 -1
- package/dist/packages/stats/capability.d.ts +72 -1
- package/dist/packages/stats/capability.js +1 -1
- package/dist/packages/stats/correlation.d.ts +30 -0
- package/dist/packages/stats/correlation.js +1 -1
- package/dist/packages/stats/deprecated.d.ts +30 -35
- package/dist/packages/stats/deprecated.js +1 -1
- package/dist/packages/stats/findingsNarrative.js +1 -1
- package/dist/packages/stats/index.d.ts +4 -2
- package/dist/packages/stats/index.js +1 -1
- package/dist/packages/stats/math.d.ts +27 -2
- package/dist/packages/stats/math.js +1 -1
- package/dist/packages/stats/normalizeInput.d.ts +10 -0
- package/dist/packages/stats/normalizeInput.js +1 -0
- package/dist/packages/stats/regions.d.ts +2 -0
- package/dist/packages/stats/regions.js +1 -1
- package/dist/packages/stats/renderFindingsReport.js +1 -1
- package/dist/packages/stats/renderSummaryReport.d.ts +39 -1
- package/dist/packages/stats/renderSummaryReport.js +27 -27
- package/dist/packages/stats/reportHtml.d.ts +0 -1
- package/dist/packages/stats/reportHtml.js +10 -10
- package/dist/packages/stats/summaryFigures.d.ts +47 -0
- package/dist/packages/stats/summaryFigures.js +1 -0
- package/dist/packages/stats/types.d.ts +118 -0
- package/llms.txt +12 -7
- package/package.json +2 -2
|
@@ -7,80 +7,75 @@ import { buildTestHistogramData as buildTestHistogramDataImpl, buildTestHistogra
|
|
|
7
7
|
import { buildScatterData as buildScatterDataImpl, buildScatterDataGrouped as buildScatterDataGroupedImpl } from './scatter.js';
|
|
8
8
|
import { buildYieldData as buildYieldDataImpl, buildYieldDataCombined as buildYieldDataCombinedImpl } from './yield.js';
|
|
9
9
|
import { buildBinParetoData as buildBinParetoDataImpl, buildBinClusterData as buildBinClusterDataImpl } from './binPareto.js';
|
|
10
|
-
/** @deprecated Removed in 0.31.0.
|
|
10
|
+
/** @deprecated Removed in 0.31.0. `analyzeWaferMap` and `analyzeWaferLot` now return Cp/Cpk/Pp/Ppk as `stats.capability` (enable `computePerTestStats`); a lot's uses the pooled within-wafer stddev. */
|
|
11
11
|
export declare const buildCapabilityData: typeof buildCapabilityDataImpl;
|
|
12
|
-
/** @deprecated Removed in 0.31.0.
|
|
12
|
+
/** @deprecated Removed in 0.31.0. It prepared data for the Insights correlation matrix, which wmap draws itself (`insights: { enabled: true }`); there is no data replacement yet. */
|
|
13
13
|
export declare const buildCorrelationMatrix: typeof buildCorrelationMatrixImpl;
|
|
14
|
-
/** @deprecated Removed in 0.31.0.
|
|
14
|
+
/** @deprecated Removed in 0.31.0. It prepared data for the Insights correlation matrix, which wmap draws itself (`insights: { enabled: true }`); there is no data replacement. */
|
|
15
15
|
export declare const filterCorrelationMatrix: typeof filterCorrelationMatrixImpl;
|
|
16
|
-
/** @deprecated Removed in 0.31.0.
|
|
16
|
+
/** @deprecated Removed in 0.31.0. Five-number summaries are `stats.perTestStats` (enable `computePerTestStats`), and `perWaferTestStats` on `analyzeWaferLot`'s result. */
|
|
17
17
|
export declare const buildTestBoxplotData: typeof buildTestBoxplotDataImpl;
|
|
18
|
-
/** @deprecated Removed in 0.31.0.
|
|
18
|
+
/** @deprecated Removed in 0.31.0. Per-wafer means and stddevs in slot order are `perWaferTestStats` on `analyzeWaferLot`'s result (enable `computePerTestStats`). */
|
|
19
19
|
export declare const buildTestTrendData: typeof buildTestTrendDataImpl;
|
|
20
|
-
/** @deprecated Removed in 0.31.0.
|
|
20
|
+
/** @deprecated Removed in 0.31.0. Compute the die-weighted mean from `perWaferTestStats` (mean × count) on `analyzeWaferLot`'s result. */
|
|
21
21
|
export declare const trendCentre: typeof trendCentreImpl;
|
|
22
|
-
/** @deprecated Removed in 0.31.0.
|
|
22
|
+
/** @deprecated Removed in 0.31.0. `analyzeWaferMap` and `analyzeWaferLot` now return per-test pass rates as `stats.testSpecYield` (spec limits), `stats.testFlagYield` (tester verdicts) and `stats.functionalYield`, with `stats.specVerdictDisagreementDies.` */
|
|
23
23
|
export declare const buildTestPassRateData: typeof buildTestPassRateDataImpl;
|
|
24
|
-
/** @deprecated Removed in 0.31.0.
|
|
24
|
+
/** @deprecated Removed in 0.31.0. Read which pass rates exist from `stats.testSpecYield`, `stats.testFlagYield` and `stats.functionalYield` on `analyzeWaferMap`'s or `analyzeWaferLot`'s result. */
|
|
25
25
|
export declare const hasJudgeableTests: typeof hasJudgeableTestsImpl;
|
|
26
|
-
/** @deprecated Removed in 0.31.0.
|
|
26
|
+
/** @deprecated Removed in 0.31.0. It prepared data for the Insights histogram, which wmap draws itself (`insights: { enabled: true }`); there is no data replacement. */
|
|
27
27
|
export declare const buildTestHistogramData: typeof buildTestHistogramDataImpl;
|
|
28
|
-
/** @deprecated Removed in 0.31.0.
|
|
28
|
+
/** @deprecated Removed in 0.31.0. It prepared data for the Insights histogram, which wmap draws itself (`insights: { enabled: true }`); there is no data replacement. */
|
|
29
29
|
export declare const buildTestHistogramSeries: typeof buildTestHistogramSeriesImpl;
|
|
30
|
-
/** @deprecated Removed in 0.31.0.
|
|
30
|
+
/** @deprecated Removed in 0.31.0. It prepared data for the Insights scatter plot, which wmap draws itself (`insights: { enabled: true }`); there is no data replacement. */
|
|
31
31
|
export declare const buildScatterData: typeof buildScatterDataImpl;
|
|
32
|
-
/** @deprecated Removed in 0.31.0.
|
|
32
|
+
/** @deprecated Removed in 0.31.0. It prepared data for the Insights scatter plot, which wmap draws itself (`insights: { enabled: true }`); there is no data replacement. */
|
|
33
33
|
export declare const buildScatterDataGrouped: typeof buildScatterDataGroupedImpl;
|
|
34
|
-
/** @deprecated Removed in 0.31.0.
|
|
34
|
+
/** @deprecated Removed in 0.31.0. Per-wafer yield is `lotYieldSeries` on `analyzeWaferLot`'s result, and `stats.yieldPercent` on each summary. */
|
|
35
35
|
export declare const buildYieldData: typeof buildYieldDataImpl;
|
|
36
|
-
/** @deprecated Removed in 0.31.0.
|
|
36
|
+
/** @deprecated Removed in 0.31.0. Per-wafer yield is `lotYieldSeries` on `analyzeWaferLot`'s result; weight it by each wafer's die count to combine groups. */
|
|
37
37
|
export declare const buildYieldDataCombined: typeof buildYieldDataCombinedImpl;
|
|
38
|
-
/** @deprecated Removed in 0.31.0.
|
|
38
|
+
/** @deprecated Removed in 0.31.0. Bin counts are `stats.hardBinCounts` and `stats.softBinCounts` on `analyzeWaferMap`'s result. */
|
|
39
39
|
export declare const buildBinParetoData: typeof buildBinParetoDataImpl;
|
|
40
|
-
/** @deprecated Removed in 0.31.0.
|
|
40
|
+
/** @deprecated Removed in 0.31.0. Bin counts per wafer are `stats.hardBinCounts` and `stats.softBinCounts` on each perWafer summary of `analyzeWaferLot`'s result. */
|
|
41
41
|
export declare const buildBinClusterData: typeof buildBinClusterDataImpl;
|
|
42
42
|
import { buildRingRegions as buildRingRegionsImpl, buildQuadrantRegions as buildQuadrantRegionsImpl, buildSectorRegions as buildSectorRegionsImpl, buildReticlePositionRegions as buildReticlePositionRegionsImpl, buildTestSiteRegions as buildTestSiteRegionsImpl, buildRegionYieldData as buildRegionYieldDataImpl, areQuadrantsAdjacent as areQuadrantsAdjacentImpl, parseRegionKey as parseRegionKeyImpl, sectorCompassNames as sectorCompassNamesImpl } from './regions.js';
|
|
43
43
|
import { classifyPattern as classifyPatternImpl } from './patternClassification.js';
|
|
44
|
-
import { visibleFindings as visibleFindingsImpl } from './filterFindings.js';
|
|
45
44
|
import { computeFunctionalYield as computeFunctionalYieldImpl } from './analyzeWaferMap.js';
|
|
46
45
|
import { resolveMetadataColumns as resolveMetadataColumnsImpl, discoverDieMetadataKeys as discoverDieMetadataKeysImpl } from './metadataColumns.js';
|
|
47
|
-
import {
|
|
46
|
+
import { openHtmlReport as openHtmlReportImpl } from './renderFindingsReport.js';
|
|
48
47
|
import { renderSummaryReportHtml as renderSummaryReportHtmlImpl, renderLotSummaryReportHtml as renderLotSummaryReportHtmlImpl } from './renderSummaryReport.js';
|
|
49
|
-
/** @deprecated Removed in 0.31.0.
|
|
48
|
+
/** @deprecated Removed in 0.31.0. Ring yield is `stats.regionYield.ring` on `analyzeWaferMap`'s or `analyzeWaferLot`'s result; ring findings are in findings. */
|
|
50
49
|
export declare const buildRingRegions: typeof buildRingRegionsImpl;
|
|
51
|
-
/** @deprecated Removed in 0.31.0.
|
|
50
|
+
/** @deprecated Removed in 0.31.0. Quadrant yield is `stats.regionYield.quadrant` on `analyzeWaferMap`'s or `analyzeWaferLot`'s result; quadrant findings are in findings. */
|
|
52
51
|
export declare const buildQuadrantRegions: typeof buildQuadrantRegionsImpl;
|
|
53
|
-
/** @deprecated Removed in 0.31.0.
|
|
52
|
+
/** @deprecated Removed in 0.31.0. Sector findings are in `analyzeWaferMap`'s findings (`comparison.family` 'sector'). */
|
|
54
53
|
export declare const buildSectorRegions: typeof buildSectorRegionsImpl;
|
|
55
|
-
/** @deprecated Removed in 0.31.0.
|
|
54
|
+
/** @deprecated Removed in 0.31.0. Reticle-position findings are in `analyzeWaferMap`'s findings; a die's reticle cell is `getReticleCell(die, reticleConfig)`. */
|
|
56
55
|
export declare const buildReticlePositionRegions: typeof buildReticlePositionRegionsImpl;
|
|
57
|
-
/** @deprecated Removed in 0.31.0.
|
|
56
|
+
/** @deprecated Removed in 0.31.0. Test-site findings are in `analyzeWaferMap`'s findings (`comparison.family` 'test-site'). */
|
|
58
57
|
export declare const buildTestSiteRegions: typeof buildTestSiteRegionsImpl;
|
|
59
|
-
/** @deprecated Removed in 0.31.0.
|
|
58
|
+
/** @deprecated Removed in 0.31.0. `analyzeWaferMap` and `analyzeWaferLot` now return ring and quadrant yield as `stats.regionYield.` */
|
|
60
59
|
export declare const buildRegionYieldData: typeof buildRegionYieldDataImpl;
|
|
61
|
-
/** @deprecated Removed in 0.31.0. It is an internal helper
|
|
60
|
+
/** @deprecated Removed in 0.31.0. It is an internal helper of the quadrant findings, which `analyzeWaferMap` already reports. */
|
|
62
61
|
export declare const areQuadrantsAdjacent: typeof areQuadrantsAdjacentImpl;
|
|
63
|
-
/** @deprecated Removed in 0.31.0.
|
|
62
|
+
/** @deprecated Removed in 0.31.0. Findings name their region in prose (`comparison.left`) and region yield in `RegionYield.label`; region keys are identities, not to be parsed. */
|
|
64
63
|
export declare const parseRegionKey: typeof parseRegionKeyImpl;
|
|
65
|
-
/** @deprecated Removed in 0.31.0.
|
|
64
|
+
/** @deprecated Removed in 0.31.0. Sector findings name their sector in prose (`comparison.left`). */
|
|
66
65
|
export declare const sectorCompassNames: typeof sectorCompassNamesImpl;
|
|
67
|
-
/** @deprecated Removed in 0.31.0. `analyzeWaferMap`
|
|
66
|
+
/** @deprecated Removed in 0.31.0. `analyzeWaferMap` returns the classification, with its geometry features, as `stats.spatialPattern` for every wafer, and a detected pattern as a finding (`comparison.family` `'spatial-pattern'`). */
|
|
68
67
|
export declare const classifyPattern: typeof classifyPatternImpl;
|
|
69
|
-
/** @deprecated Removed in 0.31.0. It is an internal helper that was exported by accident; `buildWaferMap`, `analyzeWaferMap` and the renderers already apply it. */
|
|
70
|
-
export declare const visibleFindings: typeof visibleFindingsImpl;
|
|
71
68
|
/** @deprecated Removed in 0.31.0. `analyzeWaferMap` returns the same figures as `stats.functionalYield`. */
|
|
72
69
|
export declare const computeFunctionalYield: typeof computeFunctionalYieldImpl;
|
|
73
70
|
/** @deprecated Removed in 0.31.0. The die list resolves its metadata columns itself (the `dieList.metadataColumns` option). */
|
|
74
71
|
export declare const resolveMetadataColumns: typeof resolveMetadataColumnsImpl;
|
|
75
72
|
/** @deprecated Removed in 0.31.0. The die list resolves its metadata columns itself (the `dieList.metadataColumns` option). */
|
|
76
73
|
export declare const discoverDieMetadataKeys: typeof discoverDieMetadataKeysImpl;
|
|
77
|
-
/** @deprecated Removed in 0.31.0.
|
|
78
|
-
export declare const renderFindingsReportHtml: typeof renderFindingsReportHtmlImpl;
|
|
79
|
-
/** @deprecated Removed in 0.31.0. Reports open from the Summary panel's report button; route them into your host with `setReportOpener`. */
|
|
74
|
+
/** @deprecated Removed in 0.31.0. Open reports with `openReportModal(html)`, or route them into your host with `setReportOpener`. */
|
|
80
75
|
export declare const openHtmlReport: typeof openHtmlReportImpl;
|
|
81
|
-
/** @deprecated Removed in 0.31.0.
|
|
76
|
+
/** @deprecated Removed in 0.31.0. Use `renderWaferReportHtml(result, summary)`, which reads pass bins and ring count from the built map. */
|
|
82
77
|
export declare const renderSummaryReportHtml: typeof renderSummaryReportHtmlImpl;
|
|
83
|
-
/** @deprecated Removed in 0.31.0.
|
|
78
|
+
/** @deprecated Removed in 0.31.0. Use `renderLotReportHtml(results)`, which reads each wafer's pass bins and ring count from its built map. */
|
|
84
79
|
export declare const renderLotSummaryReportHtml: typeof renderLotSummaryReportHtmlImpl;
|
|
85
80
|
/** @deprecated Removed in 0.31.0. `buildFacetTable` applies it by default. */
|
|
86
81
|
export declare const DEFAULT_FACET_CURATION: Record<string, import("./facets.js").FacetCuration>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{deprecated as
|
|
1
|
+
import{deprecated as e}from"../renderer/deprecate.js";import{buildCapabilityData as s}from"./capability.js";import{buildCorrelationMatrix as r,filterCorrelationMatrix as i}from"./correlation.js";import{buildTestBoxplotData as o}from"./boxplot.js";import{buildTestTrendData as n,trendCentre as l}from"./trend.js";import{buildTestPassRateData as d,hasJudgeableTests as p}from"./testPassRate.js";import{buildTestHistogramData as m,buildTestHistogramSeries as u}from"./histogram.js";import{buildScatterData as c,buildScatterDataGrouped as f}from"./scatter.js";import{buildYieldData as b,buildYieldDataCombined as g}from"./yield.js";import{buildBinParetoData as h,buildBinClusterData as y}from"./binPareto.js";const t="If you depend on it, say so at https://github.com/wafertools/wafermap/issues.";export const buildCapabilityData=e(s,"buildCapabilityData",`analyzeWaferMap and analyzeWaferLot now return Cp/Cpk/Pp/Ppk as stats.capability (enable computePerTestStats); a lot's uses the pooled within-wafer stddev. ${t}`),buildCorrelationMatrix=e(r,"buildCorrelationMatrix",`It prepared data for the Insights correlation matrix, which wmap draws itself (insights: { enabled: true }); there is no data replacement yet. ${t}`),filterCorrelationMatrix=e(i,"filterCorrelationMatrix",`It prepared data for the Insights correlation matrix, which wmap draws itself (insights: { enabled: true }); there is no data replacement. ${t}`),buildTestBoxplotData=e(o,"buildTestBoxplotData",`Five-number summaries are stats.perTestStats (enable computePerTestStats), and perWaferTestStats on analyzeWaferLot's result. ${t}`),buildTestTrendData=e(n,"buildTestTrendData",`Per-wafer means and stddevs in slot order are perWaferTestStats on analyzeWaferLot's result (enable computePerTestStats). ${t}`),trendCentre=e(l,"trendCentre",`Compute the die-weighted mean from perWaferTestStats (mean \xD7 count) on analyzeWaferLot's result. ${t}`),buildTestPassRateData=e(d,"buildTestPassRateData",`analyzeWaferMap and analyzeWaferLot now return per-test pass rates as stats.testSpecYield (spec limits), stats.testFlagYield (tester verdicts) and stats.functionalYield, with stats.specVerdictDisagreementDies. ${t}`),hasJudgeableTests=e(p,"hasJudgeableTests",`Read which pass rates exist from stats.testSpecYield, stats.testFlagYield and stats.functionalYield on analyzeWaferMap's or analyzeWaferLot's result. ${t}`),buildTestHistogramData=e(m,"buildTestHistogramData",`It prepared data for the Insights histogram, which wmap draws itself (insights: { enabled: true }); there is no data replacement. ${t}`),buildTestHistogramSeries=e(u,"buildTestHistogramSeries",`It prepared data for the Insights histogram, which wmap draws itself (insights: { enabled: true }); there is no data replacement. ${t}`),buildScatterData=e(c,"buildScatterData",`It prepared data for the Insights scatter plot, which wmap draws itself (insights: { enabled: true }); there is no data replacement. ${t}`),buildScatterDataGrouped=e(f,"buildScatterDataGrouped",`It prepared data for the Insights scatter plot, which wmap draws itself (insights: { enabled: true }); there is no data replacement. ${t}`),buildYieldData=e(b,"buildYieldData",`Per-wafer yield is lotYieldSeries on analyzeWaferLot's result, and stats.yieldPercent on each summary. ${t}`),buildYieldDataCombined=e(g,"buildYieldDataCombined",`Per-wafer yield is lotYieldSeries on analyzeWaferLot's result; weight it by each wafer's die count to combine groups. ${t}`),buildBinParetoData=e(h,"buildBinParetoData",`Bin counts are stats.hardBinCounts and stats.softBinCounts on analyzeWaferMap's result. ${t}`),buildBinClusterData=e(y,"buildBinClusterData",`Bin counts per wafer are stats.hardBinCounts and stats.softBinCounts on each perWafer summary of analyzeWaferLot's result. ${t}`);import{deprecatedValue as R}from"../renderer/deprecate.js";import{buildRingRegions as D,buildQuadrantRegions as T,buildSectorRegions as I,buildReticlePositionRegions as C,buildTestSiteRegions as x,buildRegionYieldData as S,areQuadrantsAdjacent as w,parseRegionKey as $,sectorCompassNames as M}from"./regions.js";import{classifyPattern as W}from"./patternClassification.js";import{computeFunctionalYield as Y}from"./analyzeWaferMap.js";import{resolveMetadataColumns as P,discoverDieMetadataKeys as z}from"./metadataColumns.js";import{openHtmlReport as L}from"./renderFindingsReport.js";import{renderSummaryReportHtml as A,renderLotSummaryReportHtml as H}from"./renderSummaryReport.js";import{DEFAULT_FACET_CURATION as B}from"./facets.js";const F="analyzeWaferMap returns the classification, with its geometry features, as stats.spatialPattern for every wafer, and a detected pattern as a finding (comparison.family 'spatial-pattern').",E="analyzeWaferMap returns the same figures as stats.functionalYield.",a="The die list resolves its metadata columns itself (the dieList.metadataColumns option).";export const buildRingRegions=e(D,"buildRingRegions",`Ring yield is stats.regionYield.ring on analyzeWaferMap's or analyzeWaferLot's result; ring findings are in findings. ${t}`),buildQuadrantRegions=e(T,"buildQuadrantRegions",`Quadrant yield is stats.regionYield.quadrant on analyzeWaferMap's or analyzeWaferLot's result; quadrant findings are in findings. ${t}`),buildSectorRegions=e(I,"buildSectorRegions",`Sector findings are in analyzeWaferMap's findings (comparison.family 'sector'). ${t}`),buildReticlePositionRegions=e(C,"buildReticlePositionRegions",`Reticle-position findings are in analyzeWaferMap's findings; a die's reticle cell is getReticleCell(die, reticleConfig). ${t}`),buildTestSiteRegions=e(x,"buildTestSiteRegions",`Test-site findings are in analyzeWaferMap's findings (comparison.family 'test-site'). ${t}`),buildRegionYieldData=e(S,"buildRegionYieldData",`analyzeWaferMap and analyzeWaferLot now return ring and quadrant yield as stats.regionYield. ${t}`),areQuadrantsAdjacent=e(w,"areQuadrantsAdjacent",`It is an internal helper of the quadrant findings, which analyzeWaferMap already reports. ${t}`),parseRegionKey=e($,"parseRegionKey",`Findings name their region in prose (comparison.left) and region yield in RegionYield.label; region keys are identities, not to be parsed. ${t}`),sectorCompassNames=e(M,"sectorCompassNames",`Sector findings name their sector in prose (comparison.left). ${t}`),classifyPattern=e(W,"classifyPattern",`${F} ${t}`),computeFunctionalYield=e(Y,"computeFunctionalYield",`${E} ${t}`),resolveMetadataColumns=e(P,"resolveMetadataColumns",`${a} ${t}`),discoverDieMetadataKeys=e(z,"discoverDieMetadataKeys",`${a} ${t}`),openHtmlReport=e(L,"openHtmlReport",`Open reports with openReportModal(html), or route them into your host with setReportOpener. ${t}`),renderSummaryReportHtml=e(A,"renderSummaryReportHtml",`Use renderWaferReportHtml(result, summary), which reads pass bins and ring count from the built map. ${t}`),renderLotSummaryReportHtml=e(H,"renderLotSummaryReportHtml",`Use renderLotReportHtml(results), which reads each wafer's pass bins and ring count from its built map. ${t}`),DEFAULT_FACET_CURATION=R(B,"DEFAULT_FACET_CURATION");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
import{minOf as y}from"../core/utils.js";const S={unusual:0,notable:1,info:2},b={E:0,ENE:22.5,NE:45,NNE:67.5,N:90,NNW:112.5,NW:135,WNW:157.5,W:180,WSW:202.5,SW:225,SSW:247.5,S:270,SSE:292.5,SE:315,ESE:337.5};function m(e){return e.stats.adjustedPValue??e.stats.pValue??1}function w(e){return[...e].sort((n,t)=>{const o=S[n.severity]-S[t.severity];return o!==0?o:m(n)-m(t)})[0]}function v(e){return e.some(t=>t.variable.kind==="yield")?e.filter(t=>t.variable.kind!=="hardBin"&&t.variable.kind!=="softBin"):e}function $(e){return e.replace(/^(Rings?|Quadrants?|Sectors?)\s+/i,"").split(/[,&]|–|\band\b/).map(n=>n.trim()).filter(Boolean)}function R(e,n){const t=new Set($(e));return $(n).some(o=>t.has(o))}function E(e){return e.variable.kind==="yield"?"yield":e.variable.kind==="hardBin"?`HBin ${e.variable.bin??e.variable.index??"?"}`:e.variable.kind==="softBin"?`SBin ${e.variable.bin??e.variable.index??"?"}`:e.variable.label}function h(e){let n=0,t=0;for(const o of e)o.effect.direction==="higher"?n++:o.effect.direction==="lower"&&t++;return n>t?"higher":t>n?"lower":"mixed"}function d(e){return e==="higher"?"elevated":e==="lower"?"reduced":"shifted"}function p(e){const n=new Set,t=[];for(const o of e){const r=E(o);n.has(r)||(n.add(r),t.push(r))}return t.length===1?t[0]:t.length===2?`${t[0]} and ${t[1]}`:t.length===3?`${t[0]}, ${t[1]}, and ${t[2]}`:`${t[0]}, ${t[1]}, and ${t.length-2} more`}function k(e){const n=new Set,t=[];for(const o of e){const r=o.comparison.left;n.has(r)||(n.add(r),t.push(r))}return t.length===1?t[0]:t.length===2?`${t[0]} and ${t[1]}`:`${t.slice(0,-1).join(", ")}, and ${t[t.length-1]}`}function B(e){return e.length!==1?!1:!/^(Rings|Quadrants|Sectors)\b/.test(e[0].comparison.left)}function I(e){const n=h(e),t=e.every(c=>c.comparison.left.includes("(edge)")),o=e.every(c=>c.comparison.left.includes("(core)"));let r,a;return o?(r="The core ring",a=!0):t&&e.length>1?(r="The edge rings",a=!1):(r=k(e),a=B(e)),`${r} show${a?"s":""} ${d(n)} ${p(e)}.`}function P(e){const n=h(e),t=s=>s.highlight.kind==="region"&&s.highlight.regionKeys.length>1||s.comparison.left.startsWith("Quadrants"),o=e.filter(s=>t(s)),r=e.filter(s=>!t(s)),a=[];r.length===1?a.push(`the ${r[0].comparison.left} quadrant`):r.length>1&&a.push(`the ${k(r)} quadrants`);for(const s of o)a.push(s.comparison.left.replace(/^Quadrants/,"quadrants"));const c=a.join(" and "),u=r.length===1&&o.length===0;return`${c.charAt(0).toUpperCase()+c.slice(1)} show${u?"s":""} ${d(n)} ${p(e)}.`}function x(e){const n=h(e),t=[],o=new Set;for(const u of e){const i=u.comparison.left.replace(/^Sectors? /,"");o.has(i)||(o.add(i),t.push(i))}let r,a;return t.length===1?(r=`the ${t[0]} ${e[0].comparison.left.startsWith("Sectors")?"sectors":"region"}`,a=!e[0].comparison.left.startsWith("Sectors")):(r=`the ${t.length===2?t.join(" and "):`${t.slice(0,-1).join(", ")}, and ${t[t.length-1]}`} sectors`,a=!1),`${r.charAt(0).toUpperCase()+r.slice(1)} show${a?"s":""} ${d(n)} ${p(e)}.`}function C(e){if(e.length===1)return`A failure cluster at ${e[0].comparison.left.replace(/^Cluster at /,"")}.`;const t=e.reduce((o,r)=>(o.stats.sampleSizeLeft??0)>=(r.stats.sampleSizeLeft??0)?o:r).comparison.left.replace(/^Cluster at /,"");return`${e.length} failure clusters identified; the largest at ${t}.`}function q(e){const n=e[0].comparison.left.replace(/^Edge arc ~/,"");return e.length===1?`An edge arc near ${n} shows localised failures.`:`${e.length} edge arcs detected, including near ${n}.`}function F(e){const n=h(e);return e.length===1?`Reticle-position variation: ${e[0].comparison.left} shows ${d(n)} ${p(e)}.`:`Reticle-position variation across ${e.length} cells (${d(n)} ${p(e)}).`}function O(e,n){const t=e.stats.method==="geometry"?` (${e.severity==="unusual"?"high":e.severity==="notable"?"medium":"low"} confidence)`:"",o=new Set(e.relatedIds??[]),r=n.find(c=>o.has(c.id)&&(c.comparison.family==="edge-arc"||c.comparison.family==="cluster"));let a="";return r&&(r.comparison.family==="edge-arc"?a=`; failures concentrated at the wafer edge near ${r.comparison.left.replace(/^Edge arc ~/,"")}`:a=`; failures concentrated near ${r.comparison.left.replace(/^Cluster at /,"")}`),`${e.comparison.left} failure pattern detected${t}${a}.`}function Y(e){const n=e.replace(/\.$/,"");return n.charAt(0).toLowerCase()+n.slice(1)}function N(e){const n=e.filter(t=>t.variable.kind==="yield");return n.length>0?h(n):h(e)}function M(e,n){const t=new Map;for(const i of n){const s=t.get(i.comparison.left)??[];s.push(i),t.set(i.comparison.left,s)}const o=[],r=[];for(const i of t.values()){const s=N(i);s==="higher"?o.push(...i.filter(l=>l.effect.direction==="higher")):s==="lower"?r.push(...i.filter(l=>l.effect.direction==="lower")):o.push(...i)}const a=o.map(i=>i.comparison.left),c=r.filter(i=>!a.some(s=>R(s,i.comparison.left)));if(o.length>0&&c.length>0){const i=n.some(f=>f.variable.kind==="yield"),[s,l]=i?[c,o]:[o,c];return`${e(s).replace(/\.$/,"")} while ${Y(e(l))}.`}if(o.length>0&&r.length>0&&c.length===0)return e(o);const u=N(n);if(u!=="mixed"&&n.some(i=>i.variable.kind==="yield")){const i=n.filter(s=>s.effect.direction===u);if(i.length>0)return e(i)}return e(n)}function W(e){let n=0,t=0,o=0;for(const r of e)for(const a of $(r.comparison.left)){const c=b[a];if(c===void 0)continue;const u=c*Math.PI/180;n+=Math.cos(u),t+=Math.sin(u),o++}return o===0||n===0&&t===0?null:(Math.atan2(t,n)*180/Math.PI+360)%360}function j(e){let n="E",t=360;for(const[o,r]of Object.entries(b)){const a=Math.abs((e-r+540)%360-180);a<t&&(t=a,n=o)}return n}function D(e){const n=e.filter(u=>u.effect.direction==="higher"),t=e.filter(u=>u.effect.direction==="lower");if(n.length===0||t.length===0)return null;const o=new Set(e.map(E));if(o.size!==1)return null;const r=W(n),a=W(t);return r===null||a===null||Math.abs((r-a+540)%360-180)<120?null:`${[...o][0]} increases from ${j(a)} toward ${j(r)} across the wafer.`}function T(e){const n=v(e);if(n.length===0)return"";const t=["sector","quadrant","ring"],o=new Map;for(const i of n){const s=o.get(i.comparison.family)??[];s.push(i),o.set(i.comparison.family,s)}const r=[...o.keys()].sort((i,s)=>{const l=y(o.get(i).map(m)),f=y(o.get(s).map(m));return l!==f?l-f:t.indexOf(i)-t.indexOf(s)})[0],a=o.get(r),c=D(a);return c||M(r==="ring"?I:r==="quadrant"?P:x,a)}function L(e,n){switch(e){case"cluster":return C(n);case"edge-arc":return q(n);case"reticle-position":return M(F,n);default:return""}}const A=new Set(["ring","quadrant","sector"]);export function buildFindingsNarrative(e){if(e.length===0)return"";const n=e.filter(s=>s.severity!=="info");if(n.length===0)return"Minor spatial variation detected; no strongly significant patterns.";const t=[],o=n.filter(s=>s.comparison.family==="spatial-pattern"),r=o.length?w(o):null,a=new Set(r?.relatedIds??[]);r&&t.push(O(r,n));const c=n.filter(s=>s!==r&&s.comparison.family!=="spatial-pattern"&&!a.has(s.id));let u=c.filter(s=>A.has(s.comparison.family));if(r&&u.length){const s=v(u);s.length>0&&s.every(f=>f.variable.kind==="yield"&&f.effect.direction==="higher")&&(u=[])}const i=new Set;if(u.length){const s=T(u);if(s){t.push(s);for(const l of A)i.add(l)}}else if(!r){const s=w(c);if(s){const l=s.comparison.family,f=L(l,c.filter(g=>g.comparison.family===l));f&&(t.push(f),i.add(l))}}if(t.length<3){const s=c.filter(l=>(l.comparison.family==="cluster"||l.comparison.family==="edge-arc")&&!i.has(l.comparison.family));if(s.length){const l=s[0].comparison.family,f=L(l,s.filter(g=>g.comparison.family===l));f&&t.push(f)}}return t.slice(0,3).join(" ")}
|
|
@@ -4,7 +4,9 @@ export * from './analyzeWaferMap.js';
|
|
|
4
4
|
export * from './analyzeWaferLot.js';
|
|
5
5
|
export * from './filterFindings.js';
|
|
6
6
|
export type { PatternLabel, PatternClassification, PatternFeatures } from './patternClassification.js';
|
|
7
|
-
export { setReportOpener } from './renderFindingsReport.js';
|
|
7
|
+
export { setReportOpener, renderFindingsReportHtml } from './renderFindingsReport.js';
|
|
8
|
+
export { renderWaferReportHtml, renderLotReportHtml } from './renderSummaryReport.js';
|
|
9
|
+
export type { ReportMap } from './renderSummaryReport.js';
|
|
8
10
|
export type { SummaryReportParams, LotSummaryReportParams } from './renderSummaryReport.js';
|
|
9
11
|
export { buildFacetTable, facetValueOf, FACET_NONE_VALUE } from './facets.js';
|
|
10
12
|
export type { FacetField, FacetValue, FacetCuration, FacetItem, BuildFacetTableOptions } from './facets.js';
|
|
@@ -20,5 +22,5 @@ export type { HistogramBucket, HistogramItem, HistogramSeries, HistogramSeriesDa
|
|
|
20
22
|
export type { ScatterPoint, ScatterItem } from './scatter.js';
|
|
21
23
|
export type { ChartDatum, YieldItem, YieldSortBy } from './yield.js';
|
|
22
24
|
export type { BinType, BinItem, BinCluster, BinClusterData } from './binPareto.js';
|
|
23
|
-
export { buildCapabilityData, buildCorrelationMatrix, filterCorrelationMatrix, buildTestBoxplotData, buildTestTrendData, trendCentre, buildTestPassRateData, hasJudgeableTests, buildTestHistogramData, buildTestHistogramSeries, buildScatterData, buildScatterDataGrouped, buildYieldData, buildYieldDataCombined, buildBinParetoData, buildBinClusterData, buildRingRegions, buildQuadrantRegions, buildSectorRegions, buildReticlePositionRegions, buildTestSiteRegions, buildRegionYieldData, areQuadrantsAdjacent, parseRegionKey, sectorCompassNames, classifyPattern,
|
|
25
|
+
export { buildCapabilityData, buildCorrelationMatrix, filterCorrelationMatrix, buildTestBoxplotData, buildTestTrendData, trendCentre, buildTestPassRateData, hasJudgeableTests, buildTestHistogramData, buildTestHistogramSeries, buildScatterData, buildScatterDataGrouped, buildYieldData, buildYieldDataCombined, buildBinParetoData, buildBinClusterData, buildRingRegions, buildQuadrantRegions, buildSectorRegions, buildReticlePositionRegions, buildTestSiteRegions, buildRegionYieldData, areQuadrantsAdjacent, parseRegionKey, sectorCompassNames, classifyPattern, computeFunctionalYield, resolveMetadataColumns, discoverDieMetadataKeys, openHtmlReport, renderSummaryReportHtml, renderLotSummaryReportHtml, DEFAULT_FACET_CURATION, } from './deprecated.js';
|
|
24
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export*from"./types.js";export*from"./regions.js";export*from"./analyzeWaferMap.js";export*from"./analyzeWaferLot.js";export*from"./filterFindings.js";export{setReportOpener}from"./renderFindingsReport.js";export{buildFacetTable,facetValueOf,FACET_NONE_VALUE}from"./facets.js";export{mergeTestDefs}from"./mergeTestDefs.js";export{buildCapabilityData,buildCorrelationMatrix,filterCorrelationMatrix,buildTestBoxplotData,buildTestTrendData,trendCentre,buildTestPassRateData,hasJudgeableTests,buildTestHistogramData,buildTestHistogramSeries,buildScatterData,buildScatterDataGrouped,buildYieldData,buildYieldDataCombined,buildBinParetoData,buildBinClusterData,buildRingRegions,buildQuadrantRegions,buildSectorRegions,buildReticlePositionRegions,buildTestSiteRegions,buildRegionYieldData,areQuadrantsAdjacent,parseRegionKey,sectorCompassNames,classifyPattern,
|
|
1
|
+
export*from"./types.js";export*from"./regions.js";export*from"./analyzeWaferMap.js";export*from"./analyzeWaferLot.js";export*from"./filterFindings.js";export{setReportOpener,renderFindingsReportHtml}from"./renderFindingsReport.js";export{renderWaferReportHtml,renderLotReportHtml}from"./renderSummaryReport.js";export{buildFacetTable,facetValueOf,FACET_NONE_VALUE}from"./facets.js";export{mergeTestDefs}from"./mergeTestDefs.js";export{buildCapabilityData,buildCorrelationMatrix,filterCorrelationMatrix,buildTestBoxplotData,buildTestTrendData,trendCentre,buildTestPassRateData,hasJudgeableTests,buildTestHistogramData,buildTestHistogramSeries,buildScatterData,buildScatterDataGrouped,buildYieldData,buildYieldDataCombined,buildBinParetoData,buildBinClusterData,buildRingRegions,buildQuadrantRegions,buildSectorRegions,buildReticlePositionRegions,buildTestSiteRegions,buildRegionYieldData,areQuadrantsAdjacent,parseRegionKey,sectorCompassNames,classifyPattern,computeFunctionalYield,resolveMetadataColumns,discoverDieMetadataKeys,openHtmlReport,renderSummaryReportHtml,renderLotSummaryReportHtml,DEFAULT_FACET_CURATION}from"./deprecated.js";
|
|
@@ -5,6 +5,31 @@
|
|
|
5
5
|
export declare function errorFunction(value: number): number;
|
|
6
6
|
/** Standard normal cumulative distribution function Φ(value). */
|
|
7
7
|
export declare function normalCdf(value: number): number;
|
|
8
|
-
/** Linear-interpolation quantile of a pre-sorted array (`q` in [0, 1]).
|
|
9
|
-
|
|
8
|
+
/** Linear-interpolation quantile of a pre-sorted array (`q` in [0, 1]).
|
|
9
|
+
*
|
|
10
|
+
* `ArrayLike<number>`, not `number[]`, so a caller holding its values in a
|
|
11
|
+
* `Float64Array` does not have to copy them back into a plain array to be
|
|
12
|
+
* read — see `pooledTestStatsSteps`, which sorts in one. */
|
|
13
|
+
export declare function quantile(sorted: ArrayLike<number>, q: number): number;
|
|
14
|
+
/** Descriptive statistics of one population of values — see {@link describeSorted}. */
|
|
15
|
+
export interface DescriptiveStats {
|
|
16
|
+
min: number;
|
|
17
|
+
max: number;
|
|
18
|
+
mean: number;
|
|
19
|
+
count: number;
|
|
20
|
+
/** Population standard deviation (divide by n) — see {@link describeSorted}. */
|
|
21
|
+
stddev: number;
|
|
22
|
+
median: number;
|
|
23
|
+
q1: number;
|
|
24
|
+
q3: number;
|
|
25
|
+
}
|
|
26
|
+
/** Min/max/mean/count/σ and the quartiles of a pre-sorted array — the one copy
|
|
27
|
+
* of the descriptive-statistics formulas behind the Test Values table.
|
|
28
|
+
*
|
|
29
|
+
* σ is the POPULATION standard deviation (divide by n), which is what this
|
|
30
|
+
* table has always shown; the capability indices next to it deliberately use
|
|
31
|
+
* the sample form (n−1) and say so. Two-pass, not `Σx² − n·x̄²`: the moments
|
|
32
|
+
* form loses most of its significant digits when the variance is small beside
|
|
33
|
+
* the mean, which is the normal shape of a passing parametric test. */
|
|
34
|
+
export declare function describeSorted(sorted: ArrayLike<number>): DescriptiveStats;
|
|
10
35
|
//# sourceMappingURL=math.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function errorFunction(n){const
|
|
1
|
+
export function errorFunction(n){const t=n<0?-1:1,c=Math.abs(n),a=.254829592,i=-.284496736,o=1.421413741,r=-1.453152027,s=1.061405429,e=1/(1+.3275911*c),u=1-((((s*e+r)*e+o)*e+i)*e+a)*e*Math.exp(-c*c);return t*u}export function normalCdf(n){return .5*(1+errorFunction(n/Math.sqrt(2)))}export function quantile(n,t){if(n.length===0)return NaN;const c=t*(n.length-1),a=Math.floor(c),i=Math.ceil(c);return n[a]+(n[i]-n[a])*(c-a)}export function describeSorted(n){const t=n.length;let c=0;for(let o=0;o<t;o++)c+=n[o];const a=c/t;let i=0;for(let o=0;o<t;o++)i+=(n[o]-a)**2;return{min:n[0],max:n[t-1],mean:a,count:t,stddev:Math.sqrt(i/t),median:quantile(n,.5),q1:quantile(n,.25),q3:quantile(n,.75)}}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type WaferMapResult } from '../renderer/buildWaferMap.js';
|
|
2
|
+
import type { AnalyzeWaferMapInput } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Build an analysis input if it is not already a built map. A module of its own
|
|
5
|
+
* so it stays internal: stats/index.ts re-exports analyzeWaferMap.ts wholesale.
|
|
6
|
+
* analyzeWaferLot builds each wafer once here and passes the built result down,
|
|
7
|
+
* so its lot figures and each wafer's analysis read the same dies.
|
|
8
|
+
*/
|
|
9
|
+
export declare function normalizeInput(input: AnalyzeWaferMapInput): WaferMapResult;
|
|
10
|
+
//# sourceMappingURL=normalizeInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{buildWaferMap as e}from"../renderer/buildWaferMap.js";export function normalizeInput(r){return"wafer"in r&&"dies"in r&&"view"in r?r:e(r)}
|
|
@@ -14,6 +14,8 @@ export interface RegionYieldDatum {
|
|
|
14
14
|
yieldPercent: number;
|
|
15
15
|
/** Yield-eligible, binned die count in this region. */
|
|
16
16
|
n: number;
|
|
17
|
+
/** Of those, the dies that pass. */
|
|
18
|
+
passDies: number;
|
|
17
19
|
}
|
|
18
20
|
/**
|
|
19
21
|
* Pass/fail yield per region (ring, quadrant, or any other `StatsRegion`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{classifyDie as E,getRingLabel as W}from"../core/classify.js";import{getReticleCell as b}from"../core/reticle.js";import{isPositionedDie as M,diePassStatus as k,getDieKey as x}from"../core/dies.js";function y(t){return x(t)}export function buildRegionYieldData(t,o,r,e,n){const i=new Map,a=[];for(let s=0;s<o.length;s++){const c=t[s];if(!c?.length)continue;const u=new Set(typeof e=="function"?e(s):e),f=n(c.filter(M),o[s],r),S=new Map(c.map(l=>[y(l),l]));for(const l of f){a.includes(l.key)||a.push(l.key);const g=i.get(l.key)??{label:l.label,pass:0,total:0};for(const m of l.dieKeys){const d=S.get(m);if(!d||d.partial||d.edgeExcluded)continue;const p=k(d,u);p!==void 0&&(g.total++,p&&g.pass++)}i.set(l.key,g)}}return a.map(s=>{const c=i.get(s);return c.total===0?null:{key:s,label:c.label,n:c.total,yieldPercent:c.pass/c.total*100}}).filter(s=>s!==null)}const R=["E","ENE","NE","NNE","N","NNW","NW","WNW","W","WSW","SW","SSW","S","SSE","SE","ESE"],K=["E","NE","N","NW","W","SW","S","SE"],q=["E","N","W","S"];export function sectorCompassNames(t){const o=[4,8,16,32].includes(t)?t:16;return o===4?q:o===8?K:R}const P={NE:["NW","SE"],NW:["NE","SW"],SE:["NE","SW"],SW:["NW","SE"]};export function areQuadrantsAdjacent(t,o){return P[t]?.includes(o)??!1}export function parseRegionKey(t){return t.startsWith("ring:")?{family:"ring",ring:Number(t.slice(5))}:t.startsWith("quadrant:")?{family:"quadrant",quadrant:t.slice(9)}:t.startsWith("sector:")?{family:"sector",sector:t.slice(7)}:{family:"unknown"}}export function buildRingRegions(t,o,r){const e=new Map;for(const n of t){const{ring:i}=E(n,o,{ringCount:r}),a=`ring:${i}`,s=e.get(a)??{family:"ring",key:a,label:W(i,r),dieKeys:[]};s.dieKeys.push(y(n)),e.set(a,s)}return[...e.values()].sort((n,i)=>n.key.localeCompare(i.key))}export function buildQuadrantRegions(t,o,r){const e=new Map;for(const i of t){const{quadrant:a}=E(i,o,{ringCount:r}),s=`quadrant:${a}`,c=e.get(s)??{family:"quadrant",key:s,label:a,dieKeys:[]};c.dieKeys.push(y(i)),e.set(s,c)}const n=new Map([["quadrant:NE",0],["quadrant:NW",1],["quadrant:SE",2],["quadrant:SW",3]]);return[...e.values()].sort((i,a)=>(n.get(i.key)??4)-(n.get(a.key)??4))}export function buildReticlePositionRegions(t,o){if(!o)return[];const r=new Map;for(const e of t){const{column:n,row:i}=b(e,o),a=`reticle-position:cell:${n},${i}`,s=r.get(a)??{family:"reticle-position",key:a,label:`Reticle cell (${n}, ${i})`,dieKeys:[]};s.dieKeys.push(y(e)),r.set(a,s)}return[...r.values()].sort((e,n)=>e.key.localeCompare(n.key))}const w=3;export function buildTestSiteRegions(t,o=!1){const r=new Map;for(const e of t){if(e.siteNum===void 0)continue;const n=r.get(e.siteNum)??[];n.push(y(e)),r.set(e.siteNum,n)}if(!o){let e=0;for(const n of r.values())n.length>=w&&e++;if(e<2)return[]}return[...r.entries()].sort(([e],[n])=>e-n).map(([e,n])=>({family:"test-site",key:`test-site:${e}`,label:`Site ${e}`,dieKeys:n}))}export function buildSectorRegions(t,o,r){const e=[4,8,16,32].includes(r)?r:16,n=sectorCompassNames(e),i=new Map,a=o.center.x,s=o.center.y,c=o.radius;for(const u of t){const f=u.physX-a,S=u.physY-s;if(Math.hypot(f,S)/c<.2)continue;const g=Math.PI/e,m=(Math.atan2(S,f)+2*Math.PI+g)%(2*Math.PI),d=Math.floor(m/(2*Math.PI)*e)%e,p=n[d],N=`sector:${p}`,h=i.get(N)??{family:"sector",key:N,label:`Sector ${p}`,dieKeys:[]};h.dieKeys.push(y(u)),i.set(N,h)}return[...i.values()].sort((u,f)=>u.key.localeCompare(f.key))}
|
|
1
|
+
import{classifyDie as E,getRingLabel as W}from"../core/classify.js";import{getReticleCell as b}from"../core/reticle.js";import{isPositionedDie as M,diePassStatus as k,getDieKey as x}from"../core/dies.js";function y(t){return x(t)}export function buildRegionYieldData(t,o,r,e,n){const i=new Map,a=[];for(let s=0;s<o.length;s++){const c=t[s];if(!c?.length)continue;const u=new Set(typeof e=="function"?e(s):e),f=n(c.filter(M),o[s],r),S=new Map(c.map(l=>[y(l),l]));for(const l of f){a.includes(l.key)||a.push(l.key);const g=i.get(l.key)??{label:l.label,pass:0,total:0};for(const m of l.dieKeys){const d=S.get(m);if(!d||d.partial||d.edgeExcluded)continue;const p=k(d,u);p!==void 0&&(g.total++,p&&g.pass++)}i.set(l.key,g)}}return a.map(s=>{const c=i.get(s);return c.total===0?null:{key:s,label:c.label,n:c.total,passDies:c.pass,yieldPercent:c.pass/c.total*100}}).filter(s=>s!==null)}const R=["E","ENE","NE","NNE","N","NNW","NW","WNW","W","WSW","SW","SSW","S","SSE","SE","ESE"],K=["E","NE","N","NW","W","SW","S","SE"],q=["E","N","W","S"];export function sectorCompassNames(t){const o=[4,8,16,32].includes(t)?t:16;return o===4?q:o===8?K:R}const P={NE:["NW","SE"],NW:["NE","SW"],SE:["NE","SW"],SW:["NW","SE"]};export function areQuadrantsAdjacent(t,o){return P[t]?.includes(o)??!1}export function parseRegionKey(t){return t.startsWith("ring:")?{family:"ring",ring:Number(t.slice(5))}:t.startsWith("quadrant:")?{family:"quadrant",quadrant:t.slice(9)}:t.startsWith("sector:")?{family:"sector",sector:t.slice(7)}:{family:"unknown"}}export function buildRingRegions(t,o,r){const e=new Map;for(const n of t){const{ring:i}=E(n,o,{ringCount:r}),a=`ring:${i}`,s=e.get(a)??{family:"ring",key:a,label:W(i,r),dieKeys:[]};s.dieKeys.push(y(n)),e.set(a,s)}return[...e.values()].sort((n,i)=>n.key.localeCompare(i.key))}export function buildQuadrantRegions(t,o,r){const e=new Map;for(const i of t){const{quadrant:a}=E(i,o,{ringCount:r}),s=`quadrant:${a}`,c=e.get(s)??{family:"quadrant",key:s,label:a,dieKeys:[]};c.dieKeys.push(y(i)),e.set(s,c)}const n=new Map([["quadrant:NE",0],["quadrant:NW",1],["quadrant:SE",2],["quadrant:SW",3]]);return[...e.values()].sort((i,a)=>(n.get(i.key)??4)-(n.get(a.key)??4))}export function buildReticlePositionRegions(t,o){if(!o)return[];const r=new Map;for(const e of t){const{column:n,row:i}=b(e,o),a=`reticle-position:cell:${n},${i}`,s=r.get(a)??{family:"reticle-position",key:a,label:`Reticle cell (${n}, ${i})`,dieKeys:[]};s.dieKeys.push(y(e)),r.set(a,s)}return[...r.values()].sort((e,n)=>e.key.localeCompare(n.key))}const w=3;export function buildTestSiteRegions(t,o=!1){const r=new Map;for(const e of t){if(e.siteNum===void 0)continue;const n=r.get(e.siteNum)??[];n.push(y(e)),r.set(e.siteNum,n)}if(!o){let e=0;for(const n of r.values())n.length>=w&&e++;if(e<2)return[]}return[...r.entries()].sort(([e],[n])=>e-n).map(([e,n])=>({family:"test-site",key:`test-site:${e}`,label:`Site ${e}`,dieKeys:n}))}export function buildSectorRegions(t,o,r){const e=[4,8,16,32].includes(r)?r:16,n=sectorCompassNames(e),i=new Map,a=o.center.x,s=o.center.y,c=o.radius;for(const u of t){const f=u.physX-a,S=u.physY-s;if(Math.hypot(f,S)/c<.2)continue;const g=Math.PI/e,m=(Math.atan2(S,f)+2*Math.PI+g)%(2*Math.PI),d=Math.floor(m/(2*Math.PI)*e)%e,p=n[d],N=`sector:${p}`,h=i.get(N)??{family:"sector",key:N,label:`Sector ${p}`,dieKeys:[]};h.dieKeys.push(y(u)),i.set(N,h)}return[...i.values()].sort((u,f)=>u.key.localeCompare(f.key))}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{describeWaferPopulation as b,populationLabel as h}from"./population.js";import{formatFindingDelta as g,formatFindingCoverage as v,formatFindingTooltip as y,
|
|
1
|
+
import{describeWaferPopulation as b,populationLabel as h}from"./population.js";import{formatFindingDelta as g,formatFindingCoverage as v,formatFindingTooltip as y,buildMetadataRows as d,renderDefinitionList as p,renderSection as c,renderSeverityBadge as R,reportStyles as $}from"./reportHtml.js";import{escHtml as o}from"../core/utils.js";import{buildFindingsNarrative as F}from"./findingsNarrative.js";import{plainBinTerms as f}from"../renderer/fmt.js";import{visibleFindings as S}from"./filterFindings.js";function T(e,n){if(e.level==="lot"){const a=e,l=a.perWafer.map(r=>r.summary.wafer?.wafer??r.summary.wafer?.waferId).filter(r=>r!=null).map(String).join(", ");return p([...d(a.perWafer.map(r=>({metadata:r.summary.wafer}))),...l?[{label:"Wafers",value:l}]:[],{label:"Wafer count",value:String(a.stats.waferCount)},{label:"Generated",value:n}])}const t=e,i=t.stats.yieldPercent!==null?`${t.stats.yieldPercent.toFixed(1)}%`:"N/A";return p([...d([{metadata:t.wafer}]),{label:"Total dies",value:String(t.stats.totalDies)},{label:"Analysed dies",value:String(t.stats.analyzedDies)},{label:"Yield",value:i},{label:"Generated",value:n}])}function H(e,n){return e.length?e.map(t=>`<tr title="${o(y(t))}">
|
|
2
2
|
<td class="tight">${R(t.severity)}</td>
|
|
3
3
|
<td class="tight">${o(t.comparison.left)}</td>
|
|
4
4
|
<td>${o(f(t.variable.label))}</td>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Die } from '../core/dies.js';
|
|
2
2
|
import type { Wafer } from '../core/wafer.js';
|
|
3
|
-
import { type BinDef, type TestDef, type YieldSummary } from '../renderer/buildWaferMap.js';
|
|
3
|
+
import { type BinDef, type TestDef, type YieldSummary, type WaferMapResult } from '../renderer/buildWaferMap.js';
|
|
4
4
|
import type { StatsSummary, AnalyzeWaferMapOptions } from './types.js';
|
|
5
5
|
import { openHtmlReport } from './renderFindingsReport.js';
|
|
6
6
|
export interface SummaryReportParams {
|
|
@@ -37,6 +37,14 @@ export interface LotSummaryReportParams {
|
|
|
37
37
|
/** Reused directly as `analyzeWaferLot`'s `perWaferSummaries` — the expensive
|
|
38
38
|
* per-wafer pass (`analyzeWaferMap`) is never re-run here. */
|
|
39
39
|
statsSummary?: StatsSummary;
|
|
40
|
+
/**
|
|
41
|
+
* @internal The built map these pieces came from, analysed in place of them.
|
|
42
|
+
* The pieces alone are not an analysable map: `analyzeWaferLot` took them for
|
|
43
|
+
* a fresh input with no results and analysed an EMPTY wafer, so a report for
|
|
44
|
+
* wafers without a precomputed summary had no findings, no yields and lost
|
|
45
|
+
* its lot title. `renderLotReportHtml` always sets it.
|
|
46
|
+
*/
|
|
47
|
+
source?: WaferMapResult;
|
|
40
48
|
}>;
|
|
41
49
|
hbinDefs?: BinDef[];
|
|
42
50
|
sbinDefs?: BinDef[];
|
|
@@ -60,4 +68,34 @@ export declare function renderLotSummaryReportHtml(params: LotSummaryReportParam
|
|
|
60
68
|
title?: string;
|
|
61
69
|
}): string;
|
|
62
70
|
export { openHtmlReport };
|
|
71
|
+
/** A built map as the report builders read it. A `WaferMapResult` is one. */
|
|
72
|
+
export type ReportMap = Pick<WaferMapResult, 'wafer' | 'dies' | 'passBins' | 'ringCount'> & Partial<Pick<WaferMapResult, 'hbinDefs' | 'sbinDefs' | 'testDefs'>> & {
|
|
73
|
+
/** The name to show for this wafer; defaults to its wafer ID. */
|
|
74
|
+
label?: string;
|
|
75
|
+
/** This wafer's analysis, when already run — reused, never recomputed. */
|
|
76
|
+
statsSummary?: StatsSummary;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* The wafer summary report for one built map, as a standalone HTML document.
|
|
80
|
+
* Analyses the map with `analyzeWaferMap` when `summary` is not given and the
|
|
81
|
+
* map is a built `WaferMapResult`; a map assembled from pieces is not analysable
|
|
82
|
+
* (the analysis would take it for a fresh input with no results), so its report
|
|
83
|
+
* has no findings section rather than findings of an empty wafer.
|
|
84
|
+
*/
|
|
85
|
+
export declare function renderWaferReportHtml(map: ReportMap & {
|
|
86
|
+
yield: YieldSummary;
|
|
87
|
+
dataCoverage: SummaryReportParams['dataCoverage'];
|
|
88
|
+
}, summary?: StatsSummary, options?: {
|
|
89
|
+
title?: string;
|
|
90
|
+
}): string;
|
|
91
|
+
/**
|
|
92
|
+
* The lot summary report for several built maps, as a standalone HTML document.
|
|
93
|
+
* Wafers are grouped by lot identity inside; bin and test definitions are merged
|
|
94
|
+
* across the maps; each wafer is judged by its own pass bins. Lot-level ring
|
|
95
|
+
* figures use the first map's ring count, as the gallery does.
|
|
96
|
+
*/
|
|
97
|
+
export declare function renderLotReportHtml(maps: readonly ReportMap[], options?: {
|
|
98
|
+
title?: string;
|
|
99
|
+
analyzeOptions?: AnalyzeWaferMapOptions;
|
|
100
|
+
}): string;
|
|
63
101
|
//# sourceMappingURL=renderSummaryReport.d.ts.map
|